@saooti/octopus-sdk 40.2.19 → 41.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/index.ts +2 -1
  2. package/package.json +4 -3
  3. package/src/App.vue +71 -95
  4. package/src/components/composable/player/usePlayerLive.ts +13 -4
  5. package/src/components/composable/player/usePlayerLogic.ts +6 -6
  6. package/src/components/composable/player/usePlayerVast.ts +7 -7
  7. package/src/components/composable/podcasts/usePodcastView.ts +3 -3
  8. package/src/components/composable/route/useAdvancedParamInit.ts +1 -1
  9. package/src/components/composable/route/useRouteUpdateParams.ts +4 -4
  10. package/src/components/composable/route/useSimplePageParam.ts +15 -8
  11. package/src/components/composable/useInit.ts +2 -2
  12. package/src/components/composable/useMetaTitleWatch.ts +2 -2
  13. package/src/components/display/accessibility/AccessibilityModal.vue +56 -68
  14. package/src/components/display/categories/CategoryChooser.vue +144 -145
  15. package/src/components/display/categories/CategoryFilter.vue +172 -198
  16. package/src/components/display/categories/CategoryList.vue +122 -147
  17. package/src/components/display/comments/CommentInput.vue +100 -122
  18. package/src/components/display/comments/CommentList.vue +169 -191
  19. package/src/components/display/comments/CommentName.vue +35 -45
  20. package/src/components/display/comments/CommentParentInfo.vue +28 -34
  21. package/src/components/display/comments/CommentPlayer.vue +38 -50
  22. package/src/components/display/comments/CommentSection.vue +85 -103
  23. package/src/components/display/comments/item/CommentBasicView.vue +48 -61
  24. package/src/components/display/comments/item/CommentItem.vue +104 -115
  25. package/src/components/display/comments/item/CommentMoreActions.vue +174 -189
  26. package/src/components/display/comments/item/CommentMoreActionsAdmin.vue +1 -3
  27. package/src/components/display/comments/like/LikeButton.vue +36 -41
  28. package/src/components/display/comments/like/LikeSection.vue +128 -136
  29. package/src/components/display/comments/modal/CheckIdentityModal.vue +35 -40
  30. package/src/components/display/comments/modal/EditCommentModal.vue +72 -78
  31. package/src/components/display/comments/modal/RecaptchaModal.vue +58 -63
  32. package/src/components/display/comments/modal/ReportAbuseModal.vue +59 -66
  33. package/src/components/display/edit/EditBox.vue +9 -8
  34. package/src/components/display/edit/EditBoxRadio.vue +1 -5
  35. package/src/components/display/emission/EmissionInlineList.vue +82 -97
  36. package/src/components/display/emission/EmissionItem.vue +57 -69
  37. package/src/components/display/emission/EmissionList.vue +189 -218
  38. package/src/components/display/emission/EmissionPlayerItem.vue +47 -64
  39. package/src/components/display/emission/EmissionPresentationItem.vue +44 -54
  40. package/src/components/display/emission/EmissionPresentationList.vue +51 -61
  41. package/src/components/display/filter/AdvancedSearch.vue +151 -176
  42. package/src/components/display/filter/CategorySearchFilter.vue +43 -46
  43. package/src/components/display/filter/DateFilter.vue +76 -91
  44. package/src/components/display/filter/MonetizableFilter.vue +27 -30
  45. package/src/components/display/filter/ProductorSearch.vue +87 -90
  46. package/src/components/display/filter/RubriqueChoice.vue +58 -63
  47. package/src/components/display/filter/RubriqueFilter.vue +154 -169
  48. package/src/components/display/filter/SearchOrder.vue +35 -35
  49. package/src/components/display/list/ListPaginate.vue +72 -93
  50. package/src/components/display/list/PaginateParams.vue +36 -40
  51. package/src/components/display/list/PaginateSection.vue +113 -124
  52. package/src/components/display/list/SwiperList.vue +97 -109
  53. package/src/components/display/live/CountDown.vue +15 -9
  54. package/src/components/display/live/CountdownOctopus.vue +16 -10
  55. package/src/components/display/live/LiveHorizontalList.vue +95 -103
  56. package/src/components/display/live/LiveItem.vue +64 -73
  57. package/src/components/display/live/LiveList.vue +125 -137
  58. package/src/components/display/live/RadioCurrently.vue +66 -73
  59. package/src/components/display/live/RadioImage.vue +39 -50
  60. package/src/components/display/live/RadioItem.vue +9 -14
  61. package/src/components/display/live/RadioList.vue +39 -53
  62. package/src/components/display/live/RadioPlanning.vue +210 -222
  63. package/src/components/display/organisation/OrganisationChooser.vue +116 -122
  64. package/src/components/display/organisation/OrganisationChooserLight.vue +44 -52
  65. package/src/components/display/participant/ParticipantInlineList.vue +42 -58
  66. package/src/components/display/participant/ParticipantItem.vue +66 -74
  67. package/src/components/display/participant/ParticipantList.vue +116 -141
  68. package/src/components/display/playlist/PlaylistItem.vue +33 -46
  69. package/src/components/display/playlist/PlaylistList.vue +115 -144
  70. package/src/components/display/playlist/PodcastList.vue +90 -103
  71. package/src/components/display/playlist/PodcastPlaylistInlineList.vue +58 -70
  72. package/src/components/display/podcastmaker/PodcastmakerHeader.vue +21 -22
  73. package/src/components/display/podcasts/AnimatorsItem.vue +15 -16
  74. package/src/components/display/podcasts/DownloadPodcastButton.vue +21 -29
  75. package/src/components/display/podcasts/ParticipantDescription.vue +22 -24
  76. package/src/components/display/podcasts/PodcastFilterList.vue +62 -56
  77. package/src/components/display/podcasts/PodcastImage.vue +96 -99
  78. package/src/components/display/podcasts/PodcastInlineList.vue +30 -28
  79. package/src/components/display/podcasts/PodcastInlineListTemplate.vue +107 -114
  80. package/src/components/display/podcasts/PodcastIsPlaying.vue +4 -12
  81. package/src/components/display/podcasts/PodcastItem.vue +48 -63
  82. package/src/components/display/podcasts/PodcastItemInfo.vue +19 -35
  83. package/src/components/display/podcasts/PodcastList.vue +182 -206
  84. package/src/components/display/podcasts/PodcastModuleBox.vue +100 -137
  85. package/src/components/display/podcasts/PodcastPlannedSpinner.vue +4 -6
  86. package/src/components/display/podcasts/PodcastPlayBar.vue +50 -61
  87. package/src/components/display/podcasts/PodcastPlayBasicButton.vue +38 -41
  88. package/src/components/display/podcasts/PodcastPlayButton.vue +164 -175
  89. package/src/components/display/podcasts/PodcastRawTranscript.vue +69 -80
  90. package/src/components/display/podcasts/PodcastRubriqueList.vue +35 -38
  91. package/src/components/display/podcasts/PodcastSwiperList.vue +100 -110
  92. package/src/components/display/podcasts/TagList.vue +48 -50
  93. package/src/components/display/podcasts/VideoModuleBox.vue +13 -24
  94. package/src/components/display/rubriques/RubriqueChooser.vue +135 -140
  95. package/src/components/display/rubriques/RubriqueList.vue +140 -160
  96. package/src/components/display/sharing/ChooseEpisodesNumber.vue +34 -33
  97. package/src/components/display/sharing/FormatSwitch.vue +16 -11
  98. package/src/components/display/sharing/PlayerAnonymousModal.vue +24 -27
  99. package/src/components/display/sharing/PlayerCommonParameters.vue +20 -13
  100. package/src/components/display/sharing/PlayerParameters.vue +69 -71
  101. package/src/components/display/sharing/QrCode.vue +55 -67
  102. package/src/components/display/sharing/ShareAnonymous.vue +160 -178
  103. package/src/components/display/sharing/ShareDistribution.vue +103 -117
  104. package/src/components/display/sharing/ShareNewsletter.vue +154 -161
  105. package/src/components/display/sharing/SharePlayer.vue +273 -295
  106. package/src/components/display/sharing/SharePlayerColors.vue +25 -16
  107. package/src/components/display/sharing/SharePlayerRadio.vue +61 -69
  108. package/src/components/display/sharing/SharePlayerTypes.vue +176 -176
  109. package/src/components/display/sharing/ShareSocialsButtons.vue +63 -75
  110. package/src/components/display/sharing/SubscribeButtons.vue +184 -207
  111. package/src/components/display/studio/RecordingItemButton.vue +1 -4
  112. package/src/components/form/ClassicCheckbox.vue +26 -30
  113. package/src/components/form/ClassicContentEditable.vue +37 -33
  114. package/src/components/form/ClassicCopyButton.vue +40 -44
  115. package/src/components/form/ClassicDatePicker.vue +114 -114
  116. package/src/components/form/ClassicEmojiPicker.vue +20 -28
  117. package/src/components/form/ClassicInputText.vue +116 -120
  118. package/src/components/form/ClassicLoading.vue +7 -12
  119. package/src/components/form/ClassicMultiselect.vue +115 -117
  120. package/src/components/form/ClassicRadio.vue +21 -16
  121. package/src/components/form/ClassicRadioLabel.vue +23 -22
  122. package/src/components/form/ClassicSearch.vue +24 -19
  123. package/src/components/form/ClassicSelect.vue +47 -38
  124. package/src/components/form/ClassicWysiwyg.vue +116 -123
  125. package/src/components/icons/AmazonMusicIcon.vue +7 -10
  126. package/src/components/icons/ApplePodcastIcon.vue +7 -11
  127. package/src/components/icons/BlueSkyIcon.vue +8 -11
  128. package/src/components/icons/DeezerIcon.vue +8 -11
  129. package/src/components/icons/EditFtpIcon.vue +8 -11
  130. package/src/components/icons/IHeartIcon.vue +8 -11
  131. package/src/components/icons/PlayVideoIcon.vue +7 -10
  132. package/src/components/icons/PlayerFmIcon.vue +7 -10
  133. package/src/components/icons/PocketCastIcon.vue +8 -11
  134. package/src/components/icons/PodcastAddictIcon.vue +7 -10
  135. package/src/components/icons/RadiolineIcon.vue +8 -11
  136. package/src/components/icons/TuninIcon.vue +8 -11
  137. package/src/components/icons/XIcon.vue +7 -10
  138. package/src/components/misc/AcpmImage.vue +6 -7
  139. package/src/components/misc/ClassicAccordion.vue +26 -31
  140. package/src/components/misc/ClassicLazy.vue +86 -90
  141. package/src/components/misc/ClassicNav.vue +16 -20
  142. package/src/components/misc/ClassicPopover.vue +271 -282
  143. package/src/components/misc/ClassicSpinner.vue +5 -27
  144. package/src/components/misc/ErrorMessage.vue +11 -12
  145. package/src/components/misc/FooterGarSection.vue +33 -41
  146. package/src/components/misc/FooterSection.vue +94 -131
  147. package/src/components/misc/HomeDropdown.vue +83 -105
  148. package/src/components/misc/MobileMenu.vue +101 -111
  149. package/src/components/misc/ProgressBar.vue +53 -62
  150. package/src/components/misc/TopBar.vue +98 -120
  151. package/src/components/misc/TopBarMainContent.vue +114 -133
  152. package/src/components/misc/modal/ClassicModal.vue +40 -33
  153. package/src/components/misc/modal/ClassicModalInBody.vue +34 -28
  154. package/src/components/misc/modal/ClipboardModal.vue +27 -30
  155. package/src/components/misc/modal/ContractPreviewModal.vue +64 -62
  156. package/src/components/misc/modal/MessageModal.vue +50 -47
  157. package/src/components/misc/modal/NewsletterModal.vue +30 -31
  158. package/src/components/misc/modal/QrCodeModal.vue +21 -21
  159. package/src/components/misc/modal/ShareModalPlayer.vue +43 -52
  160. package/src/components/misc/player/PlayerCompact.vue +6 -4
  161. package/src/components/misc/player/PlayerComponent.vue +8 -9
  162. package/src/components/misc/player/PlayerLarge.vue +9 -8
  163. package/src/components/misc/player/ads/AdsProgressBar.vue +8 -11
  164. package/src/components/misc/player/ads/AdsSkipButton.vue +24 -30
  165. package/src/components/misc/player/chaptering/ChapteringModal.vue +44 -54
  166. package/src/components/misc/player/chaptering/PlayerChaptering.vue +50 -62
  167. package/src/components/misc/player/elements/PlayerImage.vue +51 -57
  168. package/src/components/misc/player/elements/PlayerPlayButton.vue +81 -92
  169. package/src/components/misc/player/elements/PlayerSpeedButton.vue +23 -27
  170. package/src/components/misc/player/elements/PlayerTitle.vue +85 -111
  171. package/src/components/misc/player/progressbar/PlayerProgressBar.vue +18 -29
  172. package/src/components/misc/player/progressbar/PodcastProgressBar.vue +45 -56
  173. package/src/components/misc/player/radio/RadioHistory.vue +80 -99
  174. package/src/components/misc/player/radio/RadioProgressBar.vue +43 -54
  175. package/src/components/misc/player/video/PlayerVideo.vue +27 -40
  176. package/src/components/misc/player/video/PlayerVideoDigiteka.vue +32 -37
  177. package/src/components/misc/player/video/PlayerVideoHls.vue +199 -198
  178. package/src/components/misc/player/video/PlayerYoutubeEmbed.vue +10 -12
  179. package/src/components/pages/CategoryPage.vue +28 -33
  180. package/src/components/pages/EmissionPage.vue +113 -132
  181. package/src/components/pages/EmissionsPage.vue +2 -0
  182. package/src/components/pages/Error403Page.vue +21 -20
  183. package/src/components/pages/HomePage.vue +91 -100
  184. package/src/components/pages/LivesPage.vue +35 -37
  185. package/src/components/pages/MapPage.vue +209 -241
  186. package/src/components/pages/PageLogout.vue +8 -11
  187. package/src/components/pages/PageNotFound.vue +9 -5
  188. package/src/components/pages/ParticipantPage.vue +96 -110
  189. package/src/components/pages/ParticipantsPage.vue +3 -0
  190. package/src/components/pages/PlaylistPage.vue +112 -117
  191. package/src/components/pages/PlaylistsPage.vue +9 -2
  192. package/src/components/pages/PodcastPage.vue +224 -238
  193. package/src/components/pages/PodcastsPage.vue +9 -2
  194. package/src/components/pages/RadioPage.vue +56 -70
  195. package/src/components/pages/RubriquePage.vue +7 -3
  196. package/src/components/pages/SearchPage.vue +31 -36
  197. package/src/components/pages/TagPage.vue +11 -9
  198. package/src/components/pages/VideoPage.vue +14 -11
  199. package/src/helper/displayHelper.ts +1 -1
  200. package/src/helper/loadScript.ts +4 -4
  201. package/src/i18n.ts +2 -2
  202. package/src/main.ts +1 -1
  203. package/src/router/router.ts +17 -4
  204. package/src/stores/AuthStore.ts +12 -12
  205. package/src/stores/FilterStore.ts +1 -1
  206. package/src/stores/VastStore.ts +2 -2
  207. package/src/stores/class/general/player.ts +1 -0
  208. package/public/css/fonts/icomoon.eot +0 -0
  209. package/public/css/fonts/icomoon.svg +0 -113
  210. package/public/css/fonts/icomoon.ttf +0 -0
  211. package/public/css/fonts/icomoon.woff +0 -0
  212. package/public/css/fonts/icomoon.woff2 +0 -0
  213. package/public/css/fonts/style.css +0 -352
  214. package/sonarqube-scanner.js +0 -10
