TerrainDeVie.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  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. import CartoucheLayout from '@components/layout/CartoucheLayout.vue';
  11. import Entite from '@components/contents/Entite.vue';
  12. import VueSlider from 'vue-slider-component'
  13. import 'vue-slider-component/theme/default.css'
  14. import SvgIcon from '@jamescoyle/vue-icon';
  15. import { mdiChevronRight } from '@mdi/js';
  16. import { mdiChevronDown } from '@mdi/js';
  17. export default {
  18. props: ['cid', 'eid'],
  19. data(){
  20. return {
  21. concernement: null,
  22. entite: null,
  23. history_value: 0,
  24. history_slider_ops: null,
  25. infos_opened: false,
  26. chevronright_path: mdiChevronRight,
  27. chevrondown_path: mdiChevronDown,
  28. }
  29. },
  30. computed: {
  31. ...mapState(ConcernementsStore,['map_mode',
  32. 'opened_concernement',
  33. 'concernementsByID',
  34. 'ct_concernement',
  35. 'ct_entite']),
  36. ...mapState(UserStore,['name']),
  37. created(){
  38. let d = new Date(this.concernement.created);
  39. console.log('d', d);
  40. return d.toLocaleDateString("fr-FR");//.toISOString().split('T')[0];
  41. },
  42. changed(){
  43. let d = new Date(this.concernement.changed);
  44. console.log('d', d);
  45. return d.toLocaleDateString("fr-FR");//.toISOString().split('T')[0];
  46. },
  47. display_concernement(){
  48. return this.ct_concernement && !this.entite && this.map_mode !== 'puissancedagir' && this.map_mode !== 'doleancer';
  49. }
  50. },
  51. created () {
  52. this.concernement = this.concernementsByID[this.cid];
  53. console.log(`terraindevie created, cid: ${this.cid}, eid: ${this.eid}, this.concernement:`, this.concernement);
  54. //entite
  55. if (this.eid) {
  56. this.loadEntite()
  57. }
  58. // revisions
  59. let data=[];
  60. this.concernement.revisions.forEach(rev => {
  61. if (rev.entites.length > 3) {
  62. let d = new Date(rev.changed);
  63. data.push({
  64. 'id': rev.revision_id,
  65. 'changed': d.toLocaleDateString("fr-FR")
  66. })
  67. this.history_value = Math.max(this.history_value, parseInt(rev.revision_id));
  68. }
  69. });
  70. if (data.length > 1) {
  71. this.history_slider_ops = {
  72. dotSize:10,
  73. data: data,
  74. 'data-value': 'id',
  75. 'data-label': 'changed',
  76. adsorb: true,
  77. 'hide-label': true
  78. }
  79. } else {
  80. this.history_slider_ops = null;
  81. }
  82. },
  83. watch: {
  84. history_value: {
  85. handler (n, o) {
  86. // console.log(`TerrainDeVie watch history_value o:${o}, n:${n}`);
  87. this.setActiveRevision(this.cid, n);
  88. },
  89. deep: true
  90. },
  91. cid: {
  92. handler (n,o) {
  93. console.log(`TerrainDeVie watch cid o:${o}, n:${n}`);
  94. if (n) {
  95. this.concernement = this.concernementsByID[n];
  96. }
  97. },
  98. deep: true
  99. },
  100. eid: {
  101. handler (n, o) {
  102. console.log(`TerrainDeVie watch eid o:${o}, n:${n}`);
  103. if (n) {
  104. this.loadEntite()
  105. }else{
  106. this.entite = null;
  107. }
  108. },
  109. deep: true
  110. }
  111. },
  112. methods: {
  113. ...mapActions(ConcernementsStore, ['setActiveRevision']), // 'loadConcernementsRevisions'
  114. onClickInfos(){
  115. this.infos_opened = !this.infos_opened;
  116. },
  117. loadEntite(){
  118. const ast = gql`{
  119. entite (id: ${this.eid}) {
  120. ...EntiteFields
  121. }
  122. }
  123. ${EntiteFields}
  124. `
  125. console.log('ast', ast);
  126. GQL.post('', { query: print(ast) })
  127. .then(({data: { data: { entite }}}) => {
  128. console.log('load entite loaded', entite)
  129. this.entite = entite
  130. })
  131. .catch(error => {
  132. console.warn('Issue with load entite', error)
  133. })
  134. }
  135. },
  136. components: {
  137. CartoucheLayout,
  138. Entite,
  139. VueSlider,
  140. SvgIcon
  141. }
  142. }
  143. </script>
  144. <template>
  145. <CartoucheLayout :cid="cid">
  146. <template v-slot:header>
  147. <div class="entite">
  148. <!-- TODO update entite with revisions -->
  149. <span v-if="entite && concernement.entites_byid[eid].menacemaintien < 0" class="menacemaintient">est menacé par</span>
  150. <span v-if="entite && concernement.entites_byid[eid].menacemaintien > 0" class="menacemaintient">est maintenu par</span>
  151. <h3 v-if="entite" class="entite-title">{{ entite.title }}</h3>
  152. </div>
  153. </template>
  154. <template v-slot:main>
  155. <!-- concernement -->
  156. <template v-if="!entite">
  157. <section v-if="concernement.description" class="description">
  158. <label v-if="ct_concernement">{{ ct_concernement.field_description.description }}</label>
  159. <p v-html="concernement.description"/>
  160. <!-- <p>{{ concernement.description }}</p> -->
  161. </section>
  162. <section v-if="concernement.caillou" class="caillou">
  163. <label v-if="ct_concernement">{{ ct_concernement.field_caillou.description }}</label>
  164. <!-- <p v-html="concernement.caillou"/> -->
  165. <p>{{ concernement.caillou }}</p>
  166. </section>
  167. </template>
  168. <!-- entite -->
  169. <Entite v-if="entite" :concernement="concernement" :entite="entite" :eid="eid"/>
  170. </template>
  171. <template v-slot:footer>
  172. <section class="infos">
  173. <svg-icon
  174. type="mdi"
  175. :path="!infos_opened ? chevronright_path : chevrondown_path"
  176. class="open-btn"
  177. @click="onClickInfos"
  178. ></svg-icon>
  179. <div
  180. class="author info"
  181. @click="onClickInfos">
  182. <span>une enquête de</span> {{ concernement.author.username }}<br/>
  183. </div>
  184. <div class="wrapper" :class="{ 'opened': infos_opened }">
  185. <div class="info structure" v-if="concernement.author.structure.length"><span>avec</span> {{ concernement.author.structure[0].name }}<br/></div>
  186. <div class="info lieu" v-if="concernement.lieu.length"><span>à</span> {{ concernement.lieu[0].name }}<br/></div>
  187. <div class="info created"><span>démarrée le</span> {{ created }}<br/></div>
  188. <div class="info changed"><span>mise à jour le</span> {{ changed }}</div>
  189. <div class="info recit-colophon" v-if="concernement.recit_colophon" v-html="concernement.recit_colophon"/>
  190. </div>
  191. </section>
  192. <section class="sliders" v-if="history_slider_ops">
  193. <section class="historique" v-if="history_slider_ops">
  194. <label>Historique</label>
  195. <!-- <h3>{{ history_value }}</h3> -->
  196. <vue-slider
  197. ref="slider"
  198. v-model="history_value"
  199. v-bind="history_slider_ops"
  200. ></vue-slider>
  201. </section>
  202. </section>
  203. </template>
  204. </CartoucheLayout>
  205. </template>
  206. <style lang="css">
  207. span.entite-point{
  208. color: #01ffe2;
  209. }
  210. </style>