CartoucheLayout.vue 3.2 KB

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