|
1 | 1 | <script setup> |
2 | | -import { ref } from "vue"; |
| 2 | +import { ref, onMounted, onBeforeUnmount } from "vue"; |
3 | 3 | import vClickOutside from '../directives/vClickOutside'; |
4 | 4 | import BaseIcon from "./BaseIcon.vue"; |
5 | 5 |
|
@@ -51,10 +51,18 @@ const props = defineProps({ |
51 | 51 | }, |
52 | 52 | uid: { |
53 | 53 | type: String, |
| 54 | + }, |
| 55 | + hasFullscreen: { |
| 56 | + type: Boolean, |
| 57 | + default: false |
| 58 | + }, |
| 59 | + chartElement: { |
| 60 | + type: HTMLElement, |
| 61 | + default: null |
54 | 62 | } |
55 | 63 | }); |
56 | 64 |
|
57 | | -const emit = defineEmits(['generatePdf', 'generateCsv', 'generateImage', 'toggleTable', 'toggleLabels', 'toggleSort']); |
| 65 | +const emit = defineEmits(['generatePdf', 'generateCsv', 'generateImage', 'toggleTable', 'toggleLabels', 'toggleSort', 'toggleFullscreen']); |
58 | 66 |
|
59 | 67 | function generatePdf() { |
60 | 68 | emit('generatePdf'); |
@@ -106,6 +114,38 @@ function toggleSort() { |
106 | 114 | emit('toggleSort') |
107 | 115 | } |
108 | 116 |
|
| 117 | +const isFullscreen = ref(false); |
| 118 | +
|
| 119 | +function toggleFullscreen(state) { |
| 120 | + if(!props.chartElement) return; |
| 121 | + if(state === "in") { |
| 122 | + isFullscreen.value = true; |
| 123 | + props.chartElement.requestFullscreen(); |
| 124 | + emit('toggleFullscreen', true) |
| 125 | + }else { |
| 126 | + isFullscreen.value = false; |
| 127 | + document.exitFullscreen(); |
| 128 | + emit('toggleFullscreen', false) |
| 129 | + } |
| 130 | +} |
| 131 | +
|
| 132 | +function fullscreenchanged(event) { |
| 133 | + if (document.fullscreenElement) { |
| 134 | + isFullscreen.value = true; |
| 135 | + } else { |
| 136 | + isFullscreen.value = false; |
| 137 | + } |
| 138 | +} |
| 139 | +
|
| 140 | +onMounted(() => { |
| 141 | + document.addEventListener('fullscreenchange', fullscreenchanged) |
| 142 | +}) |
| 143 | +
|
| 144 | +onBeforeUnmount(() => { |
| 145 | + document.removeEventListener('fullscreenchange', fullscreenchanged) |
| 146 | +}) |
| 147 | +
|
| 148 | +
|
109 | 149 | </script> |
110 | 150 |
|
111 | 151 | <template> |
@@ -141,6 +181,11 @@ function toggleSort() { |
141 | 181 | <BaseIcon name="sort" :stroke="color"/> |
142 | 182 | </button> |
143 | 183 |
|
| 184 | + <button tabindex="0" v-if="hasFullscreen" data-cy="user-options-sort" class="vue-ui-user-options-button" @click="toggleSort"> |
| 185 | + <BaseIcon v-if="isFullscreen" name="exitFullscreen" :stroke="color" @click="toggleFullscreen('out')"/> |
| 186 | + <BaseIcon v-if="!isFullscreen" name="fullscreen" :stroke="color" @click="toggleFullscreen('in')"/> |
| 187 | + </button> |
| 188 | + |
144 | 189 | </div> |
145 | 190 | </div> |
146 | 191 | </template> |
|
0 commit comments