%PDF- %PDF-
Direktori : /home/dopla/www/wp-content/plugins/ml-slider/admin/assets/js/app/slides/external/ |
Current File : /home/dopla/www/wp-content/plugins/ml-slider/admin/assets/js/app/slides/external/Unsplash.vue |
<template> <media-container> <!-- TODO: add loading --> <template slot="media-list"> <li v-for="photo in photos" :aria-label="sprintf(__('Photo by %s', 'ml-slider'), photo.user.name)" :key="photo.id" :class="{ selected: selected === photo, details: selected === photo }" class="attachment save-ready" tabindex="0" role="checkbox" aria-checked="false" @click="selected = selected === photo ? {} : photo"> <div :class="photo.orientation" class="attachment-preview js--select-attachment type-image subtype-jpeg"> <div class="thumbnail"> <div class="centered"> <img :alt="sprintf(__('Photo by %s', 'ml-slider'), photo.user.name)" :src="photo.urls.thumb" draggable="false"> </div> </div> </div> <button type="button" class="check" tabindex="-1"> <span class="media-modal-icon"/> <span class="screen-reader-text">{{ __('Deselect', 'ml-slider') }}</span> </button> </li> </template> <template slot="sidebar"> <div v-if="selected.id"> <div tabindex="0" class="attachment-details"> <h2>{{ __('Attachment Details', 'ml-slider') }}</h2> <div class="attachment-info"> <div class="thumbnail thumbnail-image"> <img :src="selected.urls.small" :alt="fileName" draggable="false"> </div> <div class="details"> <div class="filename">{{ fileName }}</div> <div class="dimensions"> {{ sprintf( _x('%s by %s pixels', '1000 by 1000 pixels', 'ml-slider'), selected.width, selected.height ) }} </div> <a :href="selected.links.html" target="_blank">{{ __('view original', 'ml-slider') }}</a> </div> </div> <div class="ms-api-user"> <img class="rtl:mr-0 rtl:ml-4" :src="selected.user.profile_image.medium"> <div class="ms-profile-data"> <div class="ms-profile-details"> <h3>{{ selected.user.name }}</h3> <p class="ms-user-location" v-html="selected.user.location"/> <div v-if="selected.user.bio" class="ms-user-bio" v-html="selected.user.bio"/> </div> <ul class="ms-profile-meta"> <li v-if="selected.user.username"> <a :href="selected.user.links.html" :title="selected.user.links.html" target="_blank" class="ms-profile-username">{{ __('Profile', 'ml-slider') }} </a> </li> <li v-if="selected.user.portfolio_url" class="ms-user-portfolio-url"> <a :href="selected.user.portfolio_url" :title="selected.user.portfolio_url" target="_blank">{{ __('Portfolio', 'ml-slider') }} </a> </li> </ul> </div> </div> <label class="setting"> <span class="name">{{ __('Title', 'ml-slider') }}</span> <input v-model="upload.title" type="text"> </label> <label class="setting"> <span class="name">{{ __('Caption', 'ml-slider') }}</span> <textarea v-model="upload.caption"/> </label> <label class="setting"> <span class="name">{{ __('Alt Text', 'ml-slider') }}</span> <input v-model="upload.alt" type="text"> </label> <label class="setting"> <span class="name">{{ __('Description', 'ml-slider') }}</span> <textarea v-model="upload.description"/> </label> <label class="quality setting"> <span class="name">{{ __('Quality', 'ml-slider') }}</span> <select v-model="upload.quality" class="alignment"> <option v-for="quality in qualityOptions" :key="quality" :value="quality"> {{ quality.charAt(0).toUpperCase() + quality.slice(1) }} </option> </select> </label> </div> </div> </template> <template slot="copyright"> <p> {{ __('All photos published on Unsplash can be used for free.', 'ml-slider') }} <a target="_blank" href="https://unsplash.com/license">{{ __('view license', 'ml-slider') }}</a> </p> </template> </media-container> </template> <script> import { Unsplash } from '../../api' import MediaContainer from './MediaContainer.vue' export default { components: { MediaContainer }, props: {}, data() { return { errorMessage: '', canLoadMore: false, loadingFresh: true, loadingMore: true, searchTerm: '', page: 1, photos: [], selected: { id: null }, filters: {}, mediaButton: {}, qualityOptions: ['raw', 'full', 'regular'], upload: { title: '', caption: '', alt: '', description: '', quality: 'full' // TODO: maybe we persist this in file data? } } }, computed: { fileName() { // Not sure if we can get the real file name without a second call on the photo id. likely not important return this.selected.id ? this.selected.user.name.replace(' ', '-').toLowerCase() + '-' + this.selected.id + '-unsplash.jpg' : '' } }, watch: { selected(photo) { this.upload.caption = photo.user ? this.sprintf( this._x('Photo by %s on %s', 'Photo by NAME on Unsplash', 'ml-slider'), '<a href=\'' + photo.user.links.html + '\'>' + photo.user.name + '</a>', '<a href=\'https://unsplash.com/\'>Unsplash</a>' ) : '' } }, mounted() { this.notifyInfo('metaslider/unsplash-tab-opened', this.__('Opening Unsplash tab...', 'ml-slider')) this.loadFreshImages() }, destroyed() { this.notifyInfo('metaslider/unsplash-tab-closed', this.__('Unsplash tab closed', 'ml-slider')) }, methods: { async getImages() { this.errorMessage = '' const { data } = await Unsplash.photos(this.page, this.searchTerm) // If no photos were found, let them know if (!data.data.length) throw this.__('No photots found.', 'ml-slider') // Use this to avoid errors when duplicate images are being sent back data.data.forEach(photo => { this.photos.some(existingPhoto => { return existingPhoto.id === photo.id }) || this.photos.push(photo) }) // this.photos.push(...data.data) }, loadFreshImages() { this.readyToLoad(false) this.page = 1 this.photos = [] this.selected = { id: null } this.getImages() .then(() => this.readyToLoad()) .catch(error => { this.errorMessage = error this.loadingFresh = false this.throwError(error) }) }, async loadMore() { this.page++ this.loadingMore = true // The UX feels clunky if the load is immediate await new Promise(resolve => setTimeout(resolve, 1000)) this.getImages() .then(() => this.readyToLoad()) .catch(() => { // Most likely there are no more images this.canLoadMore = false }) }, download() { return Unsplash.download(this.selected.urls[this.upload.quality], this.selected.id) }, fetchFilters() { // TODO: Call to get available filters (pro override with more?) // Not sure how to do this. Maybe we can offer 10 common words? // or grab the user's categories? this.filters = {} }, searchByTerm() { this.loadFreshImages() }, readyToLoad(status = true) { this.canLoadMore = status this.loadingMore = !status this.loadingFresh = !status } } } </script> <style lang="scss"> .ms-api-user { clear: both; border-bottom: 1px solid #ddd; display: flex; justify-content: flex-start; margin-bottom: 1rem; padding-bottom: 1rem; img { border-radius: 50%; width: 64px; height: 64px; min-width: 64px; margin-right: 1rem; } h3 { margin: 0; line-height: 1.1; } .ms-user-location { color: #aaa; font-size: 0.9em; margin: 0; line-height: 1.3; } .ms-user-bio { margin-top: 0.3em; line-height: 1.1; font-size: 1em; margin-bottom: 0.4rem; } .ms-profile-data { display: flex; flex-direction: column; justify-content: space-between; } .ms-profile-meta { display: flex; margin: 0; li { margin-right: 0.5em; margin-bottom: 0; } } } </style>