ali 3 rokov pred
rodič
commit
09bb458611

+ 5 - 2
src/api/models/Classroom.js

@@ -14,7 +14,7 @@ export default class ClassroomAPI extends APIRepository {
       members: '/lma/registrations',
       activitySheet: '/lma/registrations/activity_sheet',
       enrollByAdmin: (classroomId, userId) => '/lma/classrooms/' + classroomId + '/enrolll?user_id=' + userId,
-      dropByAdmin: (classroomId, userId) => '/lma/classrooms/' + classroomId + '/drop?user_id=' + userId,
+      dropByAdmin: (classroomId) => '/lma/classrooms/' + classroomId + '/drop',
       createInvoice: (id) => '/lma/classrooms/' + id + '/create_invoice',
       createInvoiceByAdmin: (classroomId, userId) => '/lma/classrooms/' + classroomId + '/create_invoice?user_id=' + userId
     }
@@ -102,7 +102,10 @@ export default class ClassroomAPI extends APIRepository {
     return this.sendRequest({
       apiMethod: 'put',
       api: this.api,
-      request: this.APIAdresses.dropByAdmin(classroomId, userId),
+      request: this.APIAdresses.dropByAdmin(classroomId),
+      data: {
+        owner: userId
+      },
       resolveCallback: (response) => {
         return new Classroom(response.data)
       },

+ 31 - 12
src/components/Widgets/Other/Shop/ShopCompleteInfo/ShopCompleteInfo.vue

@@ -124,6 +124,7 @@
 <script>
 import { EntityEdit } from 'quasar-crud'
 import Enums from 'src/assets/Enums/Enums.js'
+import { Invoice } from 'src/models/Invoice.js'
 import ShamsiDate from 'src/assets/ShamsiDate.js'
 import { APIGateway } from 'src/api/APIGateway.js'
 import { Classroom } from 'src/models/Classroom.js'
@@ -139,6 +140,7 @@ export default {
     rulesDialog: false,
     loading: true,
     classroom: new Classroom(),
+    invoice: new Invoice(),
 
     api: APIGateway.user.APIAdresses.current,
     entityIdKey: 'id',
@@ -215,16 +217,44 @@ export default {
     ]
   }),
   mounted () {
+    this.loadClassroomFromStore()
     this.mounted = true
   },
   methods: {
+    loadClassroomFromStore () {
+      this.classroom = this.$store.getters['Shop/onRegisterClassroom']
+    },
     editEntity () {
       this.$refs.entityEdit.editEntity(false)
         .then(() => {
-          this.$router.push({ name: 'UserPanel.ShopPaymentFromWallet' })
+          if (this.$route.query.type === 'register') {
+            this.createInvoice()
+              .then(() => {
+                this.$router.push({ name: 'UserPanel.ShopPaymentFromWallet', query: this.$route.query })
+              })
+              .catch(() => {})
+          } else {
+            this.$router.push({ name: 'UserPanel.ShopPaymentFromWallet', query: this.$route.query })
+          }
         })
         .catch(() => {})
     },
+    createInvoice () {
+      return new Promise((resolve, reject) => {
+        this.invoice.loading = true
+        APIGateway.classroom.createInvoice(this.classroom.id)
+          .then((invoice) => {
+            this.invoice = new Invoice(invoice)
+            this.invoice.loading = false
+            this.$store.commit('Shop/updateRegisterClassroomInvoice', this.invoice)
+            resolve(this.invoice)
+          })
+          .catch(() => {
+            this.invoice.loading = false
+            reject()
+          })
+      })
+    },
     afterLoadInputData () {
       this.checkNationalCode()
     },
@@ -258,17 +288,6 @@ export default {
         return '-'
       }
       return ShamsiDate.getTerm(classroom.beginning_registration_period)
-    },
-    getClassrooms () {
-      this.loading = true
-      APIGateway.classroom.get(this.$route.params.id)
-        .then(classroom => {
-          this.classroom = new Classroom(classroom)
-          this.loading = false
-        })
-        .catch(() => {
-          this.loading = false
-        })
     }
   }
 }

+ 34 - 12
src/components/Widgets/Other/Shop/ShopPaymentFromWallet/ShopPaymentFromWallet.vue

@@ -100,7 +100,8 @@
       </div>
     </q-card>
 
-    <div class="info-column">
+    <div v-if="isRegisterPage"
+         class="info-column">
       <q-skeleton v-if="invoice.loading"
                   height="200px"
                   width="100%"
@@ -117,6 +118,15 @@
                             @onAccept="onAccept" />
     </div>
 
+    <div v-if="isEnrollmentPage"
+         class="text-center">
+      <q-btn color="primary"
+             :loading="enrolmentLoading"
+             @click="enrollClassroom">
+        تایید و پیش ثبت نام
+      </q-btn>
+    </div>
+
     <template v-if="false">
       <q-banner class="banner complete-info-pay-banner">
         پرداخت
