PluginProbe ʕ •ᴥ•ʔ
Booking for Appointments and Events Calendar – Amelia / 2.4.4
Booking for Appointments and Events Calendar – Amelia v2.4.4
2.4.4 2.4.3 2.4.2 2.4.1 2.4 trunk 1.2.1 1.2.10 1.2.11 1.2.12 1.2.13 1.2.14 1.2.15 1.2.16 1.2.17 1.2.18 1.2.19 1.2.2 1.2.20 1.2.21 1.2.22 1.2.23 1.2.24 1.2.25 1.2.26 1.2.27 1.2.28 1.2.29 1.2.3 1.2.30 1.2.31 1.2.32 1.2.33 1.2.34 1.2.35 1.2.36 1.2.37 1.2.38 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 2.0 2.0.1 2.0.2 2.1 2.1.1 2.1.2 2.1.3 2.2 2.2.1 2.3
ameliabooking / v3 / src / store / modules / eventEntities.js
ameliabooking / v3 / src / store / modules Last commit date
appointment.js 1 day ago appointmentWaitingListOptions.js 1 day ago attendee.js 1 day ago auth.js 1 day ago bookableType.js 1 day ago booking.js 1 day ago cabinet.js 1 day ago cabinetFilters.js 1 day ago coupon.js 1 day ago customFields.js 1 day ago customerInfo.js 1 day ago employee.js 1 day ago entities.js 1 day ago event.js 1 day ago eventBooking.js 1 day ago eventEntities.js 1 day ago eventWaitingListOptions.js 1 day ago pagination.js 1 day ago params.js 1 day ago payment.js 1 day ago persons.js 1 day ago recurring.js 1 day ago shortcodeParams.js 1 day ago stepByStepFilters.js 1 day ago tickets.js 1 day ago
eventEntities.js
477 lines
1 import httpClient from '../../plugins/axios.js'
2 import { useUrlParams, useUrlQueryParams } from '../../assets/js/common/helper'
3 import {
4 useTranslateEntities,
5 getNameTranslated,
6 getDescriptionTranslated,
7 getTicketTranslated,
8 getBadgeTranslated,
9 } from '../../assets/js/public/translation'
10 import moment from 'moment/moment'
11
12 function setTicketsData(event) {
13 event.bookingToEventTickets = []
14 let bookingToEventTickets = []
15 event.customTickets.forEach((ticket) => {
16 bookingToEventTickets.push({
17 id: Math.random(),
18 customerBookingId: null,
19 eventTicketId: ticket.id,
20 persons: 0,
21 waiting: 0,
22 price: ticket.dateRangePrice != null ? ticket.dateRangePrice : ticket.price,
23 })
24 })
25 return bookingToEventTickets
26 }
27
28 function setEmployeeBadgesData(employees, providerBadges) {
29 employees.forEach((employee) => {
30 if (employee.badgeId) {
31 employee.badge = providerBadges.find((badge) => badge.id === employee.badgeId)
32 } else {
33 employee.badge = null
34 }
35 })
36 }
37
38 function setEventWaitingListSettings(event, settings) {
39 let defaultWaitingList = {
40 enabled: false,
41 maxCapacity: 0,
42 addingMethod: 'Manually',
43 maxExtraPeopleEnabled: false,
44 maxExtraPeople: 0,
45 peopleWaiting: 0,
46 }
47
48 if (!settings.featuresIntegrations?.waitingList?.enabled) {
49 return defaultWaitingList
50 }
51
52 let parsedSettings = JSON.parse(event.settings)
53
54 return parsedSettings !== null && parsedSettings?.waitingList
55 ? parsedSettings.waitingList
56 : defaultWaitingList
57 }
58
59 function getEntitiesVariableName() {
60 return 'ameliaEventEntities' in window
61 ? 'ameliaEventEntities'
62 : 'ameliaEntities' in window
63 ? 'ameliaEntities'
64 : false
65 }
66
67 export default {
68 namespaced: true,
69
70 state: () => ({
71 events: [],
72 tags: [],
73 locations: [],
74 employees: [],
75 customFields: [],
76 taxes: [],
77 calendarEvents: [],
78 upcomingEvents: [],
79 upcomingLoading: true,
80 loadingCounter: 0,
81 loadingUpcomingCounter: 0,
82 eventsDisplay: '',
83 }),
84
85 getters: {
86 getEvents(state) {
87 return state.events
88 },
89
90 getEvent: (state) => (id) => {
91 return state.events.find((event) => parseInt(event.id) === parseInt(id)) || null
92 },
93
94 getTags(state) {
95 return state.tags
96 },
97
98 getEmployees(state) {
99 return state.employees
100 },
101
102 getLocations(state) {
103 return state.locations
104 },
105
106 getLocation: (state) => (id) => {
107 return state.locations.find((i) => parseInt(i.id) === parseInt(id)) || null
108 },
109
110 getCustomFields(state) {
111 return state.customFields
112 },
113
114 getEventCustomFields: (state) => (id) => {
115 return state.customFields.filter(
116 (customField) => customField.events.filter((event) => event.id === id).length,
117 )
118 },
119
120 getFilteredLocations: (state) => (shortcode) => {
121 return state.locations.filter((l) =>
122 shortcode.locations && shortcode.locations.length > 0
123 ? shortcode.locations.find((loc) => parseInt(loc) === l.id)
124 : true,
125 )
126 },
127
128 getFilteredTags: (state) => (shortcode) => {
129 return state.tags.filter(
130 (t) =>
131 (shortcode.tags && shortcode.tags.length > 0 ? shortcode.tags.includes(t.name) : true) &&
132 // ! this cause problems on visibility filter tag field
133 (shortcode.ids && shortcode.ids.length > 0
134 ? state.events
135 .map((e) => e.tags)
136 .flat()
137 .filter((tag) => tag.name === t.name).length > 0
138 : true),
139 )
140 },
141
142 getTaxes(state) {
143 return state.taxes
144 },
145
146 getTax: (state) => (id) => {
147 return state.taxes.find((i) => parseInt(i.id) === parseInt(id)) || null
148 },
149
150 getCalendarEvents(state) {
151 return state.calendarEvents
152 },
153
154 getUpcomingEvents(state) {
155 return state.upcomingEvents
156 },
157
158 getUpcomingLoading(state) {
159 return state.upcomingLoading
160 },
161
162 getLoadingCounter(state) {
163 return state.loadingCounter
164 },
165
166 getLoadingUpcomingCounter(state) {
167 return state.loadingUpcomingCounter
168 },
169
170 getEventsDisplay(state) {
171 return state.eventsDisplay
172 },
173 },
174
175 mutations: {
176 setTaxes(state, payload) {
177 state.taxes = payload
178 },
179
180 setEvents(state, payload) {
181 state.events = payload
182 },
183
184 setTags(state, payload) {
185 state.tags = payload
186 },
187
188 setEmployees(state, payload) {
189 state.employees = payload.filter((e) => e.status !== 'hidden' && e.show)
190 },
191
192 setLocations(state, payload) {
193 state.locations = payload.filter((l) => l.status !== 'hidden')
194 },
195
196 setCustomFields(state, payload) {
197 state.customFields = [...Object.values(payload)]
198 },
199
200 setCalendarEvents(state, payload) {
201 state.calendarEvents = payload
202 },
203
204 setUpcomingEvents(state, payload) {
205 state.upcomingEvents = payload
206 },
207
208 setArrayPartsToEvents(state, payload) {
209 const eventIds = new Set(state.events.map((item) => item.id))
210 const filteredArrayParts = payload.filter((item) => !eventIds.has(item.id))
211
212 state.events = [...state.events, ...filteredArrayParts]
213 },
214
215 setUpcomingLoading(state, payload) {
216 state.upcomingLoading = payload
217 },
218
219 setLoadingCounter(state, payload) {
220 state.loadingCounter = payload
221 },
222
223 setLoadingUpcomingCounter(state, payload) {
224 state.loadingUpcomingCounter = payload
225 },
226
227 setEventsDisplay(state, payload) {
228 state.eventsDisplay = payload
229 },
230 },
231
232 actions: {
233 requestEntities({ dispatch, commit, rootGetters }, payload) {
234 commit('setReady', false, { root: true })
235 commit('params/setParams', rootGetters['shortcodeParams/getShortcodeParams'], { root: true })
236
237 let serverData = {
238 types: payload.types,
239 }
240
241 if (payload.loadEntities && !getEntitiesVariableName()) {
242 httpClient
243 .get('/entities', {
244 params: useUrlParams({ types: serverData.types, lite: true }),
245 })
246 .then((response) => {
247 window.ameliaEventEntities = response.data.data
248
249 serverData.entities = JSON.parse(JSON.stringify(window.ameliaEventEntities))
250
251 dispatch('fillingOutData', serverData)
252 })
253 } else {
254 let ameliaApiInterval = setInterval(() => {
255 let name = getEntitiesVariableName()
256
257 if (name) {
258 clearInterval(ameliaApiInterval)
259
260 serverData.entities = JSON.parse(JSON.stringify(window[name]))
261
262 dispatch('fillingOutData', serverData)
263 }
264 }, 1000)
265 }
266 },
267
268 fillingOutData({ commit, dispatch, rootState, getters }, payload) {
269 let availableTranslationsShort = rootState.settings.general.usedLanguages.map((key) =>
270 key.length > 2 ? key.slice(0, 2) : key,
271 )
272
273 if (
274 rootState.settings.general.usedLanguages.indexOf(rootState.localLanguage) !== -1 ||
275 availableTranslationsShort.indexOf(rootState.localLanguage.split('_')[0]) !== -1
276 ) {
277 useTranslateEntities(payload.entities)
278
279 rootState.settings.roles.providerBadges.badges?.forEach((badge) => {
280 badge.content = getBadgeTranslated(badge)
281 })
282 }
283
284 setEmployeeBadgesData(
285 payload.entities.employees,
286 rootState.settings.roles.providerBadges.badges ?? [],
287 )
288
289 payload.types.forEach((ent) => {
290 if (!(ent in payload.entities)) {
291 payload.entities[ent] = []
292 }
293
294 if (
295 ent === 'customFields' &&
296 !rootState.settings.featuresIntegrations.customFields.enabled
297 ) {
298 payload.entities['customFields'] = []
299
300 return
301 }
302
303 commit(
304 `set${ent.charAt(0).toUpperCase()}${ent.slice(1)}`,
305 ent === 'customFields'
306 ? payload.entities['customFields'].sort((a, b) => {
307 if (a['saveType'] === b['saveType']) {
308 return a['position'] - b['position']
309 }
310 return a['saveType'].localeCompare(b['saveType'])
311 })
312 : payload.entities[ent],
313 )
314 })
315
316 if (getters['getEventsDisplay']) {
317 dispatch('requestEvents', getters['getEventsDisplay'])
318 } else {
319 dispatch('requestEvents')
320 }
321 },
322
323 requestEvents({ commit, rootState, rootGetters, getters }, payload) {
324 let eventParams = {
325 ...rootGetters['params/getEventParams'],
326 page: rootGetters['pagination/getPage'],
327 }
328
329 if (payload === 'upcoming') {
330 commit('setUpcomingLoading', true)
331 eventParams = {
332 ...rootGetters['params/getUpcomingEventParams'],
333 page: rootGetters['pagination/getPage'],
334 }
335 } else {
336 commit('setLoading', true, { root: true })
337 }
338
339 if (
340 rootState.settings.appointments.pastDaysEvents !== null &&
341 eventParams.dates.length === 1
342 ) {
343 eventParams.dates[0] = moment(eventParams.dates[0], 'YYYY-MM-DD')
344 .subtract(rootState.settings.appointments.pastDaysEvents, 'days')
345 .format('YYYY-MM-DD')
346
347 rootState.settings.appointments.pastDaysEvents = 0
348 } else if (
349 rootState.settings.appointments.pastDaysEvents === null &&
350 eventParams.dates.length === 1
351 ) {
352 eventParams.dates = []
353
354 rootState.settings.appointments.pastDaysEvents = 0
355 }
356
357 let urlParams = useUrlQueryParams(window.location.href)
358
359 if (urlParams?.ameliaEventPopup) {
360 eventParams['idPopup'] = parseInt(urlParams.ameliaEventPopup)
361 }
362
363 let loadingCounter =
364 payload === 'upcoming' ? getters['getLoadingUpcomingCounter'] : getters['getLoadingCounter']
365
366 commit(
367 payload === 'upcoming' ? 'setLoadingUpcomingCounter' : 'setLoadingCounter',
368 ++loadingCounter,
369 )
370
371 httpClient
372 .get('/events', { params: useUrlParams(Object.assign({ bookings: false }, eventParams)) })
373 .then((response) => {
374 if (
375 loadingCounter !==
376 getters[payload === 'upcoming' ? 'getLoadingUpcomingCounter' : 'getLoadingCounter']
377 ) {
378 return
379 }
380
381 commit('pagination/setCount', response.data.data.count, {
382 root: true,
383 })
384 commit('pagination/setShow', rootState.settings.general.itemsPerPage, { root: true })
385
386 let events = []
387
388 let availableTranslationsShort = rootState.settings.general.usedLanguages.map((key) =>
389 key.length > 2 ? key.slice(0, 2) : key,
390 )
391
392 let useTranslations =
393 rootState.settings.general.usedLanguages.indexOf(rootState.localLanguage) !== -1 ||
394 availableTranslationsShort.indexOf(rootState.localLanguage.split('_')[0]) !== -1
395
396 response.data.data.events.forEach(function (event) {
397 event.gallery = event.gallery.sort((a, b) => (a.position > b.position ? 1 : -1))
398
399 if (useTranslations) {
400 event.name = getNameTranslated(event)
401 event.description = getDescriptionTranslated(event)
402
403 event.customTickets.forEach((ticket) => {
404 ticket.name = getTicketTranslated(ticket)
405 })
406 }
407
408 if (event.customTickets.length && event.customPricing) {
409 event.bookingToEventTickets = setTicketsData(event)
410 }
411
412 event.waitingList = setEventWaitingListSettings(event, rootState.settings)
413
414 if (!rootState.settings.featuresIntegrations.depositPayment.enabled) {
415 event.depositPayment = 'disabled'
416 }
417
418 events.push(event)
419
420 if (rootState.settings.general.showClientTimeZone) {
421 event.periods.forEach(function (period) {
422 let utcOffsetStart = moment(period.periodStart, 'YYYY-MM-DD HH:mm:ss')
423 .toDate()
424 .getTimezoneOffset()
425 let utcOffsetEnd = moment(period.periodEnd, 'YYYY-MM-DD HH:mm:ss')
426 .toDate()
427 .getTimezoneOffset()
428
429 if (utcOffsetStart > 0) {
430 period.periodStart = moment
431 .utc(period.periodStart, 'YYYY-MM-DD HH:mm:ss')
432 .subtract(utcOffsetStart, 'minutes')
433 .format('YYYY-MM-DD HH:mm:ss')
434 } else {
435 period.periodStart = moment
436 .utc(period.periodStart, 'YYYY-MM-DD HH:mm:ss')
437 .add(-1 * utcOffsetStart, 'minutes')
438 .format('YYYY-MM-DD HH:mm:ss')
439 }
440
441 if (utcOffsetEnd > 0) {
442 period.periodEnd = moment
443 .utc(period.periodEnd, 'YYYY-MM-DD HH:mm:ss')
444 .subtract(utcOffsetEnd, 'minutes')
445 .format('YYYY-MM-DD HH:mm:ss')
446 } else {
447 period.periodEnd = moment
448 .utc(period.periodEnd, 'YYYY-MM-DD HH:mm:ss')
449 .add(-1 * utcOffsetEnd, 'minutes')
450 .format('YYYY-MM-DD HH:mm:ss')
451 }
452 })
453 }
454 })
455
456 if (payload === 'calendar') {
457 commit('setCalendarEvents', events)
458 commit('setArrayPartsToEvents', events)
459 } else if (payload === 'upcoming') {
460 commit('setUpcomingEvents', events)
461 commit('setArrayPartsToEvents', events)
462 } else {
463 commit('setEvents', events)
464 }
465
466 commit('setReady', true, { root: true })
467 if (payload === 'upcoming') {
468 commit('setUpcomingLoading', false)
469 } else {
470 commit('setUpcomingLoading', false)
471 commit('setLoading', false, { root: true })
472 }
473 })
474 },
475 },
476 }
477