Переглянути джерело

Merge branch 'master' of http://git.hghweb.ir/ali.s/palizvani-front-vite into production

HgH 2 роки тому
батько
коміт
f2fd5bf366

+ 15 - 0
src/api/models/Registration.js

@@ -9,6 +9,7 @@ export default class RegistrationAPI extends APIRepository {
       base: '/lma/registrations',
       exportReport: '/lma/registrations/export_report',
       classroomDetail: (registrationId) => '/lma/registrations/' + registrationId + '/classroom_detail',
+      revertDroppedForCondition: (registrationId) => '/lma/registrations/' + registrationId + '/revert_dropped_for_condition',
       byId: (id) => '/lma/registrations/' + id
     }
     this.CacheList = {
@@ -71,4 +72,18 @@ export default class RegistrationAPI extends APIRepository {
       }
     })
   }
+
+  revertDroppedForCondition(id) {
+    return this.sendRequest({
+      apiMethod: 'put',
+      api: this.api,
+      request: this.APIAdresses.revertDroppedForCondition(id),
+      resolveCallback: () => {
+        return null
+      },
+      rejectCallback: (error) => {
+        return error
+      }
+    })
+  }
 }

+ 4 - 5
src/components/Widgets/Classroom/AdminClassroomList/AdminClassroomList.vue

