470 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Vue
		
	
	
	
			
		
		
	
	
			470 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Vue
		
	
	
	
| <template>
 | |
|     <div
 | |
|         v-if="release"
 | |
|         class="content"
 | |
|     >
 | |
|         <Banner :release="release" />
 | |
| 
 | |
|         <div class="details">
 | |
|             <div class="column">
 | |
|                 <a
 | |
|                     v-if="release.date"
 | |
|                     v-tooltip.bottom="release.url && `View scene on ${release.site.name}`"
 | |
|                     :title="release.url && `View scene on ${release.site.name}`"
 | |
|                     :href="release.url"
 | |
|                     :class="{ link: release.url }"
 | |
|                     target="_blank"
 | |
|                     rel="noopener noreferrer"
 | |
|                     class="tidbit date"
 | |
|                 >
 | |
|                     <Icon
 | |
|                         v-if="isAfter(new Date(), release.date)"
 | |
|                         icon="calendar2"
 | |
|                     />
 | |
| 
 | |
|                     <Icon
 | |
|                         v-else
 | |
|                         v-tooltip.bottom="'To be released'"
 | |
|                         icon="sun3"
 | |
|                     />
 | |
| 
 | |
|                     <span class="showable">{{ formatDate(release.date, 'MMM D, YYYY') }}</span>
 | |
|                     <span class="hideable">{{ formatDate(release.date, 'MMMM D, YYYY') }}</span>
 | |
|                 </a>
 | |
| 
 | |
|                 <span
 | |
|                     v-if="release.shootId"
 | |
|                     v-tooltip.bottom="`Shoot #`"
 | |
|                     class="tidbit shoot hideable"
 | |
|                 >
 | |
|                     <Icon icon="clapboard-play" />
 | |
|                     {{ release.shootId }}
 | |
|                 </span>
 | |
| 
 | |
|                 <span
 | |
|                     v-if="release.duration"
 | |
|                     v-tooltip.bottom="`Duration`"
 | |
|                     class="tidbit duration hideable"
 | |
|                 >
 | |
|                     <Icon icon="stopwatch" />
 | |
| 
 | |
|                     <span
 | |
|                         v-if="release.duration >= 3600"
 | |
|                         class="duration-segment"
 | |
|                     >{{ Math.floor(release.duration / 3600).toString().padStart(2, '0') }}:</span>
 | |
|                     <span class="duration-segment">{{ Math.floor((release.duration % 3600) / 60).toString().padStart(2, '0') }}:</span>
 | |
|                     <span class="duration-segment">{{ (release.duration % 60).toString().padStart(2, '0') }}</span>
 | |
|                 </span>
 | |
| 
 | |
|                 <span class="tidbit site">
 | |
|                     <a
 | |
|                         v-if="release.site.independent"
 | |
|                         :href="`/network/${release.network.slug}`"
 | |
|                     >
 | |
|                         <img
 | |
|                             :src="`/img/logos/${release.network.slug}/network.png`"
 | |
|                             :title="release.network.name"
 | |
|                             class="logo logo-site"
 | |
|                         >
 | |
|                     </a>
 | |
| 
 | |
|                     <template v-else>
 | |
|                         <a :href="`/network/${release.network.slug}`">
 | |
|                             <img
 | |
|                                 :src="`/img/logos/${release.network.slug}/network.png`"
 | |
|                                 :title="release.network.name"
 | |
|                                 :alt="release.network.name"
 | |
|                                 class="logo logo-network"
 | |
|                             >
 | |
|                         </a>
 | |
| 
 | |
|                         <span class="chain">presents</span>
 | |
| 
 | |
|                         <a
 | |
|                             :href="`/site/${release.site.slug}`"
 | |
|                         >
 | |
|                             <img
 | |
|                                 :src="`/img/logos/${release.network.slug}/${release.site.slug}.png`"
 | |
|                                 :title="release.site.name"
 | |
|                                 class="logo logo-site"
 | |
|                             >
 | |
|                         </a>
 | |
|                     </template>
 | |
| 
 | |
|                 </span>
 | |
