@saooti/octopus-sdk 31.0.35 → 31.0.38

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 (85) hide show
  1. package/README.md +7 -1
  2. package/index.ts +8 -2
  3. package/package.json +1 -1
  4. package/public/img/403.jpeg +0 -0
  5. package/public/img/404.svg +242 -0
  6. package/src/assets/bootstrap-diff.scss +25 -24
  7. package/src/assets/general.scss +57 -2
  8. package/src/assets/modal.scss +5 -4
  9. package/src/assets/share.scss +2 -0
  10. package/src/components/display/categories/CategoryFilter.vue +12 -26
  11. package/src/components/display/categories/CategoryList.vue +14 -20
  12. package/src/components/display/comments/AddCommentModal.vue +19 -36
  13. package/src/components/display/comments/CommentBasicView.vue +2 -5
  14. package/src/components/display/comments/CommentInput.vue +8 -21
  15. package/src/components/display/comments/CommentList.vue +10 -21
  16. package/src/components/display/comments/CommentPlayer.vue +0 -3
  17. package/src/components/display/comments/CommentSection.vue +6 -14
  18. package/src/components/display/emission/EmissionInlineList.vue +5 -10
  19. package/src/components/display/emission/EmissionItem.vue +5 -10
  20. package/src/components/display/emission/EmissionList.vue +66 -68
  21. package/src/components/display/filter/AdvancedSearch.vue +19 -45
  22. package/src/components/display/filter/CategoryFilter.vue +11 -20
  23. package/src/components/display/filter/MonetizableFilter.vue +7 -14
  24. package/src/components/display/filter/ProductorSearch.vue +69 -78
  25. package/src/components/display/filter/RubriqueChoice.vue +1 -4
  26. package/src/components/display/filter/RubriqueFilter.vue +1 -5
  27. package/src/components/display/list/ListPaginate.vue +150 -0
  28. package/src/components/display/list/Paginate.vue +219 -0
  29. package/src/components/display/live/LiveHorizontalList.vue +56 -40
  30. package/src/components/display/organisation/OrganisationChooser.vue +7 -12
  31. package/src/components/display/participant/ParticipantItem.vue +6 -17
  32. package/src/components/display/participant/ParticipantList.vue +53 -46
  33. package/src/components/display/playlist/PlaylistItem.vue +1 -4
  34. package/src/components/display/playlist/PlaylistList.vue +60 -63
  35. package/src/components/display/playlist/PodcastList.vue +74 -101
  36. package/src/components/display/podcasts/AnimatorsItem.vue +17 -28
  37. package/src/components/display/podcasts/ParticipantDescription.vue +3 -11
  38. package/src/components/display/podcasts/PodcastFilterList.vue +8 -16
  39. package/src/components/display/podcasts/PodcastImage.vue +86 -92
  40. package/src/components/display/podcasts/PodcastInlineListTemplate.vue +15 -2
  41. package/src/components/display/podcasts/PodcastItem.vue +1 -2
  42. package/src/components/display/podcasts/PodcastItemInfo.vue +10 -10
  43. package/src/components/display/podcasts/PodcastList.vue +61 -81
  44. package/src/components/display/podcasts/PodcastModuleBox.vue +19 -25
  45. package/src/components/display/podcasts/PodcastSwiperList.vue +6 -9
  46. package/src/components/display/podcasts/TagList.vue +0 -2
  47. package/src/components/display/sharing/QrCode.vue +2 -11
  48. package/src/components/display/sharing/ShareButtons.vue +44 -329
  49. package/src/components/display/sharing/ShareButtonsIntern.vue +209 -0
  50. package/src/components/display/sharing/SharePlayer.vue +21 -53
  51. package/src/components/display/sharing/SplitButton.vue +42 -0
  52. package/src/components/display/sharing/SubscribeButtons.vue +46 -39
  53. package/src/components/misc/Footer.vue +1 -4
  54. package/src/components/misc/HomeDropdown.vue +36 -46
  55. package/src/components/misc/LeftMenu.vue +3 -7
  56. package/src/components/misc/TopBar.vue +10 -17
  57. package/src/components/misc/modal/ClipboardModal.vue +1 -1
  58. package/src/components/misc/modal/MessageModal.vue +1 -1
  59. package/src/components/misc/modal/QrCodeModal.vue +1 -1
  60. package/src/components/misc/modal/ShareModalPlayer.vue +1 -1
  61. package/src/components/mixins/organisationFilter.ts +6 -0
  62. package/src/components/mixins/player/playerLive.ts +1 -1
  63. package/src/components/pages/Category.vue +1 -1
  64. package/src/components/pages/Emission.vue +0 -6
  65. package/src/components/pages/Emissions.vue +1 -1
  66. package/src/components/pages/Error403Page.vue +44 -8
  67. package/src/components/pages/PageNotFound.vue +55 -0
  68. package/src/components/pages/Participant.vue +0 -15
  69. package/src/components/pages/Participants.vue +1 -1
  70. package/src/components/pages/Playlist.vue +2 -2
  71. package/src/components/pages/Playlists.vue +1 -1
  72. package/src/components/pages/Podcast.vue +1 -3
  73. package/src/components/pages/Podcasts.vue +11 -8
  74. package/src/components/pages/Rubrique.vue +1 -1
  75. package/src/locale/de.ts +3 -0
  76. package/src/locale/en.ts +9 -0
  77. package/src/locale/es.ts +3 -0
  78. package/src/locale/fr.ts +10 -1
  79. package/src/locale/it.ts +3 -0
  80. package/src/locale/sl.ts +3 -0
  81. package/src/router/router.ts +2 -0
  82. package/src/sass/_variables.scss +0 -1
  83. package/src/store/class/general/playlist.ts +1 -1
  84. package/src/store/paramStore.ts +7 -11
  85. package/src/store/typeAppStore.ts +20 -2
