import { createApp } from 'vue'; import App from './App.vue'; import i18n from './i18n'; import router from './router'; import { format } from 'date-fns-tz'; //Do not change store import. //Exact match alias set to support //dotenv customizations. import store from './store'; import eventBus from './eventBus'; import { ToastPlugin } from './plugins/toast'; import { BButton, BContainer, BForm, BFormGroup, BFormInput, BFormCheckboxGroup, BInputGroup, BInputGroupText, BFormSelect, BFormSelectOption, BFormFile, BFormCheckbox, BFormRadioGroup, BFormRadio, BFormText, BFormTextarea, BFormTags, BFormInvalidFeedback, BTable, BToast, BModal, BCloseButton, BAlert, BCard, BCardHeader, BCardBody, BCardFooter, BCardGroup, BRow, BCol, BBadge, BSpinner, BDropdown, BDropdownItem, BNav, BNavbar, BNavbarBrand, BNavbarNav, BNavItem, BNavbarToggle, BCollapse, BPagination, BTooltip, BPopover, BProgress, BProgressBar, BOverlay, BListGroup, BListGroupItem, BTabs, BTab, BLink, BOrchestrator, createBootstrap, vBToggle, vBTooltip, vBPopover, vBModal, } from 'bootstrap-vue-next'; const app = createApp(App); // Note: We register only the components/directives we need // Use createBootstrap for all bootstrap-vue-next plugins in 0.40.7+ app.use(createBootstrap()); app.component('BButton', BButton); app.component('BBtn', BButton); app.component('BContainer', BContainer); app.component('BForm', BForm); app.component('BFormGroup', BFormGroup); app.component('BFormInput', BFormInput); app.component('BFormCheckboxGroup', BFormCheckboxGroup); app.component('BInputGroup', BInputGroup); app.component('BInputGroupText', BInputGroupText); app.component('BFormSelect', BFormSelect); app.component('BFormSelectOption', BFormSelectOption); app.component('BFormFile', BFormFile); app.component('BFormCheckbox', BFormCheckbox); app.component('BFormRadioGroup', BFormRadioGroup); app.component('BFormRadio', BFormRadio); app.component('BFormText', BFormText); app.component('BFormTextarea', BFormTextarea); app.component('BFormTags', BFormTags); app.component('BFormInvalidFeedback', BFormInvalidFeedback); app.component('BTable', BTable); app.component('BToast', BToast); app.component('BModal', BModal); app.component('BCloseButton', BCloseButton); app.component('BAlert', BAlert); app.component('BCard', BCard); app.component('BCardHeader', BCardHeader); app.component('BCardBody', BCardBody); app.component('BCardFooter', BCardFooter); app.component('BCardGroup', BCardGroup); app.component('BRow', BRow); app.component('BCol', BCol); app.component('BBadge', BBadge); app.component('BSpinner', BSpinner); app.component('BDropdown', BDropdown); app.component('BDropdownItem', BDropdownItem); app.component('BNav', BNav); app.component('BNavbar', BNavbar); app.component('BNavbarBrand', BNavbarBrand); app.component('BNavbarNav', BNavbarNav); app.component('BNavItem', BNavItem); app.component('BNavbarToggle', BNavbarToggle); app.component('BCollapse', BCollapse); app.component('BPagination', BPagination); app.component('BTooltip', BTooltip); app.component('BPopover', BPopover); app.component('BProgress', BProgress); app.component('BProgressBar', BProgressBar); app.component('BOverlay', BOverlay); app.component('BListGroup', BListGroup); app.component('BListGroupItem', BListGroupItem); app.component('BTabs', BTabs); app.component('BTab', BTab); app.component('BLink', BLink); app.component('BOrchestrator', BOrchestrator); // Register BootstrapVue Next directives used in templates app.directive('b-toggle', vBToggle); app.directive('b-tooltip', vBTooltip); app.directive('b-popover', vBPopover); app.directive('b-modal', vBModal); app.use(i18n); app.use(router); app.use(store); app.use(ToastPlugin); app.config.globalProperties.$eventBus = eventBus; app.config.globalProperties.$confirm = (messageOrOptions) => { return new Promise((resolve) => { eventBus.$emit('confirm:open', { ...(typeof messageOrOptions === 'string' ? { message: messageOrOptions } : messageOrOptions), resolve, }); }); }; //Filters const filter = { formatDate(value) { const isUtcDisplay = store.getters['global/isUtcDisplay']; if (value instanceof Date) { if (isUtcDisplay) { return value.toISOString().substring(0, 10); } const pattern = `yyyy-MM-dd`; const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; return format(value, pattern, { timezone }); } }, formatTime(value) { const isUtcDisplay = store.getters['global/isUtcDisplay']; if (value instanceof Date) { if (isUtcDisplay) { let timeOptions = { timeZone: 'UTC', hourCycle: 'h23', }; return `${value.toLocaleTimeString('default', timeOptions)} UTC`; } const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; const shortTz = this.shortTimeZone(value); const pattern = `HH:mm:ss ('${shortTz}' O)`; return format(value, pattern, { timezone }).replace('GMT', 'UTC'); } }, shortTimeZone(value) { const longTZ = value .toString() .match(/\((.*)\)/) .pop(); const regexNotUpper = /[*a-z ]/g; return longTZ.replace(regexNotUpper, ''); }, }; app.config.globalProperties.$filters = filter; app.mount('#app');