|             </div>
 | |
|         </div>
 | |
| 
 | |
|         <div class="info column">
 | |
|             <h2 class="row title">{{ release.title }}</h2>
 | |
| 
 | |
|             <div class="row">
 | |
|                 <ul class="actors nolist">
 | |
|                     <li
 | |
|                         v-for="actor in release.actors"
 | |
|                         :key="actor.id"
 | |
|                     >
 | |
|                         <Actor :actor="actor" />
 | |
|                     </li>
 | |
|                 </ul>
 | |
|             </div>
 | |
| 
 | |
|             <div v-if="release.scenes && release.scenes.length > 0">
 | |
|                 <h3>Scenes</h3>
 | |
| 
 | |
|                 <Releases
 | |
|                     v-if="release.scenes && release.scenes.length > 0"
 | |
|                     :releases="release.scenes"
 | |
|                     class="row"
 | |
|                 />
 | |
|             </div>
 | |
| 
 | |
|             <div v-if="release.movie">
 | |
|                 <h3>Movie</h3>
 | |
| 
 | |
|                 <Release :release="release.movie" />
 | |
|             </div>
 | |
| 
 | |
|             <div
 | |
|                 v-if="release.tags.length > 0"
 | |
|                 class="row"
 | |
|             >
 | |
|                 <Icon icon="price-tags3" />
 | |
| 
 | |
|                 <ul class="tags nolist">
 | |
|                     <li
 | |
|                         v-for="tag in release.tags"
 | |
|                         :key="`tag-${tag.slug}`"
 | |
|                         class="tag"
 | |
|                     >
 | |
|                         <a
 | |
|                             :href="`/tag/${tag.slug}`"
 | |
|                             class="link"
 | |
|                         >{{ tag.name }}</a>
 | |
|                     </li>
 | |
|                 </ul>
 | |
|             </div>
 | |
| 
 | |
|             <div
 | |
|                 v-if="release.duration"
 | |
|                 class="row duration showable"
 | |
|             >
 | |
|                 <Icon icon="stopwatch" />
 | |
| 
 | |
|                 <span
 | |
|                     v-if="release.duration >= 3600"
 | |
|                     class="duration-segment"
 | |
|                 >{{ Math.floor(release.duration / 3600).toString().padStart(2, '0') }}:</span>
 | |
|                 <span class="duration-segment">{{ Math.floor((release.duration % 3600) / 60).toString().padStart(2, '0') }}:</span>
 | |
|                 <span class="duration-segment">{{ (release.duration % 60).toString().padStart(2, '0') }}</span>
 | |
|             </div>
 | |
| 
 | |
|             <p
 | |
|                 v-if="release.description"
 | |
|                 class="row description"
 | |
|             >
 | |
|                 <Icon icon="info2" />
 | |
|                 {{ release.description }}
 | |
|             </p>
 | |
| 
 | |
|             <div
 | |
|                 v-if="release.studio"
 | |
|                 class="row"
 | |
|             >
 | |
|                 <Icon icon="video-camera2" />
 | |
| 
 | |
|                 <a
 | |
|                     v-if="release.studio"
 | |
|                     :href="release.studio.url"
 | |
|                     target="_blank"
 | |
|                     rel="noopener noreferrer"
 | |
|                     class="link"
 | |
|                 >{{ release.studio.name }}</a>
 | |
|             </div>
 | |
| 
 | |
|             <div
 | |
|                 v-if="release.shootId"
 | |
|                 class="row showable"
 | |
|             >
 | |
|                 <Icon icon="clapboard-play" />
 | |
| 
 | |
|                 <a
 | |
|                     :href="release.url"
 | |
|                     :title="`release.shootId`"
 | |
|                     target="_blank"
 | |
|                     rel="noopener noreferrer"
 | |
|                     class="link shoot"
 | |
|                 >{{ release.shootId }}</a>
 | |
|             </div>
 | |
| 
 | |
|             <span class="row">
 | |
|                 <Icon icon="drawer-in" />
 | |
| 
 | |
|                 <a
 | |
