mirror of
https://github.com/eitchtee/WYGIWYH.git
synced 2026-03-18 15:34:01 +01:00
247 lines
7.5 KiB
JavaScript
247 lines
7.5 KiB
JavaScript
import AirDatepicker from 'air-datepicker';
|
|
import en from 'air-datepicker/locale/en';
|
|
import ptBr from 'air-datepicker/locale/pt-BR';
|
|
import nl from 'air-datepicker/locale/nl';
|
|
import de from 'air-datepicker/locale/de';
|
|
import {createPopper} from '@popperjs/core';
|
|
|
|
const locales = {
|
|
'pt': ptBr,
|
|
'en': en,
|
|
'nl': nl,
|
|
'de': de
|
|
};
|
|
|
|
function isMobileDevice() {
|
|
const mobileRegex = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;
|
|
return mobileRegex.test(navigator.userAgent);
|
|
}
|
|
|
|
function isTouchDevice() {
|
|
return ('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0);
|
|
}
|
|
|
|
function isMobile() {
|
|
return isMobileDevice() || isTouchDevice();
|
|
}
|
|
|
|
window.DatePicker = function createDynamicDatePicker(element) {
|
|
let todayButton = {
|
|
content: element.dataset.nowButtonTxt,
|
|
onClick: (dp) => {
|
|
let date = new Date();
|
|
dp.selectDate(date, {updateTime: true});
|
|
dp.setViewDate(date);
|
|
}
|
|
}
|
|
|
|
let isOnMobile = isMobile();
|
|
|
|
let baseOpts = {
|
|
isMobile: isOnMobile,
|
|
dateFormat: element.dataset.dateFormat,
|
|
timeFormat: element.dataset.timeFormat,
|
|
timepicker: element.dataset.timepicker === 'true',
|
|
toggleSelected: element.dataset.toggleSelected === 'true',
|
|
autoClose: element.dataset.autoClose === 'true',
|
|
buttons: element.dataset.clearButton === 'true' ? ['clear', todayButton] : [todayButton],
|
|
locale: locales[element.dataset.language] || locales['en'],
|
|
onSelect: ({date, formattedDate, datepicker}) => {
|
|
const _event = new CustomEvent("change", {
|
|
bubbles: true,
|
|
});
|
|
datepicker.$el.dispatchEvent(_event);
|
|
}
|
|
};
|
|
|
|
const positionConfig = !isOnMobile ? {
|
|
position({$datepicker, $target, $pointer, done}) {
|
|
let popper = createPopper($target, $datepicker, {
|
|
placement: 'bottom',
|
|
modifiers: [
|
|
{
|
|
name: 'flip',
|
|
options: {
|
|
padding: {
|
|
top: 64
|
|
}
|
|
}
|
|
},
|
|
{
|
|
name: 'offset',
|
|
options: {
|
|
offset: [0, 20]
|
|
}
|
|
},
|
|
{
|
|
name: 'arrow',
|
|
options: {
|
|
element: $pointer
|
|
}
|
|
}
|
|
]
|
|
});
|
|
|
|
return function completeHide() {
|
|
popper.destroy();
|
|
done();
|
|
};
|
|
}
|
|
} : {};
|
|
|
|
let opts = {...baseOpts, ...positionConfig};
|
|
|
|
if (element.dataset.value) {
|
|
opts["selectedDates"] = [element.dataset.value];
|
|
opts["startDate"] = [element.dataset.value];
|
|
}
|
|
|
|
return new AirDatepicker(element, opts);
|
|
};
|
|
|
|
window.MonthYearPicker = function createDynamicDatePicker(element) {
|
|
let todayButton = {
|
|
content: element.dataset.nowButtonTxt,
|
|
onClick: (dp) => {
|
|
let date = new Date();
|
|
dp.selectDate(date, {updateTime: true});
|
|
dp.setViewDate(date);
|
|
}
|
|
}
|
|
|
|
let isOnMobile = isMobile();
|
|
|
|
let baseOpts = {
|
|
isMobile: isOnMobile,
|
|
view: 'months',
|
|
minView: 'months',
|
|
dateFormat: 'MMMM yyyy',
|
|
toggleSelected: element.dataset.toggleSelected === 'true',
|
|
autoClose: element.dataset.autoClose === 'true',
|
|
buttons: element.dataset.clearButton === 'true' ? ['clear', todayButton] : [todayButton],
|
|
locale: locales[element.dataset.language] || locales['en'],
|
|
onSelect: ({date, formattedDate, datepicker}) => {
|
|
const _event = new CustomEvent("change", {
|
|
bubbles: true,
|
|
});
|
|
datepicker.$el.dispatchEvent(_event);
|
|
}
|
|
};
|
|
|
|
const positionConfig = !isOnMobile ? {
|
|
position({$datepicker, $target, $pointer, done}) {
|
|
let popper = createPopper($target, $datepicker, {
|
|
placement: 'bottom',
|
|
modifiers: [
|
|
{
|
|
name: 'flip',
|
|
options: {
|
|
padding: {
|
|
top: 64
|
|
}
|
|
}
|
|
},
|
|
{
|
|
name: 'offset',
|
|
options: {
|
|
offset: [0, 20]
|
|
}
|
|
},
|
|
{
|
|
name: 'arrow',
|
|
options: {
|
|
element: $pointer
|
|
}
|
|
}
|
|
]
|
|
});
|
|
|
|
return function completeHide() {
|
|
popper.destroy();
|
|
done();
|
|
};
|
|
}
|
|
} : {};
|
|
|
|
let opts = {...baseOpts, ...positionConfig};
|
|
|
|
if (element.dataset.value) {
|
|
opts["selectedDates"] = [new Date(element.dataset.value + "T00:00:00")];
|
|
opts["startDate"] = [new Date(element.dataset.value + "T00:00:00")];
|
|
}
|
|
return new AirDatepicker(element, opts);
|
|
};
|
|
|
|
window.YearPicker = function createDynamicDatePicker(element) {
|
|
let todayButton = {
|
|
content: element.dataset.nowButtonTxt,
|
|
onClick: (dp) => {
|
|
let date = new Date();
|
|
dp.selectDate(date, {updateTime: true});
|
|
dp.setViewDate(date);
|
|
}
|
|
}
|
|
|
|
let isOnMobile = isMobile();
|
|
|
|
let baseOpts = {
|
|
isMobile: isOnMobile,
|
|
view: 'years',
|
|
minView: 'years',
|
|
dateFormat: 'yyyy',
|
|
toggleSelected: element.dataset.toggleSelected === 'true',
|
|
autoClose: element.dataset.autoClose === 'true',
|
|
buttons: element.dataset.clearButton === 'true' ? ['clear', todayButton] : [todayButton],
|
|
locale: locales[element.dataset.language] || locales['en'],
|
|
onSelect: ({date, formattedDate, datepicker}) => {
|
|
const _event = new CustomEvent("change", {
|
|
bubbles: true,
|
|
});
|
|
datepicker.$el.dispatchEvent(_event);
|
|
}
|
|
};
|
|
|
|
const positionConfig = !isOnMobile ? {
|
|
position({$datepicker, $target, $pointer, done}) {
|
|
let popper = createPopper($target, $datepicker, {
|
|
placement: 'bottom',
|
|
modifiers: [
|
|
{
|
|
name: 'flip',
|
|
options: {
|
|
padding: {
|
|
top: 64
|
|
}
|
|
}
|
|
},
|
|
{
|
|
name: 'offset',
|
|
options: {
|
|
offset: [0, 20]
|
|
}
|
|
},
|
|
{
|
|
name: 'arrow',
|
|
options: {
|
|
element: $pointer
|
|
}
|
|
}
|
|
]
|
|
});
|
|
|
|
return function completeHide() {
|
|
popper.destroy();
|
|
done();
|
|
};
|
|
}
|
|
} : {};
|
|
|
|
let opts = {...baseOpts, ...positionConfig};
|
|
|
|
if (element.dataset.value) {
|
|
opts["selectedDates"] = [new Date(element.dataset.value + "T00:00:00")];
|
|
opts["startDate"] = [new Date(element.dataset.value + "T00:00:00")];
|
|
}
|
|
return new AirDatepicker(element, opts);
|
|
};
|