sistema_web/private-dynamic/static/timepicker/render.js

208 lines
4.6 KiB
JavaScript
Raw Permalink Normal View History

2023-02-27 16:21:22 -03:00
import { ONE_DAY } from "./constants";
import { moduloSeconds } from "./rounding";
function _getNoneOptionItems(settings) {
if (!settings.noneOption) {
return []
}
const noneOptions = _getNoneOptionItemsHelper(settings.noneOption);
if (Array.isArray(settings.noneOption)) {
return noneOptions;
} else {
return [noneOptions];
}
}
function _getNoneOptionItemsHelper(noneOption) {
if (Array.isArray(noneOption)) {
return noneOption.map(_getNoneOptionItemsHelper);
}
if (noneOption === true) {
return {
'label': 'None',
'value': ''
};
}
if (typeof noneOption === 'object') {
return noneOption;
}
return {
'label': noneOption,
'value': ''
};
}
function _getDropdownTimes(tp) {
const settings = tp.settings;
const start = settings.minTime() ?? 0;
let end = settings.maxTime() ?? start + ONE_DAY - 1;
if (end < start) {
// make sure the end time is greater than start time, otherwise there will be no list to show
end += ONE_DAY;
}
if (
end === ONE_DAY - 1 &&
typeof settings.timeFormat === 'string' &&
settings.show2400
) {
// show a 24:00 option when using military time
end = ONE_DAY;
}
const dr = settings.disableTimeRanges;
let drCur = 0;
const output = [];
for (var i = start, j = 0; i <= end; j++, i += settings.step(j) * 60) {
var timeInt = i;
const timeString = tp._int2time(timeInt);
const className = timeInt % ONE_DAY < ONE_DAY / 2
? 'ui-timepicker-am'
: 'ui-timepicker-pm';
const item = {
'label': timeString,
'value': moduloSeconds(timeInt, settings),
'className': className
}
if (
(settings.minTime() !== null || settings.durationTime() !== null) &&
settings.showDuration
) {
const durStart = settings.durationTime() ?? settings.minTime();
const durationString = tp._int2duration(i - durStart, settings.step());
item.duration = durationString;
}
if (drCur < dr.length) {
if (timeInt >= dr[drCur][1]) {
drCur += 1;
}
if (dr[drCur] && timeInt >= dr[drCur][0] && timeInt < dr[drCur][1]) {
item.disabled = true;
}
}
output.push(item);
}
return output;
}
function _renderSelectItem(item) {
const el = document.createElement('option');
el.value = item.label;
if (item.duration) {
el.appendChild(document.createTextNode(item.label + ' (' + item.duration + ')'));
} else {
el.appendChild(document.createTextNode(item.label));
}
if (item.disabled) {
el.disabled = true;
}
return el;
}
function _renderStandardItem(item) {
const el = document.createElement('li');
el.dataset['time'] = item.value;
if (item.className){
el.classList.add(item.className);
}
el.className = item.className;
el.appendChild(document.createTextNode(item.label));
if (item.duration) {
const durationEl = document.createElement('span');
durationEl.appendChild(document.createTextNode('('+item.duration+')'));
durationEl.classList.add('ui-timepicker-duration');
el.appendChild(durationEl);
}
if (item.disabled) {
el.classList.add('ui-timepicker-disabled');
}
return el;
}
function _renderStandardList(items) {
const list = document.createElement('ul');
list.classList.add('ui-timepicker-list');
for (const item of items) {
const itemEl = _renderStandardItem(item);
list.appendChild(itemEl);
}
const wrapper = document.createElement('div');
wrapper.classList.add('ui-timepicker-wrapper');
wrapper.tabIndex = -1;
wrapper.style.display = 'none';
wrapper.style.position = 'absolute';
wrapper.appendChild(list);
return wrapper;
}
function _renderSelectList(items, targetName) {
const el = document.createElement('select');
el.classList.add('ui-timepicker-select');
if (targetName) {
el.name = 'ui-timepicker-' + targetName;
}
for (const item of items) {
const itemEl = _renderSelectItem(item);
el.appendChild(itemEl);
}
return el
}
function renderHtml(tp) {
const items = [].concat(
_getNoneOptionItems(tp.settings),
_getDropdownTimes(tp));
let el;
if (tp.settings.useSelect) {
el = _renderSelectList(items, tp.targetEl.name)
} else {
el = _renderStandardList(items)
}
if (tp.settings.className) {
for (const token of tp.settings.className.split(' ')) {
el.classList.add(token);
}
}
if (tp.settings.showDuration
&& (tp.settings.minTime !== null || tp.settings.durationTime !== null)) {
el.classList.add("ui-timepicker-with-duration");
el.classList.add("ui-timepicker-step-" + tp.settings.step());
}
return el;
}
export default renderHtml;