CartoucheLayout.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <script>
  2. import { mapActions, mapState } from 'pinia'
  3. import { ConcernementsStore } from '@stores/concernements'
  4. import SvgIcon from '@jamescoyle/vue-icon';
  5. import { mdiHeadphones } from '@mdi/js';
  6. import ContentEditable from '@components/editable/ContentEditable.vue';
  7. export default {
  8. props: ['cid'],
  9. emits: ['main_scrolled'],
  10. data(){
  11. return {
  12. headphones_path: mdiHeadphones,
  13. mainscrolled: false,
  14. headerreduced: false,
  15. }
  16. },
  17. created () {
  18. console.log('Cartouch layout created', this.cid);
  19. this.concernement = this.concernementsByID[this.cid];
  20. console.log('can_update', this.concernement.can_update);
  21. },
  22. mounted () {
  23. // console.log('cartouche layout mounted', this);
  24. this.$refs.cartouche_main.addEventListener('scroll', (event) => {
  25. console.log('main is scrolling', event);
  26. let $main = event.target;
  27. let scrolled = $main.scrollTop > 0;
  28. this.$emit('main_scrolled', scrolled);
  29. // TODO how to make this failsafe limit responsive ?
  30. if(scrolled && $main.scrollHeight > 700){
  31. this.headerreduced = true;
  32. } else {
  33. this.headerreduced = false;
  34. }
  35. })
  36. },
  37. computed: {
  38. ...mapState(ConcernementsStore,['concernementsByID', 'opened_concernement', 'ct_concernement']),
  39. },
  40. watch: {
  41. cid: {
  42. handler (n,o) {
  43. console.log(`TerrainDeVie watch cid o:${o}, n:${n}`);
  44. if (n) {
  45. this.concernement = this.concernementsByID[n];
  46. console.log('can_update', this.concernement.can_update);
  47. }
  48. },
  49. deep: true
  50. }
  51. },
  52. methods: {
  53. ...mapActions(ConcernementsStore,['setMapMode']),
  54. },
  55. components: {
  56. SvgIcon,
  57. ContentEditable
  58. }
  59. }
  60. </script>
  61. <template>
  62. <header ref="cartouche_header">
  63. <div class="concernement-cartouche-icons">
  64. <label :class="{ hidden: headerreduced }">{{ ct_concernement.title.description }}</label>
  65. <ContentEditable
  66. tag="h2"
  67. :value="concernement.title"
  68. :class="{ ellipsed: headerreduced }"
  69. :contenteditable="concernement.can_update"
  70. :data="{
  71. entitytype: 'node',
  72. bundle: 'concernement',
  73. nid: this.concernement.id,
  74. field: {field_name: 'title', value:'value'}
  75. }" />
  76. <!-- <nav class="icons">
  77. <ul>
  78. <li v-if="concernement.has_recit" >
  79. <svg-icon type="mdi" :path="headphones_path"></svg-icon>
  80. </li>
  81. <li>
  82. <a href="#terraindevie" @click="setMapMode('terraindevie')"><span class="icon terraindevie"></span></a>
  83. </li>
  84. <li v-if="concernement.has_puissancedagir" >
  85. <a href="#puissanceagir" @click="setMapMode('puissancedagir')"><span class="icon puissancedagir"></span></a>
  86. </li>
  87. <li v-if="concernement.has_proximite" >
  88. <a href="#proximite" @click="setMapMode('proximite')"><span class="icon proximite"></span></a>
  89. </li>
  90. <li v-if="concernement.has_superposition" >
  91. <a href="#superposition" @click="setMapMode('superposition')"><span class="icon superposition"></span></a>
  92. </li>
  93. <li v-if="concernement.has_agissantes" >
  94. <a href="#action" @click="setMapMode('action')"><span class="icon action"></span></a>
  95. </li>
  96. <li v-if="concernement.has_doleance" >
  97. <a href="#doleancer" @click="setMapMode('doleancer')"><span class="icon doleancer"></span></a>
  98. </li>
  99. </ul>
  100. </nav> -->
  101. </div>
  102. <slot name="header"></slot>
  103. </header>
  104. <main ref="cartouche_main">
  105. <slot name="main"></slot>
  106. </main>
  107. <footer ref="cartouche_footer">
  108. <slot name="footer"></slot>
  109. </footer>
  110. </template>