Przeglądaj źródła

fix
http://git.hghweb.ir/ali.s/palizvani-front-vite/issues/484

hgh 1 rok temu
rodzic
commit
5b53913e86

+ 38 - 0
src/api/models/Classroom.js

@@ -13,9 +13,11 @@ export default class ClassroomAPI extends APIRepository {
       byId: (id) => '/lma/classrooms/' + id,
       toggleOngoingStatus: (id) => '/lma/classrooms/' + id + '/toggle_ongoing_status',
       enroll: (id) => '/lma/classrooms/' + id + '/enroll',
+      bulkEnroll: (id) => '/lma/classrooms/' + id + '/bulk_enroll',
       graders: (id) => '/lma/classrooms/' + id + '/graders',
       drop: (id) => '/lma/classrooms/' + id + '/drop',
       register: (id) => '/lma/classrooms/' + id + '/register',
+      bulkRegister: (id) => '/lma/classrooms/' + id + '/bulk_register',
       leaders: (id) => '/lma/classrooms/' + id + '/leaders',
       announceResult: (id) => '/lma/classrooms/' + id + '/announce_result',
       getClassroomAndCorrespondingRegistration: (classroomId, ownerId) => '/lma/classrooms/' + classroomId + '/get_classroom_and_corresponding_registration/' + ownerId,
@@ -250,6 +252,42 @@ export default class ClassroomAPI extends APIRepository {
     })
   }
 
