ali 1 éve
szülő
commit
cc9246008b

+ 15 - 14
src/components/FormBuilderCustumComponents/ContentMedias/ContentMedias.vue

@@ -171,21 +171,22 @@ export default {
         if (!source) {
           return
         }
+        window.open(source, '_blank')
 
-        const fileName = (source.match(/(?<=\/)[^/?#]+(?=[^/]*$)/gm) || [media.title])[0]
-        this.fetchLoading = true
-        fetch(source)
-          .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
-          })
+        // const fileName = (source.match(/(?<=\/)[^/?#]+(?=[^/]*$)/gm) || [media.title])[0]
+        // this.fetchLoading = true
+        // fetch(source)
+        //   .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) {

+ 57 - 0
src/components/Widgets/Store/Basket/UserStoreBasketShow/ProductOrPackageMedias.vue

@@ -0,0 +1,57 @@
+<template>
+  <q-card v-for="(product, productIndex) in products.list"
+          :key="productIndex"
+          class="q-mb-md">
+    <q-card-section>{{ product.title }}</q-card-section>
+    <q-separator />
+    <q-card-section>
+      <content-medias v-if="product.medias_info.list.length > 0"
+                      :can-delete="false"
+                      :can-add-media="false"
+                      :show-download-link="true"
+                      :show-page-link="false"
+                      :readonly="true"
+                      :value="product.medias_info.list" />
+      <q-badge v-else>
+        محتوای قابل دانلودی برای این محصول وجود ندارد
+      </q-badge>
+    </q-card-section>
+  </q-card>
+</template>
+
+<script>
+import { BasketItem } from 'src/models/BasketItem.js'
+import { ProductList } from 'src/models/Product.js'
+import ContentMedias from 'src/components/FormBuilderCustumComponents/ContentMedias/ContentMedias.vue'
+
+export default {
+  name: 'ProductOrPackageMedias',
+  components: { ContentMedias },
+  props: {
+    basketItem: BasketItem,
+    default: new BasketItem()
+  },
+  data () {
+    return {
+      products: new ProductList(),
+      medias: null
+    }
+  },
+  mounted() {
+    this.loadProducts()
+  },
+  methods: {
+    loadProducts () {
+      if (this.basketItem.product_info.id) {
+        this.products = new ProductList([this.basketItem.product_info])
+      } else if (this.basketItem.package_info.id) {
+        this.products = new ProductList(this.basketItem.package_info.products_info)
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 36 - 3
src/components/Widgets/Store/Basket/UserStoreBasketShow/UserStoreBasketShow.vue

@@ -42,7 +42,6 @@
         </div>
       </template>
     </entity-show>
-
     <div class="q-mt-md">
       <entity-index v-if="basket.id"
                     v-model:value="tableInputs"
@@ -61,6 +60,14 @@
             <q-img :src="inputData.col.value"
                    width="100px" />
           </template>
+          <template v-else-if="inputData.col.name === 'download'">
+            <q-btn color="primary"
+                   @click="openDownloadDialog(inputData.props.row)">
+              <q-icon name="download"
+                      class="q-mr-sm" />
+              دانلود
+            </q-btn>
+          </template>
           <template v-else-if="inputData.col.name === 'action'">
             <q-btn color="primary"
                    outline
@@ -75,6 +82,17 @@
           </template>
         </template>
       </entity-index>
+      <q-dialog v-model="downloadDialog">
+        <q-card style="width: 800px; max-width: 95%;">
+          <q-card-section>
+            محتوای قابل دانلود
+          </q-card-section>
+          <q-separator />
+          <q-card-section>
+            <product-or-package-medias :basket-item="selectedBasketItem" />
+          </q-card-section>
+        </q-card>
+      </q-dialog>
     </div>
   </div>
 </template>
@@ -88,6 +106,7 @@ import { mixinWidget } from 'src/mixin/Mixins.js'
 import { APIGateway } from 'src/api/APIGateway.js'
 import { EntityShow, EntityIndex } from 'quasar-crud'
 import { FormBuilderAssist } from 'quasar-form-builder'
+import ProductOrPackageMedias from './ProductOrPackageMedias.vue'
 import FormBuilderDateTime from 'src/components/FormBuilderCustumComponents/FormBuilderDateTime.vue'
 
 const FormBuilderDateTimeComp = shallowRef(FormBuilderDateTime)
@@ -96,12 +115,15 @@ export default {
   name: 'AdminStoreBasketShow',
   components: {
     EntityShow,
-    EntityIndex
+    EntityIndex,
+    ProductOrPackageMedias
   },
   mixins: [mixinWidget],
   data () {
     return {
       mounted: false,
+      downloadDialog: false,
+      selectedBasketItem: null,
       entityLoading: false,
       api: APIGateway.basket.APIAdresses.byId(this.$route.params.id),
       entityIdKey: 'id',
@@ -182,10 +204,17 @@ export default {
             align: 'left',
             field: row => parseInt((row.product_info || row.package_info).unit_price?.toString()).toLocaleString('fa')
           },
+          {
+            name: 'download',
+            required: true,
+            label: 'دانلود',
+            align: 'left',
+            field: row => ''
+          },
           {
             name: 'action',
             required: true,
-            label: 'عملیات',
+            label: 'مشاهده',
             align: 'left',
             field: row => ''
           }
@@ -228,6 +257,10 @@ export default {
     this.mounted = true
   },
   methods: {
+    openDownloadDialog (basketItem) {
+      this.selectedBasketItem = basketItem
+      this.downloadDialog = true
+    },
     afterLoadInputData (data) {
       this.entityLoading = false
       this.basket = new Basket(data)