|
|
@@ -16,6 +16,22 @@
|
|
|
خروجی اکسل
|
|
|
</q-btn>
|
|
|
</template>
|
|
|
+ <template #before-index-table>
|
|
|
+ <div class="row before-index-table">
|
|
|
+ <div class="right-side">
|
|
|
+ <form-builder ref="formBuilder"
|
|
|
+ :key="enrollNewMembersInputsKey"
|
|
|
+ v-model:value="enrollNewMembersInputs"
|
|
|
+ :loading="enrollNewMembersLoading" />
|
|
|
+ </div>
|
|
|
+ <div class="left-side">
|
|
|
+ <form-builder ref="formBuilder"
|
|
|
+ :key="registerNewMembersInputsKey"
|
|
|
+ v-model:value="registerNewMembersInputs"
|
|
|
+ :loading="registerNewMembersLoading" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
<template v-slot:entity-index-table-cell="{inputData}">
|
|
|
<template v-if="inputData.col.name === 'number'">
|
|
|
{{ inputData.rowNumber }}
|
|
|
@@ -72,26 +88,230 @@ 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: {
|
|
|
type: Number,
|
|
|
default: null
|
|
|
+ },
|
|
|
+ classroomTitle: {
|
|
|
+ type: String,
|
|
|
+ default: null
|
|
|
}
|
|
|
},
|
|
|
data () {
|
|
|
const classroomId = this.classroomId
|
|
|
return {
|
|
|
mounted: false,
|
|
|
+
|
|
|
+ enrollNewMembersLoading: false,
|
|
|
+ enrollNewMembersInputsKey: Date.now(),
|
|
|
+ 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: '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,
|
|
|
+ registerNewMembersInputsKey: Date.now(),
|
|
|
+ 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: '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(),
|
|
|
|
|
|
@@ -203,19 +423,53 @@ export default {
|
|
|
getMembersExcel () {
|
|
|
this.exportReportLoading = true
|
|
|
const status = FormBuilderAssist.getInputsByName(this.membersListInputs, 'status').value ? FormBuilderAssist.getInputsByName(this.membersListInputs, 'status').value : null
|
|
|
+ const ownerNationalCode = FormBuilderAssist.getInputsByName(this.membersListInputs, 'owner__national_code').value ? FormBuilderAssist.getInputsByName(this.membersListInputs, 'owner__national_code').value : null
|
|
|
+ const invoiceStatus = FormBuilderAssist.getInputsByName(this.membersListInputs, 'invoice__status').value ? FormBuilderAssist.getInputsByName(this.membersListInputs, 'invoice__status').value : null
|
|
|
APIGateway.registration.exportReport({
|
|
|
classroom: this.$route.params.id,
|
|
|
type: 'users',
|
|
|
+ invoice__status: invoiceStatus,
|
|
|
+ owner__national_code: ownerNationalCode,
|
|
|
status
|
|
|
})
|
|
|
.then((xlsxData) => {
|
|
|
- Assist.saveXlsx(xlsxData, this.classroom.title)
|
|
|
+ Assist.saveXlsx(xlsxData, `اندیشه جویان ${this.classroomTitle}`)
|
|
|
this.exportReportLoading = false
|
|
|
})
|
|
|
.catch((e) => {
|
|
|
this.exportReportLoading = false
|
|
|
})
|
|
|
},
|
|
|
+ onRegisterNewMembersConfirmedSelected (data) {
|
|
|
+ const owners = data.map(item => item.id)
|
|
|
+ this.registerNewMembersLoading = true
|
|
|
+ APIGateway.classroom.registerNewMembers({ classroomId: this.classroomId, owners })
|
|
|
+ .then(() => {
|
|
|
+ this.registerNewMembersInputs.value = [] // does not work!
|
|
|
+ this.registerNewMembersInputs.selected = [] // does not work!
|
|
|
+ this.registerNewMembersInputsKey = Date.now()
|
|
|
+ this.registerNewMembersLoading = false
|
|
|
+ this.$refs.membersList.search()
|
|
|
+ })
|
|
|
+ .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.enrollNewMembersInputs.value = [] // does not work!
|
|
|
+ this.enrollNewMembersInputs.selected = [] // does not work!
|
|
|
+ this.enrollNewMembersInputsKey = Date.now()
|
|
|
+ this.enrollNewMembersLoading = false
|
|
|
+ this.$refs.membersList.search()
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ this.enrollNewMembersLoading = false
|
|
|
+ })
|
|
|
+ },
|
|
|
dropClassroomByAdmin (row) {
|
|
|
const classroomId = row.classroom
|
|
|
const userId = row.owner
|
|
|
@@ -254,3 +508,18 @@ export default {
|
|
|
}
|
|
|
}
|
|
|
</script>
|
|
|
+<style lang="scss">
|
|
|
+.before-index-table {
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-end;
|
|
|
+ margin-right: 8px;
|
|
|
+ margin-bottom: 8px;
|
|
|
+}
|
|
|
+.right-side {
|
|
|
+ margin-right: 4px;
|
|
|
+}
|
|
|
+
|
|
|
+.left-side {
|
|
|
+
|
|
|
+}
|
|
|
+</style>
|