projectInfo.vue 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <template>
  2. <breadcrumbs style="margin-top: 29px; margin-bottom: 19px;" />
  3. <div class="flex justify-end">
  4. <q-btn flat
  5. color="grey"
  6. @click="$router.go(-1)">
  7. بازگشت
  8. >
  9. </q-btn>
  10. </div>
  11. <entity-show v-if="mounted"
  12. ref="projectEntityEdit"
  13. v-model:value="inputs"
  14. title="جزییات پروژه"
  15. :api="api"
  16. :show-index-button="false"
  17. :show-close-button="false"
  18. :show-edit-button="false"
  19. :show-expand-button="false"
  20. :show-save-button="false"
  21. :show-reload-button="false"
  22. :after-load-input-data="afterLoadProject">
  23. <template #after-form-builder>
  24. <q-separator class="q-my-lg" />
  25. <entity-create v-if="((!currentUserAttendanceSheet || currentUserAttendanceSheet.answer_status === 'NOT_SENT') && currentUserAttendanceSheet?.is_enabled_answering)"
  26. ref="entityCreate"
  27. v-model:value="attendanceSheetsInputs"
  28. :api="attendanceSheetsApi"
  29. :default-layout="false" />
  30. {{ currentUserAttendanceSheet?.answer_attachment }}
  31. <entity-show v-if="currentUserAttendanceSheet && currentUserAttendanceSheet.answer_status !== 'NOT_SENT' && !currentUserAttendanceSheet?.is_enabled_answering"
  32. v-model:value="attendanceSheetsShowInputs"
  33. title="پاسخ کاربر"
  34. :loaded-data="currentUserAttendanceSheet"
  35. :default-layout="false"
  36. :show-expand-button="false"
  37. :show-edit-button="false"
  38. :show-index-button="false"
  39. :show-reload-button="false" />
  40. </template>
  41. </entity-show>
  42. </template>
  43. <script>
  44. import { shallowRef } from 'vue'
  45. import { Project } from 'src/models/Project.js'
  46. import { APIGateway } from 'src/api/APIGateway.js'
  47. import { Classroom } from 'src/models/Classroom.js'
  48. import { EntityShow, EntityCreate } from 'quasar-crud'
  49. import BtnControl from 'src/components/Control/btn.vue'
  50. import Breadcrumbs from 'src/components/Widgets/Breadcrumbs/Breadcrumbs.vue'
  51. import ContentsSelector from 'src/components/FormBuilderCustumComponents/ContentsSelector/ContentsSelector.vue'
  52. import { FormBuilderAssist } from 'quasar-form-builder'
  53. import { ProjectAttendanceSheets } from 'src/models/ProjectAttendanceSheets'
  54. const BtnControlComp = shallowRef(BtnControl)
  55. const ContentsSelectorComp = shallowRef(ContentsSelector)
  56. export default {
  57. name: 'UserPanel.Profile.ClassroomInfo',
  58. components: {
  59. Breadcrumbs,
  60. EntityShow,
  61. EntityCreate
  62. },
  63. data () {
  64. const projectId = parseInt(this.$route.params.project_id)
  65. return {
  66. mounted: false,
  67. projectLoaded: false,
  68. classroomLoaded: false,
  69. project: new Project(),
  70. projectAttendanceSheets: new ProjectAttendanceSheets(),
  71. classroom: new Classroom(),
  72. api: APIGateway.project.APIAdresses.projectAndCurrentUserAttendanceSheet(projectId),
  73. inputs: [
  74. { type: 'input', name: 'title', responseKey: 'title', label: 'عنوان پروژه', placeholder: ' ', col: 'col-md-6 col-12' },
  75. {
  76. type: 'select',
  77. name: 'type',
  78. responseKey: 'type',
  79. label: 'نوع پروژه',
  80. options: (new Project()).typeEnums,
  81. placeholder: ' ',
  82. col: 'col-md-3 col-12'
  83. },
  84. { type: 'dateTime', name: 'beginning_doing_period', responseKey: 'beginning_doing_period', label: 'زمان شروع', placeholder: ' ', col: 'col-md-6 col-12' },
  85. { type: 'dateTime', name: 'ending_doing_period', responseKey: 'ending_doing_period', label: 'زمان پایان', placeholder: ' ', col: 'col-md-6 col-12' },
  86. { type: 'separator', name: 'space', size: '0', col: 'col-md-12' },
  87. { type: 'inputEditor', name: 'description', responseKey: 'description', label: 'توضیحات پروژه', placeholder: ' ', col: 'col-12' },
  88. { type: ContentsSelectorComp, name: 'contents', responseKey: 'contents_info', showPageLink: false, showDownloadLink: true, col: 'col-12' },
  89. { type: 'hidden', name: 'id', responseKey: 'id' },
  90. { type: 'hidden', name: 'classroom', responseKey: 'classroom' }
  91. ],
  92. attendanceSheetsApi: APIGateway.projectAttendanceSheets.APIAdresses.base,
  93. attendanceSheetsInputs: [
  94. { type: 'separator', name: 'space', label: 'انجام پروژه', className: 'custom-separator', col: 'col-12' },
  95. { type: 'inputEditor', name: 'answer_text', label: 'متن پاسخ', placeholder: ' ', col: 'col-12' },
  96. { type: 'file', name: 'answer_attachment', label: 'فای ضمیمه', placeholder: ' ', col: 'col-md-4 col-12' },
  97. { type: BtnControlComp, name: 'btn', responseKey: 'btn', label: 'ارسال پروژه', placeholder: ' ', atClick: () => {}, col: 'col-12' },
  98. { type: 'hidden', name: 'project', value: projectId }
  99. ],
  100. attendanceSheetsShowInputs: [
  101. { type: 'separator', name: 'space', label: 'انجام پروژه', className: 'custom-separator', col: 'col-12' },
  102. { type: 'inputEditor', name: 'answer_text', responseKey: 'answer_text', label: 'متن پاسخ', placeholder: ' ', col: 'col-12' },
  103. { type: 'file', name: 'answer_attachment', responseKey: 'answer_attachment', label: 'فای ضمیمه', placeholder: ' ', col: 'col-md-4 col-12' }
  104. ]
  105. }
  106. },
  107. computed: {
  108. currentUserAttendanceSheet () {
  109. if (!this.projectAttendanceSheets?.project_attendance_sheets || this.projectAttendanceSheets.project_attendance_sheets.length === 0) {
  110. return null
  111. }
  112. return this.projectAttendanceSheets.project_attendance_sheets[0]
  113. },
  114. projectAndClassroomLoaded () {
  115. return this.projectLoaded && this.classroomLoaded
  116. }
  117. },
  118. watch: {
  119. projectAndClassroomLoaded (newValue) {
  120. if (!newValue) {
  121. return
  122. }
  123. this.$store.commit('AppLayout/updateBreadcrumbs', {
  124. visible: true,
  125. loading: false,
  126. path: [
  127. {
  128. label: 'دوره های من',
  129. to: { name: 'UserPanel.Profile.AllClassrooms' }
  130. },
  131. {
  132. label: this.classroom.title,
  133. to: { name: 'UserPanel.Profile.ClassroomInfo', params: { id: this.classroom.id } }
  134. },
  135. {
  136. label: this.classroom.title,
  137. to: { name: 'UserPanel.Profile.ClassroomInfo', params: { classroom_id: this.classroom.id, project_id: this.project.id } }
  138. }
  139. ]
  140. })
  141. }
  142. },
  143. mounted () {
  144. this.mounted = true
  145. this.getClassroomInfo()
  146. FormBuilderAssist.setAttributeByName(this.attendanceSheetsInputs, 'btn', 'atClick', this.createAttendanceSheet)
  147. },
  148. methods: {
  149. createAttendanceSheet () {
  150. this.$refs.entityCreate.createEntity(false)
  151. .then(() => {
  152. this.reloadProject()
  153. })
  154. .catch(() => {
  155. this.reloadProject()
  156. })
  157. },
  158. getClassroomInfo () {
  159. const classroomId = this.$route.params.classroom_id
  160. this.classroom.loading = true
  161. APIGateway.classroom.get(classroomId)
  162. .then((classroom) => {
  163. this.classroom = new Classroom(classroom)
  164. this.classroom.loading = false
  165. this.classroomLoaded = true
  166. })
  167. .catch(() => {
  168. this.classroom.loading = false
  169. })
  170. },
  171. afterLoadProject (data) {
  172. this.project = new Project(data)
  173. this.projectAttendanceSheets = new ProjectAttendanceSheets(data)
  174. this.setAttendanceSheetsInputsValues()
  175. this.projectLoaded = true
  176. },
  177. setAttendanceSheetsInputsValues () {
  178. FormBuilderAssist.setAttributeByName(this.attendanceSheetsInputs, 'answer_text', 'value', this.currentUserAttendanceSheet.answer_text)
  179. FormBuilderAssist.setAttributeByName(this.attendanceSheetsInputs, 'answer_attachment', 'value', this.currentUserAttendanceSheet.answer_attachment)
  180. },
  181. reloadProject () {
  182. this.$refs.projectEntityEdit.getData()
  183. }
  184. }
  185. }
  186. </script>