217 lines
5.3 KiB
JavaScript
217 lines
5.3 KiB
JavaScript
import './ui/css/variables/definition.scss';
|
||
import './ui/css/common.scss';
|
||
import { createElement } from "./functions";
|
||
import { createIcon, changeIcon, resolveIcon } from "./ui/icon";
|
||
import { createCheckbox, createRadiobox, resolveCheckbox } from "./ui/checkbox";
|
||
import { setTooltip, resolveTooltip } from "./ui/tooltip";
|
||
import { createTab } from "./ui/tab";
|
||
import { Dropdown } from "./ui/dropdown";
|
||
import { Grid } from "./ui/grid/grid";
|
||
import { GridColumn, GridInputColumn, GridDropdownColumn, GridCheckboxColumn, GridIconColumn, GridTextColumn, GridDateColumn } from './ui/grid/column';
|
||
import { Popup, createPopup, resolvePopup, showAlert, showInput, showConfirm } from "./ui/popup";
|
||
import { createPicture, createAudio, createVideo, createFile, createVideoList } from './ui/media';
|
||
import { validation, convertCssStyle } from './ui/extension';
|
||
import { createDateInput, toDateValue, getFormatter, formatDate, setDateValue, getDateValue, DateSelector } from './ui/date';
|
||
import * as utility from './utility';
|
||
|
||
function requestAnimationFrame(callback) {
|
||
if (typeof utility.global.requestAnimationFrame === 'function') {
|
||
utility.global.requestAnimationFrame(callback);
|
||
} else {
|
||
setTimeout(callback, 0);
|
||
}
|
||
}
|
||
|
||
function scrollLeft() {
|
||
const n = document.documentElement;
|
||
return (utility.global.scrollX || n.scrollLeft) - (n.clientLeft || 0);
|
||
}
|
||
|
||
function scrollTop() {
|
||
const n = document.documentElement;
|
||
return (utility.global.scrollY || n.scrollTop) - (n.clientTop || 0);
|
||
}
|
||
|
||
/**
|
||
* @private
|
||
* @param {HTMLElement} e
|
||
*/
|
||
function offset(e) {
|
||
const rect = e.getBoundingClientRect();
|
||
return {
|
||
top: rect.top + scrollTop(),
|
||
left: rect.left + scrollLeft(),
|
||
height: rect.height,
|
||
width: rect.width
|
||
};
|
||
}
|
||
|
||
class OptionBase {
|
||
_option;
|
||
|
||
r;
|
||
|
||
constructor(opt) {
|
||
this._option = opt;
|
||
const getText = opt.getText;
|
||
if (typeof getText === 'function') {
|
||
this.r = getText;
|
||
} else if (typeof GetTextByKey === 'function') {
|
||
this.r = GetTextByKey;
|
||
} else {
|
||
this.r = utility.r;
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 通知选项
|
||
* @typedef NotifyOption
|
||
* @property {string | HTMLElement} message - 内容,支持自定义元素
|
||
* @property {HTMLElement} [parent] - 目标父元素
|
||
* @property {string} [title] - 标题
|
||
* @property {"success" | "warning" | "error"} [type] - 提示类型
|
||
* @property {boolean} [persistent] - 是否持续显示,默认为 `false`,3 秒后自动关闭
|
||
* @property {number} [timeout] - 超时时间,默认 3 秒
|
||
* @property {(auto: boolean) => void} [onDismissed] - 关闭时触发的函数
|
||
*/
|
||
|
||
/**
|
||
* @private
|
||
* @param {HTMLDivElement} wrapper
|
||
* @param {(auto: boolean) => void} [onDismissed]
|
||
* @param {boolean} [auto]
|
||
*/
|
||
function closeNotify(wrapper, onDismissed, auto) {
|
||
wrapper.classList.remove('active');
|
||
setTimeout(() => {
|
||
wrapper.remove();
|
||
if (typeof onDismissed === 'function') {
|
||
onDismissed(auto);
|
||
}
|
||
}, 120);
|
||
}
|
||
|
||
/**
|
||
*
|
||
* @param {NotifyOption} opts
|
||
*/
|
||
function notify(opts) {
|
||
opts ||= {};
|
||
let timer;
|
||
const close = createIcon('fa-light', 'times');
|
||
close.classList.add('ui-notify-close');
|
||
close.addEventListener('click', () => {
|
||
timer && clearTimeout(timer);
|
||
closeNotify(wrapper, opts.onDismissed);
|
||
});
|
||
let type;
|
||
let typeClass;
|
||
opts.type ||= 'success';
|
||
switch (opts.type) {
|
||
case 'warning':
|
||
type = 'exclamation-circle';
|
||
typeClass = 'warning';
|
||
break;
|
||
case 'error':
|
||
type = 'times-circle';
|
||
typeClass = 'error';
|
||
break;
|
||
case 'success':
|
||
type = 'check-circle';
|
||
typeClass = 'success';
|
||
break;
|
||
default:
|
||
type = opts.type;
|
||
typeClass = 'success';
|
||
break;
|
||
}
|
||
const icon = createIcon('fa-solid', type);
|
||
icon.classList.add('ui-notify-type', typeClass);
|
||
const wrapper = createElement('div', 'ui-notify',
|
||
utility.nullOrEmpty(opts.title) ?
|
||
createElement('div', 'ui-notify-single',
|
||
icon,
|
||
createElement('span', 'ui-notify-message', opts.message),
|
||
close
|
||
) :
|
||
createElement('div', 'ui-notify-content',
|
||
createElement('div', 'ui-notify-header',
|
||
icon,
|
||
createElement('h2', 'ui-notify-title', opts.title),
|
||
close
|
||
),
|
||
createElement('span', 'ui-notify-message', opts.message)
|
||
)
|
||
);
|
||
if (!opts.persistent) {
|
||
timer = setTimeout(() => {
|
||
closeNotify(wrapper, opts.onDismissed, true);
|
||
}, opts.timeout || 3000);
|
||
}
|
||
(opts.parent ?? document.body).appendChild(wrapper);
|
||
setTimeout(() => wrapper.classList.add('active'), 10);
|
||
return wrapper;
|
||
}
|
||
|
||
export {
|
||
createElement,
|
||
// icon
|
||
createIcon,
|
||
changeIcon,
|
||
resolveIcon,
|
||
// checkbox
|
||
createCheckbox,
|
||
createRadiobox,
|
||
resolveCheckbox,
|
||
// tooltip
|
||
setTooltip,
|
||
resolveTooltip,
|
||
// tab
|
||
createTab,
|
||
// dropdown
|
||
Dropdown,
|
||
// grid
|
||
Grid,
|
||
GridColumn,
|
||
GridInputColumn,
|
||
GridDropdownColumn,
|
||
GridCheckboxColumn,
|
||
GridIconColumn,
|
||
GridTextColumn,
|
||
GridDateColumn,
|
||
// popup
|
||
Popup,
|
||
createPopup,
|
||
resolvePopup,
|
||
showAlert,
|
||
showInput,
|
||
showConfirm,
|
||
// dateSelector
|
||
createDateInput,
|
||
toDateValue,
|
||
getFormatter,
|
||
formatDate,
|
||
setDateValue,
|
||
getDateValue,
|
||
DateSelector,
|
||
// media
|
||
createPicture,
|
||
createAudio,
|
||
createVideo,
|
||
createFile,
|
||
createVideoList,
|
||
// extension
|
||
validation,
|
||
convertCssStyle,
|
||
// utility
|
||
utility,
|
||
// functions
|
||
requestAnimationFrame,
|
||
offset,
|
||
// base classes
|
||
OptionBase,
|
||
// notify
|
||
notify
|
||
}
|