TerrainDeVie.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  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. details_value: 1,
  26. details_slider_ops: null,
  27. infos_opened: false,
  28. chevronright_path: mdiChevronRight,
  29. chevrondown_path: mdiChevronDown,
  30. headerreduced: false,
  31. }
  32. },
  33. computed: {
  34. ...mapState(ConcernementsStore,['map_mode',
  35. 'opened_concernement',
  36. 'concernementsByID',
  37. 'ct_concernement',
  38. 'ct_entite',
  39. 'detailsZoomValue']),
  40. ...mapState(UserStore,['name']),
  41. created(){
  42. let d = new Date(this.concernement.created);
  43. console.log('d', d);
  44. return d.toLocaleDateString("fr-FR");//.toISOString().split('T')[0];
  45. },
  46. changed(){
  47. let d = new Date(this.concernement.changed);
  48. console.log('d', d);
  49. return d.toLocaleDateString("fr-FR");//.toISOString().split('T')[0];
  50. },
  51. display_concernement(){
  52. return this.ct_concernement && !this.entite && this.map_mode !== 'puissancedagir' && this.map_mode !== 'doleancer';
  53. },
  54. entity_title_label(){
  55. let menacemaintien_str;
  56. if (this.concernement.entites_byid[this.eid].menacemaintien > 0) {
  57. menacemaintien_str = 'maintenu';
  58. } else {
  59. menacemaintien_str = 'menacé';
  60. }
  61. let actuelfuture_str;
  62. if (this.concernement.entites_byid[this.eid].actuelfuture > 0) {
  63. actuelfuture_str = 'sera';
  64. } else {
  65. actuelfuture_str = 'est';
  66. }
  67. return `Pouvez-vous nommer par qui ou par quoi cet élément ${actuelfuture_str} ${menacemaintien_str} ?`;
  68. }
  69. },
  70. created () {
  71. this.concernement = this.concernementsByID[this.cid];
  72. console.log(`terraindevie created, cid: ${this.cid}, eid: ${this.eid}, this.concernement:`, this.concernement);
  73. //entite
  74. if (this.eid) {
  75. this.loadEntite()
  76. }
  77. // revisions
  78. let data=[];
  79. if (this.concernement && this.concernement.revisions) {
  80. this.concernement.revisions.forEach(rev => {
  81. if (rev.entites.length > 3) {
  82. let d = new Date(rev.changed);
  83. data.push({
  84. 'id': rev.revision_id,
  85. 'changed': d.toLocaleDateString("fr-FR")
  86. })
  87. this.history_value = Math.max(this.history_value, parseInt(rev.revision_id));
  88. }
  89. });
  90. }
  91. if (data.length > 1) {
  92. this.history_slider_ops = {
  93. dotSize:10,
  94. data: data,
  95. 'data-value': 'id',
  96. 'data-label': 'changed',
  97. adsorb: true,
  98. 'hide-label': true
  99. }
  100. } else {
  101. this.history_slider_ops = null;
  102. }
  103. // details
  104. this.details_slider_ops = {
  105. min: 1,
  106. max: 4,
  107. interval: 0.05,
  108. 'hide-label': true,
  109. tooltip: 'none',
  110. dotSize:10,
  111. }
  112. },
  113. // mounted(){
  114. // console.log('terrain de vie mounted', this);
  115. // // this.$refs.cartouche_main.addEventListener('scroll', (event) => {
  116. // // console.log('main is scrolling', event);
  117. // // })
  118. // },
  119. watch: {
  120. history_value: {
  121. handler (n, o) {
  122. // console.log(`TerrainDeVie watch history_value o:${o}, n:${n}`);
  123. this.setActiveRevision(this.cid, n);
  124. },
  125. deep: true
  126. },
  127. details_value: {
  128. handler (n, o) {
  129. // console.log(`TerrainDeVie watch history_value o:${o}, n:${n}`);
  130. this.setDetailsZoomValue(n);
  131. },
  132. deep: true
  133. },
  134. detailsZoomValue: {
  135. handler (n, o) {
  136. // console.log(`TerrainDeVie watch history_value o:${o}, n:${n}`);
  137. this.details_value = n;
  138. },
  139. deep: true
  140. },
  141. cid: {
  142. handler (n,o) {
  143. console.log(`TerrainDeVie watch cid o:${o}, n:${n}`);
  144. if (n) {
  145. this.concernement = this.concernementsByID[n];
  146. }
  147. },
  148. deep: true
  149. },
  150. eid: {
  151. handler (n, o) {
  152. console.log(`TerrainDeVie watch eid o:${o}, n:${n}`);
  153. if (n) {
  154. this.loadEntite()
  155. }else{
  156. this.entite = null;
  157. }
  158. },
  159. deep: true
  160. }
  161. },
  162. methods: {
  163. ...mapActions(ConcernementsStore, ['setActiveRevision', 'setDetailsZoomValue']), // 'loadConcernementsRevisions'
  164. onClickInfos(){
  165. this.infos_opened = !this.infos_opened;
  166. },
  167. loadEntite(){
  168. const ast = gql`{
  169. entite (id: ${this.eid}) {
  170. ...EntiteFields
  171. }
  172. }
  173. ${EntiteFields}
  174. `
  175. console.log('ast', ast);
  176. GQL.post('', { query: print(ast) })
  177. .then(({data: { data: { entite }}}) => {
  178. console.log('load entite loaded', entite)
  179. this.entite = entite
  180. })
  181. .catch(error => {
  182. console.warn('Issue with load entite', error)
  183. })
  184. },
  185. onMainScrolled(scrolled){
  186. console.log('this.$refs', this.$refs);
  187. let cartouche_main = this.$refs.cartouche_layout.$refs.cartouche_main;
  188. console.log('cartouche_main', cartouche_main);
  189. if(scrolled && cartouche_main.scrollHeight > 600){
  190. this.headerreduced = true;
  191. } else {
  192. this.headerreduced = false;
  193. }
  194. }
  195. },
  196. components: {
  197. CartoucheLayout,
  198. Entite,
  199. VueSlider,
  200. SvgIcon
  201. }
  202. }
  203. </script>
  204. <template>
  205. <CartoucheLayout ref="cartouche_layout" :cid="cid" @main_scrolled="onMainScrolled">
  206. <template v-slot:header>
  207. <div class="entite">
  208. <!-- TODO update entite with revisions -->
  209. <label v-if="entite" class="menacemaintient" :class="{ hidden: headerreduced}">{{ entity_title_label }}</label>
  210. <h3 v-if="entite" class="entite-title">{{ entite.title }}</h3>
  211. </div>
  212. </template>
  213. <template v-slot:main>
  214. <!-- concernement -->
  215. <template v-if="!entite">
  216. <section v-if="concernement.description" class="description">
  217. <label v-if="ct_concernement">{{ ct_concernement.field_description.description }}</label>
  218. <p v-html="concernement.description"/>
  219. <!-- <p>{{ concernement.description }}</p> -->
  220. </section>
  221. <section v-if="concernement.caillou" class="caillou">
  222. <label v-if="ct_concernement">{{ ct_concernement.field_caillou.description }}</label>
  223. <!-- <p v-html="concernement.caillou"/> -->
  224. <p>{{ concernement.caillou }}</p>
  225. </section>
  226. </template>
  227. <!-- entite -->
  228. <Entite v-if="entite" :concernement="concernement" :entite="entite" :eid="eid"/>
  229. </template>
  230. <template v-slot:footer>
  231. <section class="infos">
  232. <svg-icon
  233. type="mdi"
  234. :path="!infos_opened ? chevronright_path : chevrondown_path"
  235. class="open-btn"
  236. @click="onClickInfos"
  237. ></svg-icon>
  238. <div
  239. class="author info"
  240. @click="onClickInfos">
  241. <span>une enquête de</span> {{ concernement.author.username }}<br/>
  242. </div>
  243. <div class="wrapper" :class="{ 'opened': infos_opened }">
  244. <div class="info structure" v-if="concernement.author.structure.length"><span>avec</span> {{ concernement.author.structure[0].name }}<br/></div>
  245. <div class="info lieu" v-if="concernement.lieu.length"><span>à</span> {{ concernement.lieu[0].name }}<br/></div>
  246. <div class="info created"><span>démarrée le</span> {{ created }}<br/></div>
  247. <div class="info changed"><span>mise à jour le</span> {{ changed }}</div>
  248. <div class="info recit-colophon" v-if="concernement.recit_colophon" v-html="concernement.recit_colophon"/>
  249. </div>
  250. </section>
  251. <section class="sliders" v-if="history_slider_ops || details_slider_ops">
  252. <section class="historique" v-if="history_slider_ops">
  253. <label>Historique</label>
  254. <!-- <h3>{{ history_value }}</h3> -->
  255. <vue-slider
  256. ref="slider"
  257. v-model="history_value"
  258. v-bind="history_slider_ops"
  259. ></vue-slider>
  260. </section>
  261. <section class="details" v-if="details_slider_ops && map_mode === 'terraindevie'">
  262. <label>Détails</label>
  263. <!-- <h3>{{ details_value }}</h3> -->
  264. <vue-slider
  265. ref="details_slider"
  266. v-model="details_value"
  267. v-bind="details_slider_ops"
  268. ></vue-slider>
  269. </section>
  270. </section>
  271. </template>
  272. </CartoucheLayout>
  273. </template>
  274. <style lang="css">
  275. span.entite-point{
  276. color: #01ffe2;
  277. }
  278. </style>