LeaderTeamShow.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702
  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. </div>
  144. </template>
  145. <template v-else>
  146. {{ inputData.col.value }}
  147. </template>
  148. </template>
  149. </entity-index>
  150. <q-dialog v-model="sessionSheetsDialog">
  151. <entity-index v-if="mounted && entityLoaded"
  152. ref="sessionAttendanceSheetList"
  153. v-model:value="sessionAttendanceSheetListInputs"
  154. style="width: 1024px; max-width: 90%;"
  155. title="لیست حضور وغیاب"
  156. :api="sessionAttendanceSheetListApi"
  157. :table="sessionAttendanceSheetListTable"
  158. :table-keys="sessionAttendanceSheetListTableKeys"
  159. :show-search-button="false"
  160. :show-reload-button="false"
  161. :show-expand-button="false">
  162. <template v-slot:entity-index-table-cell="{inputData}">
  163. <template v-if="inputData.col.name === 'number'">
  164. {{ inputData.rowNumber }}
  165. </template>
  166. <template v-else>
  167. {{ inputData.col.value }}
  168. </template>
  169. </template>
  170. </entity-index>
  171. </q-dialog>
  172. </q-tab-panel>
  173. <q-tab-panel name="transcript_sheets"
  174. class="q-pa-none">
  175. <entity-index ref="transcriptSheetsList"
  176. v-model:value="transcriptSheetsListInputs"
  177. title="کارنامه ها"
  178. :api="transcriptSheetsListApi"
  179. :table="transcriptSheetsListTable"
  180. :table-keys="transcriptSheetsListTableKeys"
  181. :show-search-button="false"
  182. :show-reload-button="false"
  183. :show-expand-button="false">
  184. <template v-slot:entity-index-table-cell="{inputData}">
  185. <template v-if="inputData.col.name === 'number'">
  186. {{ inputData.rowNumber }}
  187. </template>
  188. <template v-else-if="inputData.col.name === 'actions'">
  189. <div class="action-column-entity-index">
  190. <q-btn size="md"
  191. color="primary"
  192. label="جزییات"
  193. :to="{name: 'UserPanel.Classroom.MyAsGraderClassroom.AnswerBooks.ShowGrade', params: {classroom_id: $route.params.classroom_id, answer_book_id: inputData.props.row.id}, query: {read_only: 1}}"
  194. class="q-mr-md" />
  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. import { Test } from 'src/models/Test.js'
  235. import { AnswerBook } from 'src/models/AnswerBook.js'
  236. import { TranscriptSheet } from 'src/models/TranscriptSheet'
  237. export default {
  238. name: 'LeaderTeamShow',
  239. components: {
  240. EntityShow,
  241. EntityIndex
  242. },
  243. mixins: [mixinWidget],
  244. data () {
  245. const teamId = this.$route.params.team_id
  246. return {
  247. tab: 'teamRegistrationList',
  248. mounted: false,
  249. entityLoaded: false,
  250. entityLoading: true,
  251. api: APIGateway.team.APIAdresses.byId(teamId),
  252. entityIdKey: 'id',
  253. entityParamKey: 'id',
  254. inputs: [
  255. { type: 'input', name: 'title', responseKey: 'title', label: 'عنوان گروه', placeholder: ' ', col: 'col-md-3 col-12' },
  256. { type: 'input', name: 'capacity', responseKey: 'capacity', label: 'ظرفیت', placeholder: ' ', col: 'col-md-3 col-12' },
  257. { type: 'input', name: 'used_capacity', responseKey: 'used_capacity', label: 'ظرفیت استفاده شده', placeholder: ' ', col: 'col-md-3 col-12' },
  258. { type: 'separator', name: 'space', size: '0', col: 'col-12' },
  259. { type: 'inputEditor', name: 'description', responseKey: 'description', label: 'توضیحات', col: 'col-12' }
  260. ],
  261. teamRegistrationListInputs: [
  262. { type: 'hidden', name: 'team', value: teamId }
  263. ],
  264. teamRegistrationListApi: APIGateway.teamRegistrations.APIAdresses.base,
  265. teamRegistrationListTable: {
  266. columns: [
  267. {
  268. name: 'number',
  269. required: true,
  270. label: 'شماره',
  271. align: 'left',
  272. field: () => ''
  273. },
  274. {
  275. name: 'id',
  276. required: true,
  277. label: 'شناسه',
  278. align: 'left',
  279. field: row => row.registration_info.owner_info.id
  280. },
  281. {
  282. name: 'title',
  283. required: true,
  284. label: 'جنسیت',
  285. align: 'left',
  286. field: row => (row.registration_info.owner_info.gender === 1) ? 'مذکر' : ((row.registration_info.owner_info.gender === 2) ? 'مونث' : '-')
  287. },
  288. {
  289. name: 'creation_time',
  290. required: true,
  291. label: 'نام و نام خانوادگی',
  292. align: 'left',
  293. field: row => row.registration_info.owner_info.firstname + ' ' + row.registration_info.owner_info.lastname
  294. },
  295. {
  296. name: 'creation_time',
  297. required: true,
  298. label: 'کدملی',
  299. align: 'left',
  300. field: row => row.registration_info.owner_info.national_code
  301. },
  302. {
  303. name: 'creation_time',
  304. required: true,
  305. label: 'شماره تلفن',
  306. align: 'left',
  307. field: row => row.registration_info.owner_info.mobile_number
  308. },
  309. {
  310. name: 'creation_time',
  311. required: true,
  312. label: 'دانشگاه',
  313. align: 'left',
  314. field: row => row.registration_info.owner_info.last_academy_name
  315. },
  316. {
  317. name: 'creation_time',
  318. required: true,
  319. label: 'شهر',
  320. align: 'left',
  321. field: row => row.registration_info.owner_info.living_city
  322. },
  323. {
  324. name: 'actions',
  325. required: true,
  326. label: 'عملیات',
  327. align: 'left',
  328. field: ''
  329. }
  330. ]
  331. },
  332. teamRegistrationListTableKeys: {
  333. data: 'results',
  334. total: 'count',
  335. currentPage: 'current',
  336. perPage: 'per_page',
  337. pageKey: 'page'
  338. },
  339. sessionsListInputs: [
  340. { type: 'hidden', name: 'classroom', value: null }
  341. ],
  342. sessionsListApi: APIGateway.session.APIAdresses.base,
  343. sessionsListTable: {
  344. columns: [
  345. {
  346. name: 'number',
  347. required: true,
  348. label: 'شماره',
  349. align: 'left',
  350. field: () => ''
  351. },
  352. {
  353. name: 'id',
  354. required: true,
  355. label: 'شناسه',
  356. align: 'left',
  357. field: row => row.id
  358. },
  359. {
  360. name: 'title',
  361. required: true,
  362. label: 'عنوان',
  363. align: 'left',
  364. field: row => row.title
  365. },
  366. {
  367. name: 'actions',
  368. required: true,
  369. label: 'عملیات',
  370. align: 'left',
  371. field: ''
  372. }
  373. ]
  374. },
  375. sessionsListTableKeys: {
  376. data: 'results',
  377. total: 'count',
  378. currentPage: 'current',
  379. perPage: 'per_page',
  380. pageKey: 'page'
  381. },
  382. sessionSheetsDialog: false,
  383. sessionAttendanceSheetListInputs: [
  384. { type: 'hidden', name: 'session', value: null },
  385. { type: 'hidden', name: 'registration__teams__id', value: teamId }
  386. ],
  387. sessionAttendanceSheetListApi: APIGateway.sessionAttendanceSheets.APIAdresses.sessionSheets,
  388. sessionAttendanceSheetListTable: {
  389. columns: [
  390. {
  391. name: 'number',
  392. required: true,
  393. label: 'شماره',
  394. align: 'left',
  395. field: () => ''
  396. },
  397. {
  398. name: 'id',
  399. required: true,
  400. label: 'شناسه',
  401. align: 'left',
  402. field: row => row.id
  403. },
  404. {
  405. name: 'sender',
  406. required: true,
  407. label: 'نام و نام خانوادگی',
  408. align: 'left',
  409. field: row => row.owner_info.firstname + ' ' + row.owner_info.lastname
  410. },
  411. {
  412. name: 'sender',
  413. required: true,
  414. label: 'کد ملی',
  415. align: 'left',
  416. field: row => row.owner_info.national_code
  417. },
  418. {
  419. name: 'assignment_status',
  420. required: true,
  421. label: 'وضعیت تکلیف',
  422. align: 'left',
  423. field: row => (new SessionAttendanceSheets(row)).assignment_status_info.label
  424. },
  425. {
  426. name: 'attendance_status',
  427. required: true,
  428. label: 'وضعیت حضور و غیاب',
  429. align: 'left',
  430. field: row => (new SessionAttendanceSheets(row)).attendance_status_info.label
  431. }
  432. ]
  433. },
  434. sessionAttendanceSheetListTableKeys: {
  435. data: 'results',
  436. total: 'count',
  437. currentPage: 'current',
  438. perPage: 'per_page',
  439. pageKey: 'page'
  440. },
  441. answerBooksListInputs: [
  442. {
  443. type: 'select',
  444. name: 'status',
  445. clearable: false,
  446. options: [
  447. { label: 'جاری', value: 'WAITING_FOR_GRADING' },
  448. { label: 'در حال تصحیح', value: 'GRADING' },
  449. { label: 'تصحیح شده', value: 'GRADED' },
  450. {
  451. label: 'حذف شده',
  452. value: 'DELETED'
  453. },
  454. {
  455. label: 'نیاز به رفع مشکل',
  456. value: 'UNGRADABLE'
  457. },
  458. {
  459. label: 'اعتراض شده',
  460. value: 'OBJECTED'
  461. }
  462. ],
  463. label: 'وضعیت',
  464. placeholder: ' ',
  465. value: 'WAITING_FOR_GRADING',
  466. col: 'col-md-4 col-12'
  467. },
  468. { type: 'hidden', name: 'registration__teams__id', value: null }
  469. ],
  470. answerBooksListApi: APIGateway.answerBook.APIAdresses.base,
  471. answerBooksListTable: {
  472. columns: [
  473. {
  474. name: 'number',
  475. required: true,
  476. label: 'شماره',
  477. align: 'left',
  478. field: () => ''
  479. },
  480. {
  481. name: 'id',
  482. required: true,
  483. label: 'شناسه',
  484. align: 'left',
  485. field: row => row.id
  486. },
  487. {
  488. name: 'owner_info.fullname',
  489. required: true,
  490. label: 'نام و نام خانوادگی',
  491. align: 'left',
  492. field: row => row.owner_info.firstname + ' ' + row.owner_info.lastname
  493. },
  494. {
  495. name: 'owner_info.mobile_number',
  496. required: true,
  497. label: 'موبایل',
  498. align: 'left',
  499. field: row => row.owner_info.mobile_number
  500. },
  501. {
  502. name: 'title',
  503. required: true,
  504. label: 'عنوان آزمون',
  505. align: 'left',
  506. field: row => row.test_info.title
  507. },
  508. {
  509. name: 'test_questions_length',
  510. required: true,
  511. label: 'تعداد سوالات',
  512. align: 'left',
  513. field: row => row.test_info.test_questions_length
  514. },
  515. // {
  516. // name: 'level',
  517. // required: true,
  518. // label: 'درچه سختی',
  519. // align: 'left',
  520. // field: row => (new Test(row.test_set_info)).level_info.label
  521. // },
  522. {
  523. name: 'test_info_status_info',
  524. required: true,
  525. label: 'وضعیت آزمون',
  526. align: 'left',
  527. field: row => (new Test(row.test_info)).status_info.label
  528. },
  529. {
  530. name: 'status_info',
  531. required: true,
  532. label: 'وضعیت تصحیح',
  533. align: 'left',
  534. field: row => (new AnswerBook(row)).status_info.label
  535. },
  536. {
  537. name: 'actions',
  538. required: true,
  539. label: 'عملیات',
  540. align: 'left',
  541. field: ''
  542. }
  543. ]
  544. },
  545. answerBooksListTableKeys: {
  546. data: 'results',
  547. total: 'count',
  548. currentPage: 'current',
  549. perPage: 'per_page',
  550. pageKey: 'page'
  551. },
  552. transcriptSheetsListInputs: [
  553. { type: 'hidden', name: 'registration__teams__id', value: null }
  554. ],
  555. transcriptSheetsListApi: APIGateway.transcriptSheet.APIAdresses.base,
  556. transcriptSheetsListTable: {
  557. columns: [
  558. {
  559. name: 'id',
  560. required: true,
  561. label: 'شماره',
  562. align: 'left',
  563. field: row => row.id
  564. },
  565. {
  566. name: 'owner_info.fullname',
  567. required: true,
  568. label: 'نام و نام خانوادگی',
  569. align: 'left',
  570. field: row => row.registration_info.owner_info.firstname + ' ' + row.registration_info.owner_info.lastname
  571. },
  572. {
  573. name: 'owner_info.national_code',
  574. required: true,
  575. label: 'کد ملی',
  576. align: 'left',
  577. field: row => row.registration_info.owner_info.national_code
  578. },
  579. {
  580. name: 'attendance_score',
  581. required: true,
  582. label: 'نمره حضور و غیاب',
  583. align: 'left',
  584. field: row => row.attendance_score
  585. },
  586. {
  587. name: 'highest_test_score',
  588. required: true,
  589. label: 'نمره آزمون',
  590. align: 'left',
  591. field: row => row.highest_test_score
  592. },
  593. {
  594. name: 'final_score',
  595. required: true,
  596. label: 'نمره نهایی',
  597. align: 'left',
  598. field: row => row.final_score
  599. },
  600. {
  601. name: 'status',
  602. required: true,
  603. label: 'وضعیت نهایی',
  604. align: 'left',
  605. field: row => new TranscriptSheet(row).status_info.label
  606. },
  607. {
  608. name: 'actions',
  609. required: true,
  610. label: 'سابقه آموزشی',
  611. align: 'left',
  612. field: ''
  613. }
  614. ]
  615. },
  616. transcriptSheetsListTableKeys: {
  617. data: 'results',
  618. total: 'count',
  619. currentPage: 'current',
  620. perPage: 'per_page',
  621. pageKey: 'page'
  622. }
  623. }
  624. },
  625. mounted() {
  626. this.mounted = true
  627. },
  628. methods: {
  629. onConfirmedSelectedRegistrations (data) {
  630. const registrations = data.map(item => item.id)
  631. this.addNewLeaderLoading = true
  632. APIGateway.team.appendRegistrations({ teamId: this.$route.params.team_id, registrations })
  633. .then(() => {
  634. this.$refs.teamRegistrationList.search()
  635. this.addNewLeaderLoading = false
  636. })
  637. .catch(() => {
  638. this.addNewLeaderLoading = false
  639. })
  640. },
  641. afterLoadInputData (responseData) {
  642. FormBuilderAssist.setAttributeByName(this.sessionsListInputs, 'classroom', 'value', responseData.classroom)
  643. FormBuilderAssist.setAttributeByName(this.answerBooksListInputs, 'registration__teams__id', 'value', responseData.id)
  644. FormBuilderAssist.setAttributeByName(this.transcriptSheetsListInputs, 'registration__teams__id', 'value', responseData.id)
  645. this.entityLoaded = true
  646. this.entityLoading = false
  647. },
  648. showSessionSheetsDialog (sessionId) {
  649. FormBuilderAssist.setAttributeByName(this.sessionAttendanceSheetListInputs, 'session', 'value', sessionId)
  650. this.sessionSheetsDialog = true
  651. },
  652. getRemoveMessage (row) {
  653. return 'آیا از حذف ' + row.registration_info.owner_info.firstname + ' ' + row.registration_info.owner_info.lastname + ' اطمینان دارید؟'
  654. }
  655. }
  656. }
  657. </script>
  658. <style scoped lang="scss">
  659. .LeaderTeamShow {
  660. .title {
  661. font-style: normal;
  662. font-weight: 700;
  663. font-size: 24px;
  664. line-height: 140%;
  665. color: #424242;
  666. margin-bottom: 27px;
  667. display: flex;
  668. flex-flow: row;
  669. position: relative;
  670. .static-title {
  671. }
  672. .dynamic-title {
  673. }
  674. .back-action {
  675. position: absolute;
  676. right: 0;
  677. top: 0;
  678. }
  679. }
  680. :deep(.form) {
  681. padding: 24px;
  682. }
  683. }
  684. </style>