@@ -10,6 +10,7 @@
10
10
  :iab-id="iabId"
11
11
  :rubrique-id="rubriqueId"
12
12
  :no-rubriquage-id="noRubriquageId"
13
+ :is-button-next-title="true"
13
14
  @sortChrono="sortChrono"
14
15
  @sortPopular="sortPopular"
15
16
  >
@@ -18,13 +19,12 @@
18
19
  :loading-text="loading?$t('Loading podcasts ...'):undefined"
19
20
  />
20
21
  <swiper
21
- v-show="loaded"
22
+ v-if="!loading"
22
23
  :slides-per-view="numberItem"
23
24
  :space-between="10"
24
- :loop="true"
25
+ :loop="allPodcasts.length>=numberItem"
25
26
  :navigation="true"
26
27
  :modules="modules"
27
- class="mySwiper"
28
28
  >
29
29
  <swiper-slide
30
30
  v-for="p in allPodcasts"
@@ -84,7 +84,6 @@ export default defineComponent({
84
84
  data() {
85
85
  return {
86
86
  loading: true as boolean,
87
- loaded: true as boolean,
88
87
  popularSort: false as boolean,
89
88
  allPodcasts: [] as Array<Podcast>,
90
89
  modules: [Navigation],
@@ -129,13 +128,14 @@ export default defineComponent({
129
128
 
130
129
 
131
130
  mounted() {
131
+ this.handleResize();
132
132
  this.fetchNext();
133
133
  },
134
134
  methods: {
135
135
  handleResize(): void {
136
136
  if (!this.$el) return;
137
137
  const width = (this.$el as HTMLElement).offsetWidth;
138
- const sixteen = domHelper.convertRemToPixels(this.sizeItem + 2);
138
+ const sixteen = domHelper.convertRemToPixels(this.sizeItem + 0.5);
139
139
  this.numberItem = Math.floor(width / sixteen);
140
140
  },
141
141
  async fetchNext(): Promise<void> {
@@ -151,11 +151,10 @@ export default defineComponent({
151
151
  sort: this.popularSort ? 'POPULARITY' : 'DATE',
152
152
  query: this.query,
153
153
  });
154
- this.loading = false;
155
- this.loaded = true;
156
154
  this.allPodcasts = this.allPodcasts.concat(
157
155
  data.result.filter((pod: Podcast|null) => null !== pod)
158
156
  );
157
+ this.loading = false;
159
158
  },
160
159
  sortPopular(): void {
161
160
  if (this.popularSort) return;
@@ -171,7 +170,6 @@ export default defineComponent({
171
170
  },
172
171
  reset(): void {
173
172
  this.loading = true;
174
- this.loaded = true;
175
173
  this.allPodcasts.length = 0;
176
174
  },
177
175
  },
@@ -182,7 +180,6 @@ export default defineComponent({
182
180
  .swiper {
183
181
  width: 100%;
184
182
  height: 100%;
185
- padding: 50px 20px;
186
183
  }
187
184
  .swiper-button-next, .swiper-button-prev{
188
185
  color: $octopus-primary-color !important;
@@ -47,8 +47,6 @@ export default defineComponent({
47
47
  props: {
48
48
  tagList: { default: () => [], type: Array as ()=>Array<string>},
49
49
  },
50
- methods: {
51
- },
52
50
  })
53
51
  </script>
54
52
 
@@ -56,18 +56,9 @@ export default defineComponent({
56
56
  isNotBlack: false as boolean,
57
57
  };
58
58
  },
59
- computed:{
60
- authenticated(): boolean {
61
- return (state.generalParameters.authenticated as boolean);
62
- },
63
- },
64
59
  watch:{
65
60
  isNotBlack(){
66
- if(this.isNotBlack){
67
- this.color = this.otherColor;
68
- }else{
69
- this.color = "#000000";
70
- }
61
+ this.color = this.isNotBlack ? this.otherColor : "#000000";
71
62
  }
72
63
  },
73
64
  created(){
@@ -89,7 +80,7 @@ export default defineComponent({
89
80
  this.otherColor = state.generalParameters.podcastmakerColor;
90
81
  return;
91
82
  }
92
- if (!this.authenticated) return;
83
+ if (!state.generalParameters.authenticated) return;
93
84
  let data;
94
85
  if(this.$store.state.organisation && this.$store.state.organisation.attributes && Object.keys(this.$store.state.organisation.attributes).length > 1){
95
86
  data = this.$store.state.organisation.attributes;
@@ -1,238 +1,50 @@
1
1
  <template>
2
2
  <div class="module-box text-center-mobile">
3
- <div class="d-flex align-items-center mb-3">
4
- <h3
5
- v-if="
6
- !bigRound &&
7
- (authenticated || participantId || organisationId || notExclusive)
8
- "
9
- class="mb-0"
10
- >
11
- {{ $t('Share') }}
12
- </h3>
13
- <span
14
- v-if="authenticated"
15
- id="popover-share-help"
16
- role="button"
17
- tabindex="-1"
18
- class="saooti-help ms-2"
19
- :title="$t('Help')"
20
- />
21
- <Popover
22
- v-if="authenticated"
23
- target="popover-share-help"
24
- placement="right"
25
- >
26
- {{ $t('Share this page without edit and share blocks') }}
27
- </Popover>
28
- </div>
29
- <div
30
- class="d-flex"
31
- :class="[
32
- bigRound && !audioUrl ? 'justify-content-center' : '',
33
- verticalDisplay ? 'd-flex-row' : '',
34
- ]"
3
+ <template
4
+ v-if="authenticated || participantId || organisationId || notExclusive"
35
5
  >
36
- <button
37
- v-if="isDownloadButton"
38
- class="text-dark"
39
- :class="[
40
- bigRound ? 'btn btn-big-round' : 'btn share-btn mb-2',
41
- verticalDisplay ? '' : 'mx-2',
42
- ]"
43
- :title="$t('Downloading')"
44
- @click="onDownload(podcast.audioUrl, podcast.title)"
45
- >
46
- <div class="saooti-download-bounty" />
47
- </button>
48
- <a
49
- rel="noopener"
50
- target="_blank"
51
- :href="facebookURL"
52
- :class="[
53
- bigRound ? 'btn btn-big-round' : 'btn btn-facebook share-btn mb-2',
54
- verticalDisplay ? '' : 'mx-2',
55
- ]"
56
- title="Facebook"
57
- >
58
- <span
59
- v-if="!bigRound"
60
- class="saooti-facebook-bounty"
61
- />
62
- <div
63
- v-else
64
- class="saooti-facebook-bounty"
65
- />
66
- </a>
67
- <a
68
- rel="noopener"
69
- target="_blank"
70
- :class="[
71
- bigRound ? 'btn btn-big-round' : 'btn btn-twitter share-btn mb-2',
72
- verticalDisplay ? '' : 'mx-2',
73
- ]"
74
- :href="twitterURL"
75
- title="Twitter"
76
- >
77
- <span
78
- v-if="!bigRound"
79
- class="saooti-twitter-bounty"
80
- />
81
- <div
82
- v-else
83
- class="saooti-twitter-bounty"
84
- />
85
- </a>
86
- <a
87
- rel="noopener"
88
- target="_blank"
89
- :class="[
90
- bigRound ? 'btn btn-big-round' : 'btn btn-primaryedin share-btn mb-2',
91
- verticalDisplay ? '' : 'mx-2',
92
- ]"
93
- :href="linkedinURL"
94
- title="Linkedin"
95
- >
96
- <span
97
- v-if="!bigRound"
98
- class="saooti-linkedin1"
99
- />
100
- <div
101
- v-else
102
- class="saooti-linkedin1"
103
- />
104
- </a>
105
- <a
106
- v-if="''!==rssUrl"
107
- rel="noopener"
108
- target="_blank"
109
- :class="[
110
- bigRound ? 'btn btn-big-round' : 'btn btn-rss share-btn mb-2',
111
- verticalDisplay ? '' : 'mx-2',
112
- ]"
113
- :href="rssUrl"
114
- :title="$t('Subscribe to this emission')"
115
- @click.prevent="openPopup()"
116
- >
6
+ <div class="d-flex mb-2">
7
+ <h3 class="mb-0">
8
+ {{ $t('Share') }}
9
+ </h3>
117
10
  <span
118
- v-if="!bigRound"
119
- class="saooti-rss-bounty"
11
+ v-if="authenticated"
12
+ id="popover-share-help"
13
+ role="button"
14
+ tabindex="-1"
15
+ class="saooti-help ms-2 align-items-start"
16
+ :title="$t('Help')"
120
17
  />
121
- <div
122
- v-else
123
- class="saooti-rss-bounty"
124
- />
125
- </a>
126
- <a
127
- rel="noopener"
128
- target="_blank"
129
- :class="[
130
- bigRound ? 'btn btn-big-round' : 'btn btn-rss share-btn mb-2',
131
- verticalDisplay ? '' : 'mx-2',
132
- ]"
133
- :title="$t('Copy this page URL')"
134
- @click="onCopyCode(urlPage,afterCopy)"
135
- >
136
- <span
137
- v-if="!bigRound"
138
- class="saooti-link"
139
- />
140
- <div
141
- v-else
142
- class="saooti-link"
143
- />
144
- </a>
145
- <a
146
- v-if="podcast"
147
- rel="noopener"
148
- target="_blank"
149
- :class="[
150
- bigRound ? 'btn btn-big-round' : 'btn btn-rss share-btn mb-2',
151
- verticalDisplay ? '' : 'mx-2',
152
- ]"
153
- :title="$t('Share newsletter')"
154
- @click="newsletter = true"
155
- >
156
- <span
157
- v-if="!bigRound"
158
- class="saooti-newsletter"
159
- />
160
- <div
161
- v-else
162
- class="saooti-newsletter"
163
- />
164
- </a>
165
- <a
166
- rel="noopener"
167
- target="_blank"
168
- :class="[
169
- bigRound ? 'btn btn-big-round' : 'btn btn-rss share-btn mb-2',
170
- verticalDisplay ? '' : 'mx-2',
171
- ]"
172
- :title="$t('Share QR Code')"
173
- @click="qrCode = true"
174
- >
175
- <span
176
- v-if="!bigRound"
177
- class="saooti-qrcode"
178
- />
179
- <div
180
- v-else
181
- class="saooti-qrcode"
182
- />
183
- </a>
184
- <a
185
- v-if="isMobile"
186
- rel="noopener"
187
- target="_blank"
188
- :href="whatsappURL"
189
- :class="[
190
- bigRound ? 'btn btn-big-round' : 'btn btn-whatsapp share-btn mb-2',
191
- verticalDisplay ? '' : 'mx-2',
192
- ]"
193
- title="Whatsapp"
194
- >
195
- <span
196
- v-if="!bigRound"
197
- class="saooti-Whatsapp"
18
+ <Popover
19
+ v-if="authenticated"
20
+ target="popover-share-help"
21
+ placement="right"
198
22
  >
199
- <div class="path1" />
200
- <div class="path2" />
201
- <div class="path3" />
202
- </span>
203
- <div
204
- v-else
205
- class="saooti-Whatsapp"
206
- >
207
- <div class="path1" />
208
- <div class="path2" />
209
- <div class="path3" />
210
- </div>
211
- </a>
23
+ {{ $t('Share this page without edit and share blocks') }}
24
+ </Popover>
25
+ </div>
26
+ <div class="d-flex align-items-center">
27
+ <ShareButtonsIntern
28
+ :podcast="podcast"
29
+ :emission="emission"
30
+ :participant-id="participantId"
31
+ :organisation-id="organisationId"
32
+ :not-exclusive="notExclusive"
33
+ />
34
+ </div>
35
+ </template>
36
+ <div
37
+ v-else
38
+ class="d-flex-row"
39
+ >
40
+ <ShareButtonsIntern
41
+ :podcast="podcast"
42
+ :emission="emission"
43
+ :participant-id="participantId"
44
+ :organisation-id="organisationId"
45
+ :not-exclusive="notExclusive"
46
+ />
212
47
  </div>
213
- <ClipboardModal
214
- v-if="dataRSSSave"
215
- :link="rssUrl"
216
- :emission="emission"
217
- @close="dataRSSSave = false"
218
- @copy="afterCopy"
219
- />
220
- <NewsletterModal
221
- v-if="newsletter"
222
- :closable="true"
223
- :podcast="podcast"
224
- @close="newsletter = false"
225
- />
226
- <QrCodeModal
227
- v-if="qrCode"
228
- :closable="true"
229
- :url-page="urlPage"
230
- @close="qrCode = false"
231
- />
232
- <Snackbar
233
- ref="snackbar"
234
- position="bottom-left"
235
- />
236
48
  </div>
237
49
  </template>
238
50
 
@@ -240,124 +52,27 @@
240
52
  import { Emission } from '@/store/class/general/emission';
241
53
  import { Podcast } from '@/store/class/general/podcast';
242
54
  import { state } from '../../../store/paramStore';
243
- import Snackbar from '../../misc/Snackbar.vue';
244
55
  import { displayMethods } from '../../mixins/functions';
245
56
  import Popover from '../../misc/Popover.vue';
246
- import { defineComponent, defineAsyncComponent } from 'vue';
247
- import SnackbarVue from '../../misc/Snackbar.vue';
248
- const ClipboardModal = defineAsyncComponent(() => import('../../misc/modal/ClipboardModal.vue'));
249
- const NewsletterModal = defineAsyncComponent(() => import('../../misc/modal/NewsletterModal.vue'));
250
- const QrCodeModal = defineAsyncComponent(() => import('../../misc/modal/QrCodeModal.vue'));
57
+ import ShareButtonsIntern from './ShareButtonsIntern.vue';
58
+ import { defineComponent } from 'vue';
251
59
  export default defineComponent({
252
60
  components: {
253
- ClipboardModal,
254
- NewsletterModal,
255
- QrCodeModal,
256
- Snackbar,
257
- Popover
61
+ ShareButtonsIntern,
62
+ Popover,
258
63
  },
259
-
260
64
  mixins: [displayMethods],
261
-
262
65
  props: {
263
66
  podcast: { default: undefined, type: Object as ()=> Podcast},
264
67
  emission: { default: undefined, type: Object as ()=> Emission},
265
68
  participantId: { default: undefined, type: Number},
266
69
  organisationId: { default: undefined, type: String},
267
- bigRound: { default: false, type: Boolean},
268
- audioUrl: { default: undefined, type: String},
269
70
  notExclusive: { default: true, type: Boolean},
270
71
  },
271
-
272
- data() {
273
- return {
274
- facebookURL: `https://www.facebook.com/sharer/sharer.php?u=${window.location.href}` as string,
275
- twitterURL: `https://twitter.com/intent/tweet?text=${window.location.href}` as string,
276
- linkedinURL: `https://www.linkedin.com/sharing/share-offsite/?url=${window.location.href}` as string,
277
- whatsappURL: `whatsapp://send?text=${window.location.href}` as string,
278
- dataRSSSave: false as boolean,
279
- newsletter: false as boolean,
280
- isMobile: false as boolean,
281
- qrCode: false as boolean,
282
- };
283
- },
284
-
285
72
  computed: {
286
- isDownloadButton(): boolean{
287
- return this.isDownloadButtonParam && undefined!==this.podcast && (!this.podcast.tags || !this.podcast.tags.includes('copyright'));
288
- },
289
- isDownloadButtonParam(): boolean {
290
- return (state.podcastPage.downloadButton as boolean);
291
- },
292
- urlPage(): string{
293
- return window.location.href;
294
- },
295
- verticalDisplay(): boolean {
296
- return (
297
- !this.authenticated &&
298
- !this.participantId &&
299
- !this.organisationId &&
300
- !this.notExclusive
301
- );
302
- },
303
73
  authenticated(): boolean {
304
74
  return (state.generalParameters.authenticated as boolean);
305
75
  },
306
- rssUrl(): string {
307
- if (this.emission)
308
- return (
309
- state.generalParameters.ApiUri +
310
- 'rss/emission/' +
311
- this.emission.emissionId + '.rss'
312
- );
313
- if (this.organisationId)
314
- return (
315
- state.generalParameters.ApiUri +
316
- 'rss/productor/' +
317
- this.organisationId + '.rss'
318
- );
319
- if (this.participantId)
320
- return (
321
- state.generalParameters.ApiUri +
322
- 'rss/participant/' +
323
- this.participantId + '.rss'
324
- );
325
- return '';
326
- },
327
- },
328
-
329
- created(){
330
- this.isMobile = this.checkIfDeviceMobile();
331
- },
332
- methods: {
333
- openPopup(): void {
334
- this.dataRSSSave = !this.dataRSSSave;
335
- },
336
- afterCopy(): void{
337
- (this.$refs.snackbar as InstanceType<typeof SnackbarVue>).open(this.$t('Link in clipboard'));
338
- },
339
- checkIfDeviceMobile(): boolean{
340
- let check = false;
341
- (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent);
342
- return check;
343
- },
344
- onDownload(urlToDownload: string, nameOfDownload: string): void{
345
- const xhr = new XMLHttpRequest();
346
- xhr.open('GET', urlToDownload, true);
347
- xhr.responseType = 'blob';
348
- xhr.onload = function() {
349
- const urlCreator = window.URL || window.webkitURL;
350
- const imageUrl = urlCreator.createObjectURL(this.response);
351
- const tag = document.createElement('a');
352
- tag.href = imageUrl;
353
- tag.target = '_blank';
354
- tag.download = nameOfDownload.replace(/ /g, '_');
355
- document.body.appendChild(tag);
356
- tag.click();
357
- document.body.removeChild(tag);
358
- };
359
- xhr.send();
360
- },
361
76
  },
362
77
  })
363
78
  </script>