|                     :href="`/added/${formatDate(release.dateAdded, 'YYYY-MM-DD')}`"
 | |
|                     :title="`Added on ${formatDate(release.dateAdded, 'MMMM D, YYYY')}`"
 | |
|                     target="_blank"
 | |
|                     rel="noopener noreferrer"
 | |
|                     class="link added"
 | |
|                 >{{ formatDate(release.dateAdded, 'MMMM D, YYYY') }}</a>
 | |
|             </span>
 | |
| 
 | |
|             <div class="row">
 | |
|                 <Icon icon="paste2" />
 | |
| 
 | |
|                 <input
 | |
|                     class="filename"
 | |
|                     :value="filename"
 | |
|                     @focus="copyFilename"
 | |
|                 >
 | |
|             </div>
 | |
|         </div>
 | |
|     </div>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| import config from 'config';
 | |
| import format from 'template-format';
 | |
| 
 | |
| import Banner from './banner.vue';
 | |
| import Actor from '../tile/actor.vue';
 | |
| import Release from '../tile/release.vue';
 | |
| import Releases from './releases.vue';
 | |
| 
 | |
| function pageTitle() {
 | |
|     return this.release && this.release.title;
 | |
| }
 | |
| 
 | |
| function copyFilename(event) {
 | |
|     event.target.setSelectionRange(0, event.target.value.length);
 | |
|     document.execCommand('copy');
 | |
| }
 | |
| 
 | |
| async function mounted() {
 | |
|     this.release = await this.$store.dispatch('fetchReleaseById', this.$route.params.releaseId);
 | |
|     this.filename = format(config.filename.pattern, {
 | |
|         ...this.release,
 | |
|         date: this.formatDate(this.release.date, config.filename.date),
 | |
|     }, {
 | |
|         spreadSeparator: config.filename.separator,
 | |
|     });
 | |
| }
 | |
| 
 | |
| export default {
 | |
|     components: {
 | |
|         Actor,
 | |
|         Banner,
 | |
|         Releases,
 | |
|         Release,
 | |
|     },
 | |
|     data() {
 | |
|         return {
 | |
|             release: null,
 | |
|             filename: null,
 | |
|         };
 | |
|     },
 | |
|     computed: {
 | |
|         pageTitle,
 | |
|     },
 | |
|     mounted,
 | |
|     methods: {
 | |
|         copyFilename,
 | |
|     },
 | |
| };
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
| @import 'theme';
 | |
| .column {
 | |
|     width: 1200px;
 | |
|     max-width: 100%;
 | |
|     padding: 0 1rem;
 | |
|     margin: 0 auto;
 | |
|     box-sizing: border-box;
 | |
| }
 | |
| 
 | |
| .info {
 | |
|     padding: 1rem;
 | |
|     border-left: solid 1px $shadow-hint;
 | |
|     border-right: solid 1px $shadow-hint;
 | |
|     flex-grow: 1;
 | |
| }
 | |
| 
 | |
| .row {
 | |
|     display: flex;
 | |
|     align-items: center;
 | |
|     margin: 0 0 1rem 0;
 | |
| 
 | |
|     .icon {
 | |
|         display: inline-block;
 | |
|         width: 1rem;
 | |
|         fill: $shadow-strong;
 | |
|         margin: 0 1rem 0 0;
 | |
|     }
 | |
| }
 | |
| 
 | |
| .details {
 | |
|     background: $profile;
 | |
|     color: $text-contrast;
 | |
|     box-shadow: 0 0 3px $shadow-weak;
 | |
|     cursor: default;
 | |
| 
 | |
|     .column {
 | |
|         display: flex;
 | |
|         align-items: center;
 | |
|         padding: 0 1rem;
 | |
|     }
 | |
| 
 | |
|     .link {
 | |
|         color: $text-contrast;
 | |
|     }
 | |
| }
 | |
| 
 | |