@@ -252,6 +262,7 @@ export default {
   components: { InvoiceInfo, InvoicePaymentCard },
   data: () => ({
     step: false,
+    enrolmentLoading: false,
     user: new User(),
     wallet: new Wallet(),
     invoice: new Invoice(),
@@ -260,14 +271,33 @@ export default {
     rulesDialog: false,
     loading: true
   }),
+  computed: {
+    isRegisterPage () {
+      return this.$route.query.type === 'register'
+    },
+    isEnrollmentPage () {
+      return this.$route.query.type === 'enrollment'
+    }
+  },
   mounted () {
     this.loadAuthData()
     this.loadClassroomFromStore()
     this.checkStoreClassroom()
-    this.createInvoice()
+    this.getInvoiceFromStore()
     this.getMyWallet()
   },
   methods: {
+    enrollClassroom () {
+      this.enrolmentLoading = true
+      APIGateway.classroom.enrollByUser(this.classroom.id)
+        .then(() => {
+          this.enrolmentLoading = false
+          this.$route.push({ name: 'UserPanel.Profile.ClassroomInfo', params: { id: this.classroom.id } })
+        })
+        .catch(() => {
+          this.enrolmentLoading = false
+        })
+    },
     onCancel () {
       this.$router.push({ name: 'Public.AllClassrooms' })
     },
@@ -323,16 +353,8 @@ export default {
           this.wallet.loading = false
         })
     },
-    createInvoice () {
-      this.invoice.loading = true
-      APIGateway.classroom.createInvoice(this.classroom.id)
-        .then((invoice) => {
-          this.invoice = new Invoice(invoice)
-          this.invoice.loading = false
-        })
-        .catch(() => {
-          this.invoice.loading = false
-        })
+    getInvoiceFromStore () {
+      this.invoice = this.$store.getters['Shop/registerClassroomInvoice']
     },
     loadClassroomFromStore () {
       this.classroom = this.$store.getters['Shop/onRegisterClassroom']

+ 15 - 27
src/components/Widgets/Other/ShowClassroomInfo/ShowClassroomInfo.vue

@@ -35,7 +35,7 @@
             <q-btn v-if="classroom.is_enabled_adding && classroom.current_user_register_info?.status !== 'REGISTERED'"
                    color="primary"
                    class="btn-register"
-                   @click="openRulesDialog">
+                   @click="openRegisterDialog">
               <svg data-name="Add User"
                    xmlns="http://www.w3.org/2000/svg"
                    width="20"
@@ -53,7 +53,6 @@
             <q-btn v-if="classroom.is_enabled_enrolment && classroom.current_user_register_info?.status !== 'ENROLLED'"
                    color="primary"
                    class="btn-register"
-                   :loading="enrolmentLoading"
                    @click="onEnrolment">
               <svg data-name="Add User"
                    xmlns="http://www.w3.org/2000/svg"
@@ -69,7 +68,7 @@
               </svg>
               پیش ثبت نام
             </q-btn>
-            <q-btn v-if="classroom.is_enabled_viewing"
+            <q-btn v-if="!defaultOptions.profileMode && classroom.is_enabled_viewing"
                    color="primary"
                    class="btn-register"
                    :to="{name: 'UserPanel.Profile.ClassroomInfo', params: {id: classroom.id}}">
@@ -327,23 +326,23 @@
         <q-separator />
 
         <q-card-actions class="rulesDialog-actions">
-          <div v-if="!defaultOptions.profileMode"
+          <div v-if="!defaultOptions.profileMode && acceptClassType !== 'rules'"
                class="rulesDialog-accept-chk">
             <q-checkbox v-model="rulesAccept"
                         label="آیین نامه دوره آموزشی را خواندم و قصد ثبت نام در دوره را دارم" />
           </div>
           <div class="rulesDialog-btns q-gutter-md">
-            <q-btn v-if="defaultOptions.profileMode"
+            <q-btn v-if="defaultOptions.profileMode || acceptClassType === 'rules'"
                    v-close-popup
                    label="بستن"
                    color="primary"
                    outline />
-            <q-btn v-if="!defaultOptions.profileMode"
+            <q-btn v-if="!defaultOptions.profileMode && acceptClassType !== 'rules'"
                    v-close-popup
                    label="انصراف"
                    color="primary"
                    outline />
-            <q-btn v-if="!defaultOptions.profileMode"
+            <q-btn v-if="!defaultOptions.profileMode && acceptClassType !== 'rules'"
                    label="تایید و ادامه"
                    color="primary"
                    :disable="!rulesAccept"
@@ -378,7 +377,7 @@ export default {
     defaultOptions: {
       profileMode: false
     },
-    enrolmentLoading: false,
+    acceptClassType: 'register', // accept - enrollment - rules
     dropLoading: false,
     rulesAccept: false,
     rulesDialog: false,
@@ -403,27 +402,11 @@ export default {
     },
     acceptAndContinue () {
       this.$store.commit('Shop/updateOnRegisterClassroom', this.classroom)
-      this.$router.push({ name: 'UserPanel.ShopCompleteInfo' })
+      this.$router.push({ name: 'UserPanel.ShopCompleteInfo', query: { type: this.acceptClassType } })
     },
     onEnrolment () {
-      this.$q.dialog({
-        title: 'توجه',
-        message: 'آیا از پیش ثبت نام این دوره اطمینان دارید؟' + '\n' + this.classroom.unit_info.codes,
-        html: true,
-        cancel: true,
-        persistent: true
-      }).onOk(() => {
-        this.enrolmentLoading = true
-        const classroomId = this.$route.params.id
-        APIGateway.classroom.enrollByUser(classroomId)
-          .then(() => {
-            this.enrolmentLoading = false
-            this.getClassroom()
-          })
-          .catch(() => {
-            this.enrolmentLoading = false
-          })
-      })
+      this.acceptClassType = 'enrollment'
+      this.rulesDialog = true
     },
     onDropping () {
       this.$q.dialog({
@@ -445,6 +428,11 @@ export default {
       })
     },
     openRulesDialog () {
+      this.acceptClassType = 'rules'
+      this.rulesDialog = true
+    },
+    openRegisterDialog () {
+      this.acceptClassType = 'register'
       this.rulesDialog = true
     },
     getHoldingType (type) {

+ 27 - 5
src/pages/Admin/Classroom/show.vue

@@ -113,18 +113,20 @@
               خروجی اکسل
             </q-btn>
           </template>
-          <template v-slot:entity-index-table-cell="{inputData, showConfirmRemoveDialog}">
+          <template v-slot:entity-index-table-cell="{inputData}">
             <template v-if="inputData.col.name === 'number'">
               {{ inputData.rowNumber }}
             </template>
             <template v-else-if="inputData.col.name === 'action'">
               <div class="action-column-entity-index">
-                <q-btn size="md"
+                <q-btn v-if="inputData.props.row.status !== 'DROPPED_BY_ADMIN'"
+                       size="md"
                        color="red"
                        outline
                        label="انصراف"
+                       :loading="dropClassroomByAdminLoading"
                        class="q-mr-md"
-                       @click="showConfirmRemoveDialog(inputData.props.row, 'id', getRemoveRegistrationMessage(inputData.props.row))" />
+                       @click="dropClassroomByAdmin(inputData.props.row)" />
               </div>
             </template>
             <template v-else>
@@ -359,6 +361,7 @@ export default {
         pageKey: 'page'
       },
 
+      dropClassroomByAdminLoading: false,
       exportReportLoading: false,
       membersListInputs: [
         { type: 'hidden', name: 'classroom', value: classroomId },
@@ -697,8 +700,27 @@ export default {
     getRemoveMessage (row) {
       return 'آیا از حذف ' + row.title + ' اطمینان دارید؟'
     },
-    getRemoveRegistrationMessage (row) {
-      return 'آیا از انصراف (' + row.owner_info.firstname + ' ' + row.owner_info.lastname + ') اطمینان دارید؟'
+    dropClassroomByAdmin (row) {
+      const classroomId = row.classroom
+      const userId = row.owner
+      const message = 'آیا از انصراف (' + row.owner_info.firstname + ' ' + row.owner_info.lastname + ') اطمینان دارید؟'
+      this.$q.dialog({
+        title: 'توجه',
+        message,
+        html: true,
+        cancel: true,
+        persistent: true
+      }).onOk(() => {
+        this.dropClassroomByAdminLoading = true
+        APIGateway.classroom.dropByAdmin(classroomId, userId)
+          .then(() => {
+            this.dropClassroomByAdminLoading = false
+            this.searchMembersList()
+          })
+          .catch(() => {
+            this.dropClassroomByAdminLoading = false
+          })
+      })
     }
   }
 }

+ 4 - 0
src/store/Shop/getters.js

@@ -1,3 +1,7 @@
 export function onRegisterClassroom (state) {
   return state.onRegisterClassroom
 }
+
+export function registerClassroomInvoice (state) {
+  return state.registerClassroomInvoice
+}

+ 4 - 0
src/store/Shop/mutations.js

@@ -1,3 +1,7 @@
 export function updateOnRegisterClassroom (state, newInfo) {
   state.onRegisterClassroom = newInfo
 }
+
+export function updateRegisterClassroomInvoice (state, newInfo) {
+  state.registerClassroomInvoice = newInfo
+}

+ 2 - 1
src/store/Shop/state.js

@@ -1,5 +1,6 @@
 export default function () {
   return {
-    onRegisterClassroom: null
+    onRegisterClassroom: null,
+    registerClassroomInvoice: null
   }
 }