@saooti/octopus-sdk 37.0.6 → 37.0.8

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 (236) hide show
  1. package/README.md +2 -2
  2. package/index.ts +22 -22
  3. package/package.json +26 -22
  4. package/src/App.vue +69 -60
  5. package/src/api/classicCrud.ts +12 -12
  6. package/src/api/initialize.ts +1 -1
  7. package/src/assets/transition.scss +34 -22
  8. package/src/components/display/aggregator/RssSection.vue +3 -3
  9. package/src/components/display/categories/CategoryChooser.vue +73 -60
  10. package/src/components/display/categories/CategoryFilter.vue +134 -90
  11. package/src/components/display/categories/CategoryList.vue +76 -62
  12. package/src/components/display/comments/AddCommentModal.vue +44 -44
  13. package/src/components/display/comments/CommentBasicView.vue +38 -30
  14. package/src/components/display/comments/CommentInput.vue +121 -106
  15. package/src/components/display/comments/CommentItem.vue +144 -102
  16. package/src/components/display/comments/CommentList.vue +117 -85
  17. package/src/components/display/comments/CommentParentInfo.vue +18 -15
  18. package/src/components/display/comments/CommentPlayer.vue +39 -41
  19. package/src/components/display/comments/CommentSection.vue +68 -53
  20. package/src/components/display/edit/EditBox.vue +7 -7
  21. package/src/components/display/edit/EditBoxRadio.vue +3 -4
  22. package/src/components/display/edit/EditCommentBox.vue +34 -36
  23. package/src/components/display/emission/EmissionInlineList.vue +75 -63
  24. package/src/components/display/emission/EmissionItem.vue +47 -35
  25. package/src/components/display/emission/EmissionList.vue +118 -83
  26. package/src/components/display/emission/EmissionPlayerItem.vue +89 -89
  27. package/src/components/display/filter/AdvancedSearch.vue +81 -73
  28. package/src/components/display/filter/CategorySearchFilter.vue +27 -25
  29. package/src/components/display/filter/DateFilter.vue +38 -38
  30. package/src/components/display/filter/MonetizableFilter.vue +16 -14
  31. package/src/components/display/filter/ProductorSearch.vue +55 -47
  32. package/src/components/display/filter/RubriqueChoice.vue +42 -27
  33. package/src/components/display/filter/RubriqueFilter.vue +130 -85
  34. package/src/components/display/filter/SearchOrder.vue +16 -11
  35. package/src/components/display/list/ListPaginate.vue +72 -70
  36. package/src/components/display/list/PaginateParams.vue +29 -30
  37. package/src/components/display/list/PaginateSection.vue +210 -0
  38. package/src/components/display/list/SwiperList.vue +28 -32
  39. package/src/components/display/live/CountDown.vue +12 -14
  40. package/src/components/display/live/LiveHorizontalList.vue +60 -50
  41. package/src/components/display/live/LiveItem.vue +42 -26
  42. package/src/components/display/live/LiveList.vue +92 -65
  43. package/src/components/display/live/RadioCurrently.vue +47 -42
  44. package/src/components/display/live/RadioImage.vue +40 -42
  45. package/src/components/display/live/RadioItem.vue +15 -22
  46. package/src/components/display/live/RadioList.vue +24 -21
  47. package/src/components/display/live/RadioPlanning.vue +105 -68
  48. package/src/components/display/organisation/OrganisationChooser.vue +58 -42
  49. package/src/components/display/organisation/OrganisationChooserLight.vue +27 -19
  50. package/src/components/display/participant/ParticipantItem.vue +89 -77
  51. package/src/components/display/participant/ParticipantList.vue +90 -60
  52. package/src/components/display/playlist/PlaylistItem.vue +32 -35
  53. package/src/components/display/playlist/PlaylistList.vue +70 -52
  54. package/src/components/display/playlist/PodcastList.vue +61 -50
  55. package/src/components/display/playlist/PodcastPlaylistInlineList.vue +47 -38
  56. package/src/components/display/podcasts/AnimatorsItem.vue +17 -15
  57. package/src/components/display/podcasts/ParticipantDescription.vue +21 -22
  58. package/src/components/display/podcasts/PodcastFilterList.vue +28 -26
  59. package/src/components/display/podcasts/PodcastImage.vue +129 -131
  60. package/src/components/display/podcasts/PodcastInlineList.vue +33 -29
  61. package/src/components/display/podcasts/PodcastInlineListClassic.vue +91 -71
  62. package/src/components/display/podcasts/PodcastInlineListTemplate.vue +94 -85
  63. package/src/components/display/podcasts/PodcastItem.vue +96 -90
  64. package/src/components/display/podcasts/PodcastItemInfo.vue +61 -65
  65. package/src/components/display/podcasts/PodcastList.vue +115 -84
  66. package/src/components/display/podcasts/PodcastModuleBox.vue +95 -104
  67. package/src/components/display/podcasts/PodcastPlayBar.vue +45 -32
  68. package/src/components/display/podcasts/PodcastSwiperList.vue +65 -55
  69. package/src/components/display/podcasts/TagList.vue +33 -37
  70. package/src/components/display/rubriques/RubriqueChooser.vue +70 -51
  71. package/src/components/display/rubriques/RubriqueList.vue +117 -89
  72. package/src/components/display/sharing/PlayerParameters.vue +45 -42
  73. package/src/components/display/sharing/QrCode.vue +52 -46
  74. package/src/components/display/sharing/ShareButtons.vue +18 -18
  75. package/src/components/display/sharing/ShareButtonsIntern.vue +100 -78
  76. package/src/components/display/sharing/ShareDistribution.vue +101 -67
  77. package/src/components/display/sharing/SharePlayer.vue +207 -127
  78. package/src/components/display/sharing/SharePlayerColors.vue +15 -15
  79. package/src/components/display/sharing/SharePlayerRadio.vue +62 -39
  80. package/src/components/display/sharing/SharePlayerTypes.vue +93 -55
  81. package/src/components/display/sharing/SubscribeButtons.vue +83 -32
  82. package/src/components/display/studio/RecordingItemButton.vue +3 -3
  83. package/src/components/form/ClassicCheckbox.vue +32 -31
  84. package/src/components/form/ClassicDatePicker.vue +47 -49
  85. package/src/components/form/ClassicInputText.vue +99 -98
  86. package/src/components/form/ClassicLoading.vue +11 -14
  87. package/src/components/form/ClassicMultiselect.vue +125 -126
  88. package/src/components/form/ClassicRadio.vue +15 -18
  89. package/src/components/form/ClassicSearch.vue +17 -23
  90. package/src/components/form/ClassicSelect.vue +35 -27
  91. package/src/components/form/{Wysiwyg.vue → ClassicWysiwyg.vue} +103 -118
  92. package/src/components/misc/AcpmImage.vue +6 -6
  93. package/src/components/misc/ClassicAccordion.vue +73 -0
  94. package/src/components/misc/ClassicNav.vue +117 -0
  95. package/src/components/misc/ClassicPopover.vue +212 -0
  96. package/src/components/misc/{Spinner.vue → ClassicSpinner.vue} +14 -15
  97. package/src/components/misc/ErrorMessage.vue +9 -17
  98. package/src/components/misc/FooterSection.vue +198 -0
  99. package/src/components/misc/HomeDropdown.vue +60 -60
  100. package/src/components/misc/LeftMenu.vue +115 -79
  101. package/src/components/misc/ProgressBar.vue +36 -32
  102. package/src/components/misc/SnackBar.vue +169 -0
  103. package/src/components/misc/TopBar.vue +162 -116
  104. package/src/components/misc/modal/ClassicModal.vue +99 -103
  105. package/src/components/misc/modal/ClipboardModal.vue +21 -23
  106. package/src/components/misc/modal/MessageModal.vue +22 -28
  107. package/src/components/misc/modal/NewsletterModal.vue +139 -113
  108. package/src/components/misc/modal/QrCodeModal.vue +14 -17
  109. package/src/components/misc/modal/ShareModalPlayer.vue +44 -60
  110. package/src/components/misc/player/PlayerCompact.vue +47 -62
  111. package/src/components/misc/player/{Player.vue → PlayerComponent.vue} +54 -46
  112. package/src/components/misc/player/PlayerLarge.vue +62 -61
  113. package/src/components/misc/player/PlayerProgressBar.vue +40 -30
  114. package/src/components/misc/player/PlayerTimeline.vue +32 -36
  115. package/src/components/misc/player/radio/RadioHistory.vue +62 -59
  116. package/src/components/misc/player/radio/RadioProgressBar.vue +44 -35
  117. package/src/components/mixins/cookies.ts +11 -10
  118. package/src/components/mixins/displayMethods.ts +5 -4
  119. package/src/components/mixins/handle403.ts +9 -9
  120. package/src/components/mixins/imageProxy.ts +14 -7
  121. package/src/components/mixins/init.ts +31 -16
  122. package/src/components/mixins/orgaComputed.ts +7 -7
  123. package/src/components/mixins/organisationFilter.ts +36 -22
  124. package/src/components/mixins/player/playerComment.ts +46 -37
  125. package/src/components/mixins/player/playerDisplay.ts +122 -87
  126. package/src/components/mixins/player/playerLive.ts +65 -43
  127. package/src/components/mixins/player/playerLogic.ts +133 -88
  128. package/src/components/mixins/player/playerTranscript.ts +48 -30
  129. package/src/components/mixins/radio/fetchRadioData.ts +40 -23
  130. package/src/components/mixins/selenium.ts +2 -2
  131. package/src/components/mixins/tagOfMixins.ts +11 -11
  132. package/src/components/pages/CategoryPage.vue +43 -0
  133. package/src/components/pages/{Emission.vue → EmissionPage.vue} +98 -67
  134. package/src/components/pages/{Emissions.vue → EmissionsPage.vue} +51 -44
  135. package/src/components/pages/Error403Page.vue +20 -19
  136. package/src/components/pages/HomePage.vue +144 -0
  137. package/src/components/pages/LivesPage.vue +66 -0
  138. package/src/components/pages/PageNotFound.vue +33 -22
  139. package/src/components/pages/{Participant.vue → ParticipantPage.vue} +63 -49
  140. package/src/components/pages/{Participants.vue → ParticipantsPage.vue} +9 -9
  141. package/src/components/pages/PlaylistPage.vue +175 -0
  142. package/src/components/pages/{Playlists.vue → PlaylistsPage.vue} +16 -14
  143. package/src/components/pages/PodcastPage.vue +365 -0
  144. package/src/components/pages/PodcastsPage.vue +152 -0
  145. package/src/components/pages/RadioPage.vue +131 -0
  146. package/src/components/pages/RubriquePage.vue +45 -0
  147. package/src/components/pages/{Search.vue → SearchPage.vue} +19 -19
  148. package/src/helper/dom.ts +1 -1
  149. package/src/helper/duration.ts +10 -4
  150. package/src/helper/useEventListener.ts +7 -8
  151. package/src/i18n.ts +31 -30
  152. package/src/locale/de.ts +272 -257
  153. package/src/locale/educationen.ts +13 -13
  154. package/src/locale/educationfr.ts +1 -1
  155. package/src/locale/en.ts +332 -324
  156. package/src/locale/es.ts +334 -318
  157. package/src/locale/fr.ts +339 -324
  158. package/src/locale/it.ts +341 -328
  159. package/src/locale/messages.ts +9 -9
  160. package/src/locale/sl.ts +324 -319
  161. package/src/main.ts +28 -31
  162. package/src/router/router.ts +218 -198
  163. package/src/shims-tsx.d.ts +1 -1
  164. package/src/shims-vue.d.ts +1 -1
  165. package/src/stores/ApiStore.ts +44 -44
  166. package/src/stores/AuthStore.ts +21 -15
  167. package/src/stores/CommentStore.ts +13 -11
  168. package/src/stores/FilterStore.ts +25 -15
  169. package/src/stores/GeneralStore.ts +15 -15
  170. package/src/stores/ParamSdkStore.ts +179 -137
  171. package/src/stores/PlayerStore.ts +139 -125
  172. package/src/stores/class/adserver/adserverConfig.ts +1 -1
  173. package/src/stores/class/adserver/adserverOtherEmission.ts +9 -9
  174. package/src/stores/class/cartouchier/cartouche.ts +4 -4
  175. package/src/stores/class/cartouchier/cartouchier.ts +2 -2
  176. package/src/stores/class/conference/conference.ts +10 -9
  177. package/src/stores/class/conference/conferenceMessage.ts +2 -2
  178. package/src/stores/class/conference/conferenceParticipant.ts +1 -1
  179. package/src/stores/class/conference/studioCall.ts +6 -6
  180. package/src/stores/class/contract/contractOrganisation.ts +5 -5
  181. package/src/stores/class/ftp/ftpEmission.ts +9 -9
  182. package/src/stores/class/ftp/testFtpEmission.ts +4 -4
  183. package/src/stores/class/general/audioView.ts +19 -19
  184. package/src/stores/class/general/category.ts +1 -1
  185. package/src/stores/class/general/classicSelectType.ts +2 -3
  186. package/src/stores/class/general/customPlayer.ts +8 -8
  187. package/src/stores/class/general/emission.ts +20 -20
  188. package/src/stores/class/general/fetchParam.ts +8 -2
  189. package/src/stores/class/general/initState.ts +31 -31
  190. package/src/stores/class/general/interfacePageable.ts +13 -13
  191. package/src/stores/class/general/ituneCategory.ts +4 -4
  192. package/src/stores/class/general/listReturn.ts +12 -12
  193. package/src/stores/class/general/media.ts +7 -7
  194. package/src/stores/class/general/organisation.ts +9 -9
  195. package/src/stores/class/general/pageable.ts +10 -10
  196. package/src/stores/class/general/participant.ts +7 -7
  197. package/src/stores/class/general/player.ts +30 -28
  198. package/src/stores/class/general/playlist.ts +17 -19
  199. package/src/stores/class/general/podcast.ts +19 -19
  200. package/src/stores/class/general/sortPageable.ts +4 -4
  201. package/src/stores/class/general/soundcastCategory.ts +7 -7
  202. package/src/stores/class/ouestFrance/ofTag.ts +34 -34
  203. package/src/stores/class/ouestFrance/ofTagInfo.ts +9 -9
  204. package/src/stores/class/ouestFrance/ofTagPage.ts +7 -7
  205. package/src/stores/class/ouestFrance/ofTagSeo.ts +7 -7
  206. package/src/stores/class/ouestFrance/ofTagVente.ts +6 -6
  207. package/src/stores/class/ouestFrance/ofTagWithParents.ts +20 -20
  208. package/src/stores/class/radio/canal.ts +4 -4
  209. package/src/stores/class/radio/live.ts +6 -6
  210. package/src/stores/class/radio/mix.ts +16 -16
  211. package/src/stores/class/radio/playlistMedia.ts +7 -7
  212. package/src/stores/class/radio/recurrence.ts +54 -54
  213. package/src/stores/class/rss/rssEmission.ts +13 -13
  214. package/src/stores/class/rss/rssInfo.ts +7 -7
  215. package/src/stores/class/rubrique/rubriquage.ts +2 -2
  216. package/src/stores/class/rubrique/rubrique.ts +1 -1
  217. package/src/stores/class/stat/statArrayIncome.ts +5 -5
  218. package/src/stores/class/stat/statArrayObject.ts +26 -26
  219. package/src/stores/class/stat/statGraph.ts +6 -6
  220. package/src/stores/class/user/person.ts +4 -2
  221. package/src/stores/class/user/profile.ts +4 -2
  222. package/src/stores/class/user/userKeycloak.ts +4 -5
  223. package/src/components/display/list/Paginate.vue +0 -181
  224. package/src/components/misc/Accordion.vue +0 -78
  225. package/src/components/misc/Footer.vue +0 -169
  226. package/src/components/misc/Nav.vue +0 -119
  227. package/src/components/misc/Popover.vue +0 -193
  228. package/src/components/misc/Snackbar.vue +0 -168
  229. package/src/components/pages/Category.vue +0 -41
  230. package/src/components/pages/Home.vue +0 -125
  231. package/src/components/pages/Lives.vue +0 -64
  232. package/src/components/pages/Playlist.vue +0 -164
  233. package/src/components/pages/Podcast.vue +0 -307
  234. package/src/components/pages/Podcasts.vue +0 -146
  235. package/src/components/pages/Radio.vue +0 -122
  236. package/src/components/pages/Rubrique.vue +0 -42
