@saooti/octopus-sdk 31.0.0 → 31.0.1

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.
package/README.md CHANGED
@@ -543,5 +543,14 @@ See [Configuration Reference](https://cli.vuejs.org/config/).
543
543
  * 30.0.44 ProgressBar pour le soir
544
544
  * 30.0.45 ProgressBar pour le soir
545
545
  * 30.0.46 Param pour le soir
546
-
546
+ * 30.0.47 Live error
547
+ * 30.0.48 Podcastmaker ScrollOverflow PodcastInlineList
548
+ * 30.0.49 Podcastmaker ProgressBar
549
+ * 30.0.50 Commentaires live
550
+ * 30.0.51 Commentaires live
551
+ * 30.0.52 Ajout rubriqueIdFilter
552
+ * 30.0.53 Commentaires live
553
+ * 30.0.54 Multiselect not reload on close
554
+
547
555
  * 31.0.0 Passage en 31
556
+ * 31.0.1 Ajout pocket casts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@saooti/octopus-sdk",
3
- "version": "31.0.0",
3
+ "version": "31.0.1",
4
4
  "private": false,
5
5
  "description": "Javascript SDK for using octopus",
6
6
  "author": "Saooti",
@@ -15,7 +15,7 @@
15
15
  "main": "./dist/octopus.common.js",
16
16
  "dependencies": {
17
17
  "@popperjs/core": "^2.11.0",
18
- "@saooti/octopus-api": "^0.30.3",
18
+ "@saooti/octopus-api": "^0.30.4",
19
19
  "@vue/cli": "^5.0.0-rc.1",
20
20
  "@vue/compat": "^3.2.26",
21
21
  "axios": "^0.24.0",
@@ -79,7 +79,8 @@
79
79
  "no-console": "off",
80
80
  "no-debugger": "off",
81
81
  "@typescript-eslint/ban-ts-ignore": "off",
82
- "@typescript-eslint/ban-ts-comment": "off"
82
+ "@typescript-eslint/ban-ts-comment": "off",
83
+ "no-async-promise-executor":"off"
83
84
  },
84
85
  "parserOptions": {
85
86
  "parser": "@typescript-eslint/parser"
@@ -66,6 +66,25 @@
66
66
  }
67
67
  }
68
68
  }
69
+ .element-list-inline.overflowScroll {
70
+ display: flex;
71
+ flex-wrap: wrap;
72
+ -webkit-overflow-scrolling: touch;
73
+ scroll-behavior: smooth;
74
+ padding-bottom: 1rem;
75
+ width: 100%;
76
+ height: 80vh;
77
+ overflow-y: auto;
78
+ grid-gap: inherit;
79
+ @media (max-width: 960px) {
80
+ overflow-x: hidden;
81
+ flex-direction: column;
82
+ flex-wrap: nowrap;
83
+ }
84
+ .item-phone-margin {
85
+ margin: 1rem 0.5rem !important;
86
+ }
87
+ }
69
88
 
