Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implemented: operating hours functionality on facility details page (#28) #31

Merged
merged 18 commits into from
Nov 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
aaf886d
Implemented: UI for operating hours card, addOperatingHours modal, cu…
amansinghbais Nov 24, 2023
0c5ee1f
Improved: unused translation entry reverted (#28)
amansinghbais Nov 24, 2023
24d4d76
Improved: syntax, comments and added css to date time modal (#28)
amansinghbais Nov 27, 2023
c183c17
Implemented: logic for fetching all calendars on the card and modal (…
amansinghbais Nov 28, 2023
2717f85
Implemented: remove calendar from facility feature in popover (#28)
amansinghbais Nov 28, 2023
f3e616d
Improved: api endpoints for creating and removing calendar to facilit…
amansinghbais Nov 28, 2023
ae5ea70
Implemented: logic for custom start-end time selection (#28)
amansinghbais Nov 28, 2023
1e2718b
Implemented: create customSchedule calendar functionality, logic for …
amansinghbais Nov 29, 2023
7d412f6
Improved: code for adding translation to static text, properly import…
amansinghbais Nov 29, 2023
2d75565
Merge branch 'main' of https://github.com/hotwax/facilities into faci…
amansinghbais Nov 29, 2023
c549503
Improved: api logic, syntax, and disabled conditions in favbutton (#28)
amansinghbais Nov 29, 2023
dcaf2ba
Improved: calendarId in payload from api resp (#28)
amansinghbais Nov 29, 2023
7544cda
Improved: logic for addOperating Hours updation handling (#28)
amansinghbais Nov 29, 2023
54bb446
Improved: added flow to remove already associated calendar before cre…
amansinghbais Nov 29, 2023
72fdd20
Improved: code of custom schedule modal to only save if calendar name…
amansinghbais Nov 29, 2023
19ce209
Improved: checked attribute in ion-toggle (#28)
amansinghbais Nov 29, 2023
897c6e4
Merge branch 'main' of https://github.com/hotwax/facilities into faci…
amansinghbais Nov 29, 2023
506422a
Improved: payload for fetching calendars, and removed unused imports …
amansinghbais Nov 29, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
239 changes: 239 additions & 0 deletions src/components/AddOperatingHoursModal.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,239 @@
<template>
<ion-header>
<ion-toolbar>
<ion-buttons slot="start">
<ion-button @click="closeModal">
<ion-icon slot="icon-only" :icon="closeOutline" />
</ion-button>
</ion-buttons>
<ion-title>{{ translate("Add operating hours") }}</ion-title>
</ion-toolbar>
</ion-header>
<ion-content>
<ion-accordion-group v-model="selectedCalendarId" >
<ion-radio-group v-model="selectedCalendarId">
<ion-accordion v-for="calendar in calendars" :key="calendar.calendarId" :value="calendar.calendarId">
<ion-item slot="header">
<ion-radio :value="calendar.calendarId" slot="start" />
<ion-label class="ion-text-wrap">
{{ calendar.description }}
</ion-label>
</ion-item>
<div class="ion-padding" slot="content">
<ion-card class="ion-padding">
<ion-list lines="none">
<ion-item>
<ion-label>
<p>{{ translate("Monday") }}</p>
</ion-label>
<ion-label slot="end">{{ calendar.mondayStartTime ? getStartAndEndTime(calendar.mondayStartTime, calendar.mondayCapacity) : '-' }} </ion-label>
</ion-item>
<ion-item>
<ion-label>
<p>{{ translate("Tuesday") }}</p>
</ion-label>
<ion-label slot="end">{{ calendar.tuesdayStartTime ? getStartAndEndTime(calendar.tuesdayStartTime, calendar.tuesdayCapacity) : '-' }}</ion-label>
</ion-item>
<ion-item>
<ion-label>
<p>{{ translate("Wednesday") }}</p>
</ion-label>
<ion-label slot="end">{{ calendar.wednesdayStartTime ? getStartAndEndTime(calendar.wednesdayStartTime, calendar.wednesdayCapacity) : '-' }}</ion-label>
</ion-item>
<ion-item>
<ion-label>
<p>{{ translate("Thursday") }}</p>
</ion-label>
<ion-label slot="end">{{ calendar.thursdayStartTime ? getStartAndEndTime(calendar.thursdayStartTime, calendar.thursdayCapacity) : '-' }}</ion-label>
</ion-item>
<ion-item>
<ion-label>
<p>{{ translate("Friday") }}</p>
</ion-label>
<ion-label slot="end">{{ calendar.fridayStartTime ? getStartAndEndTime(calendar.fridayStartTime, calendar.fridayCapacity) : '-' }}</ion-label>
</ion-item>
<ion-item>
<ion-label>
<p>{{ translate("Saturday") }}</p>
</ion-label>
<ion-label slot="end">{{ calendar.saturdayStartTime ? getStartAndEndTime(calendar.saturdayStartTime, calendar.saturdayCapacity) : '-' }}</ion-label>
</ion-item>
<ion-item>
<ion-label>
<p>{{ translate("Sunday") }}</p>
</ion-label>
<ion-label slot="end">{{ calendar.sundayStartTime ? getStartAndEndTime(calendar.sundayStartTime, calendar.sundayCapacity) : '-' }}</ion-label>
</ion-item>
</ion-list>
</ion-card>
</div>
</ion-accordion>
</ion-radio-group>
</ion-accordion-group>
</ion-content>

<ion-fab vertical="bottom" horizontal="end" slot="fixed">
<ion-fab-button :disabled="!selectedCalendarId || facilityCalendar.calendarId === selectedCalendarId" @click="saveOperatingHours()">
<ion-icon :icon="saveOutline" />
</ion-fab-button>
</ion-fab>
</template>

<script lang="ts">
import {
IonAccordion,
IonAccordionGroup,
IonButton,
IonButtons,
IonCard,
IonContent,
IonFab,
IonFabButton,
IonHeader,
IonIcon,
IonItem,
IonLabel,
IonList,
IonRadio,
IonRadioGroup,
IonTitle,
IonToolbar,
modalController
} from "@ionic/vue";
import { defineComponent } from "vue";
import { mapGetters, useStore } from "vuex";
import { closeOutline, saveOutline } from "ionicons/icons";
import { translate } from '@hotwax/dxp-components'
import { FacilityService } from "@/services/FacilityService";
import { DateTime } from "luxon";
import { hasError } from "@/adapter";
import logger from "@/logger";
import { showToast } from "@/utils";

export default defineComponent({
name: "AddOperatingHoursModal",
components: {
IonAccordion,
IonAccordionGroup,
IonButton,
IonButtons,
IonCard,
IonContent,
IonFab,
IonFabButton,
IonHeader,
IonIcon,
IonItem,
IonLabel,
IonList,
IonRadio,
IonRadioGroup,
IonTitle,
IonToolbar,
},
data() {
return {
selectedCalendarId: '' as any
}
},
props: ["facilityId"],
computed: {
...mapGetters({
calendars: 'util/getCalendars',
facilityCalendar: 'facility/getFacilityCalendar'
})
},
beforeMount() {
this.selectedCalendarId = this.facilityCalendar.calendarId
},
methods: {
closeModal() {
modalController.dismiss({ dismissed: true});
},
saveOperatingHours() {
if(this.facilityCalendar?.calendarId) {
this.updateOperatingHours()
} else {
this.addOperatingHours()
}
},
async addOperatingHours() {
try {
const resp = await FacilityService.associateCalendarToFacility({
facilityId: this.facilityId,
calendarId: this.selectedCalendarId,
fromDate: DateTime.now().toMillis(),
facilityCalendarTypeId: 'OPERATING_HOURS'
})

if(!hasError(resp)) {
showToast(translate("Successfully associated calendar to the facility."))
await this.store.dispatch('facility/fetchFacilityCalendar', { facilityId: this.facilityId })
} else {
throw resp.data
}
} catch(err) {
showToast(translate("Failed to associate calendar to the facility."))
logger.error(err)
}

modalController.dismiss()
},
async updateOperatingHours() {
let resp;
try {
resp = await FacilityService.removeFacilityCalendar({
facilityId: this.facilityId,
calendarId: this.facilityCalendar.calendarId,
facilityCalendarTypeId: this.facilityCalendar.facilityCalendarTypeId,
fromDate: this.facilityCalendar.fromDate
})

if(!hasError(resp)) {
resp = await FacilityService.associateCalendarToFacility({
facilityId: this.facilityId,
calendarId: this.selectedCalendarId,
fromDate: DateTime.now().toMillis(),
facilityCalendarTypeId: 'OPERATING_HOURS'
})

if(!hasError(resp)) {
showToast(translate("Successfully associated calendar to the facility."))
await this.store.dispatch('facility/fetchFacilityCalendar', { facilityId: this.facilityId })
} else {
throw resp.data
}
} else {
throw resp.data;
}
} catch(err) {
showToast(translate("Failed to associate calendar to the facility."))
logger.error(err)
}

modalController.dismiss()
},
getStartAndEndTime(startTime: any, capacity: any) {
const formatedStartTime = DateTime.fromFormat(startTime, 'HH:mm:ss').toFormat('HH:mm a');
const endTime = DateTime.fromMillis(DateTime.fromFormat(startTime, 'HH:mm:ss').toMillis() + capacity).toFormat('hh:mm a')
return `${formatedStartTime} - ${endTime}`
}
},
setup() {
const store = useStore();

return {
closeOutline,
saveOutline,
store,
translate
};
},
});
</script>

<style scoped>
ion-content {
--padding-bottom: 80px;
}
</style>
Loading
Loading