@@ -1,78 +0,0 @@
1
- <template>
2
- <div
3
- class="octopus-accordion my-2"
4
- >
5
- <button
6
- :id="'accordion-'+idComposer"
7
- class="btn-transparent bg-white w-100 p-2 text-start d-flex align-items-center"
8
- :class="isOpen?'really-light-primary-bg':''"
9
- @click="isOpen=!isOpen"
10
- >
11
- <span
12
- v-if="icon"
13
- class="img-accordion text-primary"
14
- :class="icon"
15
- />
16
- <img
17
- v-if="imageUrl"
18
- width="30"
19
- height="30"
20
- class="img-accordion"
21
- :src="imageUrl"
22
- :alt="title"
23
- >
24
- <span class="flex-grow-1">{{ title }}</span>
25
- <span :class="isOpen?'saooti-up': 'saooti-down'" />
26
- </button>
27
- <div
28
- v-show="isOpen"
29
- class="body p-2"
30
- >
31
- <slot />
32
- </div>
33
- </div>
34
- </template>
35
-
36
- <script lang="ts">
37
- import { defineComponent } from 'vue';
38
- export default defineComponent({
39
- name: "Accordion",
40
- props: {
41
- title: { default: '', type: String },
42
- idComposer: { default: '', type: String },
43
- icon:{default: undefined, type: String },
44
- imageUrl:{default: undefined, type: String },
45
- },
46
- emits:['open'],
47
- data () {
48
- return {
49
- isOpen: false as boolean,
50
- }
51
- },
52
- watch:{
53
- isOpen(){
54
- this.$emit('open');
55
- }
56
- }
57
- });
58
- </script>
59
- <style lang="scss">
60
- .octopus-accordion{
61
- border: 1px solid #ccc;
62
- >button{
63
- height: 50px;
64
- }
65
- .img-accordion {
66
- width: 30px;
67
- height: 30px;
68
- margin-right: 1rem;
69
- font-size: 20px;
70
- display: flex;
71
- justify-content: center;
72
- align-items: center;
73
- }
74
- .body{
75
- border-top: 1px solid #ccc;
76
- }
77
- }
78
- </style>
@@ -1,169 +0,0 @@
1
- <template>
2
- <div
3
- id="footer"
4
- ref="footer"
5
- class="d-flex align-items-center justify-content-between border-top mt-auto"
6
- >
7
- <div
8
- v-if="!isPodcastmaker"
9
- class="d-flex flex-column px-1"
10
- >
11
- <div class="text-dark my-1 special-select-align-magic-trick">
12
- &copy; Saooti 2019
13
- </div>
14
- <router-link
15
- v-for="link in routerLinkSecondArray"
16
- :key="link.routeName"
17
- class="link-hover my-1 special-select-align-magic-trick"
18
- :to="link.routeName"
19
- >
20
- {{ link.title }}
21
- </router-link>
22
- <ClassicSelect
23
- v-model:textInit="language"
24
- :display-label="false"
25
- id-select="language-chooser-select"
26
- :label="$t('Change locale')"
27
- :transparent="true"
28
- :options="[{title:'Deutsch', value:'de'},
29
- {title:'English', value:'en'},
30
- {title:'Español', value:'es'},
31
- {title:'Français', value:'fr'},
32
- {title:'Italiano', value:'it'},
33
- {title:'Slovenščina', value:'sl'}]"
34
- class="mb-2"
35
- />
36
- </div>
37
- <a
38
- v-if="isPodcastmaker && isContactLink"
39
- id="footer-contact"
40
- class="link-hover"
41
- :href="isContactLink"
42
- rel="noopener"
43
- target="_blank"
44
- >{{ $t('Contact') }}</a>
45
- <div class="d-flex align-items-center">
46
- <div class="hosted-by">
47
- {{ $t('Hosted by') }}<span class="ms-1 me-1 text-primary">Saooti</span>
48
- </div>
49
-
50
- <AcpmImage v-if="isGarRole"/>
51
- <a
52
- v-else
53
- href="https://www.acpm.fr/L-ACPM/Certifications-et-Labels/Les-Podcasts"
54
- rel="noopener"
55
- target="_blank"
56
- :title="$t('Octopus is ACPM Podcast accredited')"
57
- >
58
- <AcpmImage/>
59
- </a>
60
- </div>
61
- </div>
62
- </template>
63
-
64
- <script lang="ts">
65
- import cookies from '../mixins/cookies';
66
- import ClassicSelect from '../form/ClassicSelect.vue';
67
- import AcpmImage from './AcpmImage.vue';
68
- import { state } from '../../stores/ParamSdkStore';
69
- import {loadLocaleMessages} from '@/i18n';
70
- import octopusApi from '@saooti/octopus-api';
71
- import { useFilterStore } from '@/stores/FilterStore';
72
- import { useGeneralStore } from '@/stores/GeneralStore';
73
- import { useAuthStore } from '@/stores/AuthStore';
74
- import { mapState, mapActions } from 'pinia';
75
- import { Category } from '@/stores/class/general/category';
76
- import { RubriquageFilter } from '@/stores/class/rubrique/rubriquageFilter';
77
- import { defineComponent } from 'vue'
78
- export default defineComponent({
79
- name: 'Footer',
80
- components: {
81
- ClassicSelect,
82
- AcpmImage
83
- },
84
-
85
- mixins:[cookies],
86
- data() {
87
- return {
88
- language: this.$i18n.locale,
89
- };
90
- },
91
- computed: {
92
- ...mapState(useGeneralStore, ['storedCategories', 'platformEducation']),
93
- ...mapState(useFilterStore, ['filterRubrique', 'filterOrgaId', 'filterIab']),
94
- ...mapState(useAuthStore, ['isGarRole']),
95
- routerLinkSecondArray(){
96
- const links = [
97
- {title : this.$t('Contact'), routeName: '/main/pub/contact'},
98
- {title : this.$t('Term of use'), routeName: '/main/pub/cgu'}];
99
-
100
- if(!this.isGarRole){
101
- links.push({title : this.$t('Used libraries'), routeName: "/main/pub/libraries"});
102
- }
103
- return links;
104
- },
105
- isPodcastmaker(): boolean {
106
- return (state.generalParameters.podcastmaker as boolean);
107
- },
108
- isContactLink(): string|undefined {
109
- return state.footer.contactLink;
110
- },
111
- rubriqueQueryParam(): string|undefined{
112
- if(this.filterRubrique?.length){
113
- return this.filterRubrique.map((value: RubriquageFilter) => value.rubriquageId+':'+value.rubriqueId).join();
114
- }
115
- return undefined;
116
- },
117
- },
118
- watch:{
119
- language(){
120
- this.changeLanguage();
121
- }
122
- },
123
- methods: {
124
- ...mapActions(useGeneralStore, ['storedUpdateCategories']),
125
- ...mapActions(useFilterStore, ['filterUpdateIab']),
126
- getQueriesRouter(routeName: string){
127
- if('podcasts' !== routeName && 'emissions' !== routeName && 'home' !== routeName){
128
- return { productor: this.filterOrgaId};
129
- }
130
- return { productor: this.filterOrgaId,
131
- iabId: this.filterIab?.id,
132
- rubriquesId: this.rubriqueQueryParam}
133
- },
134
- changeLanguage(): void{
135
- this.setCookie('octopus-language', this.language);
136
- loadLocaleMessages(this.$i18n, this.language, this.platformEducation);
137
- octopusApi.fetchDataWithParams<Array<Category>>(0, `iab/list${state.octopusApi.organisationId? '/'+state.octopusApi.organisationId : ''}`, { lang: this.$i18n.locale }).then((data: Array<Category>) => {
138
- this.storedUpdateCategories(data);
139
- if(this.filterIab){
140
- const category = this.storedCategories.filter((c: Category) => {
141
- return c.id === this.filterIab?.id;
142
- });
143
- if(category.length){
144
- this.filterUpdateIab(category[0]);
145
- }
146
- }
147
- });
148
- }
149
- },
150
- })
151
- </script>
152
-
153
- <style lang="scss">
154
- .octopus-app{
155
- #footer{
156
- font-size: 0.6rem;
157
- bottom: 0;
158
- z-index: 10;
159
- background: white;
160
- padding: 0 2rem;
161
- a{
162
- color: #666;
163
- }
164
- .special-select-align-magic-trick{
165
- margin-left: 0.16rem;
166
- }
167
- }
168
- }
169
- </style>
@@ -1,119 +0,0 @@
1
- <template>
2
- <ul
3
- class="octopus-nav"
4
- :class="light?'light':''"
5
- >
6
- <li
7
- v-for="index in tabNumber"
8
- v-show="hasSlot(index-1)"
9
- :key="index-1"
10
- class="octopus-nav-item"
11
- >
12
- <div
13
- class="octopus-nav-link"
14
- :class="activeTab === (index-1)? 'active':''"
15
- @click="$emit('update:activeTab',(index-1))"
16
- >
17
- <slot :name="(index-1)" />
18
- </div>
19
- </li>
20
- </ul>
21
- <div :class="transparent? 'd-flex flex-grow-1':'octopus-tab-content'">
22
- <div
23
- v-for="index in tabNumber"
24
- v-show="hasSlot('tab'+(index-1))"
25
- :key="index-1"
26
- class="octopus-tab-pane"
27
- :class="activeTab === (index-1)? 'active':''"
28
- >
29
- <slot
30
- :name="'tab'+(index-1)"
31
- :is-active="activeTab === (index-1)"
32
- />
33
- </div>
34
- </div>
35
- </template>
36
-
37
- <script lang="ts">
38
- import { defineComponent } from 'vue'
39
- export default defineComponent({
40
- name: 'Nav',
41
- props: {
42
- tabNumber: { default: 0, type: Number},
43
- activeTab: { default: 0, type: Number},
44
- transparent:{ default: false, type: Boolean},
45
- light: { default: false, type: Boolean},
46
- },
47
- emits:['update:activeTab'],
48
- methods:{
49
- hasSlot(name = 'default') {
50
- return !!this.$slots[ name ];
51
- }
52
- }
53
- })
54
- </script>
55
-
56
- <style lang="scss">
57
- @import '@scss/_variables.scss';
58
- .octopus-app{
59
- .octopus-nav{
60
- display: flex;
61
- flex-wrap: wrap;
62
- padding-left: 0;
63
- margin-bottom: 0;
64
- margin-top: 0;
65
- list-style: none;
66
- border-bottom: 0.05rem solid #ddd;
67
- &.light{
68
- border: 0;
69
- }
70
- }
71
- .octopus-nav-item{
72
- border-right: solid 1px rgb(222,226,230);
73
- border-left: solid 1px rgb(222,226,230);
74
- border-top: solid 1px rgb(222,226,230);
75
- border-top-left-radius: 0.25rem;
76
- border-top-right-radius: 0.25rem;
77
- cursor: pointer;
78
- flex-grow: 1;
79
- text-align: center;
80
- }
81
- .octopus-nav.light .octopus-nav-item{
82
- border: 0;
83
- flex-grow: 0;
84
- }
85
- .octopus-nav-link{
86
- display: block;
87
- padding: 0.5rem 1rem;
88
- text-decoration: none;
89
- transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out;
90
- border: 0.1rem solid transparent;
91
- &:hover,&.active{
92
- border-color: #dee2e6;
93
- border-bottom-color: $octopus-primary-color;
94
- color: $octopus-primary-color;
95
- }
96
- }
97
- .octopus-nav.light .octopus-nav-link{
98
- border-top: 0 !important;
99
- border-right: 0 !important;
100
- border-left: 0 !important;
101
- font-weight: bold;
102
- }
103
- .octopus-tab-content{
104
- border-right: solid 1px rgb(222,226,230);
105
- border-left: solid 1px rgb(222,226,230);
106
- border-bottom: solid 1px rgb(222,226,230);
107
- background-color: #f8fafc;
108
- }
109
- .octopus-tab-pane{
110
- display: none;
111
- &.active{
112
- display: flex;
113
- justify-content: space-between;
114
- padding: 0.5rem;
115
- flex-grow: 1;
116
- }
117
- }
118
- }
119
- </style>
@@ -1,193 +0,0 @@
1
- <template>
2
- <div
3
- v-show="show && !disable"
4
- :id="'popover'+target"
5
- ref="popover"
6
- tabindex="0"
7
- class="octopus-popover"
8
- :class="onlyClick?'octopus-dropdown':''"
9
- :style="positionInlineStyle"
10
- @blur="clearDataBlur"
11
- >
12
- <div
13
- v-if="title"
14
- class="bg-secondary p-2"
15
- >
16
- {{ title }}
17
- </div>
18
- <div class="p-2">
19
- <slot>{{ content }}</slot>
20
- </div>
21
- </div>
22
- </template>
23
-
24
- <script lang="ts">
25
- import {defineComponent} from 'vue';
26
- export default defineComponent({
27
- name: 'Popover',
28
- props: {
29
- content: {type: String, default: ''},
30
- title: {type: String, default: ''},
31
- target: {type: String, required: true},
32
- disable: {type: Boolean, default: false},
33
- onlyClick: {type: Boolean, default: false},
34
- isFixed: {type: Boolean, default: false},
35
- relativeClass: {type: String, default: undefined},
36
- leftPos: {type: Boolean, default: false},
37
- },
38
- data () {
39
- return {
40
- show: false as boolean,
41
- isClick: false as boolean,
42
- posX: 0 as number,
43
- posY: 0 as number,
44
- targetElement: null as HTMLElement|null,
45
- }
46
- },
47
- computed: {
48
- popoverId(): string{
49
- return 'popover'+this.target;
50
- },
51
- positionInlineStyle(): string {
52
- return `left: ${this.posX}px; top: ${this.posY}px;`;
53
- }
54
- },
55
- mounted () {
56
- this.init();
57
- },
58
- unmounted(){
59
- this.removeListeners();
60
- },
61
- methods: {
62
- init () {
63
- this.targetElement = document.getElementById(this.target);
64
- if(this.targetElement){
65
- if(!this.onlyClick){
66
- this.targetElement.addEventListener("mouseenter", this.setPopoverData);
67
- this.targetElement.addEventListener("mouseleave", this.clearData);
68
- }
69
- this.targetElement.addEventListener("click", this.setPopoverData);
70
- this.targetElement.addEventListener("blur", this.clearDataBlur);
71
- }
72
- },
73
- removeListeners () {
74
- if(this.targetElement){
75
- if(!this.onlyClick){
76
- this.targetElement.removeEventListener("mouseenter", this.setPopoverData);
77
- this.targetElement.removeEventListener("mouseleave", this.clearData);
78
- }
79
- this.targetElement.removeEventListener("click", this.setPopoverData);
80
- this.targetElement.addEventListener("blur", this.clearDataBlur);
81
- }
82
- },
83
- setPopoverData (e: MouseEvent|PointerEvent) {
84
- if(this.disable || !e || !e.target){
85
- return;
86
- }
87
- if("click"===e.type){
88
- if(this.show && this.isClick){
89
- this.isClick = false;
90
- this.clearData();
91
- return;
92
- }
93
- this.isClick = true;
94
- }
95
- this.show = true;
96
- let parentLeft = 0;
97
- let parentRight = 0;
98
- let parentTop = 0;
99
- let parentScrollTop = 0;
100
- if(this.relativeClass){
101
- const modalBody = document.getElementsByClassName(this.relativeClass)[0];
102
- if(undefined===modalBody){
103
- (this.$refs.popover as HTMLElement).style.display = 'block';
104
- this.posX = 0;
105
- this.posY = 0;
106
- return;
107
- }
108
- const modalBodyRect = modalBody.getBoundingClientRect();
109
- parentLeft = modalBodyRect.left;
110
- parentRight = modalBodyRect.right;
111
- parentTop = modalBodyRect.top;
112
- parentScrollTop=modalBody.scrollTop;
113
- }
114
- const rectElement = (e.target as HTMLElement).getBoundingClientRect();
115
- (this.$refs.popover as HTMLElement).style.display = 'block';
116
- this.posX = this.leftPos? (rectElement.right -parentRight ) - (this.$refs.popover as HTMLElement).clientWidth : (rectElement.left -parentLeft );
117
- this.posY = ((rectElement.bottom+ parentScrollTop ) - parentTop ) + (this.isFixed ? 0 : window.scrollY)+ 5;
118
- },
119
- async clearDataBlur (e: FocusEvent) {
120
- if(!e.relatedTarget){
121
- return this.clearClick();
122
- }
123
- const myElement = e.relatedTarget as HTMLElement;
124
- if(this.popoverId===myElement.id){return;}
125
- const parent = this.$refs.popover as HTMLElement;
126
- if (null===parent || !parent.contains(myElement)) {
127
- return this.clearClick();
128
- }
129
- if(null===myElement.classList || !myElement.classList.contains('octopus-dropdown-item')){
130
- return;
131
- }
132
- if(!(myElement as HTMLAnchorElement).href){
133
- return this.clearClick();
134
- }
135
- if("true"===myElement.getAttribute('reallink')){
136
- myElement.click();
137
- }else{
138
- await this.$router.push((myElement as HTMLAnchorElement).pathname);
139
- }
140
- this.$nextTick(() => {
141
- this.isClick = false;
142
- this.clearData();
143
- });
144
- },
145
- clearClick(){
146
- this.isClick = false;
147
- this.clearData();
148
- },
149
- clearData () {
150
- if(this.isClick){
151
- return;
152
- }
153
- this.show = false;
154
- this.posX = 0;
155
- this.posY = 0;
156
- }
157
- },
158
- });
159
- </script>
160
- <style lang="scss">
161
- @import '@scss/_variables.scss';
162
- .octopus-popover{
163
- background: white;
164
- border: 1px solid #ccc;
165
- border-radius: $octopus-borderradius;
166
- position: absolute;
167
- z-index: 9999;
168
- &.octopus-dropdown{
169
- min-width: 200px;
170
- .octopus-dropdown-item{
171
- display: flex;
172
- justify-content: center;
173
- color: rgb(29, 29, 29);
174
- width: 100%;
175
- padding: 0.25rem 1rem;
176
- font-weight: 400;
177
- text-decoration: none;
178
- white-space: nowrap;
179
- background-color: transparent;
180
- border: 0;
181
- &:hover{
182
- background: rgb(243, 243, 243);
183
- }
184
- }
185
- hr{
186
- margin: 0.5rem 0;
187
- overflow: hidden;
188
- border-top: 1px solid #ccc;
189
- opacity: 1;
190
- }
191
- }
192
- }
193
- </style>