@@ -230,14 +230,13 @@ export default {
         if (col.name === 'title') {
           col.label = 'نام ' + this.classroomTypeTitle
         }
+        if (col.name === 'professor_info') {
+          col.label = (this.localOptions.classroomType === 'TRAINING') ? 'استاد مربوطه' : 'برگزار کننده'
+        }
       })
     },
     setActionBtn () {
-      this.inputs.forEach((item, index) => {
-        if (item.name === 'btn') {
-          this.inputs[index].atClick = this.search
-        }
-      })
+      FormBuilderAssist.setAttributeByName(this.inputs, 'btn', 'atClick', this.search)
     },
     search () {
       this.$refs.entityIndex.search()

+ 8 - 4
src/components/Widgets/Classroom/AdminClassroomShow/components/ClassroomInfo.vue

@@ -252,9 +252,10 @@ export default {
     },
     beforeLoadInputData (responseData, callback) {
       return new Promise((resolve, reject) => {
+        const selectedCategoryId = responseData.unit_info.category || null
         const promise1 = this.getProfessors()
         const promise2 = this.getCategories()
-        const promise3 = (this.classroomType === 'EVENT') ? this.getUnits(null, this.classroomType) : this.getUnits(responseData.unit_info.category)
+        const promise3 = this.getUnits(selectedCategoryId, this.classroomType)
         this.$nextTick(() => {
           Promise.all([promise1, promise2, promise3])
             .then(() => {
@@ -283,7 +284,10 @@ export default {
         .catch(() => {})
     },
     getCategories () {
-      return APIGateway.unitCategory.index({ per_page: 9999 })
+      return APIGateway.unitCategory.index({
+        type: this.classroomType,
+        per_page: 9999
+      })
         .then((categories) => {
           this.setInputAttr('category', 'options', categories.list.list.map(item => {
             return {
@@ -294,8 +298,8 @@ export default {
         })
         .catch(() => {})
     },
-    getUnits (selectedcategoryId = null, categoryType = null) {
-      return APIGateway.unit.index({ per_page: 9999, category: selectedcategoryId, category__type: categoryType })
+    getUnits (selectedCategoryId = null, categoryType = null) {
+      return APIGateway.unit.index({ per_page: 9999, category: selectedCategoryId, category__type: categoryType })
         .then((units) => {
           this.setInputAttr('unit', 'options', units.list.list.map(item => {
             return {

+ 1 - 0
src/components/Widgets/Classroom/AdminClassroomShow/components/LeaderList.vue

@@ -141,6 +141,7 @@ export default {
             { 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: 'role', value: 'team_leader' },
             { type: 'hidden', name: 'classroom_leaders__classroom__ne', value: classroomId }
           ],

+ 31 - 4
src/components/Widgets/Classroom/AdminClassroomShow/components/MembersList.vue

@@ -20,6 +20,16 @@
       <template v-if="inputData.col.name === 'number'">
         {{ inputData.rowNumber }}
       </template>
+      <template v-if="inputData.col.name === 'UserRegisterStatus'">
+        <q-btn v-if="inputData.col.value === 'DROPPED_FOR_CONDITION'"
+               color="primary"
+               class="q-mr-md"
+               :loading="revertDroppedForConditionLoading"
+               @click="revertDroppedForCondition(inputData.props.row.id)">
+          بازگرداندن ثبت نام
+        </q-btn>
+        {{ inputData.col.value }}
+      </template>
       <template v-else-if="inputData.col.name === 'action'">
         <div class="action-column-entity-index">
           <q-btn v-if="inputData.props.row.status !== 'DROPPED_BY_ADMIN' && inputData.props.row.status !== 'DROPPED_BY_ITSELF'"
@@ -54,8 +64,10 @@
 import { shallowRef } from 'vue'
 import { EntityIndex } from 'quasar-crud'
 import Assist from 'src/assets/js/Assist.js'
+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 BtnControl from 'src/components/Control/btn.vue'
 
@@ -83,8 +95,9 @@ export default {
       exportReportLoading: false,
       membersListInputs: [
         { type: 'hidden', name: 'classroom', value: classroomId },
-        { type: 'select', name: 'status', options: [{ label: 'ثبت نام شده', value: 'REGISTERED' }, { label: 'پیش ثبت نام شده', value: 'ENROLLED' }, { label: 'حذف توسط اندیشه جو', value: 'DROPPED_BY_ITSELF' }, { label: 'حذف توسط ادمین', value: 'DROPPED_BY_ADMIN' }], label: 'وضعیت', placeholder: ' ', col: 'col-md-3 col-12' },
-        { type: 'select', name: 'invoice__status', options: [{ label: 'پرداخت کامل', value: 'PAID_FULL' }, { label: 'پرداخت قسطی', value: 'PAYING_IN_INSTALMENT' }], label: 'نوع صورتحساب', placeholder: ' ', col: 'col-md-3 col-12' },
+        { type: 'input', name: 'owner__national_code', label: 'کد ملی', placeholder: ' ', col: 'col-md-3 col-12' },
+        { type: 'select', name: 'status', options: (new Registration()).statusEnums, label: 'وضعیت', placeholder: ' ', col: 'col-md-3 col-12' },
+        { type: 'select', name: 'invoice__status', options: (new Invoice()).statusEnums, label: 'نوع صورتحساب', placeholder: ' ', col: 'col-md-3 col-12' },
         { type: BtnControlComp, name: 'btn', label: 'جستجو', placeholder: ' ', atClick: () => {}, col: 'col-md-2 col-12' }
       ],
       membersListApi: APIGateway.classroom.APIAdresses.members,
@@ -133,7 +146,7 @@ export default {
             field: row => row.owner_info.email
           },
           {
-            name: 'owner_info.email',
+            name: 'UserRegisterStatus',
             required: true,
             label: 'وضعیت',
             align: 'left',
@@ -155,7 +168,9 @@ export default {
         currentPage: 'current',
         perPage: 'per_page',
         pageKey: 'page'
-      }
+      },
+
+      revertDroppedForConditionLoading: false
     }
   },
   mounted () {
@@ -163,6 +178,18 @@ export default {
     this.mounted = true
   },
   methods: {
+    revertDroppedForCondition (id) {
+      this.revertDroppedForConditionLoading = true
+      APIGateway.registration.revertDroppedForCondition(id)
+        .then(() => {
+          this.revertDroppedForConditionLoading = false
+          this.searchMembersList()
+        })
+        .catch(() => {
+          this.revertDroppedForConditionLoading = false
+          this.searchMembersList()
+        })
+    },
     setMembersListActionBtn () {
       FormBuilderAssist.setAttributeByName(this.membersListInputs, 'btn', 'atClick', this.searchMembersList)
     },

+ 62 - 2
src/components/Widgets/SessionAttendanceSheet/AdminSessionAttendanceSheetList/AdminSessionAttendanceSheetList.vue

@@ -52,7 +52,8 @@
                  :to="{name: 'Admin.Classroom.Session.AttendanceSheet.Attendance', params: {classroom_id: $route.params.classroom_id, session_id: $route.params.session_id, session_attendance_sheet_id: inputData.props.row.id}}">
             حضور و غیاب
           </q-btn>
-          <q-btn color="primary"
+          <q-btn v-if="localOptions.classroomType === 'TRAINING'"
+                 color="primary"
                  :outline="inputData.props.row.assignment_status !== 'NOT_SENT'"
                  :to="{name: 'Admin.Classroom.Session.AttendanceSheet.Assignment', params: {classroom_id: $route.params.classroom_id, session_id: $route.params.session_id, session_attendance_sheet_id: inputData.props.row.id}}">
             <template v-if="inputData.props.row.assignment_status !== 'NOT_SENT'">
@@ -110,6 +111,7 @@ export default {
       inputs: [
         { type: 'hidden', name: 'session', value: sessionId },
         { type: 'select', name: 'registration__status', label: 'وضعیت ثبت نام', placeholder: ' ', value: null, options: (new Registration()).statusEnums, col: 'col-md-3 col-12' },
+        { type: 'select', name: 'assignment_status', label: 'وضعیت انجام تکلیف', placeholder: ' ', value: null, options: (new SessionAttendanceSheets()).assignment_statusEnums, col: 'col-md-3 col-12' },
         { type: BtnControlComp, name: 'btn', responseKey: 'btn', label: 'جستجو', placeholder: ' ', atClick: () => {}, col: 'col-md-3 col-12' }
       ],
       uploadInputs: [
@@ -118,7 +120,7 @@ export default {
         { type: BtnControlComp, name: 'btn', responseKey: 'btn', label: 'ارسال', placeholder: ' ', atClick: () => {}, col: 'col-md-4 col-12' }
       ],
       uploadAPI: APIGateway.sessionAttendanceSheets.APIAdresses.importList,
-      table: {
+      tableForClassroom: {
         columns: [
           {
             name: 'number',
@@ -171,6 +173,55 @@ export default {
           }
         ]
       },
+      tableForEvent: {
+        columns: [
+          {
+            name: 'number',
+            required: true,
+            label: 'شماره',
+            align: 'left',
+            field: () => ''
+          },
+          {
+            name: 'id',
+            required: true,
+            label: 'شناسه',
+            align: 'left',
+            field: row => row.id
+          },
+          {
+            name: 'sender',
+            required: true,
+            label: 'نام و نام خانوادگی',
+            align: 'left',
+            field: row => row.owner_info.firstname + ' ' + row.owner_info.lastname
+          },
+          {
+            name: 'sender',
+            required: true,
+            label: 'کد ملی',
+            align: 'left',
+            field: row => row.owner_info.national_code
+          },
+          {
+            name: 'attendance_status',
+            required: true,
+            label: 'وضعیت حضور و غیاب',
+            align: 'left',
+            field: row => (new SessionAttendanceSheets(row)).attendance_status_info.label
+          },
+          {
+            name: 'action',
+            required: true,
+            label: 'عملیات',
+            align: 'left',
+            field: row => ''
+          }
+        ]
+      },
+      table: {
+        columns: []
+      },
       mounted: false,
       exportReportLoading: false,
       createRouteName: ''
@@ -183,6 +234,7 @@ export default {
     }
   },
   mounted() {
+    this.setClassroomTypeOfInputs()
     this.mounted = true
     this.setActionBtn()
     this.getClassroom()
@@ -191,6 +243,14 @@ export default {
       })
   },
   methods: {
+    setClassroomTypeOfInputs () {
+      if (this.localOptions.classroomType === 'TRAINING') {
+        this.table = this.tableForClassroom
+      }
+      if (this.localOptions.classroomType === 'EVENT') {
+        this.table = this.tableForEvent
+      }
+    },
     updateBreadcrumbs (classroom) {
       this.classroom = new Classroom(classroom)
       this.$store.commit('AppLayout/updateBreadcrumbs', {

+ 15 - 3
src/components/Widgets/Team/AdminTeamShow/AdminTeamShow.vue

@@ -70,6 +70,7 @@ import DeleteBtn from 'src/components/Control/DeleteBtn.vue'
 import { FormBuilder, inputMixin, FormBuilderAssist } from 'quasar-form-builder'
 import EntityInput from 'quasar-crud/src/components/Entity/Attachment/EntityInput.vue'
 import FormBuilderInputEditor from 'src/components/FormBuilderCustumComponents/FormBuilderInputEditor.vue'
+import { User } from 'src/models/User'
 
 const BtnControlComp = shallowRef(BtnControl)
 const EntityInputComp = shallowRef(EntityInput)
@@ -271,6 +272,8 @@ export default {
             ]
           },
           inputs: [
+            { type: 'input', name: 'search', value: null },
+            { type: 'hidden', name: 'status', value: 'REGISTERED' },
             { type: 'hidden', name: 'teams__isnull', value: true },
             { type: 'hidden', name: 'classroom', value: classroomId }
           ],
@@ -285,7 +288,12 @@ export default {
         }
       ],
       teamRegistrationListInputs: [
-        { type: 'hidden', name: 'team', value: teamId }
+        { type: 'hidden', name: 'team', value: teamId },
+        { type: 'select', name: 'owner__gender', value: null, options: (new User()).genderEnums, col: 'col-md-2 col-12', label: 'جنسیت', placeholder: ' ' },
+        { type: 'input', name: 'owner__living_province', value: null, col: 'col-md-2 col-12', label: 'استان', placeholder: ' ' },
+        { type: 'input', name: 'owner__living_city', value: null, col: 'col-md-2 col-12', label: 'شهر', placeholder: ' ' },
+        { type: 'input', name: 'search', value: null, col: 'col-md-2 col-12', label: 'جست و جو', placeholder: ' ' },
+        { type: BtnControlComp, name: 'btn', label: 'جستجو', placeholder: ' ', atClick: () => {}, col: 'col-md-2 col-12' }
       ],
       teamRegistrationListApi: APIGateway.teamRegistrations.APIAdresses.base,
       teamRegistrationListTable: {
@@ -364,7 +372,7 @@ export default {
       }
     }
   },
-  mounted() {
+  mounted () {
     this.setActionBtn()
     this.mounted = true
   },
@@ -374,7 +382,7 @@ export default {
       this.addNewLeaderLoading = true
       APIGateway.team.appendRegistrations({ teamId: this.$route.params.team_id, registrations })
         .then(() => {
-          this.$refs.teamRegistrationList.search()
+          this.search()
           this.addTeamRegistrationInputs[0].value = []
           this.addTeamRegistrationInputs[0].selected = []
           this.addTeamRegistrationKey = Date.now()
@@ -389,6 +397,10 @@ export default {
     },
     setActionBtn () {
       FormBuilderAssist.setAttributeByName(this.inputs, 'btn', 'atClick', this.edit)
+      FormBuilderAssist.setAttributeByName(this.teamRegistrationListInputs, 'btn', 'atClick', this.search)
+    },
+    search () {
+      this.$refs.teamRegistrationList.search()
     },
     afterLoadInputData (responseData) {
       this.team = new Team(responseData)

+ 210 - 25
src/components/Widgets/Team/LeaderTeamShow/LeaderTeamShow.vue

@@ -27,30 +27,101 @@
 
     <q-separator class="q-my-lg" />
 
-    <entity-index v-if="mounted"
-                  ref="teamRegistrationList"
-                  v-model:value="teamRegistrationListInputs"
-                  title="لیست اعضای گروه"
-                  :api="teamRegistrationListApi"
-                  :table="teamRegistrationListTable"
-                  :table-keys="teamRegistrationListTableKeys"
-                  :show-search-button="false"
-                  :show-reload-button="false"
-                  :show-expand-button="false">
-      <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 === 'actions'">
-          <div class="action-column-entity-index">
-            <!--            <delete-btn @click="showConfirmRemoveDialog(inputData.props.row, 'id', getRemoveMessage(inputData.props.row))" />-->
-          </div>
-        </template>
-        <template v-else>
-          {{ inputData.col.value }}
-        </template>
-      </template>
-    </entity-index>
+    <q-tabs v-model="tab"
+            dense
+            class="text-grey"
+            active-color="primary"
+            indicator-color="primary"
+            align="start">
+      <q-tab name="teamRegistrationList"
+             label="لیست اعضای گروه" />
+      <q-tab name="sessionList"
+             label="لیست جلسات" />
+    </q-tabs>
+    <q-tab-panels v-model="tab"
+                  animated>
+      <q-tab-panel name="teamRegistrationList"
+                   class="q-pa-none">
+        <entity-index v-if="mounted"
+                      ref="teamRegistrationList"
+                      v-model:value="teamRegistrationListInputs"
+                      title="لیست اعضای گروه"
+                      :api="teamRegistrationListApi"
+                      :table="teamRegistrationListTable"
+                      :table-keys="teamRegistrationListTableKeys"
+                      :show-search-button="false"
+                      :show-reload-button="false"
+                      :show-expand-button="false">
+          <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 === 'actions'">
+              <div class="action-column-entity-index">
+                <!--            <delete-btn @click="showConfirmRemoveDialog(inputData.props.row, 'id', getRemoveMessage(inputData.props.row))" />-->
+              </div>
+            </template>
+            <template v-else>
+              {{ inputData.col.value }}
+            </template>
+          </template>
+        </entity-index>
+      </q-tab-panel>
+
+      <q-tab-panel name="sessionList"
+                   class="q-pa-none">
+        <entity-index v-if="mounted && entityLoaded"
+                      ref="sessionsList"
+                      v-model:value="sessionsListInputs"
+                      title="لیست جلسات"
+                      :api="sessionsListApi"
+                      :table="sessionsListTable"
+                      :table-keys="sessionsListTableKeys"
+                      :show-search-button="false"
+                      :show-reload-button="false"
+                      :show-expand-button="false">
+          <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 === 'actions'">
+              <div class="action-column-entity-index">
+                <q-btn color="primary"
+                       label="مشاهده حضور و غیاب"
+                       @click="showSessionSheetsDialog(inputData.props.row.id)" />
+                <!--            <delete-btn @click="showConfirmRemoveDialog(inputData.props.row, 'id', getRemoveMessage(inputData.props.row))" />-->
+              </div>
+            </template>
+            <template v-else>
+              {{ inputData.col.value }}
+            </template>
+          </template>
+        </entity-index>
+
+        <q-dialog v-model="sessionSheetsDialog">
+          <entity-index v-if="mounted && entityLoaded"
+                        ref="sessionAttendanceSheetList"
+                        v-model:value="sessionAttendanceSheetListInputs"
+                        style="width: 1024px; max-width: 90%;"
+                        title="لیست حضور وغیاب"
+                        :api="sessionAttendanceSheetListApi"
+                        :table="sessionAttendanceSheetListTable"
+                        :table-keys="sessionAttendanceSheetListTableKeys"
+                        :show-search-button="false"
+                        :show-reload-button="false"
+                        :show-expand-button="false">
+            <template v-slot:entity-index-table-cell="{inputData}">
+              <template v-if="inputData.col.name === 'number'">
+                {{ inputData.rowNumber }}
+              </template>
+              <template v-else>
+                {{ inputData.col.value }}
+              </template>
+            </template>
+          </entity-index>
+        </q-dialog>
+      </q-tab-panel>
+    </q-tab-panels>
   </div>
 </template>
 
@@ -58,6 +129,8 @@
 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 { SessionAttendanceSheets } from 'src/models/SessionAttendanceSheets'
 
 export default {
   name: 'LeaderTeamShow',
@@ -69,7 +142,9 @@ export default {
   data () {
     const teamId = this.$route.params.team_id
     return {
+      tab: 'teamRegistrationList',
       mounted: false,
+      entityLoaded: false,
       entityLoading: true,
       api: APIGateway.team.APIAdresses.byId(teamId),
       entityIdKey: 'id',
@@ -159,6 +234,110 @@ export default {
         currentPage: 'current',
         perPage: 'per_page',
         pageKey: 'page'
+      },
+
+      sessionsListInputs: [
+        { type: 'hidden', name: 'classroom', value: null }
+      ],
+      sessionsListApi: APIGateway.session.APIAdresses.base,
+      sessionsListTable: {
+        columns: [
+          {
+            name: 'number',
+            required: true,
+            label: 'شماره',
+            align: 'left',
+            field: () => ''
+          },
+          {
+            name: 'id',
+            required: true,
+            label: 'شناسه',
+            align: 'left',
+            field: row => row.id
+          },
+          {
+            name: 'title',
+            required: true,
+            label: 'عنوان',
+            align: 'left',
+            field: row => row.title
+          },
+          {
+            name: 'actions',
+            required: true,
+            label: 'عملیات',
+            align: 'left',
+            field: ''
+          }
+        ]
+      },
+      sessionsListTableKeys: {
+        data: 'results',
+        total: 'count',
+        currentPage: 'current',
+        perPage: 'per_page',
+        pageKey: 'page'
+      },
+
+      sessionSheetsDialog: false,
+      sessionAttendanceSheetListInputs: [
+        { type: 'hidden', name: 'session', value: null },
+        { type: 'hidden', name: 'registration__teams__id', value: teamId }
+      ],
+      sessionAttendanceSheetListApi: APIGateway.sessionAttendanceSheets.APIAdresses.sessionSheets,
+      sessionAttendanceSheetListTable: {
+        columns: [
+          {
+            name: 'number',
+            required: true,
+            label: 'شماره',
+            align: 'left',
+            field: () => ''
+          },
+          {
+            name: 'id',
+            required: true,
+            label: 'شناسه',
+            align: 'left',
+            field: row => row.id
+          },
+          {
+            name: 'sender',
+            required: true,
+            label: 'نام و نام خانوادگی',
+            align: 'left',
+            field: row => row.owner_info.firstname + ' ' + row.owner_info.lastname
+          },
+          {
+            name: 'sender',
+            required: true,
+            label: 'کد ملی',
+            align: 'left',
+            field: row => row.owner_info.national_code
+          },
+          {
+            name: 'assignment_status',
+            required: true,
+            label: 'وضعیت تکلیف',
+            align: 'left',
+            field: row => (new SessionAttendanceSheets(row)).assignment_status_info.label
+          },
+          {
+            name: 'attendance_status',
+            required: true,
+            label: 'وضعیت حضور و غیاب',
+            align: 'left',
+            field: row => (new SessionAttendanceSheets(row)).attendance_status_info.label
+          }
+        ]
+      },
+      sessionAttendanceSheetListTableKeys: {
+        data: 'results',
+        total: 'count',
+        currentPage: 'current',
+        perPage: 'per_page',
+        pageKey: 'page'
       }
     }
   },
@@ -178,9 +357,15 @@ export default {
           this.addNewLeaderLoading = false
         })
     },
-    afterLoadInputData () {
+    afterLoadInputData (responseData) {
+      FormBuilderAssist.setAttributeByName(this.sessionsListInputs, 'classroom', 'value', responseData.classroom)
+      this.entityLoaded = true
       this.entityLoading = false
     },
+    showSessionSheetsDialog (sessionId) {
+      FormBuilderAssist.setAttributeByName(this.sessionAttendanceSheetListInputs, 'session', 'value', sessionId)
+      this.sessionSheetsDialog = true
+    },
     getRemoveMessage (row) {
       return 'آیا از حذف ' + row.registration_info.owner_info.firstname + ' ' + row.registration_info.owner_info.lastname + ' اطمینان دارید؟'
     }

+ 1 - 0
src/pages/Admin/Classroom/project/members.vue

@@ -72,6 +72,7 @@ export default {
       inputs: [
         { type: 'hidden', name: 'project', value: projectId },
         { type: 'select', name: 'registration__status', label: 'وضعیت ثبت نام', placeholder: ' ', value: null, options: (new Registration()).statusEnums, col: 'col-md-3 col-12' },
+        { type: 'select', name: 'answer_status', label: 'وضعیت انجام پروژه', placeholder: ' ', value: null, options: (new ProjectAttendanceSheets()).answer_statusEnums, col: 'col-md-3 col-12' },
         { type: BtnControlComp, name: 'btn', responseKey: 'btn', label: 'جستجو', placeholder: ' ', atClick: () => {}, col: 'col-md-3 col-12' }
       ],
       api: APIGateway.projectAttendanceSheets.APIAdresses.project_sheets,