Concernement.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. <script>
  2. import { mapActions, mapState } from 'pinia'
  3. import { ConcernementsStore } from '@stores/concernements'
  4. import { UserStore } from '@/stores/user'
  5. import { CommonStore } from '@/stores/common'
  6. import { print } from 'graphql/language/printer'
  7. import gql from 'graphql-tag'
  8. import GQL from '@api/graphql-axios'
  9. import EntiteFields from '@api/gql/entite.fragment.gql'
  10. export default {
  11. props: ['id', 'eid'],
  12. data(){
  13. return {
  14. entite: null,
  15. opened_besoin_id: null
  16. }
  17. },
  18. computed: {
  19. ...mapState(UserStore,['isloggedin']),
  20. ...mapState(ConcernementsStore,['map_mode']),
  21. ...mapState(ConcernementsStore,['opened']),
  22. // ...mapState(ConcernementsStore,['opened_entity_id']),
  23. ...mapState(ConcernementsStore,['concernements_loaded']),
  24. ...mapState(ConcernementsStore,['ct_concernement']),
  25. ...mapState(ConcernementsStore,['ct_entite']),
  26. ...mapState(ConcernementsStore,['ct_cercle_politique']),
  27. ...mapState(ConcernementsStore,['p_groupes_interets']),
  28. ...mapState(ConcernementsStore,['p_reception_et_traitement']),
  29. ...mapState(ConcernementsStore,['p_mise_en_oeuvre_decision']),
  30. ...mapState(ConcernementsStore,['p_reception_application_decision']),
  31. ...mapState(CommonStore,['hover_elmt'])
  32. },
  33. created () {
  34. console.log(`Concernement view created, id: ${this.id}, eid: ${this.eid}, opened:${this.opened}`);
  35. // when we arrived directly to the url, load the entite
  36. // this.eid provided by route params
  37. if (!this.entity && this.eid) {
  38. this.openEntity();
  39. }
  40. },
  41. watch: {
  42. concernements_loaded: {
  43. handler (n, o){
  44. console.log(`watch concernements_loaded n: ${n}, opened:${this.opened}, id:${this.id}`);
  45. // when we arrived directly to the url then all concernement are loaded: do open the concernement
  46. if (!this.opened) {
  47. this.openCloseConcernements(this.id)
  48. }
  49. },
  50. deep: true
  51. },
  52. eid: {
  53. handler (n, o){
  54. if(n){
  55. this.openEntity()
  56. }else{
  57. this.entite = false;
  58. this.setOpenedEntityId(null);
  59. }
  60. },
  61. deep: true
  62. },
  63. },
  64. methods: {
  65. ...mapActions(ConcernementsStore,['openCloseConcernements']),
  66. ...mapActions(ConcernementsStore,['setOpenedEntityId']),
  67. openEntity(){
  68. this.setOpenedEntityId(parseInt(this.eid))
  69. this.loadEntite()
  70. },
  71. loadEntite(){
  72. const ast = gql`{
  73. entite (id: ${this.eid}) {
  74. ...EntiteFields
  75. }
  76. }
  77. ${EntiteFields}
  78. `
  79. console.log('ast', ast);
  80. GQL.post('', { query: print(ast) })
  81. .then(({data: { data: { entite }}}) => {
  82. console.log('load entite loaded', entite)
  83. this.entite = entite
  84. })
  85. .catch(error => {
  86. console.warn('Issue with load entite', error)
  87. })
  88. },
  89. onClickBesoin(id){
  90. console.log("onClickBesoin", id);
  91. this.opened_besoin_id = id === this.opened_besoin_id ? null : id;
  92. },
  93. besoinClass(id){
  94. return this.opened_besoin_id === id ? "opened" : "";
  95. }
  96. },
  97. components: {
  98. }
  99. }
  100. </script>
  101. <template>
  102. <section v-if="opened" class="concernement">
  103. <header v-if="concernements_loaded">
  104. <label
  105. v-if="ct_concernement && !entite && map_mode !== 'puissancedagir'&& map_mode !== 'doleancer'"
  106. >
  107. {{ ct_concernement.title.description }}
  108. </label>
  109. <h3 v-if="entite">{{ entite.title }}</h3>
  110. <span v-if="entite && opened.entites_byid[eid].menacemaintien > 0">menace</span>
  111. <span v-if="entite && opened.entites_byid[eid].menacemaintien < 0">maintient</span>
  112. <h2>{{ opened.title }}</h2>
  113. </header>
  114. <!-- concernement -->
  115. <section
  116. v-if="map_mode === 'terraindevie' && !entite"
  117. class="content-concernement">
  118. <section class="description">
  119. <label v-if="ct_concernement">{{ ct_concernement.field_description.description }}</label>
  120. <div v-html="opened.description"/>
  121. </section>
  122. <section class="caillou">
  123. <label v-if="ct_concernement">{{ ct_concernement.field_caillou.description }}</label>
  124. <div v-html="opened.caillou "/>
  125. </section>
  126. </section>
  127. <!-- entite -->
  128. <section
  129. v-if="map_mode === 'terraindevie' && entite"
  130. class="content-entite">
  131. <section class="action">
  132. <label v-if="ct_entite">{{ ct_entite.field_action.description }}</label>
  133. <div v-html="entite.action"/>
  134. </section>
  135. <section class="menace-maintien">
  136. <label v-if="ct_entite">{{ ct_entite.field_menace_maintien.description }}</label>
  137. <div v-html="entite.menacemaintien"/>
  138. </section>
  139. </section>
  140. <!-- puissance d'agir -->
  141. <section
  142. v-if="map_mode === 'puissancedagir'"
  143. class="content-besoins">
  144. <ul class="besoins">
  145. <li
  146. v-for="besoin in opened.besoins"
  147. :key="besoin.id"
  148. class="besoin"
  149. :id="besoin.id"
  150. :class="besoinClass(besoin.id)"
  151. >
  152. <span
  153. class="open-btn mdi"
  154. :class="{ 'mdi-chevron-right': besoin.id !== opened_besoin_id, 'mdi-chevron-down': besoin.id === opened_besoin_id } "
  155. @click="onClickBesoin(besoin.id)"
  156. />
  157. <header>
  158. <label
  159. class="mdi mdi-rhombus"
  160. :class="{ hover: hover_elmt && hover_elmt.type === 'besoin' && (hover_elmt.id === besoin.id || hover_elmt.bid === besoin.id) }"
  161. @click="onClickBesoin(besoin.id)"
  162. >
  163. Besoin de l'enqueteur
  164. </label>
  165. <h4 class="besoin-description" v-html="besoin.description"/>
  166. <a
  167. v-if="isloggedin"
  168. :href="'/api/node/add/reponse?besoin_id='+besoin.id"
  169. target="_blank"
  170. rel="noopener noreferrer"
  171. class="contribute-link mdi mdi-pencil-plus">
  172. contribuer à ce besoin
  173. </a>
  174. </header>
  175. <ul class="reponses">
  176. <li
  177. v-for="reponse in besoin.reponses"
  178. :key="reponse.id"
  179. class="reponse"
  180. :id="reponse.id"
  181. >
  182. <label class="mdi mdi-rhombus-outline">Ressource</label>
  183. <section v-if="reponse.qui">
  184. <label for="reponse-qui">Qui</label>
  185. <p name="reponse-qui" v-html="reponse.qui" />
  186. </section>
  187. <section v-if="reponse.quoi">
  188. <label for="reponse-quoi">Quoi</label>
  189. <p name="reponse-quoi" v-html="reponse.quoi" />
  190. </section>
  191. <section v-if="reponse.ou">
  192. <label for="reponse-ou">Où</label>
  193. <p name="reponse-ou" v-html="reponse.ou" />
  194. </section>
  195. <section v-if="reponse.avec">
  196. <label for="reponse-avec">Avec</label>
  197. <p name="reponse-avec" v-html="reponse.avec" />
  198. </section>
  199. </li>
  200. </ul>
  201. </li>
  202. </ul>
  203. </section>
  204. <section
  205. v-if="map_mode === 'doleancer'"
  206. class="content-doleances">
  207. <section
  208. v-for="doleance in opened.doleances"
  209. class="doleance">
  210. <header>
  211. <label for="leprobleme">{{ ct_cercle_politique.field_le_probleme.label }}</label>
  212. <h4 name="leprobleme">{{ doleance.leprobleme }}</h4>
  213. <label for="lenquete">{{ ct_cercle_politique.field_enquete_terraindevie.label }}</label>
  214. <h3 name="lenquete">{{ doleance.lenquete }}</h3>
  215. </header>
  216. <section class="groupesinterets">
  217. <h2>{{ ct_cercle_politique.field_groupes.label }}</h2>
  218. <ul>
  219. <li
  220. v-for="groupe in doleance.groupesinterets">
  221. <label for="groupe">{{ p_groupes_interets.field_groupe_interets.label }}</label>
  222. <p name="groupe" v-html="groupe.groupe_interets" />
  223. <label for="accorder">{{ p_groupes_interets.field_accorder_interets.label }}</label>
  224. <p name="accorder" v-html="groupe.accorder_interets" />
  225. <label for="formuler">{{ p_groupes_interets.field_formuler.label }}</label>
  226. <p name="formuler" v-html="groupe.formuler" />
  227. </li>
  228. </ul>
  229. </section>
  230. <section class="adresse">
  231. <label for="entite_addresse_doleance">{{ ct_cercle_politique.field_entite_adresse_doleance.label }}</label>
  232. <p name="entite_addresse_doleance" v-html="doleance.entite_addresse_doleance" />
  233. <label for="comment_ennonce_doleance">{{ ct_cercle_politique.field_comment_enonce_doleance.label }}</label>
  234. <p name="comment_ennonce_doleance" v-html="doleance.comment_ennonce_doleance" />
  235. <label for="aqui_addresse_doleance">{{ ct_cercle_politique.field_a_qui_adresse_doleance.label }}</label>
  236. <p name="aqui_addresse_doleance" v-html="doleance.aqui_addresse_doleance" />
  237. <h2>{{ ct_cercle_politique.field_receptions_et_traitements.label }}</h2>
  238. <ul class="reception_traitement">
  239. <li
  240. v-for="rec in doleance.reception_traitement">
  241. <label for="entite_adressee">{{ p_reception_et_traitement.field_entite_adressee.label }}</label>
  242. <p name="entite_adressee" v-html="rec.entite_adressee" />
  243. <label for="doleance_formulee">{{ p_reception_et_traitement.field_doleance_formulee.label }}</label>
  244. <p name="doleance_formulee" v-html="rec.doleance_formulee" />
  245. <label for="traite_doleance">{{ p_reception_et_traitement.field_traite_doleance.label }}</label>
  246. <p name="traite_doleance" v-html="rec.traite_doleance" />
  247. <label for="entite_recoit_doleance">{{ p_reception_et_traitement.field_entite_recoit_doleance.label }}</label>
  248. <p name="entite_recoit_doleance" v-html="rec.entite_recoit_doleance" />
  249. </li>
  250. </ul>
  251. </section>
  252. <section class="miseenoeuvre">
  253. <label for="entites_decisionnaires">{{ ct_cercle_politique.field_entites_decisionnaires.label }}</label>
  254. <p name="entites_decisionnaires" v-html="doleance.entites_decisionnaires" />
  255. <label for="decision_formule">{{ ct_cercle_politique.field_decision_formulee.label }}</label>
  256. <p name="decision_formule" v-html="doleance.decision_formule" />
  257. <h2>{{ ct_cercle_politique.field_mise_en_oeuvre_decision.label }}</h2>
  258. <ul class="mise_en_oeuvre_decision">
  259. <li
  260. v-for="dec in doleance.mise_en_oeuvre_decision">
  261. <label for="entite_adresse_decision">{{ p_mise_en_oeuvre_decision.field_entite_adresse_decision.label }}</label>
  262. <p name="entite_adresse_decision" v-html="dec.entite_adresse_decision" />
  263. <label for="formule_decision">{{ p_mise_en_oeuvre_decision.field_formule_decision.label }}</label>
  264. <p name="formule_decision" v-html="dec.formule_decision" />
  265. <label for="entite_metenoeuvre_decisio">{{ p_mise_en_oeuvre_decision.field_entite_metenoeuvre_decisio.label }}</label>
  266. <p name="entite_metenoeuvre_decisio" v-html="dec.entite_metenoeuvre_decisio" />
  267. </li>
  268. </ul>
  269. </section>
  270. <section class="receptions_et_applications">
  271. <label for="entite_adresse_application">{{ ct_cercle_politique.field_entite_adresse_application.label }}</label>
  272. <p name="entite_adresse_application" v-html="doleance.entite_adresse_application" />
  273. <label for="aqui_adresse_decision">{{ ct_cercle_politique.field_aqui_adresse_decision.label }}</label>
  274. <p name="aqui_adresse_decision" v-html="doleance.aqui_adresse_decision" />
  275. <label for="comment_formule_decision">{{ ct_cercle_politique.field_comment_formule_decision.label }}</label>
  276. <p name="comment_formule_decision" v-html="doleance.comment_formule_decision" />
  277. <h2>{{ ct_cercle_politique.field_receptions_et_applications.label }}</h2>
  278. <ul class="receptions_et_applications">
  279. <li
  280. v-for="app in doleance.receptions_et_applications">
  281. <label for="applique_decision">{{ p_reception_application_decision.field_applique_decision.label }}</label>
  282. <p name="applique_decision" v-html="app.applique_decision" />
  283. <label for="formule_decision_applic">{{ p_reception_application_decision.field_formule_decision_applic.label }}</label>
  284. <p name="formule_decision_applic" v-html="app.formule_decision_applic" />
  285. <label for="entite_recoit_decision">{{ p_reception_application_decision.field_entite_recoit_decision.label }}</label>
  286. <p name="entite_recoit_decision" v-html="app.entite_recoit_decision" />
  287. </li>
  288. </ul>
  289. <label for="probleme_initial_resolu">{{ ct_cercle_politique.field_probleme_initial_resolu.label }}</label>
  290. <p name="probleme_initial_resolu" v-html="doleance.probleme_initial_resolu" />
  291. <label for="oui_nouvelle_situation">{{ ct_cercle_politique.field_oui_nouvelle_situation.label }}</label>
  292. <p name="oui_nouvelle_situation" v-html="doleance.oui_nouvelle_situation" />
  293. <label for="non_adresse_doleance">{{ ct_cercle_politique.field_non_adresse_doleance.label }}</label>
  294. <p name="non_adresse_doleance" v-html="doleance.non_adresse_doleance" />
  295. </section>
  296. </section>
  297. </section>
  298. </section>
  299. </template>
  300. <style lang="scss" scoped>
  301. </style>