LeaderTeamShow.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603
  1. <template>
  2. <div class="LeaderTeamShow"
  3. :style="localOptions.style">
  4. <div class="flex justify-end">
  5. <q-btn flat
  6. color="grey"
  7. @click="$router.go(-1)">
  8. بازگشت
  9. >
  10. </q-btn>
  11. </div>
  12. <entity-show v-if="mounted"
  13. ref="entityShow"
  14. v-model:value="inputs"
  15. title="اطلاعات گروه"
  16. :api="api"
  17. :entity-id-key="entityIdKey"
  18. :entity-param-key="entityParamKey"
  19. :show-close-button="false"
  20. :show-edit-button="false"
  21. :show-expand-button="false"
  22. :show-save-button="false"
  23. :show-reload-button="false"
  24. :redirect-after-edit="false"
  25. :show-index-button="false"
  26. :after-load-input-data="afterLoadInputData" />
  27. <q-separator class="q-my-lg" />
  28. <q-tabs v-model="tab"
  29. class="text-grey bg-white"
  30. active-color="primary"
  31. indicator-color="primary"
  32. align="left">
  33. <q-tab name="teamRegistrationList"
  34. label="لیست اعضای گروه" />
  35. <q-tab name="sessionList"
  36. label="لیست جلسات" />
  37. <q-tab name="answer_books"
  38. label="پاسخ نامه ها" />
  39. <q-tab name="transcript_sheets"
  40. label="کارنامه ها" />
  41. </q-tabs>
  42. <q-separator />
  43. <q-tab-panels v-if="mounted && entityLoaded"
  44. v-model="tab"
  45. animated>
  46. <q-tab-panel name="teamRegistrationList"
  47. class="q-pa-none">
  48. <entity-index ref="teamRegistrationList"
  49. v-model:value="teamRegistrationListInputs"
  50. title="لیست اعضای گروه"
  51. :api="teamRegistrationListApi"
  52. :table="teamRegistrationListTable"
  53. :table-keys="teamRegistrationListTableKeys"
  54. :show-search-button="false"
  55. :show-reload-button="false"
  56. :show-expand-button="false">
  57. <template v-slot:entity-index-table-cell="{inputData}">
  58. <template v-if="inputData.col.name === 'number'">
  59. {{ inputData.rowNumber }}
  60. </template>
  61. <template v-else-if="inputData.col.name === 'actions'">
  62. <div class="action-column-entity-index">
  63. <!-- <delete-btn @click="showConfirmRemoveDialog(inputData.props.row, 'id', getRemoveMessage(inputData.props.row))" />-->
  64. </div>
  65. </template>
  66. <template v-else>
  67. {{ inputData.col.value }}
  68. </template>
  69. </template>
  70. </entity-index>
  71. </q-tab-panel>
  72. <q-tab-panel name="sessionList"
  73. class="q-pa-none">
  74. <entity-index ref="sessionsList"
  75. v-model:value="sessionsListInputs"
  76. title="لیست جلسات"
  77. :api="sessionsListApi"
  78. :table="sessionsListTable"
  79. :table-keys="sessionsListTableKeys"
  80. :show-search-button="false"
  81. :show-reload-button="false"
  82. :show-expand-button="false">
  83. <template v-slot:entity-index-table-cell="{inputData}">
  84. <template v-if="inputData.col.name === 'number'">
  85. {{ inputData.rowNumber }}
  86. </template>
  87. <template v-else-if="inputData.col.name === 'actions'">
  88. <div class="action-column-entity-index">
  89. <q-btn color="primary"
  90. label="مشاهده حضور و غیاب"
  91. @click="showSessionSheetsDialog(inputData.props.row.id)" />
  92. <!-- <delete-btn @click="showConfirmRemoveDialog(inputData.props.row, 'id', getRemoveMessage(inputData.props.row))" />-->
  93. </div>
  94. </template>
  95. <template v-else>
  96. {{ inputData.col.value }}
  97. </template>
  98. </template>
  99. </entity-index>
  100. <q-dialog v-model="sessionSheetsDialog">
  101. <entity-index v-if="mounted && entityLoaded"
  102. ref="sessionAttendanceSheetList"
  103. v-model:value="sessionAttendanceSheetListInputs"
  104. style="width: 1024px; max-width: 90%;"
  105. title="لیست حضور وغیاب"
  106. :api="sessionAttendanceSheetListApi"
  107. :table="sessionAttendanceSheetListTable"
  108. :table-keys="sessionAttendanceSheetListTableKeys"
  109. :show-search-button="false"
  110. :show-reload-button="false"
  111. :show-expand-button="false">
  112. <template v-slot:entity-index-table-cell="{inputData}">
  113. <template v-if="inputData.col.name === 'number'">
  114. {{ inputData.rowNumber }}
  115. </template>
  116. <template v-else>
  117. {{ inputData.col.value }}
  118. </template>
  119. </template>
  120. </entity-index>
  121. </q-dialog>
  122. </q-tab-panel>
  123. <q-tab-panel name="answer_books"
  124. class="q-pa-none">
  125. <entity-index ref="answerBooksList"
  126. v-model:value="answerBooksListInputs"
  127. title="لیست جلسات"
  128. :api="answerBooksListApi"
  129. :table="answerBooksListTable"
  130. :table-keys="answerBooksListTableKeys"
  131. :show-search-button="false"
  132. :show-reload-button="false"
  133. :show-expand-button="false">
  134. <template v-slot:entity-index-table-cell="{inputData}">
  135. <template v-if="inputData.col.name === 'number'">
  136. {{ inputData.rowNumber }}
  137. </template>
  138. <template v-else-if="inputData.col.name === 'actions'">
  139. <div class="action-column-entity-index">
  140. <q-btn color="primary"
  141. label="مشاهده حضور و غیاب"
  142. @click="showSessionSheetsDialog(inputData.props.row.id)" />
  143. <!-- <delete-btn @click="showConfirmRemoveDialog(inputData.props.row, 'id', getRemoveMessage(inputData.props.row))" />-->
  144. </div>
  145. </template>
  146. <template v-else>
  147. {{ inputData.col.value }}
  148. </template>
  149. </template>
  150. </entity-index>
  151. <q-dialog v-model="sessionSheetsDialog">
  152. <entity-index v-if="mounted && entityLoaded"
  153. ref="sessionAttendanceSheetList"
  154. v-model:value="sessionAttendanceSheetListInputs"
  155. style="width: 1024px; max-width: 90%;"
  156. title="لیست حضور وغیاب"
  157. :api="sessionAttendanceSheetListApi"
  158. :table="sessionAttendanceSheetListTable"
  159. :table-keys="sessionAttendanceSheetListTableKeys"
  160. :show-search-button="false"
  161. :show-reload-button="false"
  162. :show-expand-button="false">
  163. <template v-slot:entity-index-table-cell="{inputData}">
  164. <template v-if="inputData.col.name === 'number'">
  165. {{ inputData.rowNumber }}
  166. </template>
  167. <template v-else>
  168. {{ inputData.col.value }}
  169. </template>
  170. </template>
  171. </entity-index>
  172. </q-dialog>
  173. </q-tab-panel>
  174. <q-tab-panel name="transcript_sheets"
  175. class="q-pa-none">
  176. <entity-index ref="transcriptSheetsList"
  177. v-model:value="transcriptSheetsListInputs"
  178. title="لیست جلسات"
  179. :api="transcriptSheetsListApi"
  180. :table="transcriptSheetsListTable"
  181. :table-keys="transcriptSheetsListTableKeys"
  182. :show-search-button="false"
  183. :show-reload-button="false"
  184. :show-expand-button="false">
  185. <template v-slot:entity-index-table-cell="{inputData}">
  186. <template v-if="inputData.col.name === 'number'">
  187. {{ inputData.rowNumber }}
  188. </template>
  189. <template v-else-if="inputData.col.name === 'actions'">
  190. <div class="action-column-entity-index">
  191. <q-btn color="primary"
  192. label="مشاهده حضور و غیاب"
  193. @click="showSessionSheetsDialog(inputData.props.row.id)" />
  194. <!-- <delete-btn @click="showConfirmRemoveDialog(inputData.props.row, 'id', getRemoveMessage(inputData.props.row))" />-->
  195. </div>
  196. </template>
  197. <template v-else>
  198. {{ inputData.col.value }}
  199. </template>
  200. </template>
  201. </entity-index>
  202. <q-dialog v-model="sessionSheetsDialog">
  203. <entity-index v-if="mounted && entityLoaded"
  204. ref="sessionAttendanceSheetList"
  205. v-model:value="sessionAttendanceSheetListInputs"
  206. style="width: 1024px; max-width: 90%;"
  207. title="لیست حضور وغیاب"
  208. :api="sessionAttendanceSheetListApi"
  209. :table="sessionAttendanceSheetListTable"
  210. :table-keys="sessionAttendanceSheetListTableKeys"
  211. :show-search-button="false"
  212. :show-reload-button="false"
  213. :show-expand-button="false">
  214. <template v-slot:entity-index-table-cell="{inputData}">
  215. <template v-if="inputData.col.name === 'number'">
  216. {{ inputData.rowNumber }}
  217. </template>
  218. <template v-else>
  219. {{ inputData.col.value }}
  220. </template>
  221. </template>
  222. </entity-index>
  223. </q-dialog>
  224. </q-tab-panel>
  225. </q-tab-panels>
  226. </div>
  227. </template>
  228. <script>
  229. import { mixinWidget } from 'src/mixin/Mixins.js'
  230. import { APIGateway } from 'src/api/APIGateway.js'
  231. import { EntityShow, EntityIndex } from 'quasar-crud'
  232. import { FormBuilderAssist } from 'quasar-form-builder'
  233. import { SessionAttendanceSheets } from 'src/models/SessionAttendanceSheets'
  234. export default {
  235. name: 'LeaderTeamShow',
  236. components: {
  237. EntityShow,
  238. EntityIndex
  239. },
  240. mixins: [mixinWidget],
  241. data () {
  242. const teamId = this.$route.params.team_id
  243. return {
  244. tab: 'teamRegistrationList',
  245. mounted: false,
  246. entityLoaded: false,
  247. entityLoading: true,
  248. api: APIGateway.team.APIAdresses.byId(teamId),
  249. entityIdKey: 'id',
  250. entityParamKey: 'id',
  251. inputs: [
  252. { type: 'input', name: 'title', responseKey: 'title', label: 'عنوان گروه', placeholder: ' ', col: 'col-md-3 col-12' },
  253. { type: 'input', name: 'capacity', responseKey: 'capacity', label: 'ظرفیت', placeholder: ' ', col: 'col-md-3 col-12' },
  254. { type: 'input', name: 'used_capacity', responseKey: 'used_capacity', label: 'ظرفیت استفاده شده', placeholder: ' ', col: 'col-md-3 col-12' },
  255. { type: 'separator', name: 'space', size: '0', col: 'col-12' },
  256. { type: 'inputEditor', name: 'description', responseKey: 'description', label: 'توضیحات', col: 'col-12' }
  257. ],
  258. teamRegistrationListInputs: [
  259. { type: 'hidden', name: 'team', value: teamId }
  260. ],
  261. teamRegistrationListApi: APIGateway.teamRegistrations.APIAdresses.base,
  262. teamRegistrationListTable: {
  263. columns: [
  264. {
  265. name: 'number',
  266. required: true,
  267. label: 'شماره',
  268. align: 'left',
  269. field: () => ''
  270. },
  271. {
  272. name: 'id',
  273. required: true,
  274. label: 'شناسه',
  275. align: 'left',
  276. field: row => row.registration_info.owner_info.id
  277. },
  278. {
  279. name: 'title',
  280. required: true,
  281. label: 'جنسیت',
  282. align: 'left',
  283. field: row => (row.registration_info.owner_info.gender === 1) ? 'مذکر' : ((row.registration_info.owner_info.gender === 2) ? 'مونث' : '-')
  284. },
  285. {
  286. name: 'creation_time',
  287. required: true,
  288. label: 'نام و نام خانوادگی',
  289. align: 'left',
  290. field: row => row.registration_info.owner_info.firstname + ' ' + row.registration_info.owner_info.lastname
  291. },
  292. {
  293. name: 'creation_time',
  294. required: true,
  295. label: 'کدملی',
  296. align: 'left',
  297. field: row => row.registration_info.owner_info.national_code
  298. },
  299. {
  300. name: 'creation_time',
  301. required: true,
  302. label: 'شماره تلفن',
  303. align: 'left',
  304. field: row => row.registration_info.owner_info.mobile_number
  305. },
  306. {
  307. name: 'creation_time',
  308. required: true,
  309. label: 'دانشگاه',
  310. align: 'left',
  311. field: row => row.registration_info.owner_info.last_academy_name
  312. },
  313. {
  314. name: 'creation_time',
  315. required: true,
  316. label: 'شهر',
  317. align: 'left',
  318. field: row => row.registration_info.owner_info.living_city
  319. },
  320. {
  321. name: 'actions',
  322. required: true,
  323. label: 'عملیات',
  324. align: 'left',
  325. field: ''
  326. }
  327. ]
  328. },
  329. teamRegistrationListTableKeys: {
  330. data: 'results',
  331. total: 'count',
  332. currentPage: 'current',
  333. perPage: 'per_page',
  334. pageKey: 'page'
  335. },
  336. sessionsListInputs: [
  337. { type: 'hidden', name: 'classroom', value: null }
  338. ],
  339. sessionsListApi: APIGateway.session.APIAdresses.base,
  340. sessionsListTable: {
  341. columns: [
  342. {
  343. name: 'number',
  344. required: true,
  345. label: 'شماره',
  346. align: 'left',
  347. field: () => ''
  348. },
  349. {
  350. name: 'id',
  351. required: true,
  352. label: 'شناسه',
  353. align: 'left',
  354. field: row => row.id
  355. },
  356. {
  357. name: 'title',
  358. required: true,
  359. label: 'عنوان',
  360. align: 'left',
  361. field: row => row.title
  362. },
  363. {
  364. name: 'actions',
  365. required: true,
  366. label: 'عملیات',
  367. align: 'left',
  368. field: ''
  369. }
  370. ]
  371. },
  372. sessionsListTableKeys: {
  373. data: 'results',
  374. total: 'count',
  375. currentPage: 'current',
  376. perPage: 'per_page',
  377. pageKey: 'page'
  378. },
  379. sessionSheetsDialog: false,
  380. sessionAttendanceSheetListInputs: [
  381. { type: 'hidden', name: 'session', value: null },
  382. { type: 'hidden', name: 'registration__teams__id', value: teamId }
  383. ],
  384. sessionAttendanceSheetListApi: APIGateway.sessionAttendanceSheets.APIAdresses.sessionSheets,
  385. sessionAttendanceSheetListTable: {
  386. columns: [
  387. {
  388. name: 'number',
  389. required: true,
  390. label: 'شماره',
  391. align: 'left',
  392. field: () => ''
  393. },
  394. {
  395. name: 'id',
  396. required: true,
  397. label: 'شناسه',
  398. align: 'left',
  399. field: row => row.id
  400. },
  401. {
  402. name: 'sender',
  403. required: true,
  404. label: 'نام و نام خانوادگی',
  405. align: 'left',
  406. field: row => row.owner_info.firstname + ' ' + row.owner_info.lastname
  407. },
  408. {
  409. name: 'sender',
  410. required: true,
  411. label: 'کد ملی',
  412. align: 'left',
  413. field: row => row.owner_info.national_code
  414. },
  415. {
  416. name: 'assignment_status',
  417. required: true,
  418. label: 'وضعیت تکلیف',
  419. align: 'left',
  420. field: row => (new SessionAttendanceSheets(row)).assignment_status_info.label
  421. },
  422. {
  423. name: 'attendance_status',
  424. required: true,
  425. label: 'وضعیت حضور و غیاب',
  426. align: 'left',
  427. field: row => (new SessionAttendanceSheets(row)).attendance_status_info.label
  428. }
  429. ]
  430. },
  431. sessionAttendanceSheetListTableKeys: {
  432. data: 'results',
  433. total: 'count',
  434. currentPage: 'current',
  435. perPage: 'per_page',
  436. pageKey: 'page'
  437. },
  438. answerBooksListInputs: [
  439. { type: 'hidden', name: 'registration__teams__id', value: null }
  440. ],
  441. answerBooksListApi: APIGateway.answerBook.APIAdresses.base,
  442. answerBooksListTable: {
  443. columns: [
  444. {
  445. name: 'number',
  446. required: true,
  447. label: 'شماره',
  448. align: 'left',
  449. field: () => ''
  450. },
  451. {
  452. name: 'id',
  453. required: true,
  454. label: 'شناسه',
  455. align: 'left',
  456. field: row => row.id
  457. },
  458. {
  459. name: 'title',
  460. required: true,
  461. label: 'عنوان',
  462. align: 'left',
  463. field: row => row.title
  464. },
  465. {
  466. name: 'actions',
  467. required: true,
  468. label: 'عملیات',
  469. align: 'left',
  470. field: ''
  471. }
  472. ]
  473. },
  474. answerBooksListTableKeys: {
  475. data: 'results',
  476. total: 'count',
  477. currentPage: 'current',
  478. perPage: 'per_page',
  479. pageKey: 'page'
  480. },
  481. transcriptSheetsListInputs: [
  482. { type: 'hidden', name: 'registration__teams__id', value: null }
  483. ],
  484. transcriptSheetsListApi: APIGateway.transcriptSheet.APIAdresses.base,
  485. transcriptSheetsListTable: {
  486. columns: [
  487. {
  488. name: 'number',
  489. required: true,
  490. label: 'شماره',
  491. align: 'left',
  492. field: () => ''
  493. },
  494. {
  495. name: 'id',
  496. required: true,
  497. label: 'شناسه',
  498. align: 'left',
  499. field: row => row.id
  500. },
  501. {
  502. name: 'title',
  503. required: true,
  504. label: 'عنوان',
  505. align: 'left',
  506. field: row => row.title
  507. },
  508. {
  509. name: 'actions',
  510. required: true,
  511. label: 'عملیات',
  512. align: 'left',
  513. field: ''
  514. }
  515. ]
  516. },
  517. transcriptSheetsListTableKeys: {
  518. data: 'results',
  519. total: 'count',
  520. currentPage: 'current',
  521. perPage: 'per_page',
  522. pageKey: 'page'
  523. }
  524. }
  525. },
  526. mounted() {
  527. this.mounted = true
  528. },
  529. methods: {
  530. onConfirmedSelectedRegistrations (data) {
  531. const registrations = data.map(item => item.id)
  532. this.addNewLeaderLoading = true
  533. APIGateway.team.appendRegistrations({ teamId: this.$route.params.team_id, registrations })
  534. .then(() => {
  535. this.$refs.teamRegistrationList.search()
  536. this.addNewLeaderLoading = false
  537. })
  538. .catch(() => {
  539. this.addNewLeaderLoading = false
  540. })
  541. },
  542. afterLoadInputData (responseData) {
  543. FormBuilderAssist.setAttributeByName(this.sessionsListInputs, 'classroom', 'value', responseData.classroom)
  544. FormBuilderAssist.setAttributeByName(this.answerBooksListInputs, 'registration__teams__id', 'value', responseData.id)
  545. FormBuilderAssist.setAttributeByName(this.transcriptSheetsListInputs, 'registration__teams__id', 'value', responseData.id)
  546. this.entityLoaded = true
  547. this.entityLoading = false
  548. },
  549. showSessionSheetsDialog (sessionId) {
  550. FormBuilderAssist.setAttributeByName(this.sessionAttendanceSheetListInputs, 'session', 'value', sessionId)
  551. this.sessionSheetsDialog = true
  552. },
  553. getRemoveMessage (row) {
  554. return 'آیا از حذف ' + row.registration_info.owner_info.firstname + ' ' + row.registration_info.owner_info.lastname + ' اطمینان دارید؟'
  555. }
  556. }
  557. }
  558. </script>
  559. <style scoped lang="scss">
  560. .LeaderTeamShow {
  561. .title {
  562. font-style: normal;
  563. font-weight: 700;
  564. font-size: 24px;
  565. line-height: 140%;
  566. color: #424242;
  567. margin-bottom: 27px;
  568. display: flex;
  569. flex-flow: row;
  570. position: relative;
  571. .static-title {
  572. }
  573. .dynamic-title {
  574. }
  575. .back-action {
  576. position: absolute;
  577. right: 0;
  578. top: 0;
  579. }
  580. }
  581. :deep(.form) {
  582. padding: 24px;
  583. }
  584. }
  585. </style>