70
89
  .emission-list {
71
90
  align-self: stretch;
@@ -28,9 +28,8 @@
28
28
  :show-no-results="true"
29
29
  :hide-selected="true"
30
30
  :show-labels="false"
31
- @open="clearAll"
31
+ @open="onOpen"
32
32
  @search-change="onSearchCategory"
33
- @close="onClose"
34
33
  @select="onCategorySelected"
35
34
  >
36
35
  <template #singleLabel="{ option }">
@@ -169,14 +168,11 @@ export default defineComponent({
169
168
  }
170
169
  },
171
170
  methods: {
172
- clearAll(): void {
171
+ onOpen(): void {
173
172
  (this.$refs.multiselectRef as VueMultiselect).$refs.search.setAttribute(
174
173
  'autocomplete',
175
174
  'off'
176
175
  );
177
- if (undefined === this.categoryArray) {
178
- this.category = undefined;
179
- }
180
176
  if (
181
177
  undefined !== this.categorySelected ||
182
178
  undefined !== this.categoryArray ||
@@ -199,14 +195,6 @@ export default defineComponent({
199
195
  this.categories = this.totalCategories;
200
196
  }
201
197
  },
202
- onClose(): void {
203
- if (!this.category && undefined === this.categoryArray) {
204
- this.category = getDefaultCategory(this.defaultanswer);
205
- if(this.category){
206
- this.onCategorySelected(this.category);
207
- }
208
- }
209
- },
210
198
  onSearchCategory(query: string): void {
211
199
  this.isLoading = true;
212
200
  const categoryDefault = getDefaultCategory(this.defaultanswer);
@@ -66,7 +66,6 @@
66
66
  </template>
67
67
 
68
68
  <script lang="ts">
69
- import { IReCaptchaComposition, useReCaptcha } from 'vue-recaptcha-v3';
70
69
  import Constants from '../../../../public/config';
71
70
  import { state } from '../../../store/paramStore';
72
71
  import api from '@/api/initialize';
@@ -130,11 +129,9 @@ export default defineComponent({
130
129
  this.sendComment();
131
130
  return;
132
131
  }
133
- const iRecaptcha: IReCaptchaComposition|undefined = useReCaptcha();
134
- if(!iRecaptcha){return;}
135
- await iRecaptcha.recaptchaLoaded();
136
- const token = await iRecaptcha.executeRecaptcha('login');
137
132
  try {
133
+ await this.$recaptchaLoaded()
134
+ const token = await this.$recaptcha('login');
138
135
  this.sendError = false;
139
136
  const ok = await api.checkToken(token);
140
137
  if (!ok) {
@@ -14,7 +14,7 @@
14
14
  comment.name
15
15
  }}</b>
16
16
  <Popover
17
- v-if="!editRight && !isValid"
17
+ :disable="editRight || isValid"
18
18
  :target="'popover-comment' + comment.comId"
19
19
  >
20
20
  {{ $t('Comment waiting') }}
@@ -29,7 +29,6 @@
29
29
  :show-labels="false"
30
30
  @search-change="onSearchEmission"
31
31
  @open="onOpen"
32
- @close="onClose"
33
32
  @select="onEmissionSelected"
34
33
  >
35
34
  <template #clear="{ props }">
@@ -152,16 +151,8 @@ export default defineComponent({
152
151
  'autocomplete',
153
152
  'off'
154
153
  );
155
- this.clearAll();
156
154
  this.onSearchEmission();
157
155
  },
158
- onClose(): void {
159
- if (this.emission) return;
160
- this.emission = this.defaultanswer
161
- ? getDefaultEmission(this.defaultanswer)
162
- : undefined;
163
- this.$emit('selected', this.emission);
164
- },
165
156
  onEmissionSelected(emission: Emission): void {
166
157
  this.$emit('selected', emission);
167
158
  },
@@ -55,7 +55,6 @@
55
55
  />
56
56
  </transition-group>
57
57
  <router-link
58
- v-if="!overflowScroll"
59
58
  :to="href"
60
59
  class="btn btn-link align-self-center width-fit-content m-4"
61
60
  >
@@ -203,14 +202,14 @@ export default defineComponent({
203
202
  },
204
203
  handleResize(): void {
205
204
  if (!this.$el) return;
206
- if (window.innerWidth <= PHONE_WIDTH) {
207
- this.size = 10;
208
- return;
209
- }
210
205
  if (this.overflowScroll) {
211
206
  this.size = 20;
212
207
  return;
213
208
  }
209
+ if (window.innerWidth <= PHONE_WIDTH) {
210
+ this.size = 10;
211
+ return;
212
+ }
214
213
  const width = (this.$el as HTMLElement).offsetWidth;
215
214
  const sixteen = domHelper.convertRemToPixels(this.itemSize + 0.7);
216
215
  this.size = Math.floor(width / sixteen);
@@ -270,24 +269,5 @@ export default defineComponent({
270
269
  margin-bottom: 1rem;
271
270
  }
272
271
  }
273
- .element-list-inline.overflowScroll {
274
- display: flex;
275
- flex-wrap: wrap;
276
- -webkit-overflow-scrolling: touch;
277
- scroll-behavior: smooth;
278
- padding-bottom: 1rem;
279
- width: 100%;
280
- height: 80vh;
281
- overflow-y: auto;
282
- grid-gap: inherit;
283
- @media (max-width: 960px) {
284
- overflow-x: hidden;
285
- flex-direction: column;
286
- flex-wrap: nowrap;
287
- }
288
- .item-phone-margin {
289
- margin: 1rem 0.5rem !important;
290
- }
291
- }
292
272
  }
293
273
  </style>
@@ -31,7 +31,6 @@
31
31
  :class="{ 'multiselect-transparent': light }"
32
32
  @search-change="onSearchOrganisation"
33
33
  @open="onOpen"
34
- @close="onClose"
35
34
  @select="onOrganisationSelected"
36
35
  >
37
36
  <template #clear="{ props }">
@@ -207,16 +206,8 @@ export default defineComponent({
207
206
  'autocomplete',
208
207
  'off'
209
208
  );
210
- this.clearAll();
211
209
  this.onSearchOrganisation();
212
210
  },
213
- onClose(): void {
214
- if (this.organisation) return;
215
- this.organisation = this.defaultanswer
216
- ? getDefaultOrganistion(this.defaultanswer)
217
- : undefined;
218
- this.$emit('selected', this.organisation);
219
- },
220
211
  onOrganisationSelected(organisation: Organisation|undefined): void {
221
212
  this.$emit('selected', organisation);
222
213
  },
@@ -22,7 +22,7 @@
22
22
  </button>
23
23
  </div>
24
24
  <div
25
- v-if="!isArrow"
25
+ v-if="!isArrow && !overflowScroll"
26
26
  class="hide-phone"
27
27
  >
28
28
  <button
@@ -51,7 +51,10 @@
51
51
  :name="transitionName"
52
52
  class="element-list-inline"
53
53
  tag="ul"
54
- :class="[alignLeft ? 'justify-content-start' : '']"
54
+ :class="[
55
+ alignLeft ? 'justify-content-start' : '',
56
+ overflowScroll ? 'overflowScroll' : '',
57
+ ]"
55
58
  >
56
59
  <PodcastItem
57
60
  v-for="p in podcasts"
@@ -131,6 +134,9 @@ export default defineComponent({
131
134
  sizeItem(): number {
132
135
  return state.generalParameters.podcastItem ? (state.generalParameters.podcastItem as number): 13;
133
136
  },
137
+ overflowScroll(): boolean {
138
+ return (state.emissionPage.overflowScroll as boolean);
139
+ },
134
140
  filterOrga(): string {
135
141
  return this.$store.state.filter.organisationId;
136
142
  },
@@ -249,6 +255,10 @@ export default defineComponent({
249
255
  },
250
256
  handleResize(): void {
251
257
  if (!this.$el) return;
258
+ if (this.overflowScroll) {
259
+ this.size = 20;
260
+ return;
261
+ }
252
262
  if (window.innerWidth <= PHONE_WIDTH) {
253
263
  this.size = 10;
254
264
  return;
@@ -48,14 +48,14 @@ export default defineComponent({
48
48
  return (state.emissionsPage.progressBar as boolean);
49
49
  },
50
50
  percentProgress(): number{
51
- if(this.podcast !== this.$store.state.player.podcast){
51
+ if(!this.$store.state.player.podcast || this.podcast.podcastId !== this.$store.state.player.podcast.podcastId){
52
52
  return 0;
53
53
  }
54
54
  if(!this.$store.state.player.elapsed){return 0;}
55
55
  return this.$store.state.player.elapsed * 100;
56
56
  },
57
57
  playedTime(): string{
58
- if(this.podcast === this.$store.state.player.podcast){
58
+ if(this.$store.state.player.podcast && this.podcast.podcastId === this.$store.state.player.podcast.podcastId){
59
59
  if (this.$store.state.player.elapsed && this.$store.state.player.elapsed > 0 && this.$store.state.player.total && this.$store.state.player.total > 0) {
60
60
  return DurationHelper.formatDuration(
61
61
  Math.round(this.$store.state.player.elapsed * this.$store.state.player.total)
@@ -70,7 +70,7 @@ export default defineComponent({
70
70
  },
71
71
  methods: {
72
72
  seekTo(event: MouseEvent): void {
73
- if(this.podcast!== this.$store.state.player.podcast){return;}
73
+ if(!this.$store.state.player.podcast || this.podcast.podcastId !== this.$store.state.player.podcast.podcastId){return;}
74
74
  const rect = (event.currentTarget as Element).getBoundingClientRect();
75
75
  const barWidth = (event.currentTarget as Element).clientWidth;
76
76
  const x = event.clientX - rect.left;
@@ -29,9 +29,8 @@
29
29
  :show-no-results="true"
30
30
  :hide-selected="true"
31
31
  :show-labels="false"
32
- @open="clearAll"
32
+ @open="onOpen"
33
33
  @search-change="onSearchRubrique"
34
- @close="onClose"
35
34
  @select="onRubriqueSelected"
36
35
  >
37
36
  <template #singleLabel="{ option }">
@@ -187,14 +186,11 @@ export default defineComponent({
187
186
  );
188
187
  }
189
188
  },
190
- clearAll(): void {
189
+ onOpen(): void {
191
190
  (this.$refs.multiselectRef as VueMultiselect).$refs.search.setAttribute(
192
191
  'autocomplete',
193
192
  'off'
194
193
  );
195
- if (undefined === this.rubriqueArray) {
196
- this.rubrique = undefined;
197
- }
198
194
  this.rubriques = this.initRubriquesArray();
199
195
  },
200
196
  onClose(): void {
@@ -66,6 +66,16 @@
66
66
  >
67
67
  <span class="saooti-playerfm" />
68
68
  </a>
69
+ <a
70
+ v-if="pocketCasts"
71
+ rel="noopener"
72
+ target="_blank"
73
+ class="btn me-3 mb-2 share-btn"
74
+ :href="pocketCasts"
75
+ title="pocketCasts"
76
+ >
77
+ <span class="saooti-pocket-casts" />
78
+ </a>
69
79
  <a
70
80
  v-if="podcastAddict"
71
81
  rel="noopener"
@@ -189,6 +199,10 @@ export default defineComponent({
189
199
  (this.emission && this.emission.annotations
190
200
  ? this.emission.annotations.googlePodcasts
191
201
  : undefined) as string | undefined,
202
+ pocketCasts:
203
+ (this.emission && this.emission.annotations
204
+ ? this.emission.annotations.pocketCasts
205
+ : undefined) as string | undefined,
192
206
  };
193
207
  },
194
208
 
@@ -205,6 +219,7 @@ export default defineComponent({
205
219
  this.stitcher = this.externaliseLinks(this.stitcher);
206
220
  this.amazon = this.externaliseLinks(this.amazon);
207
221
  this.googlePodcasts = this.externaliseLinks(this.googlePodcasts);
222
+ this.pocketCasts = this.externaliseLinks(this.pocketCasts);
208
223
  },
209
224
 
210
225
  methods: {
@@ -28,7 +28,6 @@
28
28
  class="d-flex align-items-center flex-grow-1 px-5"
29
29
  >
30
30
  <audio
31
- v-if="!live"
32
31
  id="audio-player"
33
32
  :src="!live? audioUrl: undefined"
34
33
  autoplay
@@ -194,6 +193,9 @@ export default defineComponent({
194
193
  commentsLoaded(): void {
195
194
  this.initComments(true);
196
195
  },
196
+ audioUrl(): void{
197
+ this.playerError = false;
198
+ }
197
199
  },
198
200
 
199
201
  mounted() {
@@ -342,47 +344,49 @@ export default defineComponent({
342
344
  this.listenTime = 0;
343
345
  },
344
346
  async initHls(hlsStreamUrl: string): Promise<void> {
345
- if(null === Hls){
346
- //TODO -> Version light min quand ce sera possible
347
- await import('hls.js/dist/hls.js').then((hlsLibrary) => {
348
- Hls = hlsLibrary.default;
349
- })
350
- await import('hls.js').then((hlsLibrary) => {
351
- Hls = hlsLibrary.default;
352
- })
353
- }
354
- if (!Hls.isSupported()) {
355
- throw 'Hls is not supported ! ';
356
- }
357
- const hls = new Hls();
358
- hls.on(Hls.Events.MANIFEST_PARSED, async () => {
359
- if(!this.live){ return; }
360
- let downloadId = null;
361
- try {
362
- downloadId = await octopusApi.requestLiveDownloadId(
363
- this.live.livePodcastId
364
- );
365
- await octopusApi.markPlayingLive(
366
- this.live.livePodcastId,
367
- downloadId,
368
- 'octopus',
369
- this.$store.state.authentication.organisationId
370
- );
371
- this.setDownloadId(downloadId);
372
- } catch (error) {
373
- console.log('ERROR downloadId');
347
+ return new Promise<void>(async(resolve, reject) => {
348
+ if(null === Hls){
349
+ //TODO -> Version light min quand ce sera possible
350
+ await import('hls.js/dist/hls.js').then((hlsLibrary) => {
351
+ Hls = hlsLibrary.default;
352
+ })
353
+ await import('hls.js').then((hlsLibrary) => {
354
+ Hls = hlsLibrary.default;
355
+ })
374
356
  }
375
- this.hlsReady = true;
376
- const audio: HTMLElement|null = document.getElementById('audio-player');
377
- hls.attachMedia((audio as HTMLAudioElement));
378
- await (audio as HTMLAudioElement).play();
379
- this.onPlay();
380
- throw 400;
381
- });
382
- hls.on(Hls.Events.ERROR, async () => {
383
- throw 'There is an error while reading media content';
357
+ if (!Hls.isSupported()) {
358
+ reject('Hls is not supported ! ');
359
+ }
360
+ const hls = new Hls();
361
+ hls.on(Hls.Events.MANIFEST_PARSED, async () => {
362
+ if(!this.live){ return; }
363
+ let downloadId = null;
364
+ try {
365
+ downloadId = await octopusApi.requestLiveDownloadId(
366
+ this.live.livePodcastId
367
+ );
368
+ await octopusApi.markPlayingLive(
369
+ this.live.livePodcastId,
370
+ downloadId,
371
+ 'octopus',
372
+ this.$store.state.authentication.organisationId
373
+ );
374
+ this.setDownloadId(downloadId);
375
+ } catch (error) {
376
+ console.log('ERROR downloadId');
377
+ }
378
+ this.hlsReady = true;
379
+ const audio: HTMLElement|null = document.getElementById('audio-player');
380
+ hls.attachMedia((audio as HTMLAudioElement));
381
+ await (audio as HTMLAudioElement).play();
382
+ this.onPlay();
383
+ resolve();
384
+ });
385
+ hls.on(Hls.Events.ERROR, async() => {
386
+ reject('There is an error while reading media content');
387
+ });
388
+ hls.loadSource(hlsStreamUrl);
384
389
  });
385
- hls.loadSource(hlsStreamUrl);
386
390
  },
387
391
  async playLive(): Promise<void> {
388
392
  if (!this.live) return;
@@ -19,6 +19,7 @@
19
19
  :class="{
20
20
  'saooti-play2-bounty': isPaused,
21
21
  'saooti-pause-bounty': isPlaying,
22
+ 'spinner-border':!isPaused&&!isPlaying
22
23
  }"
23
24
  />
24
25
  </div>
@@ -88,6 +89,9 @@ export default defineComponent({
88
89
 
89
90
  methods: {
90
91
  addKeyboardControl(event: KeyboardEvent): void{
92
+ if(!event || null ===event){return;}
93
+ const element = event.target as HTMLElement;
94
+ if (!element || 'INPUT' == element.tagName.toUpperCase() || 'TEXTAREA' == element.tagName.toUpperCase()){return;}
91
95
  if (' ' === event.key || 'Spacebar' === event.key) {
92
96
  event.preventDefault();
93
97
  this.switchPausePlay();
@@ -216,6 +216,7 @@ export default defineComponent({
216
216
  if (undefined !== this.emission.annotations.podcastAddict) count++;
217
217
  if (undefined !== this.emission.annotations.playerFm) count++;
218
218
  if (undefined !== this.emission.annotations.stitcher) count++;
219
+ if (undefined !== this.emission.annotations.pocketCasts) count++;
219
220
  }
220
221
  return count;
221
222
  },
@@ -227,6 +227,7 @@ export default defineComponent({
227
227
  if (undefined !== this.podcast.emission.annotations.podcastAddict) count++;
228
228
  if (undefined !== this.podcast.emission.annotations.playerFm) count++;
229
229
  if (undefined !== this.podcast.emission.annotations.stitcher) count++;
230
+ if (undefined !== this.podcast.emission.annotations.pocketCasts) count++;
230
231
  }
231
232
  return count;
232
233
  },
package/src/main.ts CHANGED
@@ -6,6 +6,7 @@ import I18nResources from './locale/messages';
6
6
  import router from '@/router/router';
7
7
  import moment from 'moment';
8
8
  import store from '@/store/AppStore';
9
+ import paramStore from '@/store/paramStore';
9
10
  import { LocaleMessage } from '@intlify/core-base';
10
11
  /* import 'popper.js/dist/popper.min.js'; */
11
12
  /* import 'jquery/src/jquery.js'; */
@@ -32,6 +33,22 @@ const i18n = createI18n({
32
33
  });
33
34
  moment.locale(language);
34
35
 
36
+
37
+ paramStore.initialize({
38
+ generalParameters: {},
39
+ podcastPage: {},
40
+ podcastsPage: {},
41
+ emissionsPage: {},
42
+ emissionPage: {},
43
+ intervenantPage: {},
44
+ intervenantsPage: {},
45
+ searchPage: {},
46
+ player: {},
47
+ footer: {},
48
+ organisation: {},
49
+ octopusApi: {}
50
+ });
51
+
35
52
  // Initialisation store
36
53
  createApp(App)
37
54
  .use(i18n)
@@ -12,7 +12,7 @@ const state:paramStore = {
12
12
  isPlaylist: false,
13
13
  isProduction: true,
14
14
  isContribution: true,
15
- ApiUri: 'https://api.dev2.saooti.org/',
15
+ ApiUri: 'https://api.staging.saooti.org/',
16
16
  podcastmaker: false,
17
17
  buttonPlus: true,
18
18
  allCategories: [],
@@ -25,10 +25,10 @@ const state:paramStore = {
25
25
  SharePlayer: true,
26
26
  ShareButtons: true,
27
27
  ShareDistribution: true,
28
- MiniplayerUri: 'https://playerbeta.dev2.saooti.org/',
28
+ MiniplayerUri: 'https://playerbeta.staging.saooti.org/',
29
29
  ouestFranceStyle: false,
30
30
  downloadButton: false,
31
- hlsUri: 'https://hls.dev2.saooti.org/',
31
+ hlsUri: 'https://hls.staging.saooti.org/',
32
32
  mainRubrique: 0,
33
33
  resourceUrl: undefined
34
34
  },
@@ -55,7 +55,8 @@ const state:paramStore = {
55
55
  emissionPage: {
56
56
  ouestFranceStyle: false,
57
57
  rssButton: false,
58
- isDisplayPodcasts:true
58
+ isDisplayPodcasts:true,
59
+ overflowScroll:false
59
60
  },
60
61
  intervenantPage: {
61
62
  lightStyle: false,
@@ -83,11 +84,12 @@ const state:paramStore = {
83
84
  userName: '',
84
85
  },
85
86
  octopusApi: {
86
- url: 'http://api.dev2.saooti.org/',
87
- commentsUrl: 'http://comments.dev2.saooti.org/',
88
- studioUrl: 'http://studio.dev2.saooti.org/',
89
- playerUrl: 'https://playerbeta.dev2.saooti.org/',
87
+ url: 'http://api.staging.saooti.org/',
88
+ commentsUrl: 'http://comments.staging.saooti.org/',
89
+ studioUrl: 'http://studio.staging.saooti.org/',
90
+ playerUrl: 'https://playerbeta.staging.saooti.org/',
90
91
  organisationId: undefined,
92
+ rubriqueIdFilter: undefined,
91
93
  },
92
94
  };
93
95
  export interface GeneralParameters{
@@ -143,7 +145,8 @@ export interface EmissionsPage{
143
145
  export interface EmissionPage{
144
146
  ouestFranceStyle?: boolean,
145
147
  rssButton?: boolean,
146
- isDisplayPodcasts?:boolean
148
+ isDisplayPodcasts?:boolean,
149
+ overflowScroll?: boolean,
147
150
  }
148
151
  export interface IntervenantPage{
149
152
  lightStyle?: boolean,
@@ -182,7 +185,8 @@ export interface OctopusApi{
182
185
  accessTokenUri: string,
183
186
  expiration: string,
184
187
  clientId: string,
185
- }
188
+ },
189
+ rubriqueIdFilter?: Array<number>,
186
190
  }
187
191
  export interface paramStore{
188
192
  generalParameters:GeneralParameters,