+  registerNewMembers (data) {
+    return this.sendRequest({
+      apiMethod: 'put',
+      api: this.api,
+      request: this.APIAdresses.bulkRegister(data.classroomId),
+      data: {
+        classroomId: data.classroomId,
+        owners: data.owners
+      },
+      resolveCallback: (response) => {
+        return new ClassroomList(response.data)
+      },
+      rejectCallback: (error) => {
+        return error
+      }
+    })
+  }
+
+  enrollNewMembers (data) {
+    return this.sendRequest({
+      apiMethod: 'put',
+      api: this.api,
+      request: this.APIAdresses.bulkEnroll(data.classroomId),
+      data: {
+        classroomId: data.classroomId,
+        owners: data.owners
+      },
+      resolveCallback: (response) => {
+        return new ClassroomList(response.data)
+      },
+      rejectCallback: (error) => {
+        return error
+      }
+    })
+  }
+
   createInvoiceByAdmin (classroomId, userId) {
     return this.sendRequest({
       apiMethod: 'put',

+ 3 - 1
src/api/models/User.js

@@ -14,7 +14,9 @@ export default class UserAPI extends APIRepository {
       byId: (id) => '/uma/users/' + id,
       changeRole: (id) => '/uma/users/' + id + '/change_role',
       unassignedGradersWithLastPassedUnit: '/uma/users/unassigned_graders_with_last_passed_unit',
-      unassignedLeadersWithLastPassedUnit: '/uma/users/unassigned_leaders_with_last_passed_unit'
+      unassignedLeadersWithLastPassedUnit: '/uma/users/unassigned_leaders_with_last_passed_unit',
+      unenrolledUsersInClassroom: '/uma/users/unenrolled_users_in_classroom',
+      unregisteredUsersInClassroom: '/uma/users/unregistered_users_in_classroom'
     }
     this.CacheList = {
       base: this.name + this.APIAdresses.base,

+ 254 - 2
src/components/Widgets/Classroom/AdminClassroomShow/components/MembersList.vue

@@ -16,6 +16,14 @@
         خروجی اکسل
       </q-btn>
     </template>
+    <template #before-index-table>
+      <form-builder ref="formBuilder"
+                    v-model:value="enrollNewMembersInputs"
+                    :loading="enrollNewMembersLoading" />
+      <form-builder ref="formBuilder"
+                    v-model:value="registerNewMembersInputs"
+                    :loading="registerNewMembersLoading" />
+    </template>
     <template v-slot:entity-index-table-cell="{inputData}">
       <template v-if="inputData.col.name === 'number'">
         {{ inputData.rowNumber }}
@@ -72,15 +80,18 @@ import { Invoice } from 'src/models/Invoice.js'
 import { APIGateway } from 'src/api/APIGateway.js'
 import { Classroom } from 'src/models/Classroom.js'
 import { Registration } from 'src/models/Registration.js'
-import { FormBuilderAssist } from 'quasar-form-builder'
+import { FormBuilder, FormBuilderAssist } from 'quasar-form-builder'
+import EntityInput from 'quasar-crud/src/components/Entity/Attachment/EntityInput.vue'
 import BtnControl from 'src/components/Control/btn.vue'
 
+const EntityInputComp = shallowRef(EntityInput)
 const BtnControlComp = shallowRef(BtnControl)
 
 export default {
   name: 'MembersList',
   components: {
-    EntityIndex
+    EntityIndex,
+    FormBuilder
   },
   props: {
     classroomId: {
@@ -92,6 +103,216 @@ export default {
     const classroomId = this.classroomId
     return {
       mounted: false,
+      enrollNewMembersLoading: false,
+
+      enrollNewMembersInputs: [
+        {
+          type: EntityInputComp,
+          name: 'enrollNewMembers',
+          selectionMode: 'multiple',
+          popUpButtonConfig: {
+            label: 'پیش ثبت نام مستقیم',
+            outline: true,
+            buttonColor: 'deep-purple',
+            buttonTextColor: 'white',
+            buttonBadgeColor: 'pink'
+          },
+          dialogConfirmButtonConfig: {
+            label: 'تایید',
+            buttonColor: 'deep-purple',
+            buttonTextColor: 'white',
+            buttonBadgeColor: 'pink'
+          },
+
+          apiAddress: APIGateway.user.APIAdresses.unenrolledUsersInClassroom,
+          tableTitle: 'لیست کل کاربران پیش ثبت نام نشده',
+          showTableItemsRouteName: 'Admin.BlockManagement.Show',
+          tableKeys: {
+            data: 'results',
+            total: 'count',
+            currentPage: 'current',
+            perPage: 'per_page',
+            pageKey: 'page'
+          },
+          table: {
+            columns: [
+              {
+                name: 'id',
+                required: true,
+                label: 'شناسه',
+                align: 'left',
+                field: row => row.id
+              },
+              {
+                name: 'fullname',
+                required: true,
+                label: 'نام و نام خانوادگی',
+                align: 'left',
+                field: row => row.firstname + ' ' + row.lastname
+              },
+              {
+                name: 'last_passed_unit_title',
+                required: true,
+                label: 'آخرین دوره',
+                align: 'left',
+                field: row => row.last_passed_unit_title
+              },
+              {
+                name: 'national_code',
+                required: true,
+                label: 'کد ملی',
+                align: 'left',
+                field: row => row.national_code
+              },
+              {
+                name: 'mobile_number',
+                required: true,
+                label: 'شماره همراه',
+                align: 'left',
+                field: row => row.mobile_number
+              },
+              {
+                name: 'last_academy_name',
+                required: true,
+                label: 'دانشگاه',
+                align: 'left',
+                field: row => row.last_academy_name
+              },
+              {
+                name: 'living_city',
+                required: true,
+                label: 'شهر',
+                align: 'left',
+                field: row => row.living_city
+              }
+            ]
+          },
+          inputs: [
+            { type: 'input', name: 'id', value: null, label: 'شناسه', placeholder: ' ', col: 'col-md-4 col-12' },
+            { type: 'input', name: 'national_code', value: null, label: 'کد ملی', placeholder: ' ', col: 'col-md-4 col-12' },
+            { type: 'input', name: 'mobile_number', value: null, label: 'شماره همراه', placeholder: ' ', col: 'col-md-4 col-12' },
+            { type: 'input', name: 'email', value: null, label: 'ایمیل', placeholder: ' ', col: 'col-md-3 col-12' },
+            { type: 'input', name: 'firstname', value: null, label: 'نام', placeholder: ' ', col: 'col-md-3 col-12' },
+            { type: 'input', name: 'lastname', value: null, label: 'نام خانوادگی', placeholder: ' ', col: 'col-md-3 col-12' },
+            { type: 'input', name: 'search', value: null, label: 'جست و جو', placeholder: ' ', col: 'col-md-3 col-12' },
+            { type: 'hidden', name: 'registered_classes__classroom__ne', value: classroomId }
+          ],
+          itemIndicatorKey: row => row.firstname + ' ' + row.lastname,
+          // itemIndicatorKey: 'firstname',
+          itemIdentifyKey: 'id',
+          onConfirmed: this.onEnrollNewMembersConfirmedSelected,
+
+          value: [],
+          selected: [],
+          col: 'col-md-12 col-12'
+        }
+      ],
+
+      registerNewMembersLoading: false,
+
+      registerNewMembersInputs: [
+        {
+          type: EntityInputComp,
+          name: 'registerNewMembers',
+          selectionMode: 'multiple',
+          popUpButtonConfig: {
+            label: 'ثبت نام مستقیم',
+            outline: true,
+            buttonColor: 'deep-purple',
+            buttonTextColor: 'white',
+            buttonBadgeColor: 'pink'
+          },
+          dialogConfirmButtonConfig: {
+            label: 'تایید',
+            buttonColor: 'deep-purple',
+            buttonTextColor: 'white',
+            buttonBadgeColor: 'pink'
+          },
+
+          apiAddress: APIGateway.user.APIAdresses.unregisteredUsersInClassroom,
+          tableTitle: 'لیست کل کاربران ثبت نام نشده',
+          showTableItemsRouteName: 'Admin.BlockManagement.Show',
+          tableKeys: {
+            data: 'results',
+            total: 'count',
+            currentPage: 'current',
+            perPage: 'per_page',
+            pageKey: 'page'
+          },
+          table: {
+            columns: [
+              {
+                name: 'id',
+                required: true,
+                label: 'شناسه',
+                align: 'left',
+                field: row => row.id
+              },
+              {
+                name: 'fullname',
+                required: true,
+                label: 'نام و نام خانوادگی',
+                align: 'left',
+                field: row => row.firstname + ' ' + row.lastname
+              },
+              {
+                name: 'last_passed_unit_title',
+                required: true,
+                label: 'آخرین دوره',
+                align: 'left',
+                field: row => row.last_passed_unit_title
+              },
+              {
+                name: 'national_code',
+                required: true,
+                label: 'کد ملی',
+                align: 'left',
+                field: row => row.national_code
+              },
+              {
+                name: 'mobile_number',
+                required: true,
+                label: 'شماره همراه',
+                align: 'left',
+                field: row => row.mobile_number
+              },
+              {
+                name: 'last_academy_name',
+                required: true,
+                label: 'دانشگاه',
+                align: 'left',
+                field: row => row.last_academy_name
+              },
+              {
+                name: 'living_city',
+                required: true,
+                label: 'شهر',
+                align: 'left',
+                field: row => row.living_city
+              }
+            ]
+          },
+          inputs: [
+            { type: 'input', name: 'id', value: null, label: 'شناسه', placeholder: ' ', col: 'col-md-4 col-12' },
+            { type: 'input', name: 'national_code', value: null, label: 'کد ملی', placeholder: ' ', col: 'col-md-4 col-12' },
+            { type: 'input', name: 'mobile_number', value: null, label: 'شماره همراه', placeholder: ' ', col: 'col-md-4 col-12' },
+            { type: 'input', name: 'email', value: null, label: 'ایمیل', placeholder: ' ', col: 'col-md-3 col-12' },
+            { type: 'input', name: 'firstname', value: null, label: 'نام', placeholder: ' ', col: 'col-md-3 col-12' },
+            { type: 'input', name: 'lastname', value: null, label: 'نام خانوادگی', placeholder: ' ', col: 'col-md-3 col-12' },
+            { type: 'input', name: 'search', value: null, label: 'جست و جو', placeholder: ' ', col: 'col-md-3 col-12' },
+            { type: 'hidden', name: 'registered_classes__classroom__ne', value: classroomId }
+          ],
+          itemIndicatorKey: row => row.firstname + ' ' + row.lastname,
+          // itemIndicatorKey: 'firstname',
+          itemIdentifyKey: 'id',
+          onConfirmed: this.onRegisterNewMembersConfirmedSelected,
+
+          value: [],
+          selected: [],
+          col: 'col-md-12 col-12'
+        }
+      ],
+
       createInvoiceLoading: false,
       classroom: new Classroom(),
 
@@ -220,6 +441,30 @@ export default {
           this.exportReportLoading = false
         })
     },
+    onRegisterNewMembersConfirmedSelected (data) {
+      const owners = data.map(item => item.id)
+      this.registerNewMembersLoading = true
+      APIGateway.classroom.registerNewMembers({ classroomId: this.classroomId, owners })
+        .then(() => {
+          this.$refs.membersList.search()
+          this.registerNewMembersLoading = false
+        })
+        .catch(() => {
+          this.registerNewMembersLoading = false
+        })
+    },
+    onEnrollNewMembersConfirmedSelected (data) {
+      const owners = data.map(item => item.id)
+      this.enrollNewMembersLoading = true
+      APIGateway.classroom.enrollNewMembers({ classroomId: this.classroomId, owners })
+        .then(() => {
+          this.$refs.membersList.search()
+          this.enrollNewMembersLoading = false
+        })
+        .catch(() => {
+          this.enrollNewMembersLoading = false
+        })
+    },
     dropClassroomByAdmin (row) {
       const classroomId = row.classroom
       const userId = row.owner
@@ -258,3 +503,10 @@ export default {
   }
 }
 </script>
+<style lang="scss">
+.before-index-table {
+  margin: 8px;
+  display: flex;
+  justify-content: flex-end;
+}
+</style>