Bladeren bron

fixed #165

ali 3 jaren geleden
bovenliggende
commit
5f11c80f4c

+ 34 - 2
src/components/FormBuilderCustumComponents/ContentMedias/ContentMedias.vue

@@ -1,5 +1,7 @@
 <template>
   <div class="ContentMedias">
+    <q-linear-progress v-if="fetchLoading"
+                       indeterminate />
     <div v-if="canAddMedia && !readonly"
          class="q-mb-md">
       <entity-create ref="entityCreate"
@@ -89,11 +91,20 @@ export default {
     readonly: {
       default: false,
       type: Boolean
+    },
+    showPageLink: {
+      default: true,
+      type: Boolean
+    },
+    showDownloadLink: {
+      default: false,
+      type: Boolean
     }
   },
   emits: ['update:value'],
   data () {
     return {
+      fetchLoading: false,
       medias: new MediaList(),
       api: APIGateway.media.APIAdresses.base,
       entityIdKey: 'id',
@@ -142,8 +153,29 @@ export default {
   },
   methods: {
     onView (media) {
-      const routeData = this.$router.resolve({ name: 'Admin.Media.Show', params: { id: media.id } })
-      window.open(routeData.href, '_blank')
+      if (this.showPageLink) {
+        const routeData = this.$router.resolve({ name: 'Admin.Media.Show', params: { id: media.id } })
+        window.open(routeData.href, '_blank')
+        return
+      }
+      if (this.showDownloadLink) {
+        if (media.file) {
+          const fileName = (media.file.match(/(?<=\/)[^/?#]+(?=[^/]*$)/gm) || [media.title])[0]
+          this.fetchLoading = true
+          fetch(media.file)
+            .then(response => response.blob())
+            .then(blob => {
+              const link = document.createElement('a')
+              link.href = URL.createObjectURL(blob)
+              link.download = fileName
+              link.click()
+              this.fetchLoading = false
+            })
+            .catch(() => {
+              this.fetchLoading = false
+            })
+        }
+      }
     },
     onDelete (media) {
       this.removeMedia(media.id)

+ 1 - 1
src/components/FormBuilderCustumComponents/ContentMedias/MediaCategory.vue

@@ -43,7 +43,7 @@ export default {
       default: true
     }
   },
-  emits: ['update:value'],
+  emits: ['update:value', 'onView', 'onDelete'],
   data () {
     return {
       entityCreateLoading: false

+ 1 - 1
src/components/FormBuilderCustumComponents/ContentMedias/MediaItem.vue

@@ -34,7 +34,7 @@ export default {
       default: true
     }
   },
-  emits: ['update:value'],
+  emits: ['update:value', 'onView', 'onDelete'],
   data () {
     return {
       entityCreateLoading: false

+ 13 - 2
src/components/FormBuilderCustumComponents/ContentsSelector/ContentItem.vue

@@ -16,7 +16,8 @@
               </div>
             </div>
             <div class="actions">
-              <q-btn icon="visibility"
+              <q-btn v-if="showPageLink"
+                     icon="visibility"
                      outline
                      color="primary"
                      class="viewBtn"
@@ -32,7 +33,9 @@
           <div class="content-medias">
             <content-medias :value="content.medias_info"
                             :can-delete="false"
-                            :can-add-media="false" />
+                            :can-add-media="false"
+                            :show-page-link="showPageLink"
+                            :show-download-link="showDownloadLink" />
           </div>
         </q-card-section>
       </q-card>
@@ -55,6 +58,14 @@ export default {
     readonly: {
       default: false,
       type: Boolean
+    },
+    showPageLink: {
+      default: true,
+      type: Boolean
+    },
+    showDownloadLink: {
+      default: false,
+      type: Boolean
     }
   },
   emits: ['update:value'],

+ 10 - 0
src/components/FormBuilderCustumComponents/ContentsSelector/ContentsSelector.vue

@@ -13,6 +13,8 @@
                     :key="selectedContentIndex"
                     :content="selectedContent"
                     :readonly="readonly"
+                    :show-page-link="showPageLink"
+                    :show-download-link="showDownloadLink"
                     @onView="onView"
                     @onDelete="onDelete" />
     </div>
@@ -38,6 +40,14 @@ export default {
     readonly: {
       default: false,
       type: Boolean
+    },
+    showPageLink: {
+      default: true,
+      type: Boolean
+    },
+    showDownloadLink: {
+      default: false,
+      type: Boolean
     }
   },
   emits: ['update:value'],

+ 20 - 1
src/components/Widgets/Other/ShowClassroomInfo/ShowClassroomInfo.vue

@@ -86,6 +86,7 @@
                    outline
                    color="primary"
                    class="btn-register q-ml-md"
+                   :loading="fetchCodesLoading"
                    @click="openCodeLink">
               آیین نامه دوره
             </q-btn>
@@ -306,6 +307,7 @@ export default {
       profileMode: false
     },
     acceptClassType: 'register', // accept - enrollment - rules
+    fetchCodesLoading: false,
     dropLoading: false,
     rulesAccept: false,
     rulesDialog: false,
@@ -370,7 +372,24 @@ export default {
       this.rulesDialog = true
     },
     openCodeLink () {
-      window.open(this.classroom.codes)
+      if (!this.classroom.codes) {
+        return
+      }
+
+      const fileName = (this.classroom.codes.match(/(?<=\/)[^/?#]+(?=[^/]*$)/gm) || [this.classroom.title])[0]
+      this.fetchCodesLoading = true
+      fetch(this.classroom.codes)
+        .then(response => response.blob())
+        .then(blob => {
+          const link = document.createElement('a')
+          link.href = URL.createObjectURL(blob)
+          link.download = fileName
+          link.click()
+          this.fetchCodesLoading = false
+        })
+        .catch(() => {
+          this.fetchCodesLoading = false
+        })
     },
     openRegisterDialog () {
       this.acceptClassType = 'register'

+ 2 - 1
src/models/Media.js

@@ -28,7 +28,8 @@ class Media extends Model {
       {
         key: 'hashtags_info',
         relatedModel: MediaHashtagList
-      }
+      },
+      { key: 'file' }
     ])
 
     this.typeEnums = [

+ 1 - 1
src/pages/User/Profile/projectInfo.vue

@@ -87,7 +87,7 @@ export default {
         { type: 'dateTime', name: 'ending_doing_period', responseKey: 'ending_doing_period', label: 'زمان پایان', placeholder: ' ', col: 'col-md-6 col-12' },
         { type: 'separator', name: 'space', size: '0', col: 'col-md-12' },
         { type: 'inputEditor', name: 'description', responseKey: 'description', label: 'توضیحات پروژه', placeholder: ' ', col: 'col-12' },
-        { type: ContentsSelectorComp, name: 'contents', responseKey: 'contents_info', col: 'col-12' },
+        { type: ContentsSelectorComp, name: 'contents', responseKey: 'contents_info', showPageLink: false, showDownloadLink: true, col: 'col-12' },
         { type: 'hidden', name: 'id', responseKey: 'id' },
         { type: 'hidden', name: 'classroom', responseKey: 'classroom' }
       ],