| .tidbit {
 | |
|     display: inline-block;
 | |
|     height: 100%;
 | |
| 
 | |
|     &:not(:last-child) {
 | |
|         border-right: solid 1px $highlight-hint;
 | |
|     }
 | |
| 
 | |
|     .icon {
 | |
|         fill: $highlight-weak;
 | |
|         margin: 0 .25rem 0 0;
 | |
|     }
 | |
| 
 | |
|     &.date,
 | |
|     &.duration,
 | |
|     &.shoot {
 | |
|         flex-shrink: 0;
 | |
|         padding: 1.25rem 1rem 1.25rem 0;
 | |
|         margin: 0 1rem 0 0;
 | |
|     }
 | |
| }
 | |
| 
 | |
| .site {
 | |
|     display: inline-flex;
 | |
|     flex-grow: 1;
 | |
|     align-items: center;
 | |
|     justify-content: flex-end;
 | |
|     padding: .25rem 0;
 | |
|     font-size: 0;
 | |
| }
 | |
| 
 | |
| .logo {
 | |
|     display: inline-block;
 | |
|     filter: $logo-highlight;
 | |
| }
 | |
| 
 | |
| .logo-site {
 | |
|     height: 3rem;
 | |
|     max-width: 15rem;
 | |
|     object-fit: contain;
 | |
|     object-position: 100% 50%;
 | |
| }
 | |
| 
 | |
| .logo-network {
 | |
|     height: 1.5rem;
 | |
|     max-width: 10rem;
 | |
|     object-fit: contain;
 | |
|     object-position: 100% 50%;
 | |
| }
 | |
| 
 | |
| .chain {
 | |
|     color: $highlight;
 | |
|     padding: 0 .5rem;
 | |
|     font-weight: bold;
 | |
|     font-size: .8rem;
 | |
| }
 | |
| 
 | |
| .title {
 | |
|     margin: 0 0 1.5rem 0;
 | |
| }
 | |
| 
 | |
| .description {
 | |
|     line-height: 1.25;
 | |
| }
 | |
| 
 | |
| .duration {
 | |
|     font-size: 0;
 | |
| }
 | |
| 
 | |
| .duration-segment {
 | |
|     font-size: 1rem;
 | |
| }
 | |
| 
 | |
| .actors {
 | |
|     display: flex;
 | |
|     flex-wrap: wrap;
 | |
| }
 | |
| 
 | |
| .actor {
 | |
|     width: 10rem;
 | |
|     margin: 0 1rem .5rem 0;
 | |
| }
 | |
| 
 | |
| .filename {
 | |
|     width: 100%;
 | |
|     padding: .5rem;
 | |
|     border: solid 1px $shadow-weak;
 | |
| }
 | |
| 
 | |
| .link {
 | |
|     display: inline-block;
 | |
|     color: $link;
 | |
|     text-decoration: none;
 | |
| 
 | |
|     &:hover {
 | |
|         color: $primary;
 | |
| 
 | |
|         .icon {
 | |
|             fill: $primary;
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| .tag .link {
 | |
|     background: $background;
 | |
|     display: inline-block;
 | |
|     padding: .5rem;
 | |
|     margin: 0 .25rem .25rem 0;
 | |
|     box-shadow: 0 0 2px $shadow-weak;
 | |
|     text-decoration: none;
 | |
|     text-transform: capitalize;
 | |
| 
 | |
|     &:hover {
 | |
|         color: $primary;
 | |
|     }
 | |
| }
 | |
| 
 | |
| .showable {
 | |
|     display: none;
 | |
| }
 | |
| 
 | |
| @media(max-width: $breakpoint3) {
 | |
|     .logo-network,
 | |
|     .chain {
 | |
|         display: none;
 | |
|     }
 | |
| }
 | |
| 
 | |
| @media(max-width: $breakpoint) {
 | |
|     .hideable {
 | |
|         display: none;
 | |
|     }
 | |
| 
 | |
|     .row .showable {
 | |
|         display: block;
 | |
|     }
 | |
| 
 | |
|     .tidbit .showable {
 | |
|         display: inline-block;
 | |
|     }
 | |
| 
 | |
|     .logo-site {
 | |
|         width: 15rem;
 | |
|         max-width: 100%;
 | |
|     }
 | |
| }
 | |
| </style>
 |