@ -1,15 +1,45 @@
< template >
< div >
< input type = "file" id = "pf-dz" name = "media" class = "w-100 h-100 d-none file-input" draggable = "true" v -bind :accept ="config.uploader.media_types" >
< input type = "file" id = "pf-dz" name = "media" class = "w-100 h-100 d-none file-input" draggable = "true" v -bind :accept ="config.uploader.media_types" multiple = "" >
< div class = "timeline" >
< div v-if ="uploading" >
< div class = "card status-card card-md-rounded-0 w-100 h-100 bg-light py- 5 " style = "border-bottom: 1px solid #f1f1f1" >
< div class = "card status-card card-md-rounded-0 w-100 h-100 bg-light py- 3 " style = "border-bottom: 1px solid #f1f1f1" >
< div class = "p-5 mt-2" >
< b -progress :value ="uploadProgress" :max ="100" striped :animated ="true" > < / b - p r o g r e s s >
< p class = "text-center mb-0 font-weight-bold" > Uploading ... ( { { uploadProgress } } % ) < / p >
< / div >
< / div >
< / div >
< div v -else -if = " page = = ' cameraRoll ' " >
< div class = "card status-card card-md-rounded-0" style = "display:flex;" >
< div class = "card-header d-inline-flex align-items-center justify-content-between bg-white" >
< span class = "pr-3" >
< i class = "fas fa-cog fa-lg text-muted" > < / i >
< / span >
< span class = "font-weight-bold" >
Camera Roll
< / span >
< span class = "text-primary font-weight-bold" > Upload < / span >
< / div >
< div class = "h-100 card-body p-0 border-top" style = "width:100%; min-height: 400px;" >
< div v-if ="cameraRollMedia.length > 0" class="row p-0 m-0" >
< div v-for ="(m, index) in cameraRollMedia" :class="[index == 0 ? 'col-12 p-0' : 'col-3 p-0']" >
< div class = "card info-overlay p-0 rounded-0 shadow-none border" >
< div class = "square" >
< img class = "square-content" :src ="m.preview_url" > < / img >
< / div >
< / div >
< / div >
< / div >
< div v -else class = "w-100 h-100 d-flex justify-content-center align-items-center" >
< span class = "w-100 h-100" >
< button type = "button" class = "btn btn-primary" > Upload < / button >
< button type = "button" class = "btn btn-primary" @click ="fetchCameraRollDrafts()" > Load Camera Roll < / button >
< / span >
< / div >
< / div >
< / div >
< / div >
< div v-else >
< div class = "card status-card card-md-rounded-0 w-100 h-100" style = "display:flex;" >
< div class = "card-header d-inline-flex align-items-center justify-content-between bg-white" >
@ -18,15 +48,25 @@
< i class = "fas fa-times fa-lg" > < / i >
< span class = "font-weight-bold mb-0" > { { pageTitle } } < / span >
< / a >
< span v-else >
< span >
< a class = "text-lighter text-decoration-none mr-3" href = "#" @click.prevent ="goBack()" > < i class = "fas fa-long-arrow-alt-left fa-lg" > < / i > < / a >
< / span >
< span v -else -if = " page = = 2 " >
< button v-if ="config.uploader.album_limit > media.length" class="btn btn-outline-primary btn-sm font-weight-bold" @click.prevent="addMedia" data-toggle="tooltip" data-placement="bottom" title="Upload another photo or video" ><i class="fas fa-plus" > < / i > < / button >
<!-- < button v-if ="config.uploader.album_limit > media.length" class="btn btn-outline-primary btn-sm font-weight-bold" @click.prevent="page = 'cameraRoll'" data-toggle="tooltip" data-placement="bottom" title="Upload another photo or video" ><i class="fas fa-chevron-left" > < / i > Camera Roll < / button > - - >
< button v -else class = "btn btn-outline-secondary btn-sm font-weight-bold" disabled > < i class = "fas fa-plus" > < / i > < / button >
< / span >
< span v -else -if = " page = = 3 " >
< a class = "text-lighter text-decoration-none mr-3 d-flex align-items-center" href = "#" @click.prevent ="goBack()" >
< i class = "fas fa-long-arrow-alt-left fa-lg mr-2" > < / i >
< span class = "btn btn-outline-secondary btn-sm px-2 py-0 disabled" disabled = "" > { { media . length } } < / span >
< / a >
< span class = "font-weight-bold mb-0" > { { pageTitle } } < / span >
< / span >
< span v-else >
< a class = "text-lighter text-decoration-none mr-3" href = "#" @click.prevent ="goBack()" > < i class = "fas fa-long-arrow-alt-left fa-lg" > < / i > < / a >
< / span >
< span class = "font-weight-bold mb-0" > { { pageTitle } } < / span >
< / div >
< div v-if ="page == 2" >
< a href = "#" class = "text-center text-dark" @click.prevent ="showCropPhotoCard" > < i class = "fas fa-magic fa-lg" > < / i > < / a >
< a v-if ="media.length == 1" href="#" class="text-center text-dark" @click.prevent="showCropPhotoCard"><i class="fas fa-magic fa-lg" > < / i > < / a >
< / div >
< div >
<!-- < a v-if ="page > 1" class="font-weight-bold text-decoration-none" href="#" @click.prevent="page--" > Back < / a > - - >
@ -37,31 +77,65 @@
< / span >
< span v-else >
< a v-if ="!pageLoading && (page > 1 && page <= 2) || (page == 1 && ids.length != 0) || page == 'cropPhoto'" class="font-weight-bold text-decoration-none" href="#" @click.prevent="nextPage" > Next < / a >
< a v-if ="!pageLoading && page == 3" class="font-weight-bold text-decoration-none" href="#" @click.prevent="compose "> Post < / a >
< a v-if ="!pageLoading && page == 3" class="font-weight-bold text-decoration-none" href="#" @click.prevent="compose () "> Post < / a >
< / span >
< / div >
< / div >
< div class = "card-body p-0 border-top" >
< div v-if ="page == 1" class="w-100 h-100 d-flex justify-content-center align-items-center" style="min-height: 400px;" >
< div class = "text-center" >
< p >
< a class = "btn btn-primary font-weight-bold" href = "/i/compose" > Compose Post < / a >
< / p >
< a class = "card mx-md-5 my-md-3 shadow-none border compose-action text-decoration-none text-dark" href = "/i/compose" >
< div class = "card-body" >
< div class = "media" >
< div class = "mr-3 align-items-center justify-content-center" style = "display:inline-flex;width:40px;height:40px;border-radius: 100%;background-color: #008DF5" >
< i class = "far fa-image text-white fa-lg" > < / i >
< / div >
< div class = "media-body text-left" >
< h5 class = "mt-0 font-weight-bold text-primary" > New Post < / h5 >
< p class = "mb-0 text-muted" > Share up to { { config . uploader . album _limit } } photos or videos . < / p >
< / div >
< / div >
< / div >
< / a >
< a class = "card mx-md-5 my-md-3 shadow-none border compose-action text-decoration-none text-dark" href = "/i/collections/create" >
< div class = "card-body" >
< div class = "media" >
< div class = "mr-3 align-items-center justify-content-center" style = "display:inline-flex;width:40px;height:40px;border-radius: 100%;background-color: #008DF5" >
< i class = "fas fa-images text-white fa-lg" > < / i >
< / div >
< div class = "media-body text-left" >
< p class = "mb-0" >
< span class = "h5 mt-0 font-weight-bold text-primary" > New Collection < / span >
< / p >
< p class = "mb-0 text-muted" > Create a curated collection of photos . < / p >
< / div >
< / div >
< / div >
< / a >
< div v-if ="media.length == 0" class="card mx-md-5 my-md-3 shadow-none border compose-action text-decoration-none text-dark" >
< div @click.prevent ="addMedia" class = "card-body" >
< div class = "media" >
< div class = "mr-3 align-items-center justify-content-center" style = "display:inline-flex;width:40px;height:40px;border-radius: 100%;background-color: #008DF5" >
< i class = "fas fa-bolt text-white fa-lg" > < / i >
< / div >
< div class = "media-body text-left" >
< p class = "mb-0" >
< span class = "h5 mt-0 font-weight-bold text-primary" > Try ComposeUI v4 < / span >
< sup >
< span class = "badge badge-primary pb-1" > BETA < / span >
< / sup >
< / p >
< p class = "mb-0 text-muted" > The next generation compose experience . < / p >
< / div >
< / div >
< / div >
< / div >
< hr >
< p v-if ="media.length == 0" >
< button type = "button" class = "btn btn-outline-primary font-weight-bold" @click.prevent ="addMedia" > Compose Post < sup > BETA < / sup > < / button >
< / p >
< p >
< button class = "btn btn-outline-primary font-weight-bold" @click.prevent ="createCollection" > New Collection < / button >
< / p >
<!-- < p >
< button class = "btn btn-outline-primary font-weight-bold" @click.prevent ="showAddToStoryCard()" > Add To My Story < / button >
< / p > -- >
< p >
< a class = "font-weight-bold" href = "/site/help" > Need Help ? < / a >
< / p >
< p class = "text-muted mb-0 small text-center" > Formats : < b > { { acceptedFormats ( ) } } < / b > up to < b > { { maxSize ( ) } } < / b > < / p >
< p class = "text-muted mb-0 small text-center" > Albums can contain up to < b > { { config . uploader . album _limit } } < / b > photos or videos < / p >
< / div >
< / div >
@ -74,32 +148,74 @@
: viewMode = "cropper.viewMode"
: zoomable = "cropper.zoomable"
: rotatable = "true"
: src = "media[ 0 ].url"
: src = "media[ carouselCursor ].url"
>
< / v u e - c r o p p e r >
< / div >
< / div >
< div v-if ="page == 2" class="w-100 h-100" >
< div slot = "img" style = "display:flex;min-height: 420px;align-items: center;" >
< img : class = "'d-block img-fluid w-100 ' + [media[carouselCursor].filter_class?media[carouselCursor].filter_class:'']" :src ="media[carouselCursor].url" :alt ="media[carouselCursor].description" :title ="media[carouselCursor].description" >
< div v-if ="media.length == 1" >
< div slot = "img" style = "display:flex;min-height: 420px;align-items: center;" >
< img : class = "'d-block img-fluid w-100 ' + [media[carouselCursor].filter_class?media[carouselCursor].filter_class:'']" :src ="media[carouselCursor].url" :alt ="media[carouselCursor].description" :title ="media[carouselCursor].description" >
< / div >
< hr >
< div v-if ="ids.length > 0 && media[carouselCursor].type == 'Image'" class="align-items-center px-2 pt-2" >
< ul class = "nav media-drawer-filters text-center" >
< li class = "nav-item" >
< div class = "p-1 pt-3" >
< img :src ="media[carouselCursor].url" width = "100px" height = "60px" v -on : click.prevent = " toggleFilter ( $ event , null ) " class = "cursor-pointer" >
< / div >
< a : class = "[media[carouselCursor].filter_class == null ? 'nav-link text-primary active' : 'nav-link text-muted']" href = "#" v -on : click.prevent = " toggleFilter ( $ event , null ) " > No Filter < / a >
< / li >
< li class = "nav-item" v-for ="(filter, index) in filters" >
< div class = "p-1 pt-3" >
< img :src ="media[carouselCursor].url" width = "100px" height = "60px" :class ="filter[1]" v -on : click.prevent = " toggleFilter ( $ event , filter [ 1 ] ) " >
< / div >
< a : class = "[media[carouselCursor].filter_class == filter[1] ? 'nav-link text-primary active' : 'nav-link text-muted']" href = "#" v -on : click.prevent = " toggleFilter ( $ event , filter [ 1 ] ) " > { { filter [ 0 ] } } < / a >
< / li >
< / ul >
< / div >
< / div >
< hr >
< div v-if ="ids.length > 0 && media[carouselCursor].type == 'Image'" class="align-items-center px-2 pt-2" >
< div v -else -if = " media.length > 1 " class=" d - flex - inline px - 2 pt - 2 " >
< ul class = "nav media-drawer-filters text-center" >
< li class = "nav-item" >
< div class = "p-1 pt-3" >
< img :src ="media[carouselCursor].url" width = "100px" height = "60px" v -on : click.prevent = " toggleFilter ( $ event , null ) " class = "cursor-pointer" >
< / div >
< a : class = "[media[carouselCursor].filter_class == null ? 'nav-link text-primary active' : 'nav-link text-muted']" href = "#" v -on : click.prevent = " toggleFilter ( $ event , null ) " > No Filter < / a >
< / li >
< li class = "nav-item" v-for ="(filter, index) in filters" >
< div class = "p-1 pt-3" >
< img :src ="media[carouselCursor].url" width = "100px" height = "60px" :class ="filter[1]" v -on : click.prevent = " toggleFilter ( $ event , filter [ 1 ] ) " >
< / div >
< a : class = "[media[carouselCursor].filter_class == filter[1] ? 'nav-link text-primary active' : 'nav-link text-muted']" href = "#" v -on : click.prevent = " toggleFilter ( $ event , filter [ 1 ] ) " > { { filter [ 0 ] } } < / a >
< li class = "nav-item mx-md-4" > & nbsp ; < / li >
< li v-for ="(m, i) in media" class="nav-item mx-md-4" >
< div class = "nav-link" style = "display:block;width:300px;height:300px;" @ click = "carouselCursor = i" >
<!-- < img : class = "'d-block img-fluid w-100 ' + [m.filter_class?m.filter_class:'']" :src ="m.url" :alt ="m.description" :title ="m.description" > -- >
< span :class ="[m.filter_class?m.filter_class:'']" >
< span : class = "'rounded border ' + [i == carouselCursor ? ' border-primary shadow':'']" : style = "'display:block;padding:5px;width:100%;height:100%;background-image: url(' + m.url + ');background-size:cover;border-width:3px !important;'" > < / span >
< / span >
< / div >
< div v-if ="i == carouselCursor" class="text-center mb-0 small text-lighter font-weight-bold pt-2" >
< span class = "cursor-pointer" @click.prevent ="showCropPhotoCard" > Crop < / span >
< span class = "cursor-pointer px-3" @click.prevent ="showEditMediaCard()" > Edit < / span >
< span class = "cursor-pointer" @click ="deleteMedia()" > Delete < / span >
< / div >
< / li >
< li class = "nav-item mx-md-4" > & nbsp ; < / li >
< / ul >
< hr >
< div v-if ="ids.length > 0 && media[carouselCursor].type == 'Image'" class="align-items-center px-2 pt-2" >
< ul class = "nav media-drawer-filters text-center" >
< li class = "nav-item" >
< div class = "p-1 pt-3" >
< img :src ="media[carouselCursor].url" width = "100px" height = "60px" v -on : click.prevent = " toggleFilter ( $ event , null ) " class = "cursor-pointer" >
< / div >
< a : class = "[media[carouselCursor].filter_class == null ? 'nav-link text-primary active' : 'nav-link text-muted']" href = "#" v -on : click.prevent = " toggleFilter ( $ event , null ) " > No Filter < / a >
< / li >
< li class = "nav-item" v-for ="(filter, index) in filters" >
< div class = "p-1 pt-3" >
< img :src ="media[carouselCursor].url" width = "100px" height = "60px" :class ="filter[1]" v -on : click.prevent = " toggleFilter ( $ event , filter [ 1 ] ) " >
< / div >
< a : class = "[media[carouselCursor].filter_class == filter[1] ? 'nav-link text-primary active' : 'nav-link text-muted']" href = "#" v -on : click.prevent = " toggleFilter ( $ event , filter [ 1 ] ) " > { { filter [ 0 ] } } < / a >
< / li >
< / ul >
< / div >
< / div >
< div v-else >
< p class = "mb-0 p-5 text-center font-weight-bold" > An error occured , please refresh the page . < / p >
< / div >
< / div >
@ -116,16 +232,27 @@
< / div >
< / div >
< / div >
< div class = "border-bottom" >
< p class = "px-4 mb-0 py-2 cursor-pointer" @click ="showTagCard()" > Tag people < / p >
< div class = "border-bottom d-flex justify-content-between px-4 mb-0 py-2 " >
< div >
< div class = "text-dark " > Contains NSFW Media < / div >
< / div >
< div >
< div class = "custom-control custom-switch" style = "z-index: 9999;" >
< input type = "checkbox" class = "custom-control-input" id = "asnsfw" v-model ="nsfw" >
< label class = "custom-control-label" for = "asnsfw" > < / label >
< / div >
< / div >
< / div >
<!-- < div class = "border-bottom" >
< p class = "px-4 mb-0 py-2 cursor-pointer" @click ="showTagCard()" > Tag people < / p >
< / div > -- >
< div class = "border-bottom" >
< p class = "px-4 mb-0 py-2 cursor-pointer" @click ="showLocationCard()" v-if ="!place" > Add location < / p >
< p v -else class = "px-4 mb-0 py-2" >
< span class = "text-lighter" > Location : < / span > { { place . name } } , { { place . country } }
< span class = "float-right" >
< a href = "#" @click.prevent ="showLocationCard()" class = "text-muted font-weight-bold small mr-2" > Change < / a >
< a href = "#" @ click.prevent = " place = false " class = "text-muted font-weight-bold small" > Remove < / a >
< a href = "#" @click.prevent ="showLocationCard()" class = " btn btn-outline-secondary btn-sm small mr-2" style = "font-size:10px;padding:3px;text-transform: uppercase" > Edit < / a >
< a href = "#" @ click.prevent = " place = false " class = " btn btn-outline-secondary btn-sm small" style = "font-size:10px;padding:3px;text-transform: uppercase "> Remove < / a >
< / span >
< / p >
< / div >
@ -133,10 +260,22 @@
< p class = "px-4 mb-0 py-2" >
< span class = "text-lighter" > Visibility : < / span > { { visibilityTag } }
< span class = "float-right" >
< a href = "#" @click.prevent ="showVisibilityCard()" class = "text-muted font-weight-bold small mr-2" > Change < / a >
< a v-if ="profile.locked == false" href="#" @click.prevent="showVisibilityCard()" class="btn btn-outline-secondary btn-sm small mr-2" style="font-size:10px;padding:3px;text-transform: uppercase" > Edit < / a >
< / span >
< / p >
< / div >
<!-- < div class = "cursor-pointer border-bottom px-4 mb-0 py-2" @click.prevent ="showMediaDescriptionsCard()" >
< div class = "d-flex justify-content-between align-items-center" >
< div >
< div class = "text-dark" > Media Descriptions < / div >
< p class = "text-muted small mb-0" > Describe your photos for people with visual impairments . < / p >
< / div >
< div >
< i class = "fas fa-chevron-right fa-lg text-lighter" > < / i >
< / div >
< / div >
< / div > -- >
< div style = "min-height: 200px;" >
< p class = "px-4 mb-0 py-2 small font-weight-bold text-muted cursor-pointer" @click ="showAdvancedSettingsCard()" > Advanced settings < / p >
< / div >
@ -172,33 +311,50 @@
< / div >
< / div >
< / div >
< div class = "list-group-item d-flex justify-content-between ">
< div >
< div class = "text-dark " > Contains NSFW Media < / div >
< / div >
< div>
< div class = "custom-control custom-switch" style = "z-index: 9999;" >
< input type = "checkbox" class = "custom-control-input" id = "asnsfw" v-model ="nsfw" >
< label class = "custom-control-label" for = "asnsfw" > < / label >
< a href = "#" class = "list-group-item" @click.prevent ="showMediaDescriptionsCard() ">
< div class = "d-flex justify-content-between align-items-center" >
< div >
< div class = "text-dark" > Media Descriptions < / div >
< p class = "text-mute d small mb-0"> Descr ibe your photos for people with visual impairments .< / p >
< / div >
< div >
< i class = "fas fa-chevron-right fa-lg text-lighter" > < / i >
< / div >
< / div >
< / div >
< a href = "#" class = "list-group-item" @ click.prevent = " page = 'altText' " >
< div class = "text-dark" > Write alt text < / div >
< p class = "text-muted small mb-0" > Alt text describes your photos for people with visual impairments . < / p >
< / a >
< a href = "#" class = "list-group-item" @ click.prevent = " page = 'addToCollection' " >
< div class = "text-dark" > Add to Collection < / div >
< p class = "text-muted small mb-0" > Add this post to a collection . < / p >
<!-- < a href = "#" class = "list-group-item" @click.prevent ="showAddToCollectionsCard()" >
< div class = "d-flex justify-content-between align-items-center" >
< div >
< div class = "text-dark" > Add to Collection < / div >
< p class = "text-muted small mb-0" > Add this post to a collection . < / p >
< / div >
< div >
< i class = "fas fa-chevron-right fa-lg text-lighter" > < / i >
< / div >
< / div >
< / a >
< a href = "#" class = "list-group-item" @ click.prevent = " page = 'schedulePost' " >
< div class = "text-dark" > Schedule < / div >
< p class = "text-muted small mb-0" > Schedule post for a future date . < / p >
< div class = "d-flex justify-content-between align-items-center" >
< div >
< div class = "text-dark" > Schedule < / div >
< p class = "text-muted small mb-0" > Schedule post for a future date . < / p >
< / div >
< div >
< i class = "fas fa-chevron-right fa-lg text-lighter" > < / i >
< / div >
< / div >
< / a >
< a href = "#" class = "list-group-item" @ click.prevent = " page = 'mediaMetadata' " >
< div class = "text-dark" > Metadata < / div >
< p class = "text-muted small mb-0" > Manage media exif and metadata . < / p >
< / a >
< div class = "d-flex justify-content-between align-items-center" >
< div >
< div class = "text-dark" > Metadata < / div >
< p class = "text-muted small mb-0" > Manage media exif and metadata . < / p >
< / div >
< div >
< i class = "fas fa-chevron-right fa-lg text-lighter" > < / i >
< / div >
< / div >
< / a > -- >
< / div >
< / div >
@ -211,11 +367,38 @@
< / div >
< div v-if ="page == 'altText'" class="w-100 h-100 p-3" >
< p class = "text-center lead text-muted mb-0 py-5" > This feature is not available yet . < / p >
< div v-for ="(m, index) in media" >
< div class = "media" >
< img :src ="m.preview_url" class = "mr-3" width = "50px" height = "50px" >
< div class = "media-body" >
< textarea class = "form-control" v-model ="m.alt" placeholder="Add a media description here..." > < / textarea >
< p class = "help-text small text-right text-muted mb-0" > { { m . alt ? m . alt . length : 0 } } / 140 < / p >
< / div >
< / div >
< hr >
< / div >
< p class = "d-flex justify-content-between mb-0" >
< button type = "button" @click ="goBack()" class = "btn btn-link text-muted font-weight-bold text-decoration-none" > Cancel < / button >
< button type = "button" @click ="goBack()" class = "btn btn-primary font-weight-bold" > Save < / button >
< / p >
< / div >
< div v-if ="page == 'addToCollection'" class="w-100 h-100 p-3" >
< p class = "text-center lead text-muted mb-0 py-5" > This feature is not available yet . < / p >
< div class = "list-group mb-3" >
< div class = "list-group-item cursor-pointer compose-action border" @click ="goBack()" >
< div class = "media" >
< img src = "" class = "mr-3" alt = "" width = "50px" height = "50px" >
< div class = "media-body" >
< h5 class = "mt-0" > collection title < / h5 >
< p class = "mb-0 text-muted small" > 3 Photos - Created 2 h ago < / p >
< / div >
< / div >
< / div >
< / div >
< p class = "d-flex justify-content-between mb-0" >
< button type = "button" @click ="goBack()" class = "btn btn-link text-muted font-weight-bold text-decoration-none" > Cancel < / button >
< button type = "button" @click ="goBack()" class = "btn btn-primary font-weight-bold" > Save < / button >
< / p >
< / div >
< div v-if ="page == 'schedulePost'" class="w-100 h-100 p-3" >
@ -230,6 +413,35 @@
< p class = "text-center lead text-muted mb-0 py-5" > This feature is not available yet . < / p >
< / div >
< div v-if ="page == 'editMedia'" class="w-100 h-100 p-3" >
< div class = "media" >
< img :src ="media[carouselCursor].preview_url" class = "mr-3" width = "50px" height = "50px" >
< div class = "media-body" >
< div class = "form-group" >
< label class = "font-weight-bold text-muted small" > Media Description < / label >
< textarea class = "form-control" v-model ="media[carouselCursor].alt" placeholder="Add a media description here..." > < / textarea >
< p class = "help-text small text-muted mb-0 d-flex justify-content-between" >
< span > Describe your photo for people with visual impairments . < / span >
< span > { { media [ carouselCursor ] . alt ? media [ carouselCursor ] . alt . length : 0 } } / 140 < / span >
< / p >
< / div >
< div class = "form-group" >
< label class = "font-weight-bold text-muted small" > License < / label >
< input type = "text" class = "form-control" v-model ="media[carouselCursor].license" placeholder="All Rights Reserved (Default license)" >
< p class = "help-text small text-muted mb-0 d-flex justify-content-between" >
< span > < / span >
< span > { { media [ carouselCursor ] . license ? media [ carouselCursor ] . license . length : 0 } } / 140 < / span >
< / p >
< / div >
< / div >
< / div >
< hr >
< p class = "d-flex justify-content-between mb-0" >
< button type = "button" @click ="goBack()" class = "btn btn-link text-muted font-weight-bold text-decoration-none" > Cancel < / button >
< button type = "button" @click ="goBack()" class = "btn btn-primary font-weight-bold" > Save < / button >
< / p >
< / div >
< / div >
<!-- card - footers -- >
@ -258,6 +470,10 @@
overflow - x : scroll ;
flex - wrap : unset ;
}
. media - drawer - filters : : - webkit - scrollbar {
width : 0 px ;
background : transparent ;
}
. media - drawer - filters . nav - link {
min - width : 100 px ;
padding - top : 1 rem ;
@ -284,6 +500,10 @@
text - decoration : none ;
background - color : # f8f9fa ! important ;
}
. compose - action : hover {
cursor : pointer ;
background - color : # f8f9fa ! important ;
}
< / style >
< script type = "text/javascript" >
@ -340,8 +560,11 @@ export default {
'addToCollection' ,
'schedulePost' ,
'mediaMetadata' ,
'addToStory'
]
'addToStory' ,
'editMedia' ,
'cameraRoll'
] ,
cameraRollMedia : [ ]
}
} ,
@ -350,53 +573,17 @@ export default {
if ( this . config . uploader . media _types . includes ( 'video/mp4' ) == false ) {
this . composeType = 'post'
}
this . filters = window . App . util . filters ;
} ,
mounted ( ) {
this . mediaWatcher ( ) ;
this . filters = [
[ '1977' , 'filter-1977' ] ,
[ 'Aden' , 'filter-aden' ] ,
[ 'Amaro' , 'filter-amaro' ] ,
[ 'Ashby' , 'filter-ashby' ] ,
[ 'Brannan' , 'filter-brannan' ] ,
[ 'Brooklyn' , 'filter-brooklyn' ] ,
[ 'Charmes' , 'filter-charmes' ] ,
[ 'Clarendon' , 'filter-clarendon' ] ,
[ 'Crema' , 'filter-crema' ] ,
[ 'Dogpatch' , 'filter-dogpatch' ] ,
[ 'Earlybird' , 'filter-earlybird' ] ,
[ 'Gingham' , 'filter-gingham' ] ,
[ 'Ginza' , 'filter-ginza' ] ,
[ 'Hefe' , 'filter-hefe' ] ,
[ 'Helena' , 'filter-helena' ] ,
[ 'Hudson' , 'filter-hudson' ] ,
[ 'Inkwell' , 'filter-inkwell' ] ,
[ 'Kelvin' , 'filter-kelvin' ] ,
[ 'Kuno' , 'filter-juno' ] ,
[ 'Lark' , 'filter-lark' ] ,
[ 'Lo-Fi' , 'filter-lofi' ] ,
[ 'Ludwig' , 'filter-ludwig' ] ,
[ 'Maven' , 'filter-maven' ] ,
[ 'Mayfair' , 'filter-mayfair' ] ,
[ 'Moon' , 'filter-moon' ] ,
[ 'Nashville' , 'filter-nashville' ] ,
[ 'Perpetua' , 'filter-perpetua' ] ,
[ 'Poprocket' , 'filter-poprocket' ] ,
[ 'Reyes' , 'filter-reyes' ] ,
[ 'Rise' , 'filter-rise' ] ,
[ 'Sierra' , 'filter-sierra' ] ,
[ 'Skyline' , 'filter-skyline' ] ,
[ 'Slumber' , 'filter-slumber' ] ,
[ 'Stinson' , 'filter-stinson' ] ,
[ 'Sutro' , 'filter-sutro' ] ,
[ 'Toaster' , 'filter-toaster' ] ,
[ 'Valencia' , 'filter-valencia' ] ,
[ 'Vesper' , 'filter-vesper' ] ,
[ 'Walden' , 'filter-walden' ] ,
[ 'Willow' , 'filter-willow' ] ,
[ 'X-Pro II' , 'filter-xpro-ii' ]
] ;
} ,
updated ( ) {
if ( this . page == 2 ) {
$ ( '[data-toggle="tooltip"]' ) . tooltip ( ) ;
}
} ,
methods : {
@ -406,6 +593,7 @@ export default {
window . pixelfed . currentUser = res . data ;
if ( res . data . locked == true ) {
this . visibility = 'private' ;
this . visibilityTag = 'Followers Only' ;
}
} ) . catch ( err => {
} ) ;
@ -422,7 +610,6 @@ export default {
mediaWatcher ( ) {
let self = this ;
self . mediaDragAndDrop ( ) ;
$ ( document ) . on ( 'change' , '#pf-dz' , function ( e ) {
self . mediaUpload ( ) ;
} ) ;
@ -435,6 +622,8 @@ export default {
Array . prototype . forEach . call ( io . files , function ( io , i ) {
if ( self . media && self . media . length + i >= self . config . uploader . album _limit ) {
swal ( 'Error' , 'You can only upload ' + self . config . uploader . album _limit + ' photos per album' , 'error' ) ;
self . uploading = false ;
self . page = 2 ;
return ;
}
let type = io . type ;
@ -442,6 +631,8 @@ export default {
let validated = $ . inArray ( type , acceptedMimes ) ;
if ( validated == - 1 ) {
swal ( 'Invalid File Type' , 'The file you are trying to add is not a valid mime type. Please upload a ' + self . config . uploader . media _types + ' only.' , 'error' ) ;
self . uploading = false ;
self . page = 2 ;
return ;
}
@ -460,113 +651,50 @@ export default {
self . uploadProgress = 100 ;
self . ids . push ( e . data . id ) ;
self . media . push ( e . data ) ;
self . page = 2 ;
self . uploading = false ;
setTimeout ( function ( ) {
self . uploading = false ;
} , 10 00) ;
self . page = 2 ;
} , 3 00) ;
} ) . catch ( function ( e ) {
self . uploading = false ;
io . value = null ;
swal ( 'Oops, something went wrong!' , 'An unexpected error occurred.' , 'error' ) ;
self . page = 2 ;
} ) ;
io . value = null ;
self . uploadProgress = 0 ;
} ) ;
} ,
mediaDragAndDrop ( ) {
let self = this ;
let pdz = document . getElementById ( 'content' ) ;
function allowDrag ( e ) {
e . dataTransfer . dropEffect = 'copy' ;
e . preventDefault ( ) ;
}
function handleDrop ( e ) {
e . preventDefault ( ) ;
/ / l e t d z = d o c u m e n t . q u e r y S e l e c t o r ( ' # p f - d z ' ) ;
/ / d z . f i l e s = e . d a t a T r a n s f e r . f i l e s ;
/ / $ ( ' # c o m p o s e M o d a l ' ) . m o d a l ( ' s h o w ' ) ;
/ / s e l f . m e d i a U p l o a d ( ) ;
}
window . addEventListener ( 'dragenter' , function ( e ) {
} ) ;
pdz . addEventListener ( 'dragenter' , allowDrag ) ;
pdz . addEventListener ( 'dragover' , allowDrag ) ;
pdz . addEventListener ( 'dragleave' , function ( e ) {
/ /
} ) ;
pdz . addEventListener ( 'drop' , handleDrop ) ;
} ,
toggleFilter ( e , filter ) {
this . media [ this . carouselCursor ] . filter _class = filter ;
} ,
updateMedia ( ) {
this . mediaDrawer = false ;
} ,
deleteMedia ( ) {
if ( window . confirm ( 'Are you sure you want to delete this media?' ) == false ) {
return ;
}
let id = this . media [ this . carouselCursor ] . id ;
axios . delete ( '/api/pixelfed/v1/media' , {
params : {
id : id
}
} ) . then ( res => {
if ( this . media . length == 1 ) {
this . mediaDrawer = false ;
this . ids . splice ( this . carouselCursor , 1 ) ;
this . media . splice ( this . carouselCursor , 1 ) ;
if ( this . media . length == 0 ) {
this . ids = [ ] ;
this . media = [ ] ;
this . carouselCursor = 0 ;
} else {
this . carouselCursor = 0 ;
}
this . ids . splice ( this . carouselCursor , 1 ) ;
this . media . splice ( this . carouselCursor , 1 ) ;
} ) . catch ( err => {
swal ( 'Whoops!' , 'An error occured when attempting to delete this, please try again' , 'error' ) ;
} ) ;
} ,
mediaAltText ( ) {
return ;
/ / d e p r e c a t e
swal ( {
text : 'Add a media description' ,
content : "input"
} ) . then ( val => {
let media = this . media [ this . carouselCursor ] ;
media . alt = val ;
} ) ;
} ,
mediaLicense ( ) {
return ;
/ / d e p r e c a t e
swal ( {
text : 'Add a media license' ,
content : "input" ,
button : {
text : "Update" ,
closeModal : true ,
} ,
} ) . then ( val => {
let media = this . media [ this . carouselCursor ] ;
media . license = val ;
} ) ;
} ,
compose ( ) {
let state = this . composeState ;
@ -607,7 +735,6 @@ export default {
break ;
case 'delete' :
this . mediaDrawer = false ;
this . ids = [ ] ;
this . media = [ ] ;
this . carouselCursor = 0 ;
@ -619,35 +746,28 @@ export default {
}
} ,
about ( ) {
let text = document . createElement ( 'div' ) ;
text . innerHTML = `
< p class = "small font-weight-bold" > Please visit the < a href = "/site/kb/sharing-media" > Sharing Media < / a > page for more info . < / p >
` ;
swal ( {
title : 'Compose UI v3' ,
content : text ,
icon : 'info'
} ) ;
} ,
closeModal ( ) {
this . composeType = '' ;
$ ( '#composeModal' ) . modal ( 'hide' ) ;
} ,
composeMessage ( ) {
let config = this . config ;
let composeType = this . composeType ;
let video = config . uploader . media _types . includes ( 'video/mp4' ) ;
goBack ( ) {
this . pageTitle = '' ;
switch ( this . page ) {
case 'addToStory' :
this . page = 1 ;
break ;
return video ?
'Click here to add photos or videos' :
'Click here to add photos' ;
} ,
case 'cropPhoto' :
case 'editMedia' :
this . page = 2 ;
break ;
createCollection ( ) {
window . location . href = '/i/collections/create' ;
default :
this . namedPages . indexOf ( this . page ) != - 1 ? this . page = 3 : this . page -- ;
break ;
}
} ,
nextPage ( ) {
@ -696,18 +816,6 @@ export default {
this . $refs . cropper . setAspectRatio ( ratio ) ;
} ,
maxSize ( ) {
let limit = this . config . uploader . max _photo _size ;
return limit / 1000 + ' MB' ;
} ,
acceptedFormats ( ) {
let formats = this . config . uploader . media _types ;
return formats . split ( ',' ) . map ( f => {
return ' ' + f . split ( '/' ) [ 1 ] ;
} ) . toString ( ) ;
} ,
showTagCard ( ) {
this . pageTitle = 'Tag People' ;
this . page = 'tagPeople' ;
@ -746,24 +854,6 @@ export default {
return ;
} ,
goBack ( ) {
this . pageTitle = '' ;
switch ( this . page ) {
case 'addToStory' :
this . page = 1 ;
break ;
case 'cropPhoto' :
this . page = 2 ;
break ;
default :
this . namedPages . indexOf ( this . page ) != - 1 ? this . page = 3 : this . page -- ;
break ;
}
} ,
showVisibilityCard ( ) {
this . pageTitle = 'Post Visibility' ;
this . page = 'visibility' ;
@ -789,6 +879,33 @@ export default {
this . visibilityTag = tags [ state ] ;
this . pageTitle = '' ;
this . page = 3 ;
} ,
showMediaDescriptionsCard ( ) {
this . pageTitle = 'Media Descriptions' ;
this . page = 'altText' ;
} ,
showAddToCollectionsCard ( ) {
this . pageTitle = 'Add to Collection' ;
this . page = 'addToCollection' ;
} ,
showSchedulePostCard ( ) {
this . pageTitle = 'Schedule Post' ;
this . page = 'schedulePost' ;
} ,
showEditMediaCard ( ) {
this . pageTitle = 'Edit Media' ;
this . page = 'editMedia' ;
} ,
fetchCameraRollDrafts ( ) {
axios . get ( '/api/pixelfed/local/drafts' )
. then ( res => {
this . cameraRollMedia = res . data ;
} ) ;
}
}
}