@@ -28,288 +28,277 @@
28
28
  </div>
29
29
  </template>
30
30
 
31
- <script lang="ts">
32
- import { defineComponent } from "vue";
33
- export default defineComponent({
34
- name: "ClassicPopover",
35
- props: {
36
- content: { type: String, default: "" },
37
- title: { type: String, default: "" },
38
- target: { type: String, required: true },
39
- disable: { type: Boolean, default: false },
40
- onlyClick: { type: Boolean, default: false },
41
- onlyMouse: { type: Boolean, default: false },
42
- isFixed: { type: Boolean, default: false },
43
- relativeClass: { type: String, default: undefined },
44
- leftPos: { type: Boolean, default: false },
45
- topPos: { type: Boolean, default: false },
46
- popoverClass: { type: String, default: undefined },
47
- isTopLayer: { type: Boolean, default: false },
48
- },
49
- emits: ["updateVisibility"],
50
- data() {
51
- return {
52
- show: false as boolean,
53
- isClick: false as boolean,
54
- posX: 0 as number,
55
- posY: 0 as number,
56
- targetElement: null as HTMLElement | null,
57
- overPopover: false as boolean,
58
- isTabAction: false as boolean,
59
- maxHeight: '80dvh' as string,
60
- clearTimeout: undefined as ReturnType<typeof setTimeout> | undefined,
61
- };
62
- },
63
- computed: {
64
- popoverId(): string {
65
- return "popover" + this.target;
66
- },
67
- positionInlineStyle(): string {
68
- return `left: ${this.posX}px; top: ${this.posY}px;max-height:${this.maxHeight}`;
69
- },
70
- displayPopover(): boolean{
71
- return this.show && !this.disable;
72
- },
73
- isTopLayerPopover(){
74
- return (this.isTopLayer || "octopus-modal"===this.relativeClass) && HTMLElement.prototype.hasOwnProperty("popover");
75
- },
76
- },
77
- watch: {
78
- displayPopover(){
79
- if(!this.isTopLayerPopover){
80
- return;
81
- }
82
- if(this.displayPopover){
83
- (this.$refs.popover as HTMLElement).showPopover();
84
- }else{
85
- (this.$refs.popover as HTMLElement).hidePopover();
86
- }
87
- },
88
- show() {
89
- this.$emit("updateVisibility", this.show);
90
- if (this.show) {
91
- window.addEventListener("keyup", this.addAccessibilityControl);
92
- } else {
93
- window.removeEventListener("keyup", this.addAccessibilityControl);
94
- }
95
- },
96
- },
97
- mounted() {
98
- this.init();
99
- },
100
- unmounted() {
101
- this.removeListeners();
102
- },
103
- methods: {
104
- addAccessibilityControl(event: KeyboardEvent): void {
105
- if (!event || null === event) {
106
- return;
107
- }
108
- if ("Tab" !== event.key) {
109
- return;
110
- }
111
- const myElement = event.target as HTMLElement;
112
- const parent = this.$refs.popover as HTMLElement;
113
- if (parent?.contains(myElement)) {
114
- this.isTabAction = true;
115
- } else {
116
- this.clearClick();
117
- }
118
- },
119
- init() {
120
- this.targetElement = document.getElementById(this.target);
121
- if (this.targetElement) {
122
- if (!this.onlyClick) {
123
- this.targetElement.addEventListener(
124
- "mouseenter",
125
- this.setPopoverData,
126
- );
127
- this.targetElement.addEventListener(
128
- "mouseleave",
129
- this.clearDataTimeout,
130
- );
131
- }
132
- if (!this.onlyMouse) {
133
- this.targetElement.addEventListener("click", this.setPopoverData);
134
- }
135
- this.targetElement.addEventListener("focusout", this.clearDataBlur);
136
- }
137
- },
138
- removeListeners() {
139
- if (this.targetElement) {
140
- if (!this.onlyClick) {
141
- this.targetElement.removeEventListener(
142
- "mouseenter",
143
- this.setPopoverData,
144
- );
145
- this.targetElement.removeEventListener(
146
- "mouseleave",
147
- this.clearDataTimeout,
148
- );
149
- }
150
- if (!this.onlyMouse) {
151
- this.targetElement.removeEventListener("click", this.setPopoverData);
152
- }
153
- this.targetElement.removeEventListener("focusout", this.clearDataBlur);
154
- }
155
- },
156
- handleClickEvent(){
157
- if (this.show && this.isClick) {
158
- this.isClick = false;
159
- this.clearData();
160
- return -1;
161
- }
162
- if (this.show && this.isTopLayerPopover) {
163
- (this.$refs.popover as HTMLElement).showPopover();
164
- this.isClick = true;
165
- return -1;
166
- }
167
- this.isClick = true;
168
- return 0;
169
- },
170
- handleLeftPos(rectElement: DOMRect, parentLeft: number, sizeAvailable: number, sizePopover: number){
171
- const elementRightRelative = rectElement.right - parentLeft;
172
- const hasPlaceRightButton = (sizeAvailable - (sizeAvailable - elementRightRelative)) > sizePopover;
173
- if(hasPlaceRightButton){
174
- this.posX =
175
- rectElement.right -
176
- parentLeft -
177
- sizePopover;
178
- }else{
179
- this.posX =parentLeft;
180
- }
181
- },
182
- handleRightPos(rectElement: DOMRect, parentLeft: number, sizeAvailable: number, sizePopover: number){
183
- const elementLeftRelative = rectElement.left - parentLeft;
184
- const hasPlaceRightButton = (sizeAvailable - elementLeftRelative) > sizePopover;
185
- if(hasPlaceRightButton){
186
- this.posX = elementLeftRelative;
187
- }else{
188
- this.posX = sizeAvailable - sizePopover + parentLeft;
189
- }
190
- },
191
- setPopoverData(e: MouseEvent | PointerEvent) {
192
- clearInterval(this.clearTimeout as unknown as number);
193
- if (this.disable || !e || !e.target) {
194
- return;
195
- }
196
- if ("click" === e.type && -1 === this.handleClickEvent()) {
197
- return;
198
- }
199
- this.show = true;
200
- let parentLeft = 0;
201
- let parentTop = 0;
202
- let parentScrollTop = 0;
203
- let parentBottom = 0;
204
- let parentWidth=0;
205
- if (!this.isTopLayerPopover && this.relativeClass) {
206
- const modalBody = document.getElementsByClassName(
207
- this.relativeClass,
208
- )[0];
209
- if (undefined === modalBody) {
210
- (this.$refs.popover as HTMLElement).style.display = "block";
211
- this.posX = 0;
212
- this.posY = 0;
213
- return;
214
- }
215
- const modalBodyRect = modalBody.getBoundingClientRect();
216
- parentLeft = modalBodyRect.left;
217
- parentTop = modalBodyRect.top;
218
- parentScrollTop = modalBody.scrollTop;
219
- parentBottom=modalBodyRect.bottom;
220
- parentWidth = modalBodyRect.width;
221
- }
222
- const rectElement = (e.target as HTMLElement).getBoundingClientRect();
223
- (this.$refs.popover as HTMLElement).style.display = "block";
224
- const sizePopover = (this.$refs.popover as HTMLElement).clientWidth;
225
- const sizeAvailable = parentWidth || window.innerWidth;
226
- if (this.leftPos) {
227
- this.handleLeftPos(rectElement, parentLeft, sizeAvailable, sizePopover);
228
- } else {
229
- this.handleRightPos(rectElement, parentLeft, sizeAvailable, sizePopover);
230
- }
231
- this.posX = Math.max(0, this.posX);
232
- const yPosParent = this.topPos ? rectElement.top : rectElement.bottom;
233
- const yGap = this.topPos
234
- ? -5 - (this.$refs.popover as HTMLElement).clientHeight
235
- : 5;
236
-
237
- this.posY =
238
- yPosParent +
239
- parentScrollTop -
240
- parentTop +
241
- (this.isFixed ? 0 : window.scrollY) +
242
- yGap;
243
- if(this.isTopLayerPopover){
244
- this.posY = Math.max(0, this.posY);
245
- this.maxHeight = (window.innerHeight - this.posY) + "px";
246
- }else if(this.relativeClass){
247
- this.maxHeight = (parentBottom- this.posY -parentTop) + "px";
248
- }else{
249
- this.maxHeight = '80dvh';
250
- }
251
- },
252
- clearDataBlur(e: FocusEvent) {
253
- if (this.isTabAction) {
254
- this.isTabAction = false;
255
- return;
256
- }
257
- //Exception timepicker in popover
258
- const result = Array.from(e?.target?.classList ?? []).findIndex((val) => { return val.startsWith("dp__");});
259
- if (-1!==result) {
260
- return;
261
- }
262
- if (!e.relatedTarget) {
263
- return this.clearClick();
264
- }
265
- const myElement = e.relatedTarget as HTMLElement;
266
- if (this.popoverId === myElement.id) {
267
- return;
268
- }
269
- const parent = this.$refs.popover as HTMLElement;
270
- if (null === parent || !parent.contains(myElement)) {
271
- return this.clearClick();
272
- }
273
- if (
274
- null === myElement.classList ||
275
- !myElement.classList.contains("octopus-dropdown-item")
276
- ) {
277
- return;
278
- }
279
- if (!(myElement as HTMLAnchorElement).href) {
280
- return this.clearClick();
281
- }
282
- if (myElement.classList.contains("reallink")) {
283
- myElement.click();
284
- } else {
285
- this.$router.push((myElement as HTMLAnchorElement).pathname);
286
- }
287
- this.$nextTick(() => {
288
- this.isClick = false;
289
- this.clearData();
290
- });
291
- },
292
- clearClick() {
293
- this.isClick = false;
294
- this.clearData();
295
- },
296
- clearDataTimeout() {
297
- this.clearTimeout = setTimeout(() => {
298
- if (!this.overPopover) {
299
- this.clearData();
300
- }
301
- this.clearTimeout=undefined;
302
- }, 500);
303
- },
304
- clearData() {
305
- if (this.isClick) {
306
- return;
307
- }
308
- this.show = false;
309
- this.posX = 0;
310
- this.posY = 0;
311
- },
312
- },
31
+ <script setup lang="ts">
32
+ import { computed, nextTick, onMounted, onUnmounted, Ref, ref, useTemplateRef, watch } from 'vue';
33
+ import { useRouter } from 'vue-router';
34
+
35
+ //Props
36
+ const props = defineProps({
37
+ content: { type: String, default: "" },
38
+ title: { type: String, default: "" },
39
+ target: { type: String, required: true },
40
+ disable: { type: Boolean, default: false },
41
+ onlyClick: { type: Boolean, default: false },
42
+ onlyMouse: { type: Boolean, default: false },
43
+ isFixed: { type: Boolean, default: false },
44
+ relativeClass: { type: String, default: undefined },
45
+ leftPos: { type: Boolean, default: false },
46
+ topPos: { type: Boolean, default: false },
47
+ popoverClass: { type: String, default: undefined },
48
+ isTopLayer: { type: Boolean, default: false },
49
+ })
50
+
51
+ //Emits
52
+ const emit = defineEmits(["updateVisibility"]);
53
+
54
+
55
+ //Data
56
+ const show = ref(false);
57
+ const isClick = ref(false);
58
+ const posX = ref(0);
59
+ const posY = ref(0);
60
+ const targetElement: Ref<HTMLElement | null> = ref(null);
61
+ const overPopover = ref(false);
62
+ const isTabAction = ref(false);
63
+ const maxHeight = ref('80dvh');
64
+ const clearTimeout: Ref<ReturnType<typeof setTimeout> | undefined> = ref(undefined);
65
+ const popoverRef = useTemplateRef('popover');
66
+
67
+
68
+ //Composables
69
+ const router= useRouter();
70
+
71
+ //Computed
72
+ const popoverId = computed(() => "popover" + props.target);
73
+ const positionInlineStyle = computed(() => `left: ${posX.value}px; top: ${posY.value}px;max-height:${maxHeight.value}`);
74
+ const displayPopover = computed(() => show.value && !props.disable);
75
+ const isTopLayerPopover = computed(() => (props.isTopLayer || "octopus-modal"===props.relativeClass) && Object.hasOwn(HTMLElement.prototype, "popover"));
76
+
77
+
78
+ //Watch
79
+ watch(displayPopover, async () => {
80
+ if(!isTopLayerPopover.value){return;}
81
+ if(displayPopover.value){
82
+ (popoverRef.value as HTMLElement).showPopover();
83
+ }else{
84
+ (popoverRef.value as HTMLElement).hidePopover();
85
+ }
86
+ });
87
+ watch(show, async () => {
88
+ emit("updateVisibility", show.value);
89
+ if (show.value) {
90
+ window.addEventListener("keyup", addAccessibilityControl);
91
+ } else {
92
+ window.removeEventListener("keyup", addAccessibilityControl);
93
+ }
94
+ });
95
+
96
+ onMounted(()=>init())
97
+
98
+ onUnmounted(()=>removeListeners())
99
+
100
+
101
+ //Methods
102
+ function addAccessibilityControl(event: KeyboardEvent): void {
103
+ if (!event || null === event) {
104
+ return;
105
+ }
106
+ if ("Tab" !== event.key) {
107
+ return;
108
+ }
109
+ const myElement = event.target as HTMLElement;
110
+ const parent = popoverRef?.value as HTMLElement;
111
+ if (parent?.contains(myElement)) {
112
+ isTabAction.value = true;
113
+ } else {
114
+ clearClick();
115
+ }
116
+ }
117
+ function init() {
118
+ targetElement.value = document.getElementById(props.target);
119
+ if (targetElement.value) {
120
+ if (!props.onlyClick) {
121
+ targetElement.value.addEventListener( "mouseenter",setPopoverData);
122
+ targetElement.value.addEventListener("mouseleave",clearDataTimeout);
123
+ }
124
+ if (!props.onlyMouse) {
125
+ targetElement.value.addEventListener("click", setPopoverData);
126
+ }
127
+ targetElement.value.addEventListener("focusout", clearDataBlur);
128
+ }
129
+ }
130
+ function removeListeners() {
131
+ if (targetElement.value) {
132
+ if (!props.onlyClick) {
133
+ targetElement.value.removeEventListener("mouseenter",setPopoverData,);
134
+ targetElement.value.removeEventListener("mouseleave",clearDataTimeout,);
135
+ }
136
+ if (!props.onlyMouse) {
137
+ targetElement.value.removeEventListener("click", setPopoverData);
138
+ }
139
+ targetElement.value.removeEventListener("focusout", clearDataBlur);
140
+ }
141
+ }
142
+ function handleClickEvent(){
143
+ if (show.value && isClick.value) {
144
+ isClick.value = false;
145
+ clearData();
146
+ return -1;
147
+ }
148
+ if (show.value && isTopLayerPopover.value) {
149
+ const popover = popoverRef?.value as HTMLElement;
150
+ popover.showPopover();
151
+ isClick.value = true;
152
+ return -1;
153
+ }
154
+ isClick.value = true;
155
+ return 0;
156
+ }
157
+ function handleLeftPos(rectElement: DOMRect, parentLeft: number, sizeAvailable: number, sizePopover: number){
158
+ const elementRightRelative = rectElement.right - parentLeft;
159
+ const hasPlaceRightButton = (sizeAvailable - (sizeAvailable - elementRightRelative)) > sizePopover;
160
+ if(hasPlaceRightButton){
161
+ posX.value =
162
+ rectElement.right -
163
+ parentLeft -
164
+ sizePopover;
165
+ }else{
166
+ posX.value =parentLeft;
167
+ }
168
+ }
169
+ function handleRightPos(rectElement: DOMRect, parentLeft: number, sizeAvailable: number, sizePopover: number){
170
+ const elementLeftRelative = rectElement.left - parentLeft;
171
+ const hasPlaceRightButton = (sizeAvailable - elementLeftRelative) > sizePopover;
172
+ if(hasPlaceRightButton){
173
+ posX.value = elementLeftRelative;
174
+ }else{
175
+ posX.value = sizeAvailable - sizePopover + parentLeft;
176
+ }
177
+ }
178
+ function setPopoverData(e: MouseEvent | PointerEvent) {
179
+ clearInterval(clearTimeout.value as unknown as number);
180
+ if (props.disable || !e || !e.target) {
181
+ return;
182
+ }
183
+ if ("click" === e.type && -1 === handleClickEvent()) {
184
+ return;
185
+ }
186
+ show.value = true;
187
+ let parentLeft = 0;
188
+ let parentTop = 0;
189
+ let parentScrollTop = 0;
190
+ let parentBottom = 0;
191
+ let parentWidth=0;
192
+ const popover = popoverRef?.value as HTMLElement;
193
+ if (!isTopLayerPopover.value && props.relativeClass) {
194
+ const modalBody = document.getElementsByClassName(props.relativeClass,)[0];
195
+ if (undefined === modalBody) {
196
+ popover.style.display = "block";
197
+ posX.value = 0;
198
+ posY.value = 0;
199
+ return;
200
+ }
201
+ const modalBodyRect = modalBody.getBoundingClientRect();
202
+ parentLeft = modalBodyRect.left;
203
+ parentTop = modalBodyRect.top;
204
+ parentScrollTop = modalBody.scrollTop;
205
+ parentBottom=modalBodyRect.bottom;
206
+ parentWidth = modalBodyRect.width;
207
+ }
208
+ const rectElement = (e.target as HTMLElement).getBoundingClientRect();
209
+ popover.style.display = "block";
210
+ const sizePopover = popover.clientWidth;
211
+ const sizeAvailable = parentWidth || window.innerWidth;
212
+ if (props.leftPos) {
213
+ handleLeftPos(rectElement, parentLeft, sizeAvailable, sizePopover);
214
+ } else {
215
+ handleRightPos(rectElement, parentLeft, sizeAvailable, sizePopover);
216
+ }
217
+ posX.value = Math.max(0, posX.value);
218
+ const yPosParent = props.topPos ? rectElement.top : rectElement.bottom;
219
+ const yGap = props.topPos
220
+ ? -5 - popover.clientHeight
221
+ : 5;
222
+
223
+ posY.value =
224
+ yPosParent +
225
+ parentScrollTop -
226
+ parentTop +
227
+ (props.isFixed ? 0 : window.scrollY) +
228
+ yGap;
229
+ if(isTopLayerPopover.value){
230
+ posY.value = Math.max(0, posY.value);
231
+ maxHeight.value = (window.innerHeight - posY.value) + "px";
232
+ }else if(props.relativeClass){
233
+ maxHeight.value = (parentBottom- posY.value -parentTop) + "px";
234
+ }else{
235
+ maxHeight.value = '80dvh';
236
+ }
237
+ }
238
+ function clearDataBlur(e: FocusEvent) {
239
+ if (isTabAction.value) {
240
+ isTabAction.value = false;
241
+ return;
242
+ }
243
+ //Exception timepicker in popover
244
+ const result = Array.from(e?.target?.classList ?? []).findIndex((val) => { return val.startsWith("dp__");});
245
+ if (-1!==result) {
246
+ return;
247
+ }
248
+ if (!e.relatedTarget) {
249
+ return clearClick();
250
+ }
251
+ const myElement = e.relatedTarget as HTMLElement;
252
+ if (popoverId.value === myElement.id) {
253
+ return;
254
+ }
255
+ const parent =popoverRef?.value as HTMLElement;
256
+ if (null === parent || !parent.contains(myElement)) {
257
+ return clearClick();
258
+ }
259
+ if (
260
+ null === myElement.classList ||
261
+ !myElement.classList.contains("octopus-dropdown-item")
262
+ ) {
263
+ return;
264
+ }
265
+ if (!(myElement as HTMLAnchorElement).href) {
266
+ return clearClick();
267
+ }
268
+ if (myElement.classList.contains("realLink")) {
269
+ myElement.click();
270
+ } else {
271
+ router.push((myElement as HTMLAnchorElement).pathname);
272
+ }
273
+ nextTick(() => {
274
+ isClick.value = false;
275
+ clearData();
276
+ });
277
+ }
278
+ function clearClick() {
279
+ isClick.value = false;
280
+ clearData();
281
+ }
282
+ function clearDataTimeout() {
283
+ clearTimeout.value = setTimeout(() => {
284
+ if (!overPopover.value) {
285
+ clearData();
286
+ }
287
+ clearTimeout.value=undefined;
288
+ }, 500);
289
+ }
290
+ function clearData() {
291
+ if (isClick.value) {
292
+ return;
293
+ }
294
+ show.value = false;
295
+ posX.value = 0;
296
+ posY.value = 0;
297
+ }
298
+
299
+ //Expose
300
+ defineExpose({
301
+ clearClick
313
302
  });
314
303
  </script>
315
304
  <style lang="scss">
@@ -4,14 +4,11 @@
4
4
  </div>
5
5
  </template>
6
6
 
7
- <script lang="ts">
8
- import { defineComponent } from "vue";
9
- export default defineComponent({
10
- name: "ClassicSpinner",
11
- props: {
12
- small: { default: false, type: Boolean },
13
- },
14
- });
7
+ <script setup lang="ts">
8
+ //Props
9
+ defineProps({
10
+ small: { default: false, type: Boolean },
11
+ })
15
12
  </script>
16
13
  <style lang="scss">
17
14
  .octopus-app .octopus-spinner {
@@ -97,24 +94,5 @@ export default defineComponent({
97
94
  opacity: 0;
98
95
  }
99
96
  }
100
- /* display: inline-block;
101
- width: 2rem;
102
- height: 2rem;
103
- border-radius: 50%;
104
- animation: 0.75s linear infinite spinner-border;
105
- border: 2px solid currentcolor;
106
- border-right-color: transparent;
107
- flex-shrink: 0;
108
-
109
- &.small {
110
- width: 1rem;
111
- height: 1rem;
112
- }
113
-
114
- @keyframes spinner-border {
115
- to {
116
- transform: rotate(360deg);
117
- }
118
- } */
119
97
  }
120
98
  </style>
@@ -1,23 +1,22 @@
1
1
  <template>
2
2
  <div class="d-flex">
3
3
  <div class="d-flex align-items-center bg-warning p-2 rounded my-1">
4
- <AlertIcon :title="$t('Warning')" class="me-1 text-danger" :size="16" />
4
+ <AlertIcon :title="t('Warning')" class="me-1 text-danger" :size="16" />
5
5
  <div class="text-danger">
6
6
  {{ message }}
7
7
  </div>
8
8
  </div>
9
9
  </div>
10
10
  </template>
11
- <script lang="ts">
11
+ <script setup lang="ts">
12
12
  import AlertIcon from "vue-material-design-icons/Alert.vue";
13
- import { defineComponent } from "vue";
14
- export default defineComponent({
15
- name: "ErrorMessage",
16
- components: {
17
- AlertIcon,
18
- },
19
- props: {
20
- message: { default: undefined, type: String },
21
- },
22
- });
13
+ import { useI18n } from "vue-i18n";
14
+
15
+ //Props
16
+ defineProps({
17
+ message: { default: undefined, type: String },
18
+ })
19
+
20
+ //Composables
21
+ const { t } = useI18n();
23
22
  </script>