PluginProbe ʕ •ᴥ•ʔ
Booking for Appointments and Events Calendar – Amelia / 1.2.20
Booking for Appointments and Events Calendar – Amelia v1.2.20
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 year ago attendee.js 1 year ago auth.js 1 year ago bookableType.js 3 years ago booking.js 1 year ago cabinet.js 1 year ago cabinetFilters.js 1 year ago coupon.js 2 years ago customFields.js 2 years ago customerInfo.js 1 year ago employee.js 1 year ago entities.js 1 year ago event.js 1 year ago eventBooking.js 3 years ago eventEntities.js 1 year ago eventWaitingListOptions.js 1 year ago pagination.js 3 years ago params.js 1 year ago payment.js 2 years ago persons.js 1 year ago recurring.js 1 year ago shortcodeParams.js 2 years ago tickets.js 1 year ago
eventEntities.js
365 lines
1 import httpClient from "../../plugins/axios.js"
2 import { useUrlParams } 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 ? 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 generalSettings = JSON.parse(JSON.stringify(settings.appointments.waitingListEvents))
40 let parsedSettings = JSON.parse(event.settings)
41
42 // * if global waiting list is turned off
43 if (!generalSettings.enabled && parsedSettings !== null && 'waitingList' in parsedSettings) {
44 parsedSettings.waitingList.enabled = generalSettings.enabled
45 }
46
47 // * waiting list is not in use, but it's enabled
48 if (!('peopleWaiting' in generalSettings)) generalSettings.peopleWaiting = 0
49
50 return parsedSettings !== null && parsedSettings?.waitingList ? parsedSettings.waitingList : generalSettings
51 }
52
53 function getEntitiesVariableName () {
54 return 'ameliaEventEntities' in window
55 ? 'ameliaEventEntities'
56 : ('ameliaEntities' in window ? 'ameliaEntities' : false)
57 }
58
59 export default {
60 namespaced: true,
61
62 state: () => ({
63 events: [],
64 tags:[],
65 locations: [],
66 employees: [],
67 customFields: [],
68 taxes: [],
69 calendarEvents: [],
70 upcomingEvents: [],
71 upcomingLoading: true,
72 eventsDisplay: ''
73 }),
74
75 getters: {
76 getEvents (state) {
77 return state.events
78 },
79
80 getEvent: (state) => (id) => {
81 return state.events.find(event => parseInt(event.id) === parseInt(id)) || null
82 },
83
84 getTags (state) {
85 return state.tags
86 },
87
88 getEmployees (state) {
89 return state.employees
90 },
91
92 getLocations (state) {
93 return state.locations
94 },
95
96 getCustomFields (state) {
97 return state.customFields
98 },
99
100 getEventCustomFields: (state) => (id) => {
101 return state.customFields.filter(customField => customField.events.filter(event => event.id === id).length)
102 },
103
104 getFilteredLocations: (state) => (shortcode) => {
105 return state.locations.filter(l => (shortcode.locations && shortcode.locations.length > 0 ? shortcode.locations.find(loc => parseInt(loc) === l.id) : true ))
106 },
107
108 getFilteredTags: (state) => (shortcode) => {
109 return state.tags.filter(t =>
110 (shortcode.tags && shortcode.tags.length > 0 ? shortcode.tags.includes(t.name) : true )
111 // ! this cause problems on visibility filter tag field
112 && (shortcode.ids && shortcode.ids.length > 0 ? state.events.map(e => e.tags).flat().filter(tag => tag.name === t.name).length > 0 : true)
113 )
114 },
115
116 getTaxes (state) {
117 return state.taxes
118 },
119
120 getTax: (state) => (id) => {
121 return state.taxes.find(i => parseInt(i.id) === parseInt(id)) || null
122 },
123
124 getCalendarEvents (state) {
125 return state.calendarEvents
126 },
127
128 getUpcomingEvents (state) {
129 return state.upcomingEvents
130 },
131
132 getUpcomingLoading (state) {
133 return state.upcomingLoading
134 },
135
136 getEventsDisplay (state) {
137 return state.eventsDisplay
138 }
139 },
140
141 mutations: {
142 setTaxes (state, payload) {
143 state.taxes = payload
144 },
145
146 setEvents (state, payload) {
147 state.events = payload
148 },
149
150 setTags (state, payload) {
151 state.tags = payload
152 },
153
154 setEmployees (state, payload) {
155 state.employees = payload.filter(e => e.status !== 'hidden')
156 },
157
158 setLocations (state, payload) {
159 state.locations = payload.filter(l => l.status !== 'hidden')
160 },
161
162 setCustomFields (state, payload) {
163 state.customFields = [...Object.values(payload)]
164 },
165
166 setCalendarEvents (state, payload) {
167 state.calendarEvents = payload
168 },
169
170 setUpcomingEvents (state, payload) {
171 state.upcomingEvents = payload
172 },
173
174 setArrayPartsToEvents (state, payload) {
175 const eventIds = new Set(state.events.map(item => item.id))
176 const filteredArrayParts = payload.filter(item => !eventIds.has(item.id))
177
178 state.events = [...state.events, ...filteredArrayParts]
179 },
180
181 setUpcomingLoading (state, payload) {
182 state.upcomingLoading = payload
183 },
184
185 setEventsDisplay (state, payload) {
186 state.eventsDisplay = payload
187 }
188 },
189
190 actions: {
191 requestEntities ({ dispatch, commit, rootGetters }, payload) {
192 commit('setReady', false, {root: true})
193 commit('params/setParams', rootGetters['shortcodeParams/getShortcodeParams'], {root: true})
194
195 let serverData = {
196 types: payload.types
197 }
198
199 if (payload.loadEntities && !getEntitiesVariableName()) {
200 httpClient.get(
201 '/entities',
202 { params: useUrlParams({types: serverData.types, lite: true}) }
203 ).then(response => {
204 window.ameliaEventEntities = response.data.data
205
206 serverData.entities = JSON.parse(JSON.stringify(window.ameliaEventEntities))
207
208 dispatch('fillingOutData', serverData)
209 })
210 } else {
211 let ameliaApiInterval = setInterval(
212 () => {
213 let name = getEntitiesVariableName()
214
215 if (name) {
216 clearInterval(ameliaApiInterval)
217
218 serverData.entities = JSON.parse(JSON.stringify(window[name]))
219
220 dispatch('fillingOutData', serverData)
221 }
222 },
223 1000
224 )
225 }
226 },
227
228 fillingOutData ({ commit, dispatch, rootState, getters }, payload) {
229 let availableTranslationsShort = rootState.settings.general.usedLanguages.map(
230 key => key.length > 2 ? key.slice(0, 2) : key
231 )
232
233 if (rootState.settings.general.usedLanguages.indexOf(rootState.localLanguage) !== -1 ||
234 availableTranslationsShort.indexOf(rootState.localLanguage.split('_')[0]) !== -1
235 ) {
236 useTranslateEntities(payload.entities)
237
238 rootState.settings.roles.providerBadges.badges.forEach(badge => {
239 badge.content = getBadgeTranslated(badge)
240 })
241 }
242
243 setEmployeeBadgesData(payload.entities.employees, rootState.settings.roles.providerBadges.badges)
244
245 payload.types.forEach(ent => {
246 if (!(ent in payload.entities)) {
247 payload.entities[ent] = []
248 }
249
250 commit(
251 `set${ent.charAt(0).toUpperCase()}${ent.slice(1)}`,
252 ent === 'customFields' ? payload.entities['customFields'].sort(function(a, b) {
253 return ((a['position'] < b['position']) ? -1 : ((a['position'] > b['position']) ? 1 : 0));
254 }) : payload.entities[ent]
255 )
256 })
257
258 if (getters['getEventsDisplay']) {
259 dispatch('requestEvents', getters['getEventsDisplay'])
260 } else {
261 dispatch('requestEvents')
262 }
263 },
264
265 requestEvents ({ commit, rootState, rootGetters }, payload) {
266 let eventParams = {...rootGetters['params/getEventParams'], page: rootGetters['pagination/getPage']}
267
268 if (payload === 'upcoming') {
269 commit('setUpcomingLoading', true)
270 eventParams = {...rootGetters['params/getUpcomingEventParams'], page: rootGetters['pagination/getPage']}
271 } else {
272 commit('setLoading', true, {root: true})
273 }
274
275 if (rootState.settings.appointments.pastDaysEvents !== null && eventParams.dates.length === 1) {
276 eventParams.dates[0] =
277 moment(eventParams.dates[0], 'YYYY-MM-DD')
278 .subtract(rootState.settings.appointments.pastDaysEvents, 'days')
279 .format('YYYY-MM-DD')
280
281 rootState.settings.appointments.pastDaysEvents = 0
282 } else if (rootState.settings.appointments.pastDaysEvents === null && eventParams.dates.length === 1) {
283 eventParams.dates = []
284
285 rootState.settings.appointments.pastDaysEvents = 0
286 }
287
288 httpClient.get(
289 '/events',
290 { params: useUrlParams(eventParams)}
291 ).then(response => {
292
293 commit('pagination/setCount', response.data.data.count , {root: true})
294 commit('pagination/setShow', rootState.settings.general.itemsPerPage , {root: true})
295
296 let events = []
297
298 let availableTranslationsShort = rootState.settings.general.usedLanguages.map(
299 key => key.length > 2 ? key.slice(0, 2) : key
300 )
301
302 let useTranslations = rootState.settings.general.usedLanguages.indexOf(rootState.localLanguage) !== -1 ||
303 availableTranslationsShort.indexOf(rootState.localLanguage.split('_')[0]) !== -1
304
305 response.data.data.events.forEach(function (event) {
306 event.gallery = event.gallery.sort((a, b) => (a.position > b.position) ? 1 : -1)
307
308 if (useTranslations) {
309 event.name = getNameTranslated(event)
310 event.description = getDescriptionTranslated(event)
311
312 event.customTickets.forEach((ticket) => {
313 ticket.name = getTicketTranslated(ticket)
314 })
315 }
316
317 if (event.customTickets.length && event.customPricing) {
318 event.bookingToEventTickets = setTicketsData(event)
319 }
320
321 event.waitingList = setEventWaitingListSettings(event, rootState.settings)
322
323 events.push(event)
324
325 if (rootState.settings.general.showClientTimeZone) {
326 event.periods.forEach(function (period) {
327 let utcOffsetStart = moment(period.periodStart, 'YYYY-MM-DD HH:mm:ss').toDate().getTimezoneOffset()
328 let utcOffsetEnd = moment(period.periodEnd, 'YYYY-MM-DD HH:mm:ss').toDate().getTimezoneOffset()
329
330 if (utcOffsetStart > 0) {
331 period.periodStart = moment.utc(period.periodStart, 'YYYY-MM-DD HH:mm:ss').subtract(utcOffsetStart, 'minutes').format('YYYY-MM-DD HH:mm:ss')
332 } else {
333 period.periodStart = moment.utc(period.periodStart, 'YYYY-MM-DD HH:mm:ss').add(-1 * utcOffsetStart, 'minutes').format('YYYY-MM-DD HH:mm:ss')
334 }
335
336 if (utcOffsetEnd > 0) {
337 period.periodEnd = moment.utc(period.periodEnd, 'YYYY-MM-DD HH:mm:ss').subtract(utcOffsetEnd, 'minutes').format('YYYY-MM-DD HH:mm:ss')
338 } else {
339 period.periodEnd = moment.utc(period.periodEnd, 'YYYY-MM-DD HH:mm:ss').add(-1 * utcOffsetEnd, 'minutes').format('YYYY-MM-DD HH:mm:ss')
340 }
341 })
342 }
343 })
344
345 if (payload === 'calendar') {
346 commit('setCalendarEvents', events)
347 commit('setArrayPartsToEvents', events)
348 } else if (payload === 'upcoming') {
349 commit('setUpcomingEvents', events)
350 commit('setArrayPartsToEvents', events)
351 } else {
352 commit('setEvents', events)
353 }
354
355 commit('setReady', true, { root: true })
356 if (payload === 'upcoming') {
357 commit('setUpcomingLoading', false)
358 } else {
359 commit('setLoading', false, { root: true })
360 }
361 })
362 },
363 }
364 }
365