From e34c9cbd9c930755b3fa22e4d114c65f7e810a73 Mon Sep 17 00:00:00 2001 From: bach Date: Tue, 2 Apr 2024 12:27:11 +0200 Subject: [PATCH] audio editable --- src/api/gql/entite.fragment.gql | 1 + src/assets/main.scss | 10 +- src/components/contents/Source.vue | 24 ++- src/components/editable/AudioEditable.vue | 176 ++++++++++++++++++++++ src/components/editable/ImageEditable.vue | 6 +- 5 files changed, 211 insertions(+), 6 deletions(-) create mode 100644 src/components/editable/AudioEditable.vue diff --git a/src/api/gql/entite.fragment.gql b/src/api/gql/entite.fragment.gql index 56a8e64..d6fa0cf 100644 --- a/src/api/gql/entite.fragment.gql +++ b/src/api/gql/entite.fragment.gql @@ -44,6 +44,7 @@ fragment EntiteFields on Entite { audios { description file { + fid filemime filename filesize diff --git a/src/assets/main.scss b/src/assets/main.scss index f50463e..999e432 100644 --- a/src/assets/main.scss +++ b/src/assets/main.scss @@ -1069,7 +1069,8 @@ body{ } div.editable-image, -div.editable-video{ +div.editable-video, +div.editable-audios{ background: #eee; max-width: 100%; div.file-btn{ @@ -1110,4 +1111,11 @@ div.editable-video{ input[type="file"]{ display: none; } + &.can-update{ + .plyr--audio{ + .plyr__controls{ + background-color: transparent; + } + } + } } \ No newline at end of file diff --git a/src/components/contents/Source.vue b/src/components/contents/Source.vue index a99db61..e817365 100644 --- a/src/components/contents/Source.vue +++ b/src/components/contents/Source.vue @@ -9,6 +9,7 @@ import ContentEditable from '@components/editable/ContentEditable.vue'; import CheckboxEditable from '@components/editable/CheckboxEditable.vue'; import ImageEditable from '@components/editable/ImageEditable.vue'; import VideoEditable from '@components/editable/VideoEditable.vue'; +import AudioEditable from '@components/editable/AudioEditable.vue'; export default { props: ['concernement', 'entite', "eid", 'source'], @@ -42,6 +43,7 @@ export default { CheckboxEditable, ImageEditable, VideoEditable, + AudioEditable, } } @@ -103,10 +105,10 @@ export default { v-on:updated="reloadEntite"/> +
-
+ -
+
+ +import JSONAPI from '@api/json-axios' +import REST from '@api/rest-axios' + +import { mapActions, mapState } from 'pinia' +import { ConcernementsStore } from '@stores/concernements' +import { UserStore } from '@stores/user' + +import ContentEditable from '@components/editable/ContentEditable.vue'; + +import SvgIcon from '@jamescoyle/vue-icon'; +import { mdiTrashCanOutline } from '@mdi/js'; +import { mdiMusicNotePlus } from '@mdi/js'; + +export default { + props: { + can_update: Boolean, + audio: Object, + data: Object + }, + emits: ['updated'], + data(){ + return { + mdiTrashCanOutline_path: mdiTrashCanOutline, + mdiMusicNotePlus_path: mdiMusicNotePlus, + plyr_options: { + controls: ['play', 'progress', 'current-time', 'mute', 'volume'] + } + } + }, + computed: { + ...mapState(UserStore,['csrf_token']), + }, + created () { + console.log('ImageEditable created') + }, + mounted () { + + }, + methods: { + ...mapActions(ConcernementsStore, ['reloadConcernements']), + addAudio(e){ + console.log('addAudio', this.$refs); + this.$refs.audio_input.click(); + }, + onInput(e){ + console.log('onFileInput', e); + let file = e.target.files[0]; + console.log('onFileInput file', file); + this.save(file); + }, + save(file){ + const configs = { + headers: { + 'X-CSRF-Token': this.csrf_token, + 'Content-Type': 'application/octet-stream', + 'Content-Disposition': `file; filename="${file.name}"`, + }, + }; + + JSONAPI.post(`/${this.data.entitytype}/${this.data.bundle}/${this.data.uuid}/${this.data.field.field_name}`, file, configs) + .then(({ data : { data } }) => { + console.log('jsonapi post audio', data) + this.$emit('updated'); + }) + .catch(error => { + console.warn('Issue with jsonapi post image', error) + Promise.reject(error) + }) + }, + onDeleteAudio(e){ + console.log('onDeleteImg', e); + + const params = { + type: this.data.bundle, + // nid: [{"value":this.data.id}], + [this.data.field.field_name]: {[this.data.field.value]: null} + }; + if (this.data.entitytype === 'node') { + params.nid = [{"value":this.data.id}]; + } else { + params.id = [{"value":this.data.id}]; + } + + const configs = { + headers: {'X-CSRF-Token': this.csrf_token} + }; + + let url_base = `/${this.data.entitytype === 'node' ? '' : 'entity/'}${this.data.entitytype}`; + REST.patch(`${url_base}/${this.data.id}?_format=json`, params, configs) + .then(({ data }) => { + console.log(`user REST patch ${this.data.entitytype} ${this.data.bundle} ${this.data.field}`, data) + // TODO if success update the data in pinia + // this.reloadConcernements(); + this.$emit('updated'); + }) + .catch(error => { + console.warn(`Issue with patch ${this.data.entitytype} ${this.data.bundle} ${this.data.field}`, error) + Promise.reject(error) + }) + + // 405 JSONAPI operation not allowed, don't know why + + // const configs = { + // headers: { + // 'X-CSRF-Token': this.csrf_token, + // 'Content-Type': 'application/octet-stream', + // 'Content-Disposition': `file; filename=""`, + // }, + // }; + + // JSONAPI.delete(`/${this.data.entitytype}/${this.data.bundle}/${this.data.uuid}/${this.data.field}`, {}, configs) + // .then(({ data : { data } }) => { + // console.log('jsonapi delete image', data) + // this.$emit('updated'); + // }) + // .catch(error => { + // console.warn('Issue with jsonapi post image', error) + // Promise.reject(error) + // }) + // console.log('save csrf_token', this.csrf_token); + + }, + onUpdated(){ + this.$emit('updated'); + } + }, + components: { + SvgIcon, + ContentEditable + } +} + + + \ No newline at end of file diff --git a/src/components/editable/ImageEditable.vue b/src/components/editable/ImageEditable.vue index ae431f8..df42b17 100644 --- a/src/components/editable/ImageEditable.vue +++ b/src/components/editable/ImageEditable.vue @@ -118,6 +118,9 @@ export default { // }) // console.log('save csrf_token', this.csrf_token); + }, + onUpdated(){ + this.$emit('updated'); } }, components: { @@ -148,7 +151,8 @@ export default { bundle: data.bundle, id: data.id, field: {field_name: data.field, value:'alt', additional_values:{target_id:image.id}} - }" /> + }" + v-on:updated="onUpdated" />