11660 lines
358 KiB
JavaScript
11660 lines
358 KiB
JavaScript
import { createVNode, defineComponent, computed, unref, mergeProps, ref, Fragment, toRef, watch, watchEffect, shallowRef, provide, useAttrs, getCurrentScope, onScopeDispose, inject, getCurrentInstance, onMounted, nextTick, createTextVNode, useSSRContext } from 'vue';
|
||
import { ssrRenderComponent } from 'vue/server-renderer';
|
||
import { bC as D, bD as Y, bE as W, bF as MS, bG as Q, bH as M, bI as FORMAT_DEFAULT, b8 as Icon, av as dayjs, a as useConfigStore, C as useConfigInject, bt as useCompactItemContext, D as genComponentStyleHook, bi as useLocaleReceiver, bJ as locale$1$1, E as omit, aC as CloseCircleFilled, F as classNames, Z as merge, a6 as genCompactItemStyle, bo as useState$1, a1 as Button, V as functionType, W as stringType, X as booleanType, K as objectType, aA as someType, G as arrayType, N as resetComponent, O as textEllipsis, bK as warningOnce, Q as KeyCode, ac as cloneElement, bL as noteOnce } from './server.mjs';
|
||
import _extends from '@babel/runtime/helpers/esm/extends';
|
||
import moment from 'moment-jalaali';
|
||
import jalaliday from 'dayjalali';
|
||
import _objectSpread$3 from '@babel/runtime/helpers/esm/objectSpread2';
|
||
import { T as Tag } from './index-BLBX3jXD.mjs';
|
||
import { r as roundedArrow, T as Trigger, h as isVisible } from './index-Dxyzjwb5.mjs';
|
||
import { w as wrapperRaf } from './raf-ruCY1ktO.mjs';
|
||
import { u as useMergedState } from './useMergedState-BZEfJ8Fl.mjs';
|
||
import { i as initMoveMotion, u as useMemo } from './move-BSi4LOZX.mjs';
|
||
import { s as shallowequal } from './shallowequal-DbdDzF9p.mjs';
|
||
import { u as useInjectFormItemContext, F as FormItemInputContext } from './FormItemContext-CDDW52IT.mjs';
|
||
import { a as getStatusClassNames, g as getMergedStatus } from './statusUtils-C3ZNzkeD.mjs';
|
||
import { TinyColor } from '@ctrl/tinycolor';
|
||
import { i as initInputToken, g as genBasicInputStyle, c as genActiveStyle, e as genHoverStyle } from './index-C1mihc8c.mjs';
|
||
import { i as initSlideMotion, a as slideUpOut, s as slideDownOut, c as slideUpIn, b as slideDownIn } from './slide-Bfj4jnqX.mjs';
|
||
|
||
var hookCallback;
|
||
|
||
function hooks() {
|
||
return hookCallback.apply(null, arguments);
|
||
}
|
||
|
||
// This is done to register the method called with moment()
|
||
// without creating circular dependencies.
|
||
function setHookCallback(callback) {
|
||
hookCallback = callback;
|
||
}
|
||
|
||
function isArray(input) {
|
||
return (
|
||
input instanceof Array ||
|
||
Object.prototype.toString.call(input) === '[object Array]'
|
||
);
|
||
}
|
||
|
||
function isObject(input) {
|
||
// IE8 will treat undefined and null as object if it wasn't for
|
||
// input != null
|
||
return (
|
||
input != null &&
|
||
Object.prototype.toString.call(input) === '[object Object]'
|
||
);
|
||
}
|
||
|
||
function hasOwnProp(a, b) {
|
||
return Object.prototype.hasOwnProperty.call(a, b);
|
||
}
|
||
|
||
function isObjectEmpty(obj) {
|
||
if (Object.getOwnPropertyNames) {
|
||
return Object.getOwnPropertyNames(obj).length === 0;
|
||
} else {
|
||
var k;
|
||
for (k in obj) {
|
||
if (hasOwnProp(obj, k)) {
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
}
|
||
|
||
function isUndefined(input) {
|
||
return input === void 0;
|
||
}
|
||
|
||
function isNumber(input) {
|
||
return (
|
||
typeof input === 'number' ||
|
||
Object.prototype.toString.call(input) === '[object Number]'
|
||
);
|
||
}
|
||
|
||
function isDate(input) {
|
||
return (
|
||
input instanceof Date ||
|
||
Object.prototype.toString.call(input) === '[object Date]'
|
||
);
|
||
}
|
||
|
||
function map(arr, fn) {
|
||
var res = [],
|
||
i,
|
||
arrLen = arr.length;
|
||
for (i = 0; i < arrLen; ++i) {
|
||
res.push(fn(arr[i], i));
|
||
}
|
||
return res;
|
||
}
|
||
|
||
function extend(a, b) {
|
||
for (var i in b) {
|
||
if (hasOwnProp(b, i)) {
|
||
a[i] = b[i];
|
||
}
|
||
}
|
||
|
||
if (hasOwnProp(b, 'toString')) {
|
||
a.toString = b.toString;
|
||
}
|
||
|
||
if (hasOwnProp(b, 'valueOf')) {
|
||
a.valueOf = b.valueOf;
|
||
}
|
||
|
||
return a;
|
||
}
|
||
|
||
function createUTC(input, format, locale, strict) {
|
||
return createLocalOrUTC(input, format, locale, strict, true).utc();
|
||
}
|
||
|
||
function defaultParsingFlags() {
|
||
// We need to deep clone this object.
|
||
return {
|
||
empty: false,
|
||
unusedTokens: [],
|
||
unusedInput: [],
|
||
overflow: -2,
|
||
charsLeftOver: 0,
|
||
nullInput: false,
|
||
invalidEra: null,
|
||
invalidMonth: null,
|
||
invalidFormat: false,
|
||
userInvalidated: false,
|
||
iso: false,
|
||
parsedDateParts: [],
|
||
era: null,
|
||
meridiem: null,
|
||
rfc2822: false,
|
||
weekdayMismatch: false,
|
||
};
|
||
}
|
||
|
||
function getParsingFlags(m) {
|
||
if (m._pf == null) {
|
||
m._pf = defaultParsingFlags();
|
||
}
|
||
return m._pf;
|
||
}
|
||
|
||
var some;
|
||
if (Array.prototype.some) {
|
||
some = Array.prototype.some;
|
||
} else {
|
||
some = function (fun) {
|
||
var t = Object(this),
|
||
len = t.length >>> 0,
|
||
i;
|
||
|
||
for (i = 0; i < len; i++) {
|
||
if (i in t && fun.call(this, t[i], i, t)) {
|
||
return true;
|
||
}
|
||
}
|
||
|
||
return false;
|
||
};
|
||
}
|
||
|
||
function isValid$1(m) {
|
||
var flags = null,
|
||
parsedParts = false,
|
||
isNowValid = m._d && !isNaN(m._d.getTime());
|
||
if (isNowValid) {
|
||
flags = getParsingFlags(m);
|
||
parsedParts = some.call(flags.parsedDateParts, function (i) {
|
||
return i != null;
|
||
});
|
||
isNowValid =
|
||
flags.overflow < 0 &&
|
||
!flags.empty &&
|
||
!flags.invalidEra &&
|
||
!flags.invalidMonth &&
|
||
!flags.invalidWeekday &&
|
||
!flags.weekdayMismatch &&
|
||
!flags.nullInput &&
|
||
!flags.invalidFormat &&
|
||
!flags.userInvalidated &&
|
||
(!flags.meridiem || (flags.meridiem && parsedParts));
|
||
if (m._strict) {
|
||
isNowValid =
|
||
isNowValid &&
|
||
flags.charsLeftOver === 0 &&
|
||
flags.unusedTokens.length === 0 &&
|
||
flags.bigHour === undefined;
|
||
}
|
||
}
|
||
if (Object.isFrozen == null || !Object.isFrozen(m)) {
|
||
m._isValid = isNowValid;
|
||
} else {
|
||
return isNowValid;
|
||
}
|
||
return m._isValid;
|
||
}
|
||
|
||
function createInvalid$1(flags) {
|
||
var m = createUTC(NaN);
|
||
if (flags != null) {
|
||
extend(getParsingFlags(m), flags);
|
||
} else {
|
||
getParsingFlags(m).userInvalidated = true;
|
||
}
|
||
|
||
return m;
|
||
}
|
||
|
||
// Plugins that add properties should also add the key here (null value),
|
||
// so we can properly clone ourselves.
|
||
var momentProperties = (hooks.momentProperties = []),
|
||
updateInProgress = false;
|
||
|
||
function copyConfig(to, from) {
|
||
var i,
|
||
prop,
|
||
val,
|
||
momentPropertiesLen = momentProperties.length;
|
||
|
||
if (!isUndefined(from._isAMomentObject)) {
|
||
to._isAMomentObject = from._isAMomentObject;
|
||
}
|
||
if (!isUndefined(from._i)) {
|
||
to._i = from._i;
|
||
}
|
||
if (!isUndefined(from._f)) {
|
||
to._f = from._f;
|
||
}
|
||
if (!isUndefined(from._l)) {
|
||
to._l = from._l;
|
||
}
|
||
if (!isUndefined(from._strict)) {
|
||
to._strict = from._strict;
|
||
}
|
||
if (!isUndefined(from._tzm)) {
|
||
to._tzm = from._tzm;
|
||
}
|
||
if (!isUndefined(from._isUTC)) {
|
||
to._isUTC = from._isUTC;
|
||
}
|
||
if (!isUndefined(from._offset)) {
|
||
to._offset = from._offset;
|
||
}
|
||
if (!isUndefined(from._pf)) {
|
||
to._pf = getParsingFlags(from);
|
||
}
|
||
if (!isUndefined(from._locale)) {
|
||
to._locale = from._locale;
|
||
}
|
||
|
||
if (momentPropertiesLen > 0) {
|
||
for (i = 0; i < momentPropertiesLen; i++) {
|
||
prop = momentProperties[i];
|
||
val = from[prop];
|
||
if (!isUndefined(val)) {
|
||
to[prop] = val;
|
||
}
|
||
}
|
||
}
|
||
|
||
return to;
|
||
}
|
||
|
||
// Moment prototype object
|
||
function Moment(config) {
|
||
copyConfig(this, config);
|
||
this._d = new Date(config._d != null ? config._d.getTime() : NaN);
|
||
if (!this.isValid()) {
|
||
this._d = new Date(NaN);
|
||
}
|
||
// Prevent infinite loop in case updateOffset creates new moment
|
||
// objects.
|
||
if (updateInProgress === false) {
|
||
updateInProgress = true;
|
||
hooks.updateOffset(this);
|
||
updateInProgress = false;
|
||
}
|
||
}
|
||
|
||
function isMoment(obj) {
|
||
return (
|
||
obj instanceof Moment || (obj != null && obj._isAMomentObject != null)
|
||
);
|
||
}
|
||
|
||
function warn(msg) {
|
||
if (
|
||
hooks.suppressDeprecationWarnings === false &&
|
||
typeof console !== 'undefined' &&
|
||
console.warn
|
||
) {
|
||
console.warn('Deprecation warning: ' + msg);
|
||
}
|
||
}
|
||
|
||
function deprecate(msg, fn) {
|
||
var firstTime = true;
|
||
|
||
return extend(function () {
|
||
if (hooks.deprecationHandler != null) {
|
||
hooks.deprecationHandler(null, msg);
|
||
}
|
||
if (firstTime) {
|
||
var args = [],
|
||
arg,
|
||
i,
|
||
key,
|
||
argLen = arguments.length;
|
||
for (i = 0; i < argLen; i++) {
|
||
arg = '';
|
||
if (typeof arguments[i] === 'object') {
|
||
arg += '\n[' + i + '] ';
|
||
for (key in arguments[0]) {
|
||
if (hasOwnProp(arguments[0], key)) {
|
||
arg += key + ': ' + arguments[0][key] + ', ';
|
||
}
|
||
}
|
||
arg = arg.slice(0, -2); // Remove trailing comma and space
|
||
} else {
|
||
arg = arguments[i];
|
||
}
|
||
args.push(arg);
|
||
}
|
||
warn(
|
||
msg +
|
||
'\nArguments: ' +
|
||
Array.prototype.slice.call(args).join('') +
|
||
'\n' +
|
||
new Error().stack
|
||
);
|
||
firstTime = false;
|
||
}
|
||
return fn.apply(this, arguments);
|
||
}, fn);
|
||
}
|
||
|
||
var deprecations = {};
|
||
|
||
function deprecateSimple(name, msg) {
|
||
if (hooks.deprecationHandler != null) {
|
||
hooks.deprecationHandler(name, msg);
|
||
}
|
||
if (!deprecations[name]) {
|
||
warn(msg);
|
||
deprecations[name] = true;
|
||
}
|
||
}
|
||
|
||
hooks.suppressDeprecationWarnings = false;
|
||
hooks.deprecationHandler = null;
|
||
|
||
function isFunction(input) {
|
||
return (
|
||
(typeof Function !== 'undefined' && input instanceof Function) ||
|
||
Object.prototype.toString.call(input) === '[object Function]'
|
||
);
|
||
}
|
||
|
||
function mergeConfigs(parentConfig, childConfig) {
|
||
var res = extend({}, parentConfig),
|
||
prop;
|
||
for (prop in childConfig) {
|
||
if (hasOwnProp(childConfig, prop)) {
|
||
if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
|
||
res[prop] = {};
|
||
extend(res[prop], parentConfig[prop]);
|
||
extend(res[prop], childConfig[prop]);
|
||
} else if (childConfig[prop] != null) {
|
||
res[prop] = childConfig[prop];
|
||
} else {
|
||
delete res[prop];
|
||
}
|
||
}
|
||
}
|
||
for (prop in parentConfig) {
|
||
if (
|
||
hasOwnProp(parentConfig, prop) &&
|
||
!hasOwnProp(childConfig, prop) &&
|
||
isObject(parentConfig[prop])
|
||
) {
|
||
// make sure changes to properties don't modify parent config
|
||
res[prop] = extend({}, res[prop]);
|
||
}
|
||
}
|
||
return res;
|
||
}
|
||
|
||
function Locale(config) {
|
||
if (config != null) {
|
||
this.set(config);
|
||
}
|
||
}
|
||
|
||
var keys;
|
||
|
||
if (Object.keys) {
|
||
keys = Object.keys;
|
||
} else {
|
||
keys = function (obj) {
|
||
var i,
|
||
res = [];
|
||
for (i in obj) {
|
||
if (hasOwnProp(obj, i)) {
|
||
res.push(i);
|
||
}
|
||
}
|
||
return res;
|
||
};
|
||
}
|
||
|
||
var defaultCalendar = {
|
||
sameDay: '[Today at] LT',
|
||
nextDay: '[Tomorrow at] LT',
|
||
nextWeek: 'dddd [at] LT',
|
||
lastDay: '[Yesterday at] LT',
|
||
lastWeek: '[Last] dddd [at] LT',
|
||
sameElse: 'L',
|
||
};
|
||
|
||
function zeroFill(number, targetLength, forceSign) {
|
||
var absNumber = '' + Math.abs(number),
|
||
zerosToFill = targetLength - absNumber.length,
|
||
sign = number >= 0;
|
||
return (
|
||
(sign ? (forceSign ? '+' : '') : '-') +
|
||
Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) +
|
||
absNumber
|
||
);
|
||
}
|
||
|
||
var formattingTokens$1 =
|
||
/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,
|
||
localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,
|
||
formatFunctions = {},
|
||
formatTokenFunctions = {};
|
||
|
||
// token: 'M'
|
||
// padded: ['MM', 2]
|
||
// ordinal: 'Mo'
|
||
// callback: function () { this.month() + 1 }
|
||
function addFormatToken(token, padded, ordinal, callback) {
|
||
var func = callback;
|
||
if (typeof callback === 'string') {
|
||
func = function () {
|
||
return this[callback]();
|
||
};
|
||
}
|
||
if (token) {
|
||
formatTokenFunctions[token] = func;
|
||
}
|
||
if (padded) {
|
||
formatTokenFunctions[padded[0]] = function () {
|
||
return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
|
||
};
|
||
}
|
||
if (ordinal) {
|
||
formatTokenFunctions[ordinal] = function () {
|
||
return this.localeData().ordinal(
|
||
func.apply(this, arguments),
|
||
token
|
||
);
|
||
};
|
||
}
|
||
}
|
||
|
||
function removeFormattingTokens(input) {
|
||
if (input.match(/\[[\s\S]/)) {
|
||
return input.replace(/^\[|\]$/g, '');
|
||
}
|
||
return input.replace(/\\/g, '');
|
||
}
|
||
|
||
function makeFormatFunction(format) {
|
||
var array = format.match(formattingTokens$1),
|
||
i,
|
||
length;
|
||
|
||
for (i = 0, length = array.length; i < length; i++) {
|
||
if (formatTokenFunctions[array[i]]) {
|
||
array[i] = formatTokenFunctions[array[i]];
|
||
} else {
|
||
array[i] = removeFormattingTokens(array[i]);
|
||
}
|
||
}
|
||
|
||
return function (mom) {
|
||
var output = '',
|
||
i;
|
||
for (i = 0; i < length; i++) {
|
||
output += isFunction(array[i])
|
||
? array[i].call(mom, format)
|
||
: array[i];
|
||
}
|
||
return output;
|
||
};
|
||
}
|
||
|
||
// format date using native date object
|
||
function formatMoment(m, format) {
|
||
if (!m.isValid()) {
|
||
return m.localeData().invalidDate();
|
||
}
|
||
|
||
format = expandFormat(format, m.localeData());
|
||
formatFunctions[format] =
|
||
formatFunctions[format] || makeFormatFunction(format);
|
||
|
||
return formatFunctions[format](m);
|
||
}
|
||
|
||
function expandFormat(format, locale) {
|
||
var i = 5;
|
||
|
||
function replaceLongDateFormatTokens(input) {
|
||
return locale.longDateFormat(input) || input;
|
||
}
|
||
|
||
localFormattingTokens.lastIndex = 0;
|
||
while (i >= 0 && localFormattingTokens.test(format)) {
|
||
format = format.replace(
|
||
localFormattingTokens,
|
||
replaceLongDateFormatTokens
|
||
);
|
||
localFormattingTokens.lastIndex = 0;
|
||
i -= 1;
|
||
}
|
||
|
||
return format;
|
||
}
|
||
|
||
var defaultLongDateFormat = {
|
||
LTS: 'h:mm:ss A',
|
||
LT: 'h:mm A',
|
||
L: 'MM/DD/YYYY',
|
||
LL: 'MMMM D, YYYY',
|
||
LLL: 'MMMM D, YYYY h:mm A',
|
||
LLLL: 'dddd, MMMM D, YYYY h:mm A',
|
||
};
|
||
|
||
var defaultInvalidDate = 'Invalid date';
|
||
|
||
var defaultOrdinal = '%d',
|
||
defaultDayOfMonthOrdinalParse = /\d{1,2}/;
|
||
|
||
var defaultRelativeTime = {
|
||
future: 'in %s',
|
||
past: '%s ago',
|
||
s: 'a few seconds',
|
||
ss: '%d seconds',
|
||
m: 'a minute',
|
||
mm: '%d minutes',
|
||
h: 'an hour',
|
||
hh: '%d hours',
|
||
d: 'a day',
|
||
dd: '%d days',
|
||
w: 'a week',
|
||
ww: '%d weeks',
|
||
M: 'a month',
|
||
MM: '%d months',
|
||
y: 'a year',
|
||
yy: '%d years',
|
||
};
|
||
|
||
var aliases = {
|
||
D: 'date',
|
||
dates: 'date',
|
||
date: 'date',
|
||
d: 'day',
|
||
days: 'day',
|
||
day: 'day',
|
||
e: 'weekday',
|
||
weekdays: 'weekday',
|
||
weekday: 'weekday',
|
||
E: 'isoWeekday',
|
||
isoweekdays: 'isoWeekday',
|
||
isoweekday: 'isoWeekday',
|
||
DDD: 'dayOfYear',
|
||
dayofyears: 'dayOfYear',
|
||
dayofyear: 'dayOfYear',
|
||
h: 'hour',
|
||
hours: 'hour',
|
||
hour: 'hour',
|
||
ms: 'millisecond',
|
||
milliseconds: 'millisecond',
|
||
millisecond: 'millisecond',
|
||
m: 'minute',
|
||
minutes: 'minute',
|
||
minute: 'minute',
|
||
M: 'month',
|
||
months: 'month',
|
||
month: 'month',
|
||
Q: 'quarter',
|
||
quarters: 'quarter',
|
||
quarter: 'quarter',
|
||
s: 'second',
|
||
seconds: 'second',
|
||
second: 'second',
|
||
gg: 'weekYear',
|
||
weekyears: 'weekYear',
|
||
weekyear: 'weekYear',
|
||
GG: 'isoWeekYear',
|
||
isoweekyears: 'isoWeekYear',
|
||
isoweekyear: 'isoWeekYear',
|
||
w: 'week',
|
||
weeks: 'week',
|
||
week: 'week',
|
||
W: 'isoWeek',
|
||
isoweeks: 'isoWeek',
|
||
isoweek: 'isoWeek',
|
||
y: 'year',
|
||
years: 'year',
|
||
year: 'year',
|
||
};
|
||
|
||
function normalizeUnits(units) {
|
||
return typeof units === 'string'
|
||
? aliases[units] || aliases[units.toLowerCase()]
|
||
: undefined;
|
||
}
|
||
|
||
function normalizeObjectUnits(inputObject) {
|
||
var normalizedInput = {},
|
||
normalizedProp,
|
||
prop;
|
||
|
||
for (prop in inputObject) {
|
||
if (hasOwnProp(inputObject, prop)) {
|
||
normalizedProp = normalizeUnits(prop);
|
||
if (normalizedProp) {
|
||
normalizedInput[normalizedProp] = inputObject[prop];
|
||
}
|
||
}
|
||
}
|
||
|
||
return normalizedInput;
|
||
}
|
||
|
||
var priorities = {
|
||
date: 9,
|
||
day: 11,
|
||
weekday: 11,
|
||
isoWeekday: 11,
|
||
dayOfYear: 4,
|
||
hour: 13,
|
||
millisecond: 16,
|
||
minute: 14,
|
||
month: 8,
|
||
quarter: 7,
|
||
second: 15,
|
||
weekYear: 1,
|
||
isoWeekYear: 1,
|
||
week: 5,
|
||
isoWeek: 5,
|
||
year: 1,
|
||
};
|
||
|
||
function getPrioritizedUnits(unitsObj) {
|
||
var units = [],
|
||
u;
|
||
for (u in unitsObj) {
|
||
if (hasOwnProp(unitsObj, u)) {
|
||
units.push({ unit: u, priority: priorities[u] });
|
||
}
|
||
}
|
||
units.sort(function (a, b) {
|
||
return a.priority - b.priority;
|
||
});
|
||
return units;
|
||
}
|
||
|
||
var match1$1 = /\d/, // 0 - 9
|
||
match2$1 = /\d\d/, // 00 - 99
|
||
match3$1 = /\d{3}/, // 000 - 999
|
||
match4$1 = /\d{4}/, // 0000 - 9999
|
||
match6 = /[+-]?\d{6}/, // -999999 - 999999
|
||
match1to2$1 = /\d\d?/, // 0 - 99
|
||
match3to4 = /\d\d\d\d?/, // 999 - 9999
|
||
match5to6 = /\d\d\d\d\d\d?/, // 99999 - 999999
|
||
match1to3 = /\d{1,3}/, // 0 - 999
|
||
match1to4 = /\d{1,4}/, // 0 - 9999
|
||
match1to6 = /[+-]?\d{1,6}/, // -999999 - 999999
|
||
matchUnsigned = /\d+/, // 0 - inf
|
||
matchSigned$1 = /[+-]?\d+/, // -inf - inf
|
||
matchOffset$1 = /Z|[+-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z
|
||
matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z
|
||
match1to2NoLeadingZero = /^[1-9]\d?/, // 1-99
|
||
match1to2HasZero = /^([1-9]\d|\d)/, // 0-99
|
||
regexes;
|
||
|
||
regexes = {};
|
||
|
||
function addRegexToken(token, regex, strictRegex) {
|
||
regexes[token] = isFunction(regex)
|
||
? regex
|
||
: function (isStrict, localeData) {
|
||
return isStrict && strictRegex ? strictRegex : regex;
|
||
};
|
||
}
|
||
|
||
function getParseRegexForToken(token, config) {
|
||
if (!hasOwnProp(regexes, token)) {
|
||
return new RegExp(unescapeFormat(token));
|
||
}
|
||
|
||
return regexes[token](config._strict, config._locale);
|
||
}
|
||
|
||
// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
|
||
function unescapeFormat(s) {
|
||
return regexEscape(
|
||
s
|
||
.replace('\\', '')
|
||
.replace(
|
||
/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,
|
||
function (matched, p1, p2, p3, p4) {
|
||
return p1 || p2 || p3 || p4;
|
||
}
|
||
)
|
||
);
|
||
}
|
||
|
||
function regexEscape(s) {
|
||
return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
|
||
}
|
||
|
||
function absFloor(number) {
|
||
if (number < 0) {
|
||
// -0 -> 0
|
||
return Math.ceil(number) || 0;
|
||
} else {
|
||
return Math.floor(number);
|
||
}
|
||
}
|
||
|
||
function toInt(argumentForCoercion) {
|
||
var coercedNumber = +argumentForCoercion,
|
||
value = 0;
|
||
|
||
if (coercedNumber !== 0 && isFinite(coercedNumber)) {
|
||
value = absFloor(coercedNumber);
|
||
}
|
||
|
||
return value;
|
||
}
|
||
|
||
var tokens = {};
|
||
|
||
function addParseToken(token, callback) {
|
||
var i,
|
||
func = callback,
|
||
tokenLen;
|
||
if (typeof token === 'string') {
|
||
token = [token];
|
||
}
|
||
if (isNumber(callback)) {
|
||
func = function (input, array) {
|
||
array[callback] = toInt(input);
|
||
};
|
||
}
|
||
tokenLen = token.length;
|
||
for (i = 0; i < tokenLen; i++) {
|
||
tokens[token[i]] = func;
|
||
}
|
||
}
|
||
|
||
function addWeekParseToken(token, callback) {
|
||
addParseToken(token, function (input, array, config, token) {
|
||
config._w = config._w || {};
|
||
callback(input, config._w, config, token);
|
||
});
|
||
}
|
||
|
||
function addTimeToArrayFromToken(token, input, config) {
|
||
if (input != null && hasOwnProp(tokens, token)) {
|
||
tokens[token](input, config._a, config, token);
|
||
}
|
||
}
|
||
|
||
function isLeapYear(year) {
|
||
return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
|
||
}
|
||
|
||
var YEAR = 0,
|
||
MONTH = 1,
|
||
DATE = 2,
|
||
HOUR = 3,
|
||
MINUTE = 4,
|
||
SECOND = 5,
|
||
MILLISECOND = 6,
|
||
WEEK = 7,
|
||
WEEKDAY = 8;
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('Y', 0, 0, function () {
|
||
var y = this.year();
|
||
return y <= 9999 ? zeroFill(y, 4) : '+' + y;
|
||
});
|
||
|
||
addFormatToken(0, ['YY', 2], 0, function () {
|
||
return this.year() % 100;
|
||
});
|
||
|
||
addFormatToken(0, ['YYYY', 4], 0, 'year');
|
||
addFormatToken(0, ['YYYYY', 5], 0, 'year');
|
||
addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('Y', matchSigned$1);
|
||
addRegexToken('YY', match1to2$1, match2$1);
|
||
addRegexToken('YYYY', match1to4, match4$1);
|
||
addRegexToken('YYYYY', match1to6, match6);
|
||
addRegexToken('YYYYYY', match1to6, match6);
|
||
|
||
addParseToken(['YYYYY', 'YYYYYY'], YEAR);
|
||
addParseToken('YYYY', function (input, array) {
|
||
array[YEAR] =
|
||
input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
|
||
});
|
||
addParseToken('YY', function (input, array) {
|
||
array[YEAR] = hooks.parseTwoDigitYear(input);
|
||
});
|
||
addParseToken('Y', function (input, array) {
|
||
array[YEAR] = parseInt(input, 10);
|
||
});
|
||
|
||
// HELPERS
|
||
|
||
function daysInYear(year) {
|
||
return isLeapYear(year) ? 366 : 365;
|
||
}
|
||
|
||
// HOOKS
|
||
|
||
hooks.parseTwoDigitYear = function (input) {
|
||
return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
|
||
};
|
||
|
||
// MOMENTS
|
||
|
||
var getSetYear = makeGetSet('FullYear', true);
|
||
|
||
function getIsLeapYear() {
|
||
return isLeapYear(this.year());
|
||
}
|
||
|
||
function makeGetSet(unit, keepTime) {
|
||
return function (value) {
|
||
if (value != null) {
|
||
set(this, unit, value);
|
||
hooks.updateOffset(this, keepTime);
|
||
return this;
|
||
} else {
|
||
return get$1(this, unit);
|
||
}
|
||
};
|
||
}
|
||
|
||
function get$1(mom, unit) {
|
||
if (!mom.isValid()) {
|
||
return NaN;
|
||
}
|
||
|
||
var d = mom._d,
|
||
isUTC = mom._isUTC;
|
||
|
||
switch (unit) {
|
||
case 'Milliseconds':
|
||
return isUTC ? d.getUTCMilliseconds() : d.getMilliseconds();
|
||
case 'Seconds':
|
||
return isUTC ? d.getUTCSeconds() : d.getSeconds();
|
||
case 'Minutes':
|
||
return isUTC ? d.getUTCMinutes() : d.getMinutes();
|
||
case 'Hours':
|
||
return isUTC ? d.getUTCHours() : d.getHours();
|
||
case 'Date':
|
||
return isUTC ? d.getUTCDate() : d.getDate();
|
||
case 'Day':
|
||
return isUTC ? d.getUTCDay() : d.getDay();
|
||
case 'Month':
|
||
return isUTC ? d.getUTCMonth() : d.getMonth();
|
||
case 'FullYear':
|
||
return isUTC ? d.getUTCFullYear() : d.getFullYear();
|
||
default:
|
||
return NaN; // Just in case
|
||
}
|
||
}
|
||
|
||
function set(mom, unit, value) {
|
||
var d, isUTC, year, month, date;
|
||
|
||
if (!mom.isValid() || isNaN(value)) {
|
||
return;
|
||
}
|
||
|
||
d = mom._d;
|
||
isUTC = mom._isUTC;
|
||
|
||
switch (unit) {
|
||
case 'Milliseconds':
|
||
return void (isUTC
|
||
? d.setUTCMilliseconds(value)
|
||
: d.setMilliseconds(value));
|
||
case 'Seconds':
|
||
return void (isUTC ? d.setUTCSeconds(value) : d.setSeconds(value));
|
||
case 'Minutes':
|
||
return void (isUTC ? d.setUTCMinutes(value) : d.setMinutes(value));
|
||
case 'Hours':
|
||
return void (isUTC ? d.setUTCHours(value) : d.setHours(value));
|
||
case 'Date':
|
||
return void (isUTC ? d.setUTCDate(value) : d.setDate(value));
|
||
// case 'Day': // Not real
|
||
// return void (isUTC ? d.setUTCDay(value) : d.setDay(value));
|
||
// case 'Month': // Not used because we need to pass two variables
|
||
// return void (isUTC ? d.setUTCMonth(value) : d.setMonth(value));
|
||
case 'FullYear':
|
||
break; // See below ...
|
||
default:
|
||
return; // Just in case
|
||
}
|
||
|
||
year = value;
|
||
month = mom.month();
|
||
date = mom.date();
|
||
date = date === 29 && month === 1 && !isLeapYear(year) ? 28 : date;
|
||
void (isUTC
|
||
? d.setUTCFullYear(year, month, date)
|
||
: d.setFullYear(year, month, date));
|
||
}
|
||
|
||
// MOMENTS
|
||
|
||
function stringGet(units) {
|
||
units = normalizeUnits(units);
|
||
if (isFunction(this[units])) {
|
||
return this[units]();
|
||
}
|
||
return this;
|
||
}
|
||
|
||
function stringSet(units, value) {
|
||
if (typeof units === 'object') {
|
||
units = normalizeObjectUnits(units);
|
||
var prioritized = getPrioritizedUnits(units),
|
||
i,
|
||
prioritizedLen = prioritized.length;
|
||
for (i = 0; i < prioritizedLen; i++) {
|
||
this[prioritized[i].unit](units[prioritized[i].unit]);
|
||
}
|
||
} else {
|
||
units = normalizeUnits(units);
|
||
if (isFunction(this[units])) {
|
||
return this[units](value);
|
||
}
|
||
}
|
||
return this;
|
||
}
|
||
|
||
function mod$1(n, x) {
|
||
return ((n % x) + x) % x;
|
||
}
|
||
|
||
var indexOf;
|
||
|
||
if (Array.prototype.indexOf) {
|
||
indexOf = Array.prototype.indexOf;
|
||
} else {
|
||
indexOf = function (o) {
|
||
// I know
|
||
var i;
|
||
for (i = 0; i < this.length; ++i) {
|
||
if (this[i] === o) {
|
||
return i;
|
||
}
|
||
}
|
||
return -1;
|
||
};
|
||
}
|
||
|
||
function daysInMonth(year, month) {
|
||
if (isNaN(year) || isNaN(month)) {
|
||
return NaN;
|
||
}
|
||
var modMonth = mod$1(month, 12);
|
||
year += (month - modMonth) / 12;
|
||
return modMonth === 1
|
||
? isLeapYear(year)
|
||
? 29
|
||
: 28
|
||
: 31 - ((modMonth % 7) % 2);
|
||
}
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('M', ['MM', 2], 'Mo', function () {
|
||
return this.month() + 1;
|
||
});
|
||
|
||
addFormatToken('MMM', 0, 0, function (format) {
|
||
return this.localeData().monthsShort(this, format);
|
||
});
|
||
|
||
addFormatToken('MMMM', 0, 0, function (format) {
|
||
return this.localeData().months(this, format);
|
||
});
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('M', match1to2$1, match1to2NoLeadingZero);
|
||
addRegexToken('MM', match1to2$1, match2$1);
|
||
addRegexToken('MMM', function (isStrict, locale) {
|
||
return locale.monthsShortRegex(isStrict);
|
||
});
|
||
addRegexToken('MMMM', function (isStrict, locale) {
|
||
return locale.monthsRegex(isStrict);
|
||
});
|
||
|
||
addParseToken(['M', 'MM'], function (input, array) {
|
||
array[MONTH] = toInt(input) - 1;
|
||
});
|
||
|
||
addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
|
||
var month = config._locale.monthsParse(input, token, config._strict);
|
||
// if we didn't find a month name, mark the date as invalid.
|
||
if (month != null) {
|
||
array[MONTH] = month;
|
||
} else {
|
||
getParsingFlags(config).invalidMonth = input;
|
||
}
|
||
});
|
||
|
||
// LOCALES
|
||
|
||
var defaultLocaleMonths =
|
||
'January_February_March_April_May_June_July_August_September_October_November_December'.split(
|
||
'_'
|
||
),
|
||
defaultLocaleMonthsShort =
|
||
'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
|
||
|
||
// MOMENTS
|
||
|
||
function setMonth(mom, value) {
|
||
if (!mom.isValid()) {
|
||
// No op
|
||
return mom;
|
||
}
|
||
|
||
if (typeof value === 'string') {
|
||
if (/^\d+$/.test(value)) {
|
||
value = toInt(value);
|
||
} else {
|
||
value = mom.localeData().monthsParse(value);
|
||
// TODO: Another silent failure?
|
||
if (!isNumber(value)) {
|
||
return mom;
|
||
}
|
||
}
|
||
}
|
||
|
||
var month = value,
|
||
date = mom.date();
|
||
|
||
date = date < 29 ? date : Math.min(date, daysInMonth(mom.year(), month));
|
||
void (mom._isUTC
|
||
? mom._d.setUTCMonth(month, date)
|
||
: mom._d.setMonth(month, date));
|
||
return mom;
|
||
}
|
||
|
||
function getSetMonth(value) {
|
||
if (value != null) {
|
||
setMonth(this, value);
|
||
hooks.updateOffset(this, true);
|
||
return this;
|
||
} else {
|
||
return get$1(this, 'Month');
|
||
}
|
||
}
|
||
|
||
function getDaysInMonth() {
|
||
return daysInMonth(this.year(), this.month());
|
||
}
|
||
|
||
function createDate(y, m, d, h, M, s, ms) {
|
||
// can't just apply() to create a date:
|
||
// https://stackoverflow.com/q/181348
|
||
var date;
|
||
// the date constructor remaps years 0-99 to 1900-1999
|
||
if (y < 100 && y >= 0) {
|
||
// preserve leap years using a full 400 year cycle, then reset
|
||
date = new Date(y + 400, m, d, h, M, s, ms);
|
||
if (isFinite(date.getFullYear())) {
|
||
date.setFullYear(y);
|
||
}
|
||
} else {
|
||
date = new Date(y, m, d, h, M, s, ms);
|
||
}
|
||
|
||
return date;
|
||
}
|
||
|
||
function createUTCDate(y) {
|
||
var date, args;
|
||
// the Date.UTC function remaps years 0-99 to 1900-1999
|
||
if (y < 100 && y >= 0) {
|
||
args = Array.prototype.slice.call(arguments);
|
||
// preserve leap years using a full 400 year cycle, then reset
|
||
args[0] = y + 400;
|
||
date = new Date(Date.UTC.apply(null, args));
|
||
if (isFinite(date.getUTCFullYear())) {
|
||
date.setUTCFullYear(y);
|
||
}
|
||
} else {
|
||
date = new Date(Date.UTC.apply(null, arguments));
|
||
}
|
||
|
||
return date;
|
||
}
|
||
|
||
// start-of-first-week - start-of-year
|
||
function firstWeekOffset(year, dow, doy) {
|
||
var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
|
||
fwd = 7 + dow - doy,
|
||
// first-week day local weekday -- which local weekday is fwd
|
||
fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
|
||
|
||
return -fwdlw + fwd - 1;
|
||
}
|
||
|
||
// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
|
||
function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
|
||
var localWeekday = (7 + weekday - dow) % 7,
|
||
weekOffset = firstWeekOffset(year, dow, doy),
|
||
dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
|
||
resYear,
|
||
resDayOfYear;
|
||
|
||
if (dayOfYear <= 0) {
|
||
resYear = year - 1;
|
||
resDayOfYear = daysInYear(resYear) + dayOfYear;
|
||
} else if (dayOfYear > daysInYear(year)) {
|
||
resYear = year + 1;
|
||
resDayOfYear = dayOfYear - daysInYear(year);
|
||
} else {
|
||
resYear = year;
|
||
resDayOfYear = dayOfYear;
|
||
}
|
||
|
||
return {
|
||
year: resYear,
|
||
dayOfYear: resDayOfYear,
|
||
};
|
||
}
|
||
|
||
function weekOfYear$1(mom, dow, doy) {
|
||
var weekOffset = firstWeekOffset(mom.year(), dow, doy),
|
||
week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
|
||
resWeek,
|
||
resYear;
|
||
|
||
if (week < 1) {
|
||
resYear = mom.year() - 1;
|
||
resWeek = week + weeksInYear(resYear, dow, doy);
|
||
} else if (week > weeksInYear(mom.year(), dow, doy)) {
|
||
resWeek = week - weeksInYear(mom.year(), dow, doy);
|
||
resYear = mom.year() + 1;
|
||
} else {
|
||
resYear = mom.year();
|
||
resWeek = week;
|
||
}
|
||
|
||
return {
|
||
week: resWeek,
|
||
year: resYear,
|
||
};
|
||
}
|
||
|
||
function weeksInYear(year, dow, doy) {
|
||
var weekOffset = firstWeekOffset(year, dow, doy),
|
||
weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
|
||
return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
|
||
}
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('w', ['ww', 2], 'wo', 'week');
|
||
addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('w', match1to2$1, match1to2NoLeadingZero);
|
||
addRegexToken('ww', match1to2$1, match2$1);
|
||
addRegexToken('W', match1to2$1, match1to2NoLeadingZero);
|
||
addRegexToken('WW', match1to2$1, match2$1);
|
||
|
||
addWeekParseToken(
|
||
['w', 'ww', 'W', 'WW'],
|
||
function (input, week, config, token) {
|
||
week[token.substr(0, 1)] = toInt(input);
|
||
}
|
||
);
|
||
|
||
var defaultLocaleWeek = {
|
||
dow: 0, // Sunday is the first day of the week.
|
||
doy: 6, // The week that contains Jan 6th is the first week of the year.
|
||
};
|
||
|
||
// MOMENTS
|
||
|
||
function getSetWeek(input) {
|
||
var week = this.localeData().week(this);
|
||
return input == null ? week : this.add((input - week) * 7, 'd');
|
||
}
|
||
|
||
function getSetISOWeek(input) {
|
||
var week = weekOfYear$1(this, 1, 4).week;
|
||
return input == null ? week : this.add((input - week) * 7, 'd');
|
||
}
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('d', 0, 'do', 'day');
|
||
|
||
addFormatToken('dd', 0, 0, function (format) {
|
||
return this.localeData().weekdaysMin(this, format);
|
||
});
|
||
|
||
addFormatToken('ddd', 0, 0, function (format) {
|
||
return this.localeData().weekdaysShort(this, format);
|
||
});
|
||
|
||
addFormatToken('dddd', 0, 0, function (format) {
|
||
return this.localeData().weekdays(this, format);
|
||
});
|
||
|
||
addFormatToken('e', 0, 0, 'weekday');
|
||
addFormatToken('E', 0, 0, 'isoWeekday');
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('d', match1to2$1);
|
||
addRegexToken('e', match1to2$1);
|
||
addRegexToken('E', match1to2$1);
|
||
addRegexToken('dd', function (isStrict, locale) {
|
||
return locale.weekdaysMinRegex(isStrict);
|
||
});
|
||
addRegexToken('ddd', function (isStrict, locale) {
|
||
return locale.weekdaysShortRegex(isStrict);
|
||
});
|
||
addRegexToken('dddd', function (isStrict, locale) {
|
||
return locale.weekdaysRegex(isStrict);
|
||
});
|
||
|
||
addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
|
||
var weekday = config._locale.weekdaysParse(input, token, config._strict);
|
||
// if we didn't get a weekday name, mark the date as invalid
|
||
if (weekday != null) {
|
||
week.d = weekday;
|
||
} else {
|
||
getParsingFlags(config).invalidWeekday = input;
|
||
}
|
||
});
|
||
|
||
addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
|
||
week[token] = toInt(input);
|
||
});
|
||
|
||
// HELPERS
|
||
|
||
function parseWeekday(input, locale) {
|
||
if (typeof input !== 'string') {
|
||
return input;
|
||
}
|
||
|
||
if (!isNaN(input)) {
|
||
return parseInt(input, 10);
|
||
}
|
||
|
||
input = locale.weekdaysParse(input);
|
||
if (typeof input === 'number') {
|
||
return input;
|
||
}
|
||
|
||
return null;
|
||
}
|
||
|
||
function parseIsoWeekday(input, locale) {
|
||
if (typeof input === 'string') {
|
||
return locale.weekdaysParse(input) % 7 || 7;
|
||
}
|
||
return isNaN(input) ? null : input;
|
||
}
|
||
|
||
var defaultLocaleWeekdays =
|
||
'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
|
||
defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
|
||
defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');
|
||
|
||
// MOMENTS
|
||
|
||
function getSetDayOfWeek(input) {
|
||
if (!this.isValid()) {
|
||
return input != null ? this : NaN;
|
||
}
|
||
|
||
var day = get$1(this, 'Day');
|
||
if (input != null) {
|
||
input = parseWeekday(input, this.localeData());
|
||
return this.add(input - day, 'd');
|
||
} else {
|
||
return day;
|
||
}
|
||
}
|
||
|
||
function getSetLocaleDayOfWeek(input) {
|
||
if (!this.isValid()) {
|
||
return input != null ? this : NaN;
|
||
}
|
||
var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
|
||
return input == null ? weekday : this.add(input - weekday, 'd');
|
||
}
|
||
|
||
function getSetISODayOfWeek(input) {
|
||
if (!this.isValid()) {
|
||
return input != null ? this : NaN;
|
||
}
|
||
|
||
// behaves the same as moment#day except
|
||
// as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
|
||
// as a setter, sunday should belong to the previous week.
|
||
|
||
if (input != null) {
|
||
var weekday = parseIsoWeekday(input, this.localeData());
|
||
return this.day(this.day() % 7 ? weekday : weekday - 7);
|
||
} else {
|
||
return this.day() || 7;
|
||
}
|
||
}
|
||
|
||
// FORMATTING
|
||
|
||
function hFormat() {
|
||
return this.hours() % 12 || 12;
|
||
}
|
||
|
||
function kFormat() {
|
||
return this.hours() || 24;
|
||
}
|
||
|
||
addFormatToken('H', ['HH', 2], 0, 'hour');
|
||
addFormatToken('h', ['hh', 2], 0, hFormat);
|
||
addFormatToken('k', ['kk', 2], 0, kFormat);
|
||
|
||
addFormatToken('hmm', 0, 0, function () {
|
||
return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
|
||
});
|
||
|
||
addFormatToken('hmmss', 0, 0, function () {
|
||
return (
|
||
'' +
|
||
hFormat.apply(this) +
|
||
zeroFill(this.minutes(), 2) +
|
||
zeroFill(this.seconds(), 2)
|
||
);
|
||
});
|
||
|
||
addFormatToken('Hmm', 0, 0, function () {
|
||
return '' + this.hours() + zeroFill(this.minutes(), 2);
|
||
});
|
||
|
||
addFormatToken('Hmmss', 0, 0, function () {
|
||
return (
|
||
'' +
|
||
this.hours() +
|
||
zeroFill(this.minutes(), 2) +
|
||
zeroFill(this.seconds(), 2)
|
||
);
|
||
});
|
||
|
||
function meridiem(token, lowercase) {
|
||
addFormatToken(token, 0, 0, function () {
|
||
return this.localeData().meridiem(
|
||
this.hours(),
|
||
this.minutes(),
|
||
lowercase
|
||
);
|
||
});
|
||
}
|
||
|
||
meridiem('a', true);
|
||
meridiem('A', false);
|
||
|
||
// PARSING
|
||
|
||
function matchMeridiem(isStrict, locale) {
|
||
return locale._meridiemParse;
|
||
}
|
||
|
||
addRegexToken('a', matchMeridiem);
|
||
addRegexToken('A', matchMeridiem);
|
||
addRegexToken('H', match1to2$1, match1to2HasZero);
|
||
addRegexToken('h', match1to2$1, match1to2NoLeadingZero);
|
||
addRegexToken('k', match1to2$1, match1to2NoLeadingZero);
|
||
addRegexToken('HH', match1to2$1, match2$1);
|
||
addRegexToken('hh', match1to2$1, match2$1);
|
||
addRegexToken('kk', match1to2$1, match2$1);
|
||
|
||
addRegexToken('hmm', match3to4);
|
||
addRegexToken('hmmss', match5to6);
|
||
addRegexToken('Hmm', match3to4);
|
||
addRegexToken('Hmmss', match5to6);
|
||
|
||
addParseToken(['H', 'HH'], HOUR);
|
||
addParseToken(['k', 'kk'], function (input, array, config) {
|
||
var kInput = toInt(input);
|
||
array[HOUR] = kInput === 24 ? 0 : kInput;
|
||
});
|
||
addParseToken(['a', 'A'], function (input, array, config) {
|
||
config._isPm = config._locale.isPM(input);
|
||
config._meridiem = input;
|
||
});
|
||
addParseToken(['h', 'hh'], function (input, array, config) {
|
||
array[HOUR] = toInt(input);
|
||
getParsingFlags(config).bigHour = true;
|
||
});
|
||
addParseToken('hmm', function (input, array, config) {
|
||
var pos = input.length - 2;
|
||
array[HOUR] = toInt(input.substr(0, pos));
|
||
array[MINUTE] = toInt(input.substr(pos));
|
||
getParsingFlags(config).bigHour = true;
|
||
});
|
||
addParseToken('hmmss', function (input, array, config) {
|
||
var pos1 = input.length - 4,
|
||
pos2 = input.length - 2;
|
||
array[HOUR] = toInt(input.substr(0, pos1));
|
||
array[MINUTE] = toInt(input.substr(pos1, 2));
|
||
array[SECOND] = toInt(input.substr(pos2));
|
||
getParsingFlags(config).bigHour = true;
|
||
});
|
||
addParseToken('Hmm', function (input, array, config) {
|
||
var pos = input.length - 2;
|
||
array[HOUR] = toInt(input.substr(0, pos));
|
||
array[MINUTE] = toInt(input.substr(pos));
|
||
});
|
||
addParseToken('Hmmss', function (input, array, config) {
|
||
var pos1 = input.length - 4,
|
||
pos2 = input.length - 2;
|
||
array[HOUR] = toInt(input.substr(0, pos1));
|
||
array[MINUTE] = toInt(input.substr(pos1, 2));
|
||
array[SECOND] = toInt(input.substr(pos2));
|
||
});
|
||
|
||
var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i,
|
||
// Setting the hour should keep the time, because the user explicitly
|
||
// specified which hour they want. So trying to maintain the same hour (in
|
||
// a new timezone) makes sense. Adding/subtracting hours does not follow
|
||
// this rule.
|
||
getSetHour = makeGetSet('Hours', true);
|
||
|
||
var baseConfig = {
|
||
calendar: defaultCalendar,
|
||
longDateFormat: defaultLongDateFormat,
|
||
invalidDate: defaultInvalidDate,
|
||
ordinal: defaultOrdinal,
|
||
dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,
|
||
relativeTime: defaultRelativeTime,
|
||
|
||
months: defaultLocaleMonths,
|
||
monthsShort: defaultLocaleMonthsShort,
|
||
|
||
week: defaultLocaleWeek,
|
||
|
||
weekdays: defaultLocaleWeekdays,
|
||
weekdaysMin: defaultLocaleWeekdaysMin,
|
||
weekdaysShort: defaultLocaleWeekdaysShort,
|
||
|
||
meridiemParse: defaultLocaleMeridiemParse,
|
||
};
|
||
|
||
// internal storage for locale config files
|
||
var locales = {},
|
||
localeFamilies = {},
|
||
globalLocale;
|
||
|
||
function commonPrefix(arr1, arr2) {
|
||
var i,
|
||
minl = Math.min(arr1.length, arr2.length);
|
||
for (i = 0; i < minl; i += 1) {
|
||
if (arr1[i] !== arr2[i]) {
|
||
return i;
|
||
}
|
||
}
|
||
return minl;
|
||
}
|
||
|
||
function normalizeLocale(key) {
|
||
return key ? key.toLowerCase().replace('_', '-') : key;
|
||
}
|
||
|
||
// pick the locale from the array
|
||
// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
|
||
// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
|
||
function chooseLocale(names) {
|
||
var i = 0,
|
||
j,
|
||
next,
|
||
locale,
|
||
split;
|
||
|
||
while (i < names.length) {
|
||
split = normalizeLocale(names[i]).split('-');
|
||
j = split.length;
|
||
next = normalizeLocale(names[i + 1]);
|
||
next = next ? next.split('-') : null;
|
||
while (j > 0) {
|
||
locale = loadLocale(split.slice(0, j).join('-'));
|
||
if (locale) {
|
||
return locale;
|
||
}
|
||
if (
|
||
next &&
|
||
next.length >= j &&
|
||
commonPrefix(split, next) >= j - 1
|
||
) {
|
||
//the next array item is better than a shallower substring of this one
|
||
break;
|
||
}
|
||
j--;
|
||
}
|
||
i++;
|
||
}
|
||
return globalLocale;
|
||
}
|
||
|
||
function isLocaleNameSane(name) {
|
||
// Prevent names that look like filesystem paths, i.e contain '/' or '\'
|
||
// Ensure name is available and function returns boolean
|
||
return !!(name && name.match('^[^/\\\\]*$'));
|
||
}
|
||
|
||
function loadLocale(name) {
|
||
var oldLocale = null,
|
||
aliasedRequire;
|
||
// TODO: Find a better way to register and load all the locales in Node
|
||
if (
|
||
locales[name] === undefined &&
|
||
typeof module !== 'undefined' &&
|
||
module &&
|
||
module.exports &&
|
||
isLocaleNameSane(name)
|
||
) {
|
||
try {
|
||
oldLocale = globalLocale._abbr;
|
||
aliasedRequire = require;
|
||
aliasedRequire('./locale/' + name);
|
||
getSetGlobalLocale(oldLocale);
|
||
} catch (e) {
|
||
// mark as not found to avoid repeating expensive file require call causing high CPU
|
||
// when trying to find en-US, en_US, en-us for every format call
|
||
locales[name] = null; // null means not found
|
||
}
|
||
}
|
||
return locales[name];
|
||
}
|
||
|
||
// This function will load locale and then set the global locale. If
|
||
// no arguments are passed in, it will simply return the current global
|
||
// locale key.
|
||
function getSetGlobalLocale(key, values) {
|
||
var data;
|
||
if (key) {
|
||
if (isUndefined(values)) {
|
||
data = getLocale(key);
|
||
} else {
|
||
data = defineLocale(key, values);
|
||
}
|
||
|
||
if (data) {
|
||
// moment.duration._locale = moment._locale = data;
|
||
globalLocale = data;
|
||
} else {
|
||
if (typeof console !== 'undefined' && console.warn) {
|
||
//warn user if arguments are passed but the locale could not be set
|
||
console.warn(
|
||
'Locale ' + key + ' not found. Did you forget to load it?'
|
||
);
|
||
}
|
||
}
|
||
}
|
||
|
||
return globalLocale._abbr;
|
||
}
|
||
|
||
function defineLocale(name, config) {
|
||
if (config !== null) {
|
||
var locale,
|
||
parentConfig = baseConfig;
|
||
config.abbr = name;
|
||
if (locales[name] != null) {
|
||
deprecateSimple(
|
||
'defineLocaleOverride',
|
||
'use moment.updateLocale(localeName, config) to change ' +
|
||
'an existing locale. moment.defineLocale(localeName, ' +
|
||
'config) should only be used for creating a new locale ' +
|
||
'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'
|
||
);
|
||
parentConfig = locales[name]._config;
|
||
} else if (config.parentLocale != null) {
|
||
if (locales[config.parentLocale] != null) {
|
||
parentConfig = locales[config.parentLocale]._config;
|
||
} else {
|
||
locale = loadLocale(config.parentLocale);
|
||
if (locale != null) {
|
||
parentConfig = locale._config;
|
||
} else {
|
||
if (!localeFamilies[config.parentLocale]) {
|
||
localeFamilies[config.parentLocale] = [];
|
||
}
|
||
localeFamilies[config.parentLocale].push({
|
||
name: name,
|
||
config: config,
|
||
});
|
||
return null;
|
||
}
|
||
}
|
||
}
|
||
locales[name] = new Locale(mergeConfigs(parentConfig, config));
|
||
|
||
if (localeFamilies[name]) {
|
||
localeFamilies[name].forEach(function (x) {
|
||
defineLocale(x.name, x.config);
|
||
});
|
||
}
|
||
|
||
// backwards compat for now: also set the locale
|
||
// make sure we set the locale AFTER all child locales have been
|
||
// created, so we won't end up with the child locale set.
|
||
getSetGlobalLocale(name);
|
||
|
||
return locales[name];
|
||
} else {
|
||
// useful for testing
|
||
delete locales[name];
|
||
return null;
|
||
}
|
||
}
|
||
|
||
function updateLocale(name, config) {
|
||
if (config != null) {
|
||
var locale,
|
||
tmpLocale,
|
||
parentConfig = baseConfig;
|
||
|
||
if (locales[name] != null && locales[name].parentLocale != null) {
|
||
// Update existing child locale in-place to avoid memory-leaks
|
||
locales[name].set(mergeConfigs(locales[name]._config, config));
|
||
} else {
|
||
// MERGE
|
||
tmpLocale = loadLocale(name);
|
||
if (tmpLocale != null) {
|
||
parentConfig = tmpLocale._config;
|
||
}
|
||
config = mergeConfigs(parentConfig, config);
|
||
if (tmpLocale == null) {
|
||
// updateLocale is called for creating a new locale
|
||
// Set abbr so it will have a name (getters return
|
||
// undefined otherwise).
|
||
config.abbr = name;
|
||
}
|
||
locale = new Locale(config);
|
||
locale.parentLocale = locales[name];
|
||
locales[name] = locale;
|
||
}
|
||
|
||
// backwards compat for now: also set the locale
|
||
getSetGlobalLocale(name);
|
||
} else {
|
||
// pass null for config to unupdate, useful for tests
|
||
if (locales[name] != null) {
|
||
if (locales[name].parentLocale != null) {
|
||
locales[name] = locales[name].parentLocale;
|
||
if (name === getSetGlobalLocale()) {
|
||
getSetGlobalLocale(name);
|
||
}
|
||
} else if (locales[name] != null) {
|
||
delete locales[name];
|
||
}
|
||
}
|
||
}
|
||
return locales[name];
|
||
}
|
||
|
||
// returns locale data
|
||
function getLocale(key) {
|
||
var locale;
|
||
|
||
if (key && key._locale && key._locale._abbr) {
|
||
key = key._locale._abbr;
|
||
}
|
||
|
||
if (!key) {
|
||
return globalLocale;
|
||
}
|
||
|
||
if (!isArray(key)) {
|
||
//short-circuit everything else
|
||
locale = loadLocale(key);
|
||
if (locale) {
|
||
return locale;
|
||
}
|
||
key = [key];
|
||
}
|
||
|
||
return chooseLocale(key);
|
||
}
|
||
|
||
function listLocales() {
|
||
return keys(locales);
|
||
}
|
||
|
||
function checkOverflow(m) {
|
||
var overflow,
|
||
a = m._a;
|
||
|
||
if (a && getParsingFlags(m).overflow === -2) {
|
||
overflow =
|
||
a[MONTH] < 0 || a[MONTH] > 11
|
||
? MONTH
|
||
: a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH])
|
||
? DATE
|
||
: a[HOUR] < 0 ||
|
||
a[HOUR] > 24 ||
|
||
(a[HOUR] === 24 &&
|
||
(a[MINUTE] !== 0 ||
|
||
a[SECOND] !== 0 ||
|
||
a[MILLISECOND] !== 0))
|
||
? HOUR
|
||
: a[MINUTE] < 0 || a[MINUTE] > 59
|
||
? MINUTE
|
||
: a[SECOND] < 0 || a[SECOND] > 59
|
||
? SECOND
|
||
: a[MILLISECOND] < 0 || a[MILLISECOND] > 999
|
||
? MILLISECOND
|
||
: -1;
|
||
|
||
if (
|
||
getParsingFlags(m)._overflowDayOfYear &&
|
||
(overflow < YEAR || overflow > DATE)
|
||
) {
|
||
overflow = DATE;
|
||
}
|
||
if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
|
||
overflow = WEEK;
|
||
}
|
||
if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
|
||
overflow = WEEKDAY;
|
||
}
|
||
|
||
getParsingFlags(m).overflow = overflow;
|
||
}
|
||
|
||
return m;
|
||
}
|
||
|
||
// iso 8601 regex
|
||
// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
|
||
var extendedIsoRegex =
|
||
/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
|
||
basicIsoRegex =
|
||
/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
|
||
tzRegex = /Z|[+-]\d\d(?::?\d\d)?/,
|
||
isoDates = [
|
||
['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
|
||
['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
|
||
['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
|
||
['GGGG-[W]WW', /\d{4}-W\d\d/, false],
|
||
['YYYY-DDD', /\d{4}-\d{3}/],
|
||
['YYYY-MM', /\d{4}-\d\d/, false],
|
||
['YYYYYYMMDD', /[+-]\d{10}/],
|
||
['YYYYMMDD', /\d{8}/],
|
||
['GGGG[W]WWE', /\d{4}W\d{3}/],
|
||
['GGGG[W]WW', /\d{4}W\d{2}/, false],
|
||
['YYYYDDD', /\d{7}/],
|
||
['YYYYMM', /\d{6}/, false],
|
||
['YYYY', /\d{4}/, false],
|
||
],
|
||
// iso time formats and regexes
|
||
isoTimes = [
|
||
['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
|
||
['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
|
||
['HH:mm:ss', /\d\d:\d\d:\d\d/],
|
||
['HH:mm', /\d\d:\d\d/],
|
||
['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
|
||
['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
|
||
['HHmmss', /\d\d\d\d\d\d/],
|
||
['HHmm', /\d\d\d\d/],
|
||
['HH', /\d\d/],
|
||
],
|
||
aspNetJsonRegex = /^\/?Date\((-?\d+)/i,
|
||
// RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3
|
||
rfc2822 =
|
||
/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,
|
||
obsOffsets = {
|
||
UT: 0,
|
||
GMT: 0,
|
||
EDT: -4 * 60,
|
||
EST: -5 * 60,
|
||
CDT: -5 * 60,
|
||
CST: -6 * 60,
|
||
MDT: -6 * 60,
|
||
MST: -7 * 60,
|
||
PDT: -7 * 60,
|
||
PST: -8 * 60,
|
||
};
|
||
|
||
// date from iso format
|
||
function configFromISO(config) {
|
||
var i,
|
||
l,
|
||
string = config._i,
|
||
match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
|
||
allowTime,
|
||
dateFormat,
|
||
timeFormat,
|
||
tzFormat,
|
||
isoDatesLen = isoDates.length,
|
||
isoTimesLen = isoTimes.length;
|
||
|
||
if (match) {
|
||
getParsingFlags(config).iso = true;
|
||
for (i = 0, l = isoDatesLen; i < l; i++) {
|
||
if (isoDates[i][1].exec(match[1])) {
|
||
dateFormat = isoDates[i][0];
|
||
allowTime = isoDates[i][2] !== false;
|
||
break;
|
||
}
|
||
}
|
||
if (dateFormat == null) {
|
||
config._isValid = false;
|
||
return;
|
||
}
|
||
if (match[3]) {
|
||
for (i = 0, l = isoTimesLen; i < l; i++) {
|
||
if (isoTimes[i][1].exec(match[3])) {
|
||
// match[2] should be 'T' or space
|
||
timeFormat = (match[2] || ' ') + isoTimes[i][0];
|
||
break;
|
||
}
|
||
}
|
||
if (timeFormat == null) {
|
||
config._isValid = false;
|
||
return;
|
||
}
|
||
}
|
||
if (!allowTime && timeFormat != null) {
|
||
config._isValid = false;
|
||
return;
|
||
}
|
||
if (match[4]) {
|
||
if (tzRegex.exec(match[4])) {
|
||
tzFormat = 'Z';
|
||
} else {
|
||
config._isValid = false;
|
||
return;
|
||
}
|
||
}
|
||
config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
|
||
configFromStringAndFormat(config);
|
||
} else {
|
||
config._isValid = false;
|
||
}
|
||
}
|
||
|
||
function extractFromRFC2822Strings(
|
||
yearStr,
|
||
monthStr,
|
||
dayStr,
|
||
hourStr,
|
||
minuteStr,
|
||
secondStr
|
||
) {
|
||
var result = [
|
||
untruncateYear(yearStr),
|
||
defaultLocaleMonthsShort.indexOf(monthStr),
|
||
parseInt(dayStr, 10),
|
||
parseInt(hourStr, 10),
|
||
parseInt(minuteStr, 10),
|
||
];
|
||
|
||
if (secondStr) {
|
||
result.push(parseInt(secondStr, 10));
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
function untruncateYear(yearStr) {
|
||
var year = parseInt(yearStr, 10);
|
||
if (year <= 49) {
|
||
return 2000 + year;
|
||
} else if (year <= 999) {
|
||
return 1900 + year;
|
||
}
|
||
return year;
|
||
}
|
||
|
||
function preprocessRFC2822(s) {
|
||
// Remove comments and folding whitespace and replace multiple-spaces with a single space
|
||
return s
|
||
.replace(/\([^()]*\)|[\n\t]/g, ' ')
|
||
.replace(/(\s\s+)/g, ' ')
|
||
.replace(/^\s\s*/, '')
|
||
.replace(/\s\s*$/, '');
|
||
}
|
||
|
||
function checkWeekday(weekdayStr, parsedInput, config) {
|
||
if (weekdayStr) {
|
||
// TODO: Replace the vanilla JS Date object with an independent day-of-week check.
|
||
var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),
|
||
weekdayActual = new Date(
|
||
parsedInput[0],
|
||
parsedInput[1],
|
||
parsedInput[2]
|
||
).getDay();
|
||
if (weekdayProvided !== weekdayActual) {
|
||
getParsingFlags(config).weekdayMismatch = true;
|
||
config._isValid = false;
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
function calculateOffset(obsOffset, militaryOffset, numOffset) {
|
||
if (obsOffset) {
|
||
return obsOffsets[obsOffset];
|
||
} else if (militaryOffset) {
|
||
// the only allowed military tz is Z
|
||
return 0;
|
||
} else {
|
||
var hm = parseInt(numOffset, 10),
|
||
m = hm % 100,
|
||
h = (hm - m) / 100;
|
||
return h * 60 + m;
|
||
}
|
||
}
|
||
|
||
// date and time from ref 2822 format
|
||
function configFromRFC2822(config) {
|
||
var match = rfc2822.exec(preprocessRFC2822(config._i)),
|
||
parsedArray;
|
||
if (match) {
|
||
parsedArray = extractFromRFC2822Strings(
|
||
match[4],
|
||
match[3],
|
||
match[2],
|
||
match[5],
|
||
match[6],
|
||
match[7]
|
||
);
|
||
if (!checkWeekday(match[1], parsedArray, config)) {
|
||
return;
|
||
}
|
||
|
||
config._a = parsedArray;
|
||
config._tzm = calculateOffset(match[8], match[9], match[10]);
|
||
|
||
config._d = createUTCDate.apply(null, config._a);
|
||
config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
|
||
|
||
getParsingFlags(config).rfc2822 = true;
|
||
} else {
|
||
config._isValid = false;
|
||
}
|
||
}
|
||
|
||
// date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict
|
||
function configFromString(config) {
|
||
var matched = aspNetJsonRegex.exec(config._i);
|
||
if (matched !== null) {
|
||
config._d = new Date(+matched[1]);
|
||
return;
|
||
}
|
||
|
||
configFromISO(config);
|
||
if (config._isValid === false) {
|
||
delete config._isValid;
|
||
} else {
|
||
return;
|
||
}
|
||
|
||
configFromRFC2822(config);
|
||
if (config._isValid === false) {
|
||
delete config._isValid;
|
||
} else {
|
||
return;
|
||
}
|
||
|
||
if (config._strict) {
|
||
config._isValid = false;
|
||
} else {
|
||
// Final attempt, use Input Fallback
|
||
hooks.createFromInputFallback(config);
|
||
}
|
||
}
|
||
|
||
hooks.createFromInputFallback = deprecate(
|
||
'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +
|
||
'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +
|
||
'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.',
|
||
function (config) {
|
||
config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
|
||
}
|
||
);
|
||
|
||
// Pick the first defined of two or three arguments.
|
||
function defaults(a, b, c) {
|
||
if (a != null) {
|
||
return a;
|
||
}
|
||
if (b != null) {
|
||
return b;
|
||
}
|
||
return c;
|
||
}
|
||
|
||
function currentDateArray(config) {
|
||
// hooks is actually the exported moment object
|
||
var nowValue = new Date(hooks.now());
|
||
if (config._useUTC) {
|
||
return [
|
||
nowValue.getUTCFullYear(),
|
||
nowValue.getUTCMonth(),
|
||
nowValue.getUTCDate(),
|
||
];
|
||
}
|
||
return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
|
||
}
|
||
|
||
// convert an array to a date.
|
||
// the array should mirror the parameters below
|
||
// note: all values past the year are optional and will default to the lowest possible value.
|
||
// [year, month, day , hour, minute, second, millisecond]
|
||
function configFromArray(config) {
|
||
var i,
|
||
date,
|
||
input = [],
|
||
currentDate,
|
||
expectedWeekday,
|
||
yearToUse;
|
||
|
||
if (config._d) {
|
||
return;
|
||
}
|
||
|
||
currentDate = currentDateArray(config);
|
||
|
||
//compute day of the year from weeks and weekdays
|
||
if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
|
||
dayOfYearFromWeekInfo(config);
|
||
}
|
||
|
||
//if the day of the year is set, figure out what it is
|
||
if (config._dayOfYear != null) {
|
||
yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);
|
||
|
||
if (
|
||
config._dayOfYear > daysInYear(yearToUse) ||
|
||
config._dayOfYear === 0
|
||
) {
|
||
getParsingFlags(config)._overflowDayOfYear = true;
|
||
}
|
||
|
||
date = createUTCDate(yearToUse, 0, config._dayOfYear);
|
||
config._a[MONTH] = date.getUTCMonth();
|
||
config._a[DATE] = date.getUTCDate();
|
||
}
|
||
|
||
// Default to current date.
|
||
// * if no year, month, day of month are given, default to today
|
||
// * if day of month is given, default month and year
|
||
// * if month is given, default only year
|
||
// * if year is given, don't default anything
|
||
for (i = 0; i < 3 && config._a[i] == null; ++i) {
|
||
config._a[i] = input[i] = currentDate[i];
|
||
}
|
||
|
||
// Zero out whatever was not defaulted, including time
|
||
for (; i < 7; i++) {
|
||
config._a[i] = input[i] =
|
||
config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i];
|
||
}
|
||
|
||
// Check for 24:00:00.000
|
||
if (
|
||
config._a[HOUR] === 24 &&
|
||
config._a[MINUTE] === 0 &&
|
||
config._a[SECOND] === 0 &&
|
||
config._a[MILLISECOND] === 0
|
||
) {
|
||
config._nextDay = true;
|
||
config._a[HOUR] = 0;
|
||
}
|
||
|
||
config._d = (config._useUTC ? createUTCDate : createDate).apply(
|
||
null,
|
||
input
|
||
);
|
||
expectedWeekday = config._useUTC
|
||
? config._d.getUTCDay()
|
||
: config._d.getDay();
|
||
|
||
// Apply timezone offset from input. The actual utcOffset can be changed
|
||
// with parseZone.
|
||
if (config._tzm != null) {
|
||
config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
|
||
}
|
||
|
||
if (config._nextDay) {
|
||
config._a[HOUR] = 24;
|
||
}
|
||
|
||
// check for mismatching day of week
|
||
if (
|
||
config._w &&
|
||
typeof config._w.d !== 'undefined' &&
|
||
config._w.d !== expectedWeekday
|
||
) {
|
||
getParsingFlags(config).weekdayMismatch = true;
|
||
}
|
||
}
|
||
|
||
function dayOfYearFromWeekInfo(config) {
|
||
var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek;
|
||
|
||
w = config._w;
|
||
if (w.GG != null || w.W != null || w.E != null) {
|
||
dow = 1;
|
||
doy = 4;
|
||
|
||
// TODO: We need to take the current isoWeekYear, but that depends on
|
||
// how we interpret now (local, utc, fixed offset). So create
|
||
// a now version of current config (take local/utc/offset flags, and
|
||
// create now).
|
||
weekYear = defaults(
|
||
w.GG,
|
||
config._a[YEAR],
|
||
weekOfYear$1(createLocal(), 1, 4).year
|
||
);
|
||
week = defaults(w.W, 1);
|
||
weekday = defaults(w.E, 1);
|
||
if (weekday < 1 || weekday > 7) {
|
||
weekdayOverflow = true;
|
||
}
|
||
} else {
|
||
dow = config._locale._week.dow;
|
||
doy = config._locale._week.doy;
|
||
|
||
curWeek = weekOfYear$1(createLocal(), dow, doy);
|
||
|
||
weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);
|
||
|
||
// Default to current week.
|
||
week = defaults(w.w, curWeek.week);
|
||
|
||
if (w.d != null) {
|
||
// weekday -- low day numbers are considered next week
|
||
weekday = w.d;
|
||
if (weekday < 0 || weekday > 6) {
|
||
weekdayOverflow = true;
|
||
}
|
||
} else if (w.e != null) {
|
||
// local weekday -- counting starts from beginning of week
|
||
weekday = w.e + dow;
|
||
if (w.e < 0 || w.e > 6) {
|
||
weekdayOverflow = true;
|
||
}
|
||
} else {
|
||
// default to beginning of week
|
||
weekday = dow;
|
||
}
|
||
}
|
||
if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
|
||
getParsingFlags(config)._overflowWeeks = true;
|
||
} else if (weekdayOverflow != null) {
|
||
getParsingFlags(config)._overflowWeekday = true;
|
||
} else {
|
||
temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
|
||
config._a[YEAR] = temp.year;
|
||
config._dayOfYear = temp.dayOfYear;
|
||
}
|
||
}
|
||
|
||
// constant that refers to the ISO standard
|
||
hooks.ISO_8601 = function () {};
|
||
|
||
// constant that refers to the RFC 2822 form
|
||
hooks.RFC_2822 = function () {};
|
||
|
||
// date from string and format string
|
||
function configFromStringAndFormat(config) {
|
||
// TODO: Move this to another part of the creation flow to prevent circular deps
|
||
if (config._f === hooks.ISO_8601) {
|
||
configFromISO(config);
|
||
return;
|
||
}
|
||
if (config._f === hooks.RFC_2822) {
|
||
configFromRFC2822(config);
|
||
return;
|
||
}
|
||
config._a = [];
|
||
getParsingFlags(config).empty = true;
|
||
|
||
// This array is used to make a Date, either with `new Date` or `Date.UTC`
|
||
var string = '' + config._i,
|
||
i,
|
||
parsedInput,
|
||
tokens,
|
||
token,
|
||
skipped,
|
||
stringLength = string.length,
|
||
totalParsedInputLength = 0,
|
||
era,
|
||
tokenLen;
|
||
|
||
tokens =
|
||
expandFormat(config._f, config._locale).match(formattingTokens$1) || [];
|
||
tokenLen = tokens.length;
|
||
for (i = 0; i < tokenLen; i++) {
|
||
token = tokens[i];
|
||
parsedInput = (string.match(getParseRegexForToken(token, config)) ||
|
||
[])[0];
|
||
if (parsedInput) {
|
||
skipped = string.substr(0, string.indexOf(parsedInput));
|
||
if (skipped.length > 0) {
|
||
getParsingFlags(config).unusedInput.push(skipped);
|
||
}
|
||
string = string.slice(
|
||
string.indexOf(parsedInput) + parsedInput.length
|
||
);
|
||
totalParsedInputLength += parsedInput.length;
|
||
}
|
||
// don't parse if it's not a known token
|
||
if (formatTokenFunctions[token]) {
|
||
if (parsedInput) {
|
||
getParsingFlags(config).empty = false;
|
||
} else {
|
||
getParsingFlags(config).unusedTokens.push(token);
|
||
}
|
||
addTimeToArrayFromToken(token, parsedInput, config);
|
||
} else if (config._strict && !parsedInput) {
|
||
getParsingFlags(config).unusedTokens.push(token);
|
||
}
|
||
}
|
||
|
||
// add remaining unparsed input length to the string
|
||
getParsingFlags(config).charsLeftOver =
|
||
stringLength - totalParsedInputLength;
|
||
if (string.length > 0) {
|
||
getParsingFlags(config).unusedInput.push(string);
|
||
}
|
||
|
||
// clear _12h flag if hour is <= 12
|
||
if (
|
||
config._a[HOUR] <= 12 &&
|
||
getParsingFlags(config).bigHour === true &&
|
||
config._a[HOUR] > 0
|
||
) {
|
||
getParsingFlags(config).bigHour = undefined;
|
||
}
|
||
|
||
getParsingFlags(config).parsedDateParts = config._a.slice(0);
|
||
getParsingFlags(config).meridiem = config._meridiem;
|
||
// handle meridiem
|
||
config._a[HOUR] = meridiemFixWrap(
|
||
config._locale,
|
||
config._a[HOUR],
|
||
config._meridiem
|
||
);
|
||
|
||
// handle era
|
||
era = getParsingFlags(config).era;
|
||
if (era !== null) {
|
||
config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);
|
||
}
|
||
|
||
configFromArray(config);
|
||
checkOverflow(config);
|
||
}
|
||
|
||
function meridiemFixWrap(locale, hour, meridiem) {
|
||
var isPm;
|
||
|
||
if (meridiem == null) {
|
||
// nothing to do
|
||
return hour;
|
||
}
|
||
if (locale.meridiemHour != null) {
|
||
return locale.meridiemHour(hour, meridiem);
|
||
} else if (locale.isPM != null) {
|
||
// Fallback
|
||
isPm = locale.isPM(meridiem);
|
||
if (isPm && hour < 12) {
|
||
hour += 12;
|
||
}
|
||
if (!isPm && hour === 12) {
|
||
hour = 0;
|
||
}
|
||
return hour;
|
||
} else {
|
||
// this is not supposed to happen
|
||
return hour;
|
||
}
|
||
}
|
||
|
||
// date from string and array of format strings
|
||
function configFromStringAndArray(config) {
|
||
var tempConfig,
|
||
bestMoment,
|
||
scoreToBeat,
|
||
i,
|
||
currentScore,
|
||
validFormatFound,
|
||
bestFormatIsValid = false,
|
||
configfLen = config._f.length;
|
||
|
||
if (configfLen === 0) {
|
||
getParsingFlags(config).invalidFormat = true;
|
||
config._d = new Date(NaN);
|
||
return;
|
||
}
|
||
|
||
for (i = 0; i < configfLen; i++) {
|
||
currentScore = 0;
|
||
validFormatFound = false;
|
||
tempConfig = copyConfig({}, config);
|
||
if (config._useUTC != null) {
|
||
tempConfig._useUTC = config._useUTC;
|
||
}
|
||
tempConfig._f = config._f[i];
|
||
configFromStringAndFormat(tempConfig);
|
||
|
||
if (isValid$1(tempConfig)) {
|
||
validFormatFound = true;
|
||
}
|
||
|
||
// if there is any input that was not parsed add a penalty for that format
|
||
currentScore += getParsingFlags(tempConfig).charsLeftOver;
|
||
|
||
//or tokens
|
||
currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
|
||
|
||
getParsingFlags(tempConfig).score = currentScore;
|
||
|
||
if (!bestFormatIsValid) {
|
||
if (
|
||
scoreToBeat == null ||
|
||
currentScore < scoreToBeat ||
|
||
validFormatFound
|
||
) {
|
||
scoreToBeat = currentScore;
|
||
bestMoment = tempConfig;
|
||
if (validFormatFound) {
|
||
bestFormatIsValid = true;
|
||
}
|
||
}
|
||
} else {
|
||
if (currentScore < scoreToBeat) {
|
||
scoreToBeat = currentScore;
|
||
bestMoment = tempConfig;
|
||
}
|
||
}
|
||
}
|
||
|
||
extend(config, bestMoment || tempConfig);
|
||
}
|
||
|
||
function configFromObject(config) {
|
||
if (config._d) {
|
||
return;
|
||
}
|
||
|
||
var i = normalizeObjectUnits(config._i),
|
||
dayOrDate = i.day === undefined ? i.date : i.day;
|
||
config._a = map(
|
||
[i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond],
|
||
function (obj) {
|
||
return obj && parseInt(obj, 10);
|
||
}
|
||
);
|
||
|
||
configFromArray(config);
|
||
}
|
||
|
||
function createFromConfig(config) {
|
||
var res = new Moment(checkOverflow(prepareConfig(config)));
|
||
if (res._nextDay) {
|
||
// Adding is smart enough around DST
|
||
res.add(1, 'd');
|
||
res._nextDay = undefined;
|
||
}
|
||
|
||
return res;
|
||
}
|
||
|
||
function prepareConfig(config) {
|
||
var input = config._i,
|
||
format = config._f;
|
||
|
||
config._locale = config._locale || getLocale(config._l);
|
||
|
||
if (input === null || (format === undefined && input === '')) {
|
||
return createInvalid$1({ nullInput: true });
|
||
}
|
||
|
||
if (typeof input === 'string') {
|
||
config._i = input = config._locale.preparse(input);
|
||
}
|
||
|
||
if (isMoment(input)) {
|
||
return new Moment(checkOverflow(input));
|
||
} else if (isDate(input)) {
|
||
config._d = input;
|
||
} else if (isArray(format)) {
|
||
configFromStringAndArray(config);
|
||
} else if (format) {
|
||
configFromStringAndFormat(config);
|
||
} else {
|
||
configFromInput(config);
|
||
}
|
||
|
||
if (!isValid$1(config)) {
|
||
config._d = null;
|
||
}
|
||
|
||
return config;
|
||
}
|
||
|
||
function configFromInput(config) {
|
||
var input = config._i;
|
||
if (isUndefined(input)) {
|
||
config._d = new Date(hooks.now());
|
||
} else if (isDate(input)) {
|
||
config._d = new Date(input.valueOf());
|
||
} else if (typeof input === 'string') {
|
||
configFromString(config);
|
||
} else if (isArray(input)) {
|
||
config._a = map(input.slice(0), function (obj) {
|
||
return parseInt(obj, 10);
|
||
});
|
||
configFromArray(config);
|
||
} else if (isObject(input)) {
|
||
configFromObject(config);
|
||
} else if (isNumber(input)) {
|
||
// from milliseconds
|
||
config._d = new Date(input);
|
||
} else {
|
||
hooks.createFromInputFallback(config);
|
||
}
|
||
}
|
||
|
||
function createLocalOrUTC(input, format, locale, strict, isUTC) {
|
||
var c = {};
|
||
|
||
if (format === true || format === false) {
|
||
strict = format;
|
||
format = undefined;
|
||
}
|
||
|
||
if (locale === true || locale === false) {
|
||
strict = locale;
|
||
locale = undefined;
|
||
}
|
||
|
||
if (
|
||
(isObject(input) && isObjectEmpty(input)) ||
|
||
(isArray(input) && input.length === 0)
|
||
) {
|
||
input = undefined;
|
||
}
|
||
// object construction must be done this way.
|
||
// https://github.com/moment/moment/issues/1423
|
||
c._isAMomentObject = true;
|
||
c._useUTC = c._isUTC = isUTC;
|
||
c._l = locale;
|
||
c._i = input;
|
||
c._f = format;
|
||
c._strict = strict;
|
||
|
||
return createFromConfig(c);
|
||
}
|
||
|
||
function createLocal(input, format, locale, strict) {
|
||
return createLocalOrUTC(input, format, locale, strict, false);
|
||
}
|
||
|
||
var prototypeMin = deprecate(
|
||
'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
|
||
function () {
|
||
var other = createLocal.apply(null, arguments);
|
||
if (this.isValid() && other.isValid()) {
|
||
return other < this ? this : other;
|
||
} else {
|
||
return createInvalid$1();
|
||
}
|
||
}
|
||
),
|
||
prototypeMax = deprecate(
|
||
'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
|
||
function () {
|
||
var other = createLocal.apply(null, arguments);
|
||
if (this.isValid() && other.isValid()) {
|
||
return other > this ? this : other;
|
||
} else {
|
||
return createInvalid$1();
|
||
}
|
||
}
|
||
);
|
||
|
||
// Pick a moment m from moments so that m[fn](other) is true for all
|
||
// other. This relies on the function fn to be transitive.
|
||
//
|
||
// moments should either be an array of moment objects or an array, whose
|
||
// first element is an array of moment objects.
|
||
function pickBy(fn, moments) {
|
||
var res, i;
|
||
if (moments.length === 1 && isArray(moments[0])) {
|
||
moments = moments[0];
|
||
}
|
||
if (!moments.length) {
|
||
return createLocal();
|
||
}
|
||
res = moments[0];
|
||
for (i = 1; i < moments.length; ++i) {
|
||
if (!moments[i].isValid() || moments[i][fn](res)) {
|
||
res = moments[i];
|
||
}
|
||
}
|
||
return res;
|
||
}
|
||
|
||
// TODO: Use [].sort instead?
|
||
function min() {
|
||
var args = [].slice.call(arguments, 0);
|
||
|
||
return pickBy('isBefore', args);
|
||
}
|
||
|
||
function max() {
|
||
var args = [].slice.call(arguments, 0);
|
||
|
||
return pickBy('isAfter', args);
|
||
}
|
||
|
||
var now = function () {
|
||
return Date.now ? Date.now() : +new Date();
|
||
};
|
||
|
||
var ordering = [
|
||
'year',
|
||
'quarter',
|
||
'month',
|
||
'week',
|
||
'day',
|
||
'hour',
|
||
'minute',
|
||
'second',
|
||
'millisecond',
|
||
];
|
||
|
||
function isDurationValid(m) {
|
||
var key,
|
||
unitHasDecimal = false,
|
||
i,
|
||
orderLen = ordering.length;
|
||
for (key in m) {
|
||
if (
|
||
hasOwnProp(m, key) &&
|
||
!(
|
||
indexOf.call(ordering, key) !== -1 &&
|
||
(m[key] == null || !isNaN(m[key]))
|
||
)
|
||
) {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
for (i = 0; i < orderLen; ++i) {
|
||
if (m[ordering[i]]) {
|
||
if (unitHasDecimal) {
|
||
return false; // only allow non-integers for smallest unit
|
||
}
|
||
if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {
|
||
unitHasDecimal = true;
|
||
}
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
function createInvalid() {
|
||
return createDuration(NaN);
|
||
}
|
||
|
||
function Duration(duration) {
|
||
var normalizedInput = normalizeObjectUnits(duration),
|
||
years = normalizedInput.year || 0,
|
||
quarters = normalizedInput.quarter || 0,
|
||
months = normalizedInput.month || 0,
|
||
weeks = normalizedInput.week || normalizedInput.isoWeek || 0,
|
||
days = normalizedInput.day || 0,
|
||
hours = normalizedInput.hour || 0,
|
||
minutes = normalizedInput.minute || 0,
|
||
seconds = normalizedInput.second || 0,
|
||
milliseconds = normalizedInput.millisecond || 0;
|
||
|
||
this._isValid = isDurationValid(normalizedInput);
|
||
|
||
// representation for dateAddRemove
|
||
this._milliseconds =
|
||
+milliseconds +
|
||
seconds * 1e3 + // 1000
|
||
minutes * 6e4 + // 1000 * 60
|
||
hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
|
||
// Because of dateAddRemove treats 24 hours as different from a
|
||
// day when working around DST, we need to store them separately
|
||
this._days = +days + weeks * 7;
|
||
// It is impossible to translate months into days without knowing
|
||
// which months you are are talking about, so we have to store
|
||
// it separately.
|
||
this._months = +months + quarters * 3 + years * 12;
|
||
|
||
this._data = {};
|
||
|
||
this._locale = getLocale();
|
||
|
||
this._bubble();
|
||
}
|
||
|
||
function isDuration(obj) {
|
||
return obj instanceof Duration;
|
||
}
|
||
|
||
function absRound(number) {
|
||
if (number < 0) {
|
||
return Math.round(-1 * number) * -1;
|
||
} else {
|
||
return Math.round(number);
|
||
}
|
||
}
|
||
|
||
// compare two arrays, return the number of differences
|
||
function compareArrays(array1, array2, dontConvert) {
|
||
var len = Math.min(array1.length, array2.length),
|
||
lengthDiff = Math.abs(array1.length - array2.length),
|
||
diffs = 0,
|
||
i;
|
||
for (i = 0; i < len; i++) {
|
||
if (
|
||
(toInt(array1[i]) !== toInt(array2[i]))
|
||
) {
|
||
diffs++;
|
||
}
|
||
}
|
||
return diffs + lengthDiff;
|
||
}
|
||
|
||
// FORMATTING
|
||
|
||
function offset(token, separator) {
|
||
addFormatToken(token, 0, 0, function () {
|
||
var offset = this.utcOffset(),
|
||
sign = '+';
|
||
if (offset < 0) {
|
||
offset = -offset;
|
||
sign = '-';
|
||
}
|
||
return (
|
||
sign +
|
||
zeroFill(~~(offset / 60), 2) +
|
||
separator +
|
||
zeroFill(~~offset % 60, 2)
|
||
);
|
||
});
|
||
}
|
||
|
||
offset('Z', ':');
|
||
offset('ZZ', '');
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('Z', matchShortOffset);
|
||
addRegexToken('ZZ', matchShortOffset);
|
||
addParseToken(['Z', 'ZZ'], function (input, array, config) {
|
||
config._useUTC = true;
|
||
config._tzm = offsetFromString$1(matchShortOffset, input);
|
||
});
|
||
|
||
// HELPERS
|
||
|
||
// timezone chunker
|
||
// '+10:00' > ['10', '00']
|
||
// '-1530' > ['-15', '30']
|
||
var chunkOffset = /([\+\-]|\d\d)/gi;
|
||
|
||
function offsetFromString$1(matcher, string) {
|
||
var matches = (string || '').match(matcher),
|
||
chunk,
|
||
parts,
|
||
minutes;
|
||
|
||
if (matches === null) {
|
||
return null;
|
||
}
|
||
|
||
chunk = matches[matches.length - 1] || [];
|
||
parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];
|
||
minutes = +(parts[1] * 60) + toInt(parts[2]);
|
||
|
||
return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes;
|
||
}
|
||
|
||
// Return a moment from input, that is local/utc/zone equivalent to model.
|
||
function cloneWithOffset(input, model) {
|
||
var res, diff;
|
||
if (model._isUTC) {
|
||
res = model.clone();
|
||
diff =
|
||
(isMoment(input) || isDate(input)
|
||
? input.valueOf()
|
||
: createLocal(input).valueOf()) - res.valueOf();
|
||
// Use low-level api, because this fn is low-level api.
|
||
res._d.setTime(res._d.valueOf() + diff);
|
||
hooks.updateOffset(res, false);
|
||
return res;
|
||
} else {
|
||
return createLocal(input).local();
|
||
}
|
||
}
|
||
|
||
function getDateOffset(m) {
|
||
// On Firefox.24 Date#getTimezoneOffset returns a floating point.
|
||
// https://github.com/moment/moment/pull/1871
|
||
return -Math.round(m._d.getTimezoneOffset());
|
||
}
|
||
|
||
// HOOKS
|
||
|
||
// This function will be called whenever a moment is mutated.
|
||
// It is intended to keep the offset in sync with the timezone.
|
||
hooks.updateOffset = function () {};
|
||
|
||
// MOMENTS
|
||
|
||
// keepLocalTime = true means only change the timezone, without
|
||
// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
|
||
// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
|
||
// +0200, so we adjust the time as needed, to be valid.
|
||
//
|
||
// Keeping the time actually adds/subtracts (one hour)
|
||
// from the actual represented time. That is why we call updateOffset
|
||
// a second time. In case it wants us to change the offset again
|
||
// _changeInProgress == true case, then we have to adjust, because
|
||
// there is no such time in the given timezone.
|
||
function getSetOffset(input, keepLocalTime, keepMinutes) {
|
||
var offset = this._offset || 0,
|
||
localAdjust;
|
||
if (!this.isValid()) {
|
||
return input != null ? this : NaN;
|
||
}
|
||
if (input != null) {
|
||
if (typeof input === 'string') {
|
||
input = offsetFromString$1(matchShortOffset, input);
|
||
if (input === null) {
|
||
return this;
|
||
}
|
||
} else if (Math.abs(input) < 16 && !keepMinutes) {
|
||
input = input * 60;
|
||
}
|
||
if (!this._isUTC && keepLocalTime) {
|
||
localAdjust = getDateOffset(this);
|
||
}
|
||
this._offset = input;
|
||
this._isUTC = true;
|
||
if (localAdjust != null) {
|
||
this.add(localAdjust, 'm');
|
||
}
|
||
if (offset !== input) {
|
||
if (!keepLocalTime || this._changeInProgress) {
|
||
addSubtract(
|
||
this,
|
||
createDuration(input - offset, 'm'),
|
||
1,
|
||
false
|
||
);
|
||
} else if (!this._changeInProgress) {
|
||
this._changeInProgress = true;
|
||
hooks.updateOffset(this, true);
|
||
this._changeInProgress = null;
|
||
}
|
||
}
|
||
return this;
|
||
} else {
|
||
return this._isUTC ? offset : getDateOffset(this);
|
||
}
|
||
}
|
||
|
||
function getSetZone(input, keepLocalTime) {
|
||
if (input != null) {
|
||
if (typeof input !== 'string') {
|
||
input = -input;
|
||
}
|
||
|
||
this.utcOffset(input, keepLocalTime);
|
||
|
||
return this;
|
||
} else {
|
||
return -this.utcOffset();
|
||
}
|
||
}
|
||
|
||
function setOffsetToUTC(keepLocalTime) {
|
||
return this.utcOffset(0, keepLocalTime);
|
||
}
|
||
|
||
function setOffsetToLocal(keepLocalTime) {
|
||
if (this._isUTC) {
|
||
this.utcOffset(0, keepLocalTime);
|
||
this._isUTC = false;
|
||
|
||
if (keepLocalTime) {
|
||
this.subtract(getDateOffset(this), 'm');
|
||
}
|
||
}
|
||
return this;
|
||
}
|
||
|
||
function setOffsetToParsedOffset() {
|
||
if (this._tzm != null) {
|
||
this.utcOffset(this._tzm, false, true);
|
||
} else if (typeof this._i === 'string') {
|
||
var tZone = offsetFromString$1(matchOffset$1, this._i);
|
||
if (tZone != null) {
|
||
this.utcOffset(tZone);
|
||
} else {
|
||
this.utcOffset(0, true);
|
||
}
|
||
}
|
||
return this;
|
||
}
|
||
|
||
function hasAlignedHourOffset(input) {
|
||
if (!this.isValid()) {
|
||
return false;
|
||
}
|
||
input = input ? createLocal(input).utcOffset() : 0;
|
||
|
||
return (this.utcOffset() - input) % 60 === 0;
|
||
}
|
||
|
||
function isDaylightSavingTime() {
|
||
return (
|
||
this.utcOffset() > this.clone().month(0).utcOffset() ||
|
||
this.utcOffset() > this.clone().month(5).utcOffset()
|
||
);
|
||
}
|
||
|
||
function isDaylightSavingTimeShifted() {
|
||
if (!isUndefined(this._isDSTShifted)) {
|
||
return this._isDSTShifted;
|
||
}
|
||
|
||
var c = {},
|
||
other;
|
||
|
||
copyConfig(c, this);
|
||
c = prepareConfig(c);
|
||
|
||
if (c._a) {
|
||
other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
|
||
this._isDSTShifted =
|
||
this.isValid() && compareArrays(c._a, other.toArray()) > 0;
|
||
} else {
|
||
this._isDSTShifted = false;
|
||
}
|
||
|
||
return this._isDSTShifted;
|
||
}
|
||
|
||
function isLocal() {
|
||
return this.isValid() ? !this._isUTC : false;
|
||
}
|
||
|
||
function isUtcOffset() {
|
||
return this.isValid() ? this._isUTC : false;
|
||
}
|
||
|
||
function isUtc() {
|
||
return this.isValid() ? this._isUTC && this._offset === 0 : false;
|
||
}
|
||
|
||
// ASP.NET json date format regex
|
||
var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,
|
||
// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
|
||
// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
|
||
// and further modified to allow for strings containing both week and day
|
||
isoRegex =
|
||
/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
|
||
|
||
function createDuration(input, key) {
|
||
var duration = input,
|
||
// matching against regexp is expensive, do it on demand
|
||
match = null,
|
||
sign,
|
||
ret,
|
||
diffRes;
|
||
|
||
if (isDuration(input)) {
|
||
duration = {
|
||
ms: input._milliseconds,
|
||
d: input._days,
|
||
M: input._months,
|
||
};
|
||
} else if (isNumber(input) || !isNaN(+input)) {
|
||
duration = {};
|
||
if (key) {
|
||
duration[key] = +input;
|
||
} else {
|
||
duration.milliseconds = +input;
|
||
}
|
||
} else if ((match = aspNetRegex.exec(input))) {
|
||
sign = match[1] === '-' ? -1 : 1;
|
||
duration = {
|
||
y: 0,
|
||
d: toInt(match[DATE]) * sign,
|
||
h: toInt(match[HOUR]) * sign,
|
||
m: toInt(match[MINUTE]) * sign,
|
||
s: toInt(match[SECOND]) * sign,
|
||
ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match
|
||
};
|
||
} else if ((match = isoRegex.exec(input))) {
|
||
sign = match[1] === '-' ? -1 : 1;
|
||
duration = {
|
||
y: parseIso(match[2], sign),
|
||
M: parseIso(match[3], sign),
|
||
w: parseIso(match[4], sign),
|
||
d: parseIso(match[5], sign),
|
||
h: parseIso(match[6], sign),
|
||
m: parseIso(match[7], sign),
|
||
s: parseIso(match[8], sign),
|
||
};
|
||
} else if (duration == null) {
|
||
// checks for null or undefined
|
||
duration = {};
|
||
} else if (
|
||
typeof duration === 'object' &&
|
||
('from' in duration || 'to' in duration)
|
||
) {
|
||
diffRes = momentsDifference(
|
||
createLocal(duration.from),
|
||
createLocal(duration.to)
|
||
);
|
||
|
||
duration = {};
|
||
duration.ms = diffRes.milliseconds;
|
||
duration.M = diffRes.months;
|
||
}
|
||
|
||
ret = new Duration(duration);
|
||
|
||
if (isDuration(input) && hasOwnProp(input, '_locale')) {
|
||
ret._locale = input._locale;
|
||
}
|
||
|
||
if (isDuration(input) && hasOwnProp(input, '_isValid')) {
|
||
ret._isValid = input._isValid;
|
||
}
|
||
|
||
return ret;
|
||
}
|
||
|
||
createDuration.fn = Duration.prototype;
|
||
createDuration.invalid = createInvalid;
|
||
|
||
function parseIso(inp, sign) {
|
||
// We'd normally use ~~inp for this, but unfortunately it also
|
||
// converts floats to ints.
|
||
// inp may be undefined, so careful calling replace on it.
|
||
var res = inp && parseFloat(inp.replace(',', '.'));
|
||
// apply sign while we're at it
|
||
return (isNaN(res) ? 0 : res) * sign;
|
||
}
|
||
|
||
function positiveMomentsDifference(base, other) {
|
||
var res = {};
|
||
|
||
res.months =
|
||
other.month() - base.month() + (other.year() - base.year()) * 12;
|
||
if (base.clone().add(res.months, 'M').isAfter(other)) {
|
||
--res.months;
|
||
}
|
||
|
||
res.milliseconds = +other - +base.clone().add(res.months, 'M');
|
||
|
||
return res;
|
||
}
|
||
|
||
function momentsDifference(base, other) {
|
||
var res;
|
||
if (!(base.isValid() && other.isValid())) {
|
||
return { milliseconds: 0, months: 0 };
|
||
}
|
||
|
||
other = cloneWithOffset(other, base);
|
||
if (base.isBefore(other)) {
|
||
res = positiveMomentsDifference(base, other);
|
||
} else {
|
||
res = positiveMomentsDifference(other, base);
|
||
res.milliseconds = -res.milliseconds;
|
||
res.months = -res.months;
|
||
}
|
||
|
||
return res;
|
||
}
|
||
|
||
// TODO: remove 'name' arg after deprecation is removed
|
||
function createAdder(direction, name) {
|
||
return function (val, period) {
|
||
var dur, tmp;
|
||
//invert the arguments, but complain about it
|
||
if (period !== null && !isNaN(+period)) {
|
||
deprecateSimple(
|
||
name,
|
||
'moment().' +
|
||
name +
|
||
'(period, number) is deprecated. Please use moment().' +
|
||
name +
|
||
'(number, period). ' +
|
||
'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'
|
||
);
|
||
tmp = val;
|
||
val = period;
|
||
period = tmp;
|
||
}
|
||
|
||
dur = createDuration(val, period);
|
||
addSubtract(this, dur, direction);
|
||
return this;
|
||
};
|
||
}
|
||
|
||
function addSubtract(mom, duration, isAdding, updateOffset) {
|
||
var milliseconds = duration._milliseconds,
|
||
days = absRound(duration._days),
|
||
months = absRound(duration._months);
|
||
|
||
if (!mom.isValid()) {
|
||
// No op
|
||
return;
|
||
}
|
||
|
||
updateOffset = updateOffset == null ? true : updateOffset;
|
||
|
||
if (months) {
|
||
setMonth(mom, get$1(mom, 'Month') + months * isAdding);
|
||
}
|
||
if (days) {
|
||
set(mom, 'Date', get$1(mom, 'Date') + days * isAdding);
|
||
}
|
||
if (milliseconds) {
|
||
mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
|
||
}
|
||
if (updateOffset) {
|
||
hooks.updateOffset(mom, days || months);
|
||
}
|
||
}
|
||
|
||
var add = createAdder(1, 'add'),
|
||
subtract = createAdder(-1, 'subtract');
|
||
|
||
function isString(input) {
|
||
return typeof input === 'string' || input instanceof String;
|
||
}
|
||
|
||
// type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined
|
||
function isMomentInput(input) {
|
||
return (
|
||
isMoment(input) ||
|
||
isDate(input) ||
|
||
isString(input) ||
|
||
isNumber(input) ||
|
||
isNumberOrStringArray(input) ||
|
||
isMomentInputObject(input) ||
|
||
input === null ||
|
||
input === undefined
|
||
);
|
||
}
|
||
|
||
function isMomentInputObject(input) {
|
||
var objectTest = isObject(input) && !isObjectEmpty(input),
|
||
propertyTest = false,
|
||
properties = [
|
||
'years',
|
||
'year',
|
||
'y',
|
||
'months',
|
||
'month',
|
||
'M',
|
||
'days',
|
||
'day',
|
||
'd',
|
||
'dates',
|
||
'date',
|
||
'D',
|
||
'hours',
|
||
'hour',
|
||
'h',
|
||
'minutes',
|
||
'minute',
|
||
'm',
|
||
'seconds',
|
||
'second',
|
||
's',
|
||
'milliseconds',
|
||
'millisecond',
|
||
'ms',
|
||
],
|
||
i,
|
||
property,
|
||
propertyLen = properties.length;
|
||
|
||
for (i = 0; i < propertyLen; i += 1) {
|
||
property = properties[i];
|
||
propertyTest = propertyTest || hasOwnProp(input, property);
|
||
}
|
||
|
||
return objectTest && propertyTest;
|
||
}
|
||
|
||
function isNumberOrStringArray(input) {
|
||
var arrayTest = isArray(input),
|
||
dataTypeTest = false;
|
||
if (arrayTest) {
|
||
dataTypeTest =
|
||
input.filter(function (item) {
|
||
return !isNumber(item) && isString(input);
|
||
}).length === 0;
|
||
}
|
||
return arrayTest && dataTypeTest;
|
||
}
|
||
|
||
function isCalendarSpec(input) {
|
||
var objectTest = isObject(input) && !isObjectEmpty(input),
|
||
propertyTest = false,
|
||
properties = [
|
||
'sameDay',
|
||
'nextDay',
|
||
'lastDay',
|
||
'nextWeek',
|
||
'lastWeek',
|
||
'sameElse',
|
||
],
|
||
i,
|
||
property;
|
||
|
||
for (i = 0; i < properties.length; i += 1) {
|
||
property = properties[i];
|
||
propertyTest = propertyTest || hasOwnProp(input, property);
|
||
}
|
||
|
||
return objectTest && propertyTest;
|
||
}
|
||
|
||
function getCalendarFormat(myMoment, now) {
|
||
var diff = myMoment.diff(now, 'days', true);
|
||
return diff < -6
|
||
? 'sameElse'
|
||
: diff < -1
|
||
? 'lastWeek'
|
||
: diff < 0
|
||
? 'lastDay'
|
||
: diff < 1
|
||
? 'sameDay'
|
||
: diff < 2
|
||
? 'nextDay'
|
||
: diff < 7
|
||
? 'nextWeek'
|
||
: 'sameElse';
|
||
}
|
||
|
||
function calendar(time, formats) {
|
||
// Support for single parameter, formats only overload to the calendar function
|
||
if (arguments.length === 1) {
|
||
if (!arguments[0]) {
|
||
time = undefined;
|
||
formats = undefined;
|
||
} else if (isMomentInput(arguments[0])) {
|
||
time = arguments[0];
|
||
formats = undefined;
|
||
} else if (isCalendarSpec(arguments[0])) {
|
||
formats = arguments[0];
|
||
time = undefined;
|
||
}
|
||
}
|
||
// We want to compare the start of today, vs this.
|
||
// Getting start-of-today depends on whether we're local/utc/offset or not.
|
||
var now = time || createLocal(),
|
||
sod = cloneWithOffset(now, this).startOf('day'),
|
||
format = hooks.calendarFormat(this, sod) || 'sameElse',
|
||
output =
|
||
formats &&
|
||
(isFunction(formats[format])
|
||
? formats[format].call(this, now)
|
||
: formats[format]);
|
||
|
||
return this.format(
|
||
output || this.localeData().calendar(format, this, createLocal(now))
|
||
);
|
||
}
|
||
|
||
function clone() {
|
||
return new Moment(this);
|
||
}
|
||
|
||
function isAfter(input, units) {
|
||
var localInput = isMoment(input) ? input : createLocal(input);
|
||
if (!(this.isValid() && localInput.isValid())) {
|
||
return false;
|
||
}
|
||
units = normalizeUnits(units) || 'millisecond';
|
||
if (units === 'millisecond') {
|
||
return this.valueOf() > localInput.valueOf();
|
||
} else {
|
||
return localInput.valueOf() < this.clone().startOf(units).valueOf();
|
||
}
|
||
}
|
||
|
||
function isBefore(input, units) {
|
||
var localInput = isMoment(input) ? input : createLocal(input);
|
||
if (!(this.isValid() && localInput.isValid())) {
|
||
return false;
|
||
}
|
||
units = normalizeUnits(units) || 'millisecond';
|
||
if (units === 'millisecond') {
|
||
return this.valueOf() < localInput.valueOf();
|
||
} else {
|
||
return this.clone().endOf(units).valueOf() < localInput.valueOf();
|
||
}
|
||
}
|
||
|
||
function isBetween(from, to, units, inclusivity) {
|
||
var localFrom = isMoment(from) ? from : createLocal(from),
|
||
localTo = isMoment(to) ? to : createLocal(to);
|
||
if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {
|
||
return false;
|
||
}
|
||
inclusivity = inclusivity || '()';
|
||
return (
|
||
(inclusivity[0] === '('
|
||
? this.isAfter(localFrom, units)
|
||
: !this.isBefore(localFrom, units)) &&
|
||
(inclusivity[1] === ')'
|
||
? this.isBefore(localTo, units)
|
||
: !this.isAfter(localTo, units))
|
||
);
|
||
}
|
||
|
||
function isSame(input, units) {
|
||
var localInput = isMoment(input) ? input : createLocal(input),
|
||
inputMs;
|
||
if (!(this.isValid() && localInput.isValid())) {
|
||
return false;
|
||
}
|
||
units = normalizeUnits(units) || 'millisecond';
|
||
if (units === 'millisecond') {
|
||
return this.valueOf() === localInput.valueOf();
|
||
} else {
|
||
inputMs = localInput.valueOf();
|
||
return (
|
||
this.clone().startOf(units).valueOf() <= inputMs &&
|
||
inputMs <= this.clone().endOf(units).valueOf()
|
||
);
|
||
}
|
||
}
|
||
|
||
function isSameOrAfter(input, units) {
|
||
return this.isSame(input, units) || this.isAfter(input, units);
|
||
}
|
||
|
||
function isSameOrBefore(input, units) {
|
||
return this.isSame(input, units) || this.isBefore(input, units);
|
||
}
|
||
|
||
function diff(input, units, asFloat) {
|
||
var that, zoneDelta, output;
|
||
|
||
if (!this.isValid()) {
|
||
return NaN;
|
||
}
|
||
|
||
that = cloneWithOffset(input, this);
|
||
|
||
if (!that.isValid()) {
|
||
return NaN;
|
||
}
|
||
|
||
zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;
|
||
|
||
units = normalizeUnits(units);
|
||
|
||
switch (units) {
|
||
case 'year':
|
||
output = monthDiff(this, that) / 12;
|
||
break;
|
||
case 'month':
|
||
output = monthDiff(this, that);
|
||
break;
|
||
case 'quarter':
|
||
output = monthDiff(this, that) / 3;
|
||
break;
|
||
case 'second':
|
||
output = (this - that) / 1e3;
|
||
break; // 1000
|
||
case 'minute':
|
||
output = (this - that) / 6e4;
|
||
break; // 1000 * 60
|
||
case 'hour':
|
||
output = (this - that) / 36e5;
|
||
break; // 1000 * 60 * 60
|
||
case 'day':
|
||
output = (this - that - zoneDelta) / 864e5;
|
||
break; // 1000 * 60 * 60 * 24, negate dst
|
||
case 'week':
|
||
output = (this - that - zoneDelta) / 6048e5;
|
||
break; // 1000 * 60 * 60 * 24 * 7, negate dst
|
||
default:
|
||
output = this - that;
|
||
}
|
||
|
||
return asFloat ? output : absFloor(output);
|
||
}
|
||
|
||
function monthDiff(a, b) {
|
||
if (a.date() < b.date()) {
|
||
// end-of-month calculations work correct when the start month has more
|
||
// days than the end month.
|
||
return -monthDiff(b, a);
|
||
}
|
||
// difference in months
|
||
var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()),
|
||
// b is in (anchor - 1 month, anchor + 1 month)
|
||
anchor = a.clone().add(wholeMonthDiff, 'months'),
|
||
anchor2,
|
||
adjust;
|
||
|
||
if (b - anchor < 0) {
|
||
anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
|
||
// linear across the month
|
||
adjust = (b - anchor) / (anchor - anchor2);
|
||
} else {
|
||
anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
|
||
// linear across the month
|
||
adjust = (b - anchor) / (anchor2 - anchor);
|
||
}
|
||
|
||
//check for negative zero, return zero if negative zero
|
||
return -(wholeMonthDiff + adjust) || 0;
|
||
}
|
||
|
||
hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
|
||
hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';
|
||
|
||
function toString() {
|
||
return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
|
||
}
|
||
|
||
function toISOString(keepOffset) {
|
||
if (!this.isValid()) {
|
||
return null;
|
||
}
|
||
var utc = keepOffset !== true,
|
||
m = utc ? this.clone().utc() : this;
|
||
if (m.year() < 0 || m.year() > 9999) {
|
||
return formatMoment(
|
||
m,
|
||
utc
|
||
? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'
|
||
: 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'
|
||
);
|
||
}
|
||
if (isFunction(Date.prototype.toISOString)) {
|
||
// native implementation is ~50x faster, use it when we can
|
||
if (utc) {
|
||
return this.toDate().toISOString();
|
||
} else {
|
||
return new Date(this.valueOf() + this.utcOffset() * 60 * 1000)
|
||
.toISOString()
|
||
.replace('Z', formatMoment(m, 'Z'));
|
||
}
|
||
}
|
||
return formatMoment(
|
||
m,
|
||
utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'
|
||
);
|
||
}
|
||
|
||
/**
|
||
* Return a human readable representation of a moment that can
|
||
* also be evaluated to get a new moment which is the same
|
||
*
|
||
* @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
|
||
*/
|
||
function inspect() {
|
||
if (!this.isValid()) {
|
||
return 'moment.invalid(/* ' + this._i + ' */)';
|
||
}
|
||
var func = 'moment',
|
||
zone = '',
|
||
prefix,
|
||
year,
|
||
datetime,
|
||
suffix;
|
||
if (!this.isLocal()) {
|
||
func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
|
||
zone = 'Z';
|
||
}
|
||
prefix = '[' + func + '("]';
|
||
year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';
|
||
datetime = '-MM-DD[T]HH:mm:ss.SSS';
|
||
suffix = zone + '[")]';
|
||
|
||
return this.format(prefix + year + datetime + suffix);
|
||
}
|
||
|
||
function format(inputString) {
|
||
if (!inputString) {
|
||
inputString = this.isUtc()
|
||
? hooks.defaultFormatUtc
|
||
: hooks.defaultFormat;
|
||
}
|
||
var output = formatMoment(this, inputString);
|
||
return this.localeData().postformat(output);
|
||
}
|
||
|
||
function from(time, withoutSuffix) {
|
||
if (
|
||
this.isValid() &&
|
||
((isMoment(time) && time.isValid()) || createLocal(time).isValid())
|
||
) {
|
||
return createDuration({ to: this, from: time })
|
||
.locale(this.locale())
|
||
.humanize(!withoutSuffix);
|
||
} else {
|
||
return this.localeData().invalidDate();
|
||
}
|
||
}
|
||
|
||
function fromNow(withoutSuffix) {
|
||
return this.from(createLocal(), withoutSuffix);
|
||
}
|
||
|
||
function to(time, withoutSuffix) {
|
||
if (
|
||
this.isValid() &&
|
||
((isMoment(time) && time.isValid()) || createLocal(time).isValid())
|
||
) {
|
||
return createDuration({ from: this, to: time })
|
||
.locale(this.locale())
|
||
.humanize(!withoutSuffix);
|
||
} else {
|
||
return this.localeData().invalidDate();
|
||
}
|
||
}
|
||
|
||
function toNow(withoutSuffix) {
|
||
return this.to(createLocal(), withoutSuffix);
|
||
}
|
||
|
||
// If passed a locale key, it will set the locale for this
|
||
// instance. Otherwise, it will return the locale configuration
|
||
// variables for this instance.
|
||
function locale$4(key) {
|
||
var newLocaleData;
|
||
|
||
if (key === undefined) {
|
||
return this._locale._abbr;
|
||
} else {
|
||
newLocaleData = getLocale(key);
|
||
if (newLocaleData != null) {
|
||
this._locale = newLocaleData;
|
||
}
|
||
return this;
|
||
}
|
||
}
|
||
|
||
var lang = deprecate(
|
||
'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
|
||
function (key) {
|
||
if (key === undefined) {
|
||
return this.localeData();
|
||
} else {
|
||
return this.locale(key);
|
||
}
|
||
}
|
||
);
|
||
|
||
function localeData$1() {
|
||
return this._locale;
|
||
}
|
||
|
||
var MS_PER_SECOND = 1000,
|
||
MS_PER_MINUTE = 60 * MS_PER_SECOND,
|
||
MS_PER_HOUR = 60 * MS_PER_MINUTE,
|
||
MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;
|
||
|
||
// actual modulo - handles negative numbers (for dates before 1970):
|
||
function mod(dividend, divisor) {
|
||
return ((dividend % divisor) + divisor) % divisor;
|
||
}
|
||
|
||
function localStartOfDate(y, m, d) {
|
||
// the date constructor remaps years 0-99 to 1900-1999
|
||
if (y < 100 && y >= 0) {
|
||
// preserve leap years using a full 400 year cycle, then reset
|
||
return new Date(y + 400, m, d) - MS_PER_400_YEARS;
|
||
} else {
|
||
return new Date(y, m, d).valueOf();
|
||
}
|
||
}
|
||
|
||
function utcStartOfDate(y, m, d) {
|
||
// Date.UTC remaps years 0-99 to 1900-1999
|
||
if (y < 100 && y >= 0) {
|
||
// preserve leap years using a full 400 year cycle, then reset
|
||
return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;
|
||
} else {
|
||
return Date.UTC(y, m, d);
|
||
}
|
||
}
|
||
|
||
function startOf(units) {
|
||
var time, startOfDate;
|
||
units = normalizeUnits(units);
|
||
if (units === undefined || units === 'millisecond' || !this.isValid()) {
|
||
return this;
|
||
}
|
||
|
||
startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;
|
||
|
||
switch (units) {
|
||
case 'year':
|
||
time = startOfDate(this.year(), 0, 1);
|
||
break;
|
||
case 'quarter':
|
||
time = startOfDate(
|
||
this.year(),
|
||
this.month() - (this.month() % 3),
|
||
1
|
||
);
|
||
break;
|
||
case 'month':
|
||
time = startOfDate(this.year(), this.month(), 1);
|
||
break;
|
||
case 'week':
|
||
time = startOfDate(
|
||
this.year(),
|
||
this.month(),
|
||
this.date() - this.weekday()
|
||
);
|
||
break;
|
||
case 'isoWeek':
|
||
time = startOfDate(
|
||
this.year(),
|
||
this.month(),
|
||
this.date() - (this.isoWeekday() - 1)
|
||
);
|
||
break;
|
||
case 'day':
|
||
case 'date':
|
||
time = startOfDate(this.year(), this.month(), this.date());
|
||
break;
|
||
case 'hour':
|
||
time = this._d.valueOf();
|
||
time -= mod(
|
||
time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
|
||
MS_PER_HOUR
|
||
);
|
||
break;
|
||
case 'minute':
|
||
time = this._d.valueOf();
|
||
time -= mod(time, MS_PER_MINUTE);
|
||
break;
|
||
case 'second':
|
||
time = this._d.valueOf();
|
||
time -= mod(time, MS_PER_SECOND);
|
||
break;
|
||
}
|
||
|
||
this._d.setTime(time);
|
||
hooks.updateOffset(this, true);
|
||
return this;
|
||
}
|
||
|
||
function endOf(units) {
|
||
var time, startOfDate;
|
||
units = normalizeUnits(units);
|
||
if (units === undefined || units === 'millisecond' || !this.isValid()) {
|
||
return this;
|
||
}
|
||
|
||
startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;
|
||
|
||
switch (units) {
|
||
case 'year':
|
||
time = startOfDate(this.year() + 1, 0, 1) - 1;
|
||
break;
|
||
case 'quarter':
|
||
time =
|
||
startOfDate(
|
||
this.year(),
|
||
this.month() - (this.month() % 3) + 3,
|
||
1
|
||
) - 1;
|
||
break;
|
||
case 'month':
|
||
time = startOfDate(this.year(), this.month() + 1, 1) - 1;
|
||
break;
|
||
case 'week':
|
||
time =
|
||
startOfDate(
|
||
this.year(),
|
||
this.month(),
|
||
this.date() - this.weekday() + 7
|
||
) - 1;
|
||
break;
|
||
case 'isoWeek':
|
||
time =
|
||
startOfDate(
|
||
this.year(),
|
||
this.month(),
|
||
this.date() - (this.isoWeekday() - 1) + 7
|
||
) - 1;
|
||
break;
|
||
case 'day':
|
||
case 'date':
|
||
time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;
|
||
break;
|
||
case 'hour':
|
||
time = this._d.valueOf();
|
||
time +=
|
||
MS_PER_HOUR -
|
||
mod(
|
||
time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
|
||
MS_PER_HOUR
|
||
) -
|
||
1;
|
||
break;
|
||
case 'minute':
|
||
time = this._d.valueOf();
|
||
time += MS_PER_MINUTE - mod(time, MS_PER_MINUTE) - 1;
|
||
break;
|
||
case 'second':
|
||
time = this._d.valueOf();
|
||
time += MS_PER_SECOND - mod(time, MS_PER_SECOND) - 1;
|
||
break;
|
||
}
|
||
|
||
this._d.setTime(time);
|
||
hooks.updateOffset(this, true);
|
||
return this;
|
||
}
|
||
|
||
function valueOf() {
|
||
return this._d.valueOf() - (this._offset || 0) * 60000;
|
||
}
|
||
|
||
function unix() {
|
||
return Math.floor(this.valueOf() / 1000);
|
||
}
|
||
|
||
function toDate() {
|
||
return new Date(this.valueOf());
|
||
}
|
||
|
||
function toArray$2() {
|
||
var m = this;
|
||
return [
|
||
m.year(),
|
||
m.month(),
|
||
m.date(),
|
||
m.hour(),
|
||
m.minute(),
|
||
m.second(),
|
||
m.millisecond(),
|
||
];
|
||
}
|
||
|
||
function toObject() {
|
||
var m = this;
|
||
return {
|
||
years: m.year(),
|
||
months: m.month(),
|
||
date: m.date(),
|
||
hours: m.hours(),
|
||
minutes: m.minutes(),
|
||
seconds: m.seconds(),
|
||
milliseconds: m.milliseconds(),
|
||
};
|
||
}
|
||
|
||
function toJSON() {
|
||
// new Date(NaN).toJSON() === null
|
||
return this.isValid() ? this.toISOString() : null;
|
||
}
|
||
|
||
function isValid() {
|
||
return isValid$1(this);
|
||
}
|
||
|
||
function parsingFlags() {
|
||
return extend({}, getParsingFlags(this));
|
||
}
|
||
|
||
function invalidAt() {
|
||
return getParsingFlags(this).overflow;
|
||
}
|
||
|
||
function creationData() {
|
||
return {
|
||
input: this._i,
|
||
format: this._f,
|
||
locale: this._locale,
|
||
isUTC: this._isUTC,
|
||
strict: this._strict,
|
||
};
|
||
}
|
||
|
||
addFormatToken('N', 0, 0, 'eraAbbr');
|
||
addFormatToken('NN', 0, 0, 'eraAbbr');
|
||
addFormatToken('NNN', 0, 0, 'eraAbbr');
|
||
addFormatToken('NNNN', 0, 0, 'eraName');
|
||
addFormatToken('NNNNN', 0, 0, 'eraNarrow');
|
||
|
||
addFormatToken('y', ['y', 1], 'yo', 'eraYear');
|
||
addFormatToken('y', ['yy', 2], 0, 'eraYear');
|
||
addFormatToken('y', ['yyy', 3], 0, 'eraYear');
|
||
addFormatToken('y', ['yyyy', 4], 0, 'eraYear');
|
||
|
||
addRegexToken('N', matchEraAbbr);
|
||
addRegexToken('NN', matchEraAbbr);
|
||
addRegexToken('NNN', matchEraAbbr);
|
||
addRegexToken('NNNN', matchEraName);
|
||
addRegexToken('NNNNN', matchEraNarrow);
|
||
|
||
addParseToken(
|
||
['N', 'NN', 'NNN', 'NNNN', 'NNNNN'],
|
||
function (input, array, config, token) {
|
||
var era = config._locale.erasParse(input, token, config._strict);
|
||
if (era) {
|
||
getParsingFlags(config).era = era;
|
||
} else {
|
||
getParsingFlags(config).invalidEra = input;
|
||
}
|
||
}
|
||
);
|
||
|
||
addRegexToken('y', matchUnsigned);
|
||
addRegexToken('yy', matchUnsigned);
|
||
addRegexToken('yyy', matchUnsigned);
|
||
addRegexToken('yyyy', matchUnsigned);
|
||
addRegexToken('yo', matchEraYearOrdinal);
|
||
|
||
addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);
|
||
addParseToken(['yo'], function (input, array, config, token) {
|
||
var match;
|
||
if (config._locale._eraYearOrdinalRegex) {
|
||
match = input.match(config._locale._eraYearOrdinalRegex);
|
||
}
|
||
|
||
if (config._locale.eraYearOrdinalParse) {
|
||
array[YEAR] = config._locale.eraYearOrdinalParse(input, match);
|
||
} else {
|
||
array[YEAR] = parseInt(input, 10);
|
||
}
|
||
});
|
||
|
||
function getEraName() {
|
||
var i,
|
||
l,
|
||
val,
|
||
eras = this.localeData().eras();
|
||
for (i = 0, l = eras.length; i < l; ++i) {
|
||
// truncate time
|
||
val = this.clone().startOf('day').valueOf();
|
||
|
||
if (eras[i].since <= val && val <= eras[i].until) {
|
||
return eras[i].name;
|
||
}
|
||
if (eras[i].until <= val && val <= eras[i].since) {
|
||
return eras[i].name;
|
||
}
|
||
}
|
||
|
||
return '';
|
||
}
|
||
|
||
function getEraNarrow() {
|
||
var i,
|
||
l,
|
||
val,
|
||
eras = this.localeData().eras();
|
||
for (i = 0, l = eras.length; i < l; ++i) {
|
||
// truncate time
|
||
val = this.clone().startOf('day').valueOf();
|
||
|
||
if (eras[i].since <= val && val <= eras[i].until) {
|
||
return eras[i].narrow;
|
||
}
|
||
if (eras[i].until <= val && val <= eras[i].since) {
|
||
return eras[i].narrow;
|
||
}
|
||
}
|
||
|
||
return '';
|
||
}
|
||
|
||
function getEraAbbr() {
|
||
var i,
|
||
l,
|
||
val,
|
||
eras = this.localeData().eras();
|
||
for (i = 0, l = eras.length; i < l; ++i) {
|
||
// truncate time
|
||
val = this.clone().startOf('day').valueOf();
|
||
|
||
if (eras[i].since <= val && val <= eras[i].until) {
|
||
return eras[i].abbr;
|
||
}
|
||
if (eras[i].until <= val && val <= eras[i].since) {
|
||
return eras[i].abbr;
|
||
}
|
||
}
|
||
|
||
return '';
|
||
}
|
||
|
||
function getEraYear() {
|
||
var i,
|
||
l,
|
||
dir,
|
||
val,
|
||
eras = this.localeData().eras();
|
||
for (i = 0, l = eras.length; i < l; ++i) {
|
||
dir = eras[i].since <= eras[i].until ? 1 : -1;
|
||
|
||
// truncate time
|
||
val = this.clone().startOf('day').valueOf();
|
||
|
||
if (
|
||
(eras[i].since <= val && val <= eras[i].until) ||
|
||
(eras[i].until <= val && val <= eras[i].since)
|
||
) {
|
||
return (
|
||
(this.year() - hooks(eras[i].since).year()) * dir +
|
||
eras[i].offset
|
||
);
|
||
}
|
||
}
|
||
|
||
return this.year();
|
||
}
|
||
|
||
function matchEraAbbr(isStrict, locale) {
|
||
return locale.erasAbbrRegex(isStrict);
|
||
}
|
||
|
||
function matchEraName(isStrict, locale) {
|
||
return locale.erasNameRegex(isStrict);
|
||
}
|
||
|
||
function matchEraNarrow(isStrict, locale) {
|
||
return locale.erasNarrowRegex(isStrict);
|
||
}
|
||
|
||
function matchEraYearOrdinal(isStrict, locale) {
|
||
return locale._eraYearOrdinalRegex || matchUnsigned;
|
||
}
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken(0, ['gg', 2], 0, function () {
|
||
return this.weekYear() % 100;
|
||
});
|
||
|
||
addFormatToken(0, ['GG', 2], 0, function () {
|
||
return this.isoWeekYear() % 100;
|
||
});
|
||
|
||
function addWeekYearFormatToken(token, getter) {
|
||
addFormatToken(0, [token, token.length], 0, getter);
|
||
}
|
||
|
||
addWeekYearFormatToken('gggg', 'weekYear');
|
||
addWeekYearFormatToken('ggggg', 'weekYear');
|
||
addWeekYearFormatToken('GGGG', 'isoWeekYear');
|
||
addWeekYearFormatToken('GGGGG', 'isoWeekYear');
|
||
|
||
// ALIASES
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('G', matchSigned$1);
|
||
addRegexToken('g', matchSigned$1);
|
||
addRegexToken('GG', match1to2$1, match2$1);
|
||
addRegexToken('gg', match1to2$1, match2$1);
|
||
addRegexToken('GGGG', match1to4, match4$1);
|
||
addRegexToken('gggg', match1to4, match4$1);
|
||
addRegexToken('GGGGG', match1to6, match6);
|
||
addRegexToken('ggggg', match1to6, match6);
|
||
|
||
addWeekParseToken(
|
||
['gggg', 'ggggg', 'GGGG', 'GGGGG'],
|
||
function (input, week, config, token) {
|
||
week[token.substr(0, 2)] = toInt(input);
|
||
}
|
||
);
|
||
|
||
addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
|
||
week[token] = hooks.parseTwoDigitYear(input);
|
||
});
|
||
|
||
// MOMENTS
|
||
|
||
function getSetWeekYear(input) {
|
||
return getSetWeekYearHelper.call(
|
||
this,
|
||
input,
|
||
this.week(),
|
||
this.weekday() + this.localeData()._week.dow,
|
||
this.localeData()._week.dow,
|
||
this.localeData()._week.doy
|
||
);
|
||
}
|
||
|
||
function getSetISOWeekYear(input) {
|
||
return getSetWeekYearHelper.call(
|
||
this,
|
||
input,
|
||
this.isoWeek(),
|
||
this.isoWeekday(),
|
||
1,
|
||
4
|
||
);
|
||
}
|
||
|
||
function getISOWeeksInYear() {
|
||
return weeksInYear(this.year(), 1, 4);
|
||
}
|
||
|
||
function getISOWeeksInISOWeekYear() {
|
||
return weeksInYear(this.isoWeekYear(), 1, 4);
|
||
}
|
||
|
||
function getWeeksInYear() {
|
||
var weekInfo = this.localeData()._week;
|
||
return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
|
||
}
|
||
|
||
function getWeeksInWeekYear() {
|
||
var weekInfo = this.localeData()._week;
|
||
return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);
|
||
}
|
||
|
||
function getSetWeekYearHelper(input, week, weekday, dow, doy) {
|
||
var weeksTarget;
|
||
if (input == null) {
|
||
return weekOfYear$1(this, dow, doy).year;
|
||
} else {
|
||
weeksTarget = weeksInYear(input, dow, doy);
|
||
if (week > weeksTarget) {
|
||
week = weeksTarget;
|
||
}
|
||
return setWeekAll.call(this, input, week, weekday, dow, doy);
|
||
}
|
||
}
|
||
|
||
function setWeekAll(weekYear, week, weekday, dow, doy) {
|
||
var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
|
||
date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);
|
||
|
||
this.year(date.getUTCFullYear());
|
||
this.month(date.getUTCMonth());
|
||
this.date(date.getUTCDate());
|
||
return this;
|
||
}
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('Q', 0, 'Qo', 'quarter');
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('Q', match1$1);
|
||
addParseToken('Q', function (input, array) {
|
||
array[MONTH] = (toInt(input) - 1) * 3;
|
||
});
|
||
|
||
// MOMENTS
|
||
|
||
function getSetQuarter(input) {
|
||
return input == null
|
||
? Math.ceil((this.month() + 1) / 3)
|
||
: this.month((input - 1) * 3 + (this.month() % 3));
|
||
}
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('D', ['DD', 2], 'Do', 'date');
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('D', match1to2$1, match1to2NoLeadingZero);
|
||
addRegexToken('DD', match1to2$1, match2$1);
|
||
addRegexToken('Do', function (isStrict, locale) {
|
||
// TODO: Remove "ordinalParse" fallback in next major release.
|
||
return isStrict
|
||
? locale._dayOfMonthOrdinalParse || locale._ordinalParse
|
||
: locale._dayOfMonthOrdinalParseLenient;
|
||
});
|
||
|
||
addParseToken(['D', 'DD'], DATE);
|
||
addParseToken('Do', function (input, array) {
|
||
array[DATE] = toInt(input.match(match1to2$1)[0]);
|
||
});
|
||
|
||
// MOMENTS
|
||
|
||
var getSetDayOfMonth = makeGetSet('Date', true);
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('DDD', match1to3);
|
||
addRegexToken('DDDD', match3$1);
|
||
addParseToken(['DDD', 'DDDD'], function (input, array, config) {
|
||
config._dayOfYear = toInt(input);
|
||
});
|
||
|
||
// HELPERS
|
||
|
||
// MOMENTS
|
||
|
||
function getSetDayOfYear(input) {
|
||
var dayOfYear =
|
||
Math.round(
|
||
(this.clone().startOf('day') - this.clone().startOf('year')) / 864e5
|
||
) + 1;
|
||
return input == null ? dayOfYear : this.add(input - dayOfYear, 'd');
|
||
}
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('m', ['mm', 2], 0, 'minute');
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('m', match1to2$1, match1to2HasZero);
|
||
addRegexToken('mm', match1to2$1, match2$1);
|
||
addParseToken(['m', 'mm'], MINUTE);
|
||
|
||
// MOMENTS
|
||
|
||
var getSetMinute = makeGetSet('Minutes', false);
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('s', ['ss', 2], 0, 'second');
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('s', match1to2$1, match1to2HasZero);
|
||
addRegexToken('ss', match1to2$1, match2$1);
|
||
addParseToken(['s', 'ss'], SECOND);
|
||
|
||
// MOMENTS
|
||
|
||
var getSetSecond = makeGetSet('Seconds', false);
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('S', 0, 0, function () {
|
||
return ~~(this.millisecond() / 100);
|
||
});
|
||
|
||
addFormatToken(0, ['SS', 2], 0, function () {
|
||
return ~~(this.millisecond() / 10);
|
||
});
|
||
|
||
addFormatToken(0, ['SSS', 3], 0, 'millisecond');
|
||
addFormatToken(0, ['SSSS', 4], 0, function () {
|
||
return this.millisecond() * 10;
|
||
});
|
||
addFormatToken(0, ['SSSSS', 5], 0, function () {
|
||
return this.millisecond() * 100;
|
||
});
|
||
addFormatToken(0, ['SSSSSS', 6], 0, function () {
|
||
return this.millisecond() * 1000;
|
||
});
|
||
addFormatToken(0, ['SSSSSSS', 7], 0, function () {
|
||
return this.millisecond() * 10000;
|
||
});
|
||
addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
|
||
return this.millisecond() * 100000;
|
||
});
|
||
addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
|
||
return this.millisecond() * 1000000;
|
||
});
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('S', match1to3, match1$1);
|
||
addRegexToken('SS', match1to3, match2$1);
|
||
addRegexToken('SSS', match1to3, match3$1);
|
||
|
||
var token, getSetMillisecond;
|
||
for (token = 'SSSS'; token.length <= 9; token += 'S') {
|
||
addRegexToken(token, matchUnsigned);
|
||
}
|
||
|
||
function parseMs(input, array) {
|
||
array[MILLISECOND] = toInt(('0.' + input) * 1000);
|
||
}
|
||
|
||
for (token = 'S'; token.length <= 9; token += 'S') {
|
||
addParseToken(token, parseMs);
|
||
}
|
||
|
||
getSetMillisecond = makeGetSet('Milliseconds', false);
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('z', 0, 0, 'zoneAbbr');
|
||
addFormatToken('zz', 0, 0, 'zoneName');
|
||
|
||
// MOMENTS
|
||
|
||
function getZoneAbbr() {
|
||
return this._isUTC ? 'UTC' : '';
|
||
}
|
||
|
||
function getZoneName() {
|
||
return this._isUTC ? 'Coordinated Universal Time' : '';
|
||
}
|
||
|
||
var proto = Moment.prototype;
|
||
|
||
proto.add = add;
|
||
proto.calendar = calendar;
|
||
proto.clone = clone;
|
||
proto.diff = diff;
|
||
proto.endOf = endOf;
|
||
proto.format = format;
|
||
proto.from = from;
|
||
proto.fromNow = fromNow;
|
||
proto.to = to;
|
||
proto.toNow = toNow;
|
||
proto.get = stringGet;
|
||
proto.invalidAt = invalidAt;
|
||
proto.isAfter = isAfter;
|
||
proto.isBefore = isBefore;
|
||
proto.isBetween = isBetween;
|
||
proto.isSame = isSame;
|
||
proto.isSameOrAfter = isSameOrAfter;
|
||
proto.isSameOrBefore = isSameOrBefore;
|
||
proto.isValid = isValid;
|
||
proto.lang = lang;
|
||
proto.locale = locale$4;
|
||
proto.localeData = localeData$1;
|
||
proto.max = prototypeMax;
|
||
proto.min = prototypeMin;
|
||
proto.parsingFlags = parsingFlags;
|
||
proto.set = stringSet;
|
||
proto.startOf = startOf;
|
||
proto.subtract = subtract;
|
||
proto.toArray = toArray$2;
|
||
proto.toObject = toObject;
|
||
proto.toDate = toDate;
|
||
proto.toISOString = toISOString;
|
||
proto.inspect = inspect;
|
||
if (typeof Symbol !== 'undefined' && Symbol.for != null) {
|
||
proto[Symbol.for('nodejs.util.inspect.custom')] = function () {
|
||
return 'Moment<' + this.format() + '>';
|
||
};
|
||
}
|
||
proto.toJSON = toJSON;
|
||
proto.toString = toString;
|
||
proto.unix = unix;
|
||
proto.valueOf = valueOf;
|
||
proto.creationData = creationData;
|
||
proto.eraName = getEraName;
|
||
proto.eraNarrow = getEraNarrow;
|
||
proto.eraAbbr = getEraAbbr;
|
||
proto.eraYear = getEraYear;
|
||
proto.year = getSetYear;
|
||
proto.isLeapYear = getIsLeapYear;
|
||
proto.weekYear = getSetWeekYear;
|
||
proto.isoWeekYear = getSetISOWeekYear;
|
||
proto.quarter = proto.quarters = getSetQuarter;
|
||
proto.month = getSetMonth;
|
||
proto.daysInMonth = getDaysInMonth;
|
||
proto.week = proto.weeks = getSetWeek;
|
||
proto.isoWeek = proto.isoWeeks = getSetISOWeek;
|
||
proto.weeksInYear = getWeeksInYear;
|
||
proto.weeksInWeekYear = getWeeksInWeekYear;
|
||
proto.isoWeeksInYear = getISOWeeksInYear;
|
||
proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;
|
||
proto.date = getSetDayOfMonth;
|
||
proto.day = proto.days = getSetDayOfWeek;
|
||
proto.weekday = getSetLocaleDayOfWeek;
|
||
proto.isoWeekday = getSetISODayOfWeek;
|
||
proto.dayOfYear = getSetDayOfYear;
|
||
proto.hour = proto.hours = getSetHour;
|
||
proto.minute = proto.minutes = getSetMinute;
|
||
proto.second = proto.seconds = getSetSecond;
|
||
proto.millisecond = proto.milliseconds = getSetMillisecond;
|
||
proto.utcOffset = getSetOffset;
|
||
proto.utc = setOffsetToUTC;
|
||
proto.local = setOffsetToLocal;
|
||
proto.parseZone = setOffsetToParsedOffset;
|
||
proto.hasAlignedHourOffset = hasAlignedHourOffset;
|
||
proto.isDST = isDaylightSavingTime;
|
||
proto.isLocal = isLocal;
|
||
proto.isUtcOffset = isUtcOffset;
|
||
proto.isUtc = isUtc;
|
||
proto.isUTC = isUtc;
|
||
proto.zoneAbbr = getZoneAbbr;
|
||
proto.zoneName = getZoneName;
|
||
proto.dates = deprecate(
|
||
'dates accessor is deprecated. Use date instead.',
|
||
getSetDayOfMonth
|
||
);
|
||
proto.months = deprecate(
|
||
'months accessor is deprecated. Use month instead',
|
||
getSetMonth
|
||
);
|
||
proto.years = deprecate(
|
||
'years accessor is deprecated. Use year instead',
|
||
getSetYear
|
||
);
|
||
proto.zone = deprecate(
|
||
'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/',
|
||
getSetZone
|
||
);
|
||
proto.isDSTShifted = deprecate(
|
||
'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information',
|
||
isDaylightSavingTimeShifted
|
||
);
|
||
|
||
function createUnix(input) {
|
||
return createLocal(input * 1000);
|
||
}
|
||
|
||
function createInZone() {
|
||
return createLocal.apply(null, arguments).parseZone();
|
||
}
|
||
|
||
function get(format, index, field, setter) {
|
||
var locale = getLocale(),
|
||
utc = createUTC().set(setter, index);
|
||
return locale[field](utc, format);
|
||
}
|
||
|
||
function listMonthsImpl(format, index, field) {
|
||
if (isNumber(format)) {
|
||
index = format;
|
||
format = undefined;
|
||
}
|
||
|
||
format = format || '';
|
||
|
||
if (index != null) {
|
||
return get(format, index, field, 'month');
|
||
}
|
||
|
||
var i,
|
||
out = [];
|
||
for (i = 0; i < 12; i++) {
|
||
out[i] = get(format, i, field, 'month');
|
||
}
|
||
return out;
|
||
}
|
||
|
||
// ()
|
||
// (5)
|
||
// (fmt, 5)
|
||
// (fmt)
|
||
// (true)
|
||
// (true, 5)
|
||
// (true, fmt, 5)
|
||
// (true, fmt)
|
||
function listWeekdaysImpl(localeSorted, format, index, field) {
|
||
if (typeof localeSorted === 'boolean') {
|
||
if (isNumber(format)) {
|
||
index = format;
|
||
format = undefined;
|
||
}
|
||
|
||
format = format || '';
|
||
} else {
|
||
format = localeSorted;
|
||
index = format;
|
||
localeSorted = false;
|
||
|
||
if (isNumber(format)) {
|
||
index = format;
|
||
format = undefined;
|
||
}
|
||
|
||
format = format || '';
|
||
}
|
||
|
||
var locale = getLocale(),
|
||
shift = localeSorted ? locale._week.dow : 0,
|
||
i,
|
||
out = [];
|
||
|
||
if (index != null) {
|
||
return get(format, (index + shift) % 7, field, 'day');
|
||
}
|
||
|
||
for (i = 0; i < 7; i++) {
|
||
out[i] = get(format, (i + shift) % 7, field, 'day');
|
||
}
|
||
return out;
|
||
}
|
||
|
||
function listMonths(format, index) {
|
||
return listMonthsImpl(format, index, 'months');
|
||
}
|
||
|
||
function listMonthsShort(format, index) {
|
||
return listMonthsImpl(format, index, 'monthsShort');
|
||
}
|
||
|
||
function listWeekdays(localeSorted, format, index) {
|
||
return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
|
||
}
|
||
|
||
function listWeekdaysShort(localeSorted, format, index) {
|
||
return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
|
||
}
|
||
|
||
function listWeekdaysMin(localeSorted, format, index) {
|
||
return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
|
||
}
|
||
|
||
// Side effect imports
|
||
|
||
hooks.lang = deprecate(
|
||
'moment.lang is deprecated. Use moment.locale instead.',
|
||
getSetGlobalLocale
|
||
);
|
||
hooks.langData = deprecate(
|
||
'moment.langData is deprecated. Use moment.localeData instead.',
|
||
getLocale
|
||
);
|
||
|
||
var round = Math.round,
|
||
thresholds = {
|
||
ss: 44, // a few seconds to seconds
|
||
s: 45, // seconds to minute
|
||
m: 45, // minutes to hour
|
||
h: 22, // hours to day
|
||
d: 26, // days to month/week
|
||
w: null, // weeks to month
|
||
M: 11, // months to year
|
||
};
|
||
|
||
// This function allows you to set the rounding function for relative time strings
|
||
function getSetRelativeTimeRounding(roundingFunction) {
|
||
if (roundingFunction === undefined) {
|
||
return round;
|
||
}
|
||
if (typeof roundingFunction === 'function') {
|
||
round = roundingFunction;
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
// This function allows you to set a threshold for relative time strings
|
||
function getSetRelativeTimeThreshold(threshold, limit) {
|
||
if (thresholds[threshold] === undefined) {
|
||
return false;
|
||
}
|
||
if (limit === undefined) {
|
||
return thresholds[threshold];
|
||
}
|
||
thresholds[threshold] = limit;
|
||
if (threshold === 's') {
|
||
thresholds.ss = limit - 1;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
//! moment.js
|
||
//! version : 2.30.1
|
||
//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
|
||
//! license : MIT
|
||
//! momentjs.com
|
||
|
||
|
||
hooks.version = '2.30.1';
|
||
|
||
setHookCallback(createLocal);
|
||
|
||
hooks.fn = proto;
|
||
hooks.min = min;
|
||
hooks.max = max;
|
||
hooks.now = now;
|
||
hooks.utc = createUTC;
|
||
hooks.unix = createUnix;
|
||
hooks.months = listMonths;
|
||
hooks.isDate = isDate;
|
||
hooks.locale = getSetGlobalLocale;
|
||
hooks.invalid = createInvalid$1;
|
||
hooks.duration = createDuration;
|
||
hooks.isMoment = isMoment;
|
||
hooks.weekdays = listWeekdays;
|
||
hooks.parseZone = createInZone;
|
||
hooks.localeData = getLocale;
|
||
hooks.isDuration = isDuration;
|
||
hooks.monthsShort = listMonthsShort;
|
||
hooks.weekdaysMin = listWeekdaysMin;
|
||
hooks.defineLocale = defineLocale;
|
||
hooks.updateLocale = updateLocale;
|
||
hooks.locales = listLocales;
|
||
hooks.weekdaysShort = listWeekdaysShort;
|
||
hooks.normalizeUnits = normalizeUnits;
|
||
hooks.relativeTimeRounding = getSetRelativeTimeRounding;
|
||
hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
|
||
hooks.calendarFormat = getCalendarFormat;
|
||
hooks.prototype = proto;
|
||
|
||
// currently HTML5 input type only supports 24-hour formats
|
||
hooks.HTML5_FMT = {
|
||
DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type="datetime-local" />
|
||
DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type="datetime-local" step="1" />
|
||
DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type="datetime-local" step="0.001" />
|
||
DATE: 'YYYY-MM-DD', // <input type="date" />
|
||
TIME: 'HH:mm', // <input type="time" />
|
||
TIME_SECONDS: 'HH:mm:ss', // <input type="time" step="1" />
|
||
TIME_MS: 'HH:mm:ss.SSS', // <input type="time" step="0.001" />
|
||
WEEK: 'GGGG-[W]WW', // <input type="week" />
|
||
MONTH: 'YYYY-MM', // <input type="month" />
|
||
};
|
||
|
||
//! moment.js locale configuration
|
||
//! locale : Persian [fa]
|
||
//! author : Ebrahim Byagowi : https://github.com/ebraminio
|
||
|
||
|
||
var symbolMap = {
|
||
1: '۱',
|
||
2: '۲',
|
||
3: '۳',
|
||
4: '۴',
|
||
5: '۵',
|
||
6: '۶',
|
||
7: '۷',
|
||
8: '۸',
|
||
9: '۹',
|
||
0: '۰',
|
||
},
|
||
numberMap = {
|
||
'۱': '1',
|
||
'۲': '2',
|
||
'۳': '3',
|
||
'۴': '4',
|
||
'۵': '5',
|
||
'۶': '6',
|
||
'۷': '7',
|
||
'۸': '8',
|
||
'۹': '9',
|
||
'۰': '0',
|
||
};
|
||
|
||
const fa = hooks.defineLocale('fa', {
|
||
months: 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split(
|
||
'_'
|
||
),
|
||
monthsShort:
|
||
'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split(
|
||
'_'
|
||
),
|
||
weekdays:
|
||
'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split(
|
||
'_'
|
||
),
|
||
weekdaysShort:
|
||
'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split(
|
||
'_'
|
||
),
|
||
weekdaysMin: 'ی_د_س_چ_پ_ج_ش'.split('_'),
|
||
weekdaysParseExact: true,
|
||
longDateFormat: {
|
||
LT: 'HH:mm',
|
||
LTS: 'HH:mm:ss',
|
||
L: 'DD/MM/YYYY',
|
||
LL: 'D MMMM YYYY',
|
||
LLL: 'D MMMM YYYY HH:mm',
|
||
LLLL: 'dddd, D MMMM YYYY HH:mm',
|
||
},
|
||
meridiemParse: /قبل از ظهر|بعد از ظهر/,
|
||
isPM: function (input) {
|
||
return /بعد از ظهر/.test(input);
|
||
},
|
||
meridiem: function (hour, minute, isLower) {
|
||
if (hour < 12) {
|
||
return 'قبل از ظهر';
|
||
} else {
|
||
return 'بعد از ظهر';
|
||
}
|
||
},
|
||
calendar: {
|
||
sameDay: '[امروز ساعت] LT',
|
||
nextDay: '[فردا ساعت] LT',
|
||
nextWeek: 'dddd [ساعت] LT',
|
||
lastDay: '[دیروز ساعت] LT',
|
||
lastWeek: 'dddd [پیش] [ساعت] LT',
|
||
sameElse: 'L',
|
||
},
|
||
relativeTime: {
|
||
future: 'در %s',
|
||
past: '%s پیش',
|
||
s: 'چند ثانیه',
|
||
ss: '%d ثانیه',
|
||
m: 'یک دقیقه',
|
||
mm: '%d دقیقه',
|
||
h: 'یک ساعت',
|
||
hh: '%d ساعت',
|
||
d: 'یک روز',
|
||
dd: '%d روز',
|
||
M: 'یک ماه',
|
||
MM: '%d ماه',
|
||
y: 'یک سال',
|
||
yy: '%d سال',
|
||
},
|
||
preparse: function (string) {
|
||
return string
|
||
.replace(/[۰-۹]/g, function (match) {
|
||
return numberMap[match];
|
||
})
|
||
.replace(/،/g, ',');
|
||
},
|
||
postformat: function (string) {
|
||
return string
|
||
.replace(/\d/g, function (match) {
|
||
return symbolMap[match];
|
||
})
|
||
.replace(/,/g, '،');
|
||
},
|
||
dayOfMonthOrdinalParse: /\d{1,2}م/,
|
||
ordinal: '%dم',
|
||
week: {
|
||
dow: 6, // Saturday is the first day of the week.
|
||
doy: 12, // The week that contains Jan 12th is the first week of the year.
|
||
},
|
||
});
|
||
|
||
const weekday = (function (o, c) {
|
||
var proto = c.prototype;
|
||
|
||
proto.weekday = function (input) {
|
||
var weekStart = this.$locale().weekStart || 0;
|
||
var $W = this.$W;
|
||
var weekday = ($W < weekStart ? $W + 7 : $W) - weekStart;
|
||
|
||
if (this.$utils().u(input)) {
|
||
return weekday;
|
||
}
|
||
|
||
return this.subtract(weekday, 'day').add(input, 'day');
|
||
};
|
||
});
|
||
|
||
// eslint-disable-next-line import/prefer-default-export
|
||
var t = function t(format) {
|
||
return format.replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g, function (_, a, b) {
|
||
return a || b.slice(1);
|
||
});
|
||
};
|
||
var englishFormats = {
|
||
LTS: 'h:mm:ss A',
|
||
LT: 'h:mm A',
|
||
L: 'MM/DD/YYYY',
|
||
LL: 'MMMM D, YYYY',
|
||
LLL: 'MMMM D, YYYY h:mm A',
|
||
LLLL: 'dddd, MMMM D, YYYY h:mm A'
|
||
};
|
||
var u = function u(formatStr, formats) {
|
||
return formatStr.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g, function (_, a, b) {
|
||
var B = b && b.toUpperCase();
|
||
return a || formats[b] || englishFormats[b] || t(formats[B]);
|
||
});
|
||
};
|
||
|
||
const localeData = (function (o, c, dayjs) {
|
||
// locale needed later
|
||
var proto = c.prototype;
|
||
|
||
var getLocalePart = function getLocalePart(part) {
|
||
return part && (part.indexOf ? part : part.s);
|
||
};
|
||
|
||
var getShort = function getShort(ins, target, full, num, localeOrder) {
|
||
var locale = ins.name ? ins : ins.$locale();
|
||
var targetLocale = getLocalePart(locale[target]);
|
||
var fullLocale = getLocalePart(locale[full]);
|
||
var result = targetLocale || fullLocale.map(function (f) {
|
||
return f.slice(0, num);
|
||
});
|
||
if (!localeOrder) return result;
|
||
var weekStart = locale.weekStart;
|
||
return result.map(function (_, index) {
|
||
return result[(index + (weekStart || 0)) % 7];
|
||
});
|
||
};
|
||
|
||
var getDayjsLocaleObject = function getDayjsLocaleObject() {
|
||
return dayjs.Ls[dayjs.locale()];
|
||
};
|
||
|
||
var getLongDateFormat = function getLongDateFormat(l, format) {
|
||
return l.formats[format] || t(l.formats[format.toUpperCase()]);
|
||
};
|
||
|
||
var localeData = function localeData() {
|
||
var _this = this;
|
||
|
||
return {
|
||
months: function months(instance) {
|
||
return instance ? instance.format('MMMM') : getShort(_this, 'months');
|
||
},
|
||
monthsShort: function monthsShort(instance) {
|
||
return instance ? instance.format('MMM') : getShort(_this, 'monthsShort', 'months', 3);
|
||
},
|
||
firstDayOfWeek: function firstDayOfWeek() {
|
||
return _this.$locale().weekStart || 0;
|
||
},
|
||
weekdays: function weekdays(instance) {
|
||
return instance ? instance.format('dddd') : getShort(_this, 'weekdays');
|
||
},
|
||
weekdaysMin: function weekdaysMin(instance) {
|
||
return instance ? instance.format('dd') : getShort(_this, 'weekdaysMin', 'weekdays', 2);
|
||
},
|
||
weekdaysShort: function weekdaysShort(instance) {
|
||
return instance ? instance.format('ddd') : getShort(_this, 'weekdaysShort', 'weekdays', 3);
|
||
},
|
||
longDateFormat: function longDateFormat(format) {
|
||
return getLongDateFormat(_this.$locale(), format);
|
||
},
|
||
meridiem: this.$locale().meridiem,
|
||
ordinal: this.$locale().ordinal
|
||
};
|
||
};
|
||
|
||
proto.localeData = function () {
|
||
return localeData.bind(this)();
|
||
};
|
||
|
||
dayjs.localeData = function () {
|
||
var localeObject = getDayjsLocaleObject();
|
||
return {
|
||
firstDayOfWeek: function firstDayOfWeek() {
|
||
return localeObject.weekStart || 0;
|
||
},
|
||
weekdays: function weekdays() {
|
||
return dayjs.weekdays();
|
||
},
|
||
weekdaysShort: function weekdaysShort() {
|
||
return dayjs.weekdaysShort();
|
||
},
|
||
weekdaysMin: function weekdaysMin() {
|
||
return dayjs.weekdaysMin();
|
||
},
|
||
months: function months() {
|
||
return dayjs.months();
|
||
},
|
||
monthsShort: function monthsShort() {
|
||
return dayjs.monthsShort();
|
||
},
|
||
longDateFormat: function longDateFormat(format) {
|
||
return getLongDateFormat(localeObject, format);
|
||
},
|
||
meridiem: localeObject.meridiem,
|
||
ordinal: localeObject.ordinal
|
||
};
|
||
};
|
||
|
||
dayjs.months = function () {
|
||
return getShort(getDayjsLocaleObject(), 'months');
|
||
};
|
||
|
||
dayjs.monthsShort = function () {
|
||
return getShort(getDayjsLocaleObject(), 'monthsShort', 'months', 3);
|
||
};
|
||
|
||
dayjs.weekdays = function (localeOrder) {
|
||
return getShort(getDayjsLocaleObject(), 'weekdays', null, null, localeOrder);
|
||
};
|
||
|
||
dayjs.weekdaysShort = function (localeOrder) {
|
||
return getShort(getDayjsLocaleObject(), 'weekdaysShort', 'weekdays', 3, localeOrder);
|
||
};
|
||
|
||
dayjs.weekdaysMin = function (localeOrder) {
|
||
return getShort(getDayjsLocaleObject(), 'weekdaysMin', 'weekdays', 2, localeOrder);
|
||
};
|
||
});
|
||
|
||
const weekOfYear = (function (o, c, d) {
|
||
var proto = c.prototype;
|
||
|
||
proto.week = function (week) {
|
||
if (week === void 0) {
|
||
week = null;
|
||
}
|
||
|
||
if (week !== null) {
|
||
return this.add((week - this.week()) * 7, D);
|
||
}
|
||
|
||
var yearStart = this.$locale().yearStart || 1;
|
||
|
||
if (this.month() === 11 && this.date() > 25) {
|
||
// d(this) is for badMutable
|
||
var nextYearStartDay = d(this).startOf(Y).add(1, Y).date(yearStart);
|
||
var thisEndOfWeek = d(this).endOf(W);
|
||
|
||
if (nextYearStartDay.isBefore(thisEndOfWeek)) {
|
||
return 1;
|
||
}
|
||
}
|
||
|
||
var yearStartDay = d(this).startOf(Y).date(yearStart);
|
||
var yearStartWeek = yearStartDay.startOf(W).subtract(1, MS);
|
||
var diffInWeek = this.diff(yearStartWeek, W, true);
|
||
|
||
if (diffInWeek < 0) {
|
||
return d(this).startOf('week').week();
|
||
}
|
||
|
||
return Math.ceil(diffInWeek);
|
||
};
|
||
|
||
proto.weeks = function (week) {
|
||
if (week === void 0) {
|
||
week = null;
|
||
}
|
||
|
||
return this.week(week);
|
||
};
|
||
});
|
||
|
||
const weekYear = (function (o, c) {
|
||
var proto = c.prototype;
|
||
|
||
proto.weekYear = function () {
|
||
var month = this.month();
|
||
var weekOfYear = this.week();
|
||
var year = this.year();
|
||
|
||
if (weekOfYear === 1 && month === 11) {
|
||
return year + 1;
|
||
}
|
||
|
||
if (month === 0 && weekOfYear >= 52) {
|
||
return year - 1;
|
||
}
|
||
|
||
return year;
|
||
};
|
||
});
|
||
|
||
const quarterOfYear = (function (o, c) {
|
||
var proto = c.prototype;
|
||
|
||
proto.quarter = function (quarter) {
|
||
if (!this.$utils().u(quarter)) {
|
||
return this.month(this.month() % 3 + (quarter - 1) * 3);
|
||
}
|
||
|
||
return Math.ceil((this.month() + 1) / 3);
|
||
};
|
||
|
||
var oldAdd = proto.add;
|
||
|
||
proto.add = function (number, units) {
|
||
number = Number(number); // eslint-disable-line no-param-reassign
|
||
|
||
var unit = this.$utils().p(units);
|
||
|
||
if (unit === Q) {
|
||
return this.add(number * 3, M);
|
||
}
|
||
|
||
return oldAdd.bind(this)(number, units);
|
||
};
|
||
|
||
var oldStartOf = proto.startOf;
|
||
|
||
proto.startOf = function (units, startOf) {
|
||
var utils = this.$utils();
|
||
var isStartOf = !utils.u(startOf) ? startOf : true;
|
||
var unit = utils.p(units);
|
||
|
||
if (unit === Q) {
|
||
var quarter = this.quarter() - 1;
|
||
return isStartOf ? this.month(quarter * 3).startOf(M).startOf(D) : this.month(quarter * 3 + 2).endOf(M).endOf(D);
|
||
}
|
||
|
||
return oldStartOf.bind(this)(units, startOf);
|
||
};
|
||
});
|
||
|
||
const advancedFormat = (function (o, c) {
|
||
// locale needed later
|
||
var proto = c.prototype;
|
||
var oldFormat = proto.format;
|
||
|
||
proto.format = function (formatStr) {
|
||
var _this = this;
|
||
|
||
var locale = this.$locale();
|
||
|
||
if (!this.isValid()) {
|
||
return oldFormat.bind(this)(formatStr);
|
||
}
|
||
|
||
var utils = this.$utils();
|
||
var str = formatStr || FORMAT_DEFAULT;
|
||
var result = str.replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g, function (match) {
|
||
switch (match) {
|
||
case 'Q':
|
||
return Math.ceil((_this.$M + 1) / 3);
|
||
|
||
case 'Do':
|
||
return locale.ordinal(_this.$D);
|
||
|
||
case 'gggg':
|
||
return _this.weekYear();
|
||
|
||
case 'GGGG':
|
||
return _this.isoWeekYear();
|
||
|
||
case 'wo':
|
||
return locale.ordinal(_this.week(), 'W');
|
||
// W for week
|
||
|
||
case 'w':
|
||
case 'ww':
|
||
return utils.s(_this.week(), match === 'w' ? 1 : 2, '0');
|
||
|
||
case 'W':
|
||
case 'WW':
|
||
return utils.s(_this.isoWeek(), match === 'W' ? 1 : 2, '0');
|
||
|
||
case 'k':
|
||
case 'kk':
|
||
return utils.s(String(_this.$H === 0 ? 24 : _this.$H), match === 'k' ? 1 : 2, '0');
|
||
|
||
case 'X':
|
||
return Math.floor(_this.$d.getTime() / 1000);
|
||
|
||
case 'x':
|
||
return _this.$d.getTime();
|
||
|
||
case 'z':
|
||
return "[" + _this.offsetName() + "]";
|
||
|
||
case 'zzz':
|
||
return "[" + _this.offsetName('long') + "]";
|
||
|
||
default:
|
||
return match;
|
||
}
|
||
});
|
||
return oldFormat.bind(this)(result);
|
||
};
|
||
});
|
||
|
||
var formattingTokens = /(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g;
|
||
var match1 = /\d/; // 0 - 9
|
||
|
||
var match2 = /\d\d/; // 00 - 99
|
||
|
||
var match3 = /\d{3}/; // 000 - 999
|
||
|
||
var match4 = /\d{4}/; // 0000 - 9999
|
||
|
||
var match1to2 = /\d\d?/; // 0 - 99
|
||
|
||
var matchSigned = /[+-]?\d+/; // -inf - inf
|
||
|
||
var matchOffset = /[+-]\d\d:?(\d\d)?|Z/; // +00:00 -00:00 +0000 or -0000 +00 or Z
|
||
|
||
var matchWord = /\d*[^-_:/,()\s\d]+/; // Word
|
||
|
||
var locale$3 = {};
|
||
|
||
var parseTwoDigitYear = function parseTwoDigitYear(input) {
|
||
input = +input;
|
||
return input + (input > 68 ? 1900 : 2000);
|
||
};
|
||
|
||
function offsetFromString(string) {
|
||
if (!string) return 0;
|
||
if (string === 'Z') return 0;
|
||
var parts = string.match(/([+-]|\d\d)/g);
|
||
var minutes = +(parts[1] * 60) + (+parts[2] || 0);
|
||
return minutes === 0 ? 0 : parts[0] === '+' ? -minutes : minutes; // eslint-disable-line no-nested-ternary
|
||
}
|
||
|
||
var addInput = function addInput(property) {
|
||
return function (input) {
|
||
this[property] = +input;
|
||
};
|
||
};
|
||
|
||
var zoneExpressions = [matchOffset, function (input) {
|
||
var zone = this.zone || (this.zone = {});
|
||
zone.offset = offsetFromString(input);
|
||
}];
|
||
|
||
var getLocalePart = function getLocalePart(name) {
|
||
var part = locale$3[name];
|
||
return part && (part.indexOf ? part : part.s.concat(part.f));
|
||
};
|
||
|
||
var meridiemMatch = function meridiemMatch(input, isLowerCase) {
|
||
var isAfternoon;
|
||
var _locale = locale$3,
|
||
meridiem = _locale.meridiem;
|
||
|
||
if (!meridiem) {
|
||
isAfternoon = input === (isLowerCase ? 'pm' : 'PM');
|
||
} else {
|
||
for (var i = 1; i <= 24; i += 1) {
|
||
// todo: fix input === meridiem(i, 0, isLowerCase)
|
||
if (input.indexOf(meridiem(i, 0, isLowerCase)) > -1) {
|
||
isAfternoon = i > 12;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
return isAfternoon;
|
||
};
|
||
|
||
var expressions = {
|
||
A: [matchWord, function (input) {
|
||
this.afternoon = meridiemMatch(input, false);
|
||
}],
|
||
a: [matchWord, function (input) {
|
||
this.afternoon = meridiemMatch(input, true);
|
||
}],
|
||
Q: [match1, function (input) {
|
||
this.month = (input - 1) * 3 + 1;
|
||
}],
|
||
S: [match1, function (input) {
|
||
this.milliseconds = +input * 100;
|
||
}],
|
||
SS: [match2, function (input) {
|
||
this.milliseconds = +input * 10;
|
||
}],
|
||
SSS: [match3, function (input) {
|
||
this.milliseconds = +input;
|
||
}],
|
||
s: [match1to2, addInput('seconds')],
|
||
ss: [match1to2, addInput('seconds')],
|
||
m: [match1to2, addInput('minutes')],
|
||
mm: [match1to2, addInput('minutes')],
|
||
H: [match1to2, addInput('hours')],
|
||
h: [match1to2, addInput('hours')],
|
||
HH: [match1to2, addInput('hours')],
|
||
hh: [match1to2, addInput('hours')],
|
||
D: [match1to2, addInput('day')],
|
||
DD: [match2, addInput('day')],
|
||
Do: [matchWord, function (input) {
|
||
var _locale2 = locale$3,
|
||
ordinal = _locale2.ordinal;
|
||
|
||
var _input$match = input.match(/\d+/);
|
||
|
||
this.day = _input$match[0];
|
||
if (!ordinal) return;
|
||
|
||
for (var i = 1; i <= 31; i += 1) {
|
||
if (ordinal(i).replace(/\[|\]/g, '') === input) {
|
||
this.day = i;
|
||
}
|
||
}
|
||
}],
|
||
w: [match1to2, addInput('week')],
|
||
ww: [match2, addInput('week')],
|
||
M: [match1to2, addInput('month')],
|
||
MM: [match2, addInput('month')],
|
||
MMM: [matchWord, function (input) {
|
||
var months = getLocalePart('months');
|
||
var monthsShort = getLocalePart('monthsShort');
|
||
var matchIndex = (monthsShort || months.map(function (_) {
|
||
return _.slice(0, 3);
|
||
})).indexOf(input) + 1;
|
||
|
||
if (matchIndex < 1) {
|
||
throw new Error();
|
||
}
|
||
|
||
this.month = matchIndex % 12 || matchIndex;
|
||
}],
|
||
MMMM: [matchWord, function (input) {
|
||
var months = getLocalePart('months');
|
||
var matchIndex = months.indexOf(input) + 1;
|
||
|
||
if (matchIndex < 1) {
|
||
throw new Error();
|
||
}
|
||
|
||
this.month = matchIndex % 12 || matchIndex;
|
||
}],
|
||
Y: [matchSigned, addInput('year')],
|
||
YY: [match2, function (input) {
|
||
this.year = parseTwoDigitYear(input);
|
||
}],
|
||
YYYY: [match4, addInput('year')],
|
||
Z: zoneExpressions,
|
||
ZZ: zoneExpressions
|
||
};
|
||
|
||
function correctHours(time) {
|
||
var afternoon = time.afternoon;
|
||
|
||
if (afternoon !== undefined) {
|
||
var hours = time.hours;
|
||
|
||
if (afternoon) {
|
||
if (hours < 12) {
|
||
time.hours += 12;
|
||
}
|
||
} else if (hours === 12) {
|
||
time.hours = 0;
|
||
}
|
||
|
||
delete time.afternoon;
|
||
}
|
||
}
|
||
|
||
function makeParser(format) {
|
||
format = u(format, locale$3 && locale$3.formats);
|
||
var array = format.match(formattingTokens);
|
||
var length = array.length;
|
||
|
||
for (var i = 0; i < length; i += 1) {
|
||
var token = array[i];
|
||
var parseTo = expressions[token];
|
||
var regex = parseTo && parseTo[0];
|
||
var parser = parseTo && parseTo[1];
|
||
|
||
if (parser) {
|
||
array[i] = {
|
||
regex: regex,
|
||
parser: parser
|
||
};
|
||
} else {
|
||
array[i] = token.replace(/^\[|\]$/g, '');
|
||
}
|
||
}
|
||
|
||
return function (input) {
|
||
var time = {};
|
||
|
||
for (var _i = 0, start = 0; _i < length; _i += 1) {
|
||
var _token = array[_i];
|
||
|
||
if (typeof _token === 'string') {
|
||
start += _token.length;
|
||
} else {
|
||
var _regex = _token.regex,
|
||
_parser = _token.parser;
|
||
var part = input.slice(start);
|
||
|
||
var match = _regex.exec(part);
|
||
|
||
var value = match[0];
|
||
|
||
_parser.call(time, value);
|
||
|
||
input = input.replace(value, '');
|
||
}
|
||
}
|
||
|
||
correctHours(time);
|
||
return time;
|
||
};
|
||
}
|
||
|
||
var parseFormattedInput = function parseFormattedInput(input, format, utc, dayjs) {
|
||
try {
|
||
if (['x', 'X'].indexOf(format) > -1) return new Date((format === 'X' ? 1000 : 1) * input);
|
||
var parser = makeParser(format);
|
||
|
||
var _parser2 = parser(input),
|
||
year = _parser2.year,
|
||
month = _parser2.month,
|
||
day = _parser2.day,
|
||
hours = _parser2.hours,
|
||
minutes = _parser2.minutes,
|
||
seconds = _parser2.seconds,
|
||
milliseconds = _parser2.milliseconds,
|
||
zone = _parser2.zone,
|
||
week = _parser2.week;
|
||
|
||
var now = new Date();
|
||
var d = day || (!year && !month ? now.getDate() : 1);
|
||
var y = year || now.getFullYear();
|
||
var M = 0;
|
||
|
||
if (!(year && !month)) {
|
||
M = month > 0 ? month - 1 : now.getMonth();
|
||
}
|
||
|
||
var h = hours || 0;
|
||
var m = minutes || 0;
|
||
var s = seconds || 0;
|
||
var ms = milliseconds || 0;
|
||
|
||
if (zone) {
|
||
return new Date(Date.UTC(y, M, d, h, m, s, ms + zone.offset * 60 * 1000));
|
||
}
|
||
|
||
if (utc) {
|
||
return new Date(Date.UTC(y, M, d, h, m, s, ms));
|
||
}
|
||
|
||
var newDate;
|
||
newDate = new Date(y, M, d, h, m, s, ms);
|
||
|
||
if (week) {
|
||
newDate = dayjs(newDate).week(week).toDate();
|
||
}
|
||
|
||
return newDate;
|
||
} catch (e) {
|
||
return new Date(''); // Invalid Date
|
||
}
|
||
};
|
||
|
||
const customParseFormat = (function (o, C, d) {
|
||
d.p.customParseFormat = true;
|
||
|
||
if (o && o.parseTwoDigitYear) {
|
||
parseTwoDigitYear = o.parseTwoDigitYear;
|
||
}
|
||
|
||
var proto = C.prototype;
|
||
var oldParse = proto.parse;
|
||
|
||
proto.parse = function (cfg) {
|
||
var date = cfg.date,
|
||
utc = cfg.utc,
|
||
args = cfg.args;
|
||
this.$u = utc;
|
||
var format = args[1];
|
||
|
||
if (typeof format === 'string') {
|
||
var isStrictWithoutLocale = args[2] === true;
|
||
var isStrictWithLocale = args[3] === true;
|
||
var isStrict = isStrictWithoutLocale || isStrictWithLocale;
|
||
var pl = args[2];
|
||
|
||
if (isStrictWithLocale) {
|
||
pl = args[2];
|
||
}
|
||
|
||
locale$3 = this.$locale();
|
||
|
||
if (!isStrictWithoutLocale && pl) {
|
||
locale$3 = d.Ls[pl];
|
||
}
|
||
|
||
this.$d = parseFormattedInput(date, format, utc, d);
|
||
this.init();
|
||
if (pl && pl !== true) this.$L = this.locale(pl).$L; // use != to treat
|
||
// input number 1410715640579 and format string '1410715640579' equal
|
||
// eslint-disable-next-line eqeqeq
|
||
|
||
if (isStrict && date != this.format(format)) {
|
||
this.$d = new Date('');
|
||
} // reset global locale to make parallel unit test
|
||
|
||
|
||
locale$3 = {};
|
||
} else if (format instanceof Array) {
|
||
var len = format.length;
|
||
|
||
for (var i = 1; i <= len; i += 1) {
|
||
args[1] = format[i - 1];
|
||
var result = d.apply(this, args);
|
||
|
||
if (result.isValid()) {
|
||
this.$d = result.$d;
|
||
this.$L = result.$L;
|
||
this.init();
|
||
break;
|
||
}
|
||
|
||
if (i === len) this.$d = new Date('');
|
||
}
|
||
} else {
|
||
oldParse.call(this, cfg);
|
||
}
|
||
};
|
||
});
|
||
|
||
// This icon file is generated automatically.
|
||
var CalendarOutlined$1 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M880 184H712v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H384v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H144c-17.7 0-32 14.3-32 32v664c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V216c0-17.7-14.3-32-32-32zm-40 656H184V460h656v380zM184 392V256h128v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h256v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h128v136H184z" } }] }, "name": "calendar", "theme": "outlined" };
|
||
|
||
function _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? Object(arguments[i]) : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty$2(target, key, source[key]); }); } return target; }
|
||
|
||
function _defineProperty$2(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
var CalendarOutlined = function CalendarOutlined(props, context) {
|
||
var p = _objectSpread$2({}, props, context.attrs);
|
||
|
||
return createVNode(Icon, _objectSpread$2({}, p, {
|
||
"icon": CalendarOutlined$1
|
||
}), null);
|
||
};
|
||
|
||
CalendarOutlined.displayName = 'CalendarOutlined';
|
||
CalendarOutlined.inheritAttrs = false;
|
||
|
||
// This icon file is generated automatically.
|
||
var ClockCircleOutlined$1 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z" } }, { "tag": "path", "attrs": { "d": "M686.7 638.6L544.1 535.5V288c0-4.4-3.6-8-8-8H488c-4.4 0-8 3.6-8 8v275.4c0 2.6 1.2 5 3.3 6.5l165.4 120.6c3.6 2.6 8.6 1.8 11.2-1.7l28.6-39c2.6-3.7 1.8-8.7-1.8-11.2z" } }] }, "name": "clock-circle", "theme": "outlined" };
|
||
|
||
function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? Object(arguments[i]) : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty$1(target, key, source[key]); }); } return target; }
|
||
|
||
function _defineProperty$1(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
var ClockCircleOutlined = function ClockCircleOutlined(props, context) {
|
||
var p = _objectSpread$1({}, props, context.attrs);
|
||
|
||
return createVNode(Icon, _objectSpread$1({}, p, {
|
||
"icon": ClockCircleOutlined$1
|
||
}), null);
|
||
};
|
||
|
||
ClockCircleOutlined.displayName = 'ClockCircleOutlined';
|
||
ClockCircleOutlined.inheritAttrs = false;
|
||
|
||
// This icon file is generated automatically.
|
||
var SwapRightOutlined$1 = { "icon": { "tag": "svg", "attrs": { "viewBox": "0 0 1024 1024", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M873.1 596.2l-164-208A32 32 0 00684 376h-64.8c-6.7 0-10.4 7.7-6.3 13l144.3 183H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h695.9c26.8 0 41.7-30.8 25.2-51.8z" } }] }, "name": "swap-right", "theme": "outlined" };
|
||
|
||
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? Object(arguments[i]) : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
|
||
|
||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
|
||
var SwapRightOutlined = function SwapRightOutlined(props, context) {
|
||
var p = _objectSpread({}, props, context.attrs);
|
||
|
||
return createVNode(Icon, _objectSpread({}, p, {
|
||
"icon": SwapRightOutlined$1
|
||
}), null);
|
||
};
|
||
|
||
SwapRightOutlined.displayName = 'SwapRightOutlined';
|
||
SwapRightOutlined.inheritAttrs = false;
|
||
|
||
dayjs.extend(customParseFormat);
|
||
dayjs.extend(advancedFormat);
|
||
dayjs.extend(weekday);
|
||
dayjs.extend(localeData);
|
||
dayjs.extend(weekOfYear);
|
||
dayjs.extend(weekYear);
|
||
dayjs.extend(quarterOfYear);
|
||
dayjs.extend((_o, c) => {
|
||
const proto = c.prototype;
|
||
const oldFormat = proto.format;
|
||
proto.format = function f(formatStr) {
|
||
const str = (formatStr || "").replace("Wo", "wo");
|
||
return oldFormat.bind(this)(str);
|
||
};
|
||
});
|
||
const localeMap = {
|
||
// ar_EG:
|
||
// az_AZ:
|
||
// bg_BG:
|
||
bn_BD: "bn-bd",
|
||
by_BY: "be",
|
||
// ca_ES:
|
||
// cs_CZ:
|
||
// da_DK:
|
||
// de_DE:
|
||
// el_GR:
|
||
en_GB: "en-gb",
|
||
en_US: "en",
|
||
// es_ES:
|
||
// et_EE:
|
||
// fa_IR:
|
||
// fi_FI:
|
||
fr_BE: "fr",
|
||
fr_CA: "fr-ca",
|
||
// fr_FR:
|
||
// ga_IE:
|
||
// gl_ES:
|
||
// he_IL:
|
||
// hi_IN:
|
||
// hr_HR:
|
||
// hu_HU:
|
||
hy_AM: "hy-am",
|
||
// id_ID:
|
||
// is_IS:
|
||
// it_IT:
|
||
// ja_JP:
|
||
// ka_GE:
|
||
// kk_KZ:
|
||
// km_KH:
|
||
kmr_IQ: "ku",
|
||
// kn_IN:
|
||
// ko_KR:
|
||
// ku_IQ: // previous ku in antd
|
||
// lt_LT:
|
||
// lv_LV:
|
||
// mk_MK:
|
||
// ml_IN:
|
||
// mn_MN:
|
||
// ms_MY:
|
||
// nb_NO:
|
||
// ne_NP:
|
||
nl_BE: "nl-be",
|
||
// nl_NL:
|
||
// pl_PL:
|
||
pt_BR: "pt-br",
|
||
// pt_PT:
|
||
// ro_RO:
|
||
// ru_RU:
|
||
// sk_SK:
|
||
// sl_SI:
|
||
// sr_RS:
|
||
// sv_SE:
|
||
// ta_IN:
|
||
// th_TH:
|
||
// tr_TR:
|
||
// uk_UA:
|
||
// ur_PK:
|
||
// vi_VN:
|
||
zh_CN: "zh-cn",
|
||
zh_HK: "zh-hk",
|
||
zh_TW: "zh-tw"
|
||
};
|
||
const parseLocale = (locale2) => {
|
||
const mapLocale = localeMap[locale2];
|
||
return mapLocale || locale2.split("_")[0];
|
||
};
|
||
const parseNoMatchNotice = () => {
|
||
noteOnce(false, "Not match any format. Please help to fire a issue about this.");
|
||
};
|
||
const advancedFormatRegex = /\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|k{1,2}|S/g;
|
||
function findTargetStr(val, index, segmentation) {
|
||
const items = [...new Set(val.split(segmentation))];
|
||
let idx = 0;
|
||
for (let i = 0; i < items.length; i++) {
|
||
const item = items[i];
|
||
idx += item.length;
|
||
if (idx > index) {
|
||
return item;
|
||
}
|
||
idx += segmentation.length;
|
||
}
|
||
}
|
||
const toDateWithValueFormat = (val, valueFormat) => {
|
||
if (!val) return null;
|
||
if (dayjs.isDayjs(val)) {
|
||
return val;
|
||
}
|
||
const matchs = valueFormat.matchAll(advancedFormatRegex);
|
||
let baseDate = dayjs(val, valueFormat);
|
||
if (matchs === null) {
|
||
return baseDate;
|
||
}
|
||
for (const match of matchs) {
|
||
const origin = match[0];
|
||
const index = match["index"];
|
||
if (origin === "Q") {
|
||
const segmentation = val.slice(index - 1, index);
|
||
const quarterStr = findTargetStr(val, index, segmentation).match(/\d+/)[0];
|
||
baseDate = baseDate.quarter(parseInt(quarterStr));
|
||
}
|
||
if (origin.toLowerCase() === "wo") {
|
||
const segmentation = val.slice(index - 1, index);
|
||
const weekStr = findTargetStr(val, index, segmentation).match(/\d+/)[0];
|
||
baseDate = baseDate.week(parseInt(weekStr));
|
||
}
|
||
if (origin.toLowerCase() === "ww") {
|
||
baseDate = baseDate.week(parseInt(val.slice(index, index + origin.length)));
|
||
}
|
||
if (origin.toLowerCase() === "w") {
|
||
baseDate = baseDate.week(parseInt(val.slice(index, index + origin.length + 1)));
|
||
}
|
||
}
|
||
return baseDate;
|
||
};
|
||
const generateConfig = {
|
||
// get
|
||
getNow: () => dayjs(),
|
||
getFixedDate: (string) => dayjs(string, ["YYYY-M-DD", "YYYY-MM-DD"]),
|
||
getEndDate: (date) => date.endOf("month"),
|
||
getWeekDay: (date) => {
|
||
const clone = date.locale("en");
|
||
return clone.weekday() + clone.localeData().firstDayOfWeek();
|
||
},
|
||
getYear: (date) => date.year(),
|
||
getMonth: (date) => date.month(),
|
||
getDate: (date) => date.date(),
|
||
getHour: (date) => date.hour(),
|
||
getMinute: (date) => date.minute(),
|
||
getSecond: (date) => date.second(),
|
||
// set
|
||
addYear: (date, diff) => date.add(diff, "year"),
|
||
addMonth: (date, diff) => date.add(diff, "month"),
|
||
addDate: (date, diff) => date.add(diff, "day"),
|
||
setYear: (date, year) => date.year(year),
|
||
setMonth: (date, month) => date.month(month),
|
||
setDate: (date, num) => date.date(num),
|
||
setHour: (date, hour) => date.hour(hour),
|
||
setMinute: (date, minute) => date.minute(minute),
|
||
setSecond: (date, second) => date.second(second),
|
||
// Compare
|
||
isAfter: (date1, date2) => date1.isAfter(date2),
|
||
isValidate: (date) => date.isValid(),
|
||
locale: {
|
||
getWeekFirstDay: (locale2) => dayjs().locale(parseLocale(locale2)).localeData().firstDayOfWeek(),
|
||
getWeekFirstDate: (locale2, date) => date.locale(parseLocale(locale2)).weekday(0),
|
||
getWeek: (locale2, date) => date.locale(parseLocale(locale2)).week(),
|
||
getShortWeekDays: (locale2) => dayjs().locale(parseLocale(locale2)).localeData().weekdaysMin(),
|
||
getShortMonths: (locale2) => dayjs().locale(parseLocale(locale2)).localeData().monthsShort(),
|
||
format: (locale2, date, format) => date.locale(parseLocale(locale2)).format(format),
|
||
parse: (locale2, text, formats) => {
|
||
const localeStr = parseLocale(locale2);
|
||
for (let i = 0; i < formats.length; i += 1) {
|
||
const format = formats[i];
|
||
const formatText = text;
|
||
if (format.includes("wo") || format.includes("Wo")) {
|
||
const year = formatText.split("-")[0];
|
||
const weekStr = formatText.split("-")[1];
|
||
const firstWeek = dayjs(year, "YYYY").startOf("year").locale(localeStr);
|
||
for (let j = 0; j <= 52; j += 1) {
|
||
const nextWeek = firstWeek.add(j, "week");
|
||
if (nextWeek.format("Wo") === weekStr) {
|
||
return nextWeek;
|
||
}
|
||
}
|
||
parseNoMatchNotice();
|
||
return null;
|
||
}
|
||
const date = dayjs(formatText, format, true).locale(localeStr);
|
||
if (date.isValid()) {
|
||
return date;
|
||
}
|
||
}
|
||
if (!text) {
|
||
parseNoMatchNotice();
|
||
}
|
||
return null;
|
||
}
|
||
},
|
||
toDate: (value, valueFormat) => {
|
||
if (Array.isArray(value)) {
|
||
return value.map((val) => toDateWithValueFormat(val, valueFormat));
|
||
} else {
|
||
return toDateWithValueFormat(value, valueFormat);
|
||
}
|
||
},
|
||
toString: (value, valueFormat) => {
|
||
if (Array.isArray(value)) {
|
||
return value.map((val) => dayjs.isDayjs(val) ? val.format(valueFormat) : val);
|
||
} else {
|
||
return dayjs.isDayjs(value) ? value.format(valueFormat) : value;
|
||
}
|
||
}
|
||
};
|
||
function useMergeProps(props) {
|
||
const attrs = useAttrs();
|
||
return _extends(_extends({}, props), attrs);
|
||
}
|
||
const PanelContextKey = Symbol("PanelContextProps");
|
||
const useProvidePanel = (props) => {
|
||
provide(PanelContextKey, props);
|
||
};
|
||
const useInjectPanel = () => {
|
||
return inject(PanelContextKey, {});
|
||
};
|
||
const HIDDEN_STYLE = {
|
||
visibility: "hidden"
|
||
};
|
||
function Header(_props, _ref) {
|
||
let {
|
||
slots
|
||
} = _ref;
|
||
var _a;
|
||
const props = useMergeProps(_props);
|
||
const {
|
||
prefixCls,
|
||
prevIcon = "\u2039",
|
||
nextIcon = "\u203A",
|
||
superPrevIcon = "\xAB",
|
||
superNextIcon = "\xBB",
|
||
onSuperPrev,
|
||
onSuperNext,
|
||
onPrev,
|
||
onNext
|
||
} = props;
|
||
const {
|
||
hideNextBtn,
|
||
hidePrevBtn
|
||
} = useInjectPanel();
|
||
return createVNode("div", {
|
||
"class": prefixCls
|
||
}, [onSuperPrev && createVNode("button", {
|
||
"type": "button",
|
||
"onClick": onSuperPrev,
|
||
"tabindex": -1,
|
||
"class": `${prefixCls}-super-prev-btn`,
|
||
"style": hidePrevBtn.value ? HIDDEN_STYLE : {}
|
||
}, [superPrevIcon]), onPrev && createVNode("button", {
|
||
"type": "button",
|
||
"onClick": onPrev,
|
||
"tabindex": -1,
|
||
"class": `${prefixCls}-prev-btn`,
|
||
"style": hidePrevBtn.value ? HIDDEN_STYLE : {}
|
||
}, [prevIcon]), createVNode("div", {
|
||
"class": `${prefixCls}-view`
|
||
}, [(_a = slots.default) === null || _a === void 0 ? void 0 : _a.call(slots)]), onNext && createVNode("button", {
|
||
"type": "button",
|
||
"onClick": onNext,
|
||
"tabindex": -1,
|
||
"class": `${prefixCls}-next-btn`,
|
||
"style": hideNextBtn.value ? HIDDEN_STYLE : {}
|
||
}, [nextIcon]), onSuperNext && createVNode("button", {
|
||
"type": "button",
|
||
"onClick": onSuperNext,
|
||
"tabindex": -1,
|
||
"class": `${prefixCls}-super-next-btn`,
|
||
"style": hideNextBtn.value ? HIDDEN_STYLE : {}
|
||
}, [superNextIcon])]);
|
||
}
|
||
Header.displayName = "Header";
|
||
Header.inheritAttrs = false;
|
||
function DecadeHeader(_props) {
|
||
const props = useMergeProps(_props);
|
||
const {
|
||
prefixCls,
|
||
generateConfig: generateConfig2,
|
||
viewDate,
|
||
onPrevDecades,
|
||
onNextDecades
|
||
} = props;
|
||
const {
|
||
hideHeader
|
||
} = useInjectPanel();
|
||
if (hideHeader) {
|
||
return null;
|
||
}
|
||
const headerPrefixCls = `${prefixCls}-header`;
|
||
const yearNumber = generateConfig2.getYear(viewDate);
|
||
const startYear = Math.floor(yearNumber / DECADE_DISTANCE_COUNT) * DECADE_DISTANCE_COUNT;
|
||
const endYear = startYear + DECADE_DISTANCE_COUNT - 1;
|
||
return createVNode(Header, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"prefixCls": headerPrefixCls,
|
||
"onSuperPrev": onPrevDecades,
|
||
"onSuperNext": onNextDecades
|
||
}), {
|
||
default: () => [startYear, createTextVNode("-"), endYear]
|
||
});
|
||
}
|
||
DecadeHeader.displayName = "DecadeHeader";
|
||
DecadeHeader.inheritAttrs = false;
|
||
function setTime(generateConfig2, date, hour, minute, second) {
|
||
let nextTime = generateConfig2.setHour(date, hour);
|
||
nextTime = generateConfig2.setMinute(nextTime, minute);
|
||
nextTime = generateConfig2.setSecond(nextTime, second);
|
||
return nextTime;
|
||
}
|
||
function setDateTime(generateConfig2, date, defaultDate) {
|
||
if (!defaultDate) {
|
||
return date;
|
||
}
|
||
let newDate = date;
|
||
newDate = generateConfig2.setHour(newDate, generateConfig2.getHour(defaultDate));
|
||
newDate = generateConfig2.setMinute(newDate, generateConfig2.getMinute(defaultDate));
|
||
newDate = generateConfig2.setSecond(newDate, generateConfig2.getSecond(defaultDate));
|
||
return newDate;
|
||
}
|
||
function getLowerBoundTime(hour, minute, second, hourStep, minuteStep, secondStep) {
|
||
const lowerBoundHour = Math.floor(hour / hourStep) * hourStep;
|
||
if (lowerBoundHour < hour) {
|
||
return [lowerBoundHour, 60 - minuteStep, 60 - secondStep];
|
||
}
|
||
const lowerBoundMinute = Math.floor(minute / minuteStep) * minuteStep;
|
||
if (lowerBoundMinute < minute) {
|
||
return [lowerBoundHour, lowerBoundMinute, 60 - secondStep];
|
||
}
|
||
const lowerBoundSecond = Math.floor(second / secondStep) * secondStep;
|
||
return [lowerBoundHour, lowerBoundMinute, lowerBoundSecond];
|
||
}
|
||
function getLastDay(generateConfig2, date) {
|
||
const year = generateConfig2.getYear(date);
|
||
const month = generateConfig2.getMonth(date) + 1;
|
||
const endDate = generateConfig2.getEndDate(generateConfig2.getFixedDate(`${year}-${month}-01`));
|
||
const lastDay = generateConfig2.getDate(endDate);
|
||
const monthShow = month < 10 ? `0${month}` : `${month}`;
|
||
return `${year}-${monthShow}-${lastDay}`;
|
||
}
|
||
function PanelBody(_props) {
|
||
const {
|
||
prefixCls,
|
||
disabledDate,
|
||
onSelect,
|
||
picker,
|
||
rowNum,
|
||
colNum,
|
||
prefixColumn,
|
||
rowClassName,
|
||
baseDate,
|
||
getCellClassName,
|
||
getCellText,
|
||
getCellNode,
|
||
getCellDate,
|
||
generateConfig: generateConfig2,
|
||
titleCell,
|
||
headerCells
|
||
} = useMergeProps(_props);
|
||
const {
|
||
onDateMouseenter,
|
||
onDateMouseleave,
|
||
mode
|
||
} = useInjectPanel();
|
||
const cellPrefixCls = `${prefixCls}-cell`;
|
||
const rows = [];
|
||
for (let i = 0; i < rowNum; i += 1) {
|
||
const row = [];
|
||
let rowStartDate;
|
||
for (let j = 0; j < colNum; j += 1) {
|
||
const offset = i * colNum + j;
|
||
const currentDate = getCellDate(baseDate, offset);
|
||
const disabled = getCellDateDisabled({
|
||
cellDate: currentDate,
|
||
mode: mode.value,
|
||
disabledDate,
|
||
generateConfig: generateConfig2
|
||
});
|
||
if (j === 0) {
|
||
rowStartDate = currentDate;
|
||
if (prefixColumn) {
|
||
row.push(prefixColumn(rowStartDate));
|
||
}
|
||
}
|
||
const title = titleCell && titleCell(currentDate);
|
||
row.push(createVNode("td", {
|
||
"key": j,
|
||
"title": title,
|
||
"class": classNames(cellPrefixCls, _extends({
|
||
[`${cellPrefixCls}-disabled`]: disabled,
|
||
[`${cellPrefixCls}-start`]: getCellText(currentDate) === 1 || picker === "year" && Number(title) % 10 === 0,
|
||
[`${cellPrefixCls}-end`]: title === getLastDay(generateConfig2, currentDate) || picker === "year" && Number(title) % 10 === 9
|
||
}, getCellClassName(currentDate))),
|
||
"onClick": (e) => {
|
||
e.stopPropagation();
|
||
if (!disabled) {
|
||
onSelect(currentDate);
|
||
}
|
||
},
|
||
"onMouseenter": () => {
|
||
if (!disabled && onDateMouseenter) {
|
||
onDateMouseenter(currentDate);
|
||
}
|
||
},
|
||
"onMouseleave": () => {
|
||
if (!disabled && onDateMouseleave) {
|
||
onDateMouseleave(currentDate);
|
||
}
|
||
}
|
||
}, [getCellNode ? getCellNode(currentDate) : createVNode("div", {
|
||
"class": `${cellPrefixCls}-inner`
|
||
}, [getCellText(currentDate)])]));
|
||
}
|
||
rows.push(createVNode("tr", {
|
||
"key": i,
|
||
"class": rowClassName && rowClassName(rowStartDate)
|
||
}, [row]));
|
||
}
|
||
return createVNode("div", {
|
||
"class": `${prefixCls}-body`
|
||
}, [createVNode("table", {
|
||
"class": `${prefixCls}-content`
|
||
}, [headerCells && createVNode("thead", null, [createVNode("tr", null, [headerCells])]), createVNode("tbody", null, [rows])])]);
|
||
}
|
||
PanelBody.displayName = "PanelBody";
|
||
PanelBody.inheritAttrs = false;
|
||
const DECADE_COL_COUNT = 3;
|
||
const DECADE_ROW_COUNT = 4;
|
||
function DecadeBody(_props) {
|
||
const props = useMergeProps(_props);
|
||
const DECADE_UNIT_DIFF_DES = DECADE_UNIT_DIFF - 1;
|
||
const {
|
||
prefixCls,
|
||
viewDate,
|
||
generateConfig: generateConfig2
|
||
} = props;
|
||
const cellPrefixCls = `${prefixCls}-cell`;
|
||
const yearNumber = generateConfig2.getYear(viewDate);
|
||
const decadeYearNumber = Math.floor(yearNumber / DECADE_UNIT_DIFF) * DECADE_UNIT_DIFF;
|
||
const startDecadeYear = Math.floor(yearNumber / DECADE_DISTANCE_COUNT) * DECADE_DISTANCE_COUNT;
|
||
const endDecadeYear = startDecadeYear + DECADE_DISTANCE_COUNT - 1;
|
||
const baseDecadeYear = generateConfig2.setYear(viewDate, startDecadeYear - Math.ceil((DECADE_COL_COUNT * DECADE_ROW_COUNT * DECADE_UNIT_DIFF - DECADE_DISTANCE_COUNT) / 2));
|
||
const getCellClassName = (date) => {
|
||
const startDecadeNumber = generateConfig2.getYear(date);
|
||
const endDecadeNumber = startDecadeNumber + DECADE_UNIT_DIFF_DES;
|
||
return {
|
||
[`${cellPrefixCls}-in-view`]: startDecadeYear <= startDecadeNumber && endDecadeNumber <= endDecadeYear,
|
||
[`${cellPrefixCls}-selected`]: startDecadeNumber === decadeYearNumber
|
||
};
|
||
};
|
||
return createVNode(PanelBody, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"rowNum": DECADE_ROW_COUNT,
|
||
"colNum": DECADE_COL_COUNT,
|
||
"baseDate": baseDecadeYear,
|
||
"getCellText": (date) => {
|
||
const startDecadeNumber = generateConfig2.getYear(date);
|
||
return `${startDecadeNumber}-${startDecadeNumber + DECADE_UNIT_DIFF_DES}`;
|
||
},
|
||
"getCellClassName": getCellClassName,
|
||
"getCellDate": (date, offset) => generateConfig2.addYear(date, offset * DECADE_UNIT_DIFF)
|
||
}), null);
|
||
}
|
||
DecadeBody.displayName = "DecadeBody";
|
||
DecadeBody.inheritAttrs = false;
|
||
const scrollIds = /* @__PURE__ */ new Map();
|
||
function waitElementReady(element, callback) {
|
||
let id;
|
||
function tryOrNextFrame() {
|
||
if (isVisible(element)) {
|
||
callback();
|
||
} else {
|
||
id = wrapperRaf(() => {
|
||
tryOrNextFrame();
|
||
});
|
||
}
|
||
}
|
||
tryOrNextFrame();
|
||
return () => {
|
||
wrapperRaf.cancel(id);
|
||
};
|
||
}
|
||
function scrollTo(element, to, duration) {
|
||
if (scrollIds.get(element)) {
|
||
wrapperRaf.cancel(scrollIds.get(element));
|
||
}
|
||
if (duration <= 0) {
|
||
scrollIds.set(element, wrapperRaf(() => {
|
||
element.scrollTop = to;
|
||
}));
|
||
return;
|
||
}
|
||
const difference = to - element.scrollTop;
|
||
const perTick = difference / duration * 10;
|
||
scrollIds.set(element, wrapperRaf(() => {
|
||
element.scrollTop += perTick;
|
||
if (element.scrollTop !== to) {
|
||
scrollTo(element, to, duration - 10);
|
||
}
|
||
}));
|
||
}
|
||
function createKeydownHandler(event, _ref) {
|
||
let {
|
||
onLeftRight,
|
||
onCtrlLeftRight,
|
||
onUpDown,
|
||
onPageUpDown,
|
||
onEnter
|
||
} = _ref;
|
||
const {
|
||
which,
|
||
ctrlKey,
|
||
metaKey
|
||
} = event;
|
||
switch (which) {
|
||
case KeyCode.LEFT:
|
||
if (ctrlKey || metaKey) {
|
||
if (onCtrlLeftRight) {
|
||
onCtrlLeftRight(-1);
|
||
return true;
|
||
}
|
||
} else if (onLeftRight) {
|
||
onLeftRight(-1);
|
||
return true;
|
||
}
|
||
break;
|
||
case KeyCode.RIGHT:
|
||
if (ctrlKey || metaKey) {
|
||
if (onCtrlLeftRight) {
|
||
onCtrlLeftRight(1);
|
||
return true;
|
||
}
|
||
} else if (onLeftRight) {
|
||
onLeftRight(1);
|
||
return true;
|
||
}
|
||
break;
|
||
case KeyCode.UP:
|
||
if (onUpDown) {
|
||
onUpDown(-1);
|
||
return true;
|
||
}
|
||
break;
|
||
case KeyCode.DOWN:
|
||
if (onUpDown) {
|
||
onUpDown(1);
|
||
return true;
|
||
}
|
||
break;
|
||
case KeyCode.PAGE_UP:
|
||
if (onPageUpDown) {
|
||
onPageUpDown(-1);
|
||
return true;
|
||
}
|
||
break;
|
||
case KeyCode.PAGE_DOWN:
|
||
if (onPageUpDown) {
|
||
onPageUpDown(1);
|
||
return true;
|
||
}
|
||
break;
|
||
case KeyCode.ENTER:
|
||
if (onEnter) {
|
||
onEnter();
|
||
return true;
|
||
}
|
||
break;
|
||
}
|
||
return false;
|
||
}
|
||
function getDefaultFormat(format, picker, showTime, use12Hours) {
|
||
let mergedFormat = format;
|
||
if (!mergedFormat) {
|
||
switch (picker) {
|
||
case "time":
|
||
mergedFormat = use12Hours ? "hh:mm:ss a" : "HH:mm:ss";
|
||
break;
|
||
case "week":
|
||
mergedFormat = "gggg-wo";
|
||
break;
|
||
case "month":
|
||
mergedFormat = "YYYY-MM";
|
||
break;
|
||
case "quarter":
|
||
mergedFormat = "YYYY-[Q]Q";
|
||
break;
|
||
case "year":
|
||
mergedFormat = "YYYY";
|
||
break;
|
||
default:
|
||
mergedFormat = showTime ? "YYYY-MM-DD HH:mm:ss" : "YYYY-MM-DD";
|
||
}
|
||
}
|
||
return mergedFormat;
|
||
}
|
||
function getInputSize(picker, format, generateConfig2) {
|
||
const defaultSize = picker === "time" ? 8 : 10;
|
||
const length = typeof format === "function" ? format(generateConfig2.getNow()).length : format.length;
|
||
return Math.max(defaultSize, length) + 2;
|
||
}
|
||
const getYearNextMode = (next) => {
|
||
if (next === "month" || next === "date") {
|
||
return "year";
|
||
}
|
||
return next;
|
||
};
|
||
const getMonthNextMode = (next) => {
|
||
if (next === "date") {
|
||
return "month";
|
||
}
|
||
return next;
|
||
};
|
||
const getQuarterNextMode = (next) => {
|
||
if (next === "month" || next === "date") {
|
||
return "quarter";
|
||
}
|
||
return next;
|
||
};
|
||
const getWeekNextMode = (next) => {
|
||
if (next === "date") {
|
||
return "week";
|
||
}
|
||
return next;
|
||
};
|
||
const PickerModeMap = {
|
||
year: getYearNextMode,
|
||
month: getMonthNextMode,
|
||
quarter: getQuarterNextMode,
|
||
week: getWeekNextMode,
|
||
time: null,
|
||
date: null
|
||
};
|
||
function elementsContains(elements, target) {
|
||
return elements.some((ele) => ele && ele.contains(target));
|
||
}
|
||
const DECADE_UNIT_DIFF = 10;
|
||
const DECADE_DISTANCE_COUNT = DECADE_UNIT_DIFF * 10;
|
||
function DecadePanel(_props) {
|
||
const props = useMergeProps(_props);
|
||
const {
|
||
prefixCls,
|
||
onViewDateChange,
|
||
generateConfig: generateConfig2,
|
||
viewDate,
|
||
operationRef,
|
||
onSelect,
|
||
onPanelChange
|
||
} = props;
|
||
const panelPrefixCls = `${prefixCls}-decade-panel`;
|
||
operationRef.value = {
|
||
onKeydown: (event) => createKeydownHandler(event, {
|
||
onLeftRight: (diff) => {
|
||
onSelect(generateConfig2.addYear(viewDate, diff * DECADE_UNIT_DIFF), "key");
|
||
},
|
||
onCtrlLeftRight: (diff) => {
|
||
onSelect(generateConfig2.addYear(viewDate, diff * DECADE_DISTANCE_COUNT), "key");
|
||
},
|
||
onUpDown: (diff) => {
|
||
onSelect(generateConfig2.addYear(viewDate, diff * DECADE_UNIT_DIFF * DECADE_COL_COUNT), "key");
|
||
},
|
||
onEnter: () => {
|
||
onPanelChange("year", viewDate);
|
||
}
|
||
})
|
||
};
|
||
const onDecadesChange = (diff) => {
|
||
const newDate = generateConfig2.addYear(viewDate, diff * DECADE_DISTANCE_COUNT);
|
||
onViewDateChange(newDate);
|
||
onPanelChange(null, newDate);
|
||
};
|
||
const onInternalSelect = (date) => {
|
||
onSelect(date, "mouse");
|
||
onPanelChange("year", date);
|
||
};
|
||
return createVNode("div", {
|
||
"class": panelPrefixCls
|
||
}, [createVNode(DecadeHeader, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"prefixCls": prefixCls,
|
||
"onPrevDecades": () => {
|
||
onDecadesChange(-1);
|
||
},
|
||
"onNextDecades": () => {
|
||
onDecadesChange(1);
|
||
}
|
||
}), null), createVNode(DecadeBody, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"prefixCls": prefixCls,
|
||
"onSelect": onInternalSelect
|
||
}), null)]);
|
||
}
|
||
DecadePanel.displayName = "DecadePanel";
|
||
DecadePanel.inheritAttrs = false;
|
||
const WEEK_DAY_COUNT = 7;
|
||
function isNullEqual(value1, value2) {
|
||
if (!value1 && !value2) {
|
||
return true;
|
||
}
|
||
if (!value1 || !value2) {
|
||
return false;
|
||
}
|
||
return void 0;
|
||
}
|
||
function isSameDecade(generateConfig2, decade1, decade2) {
|
||
const equal = isNullEqual(decade1, decade2);
|
||
if (typeof equal === "boolean") {
|
||
return equal;
|
||
}
|
||
const num1 = Math.floor(generateConfig2.getYear(decade1) / 10);
|
||
const num2 = Math.floor(generateConfig2.getYear(decade2) / 10);
|
||
return num1 === num2;
|
||
}
|
||
function isSameYear(generateConfig2, year1, year2) {
|
||
const equal = isNullEqual(year1, year2);
|
||
if (typeof equal === "boolean") {
|
||
return equal;
|
||
}
|
||
return generateConfig2.getYear(year1) === generateConfig2.getYear(year2);
|
||
}
|
||
function getQuarter(generateConfig2, date) {
|
||
const quota = Math.floor(generateConfig2.getMonth(date) / 3);
|
||
return quota + 1;
|
||
}
|
||
function isSameQuarter(generateConfig2, quarter1, quarter2) {
|
||
const equal = isNullEqual(quarter1, quarter2);
|
||
if (typeof equal === "boolean") {
|
||
return equal;
|
||
}
|
||
return isSameYear(generateConfig2, quarter1, quarter2) && getQuarter(generateConfig2, quarter1) === getQuarter(generateConfig2, quarter2);
|
||
}
|
||
function isSameMonth(generateConfig2, month1, month2) {
|
||
const equal = isNullEqual(month1, month2);
|
||
if (typeof equal === "boolean") {
|
||
return equal;
|
||
}
|
||
return isSameYear(generateConfig2, month1, month2) && generateConfig2.getMonth(month1) === generateConfig2.getMonth(month2);
|
||
}
|
||
function isSameDate(generateConfig2, date1, date2) {
|
||
const equal = isNullEqual(date1, date2);
|
||
if (typeof equal === "boolean") {
|
||
return equal;
|
||
}
|
||
return generateConfig2.getYear(date1) === generateConfig2.getYear(date2) && generateConfig2.getMonth(date1) === generateConfig2.getMonth(date2) && generateConfig2.getDate(date1) === generateConfig2.getDate(date2);
|
||
}
|
||
function isSameTime(generateConfig2, time1, time2) {
|
||
const equal = isNullEqual(time1, time2);
|
||
if (typeof equal === "boolean") {
|
||
return equal;
|
||
}
|
||
return generateConfig2.getHour(time1) === generateConfig2.getHour(time2) && generateConfig2.getMinute(time1) === generateConfig2.getMinute(time2) && generateConfig2.getSecond(time1) === generateConfig2.getSecond(time2);
|
||
}
|
||
function isSameWeek(generateConfig2, locale2, date1, date2) {
|
||
const equal = isNullEqual(date1, date2);
|
||
if (typeof equal === "boolean") {
|
||
return equal;
|
||
}
|
||
return generateConfig2.locale.getWeek(locale2, date1) === generateConfig2.locale.getWeek(locale2, date2);
|
||
}
|
||
function isEqual(generateConfig2, value1, value2) {
|
||
return isSameDate(generateConfig2, value1, value2) && isSameTime(generateConfig2, value1, value2);
|
||
}
|
||
function isInRange(generateConfig2, startDate, endDate, current) {
|
||
if (!startDate || !endDate || !current) {
|
||
return false;
|
||
}
|
||
return !isSameDate(generateConfig2, startDate, current) && !isSameDate(generateConfig2, endDate, current) && generateConfig2.isAfter(current, startDate) && generateConfig2.isAfter(endDate, current);
|
||
}
|
||
function getWeekStartDate(locale2, generateConfig2, value) {
|
||
const weekFirstDay = generateConfig2.locale.getWeekFirstDay(locale2);
|
||
const monthStartDate = generateConfig2.setDate(value, 1);
|
||
const startDateWeekDay = generateConfig2.getWeekDay(monthStartDate);
|
||
let alignStartDate = generateConfig2.addDate(monthStartDate, weekFirstDay - startDateWeekDay);
|
||
if (generateConfig2.getMonth(alignStartDate) === generateConfig2.getMonth(value) && generateConfig2.getDate(alignStartDate) > 1) {
|
||
alignStartDate = generateConfig2.addDate(alignStartDate, -7);
|
||
}
|
||
return alignStartDate;
|
||
}
|
||
function getClosingViewDate(viewDate, picker, generateConfig2) {
|
||
let offset = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : 1;
|
||
switch (picker) {
|
||
case "year":
|
||
return generateConfig2.addYear(viewDate, offset * 10);
|
||
case "quarter":
|
||
case "month":
|
||
return generateConfig2.addYear(viewDate, offset);
|
||
default:
|
||
return generateConfig2.addMonth(viewDate, offset);
|
||
}
|
||
}
|
||
function formatValue(value, _ref) {
|
||
let {
|
||
generateConfig: generateConfig2,
|
||
locale: locale2,
|
||
format
|
||
} = _ref;
|
||
return typeof format === "function" ? format(value) : generateConfig2.locale.format(locale2.locale, value, format);
|
||
}
|
||
function parseValue(value, _ref2) {
|
||
let {
|
||
generateConfig: generateConfig2,
|
||
locale: locale2,
|
||
formatList
|
||
} = _ref2;
|
||
if (!value || typeof formatList[0] === "function") {
|
||
return null;
|
||
}
|
||
return generateConfig2.locale.parse(locale2.locale, value, formatList);
|
||
}
|
||
function getCellDateDisabled(_ref3) {
|
||
let {
|
||
cellDate,
|
||
mode,
|
||
disabledDate,
|
||
generateConfig: generateConfig2
|
||
} = _ref3;
|
||
if (!disabledDate) return false;
|
||
const getDisabledFromRange = (currentMode, start, end) => {
|
||
let current = start;
|
||
while (current <= end) {
|
||
let date;
|
||
switch (currentMode) {
|
||
case "date": {
|
||
date = generateConfig2.setDate(cellDate, current);
|
||
if (!disabledDate(date)) {
|
||
return false;
|
||
}
|
||
break;
|
||
}
|
||
case "month": {
|
||
date = generateConfig2.setMonth(cellDate, current);
|
||
if (!getCellDateDisabled({
|
||
cellDate: date,
|
||
mode: "month",
|
||
generateConfig: generateConfig2,
|
||
disabledDate
|
||
})) {
|
||
return false;
|
||
}
|
||
break;
|
||
}
|
||
case "year": {
|
||
date = generateConfig2.setYear(cellDate, current);
|
||
if (!getCellDateDisabled({
|
||
cellDate: date,
|
||
mode: "year",
|
||
generateConfig: generateConfig2,
|
||
disabledDate
|
||
})) {
|
||
return false;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
current += 1;
|
||
}
|
||
return true;
|
||
};
|
||
switch (mode) {
|
||
case "date":
|
||
case "week": {
|
||
return disabledDate(cellDate);
|
||
}
|
||
case "month": {
|
||
const startDate = 1;
|
||
const endDate = generateConfig2.getDate(generateConfig2.getEndDate(cellDate));
|
||
return getDisabledFromRange("date", startDate, endDate);
|
||
}
|
||
case "quarter": {
|
||
const startMonth = Math.floor(generateConfig2.getMonth(cellDate) / 3) * 3;
|
||
const endMonth = startMonth + 2;
|
||
return getDisabledFromRange("month", startMonth, endMonth);
|
||
}
|
||
case "year": {
|
||
return getDisabledFromRange("month", 0, 11);
|
||
}
|
||
case "decade": {
|
||
const year = generateConfig2.getYear(cellDate);
|
||
const startYear = Math.floor(year / DECADE_UNIT_DIFF) * DECADE_UNIT_DIFF;
|
||
const endYear = startYear + DECADE_UNIT_DIFF - 1;
|
||
return getDisabledFromRange("year", startYear, endYear);
|
||
}
|
||
}
|
||
}
|
||
function TimeHeader(_props) {
|
||
const props = useMergeProps(_props);
|
||
const {
|
||
hideHeader
|
||
} = useInjectPanel();
|
||
if (hideHeader.value) {
|
||
return null;
|
||
}
|
||
const {
|
||
prefixCls,
|
||
generateConfig: generateConfig2,
|
||
locale: locale2,
|
||
value,
|
||
format
|
||
} = props;
|
||
const headerPrefixCls = `${prefixCls}-header`;
|
||
return createVNode(Header, {
|
||
"prefixCls": headerPrefixCls
|
||
}, {
|
||
default: () => [value ? formatValue(value, {
|
||
locale: locale2,
|
||
format,
|
||
generateConfig: generateConfig2
|
||
}) : "\xA0"]
|
||
});
|
||
}
|
||
TimeHeader.displayName = "TimeHeader";
|
||
TimeHeader.inheritAttrs = false;
|
||
const TimeUnitColumn = defineComponent({
|
||
name: "TimeUnitColumn",
|
||
props: ["prefixCls", "units", "onSelect", "value", "active", "hideDisabledOptions"],
|
||
setup(props) {
|
||
const {
|
||
open
|
||
} = useInjectPanel();
|
||
const ulRef = shallowRef(null);
|
||
const liRefs = ref(/* @__PURE__ */ new Map());
|
||
const scrollRef = ref();
|
||
watch(() => props.value, () => {
|
||
const li = liRefs.value.get(props.value);
|
||
if (li && open.value !== false) {
|
||
scrollTo(ulRef.value, li.offsetTop, 120);
|
||
}
|
||
});
|
||
watch(open, () => {
|
||
var _a;
|
||
(_a = scrollRef.value) === null || _a === void 0 ? void 0 : _a.call(scrollRef);
|
||
nextTick(() => {
|
||
if (open.value) {
|
||
const li = liRefs.value.get(props.value);
|
||
if (li) {
|
||
scrollRef.value = waitElementReady(li, () => {
|
||
scrollTo(ulRef.value, li.offsetTop, 0);
|
||
});
|
||
}
|
||
}
|
||
});
|
||
}, {
|
||
immediate: true,
|
||
flush: "post"
|
||
});
|
||
return () => {
|
||
const {
|
||
prefixCls,
|
||
units,
|
||
onSelect,
|
||
value,
|
||
active,
|
||
hideDisabledOptions
|
||
} = props;
|
||
const cellPrefixCls = `${prefixCls}-cell`;
|
||
return createVNode("ul", {
|
||
"class": classNames(`${prefixCls}-column`, {
|
||
[`${prefixCls}-column-active`]: active
|
||
}),
|
||
"ref": ulRef,
|
||
"style": {
|
||
position: "relative"
|
||
}
|
||
}, [units.map((unit) => {
|
||
if (hideDisabledOptions && unit.disabled) {
|
||
return null;
|
||
}
|
||
return createVNode("li", {
|
||
"key": unit.value,
|
||
"ref": (element) => {
|
||
liRefs.value.set(unit.value, element);
|
||
},
|
||
"class": classNames(cellPrefixCls, {
|
||
[`${cellPrefixCls}-disabled`]: unit.disabled,
|
||
[`${cellPrefixCls}-selected`]: value === unit.value
|
||
}),
|
||
"onClick": () => {
|
||
if (unit.disabled) {
|
||
return;
|
||
}
|
||
onSelect(unit.value);
|
||
}
|
||
}, [createVNode("div", {
|
||
"class": `${cellPrefixCls}-inner`
|
||
}, [unit.label])]);
|
||
})]);
|
||
};
|
||
}
|
||
});
|
||
function leftPad(str, length) {
|
||
let fill = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "0";
|
||
let current = String(str);
|
||
while (current.length < length) {
|
||
current = `${fill}${str}`;
|
||
}
|
||
return current;
|
||
}
|
||
const tuple = function() {
|
||
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
||
args[_key] = arguments[_key];
|
||
}
|
||
return args;
|
||
};
|
||
function toArray$1(val) {
|
||
if (val === null || val === void 0) {
|
||
return [];
|
||
}
|
||
return Array.isArray(val) ? val : [val];
|
||
}
|
||
function getDataOrAriaProps(props) {
|
||
const retProps = {};
|
||
Object.keys(props).forEach((key) => {
|
||
if ((key.startsWith("data-") || key.startsWith("aria-") || key === "role" || key === "name") && !key.startsWith("data-__")) {
|
||
retProps[key] = props[key];
|
||
}
|
||
});
|
||
return retProps;
|
||
}
|
||
function getValue(values, index) {
|
||
return values ? values[index] : null;
|
||
}
|
||
function updateValues(values, value, index) {
|
||
const newValues = [getValue(values, 0), getValue(values, 1)];
|
||
newValues[index] = typeof value === "function" ? value(newValues[index]) : value;
|
||
if (!newValues[0] && !newValues[1]) {
|
||
return null;
|
||
}
|
||
return newValues;
|
||
}
|
||
function generateUnits(start, end, step, disabledUnits) {
|
||
const units = [];
|
||
for (let i = start; i <= end; i += step) {
|
||
units.push({
|
||
label: leftPad(i, 2),
|
||
value: i,
|
||
disabled: (disabledUnits || []).includes(i)
|
||
});
|
||
}
|
||
return units;
|
||
}
|
||
const TimeBody = defineComponent({
|
||
compatConfig: {
|
||
MODE: 3
|
||
},
|
||
name: "TimeBody",
|
||
inheritAttrs: false,
|
||
props: ["generateConfig", "prefixCls", "operationRef", "activeColumnIndex", "value", "showHour", "showMinute", "showSecond", "use12Hours", "hourStep", "minuteStep", "secondStep", "disabledHours", "disabledMinutes", "disabledSeconds", "disabledTime", "hideDisabledOptions", "onSelect"],
|
||
setup(props) {
|
||
const originHour = computed(() => props.value ? props.generateConfig.getHour(props.value) : -1);
|
||
const isPM = computed(() => {
|
||
if (props.use12Hours) {
|
||
return originHour.value >= 12;
|
||
} else {
|
||
return false;
|
||
}
|
||
});
|
||
const hour = computed(() => {
|
||
if (props.use12Hours) {
|
||
return originHour.value % 12;
|
||
} else {
|
||
return originHour.value;
|
||
}
|
||
});
|
||
const minute = computed(() => props.value ? props.generateConfig.getMinute(props.value) : -1);
|
||
const second = computed(() => props.value ? props.generateConfig.getSecond(props.value) : -1);
|
||
const now = ref(props.generateConfig.getNow());
|
||
const mergedDisabledHours = ref();
|
||
const mergedDisabledMinutes = ref();
|
||
const mergedDisabledSeconds = ref();
|
||
watchEffect(() => {
|
||
if (props.disabledTime) {
|
||
const disabledConfig = props.disabledTime(now);
|
||
[mergedDisabledHours.value, mergedDisabledMinutes.value, mergedDisabledSeconds.value] = [disabledConfig.disabledHours, disabledConfig.disabledMinutes, disabledConfig.disabledSeconds];
|
||
} else {
|
||
[mergedDisabledHours.value, mergedDisabledMinutes.value, mergedDisabledSeconds.value] = [props.disabledHours, props.disabledMinutes, props.disabledSeconds];
|
||
}
|
||
});
|
||
const setTime$1 = (isNewPM, newHour, newMinute, newSecond) => {
|
||
let newDate = props.value || props.generateConfig.getNow();
|
||
const mergedHour = Math.max(0, newHour);
|
||
const mergedMinute = Math.max(0, newMinute);
|
||
const mergedSecond = Math.max(0, newSecond);
|
||
newDate = setTime(props.generateConfig, newDate, !props.use12Hours || !isNewPM ? mergedHour : mergedHour + 12, mergedMinute, mergedSecond);
|
||
return newDate;
|
||
};
|
||
const rawHours = computed(() => {
|
||
var _a;
|
||
return generateUnits(0, 23, (_a = props.hourStep) !== null && _a !== void 0 ? _a : 1, mergedDisabledHours.value && mergedDisabledHours.value());
|
||
});
|
||
const AMPMDisabled = computed(() => {
|
||
if (!props.use12Hours) {
|
||
return [false, false];
|
||
}
|
||
const AMPMDisabled2 = [true, true];
|
||
rawHours.value.forEach((_ref) => {
|
||
let {
|
||
disabled,
|
||
value: hourValue
|
||
} = _ref;
|
||
if (disabled) return;
|
||
if (hourValue >= 12) {
|
||
AMPMDisabled2[1] = false;
|
||
} else {
|
||
AMPMDisabled2[0] = false;
|
||
}
|
||
});
|
||
return AMPMDisabled2;
|
||
});
|
||
const hours = computed(() => {
|
||
if (!props.use12Hours) return rawHours.value;
|
||
return rawHours.value.filter(isPM.value ? (hourMeta) => hourMeta.value >= 12 : (hourMeta) => hourMeta.value < 12).map((hourMeta) => {
|
||
const hourValue = hourMeta.value % 12;
|
||
const hourLabel = hourValue === 0 ? "12" : leftPad(hourValue, 2);
|
||
return _extends(_extends({}, hourMeta), {
|
||
label: hourLabel,
|
||
value: hourValue
|
||
});
|
||
});
|
||
});
|
||
const minutes = computed(() => {
|
||
var _a;
|
||
return generateUnits(0, 59, (_a = props.minuteStep) !== null && _a !== void 0 ? _a : 1, mergedDisabledMinutes.value && mergedDisabledMinutes.value(originHour.value));
|
||
});
|
||
const seconds = computed(() => {
|
||
var _a;
|
||
return generateUnits(0, 59, (_a = props.secondStep) !== null && _a !== void 0 ? _a : 1, mergedDisabledSeconds.value && mergedDisabledSeconds.value(originHour.value, minute.value));
|
||
});
|
||
return () => {
|
||
const {
|
||
prefixCls,
|
||
operationRef,
|
||
activeColumnIndex,
|
||
showHour,
|
||
showMinute,
|
||
showSecond,
|
||
use12Hours,
|
||
hideDisabledOptions,
|
||
onSelect
|
||
} = props;
|
||
const columns = [];
|
||
const contentPrefixCls = `${prefixCls}-content`;
|
||
const columnPrefixCls = `${prefixCls}-time-panel`;
|
||
operationRef.value = {
|
||
onUpDown: (diff) => {
|
||
const column = columns[activeColumnIndex];
|
||
if (column) {
|
||
const valueIndex = column.units.findIndex((unit) => unit.value === column.value);
|
||
const unitLen = column.units.length;
|
||
for (let i = 1; i < unitLen; i += 1) {
|
||
const nextUnit = column.units[(valueIndex + diff * i + unitLen) % unitLen];
|
||
if (nextUnit.disabled !== true) {
|
||
column.onSelect(nextUnit.value);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
function addColumnNode(condition, node, columnValue, units, onColumnSelect) {
|
||
if (condition !== false) {
|
||
columns.push({
|
||
node: cloneElement(node, {
|
||
prefixCls: columnPrefixCls,
|
||
value: columnValue,
|
||
active: activeColumnIndex === columns.length,
|
||
onSelect: onColumnSelect,
|
||
units,
|
||
hideDisabledOptions
|
||
}),
|
||
onSelect: onColumnSelect,
|
||
value: columnValue,
|
||
units
|
||
});
|
||
}
|
||
}
|
||
addColumnNode(showHour, createVNode(TimeUnitColumn, {
|
||
"key": "hour"
|
||
}, null), hour.value, hours.value, (num) => {
|
||
onSelect(setTime$1(isPM.value, num, minute.value, second.value), "mouse");
|
||
});
|
||
addColumnNode(showMinute, createVNode(TimeUnitColumn, {
|
||
"key": "minute"
|
||
}, null), minute.value, minutes.value, (num) => {
|
||
onSelect(setTime$1(isPM.value, hour.value, num, second.value), "mouse");
|
||
});
|
||
addColumnNode(showSecond, createVNode(TimeUnitColumn, {
|
||
"key": "second"
|
||
}, null), second.value, seconds.value, (num) => {
|
||
onSelect(setTime$1(isPM.value, hour.value, minute.value, num), "mouse");
|
||
});
|
||
let PMIndex = -1;
|
||
if (typeof isPM.value === "boolean") {
|
||
PMIndex = isPM.value ? 1 : 0;
|
||
}
|
||
addColumnNode(use12Hours === true, createVNode(TimeUnitColumn, {
|
||
"key": "12hours"
|
||
}, null), PMIndex, [{
|
||
label: "AM",
|
||
value: 0,
|
||
disabled: AMPMDisabled.value[0]
|
||
}, {
|
||
label: "PM",
|
||
value: 1,
|
||
disabled: AMPMDisabled.value[1]
|
||
}], (num) => {
|
||
onSelect(setTime$1(!!num, hour.value, minute.value, second.value), "mouse");
|
||
});
|
||
return createVNode("div", {
|
||
"class": contentPrefixCls
|
||
}, [columns.map((_ref2) => {
|
||
let {
|
||
node
|
||
} = _ref2;
|
||
return node;
|
||
})]);
|
||
};
|
||
}
|
||
});
|
||
const countBoolean = (boolList) => boolList.filter((bool) => bool !== false).length;
|
||
function TimePanel(_props) {
|
||
const props = useMergeProps(_props);
|
||
const {
|
||
generateConfig: generateConfig2,
|
||
format = "HH:mm:ss",
|
||
prefixCls,
|
||
active,
|
||
operationRef,
|
||
showHour,
|
||
showMinute,
|
||
showSecond,
|
||
use12Hours = false,
|
||
onSelect,
|
||
value
|
||
} = props;
|
||
const panelPrefixCls = `${prefixCls}-time-panel`;
|
||
const bodyOperationRef = ref();
|
||
const activeColumnIndex = ref(-1);
|
||
const columnsCount = countBoolean([showHour, showMinute, showSecond, use12Hours]);
|
||
operationRef.value = {
|
||
onKeydown: (event) => createKeydownHandler(event, {
|
||
onLeftRight: (diff) => {
|
||
activeColumnIndex.value = (activeColumnIndex.value + diff + columnsCount) % columnsCount;
|
||
},
|
||
onUpDown: (diff) => {
|
||
if (activeColumnIndex.value === -1) {
|
||
activeColumnIndex.value = 0;
|
||
} else if (bodyOperationRef.value) {
|
||
bodyOperationRef.value.onUpDown(diff);
|
||
}
|
||
},
|
||
onEnter: () => {
|
||
onSelect(value || generateConfig2.getNow(), "key");
|
||
activeColumnIndex.value = -1;
|
||
}
|
||
}),
|
||
onBlur: () => {
|
||
activeColumnIndex.value = -1;
|
||
}
|
||
};
|
||
return createVNode("div", {
|
||
"class": classNames(panelPrefixCls, {
|
||
[`${panelPrefixCls}-active`]: active
|
||
})
|
||
}, [createVNode(TimeHeader, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"format": format,
|
||
"prefixCls": prefixCls
|
||
}), null), createVNode(TimeBody, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"prefixCls": prefixCls,
|
||
"activeColumnIndex": activeColumnIndex.value,
|
||
"operationRef": bodyOperationRef
|
||
}), null)]);
|
||
}
|
||
TimePanel.displayName = "TimePanel";
|
||
TimePanel.inheritAttrs = false;
|
||
function useCellClassName(_ref) {
|
||
let {
|
||
cellPrefixCls,
|
||
generateConfig: generateConfig2,
|
||
rangedValue,
|
||
hoverRangedValue,
|
||
isInView,
|
||
isSameCell,
|
||
offsetCell,
|
||
today,
|
||
value
|
||
} = _ref;
|
||
function getClassName(currentDate) {
|
||
const prevDate = offsetCell(currentDate, -1);
|
||
const nextDate = offsetCell(currentDate, 1);
|
||
const rangeStart = getValue(rangedValue, 0);
|
||
const rangeEnd = getValue(rangedValue, 1);
|
||
const hoverStart = getValue(hoverRangedValue, 0);
|
||
const hoverEnd = getValue(hoverRangedValue, 1);
|
||
const isRangeHovered = isInRange(generateConfig2, hoverStart, hoverEnd, currentDate);
|
||
function isRangeStart(date) {
|
||
return isSameCell(rangeStart, date);
|
||
}
|
||
function isRangeEnd(date) {
|
||
return isSameCell(rangeEnd, date);
|
||
}
|
||
const isHoverStart = isSameCell(hoverStart, currentDate);
|
||
const isHoverEnd = isSameCell(hoverEnd, currentDate);
|
||
const isHoverEdgeStart = (isRangeHovered || isHoverEnd) && (!isInView(prevDate) || isRangeEnd(prevDate));
|
||
const isHoverEdgeEnd = (isRangeHovered || isHoverStart) && (!isInView(nextDate) || isRangeStart(nextDate));
|
||
return {
|
||
// In view
|
||
[`${cellPrefixCls}-in-view`]: isInView(currentDate),
|
||
// Range
|
||
[`${cellPrefixCls}-in-range`]: isInRange(generateConfig2, rangeStart, rangeEnd, currentDate),
|
||
[`${cellPrefixCls}-range-start`]: isRangeStart(currentDate),
|
||
[`${cellPrefixCls}-range-end`]: isRangeEnd(currentDate),
|
||
[`${cellPrefixCls}-range-start-single`]: isRangeStart(currentDate) && !rangeEnd,
|
||
[`${cellPrefixCls}-range-end-single`]: isRangeEnd(currentDate) && !rangeStart,
|
||
[`${cellPrefixCls}-range-start-near-hover`]: isRangeStart(currentDate) && (isSameCell(prevDate, hoverStart) || isInRange(generateConfig2, hoverStart, hoverEnd, prevDate)),
|
||
[`${cellPrefixCls}-range-end-near-hover`]: isRangeEnd(currentDate) && (isSameCell(nextDate, hoverEnd) || isInRange(generateConfig2, hoverStart, hoverEnd, nextDate)),
|
||
// Range Hover
|
||
[`${cellPrefixCls}-range-hover`]: isRangeHovered,
|
||
[`${cellPrefixCls}-range-hover-start`]: isHoverStart,
|
||
[`${cellPrefixCls}-range-hover-end`]: isHoverEnd,
|
||
// Range Edge
|
||
[`${cellPrefixCls}-range-hover-edge-start`]: isHoverEdgeStart,
|
||
[`${cellPrefixCls}-range-hover-edge-end`]: isHoverEdgeEnd,
|
||
[`${cellPrefixCls}-range-hover-edge-start-near-range`]: isHoverEdgeStart && isSameCell(prevDate, rangeEnd),
|
||
[`${cellPrefixCls}-range-hover-edge-end-near-range`]: isHoverEdgeEnd && isSameCell(nextDate, rangeStart),
|
||
// Others
|
||
[`${cellPrefixCls}-today`]: isSameCell(today, currentDate),
|
||
[`${cellPrefixCls}-selected`]: isSameCell(value, currentDate)
|
||
};
|
||
}
|
||
return getClassName;
|
||
}
|
||
const RangeContextKey = Symbol("RangeContextProps");
|
||
const useProvideRange = (props) => {
|
||
provide(RangeContextKey, props);
|
||
};
|
||
const useInjectRange = () => {
|
||
return inject(RangeContextKey, {
|
||
rangedValue: ref(),
|
||
hoverRangedValue: ref(),
|
||
inRange: ref(),
|
||
panelPosition: ref()
|
||
});
|
||
};
|
||
const RangeContextProvider = defineComponent({
|
||
compatConfig: {
|
||
MODE: 3
|
||
},
|
||
name: "PanelContextProvider",
|
||
inheritAttrs: false,
|
||
props: {
|
||
value: {
|
||
type: Object,
|
||
default: () => ({})
|
||
}
|
||
},
|
||
setup(props, _ref) {
|
||
let {
|
||
slots
|
||
} = _ref;
|
||
const value = {
|
||
rangedValue: ref(props.value.rangedValue),
|
||
hoverRangedValue: ref(props.value.hoverRangedValue),
|
||
inRange: ref(props.value.inRange),
|
||
panelPosition: ref(props.value.panelPosition)
|
||
};
|
||
useProvideRange(value);
|
||
watch(() => props.value, () => {
|
||
Object.keys(props.value).forEach((key) => {
|
||
if (value[key]) {
|
||
value[key].value = props.value[key];
|
||
}
|
||
});
|
||
});
|
||
return () => {
|
||
var _a;
|
||
return (_a = slots.default) === null || _a === void 0 ? void 0 : _a.call(slots);
|
||
};
|
||
}
|
||
});
|
||
function DateBody(_props) {
|
||
const props = useMergeProps(_props);
|
||
const {
|
||
prefixCls,
|
||
generateConfig: generateConfig2,
|
||
prefixColumn,
|
||
locale: locale2,
|
||
rowCount,
|
||
viewDate,
|
||
value,
|
||
dateRender
|
||
} = props;
|
||
const {
|
||
rangedValue,
|
||
hoverRangedValue
|
||
} = useInjectRange();
|
||
const baseDate = getWeekStartDate(locale2.locale, generateConfig2, viewDate);
|
||
const cellPrefixCls = `${prefixCls}-cell`;
|
||
const weekFirstDay = generateConfig2.locale.getWeekFirstDay(locale2.locale);
|
||
const today = generateConfig2.getNow();
|
||
const headerCells = [];
|
||
const weekDaysLocale = locale2.shortWeekDays || (generateConfig2.locale.getShortWeekDays ? generateConfig2.locale.getShortWeekDays(locale2.locale) : []);
|
||
if (prefixColumn) {
|
||
headerCells.push(createVNode("th", {
|
||
"key": "empty",
|
||
"aria-label": "empty cell"
|
||
}, null));
|
||
}
|
||
for (let i = 0; i < WEEK_DAY_COUNT; i += 1) {
|
||
headerCells.push(createVNode("th", {
|
||
"key": i
|
||
}, [weekDaysLocale[(i + weekFirstDay) % WEEK_DAY_COUNT]]));
|
||
}
|
||
const getCellClassName = useCellClassName({
|
||
cellPrefixCls,
|
||
today,
|
||
value,
|
||
generateConfig: generateConfig2,
|
||
rangedValue: prefixColumn ? null : rangedValue.value,
|
||
hoverRangedValue: prefixColumn ? null : hoverRangedValue.value,
|
||
isSameCell: (current, target) => isSameDate(generateConfig2, current, target),
|
||
isInView: (date) => isSameMonth(generateConfig2, date, viewDate),
|
||
offsetCell: (date, offset) => generateConfig2.addDate(date, offset)
|
||
});
|
||
const getCellNode = dateRender ? (date) => dateRender({
|
||
current: date,
|
||
today
|
||
}) : void 0;
|
||
return createVNode(PanelBody, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"rowNum": rowCount,
|
||
"colNum": WEEK_DAY_COUNT,
|
||
"baseDate": baseDate,
|
||
"getCellNode": getCellNode,
|
||
"getCellText": generateConfig2.getDate,
|
||
"getCellClassName": getCellClassName,
|
||
"getCellDate": generateConfig2.addDate,
|
||
"titleCell": (date) => formatValue(date, {
|
||
locale: locale2,
|
||
format: "YYYY-MM-DD",
|
||
generateConfig: generateConfig2
|
||
}),
|
||
"headerCells": headerCells
|
||
}), null);
|
||
}
|
||
DateBody.displayName = "DateBody";
|
||
DateBody.inheritAttrs = false;
|
||
DateBody.props = [
|
||
"prefixCls",
|
||
"generateConfig",
|
||
"value?",
|
||
"viewDate",
|
||
"locale",
|
||
"rowCount",
|
||
"onSelect",
|
||
"dateRender?",
|
||
"disabledDate?",
|
||
// Used for week panel
|
||
"prefixColumn?",
|
||
"rowClassName?"
|
||
];
|
||
function DateHeader(_props) {
|
||
const props = useMergeProps(_props);
|
||
const {
|
||
prefixCls,
|
||
generateConfig: generateConfig2,
|
||
locale: locale2,
|
||
viewDate,
|
||
onNextMonth,
|
||
onPrevMonth,
|
||
onNextYear,
|
||
onPrevYear,
|
||
onYearClick,
|
||
onMonthClick
|
||
} = props;
|
||
const {
|
||
hideHeader
|
||
} = useInjectPanel();
|
||
if (hideHeader.value) {
|
||
return null;
|
||
}
|
||
const headerPrefixCls = `${prefixCls}-header`;
|
||
const monthsLocale = locale2.shortMonths || (generateConfig2.locale.getShortMonths ? generateConfig2.locale.getShortMonths(locale2.locale) : []);
|
||
const month = generateConfig2.getMonth(viewDate);
|
||
const yearNode = createVNode("button", {
|
||
"type": "button",
|
||
"key": "year",
|
||
"onClick": onYearClick,
|
||
"tabindex": -1,
|
||
"class": `${prefixCls}-year-btn`
|
||
}, [formatValue(viewDate, {
|
||
locale: locale2,
|
||
format: locale2.yearFormat,
|
||
generateConfig: generateConfig2
|
||
})]);
|
||
const monthNode = createVNode("button", {
|
||
"type": "button",
|
||
"key": "month",
|
||
"onClick": onMonthClick,
|
||
"tabindex": -1,
|
||
"class": `${prefixCls}-month-btn`
|
||
}, [locale2.monthFormat ? formatValue(viewDate, {
|
||
locale: locale2,
|
||
format: locale2.monthFormat,
|
||
generateConfig: generateConfig2
|
||
}) : monthsLocale[month]]);
|
||
const monthYearNodes = locale2.monthBeforeYear ? [monthNode, yearNode] : [yearNode, monthNode];
|
||
return createVNode(Header, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"prefixCls": headerPrefixCls,
|
||
"onSuperPrev": onPrevYear,
|
||
"onPrev": onPrevMonth,
|
||
"onNext": onNextMonth,
|
||
"onSuperNext": onNextYear
|
||
}), {
|
||
default: () => [monthYearNodes]
|
||
});
|
||
}
|
||
DateHeader.displayName = "DateHeader";
|
||
DateHeader.inheritAttrs = false;
|
||
const DATE_ROW_COUNT = 6;
|
||
function DatePanel(_props) {
|
||
const props = useMergeProps(_props);
|
||
const {
|
||
prefixCls,
|
||
panelName = "date",
|
||
keyboardConfig,
|
||
active,
|
||
operationRef,
|
||
generateConfig: generateConfig2,
|
||
value,
|
||
viewDate,
|
||
onViewDateChange,
|
||
onPanelChange,
|
||
onSelect
|
||
} = props;
|
||
const panelPrefixCls = `${prefixCls}-${panelName}-panel`;
|
||
operationRef.value = {
|
||
onKeydown: (event) => createKeydownHandler(event, _extends({
|
||
onLeftRight: (diff) => {
|
||
onSelect(generateConfig2.addDate(value || viewDate, diff), "key");
|
||
},
|
||
onCtrlLeftRight: (diff) => {
|
||
onSelect(generateConfig2.addYear(value || viewDate, diff), "key");
|
||
},
|
||
onUpDown: (diff) => {
|
||
onSelect(generateConfig2.addDate(value || viewDate, diff * WEEK_DAY_COUNT), "key");
|
||
},
|
||
onPageUpDown: (diff) => {
|
||
onSelect(generateConfig2.addMonth(value || viewDate, diff), "key");
|
||
}
|
||
}, keyboardConfig))
|
||
};
|
||
const onYearChange = (diff) => {
|
||
const newDate = generateConfig2.addYear(viewDate, diff);
|
||
onViewDateChange(newDate);
|
||
onPanelChange(null, newDate);
|
||
};
|
||
const onMonthChange = (diff) => {
|
||
const newDate = generateConfig2.addMonth(viewDate, diff);
|
||
onViewDateChange(newDate);
|
||
onPanelChange(null, newDate);
|
||
};
|
||
return createVNode("div", {
|
||
"class": classNames(panelPrefixCls, {
|
||
[`${panelPrefixCls}-active`]: active
|
||
})
|
||
}, [createVNode(DateHeader, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"prefixCls": prefixCls,
|
||
"value": value,
|
||
"viewDate": viewDate,
|
||
"onPrevYear": () => {
|
||
onYearChange(-1);
|
||
},
|
||
"onNextYear": () => {
|
||
onYearChange(1);
|
||
},
|
||
"onPrevMonth": () => {
|
||
onMonthChange(-1);
|
||
},
|
||
"onNextMonth": () => {
|
||
onMonthChange(1);
|
||
},
|
||
"onMonthClick": () => {
|
||
onPanelChange("month", viewDate);
|
||
},
|
||
"onYearClick": () => {
|
||
onPanelChange("year", viewDate);
|
||
}
|
||
}), null), createVNode(DateBody, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"onSelect": (date) => onSelect(date, "mouse"),
|
||
"prefixCls": prefixCls,
|
||
"value": value,
|
||
"viewDate": viewDate,
|
||
"rowCount": DATE_ROW_COUNT
|
||
}), null)]);
|
||
}
|
||
DatePanel.displayName = "DatePanel";
|
||
DatePanel.inheritAttrs = false;
|
||
const ACTIVE_PANEL = tuple("date", "time");
|
||
function DatetimePanel(_props) {
|
||
const props = useMergeProps(_props);
|
||
const {
|
||
prefixCls,
|
||
operationRef,
|
||
generateConfig: generateConfig2,
|
||
value,
|
||
defaultValue,
|
||
disabledTime,
|
||
showTime,
|
||
onSelect
|
||
} = props;
|
||
const panelPrefixCls = `${prefixCls}-datetime-panel`;
|
||
const activePanel = ref(null);
|
||
const dateOperationRef = ref({});
|
||
const timeOperationRef = ref({});
|
||
const timeProps = typeof showTime === "object" ? _extends({}, showTime) : {};
|
||
function getNextActive(offset) {
|
||
const activeIndex = ACTIVE_PANEL.indexOf(activePanel.value) + offset;
|
||
const nextActivePanel = ACTIVE_PANEL[activeIndex] || null;
|
||
return nextActivePanel;
|
||
}
|
||
const onBlur = (e) => {
|
||
if (timeOperationRef.value.onBlur) {
|
||
timeOperationRef.value.onBlur(e);
|
||
}
|
||
activePanel.value = null;
|
||
};
|
||
operationRef.value = {
|
||
onKeydown: (event) => {
|
||
if (event.which === KeyCode.TAB) {
|
||
const nextActivePanel = getNextActive(event.shiftKey ? -1 : 1);
|
||
activePanel.value = nextActivePanel;
|
||
if (nextActivePanel) {
|
||
event.preventDefault();
|
||
}
|
||
return true;
|
||
}
|
||
if (activePanel.value) {
|
||
const ref2 = activePanel.value === "date" ? dateOperationRef : timeOperationRef;
|
||
if (ref2.value && ref2.value.onKeydown) {
|
||
ref2.value.onKeydown(event);
|
||
}
|
||
return true;
|
||
}
|
||
if ([KeyCode.LEFT, KeyCode.RIGHT, KeyCode.UP, KeyCode.DOWN].includes(event.which)) {
|
||
activePanel.value = "date";
|
||
return true;
|
||
}
|
||
return false;
|
||
},
|
||
onBlur,
|
||
onClose: onBlur
|
||
};
|
||
const onInternalSelect = (date, source) => {
|
||
let selectedDate = date;
|
||
if (source === "date" && !value && timeProps.defaultValue) {
|
||
selectedDate = generateConfig2.setHour(selectedDate, generateConfig2.getHour(timeProps.defaultValue));
|
||
selectedDate = generateConfig2.setMinute(selectedDate, generateConfig2.getMinute(timeProps.defaultValue));
|
||
selectedDate = generateConfig2.setSecond(selectedDate, generateConfig2.getSecond(timeProps.defaultValue));
|
||
} else if (source === "time" && !value && defaultValue) {
|
||
selectedDate = generateConfig2.setYear(selectedDate, generateConfig2.getYear(defaultValue));
|
||
selectedDate = generateConfig2.setMonth(selectedDate, generateConfig2.getMonth(defaultValue));
|
||
selectedDate = generateConfig2.setDate(selectedDate, generateConfig2.getDate(defaultValue));
|
||
}
|
||
if (onSelect) {
|
||
onSelect(selectedDate, "mouse");
|
||
}
|
||
};
|
||
const disabledTimes = disabledTime ? disabledTime(value || null) : {};
|
||
return createVNode("div", {
|
||
"class": classNames(panelPrefixCls, {
|
||
[`${panelPrefixCls}-active`]: activePanel.value
|
||
})
|
||
}, [createVNode(DatePanel, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"operationRef": dateOperationRef,
|
||
"active": activePanel.value === "date",
|
||
"onSelect": (date) => {
|
||
onInternalSelect(setDateTime(generateConfig2, date, !value && typeof showTime === "object" ? showTime.defaultValue : null), "date");
|
||
}
|
||
}), null), createVNode(TimePanel, _objectSpread$3(_objectSpread$3(_objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"format": void 0
|
||
}, timeProps), disabledTimes), {}, {
|
||
"disabledTime": null,
|
||
"defaultValue": void 0,
|
||
"operationRef": timeOperationRef,
|
||
"active": activePanel.value === "time",
|
||
"onSelect": (date) => {
|
||
onInternalSelect(date, "time");
|
||
}
|
||
}), null)]);
|
||
}
|
||
DatetimePanel.displayName = "DatetimePanel";
|
||
DatetimePanel.inheritAttrs = false;
|
||
function WeekPanel(_props) {
|
||
const props = useMergeProps(_props);
|
||
const {
|
||
prefixCls,
|
||
generateConfig: generateConfig2,
|
||
locale: locale2,
|
||
value
|
||
} = props;
|
||
const cellPrefixCls = `${prefixCls}-cell`;
|
||
const prefixColumn = (date) => createVNode("td", {
|
||
"key": "week",
|
||
"class": classNames(cellPrefixCls, `${cellPrefixCls}-week`)
|
||
}, [generateConfig2.locale.getWeek(locale2.locale, date)]);
|
||
const rowPrefixCls = `${prefixCls}-week-panel-row`;
|
||
const rowClassName = (date) => classNames(rowPrefixCls, {
|
||
[`${rowPrefixCls}-selected`]: isSameWeek(generateConfig2, locale2.locale, value, date)
|
||
});
|
||
return createVNode(DatePanel, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"panelName": "week",
|
||
"prefixColumn": prefixColumn,
|
||
"rowClassName": rowClassName,
|
||
"keyboardConfig": {
|
||
onLeftRight: null
|
||
}
|
||
}), null);
|
||
}
|
||
WeekPanel.displayName = "WeekPanel";
|
||
WeekPanel.inheritAttrs = false;
|
||
function MonthHeader(_props) {
|
||
const props = useMergeProps(_props);
|
||
const {
|
||
prefixCls,
|
||
generateConfig: generateConfig2,
|
||
locale: locale2,
|
||
viewDate,
|
||
onNextYear,
|
||
onPrevYear,
|
||
onYearClick
|
||
} = props;
|
||
const {
|
||
hideHeader
|
||
} = useInjectPanel();
|
||
if (hideHeader.value) {
|
||
return null;
|
||
}
|
||
const headerPrefixCls = `${prefixCls}-header`;
|
||
return createVNode(Header, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"prefixCls": headerPrefixCls,
|
||
"onSuperPrev": onPrevYear,
|
||
"onSuperNext": onNextYear
|
||
}), {
|
||
default: () => [createVNode("button", {
|
||
"type": "button",
|
||
"onClick": onYearClick,
|
||
"class": `${prefixCls}-year-btn`
|
||
}, [formatValue(viewDate, {
|
||
locale: locale2,
|
||
format: locale2.yearFormat,
|
||
generateConfig: generateConfig2
|
||
})])]
|
||
});
|
||
}
|
||
MonthHeader.displayName = "MonthHeader";
|
||
MonthHeader.inheritAttrs = false;
|
||
const MONTH_COL_COUNT = 3;
|
||
const MONTH_ROW_COUNT = 4;
|
||
function MonthBody(_props) {
|
||
const props = useMergeProps(_props);
|
||
const {
|
||
prefixCls,
|
||
locale: locale2,
|
||
value,
|
||
viewDate,
|
||
generateConfig: generateConfig2,
|
||
monthCellRender
|
||
} = props;
|
||
const {
|
||
rangedValue,
|
||
hoverRangedValue
|
||
} = useInjectRange();
|
||
const cellPrefixCls = `${prefixCls}-cell`;
|
||
const getCellClassName = useCellClassName({
|
||
cellPrefixCls,
|
||
value,
|
||
generateConfig: generateConfig2,
|
||
rangedValue: rangedValue.value,
|
||
hoverRangedValue: hoverRangedValue.value,
|
||
isSameCell: (current, target) => isSameMonth(generateConfig2, current, target),
|
||
isInView: () => true,
|
||
offsetCell: (date, offset) => generateConfig2.addMonth(date, offset)
|
||
});
|
||
const monthsLocale = locale2.shortMonths || (generateConfig2.locale.getShortMonths ? generateConfig2.locale.getShortMonths(locale2.locale) : []);
|
||
const baseMonth = generateConfig2.setMonth(viewDate, 0);
|
||
const getCellNode = monthCellRender ? (date) => monthCellRender({
|
||
current: date,
|
||
locale: locale2
|
||
}) : void 0;
|
||
return createVNode(PanelBody, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"rowNum": MONTH_ROW_COUNT,
|
||
"colNum": MONTH_COL_COUNT,
|
||
"baseDate": baseMonth,
|
||
"getCellNode": getCellNode,
|
||
"getCellText": (date) => locale2.monthFormat ? formatValue(date, {
|
||
locale: locale2,
|
||
format: locale2.monthFormat,
|
||
generateConfig: generateConfig2
|
||
}) : monthsLocale[generateConfig2.getMonth(date)],
|
||
"getCellClassName": getCellClassName,
|
||
"getCellDate": generateConfig2.addMonth,
|
||
"titleCell": (date) => formatValue(date, {
|
||
locale: locale2,
|
||
format: "YYYY-MM",
|
||
generateConfig: generateConfig2
|
||
})
|
||
}), null);
|
||
}
|
||
MonthBody.displayName = "MonthBody";
|
||
MonthBody.inheritAttrs = false;
|
||
function MonthPanel(_props) {
|
||
const props = useMergeProps(_props);
|
||
const {
|
||
prefixCls,
|
||
operationRef,
|
||
onViewDateChange,
|
||
generateConfig: generateConfig2,
|
||
value,
|
||
viewDate,
|
||
onPanelChange,
|
||
onSelect
|
||
} = props;
|
||
const panelPrefixCls = `${prefixCls}-month-panel`;
|
||
operationRef.value = {
|
||
onKeydown: (event) => createKeydownHandler(event, {
|
||
onLeftRight: (diff) => {
|
||
onSelect(generateConfig2.addMonth(value || viewDate, diff), "key");
|
||
},
|
||
onCtrlLeftRight: (diff) => {
|
||
onSelect(generateConfig2.addYear(value || viewDate, diff), "key");
|
||
},
|
||
onUpDown: (diff) => {
|
||
onSelect(generateConfig2.addMonth(value || viewDate, diff * MONTH_COL_COUNT), "key");
|
||
},
|
||
onEnter: () => {
|
||
onPanelChange("date", value || viewDate);
|
||
}
|
||
})
|
||
};
|
||
const onYearChange = (diff) => {
|
||
const newDate = generateConfig2.addYear(viewDate, diff);
|
||
onViewDateChange(newDate);
|
||
onPanelChange(null, newDate);
|
||
};
|
||
return createVNode("div", {
|
||
"class": panelPrefixCls
|
||
}, [createVNode(MonthHeader, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"prefixCls": prefixCls,
|
||
"onPrevYear": () => {
|
||
onYearChange(-1);
|
||
},
|
||
"onNextYear": () => {
|
||
onYearChange(1);
|
||
},
|
||
"onYearClick": () => {
|
||
onPanelChange("year", viewDate);
|
||
}
|
||
}), null), createVNode(MonthBody, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"prefixCls": prefixCls,
|
||
"onSelect": (date) => {
|
||
onSelect(date, "mouse");
|
||
onPanelChange("date", date);
|
||
}
|
||
}), null)]);
|
||
}
|
||
MonthPanel.displayName = "MonthPanel";
|
||
MonthPanel.inheritAttrs = false;
|
||
function QuarterHeader(_props) {
|
||
const props = useMergeProps(_props);
|
||
const {
|
||
prefixCls,
|
||
generateConfig: generateConfig2,
|
||
locale: locale2,
|
||
viewDate,
|
||
onNextYear,
|
||
onPrevYear,
|
||
onYearClick
|
||
} = props;
|
||
const {
|
||
hideHeader
|
||
} = useInjectPanel();
|
||
if (hideHeader.value) {
|
||
return null;
|
||
}
|
||
const headerPrefixCls = `${prefixCls}-header`;
|
||
return createVNode(Header, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"prefixCls": headerPrefixCls,
|
||
"onSuperPrev": onPrevYear,
|
||
"onSuperNext": onNextYear
|
||
}), {
|
||
default: () => [createVNode("button", {
|
||
"type": "button",
|
||
"onClick": onYearClick,
|
||
"class": `${prefixCls}-year-btn`
|
||
}, [formatValue(viewDate, {
|
||
locale: locale2,
|
||
format: locale2.yearFormat,
|
||
generateConfig: generateConfig2
|
||
})])]
|
||
});
|
||
}
|
||
QuarterHeader.displayName = "QuarterHeader";
|
||
QuarterHeader.inheritAttrs = false;
|
||
const QUARTER_COL_COUNT = 4;
|
||
const QUARTER_ROW_COUNT = 1;
|
||
function QuarterBody(_props) {
|
||
const props = useMergeProps(_props);
|
||
const {
|
||
prefixCls,
|
||
locale: locale2,
|
||
value,
|
||
viewDate,
|
||
generateConfig: generateConfig2
|
||
} = props;
|
||
const {
|
||
rangedValue,
|
||
hoverRangedValue
|
||
} = useInjectRange();
|
||
const cellPrefixCls = `${prefixCls}-cell`;
|
||
const getCellClassName = useCellClassName({
|
||
cellPrefixCls,
|
||
value,
|
||
generateConfig: generateConfig2,
|
||
rangedValue: rangedValue.value,
|
||
hoverRangedValue: hoverRangedValue.value,
|
||
isSameCell: (current, target) => isSameQuarter(generateConfig2, current, target),
|
||
isInView: () => true,
|
||
offsetCell: (date, offset) => generateConfig2.addMonth(date, offset * 3)
|
||
});
|
||
const baseQuarter = generateConfig2.setDate(generateConfig2.setMonth(viewDate, 0), 1);
|
||
return createVNode(PanelBody, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"rowNum": QUARTER_ROW_COUNT,
|
||
"colNum": QUARTER_COL_COUNT,
|
||
"baseDate": baseQuarter,
|
||
"getCellText": (date) => formatValue(date, {
|
||
locale: locale2,
|
||
format: locale2.quarterFormat || "[Q]Q",
|
||
generateConfig: generateConfig2
|
||
}),
|
||
"getCellClassName": getCellClassName,
|
||
"getCellDate": (date, offset) => generateConfig2.addMonth(date, offset * 3),
|
||
"titleCell": (date) => formatValue(date, {
|
||
locale: locale2,
|
||
format: "YYYY-[Q]Q",
|
||
generateConfig: generateConfig2
|
||
})
|
||
}), null);
|
||
}
|
||
QuarterBody.displayName = "QuarterBody";
|
||
QuarterBody.inheritAttrs = false;
|
||
function QuarterPanel(_props) {
|
||
const props = useMergeProps(_props);
|
||
const {
|
||
prefixCls,
|
||
operationRef,
|
||
onViewDateChange,
|
||
generateConfig: generateConfig2,
|
||
value,
|
||
viewDate,
|
||
onPanelChange,
|
||
onSelect
|
||
} = props;
|
||
const panelPrefixCls = `${prefixCls}-quarter-panel`;
|
||
operationRef.value = {
|
||
onKeydown: (event) => createKeydownHandler(event, {
|
||
onLeftRight: (diff) => {
|
||
onSelect(generateConfig2.addMonth(value || viewDate, diff * 3), "key");
|
||
},
|
||
onCtrlLeftRight: (diff) => {
|
||
onSelect(generateConfig2.addYear(value || viewDate, diff), "key");
|
||
},
|
||
onUpDown: (diff) => {
|
||
onSelect(generateConfig2.addYear(value || viewDate, diff), "key");
|
||
}
|
||
})
|
||
};
|
||
const onYearChange = (diff) => {
|
||
const newDate = generateConfig2.addYear(viewDate, diff);
|
||
onViewDateChange(newDate);
|
||
onPanelChange(null, newDate);
|
||
};
|
||
return createVNode("div", {
|
||
"class": panelPrefixCls
|
||
}, [createVNode(QuarterHeader, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"prefixCls": prefixCls,
|
||
"onPrevYear": () => {
|
||
onYearChange(-1);
|
||
},
|
||
"onNextYear": () => {
|
||
onYearChange(1);
|
||
},
|
||
"onYearClick": () => {
|
||
onPanelChange("year", viewDate);
|
||
}
|
||
}), null), createVNode(QuarterBody, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"prefixCls": prefixCls,
|
||
"onSelect": (date) => {
|
||
onSelect(date, "mouse");
|
||
}
|
||
}), null)]);
|
||
}
|
||
QuarterPanel.displayName = "QuarterPanel";
|
||
QuarterPanel.inheritAttrs = false;
|
||
function YearHeader(_props) {
|
||
const props = useMergeProps(_props);
|
||
const {
|
||
prefixCls,
|
||
generateConfig: generateConfig2,
|
||
viewDate,
|
||
onPrevDecade,
|
||
onNextDecade,
|
||
onDecadeClick
|
||
} = props;
|
||
const {
|
||
hideHeader
|
||
} = useInjectPanel();
|
||
if (hideHeader.value) {
|
||
return null;
|
||
}
|
||
const headerPrefixCls = `${prefixCls}-header`;
|
||
const yearNumber = generateConfig2.getYear(viewDate);
|
||
const startYear = Math.floor(yearNumber / YEAR_DECADE_COUNT) * YEAR_DECADE_COUNT;
|
||
const endYear = startYear + YEAR_DECADE_COUNT - 1;
|
||
return createVNode(Header, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"prefixCls": headerPrefixCls,
|
||
"onSuperPrev": onPrevDecade,
|
||
"onSuperNext": onNextDecade
|
||
}), {
|
||
default: () => [createVNode("button", {
|
||
"type": "button",
|
||
"onClick": onDecadeClick,
|
||
"class": `${prefixCls}-decade-btn`
|
||
}, [startYear, createTextVNode("-"), endYear])]
|
||
});
|
||
}
|
||
YearHeader.displayName = "YearHeader";
|
||
YearHeader.inheritAttrs = false;
|
||
const YEAR_COL_COUNT = 3;
|
||
const YEAR_ROW_COUNT = 4;
|
||
function YearBody(_props) {
|
||
const props = useMergeProps(_props);
|
||
const {
|
||
prefixCls,
|
||
value,
|
||
viewDate,
|
||
locale: locale2,
|
||
generateConfig: generateConfig2
|
||
} = props;
|
||
const {
|
||
rangedValue,
|
||
hoverRangedValue
|
||
} = useInjectRange();
|
||
const yearPrefixCls = `${prefixCls}-cell`;
|
||
const yearNumber = generateConfig2.getYear(viewDate);
|
||
const startYear = Math.floor(yearNumber / YEAR_DECADE_COUNT) * YEAR_DECADE_COUNT;
|
||
const endYear = startYear + YEAR_DECADE_COUNT - 1;
|
||
const baseYear = generateConfig2.setYear(viewDate, startYear - Math.ceil((YEAR_COL_COUNT * YEAR_ROW_COUNT - YEAR_DECADE_COUNT) / 2));
|
||
const isInView = (date) => {
|
||
const currentYearNumber = generateConfig2.getYear(date);
|
||
return startYear <= currentYearNumber && currentYearNumber <= endYear;
|
||
};
|
||
const getCellClassName = useCellClassName({
|
||
cellPrefixCls: yearPrefixCls,
|
||
value,
|
||
generateConfig: generateConfig2,
|
||
rangedValue: rangedValue.value,
|
||
hoverRangedValue: hoverRangedValue.value,
|
||
isSameCell: (current, target) => isSameYear(generateConfig2, current, target),
|
||
isInView,
|
||
offsetCell: (date, offset) => generateConfig2.addYear(date, offset)
|
||
});
|
||
return createVNode(PanelBody, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"rowNum": YEAR_ROW_COUNT,
|
||
"colNum": YEAR_COL_COUNT,
|
||
"baseDate": baseYear,
|
||
"getCellText": generateConfig2.getYear,
|
||
"getCellClassName": getCellClassName,
|
||
"getCellDate": generateConfig2.addYear,
|
||
"titleCell": (date) => formatValue(date, {
|
||
locale: locale2,
|
||
format: "YYYY",
|
||
generateConfig: generateConfig2
|
||
})
|
||
}), null);
|
||
}
|
||
YearBody.displayName = "YearBody";
|
||
YearBody.inheritAttrs = false;
|
||
const YEAR_DECADE_COUNT = 10;
|
||
function YearPanel(_props) {
|
||
const props = useMergeProps(_props);
|
||
const {
|
||
prefixCls,
|
||
operationRef,
|
||
onViewDateChange,
|
||
generateConfig: generateConfig2,
|
||
value,
|
||
viewDate,
|
||
sourceMode,
|
||
onSelect,
|
||
onPanelChange
|
||
} = props;
|
||
const panelPrefixCls = `${prefixCls}-year-panel`;
|
||
operationRef.value = {
|
||
onKeydown: (event) => createKeydownHandler(event, {
|
||
onLeftRight: (diff) => {
|
||
onSelect(generateConfig2.addYear(value || viewDate, diff), "key");
|
||
},
|
||
onCtrlLeftRight: (diff) => {
|
||
onSelect(generateConfig2.addYear(value || viewDate, diff * YEAR_DECADE_COUNT), "key");
|
||
},
|
||
onUpDown: (diff) => {
|
||
onSelect(generateConfig2.addYear(value || viewDate, diff * YEAR_COL_COUNT), "key");
|
||
},
|
||
onEnter: () => {
|
||
onPanelChange(sourceMode === "date" ? "date" : "month", value || viewDate);
|
||
}
|
||
})
|
||
};
|
||
const onDecadeChange = (diff) => {
|
||
const newDate = generateConfig2.addYear(viewDate, diff * 10);
|
||
onViewDateChange(newDate);
|
||
onPanelChange(null, newDate);
|
||
};
|
||
return createVNode("div", {
|
||
"class": panelPrefixCls
|
||
}, [createVNode(YearHeader, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"prefixCls": prefixCls,
|
||
"onPrevDecade": () => {
|
||
onDecadeChange(-1);
|
||
},
|
||
"onNextDecade": () => {
|
||
onDecadeChange(1);
|
||
},
|
||
"onDecadeClick": () => {
|
||
onPanelChange("decade", viewDate);
|
||
}
|
||
}), null), createVNode(YearBody, _objectSpread$3(_objectSpread$3({}, props), {}, {
|
||
"prefixCls": prefixCls,
|
||
"onSelect": (date) => {
|
||
onPanelChange(sourceMode === "date" ? "date" : "month", date);
|
||
onSelect(date, "mouse");
|
||
}
|
||
}), null)]);
|
||
}
|
||
YearPanel.displayName = "YearPanel";
|
||
YearPanel.inheritAttrs = false;
|
||
function getExtraFooter(prefixCls, mode, renderExtraFooter) {
|
||
if (!renderExtraFooter) {
|
||
return null;
|
||
}
|
||
return createVNode("div", {
|
||
"class": `${prefixCls}-footer-extra`
|
||
}, [renderExtraFooter(mode)]);
|
||
}
|
||
function getRanges(_ref) {
|
||
let {
|
||
prefixCls,
|
||
components = {},
|
||
needConfirmButton,
|
||
onNow,
|
||
onOk,
|
||
okDisabled,
|
||
showNow,
|
||
locale: locale2
|
||
} = _ref;
|
||
let presetNode;
|
||
let okNode;
|
||
if (needConfirmButton) {
|
||
const Button2 = components.button || "button";
|
||
if (onNow && showNow !== false) {
|
||
presetNode = createVNode("li", {
|
||
"class": `${prefixCls}-now`
|
||
}, [createVNode("a", {
|
||
"class": `${prefixCls}-now-btn`,
|
||
"onClick": onNow
|
||
}, [locale2.now])]);
|
||
}
|
||
okNode = needConfirmButton && createVNode("li", {
|
||
"class": `${prefixCls}-ok`
|
||
}, [createVNode(Button2, {
|
||
"disabled": okDisabled,
|
||
"onClick": (e) => {
|
||
e.stopPropagation();
|
||
onOk && onOk();
|
||
}
|
||
}, {
|
||
default: () => [locale2.ok]
|
||
})]);
|
||
}
|
||
if (!presetNode && !okNode) {
|
||
return null;
|
||
}
|
||
return createVNode("ul", {
|
||
"class": `${prefixCls}-ranges`
|
||
}, [presetNode, okNode]);
|
||
}
|
||
function PickerPanel() {
|
||
return defineComponent({
|
||
name: "PickerPanel",
|
||
inheritAttrs: false,
|
||
props: {
|
||
prefixCls: String,
|
||
locale: Object,
|
||
generateConfig: Object,
|
||
value: Object,
|
||
defaultValue: Object,
|
||
pickerValue: Object,
|
||
defaultPickerValue: Object,
|
||
disabledDate: Function,
|
||
mode: String,
|
||
picker: {
|
||
type: String,
|
||
default: "date"
|
||
},
|
||
tabindex: {
|
||
type: [Number, String],
|
||
default: 0
|
||
},
|
||
showNow: {
|
||
type: Boolean,
|
||
default: void 0
|
||
},
|
||
showTime: [Boolean, Object],
|
||
showToday: Boolean,
|
||
renderExtraFooter: Function,
|
||
dateRender: Function,
|
||
hideHeader: {
|
||
type: Boolean,
|
||
default: void 0
|
||
},
|
||
onSelect: Function,
|
||
onChange: Function,
|
||
onPanelChange: Function,
|
||
onMousedown: Function,
|
||
onPickerValueChange: Function,
|
||
onOk: Function,
|
||
components: Object,
|
||
direction: String,
|
||
hourStep: {
|
||
type: Number,
|
||
default: 1
|
||
},
|
||
minuteStep: {
|
||
type: Number,
|
||
default: 1
|
||
},
|
||
secondStep: {
|
||
type: Number,
|
||
default: 1
|
||
}
|
||
},
|
||
setup(props, _ref) {
|
||
let {
|
||
attrs
|
||
} = _ref;
|
||
const needConfirmButton = computed(() => props.picker === "date" && !!props.showTime || props.picker === "time");
|
||
const isHourStepValid = computed(() => 24 % props.hourStep === 0);
|
||
const isMinuteStepValid = computed(() => 60 % props.minuteStep === 0);
|
||
const isSecondStepValid = computed(() => 60 % props.secondStep === 0);
|
||
const panelContext = useInjectPanel();
|
||
const {
|
||
operationRef,
|
||
onSelect: onContextSelect,
|
||
hideRanges,
|
||
defaultOpenValue
|
||
} = panelContext;
|
||
const {
|
||
inRange,
|
||
panelPosition,
|
||
rangedValue,
|
||
hoverRangedValue
|
||
} = useInjectRange();
|
||
const panelRef = ref({});
|
||
const [mergedValue, setInnerValue] = useMergedState(null, {
|
||
value: toRef(props, "value"),
|
||
defaultValue: props.defaultValue,
|
||
postState: (val) => {
|
||
if (!val && (defaultOpenValue === null || defaultOpenValue === void 0 ? void 0 : defaultOpenValue.value) && props.picker === "time") {
|
||
return defaultOpenValue.value;
|
||
}
|
||
return val;
|
||
}
|
||
});
|
||
const [viewDate, setInnerViewDate] = useMergedState(null, {
|
||
value: toRef(props, "pickerValue"),
|
||
defaultValue: props.defaultPickerValue || mergedValue.value,
|
||
postState: (date) => {
|
||
const {
|
||
generateConfig: generateConfig2,
|
||
showTime,
|
||
defaultValue
|
||
} = props;
|
||
const now = generateConfig2.getNow();
|
||
if (!date) return now;
|
||
if (!mergedValue.value && props.showTime) {
|
||
if (typeof showTime === "object") {
|
||
return setDateTime(generateConfig2, Array.isArray(date) ? date[0] : date, showTime.defaultValue || now);
|
||
}
|
||
if (defaultValue) {
|
||
return setDateTime(generateConfig2, Array.isArray(date) ? date[0] : date, defaultValue);
|
||
}
|
||
return setDateTime(generateConfig2, Array.isArray(date) ? date[0] : date, now);
|
||
}
|
||
return date;
|
||
}
|
||
});
|
||
const setViewDate = (date) => {
|
||
setInnerViewDate(date);
|
||
if (props.onPickerValueChange) {
|
||
props.onPickerValueChange(date);
|
||
}
|
||
};
|
||
const getInternalNextMode = (nextMode) => {
|
||
const getNextMode = PickerModeMap[props.picker];
|
||
if (getNextMode) {
|
||
return getNextMode(nextMode);
|
||
}
|
||
return nextMode;
|
||
};
|
||
const [mergedMode, setInnerMode] = useMergedState(() => {
|
||
if (props.picker === "time") {
|
||
return "time";
|
||
}
|
||
return getInternalNextMode("date");
|
||
}, {
|
||
value: toRef(props, "mode")
|
||
});
|
||
watch(() => props.picker, () => {
|
||
setInnerMode(props.picker);
|
||
});
|
||
const sourceMode = ref(mergedMode.value);
|
||
const setSourceMode = (val) => {
|
||
sourceMode.value = val;
|
||
};
|
||
const onInternalPanelChange = (newMode, viewValue) => {
|
||
const {
|
||
onPanelChange,
|
||
generateConfig: generateConfig2
|
||
} = props;
|
||
const nextMode = getInternalNextMode(newMode || mergedMode.value);
|
||
setSourceMode(mergedMode.value);
|
||
setInnerMode(nextMode);
|
||
if (onPanelChange && (mergedMode.value !== nextMode || isEqual(generateConfig2, viewDate.value, viewDate.value))) {
|
||
onPanelChange(viewValue, nextMode);
|
||
}
|
||
};
|
||
const triggerSelect = function(date, type) {
|
||
let forceTriggerSelect = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : false;
|
||
const {
|
||
picker,
|
||
generateConfig: generateConfig2,
|
||
onSelect,
|
||
onChange,
|
||
disabledDate
|
||
} = props;
|
||
if (mergedMode.value === picker || forceTriggerSelect) {
|
||
setInnerValue(date);
|
||
if (onSelect) {
|
||
onSelect(date);
|
||
}
|
||
if (onContextSelect) {
|
||
onContextSelect(date, type);
|
||
}
|
||
if (onChange && !isEqual(generateConfig2, date, mergedValue.value) && !(disabledDate === null || disabledDate === void 0 ? void 0 : disabledDate(date))) {
|
||
onChange(date);
|
||
}
|
||
}
|
||
};
|
||
const onInternalKeydown = (e) => {
|
||
if (panelRef.value && panelRef.value.onKeydown) {
|
||
if ([KeyCode.LEFT, KeyCode.RIGHT, KeyCode.UP, KeyCode.DOWN, KeyCode.PAGE_UP, KeyCode.PAGE_DOWN, KeyCode.ENTER].includes(e.which)) {
|
||
e.preventDefault();
|
||
}
|
||
return panelRef.value.onKeydown(e);
|
||
}
|
||
{
|
||
return false;
|
||
}
|
||
};
|
||
const onInternalBlur = (e) => {
|
||
if (panelRef.value && panelRef.value.onBlur) {
|
||
panelRef.value.onBlur(e);
|
||
}
|
||
};
|
||
const onNow = () => {
|
||
const {
|
||
generateConfig: generateConfig2,
|
||
hourStep,
|
||
minuteStep,
|
||
secondStep
|
||
} = props;
|
||
const now = generateConfig2.getNow();
|
||
const lowerBoundTime = getLowerBoundTime(generateConfig2.getHour(now), generateConfig2.getMinute(now), generateConfig2.getSecond(now), isHourStepValid.value ? hourStep : 1, isMinuteStepValid.value ? minuteStep : 1, isSecondStepValid.value ? secondStep : 1);
|
||
const adjustedNow = setTime(
|
||
generateConfig2,
|
||
now,
|
||
lowerBoundTime[0],
|
||
// hour
|
||
lowerBoundTime[1],
|
||
// minute
|
||
lowerBoundTime[2]
|
||
);
|
||
triggerSelect(adjustedNow, "submit");
|
||
};
|
||
const classString = computed(() => {
|
||
const {
|
||
prefixCls,
|
||
direction
|
||
} = props;
|
||
return classNames(`${prefixCls}-panel`, {
|
||
[`${prefixCls}-panel-has-range`]: rangedValue && rangedValue.value && rangedValue.value[0] && rangedValue.value[1],
|
||
[`${prefixCls}-panel-has-range-hover`]: hoverRangedValue && hoverRangedValue.value && hoverRangedValue.value[0] && hoverRangedValue.value[1],
|
||
[`${prefixCls}-panel-rtl`]: direction === "rtl"
|
||
});
|
||
});
|
||
useProvidePanel(_extends(_extends({}, panelContext), {
|
||
mode: mergedMode,
|
||
hideHeader: computed(() => {
|
||
var _a;
|
||
return props.hideHeader !== void 0 ? props.hideHeader : (_a = panelContext.hideHeader) === null || _a === void 0 ? void 0 : _a.value;
|
||
}),
|
||
hidePrevBtn: computed(() => inRange.value && panelPosition.value === "right"),
|
||
hideNextBtn: computed(() => inRange.value && panelPosition.value === "left")
|
||
}));
|
||
watch(() => props.value, () => {
|
||
if (props.value) {
|
||
setInnerViewDate(props.value);
|
||
}
|
||
});
|
||
return () => {
|
||
const {
|
||
prefixCls = "ant-picker",
|
||
locale: locale2,
|
||
generateConfig: generateConfig2,
|
||
disabledDate,
|
||
picker = "date",
|
||
tabindex = 0,
|
||
showNow,
|
||
showTime,
|
||
showToday,
|
||
renderExtraFooter,
|
||
onMousedown,
|
||
onOk,
|
||
components
|
||
} = props;
|
||
if (operationRef && panelPosition.value !== "right") {
|
||
operationRef.value = {
|
||
onKeydown: onInternalKeydown,
|
||
onClose: () => {
|
||
if (panelRef.value && panelRef.value.onClose) {
|
||
panelRef.value.onClose();
|
||
}
|
||
}
|
||
};
|
||
}
|
||
let panelNode;
|
||
const pickerProps = _extends(_extends(_extends({}, attrs), props), {
|
||
operationRef: panelRef,
|
||
prefixCls,
|
||
viewDate: viewDate.value,
|
||
value: mergedValue.value,
|
||
onViewDateChange: setViewDate,
|
||
sourceMode: sourceMode.value,
|
||
onPanelChange: onInternalPanelChange,
|
||
disabledDate
|
||
});
|
||
delete pickerProps.onChange;
|
||
delete pickerProps.onSelect;
|
||
switch (mergedMode.value) {
|
||
case "decade":
|
||
panelNode = createVNode(DecadePanel, _objectSpread$3(_objectSpread$3({}, pickerProps), {}, {
|
||
"onSelect": (date, type) => {
|
||
setViewDate(date);
|
||
triggerSelect(date, type);
|
||
}
|
||
}), null);
|
||
break;
|
||
case "year":
|
||
panelNode = createVNode(YearPanel, _objectSpread$3(_objectSpread$3({}, pickerProps), {}, {
|
||
"onSelect": (date, type) => {
|
||
setViewDate(date);
|
||
triggerSelect(date, type);
|
||
}
|
||
}), null);
|
||
break;
|
||
case "month":
|
||
panelNode = createVNode(MonthPanel, _objectSpread$3(_objectSpread$3({}, pickerProps), {}, {
|
||
"onSelect": (date, type) => {
|
||
setViewDate(date);
|
||
triggerSelect(date, type);
|
||
}
|
||
}), null);
|
||
break;
|
||
case "quarter":
|
||
panelNode = createVNode(QuarterPanel, _objectSpread$3(_objectSpread$3({}, pickerProps), {}, {
|
||
"onSelect": (date, type) => {
|
||
setViewDate(date);
|
||
triggerSelect(date, type);
|
||
}
|
||
}), null);
|
||
break;
|
||
case "week":
|
||
panelNode = createVNode(WeekPanel, _objectSpread$3(_objectSpread$3({}, pickerProps), {}, {
|
||
"onSelect": (date, type) => {
|
||
setViewDate(date);
|
||
triggerSelect(date, type);
|
||
}
|
||
}), null);
|
||
break;
|
||
case "time":
|
||
delete pickerProps.showTime;
|
||
panelNode = createVNode(TimePanel, _objectSpread$3(_objectSpread$3(_objectSpread$3({}, pickerProps), typeof showTime === "object" ? showTime : null), {}, {
|
||
"onSelect": (date, type) => {
|
||
setViewDate(date);
|
||
triggerSelect(date, type);
|
||
}
|
||
}), null);
|
||
break;
|
||
default:
|
||
if (showTime) {
|
||
panelNode = createVNode(DatetimePanel, _objectSpread$3(_objectSpread$3({}, pickerProps), {}, {
|
||
"onSelect": (date, type) => {
|
||
setViewDate(date);
|
||
triggerSelect(date, type);
|
||
}
|
||
}), null);
|
||
} else {
|
||
panelNode = createVNode(DatePanel, _objectSpread$3(_objectSpread$3({}, pickerProps), {}, {
|
||
"onSelect": (date, type) => {
|
||
setViewDate(date);
|
||
triggerSelect(date, type);
|
||
}
|
||
}), null);
|
||
}
|
||
}
|
||
let extraFooter;
|
||
let rangesNode;
|
||
if (!(hideRanges === null || hideRanges === void 0 ? void 0 : hideRanges.value)) {
|
||
extraFooter = getExtraFooter(prefixCls, mergedMode.value, renderExtraFooter);
|
||
rangesNode = getRanges({
|
||
prefixCls,
|
||
components,
|
||
needConfirmButton: needConfirmButton.value,
|
||
okDisabled: !mergedValue.value || disabledDate && disabledDate(mergedValue.value),
|
||
locale: locale2,
|
||
showNow,
|
||
onNow: needConfirmButton.value && onNow,
|
||
onOk: () => {
|
||
if (mergedValue.value) {
|
||
triggerSelect(mergedValue.value, "submit", true);
|
||
if (onOk) {
|
||
onOk(mergedValue.value);
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}
|
||
let todayNode;
|
||
if (showToday && mergedMode.value === "date" && picker === "date" && !showTime) {
|
||
const now = generateConfig2.getNow();
|
||
const todayCls = `${prefixCls}-today-btn`;
|
||
const disabled = disabledDate && disabledDate(now);
|
||
todayNode = createVNode("a", {
|
||
"class": classNames(todayCls, disabled && `${todayCls}-disabled`),
|
||
"aria-disabled": disabled,
|
||
"onClick": () => {
|
||
if (!disabled) {
|
||
triggerSelect(now, "mouse", true);
|
||
}
|
||
}
|
||
}, [locale2.today]);
|
||
}
|
||
return createVNode("div", {
|
||
"tabindex": tabindex,
|
||
"class": classNames(classString.value, attrs.class),
|
||
"style": attrs.style,
|
||
"onKeydown": onInternalKeydown,
|
||
"onBlur": onInternalBlur,
|
||
"onMousedown": onMousedown
|
||
}, [panelNode, extraFooter || rangesNode || todayNode ? createVNode("div", {
|
||
"class": `${prefixCls}-footer`
|
||
}, [extraFooter, rangesNode, todayNode]) : null]);
|
||
};
|
||
}
|
||
});
|
||
}
|
||
const InterPickerPanel = PickerPanel();
|
||
const PickerPanel$1 = (props) => createVNode(InterPickerPanel, props);
|
||
const BUILT_IN_PLACEMENTS = {
|
||
bottomLeft: {
|
||
points: ["tl", "bl"],
|
||
offset: [0, 4],
|
||
overflow: {
|
||
adjustX: 1,
|
||
adjustY: 1
|
||
}
|
||
},
|
||
bottomRight: {
|
||
points: ["tr", "br"],
|
||
offset: [0, 4],
|
||
overflow: {
|
||
adjustX: 1,
|
||
adjustY: 1
|
||
}
|
||
},
|
||
topLeft: {
|
||
points: ["bl", "tl"],
|
||
offset: [0, -4],
|
||
overflow: {
|
||
adjustX: 0,
|
||
adjustY: 1
|
||
}
|
||
},
|
||
topRight: {
|
||
points: ["br", "tr"],
|
||
offset: [0, -4],
|
||
overflow: {
|
||
adjustX: 0,
|
||
adjustY: 1
|
||
}
|
||
}
|
||
};
|
||
function PickerTrigger(props, _ref) {
|
||
let {
|
||
slots
|
||
} = _ref;
|
||
const {
|
||
prefixCls,
|
||
popupStyle,
|
||
visible,
|
||
dropdownClassName,
|
||
dropdownAlign,
|
||
transitionName,
|
||
getPopupContainer,
|
||
range,
|
||
popupPlacement,
|
||
direction
|
||
} = useMergeProps(props);
|
||
const dropdownPrefixCls = `${prefixCls}-dropdown`;
|
||
const getPopupPlacement = () => {
|
||
if (popupPlacement !== void 0) {
|
||
return popupPlacement;
|
||
}
|
||
return direction === "rtl" ? "bottomRight" : "bottomLeft";
|
||
};
|
||
return createVNode(Trigger, {
|
||
"showAction": [],
|
||
"hideAction": [],
|
||
"popupPlacement": getPopupPlacement(),
|
||
"builtinPlacements": BUILT_IN_PLACEMENTS,
|
||
"prefixCls": dropdownPrefixCls,
|
||
"popupTransitionName": transitionName,
|
||
"popupAlign": dropdownAlign,
|
||
"popupVisible": visible,
|
||
"popupClassName": classNames(dropdownClassName, {
|
||
[`${dropdownPrefixCls}-range`]: range,
|
||
[`${dropdownPrefixCls}-rtl`]: direction === "rtl"
|
||
}),
|
||
"popupStyle": popupStyle,
|
||
"getPopupContainer": getPopupContainer
|
||
}, {
|
||
default: slots.default,
|
||
popup: slots.popupElement
|
||
});
|
||
}
|
||
const PresetPanel = defineComponent({
|
||
name: "PresetPanel",
|
||
props: {
|
||
prefixCls: String,
|
||
presets: {
|
||
type: Array,
|
||
default: () => []
|
||
},
|
||
onClick: Function,
|
||
onHover: Function
|
||
},
|
||
setup(props) {
|
||
return () => {
|
||
if (!props.presets.length) {
|
||
return null;
|
||
}
|
||
return createVNode("div", {
|
||
"class": `${props.prefixCls}-presets`
|
||
}, [createVNode("ul", null, [props.presets.map((_ref, index) => {
|
||
let {
|
||
label,
|
||
value
|
||
} = _ref;
|
||
return createVNode("li", {
|
||
"key": index,
|
||
"onClick": (e) => {
|
||
e.stopPropagation();
|
||
props.onClick(value);
|
||
},
|
||
"onMouseenter": () => {
|
||
var _a;
|
||
(_a = props.onHover) === null || _a === void 0 ? void 0 : _a.call(props, value);
|
||
},
|
||
"onMouseleave": () => {
|
||
var _a;
|
||
(_a = props.onHover) === null || _a === void 0 ? void 0 : _a.call(props, null);
|
||
}
|
||
}, [label]);
|
||
})])]);
|
||
};
|
||
}
|
||
});
|
||
function usePickerInput(_ref) {
|
||
let {
|
||
open,
|
||
value,
|
||
isClickOutside,
|
||
triggerOpen,
|
||
forwardKeydown,
|
||
onKeydown,
|
||
blurToCancel,
|
||
onSubmit,
|
||
onCancel,
|
||
onFocus,
|
||
onBlur
|
||
} = _ref;
|
||
const typing = shallowRef(false);
|
||
const focused = shallowRef(false);
|
||
const preventBlurRef = shallowRef(false);
|
||
const valueChangedRef = shallowRef(false);
|
||
const preventDefaultRef = shallowRef(false);
|
||
const inputProps = computed(() => ({
|
||
onMousedown: () => {
|
||
typing.value = true;
|
||
triggerOpen(true);
|
||
},
|
||
onKeydown: (e) => {
|
||
const preventDefault = () => {
|
||
preventDefaultRef.value = true;
|
||
};
|
||
onKeydown(e, preventDefault);
|
||
if (preventDefaultRef.value) return;
|
||
switch (e.which) {
|
||
case KeyCode.ENTER: {
|
||
if (!open.value) {
|
||
triggerOpen(true);
|
||
} else if (onSubmit() !== false) {
|
||
typing.value = true;
|
||
}
|
||
e.preventDefault();
|
||
return;
|
||
}
|
||
case KeyCode.TAB: {
|
||
if (typing.value && open.value && !e.shiftKey) {
|
||
typing.value = false;
|
||
e.preventDefault();
|
||
} else if (!typing.value && open.value) {
|
||
if (!forwardKeydown(e) && e.shiftKey) {
|
||
typing.value = true;
|
||
e.preventDefault();
|
||
}
|
||
}
|
||
return;
|
||
}
|
||
case KeyCode.ESC: {
|
||
typing.value = true;
|
||
onCancel();
|
||
return;
|
||
}
|
||
}
|
||
if (!open.value && ![KeyCode.SHIFT].includes(e.which)) {
|
||
triggerOpen(true);
|
||
} else if (!typing.value) {
|
||
forwardKeydown(e);
|
||
}
|
||
},
|
||
onFocus: (e) => {
|
||
typing.value = true;
|
||
focused.value = true;
|
||
if (onFocus) {
|
||
onFocus(e);
|
||
}
|
||
},
|
||
onBlur: (e) => {
|
||
if (preventBlurRef.value || !isClickOutside((void 0).activeElement)) {
|
||
preventBlurRef.value = false;
|
||
return;
|
||
}
|
||
if (blurToCancel.value) {
|
||
setTimeout(() => {
|
||
let {
|
||
activeElement
|
||
} = void 0;
|
||
while (activeElement && activeElement.shadowRoot) {
|
||
activeElement = activeElement.shadowRoot.activeElement;
|
||
}
|
||
if (isClickOutside(activeElement)) {
|
||
onCancel();
|
||
}
|
||
}, 0);
|
||
} else if (open.value) {
|
||
triggerOpen(false);
|
||
if (valueChangedRef.value) {
|
||
onSubmit();
|
||
}
|
||
}
|
||
focused.value = false;
|
||
if (onBlur) {
|
||
onBlur(e);
|
||
}
|
||
}
|
||
}));
|
||
watch(open, () => {
|
||
valueChangedRef.value = false;
|
||
});
|
||
watch(value, () => {
|
||
valueChangedRef.value = true;
|
||
});
|
||
shallowRef();
|
||
return [inputProps, {
|
||
focused,
|
||
typing
|
||
}];
|
||
}
|
||
function useTextValueMapping(_ref) {
|
||
let {
|
||
valueTexts,
|
||
onTextChange
|
||
} = _ref;
|
||
const text = ref("");
|
||
function triggerTextChange(value) {
|
||
text.value = value;
|
||
onTextChange(value);
|
||
}
|
||
function resetText() {
|
||
text.value = valueTexts.value[0];
|
||
}
|
||
watch(() => [...valueTexts.value], function(cur) {
|
||
let pre = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
|
||
if (cur.join("||") !== pre.join("||") && valueTexts.value.every((valText) => valText !== text.value)) {
|
||
resetText();
|
||
}
|
||
}, {
|
||
immediate: true
|
||
});
|
||
return [text, triggerTextChange, resetText];
|
||
}
|
||
function useValueTexts(value, _ref) {
|
||
let {
|
||
formatList,
|
||
generateConfig: generateConfig2,
|
||
locale: locale2
|
||
} = _ref;
|
||
const texts = useMemo(() => {
|
||
if (!value.value) {
|
||
return [[""], ""];
|
||
}
|
||
let firstValueText2 = "";
|
||
const fullValueTexts2 = [];
|
||
for (let i = 0; i < formatList.value.length; i += 1) {
|
||
const format = formatList.value[i];
|
||
const formatStr = formatValue(value.value, {
|
||
generateConfig: generateConfig2.value,
|
||
locale: locale2.value,
|
||
format
|
||
});
|
||
fullValueTexts2.push(formatStr);
|
||
if (i === 0) {
|
||
firstValueText2 = formatStr;
|
||
}
|
||
}
|
||
return [fullValueTexts2, firstValueText2];
|
||
}, [value, formatList], (next, prev) => prev[0] !== next[0] || !shallowequal(prev[1], next[1]));
|
||
const fullValueTexts = computed(() => texts.value[0]);
|
||
const firstValueText = computed(() => texts.value[1]);
|
||
return [fullValueTexts, firstValueText];
|
||
}
|
||
function useHoverValue(valueText, _ref) {
|
||
let {
|
||
formatList,
|
||
generateConfig: generateConfig2,
|
||
locale: locale2
|
||
} = _ref;
|
||
const innerValue = ref(null);
|
||
let rafId;
|
||
function setValue(val) {
|
||
let immediately = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
|
||
wrapperRaf.cancel(rafId);
|
||
if (immediately) {
|
||
innerValue.value = val;
|
||
return;
|
||
}
|
||
rafId = wrapperRaf(() => {
|
||
innerValue.value = val;
|
||
});
|
||
}
|
||
const [, firstText] = useValueTexts(innerValue, {
|
||
formatList,
|
||
generateConfig: generateConfig2,
|
||
locale: locale2
|
||
});
|
||
function onEnter(date) {
|
||
setValue(date);
|
||
}
|
||
function onLeave() {
|
||
let immediately = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
|
||
setValue(null, immediately);
|
||
}
|
||
watch(valueText, () => {
|
||
onLeave(true);
|
||
});
|
||
return [firstText, onEnter, onLeave];
|
||
}
|
||
function usePresets(presets, legacyRanges) {
|
||
return computed(() => {
|
||
if (presets === null || presets === void 0 ? void 0 : presets.value) {
|
||
return presets.value;
|
||
}
|
||
if (legacyRanges === null || legacyRanges === void 0 ? void 0 : legacyRanges.value) {
|
||
warningOnce(false, "`ranges` is deprecated. Please use `presets` instead.");
|
||
const rangeLabels = Object.keys(legacyRanges.value);
|
||
return rangeLabels.map((label) => {
|
||
const range = legacyRanges.value[label];
|
||
const newValues = typeof range === "function" ? range() : range;
|
||
return {
|
||
label,
|
||
value: newValues
|
||
};
|
||
});
|
||
}
|
||
return [];
|
||
});
|
||
}
|
||
function Picker() {
|
||
return defineComponent({
|
||
name: "Picker",
|
||
inheritAttrs: false,
|
||
props: ["prefixCls", "id", "tabindex", "dropdownClassName", "dropdownAlign", "popupStyle", "transitionName", "generateConfig", "locale", "inputReadOnly", "allowClear", "autofocus", "showTime", "showNow", "showHour", "showMinute", "showSecond", "picker", "format", "use12Hours", "value", "defaultValue", "open", "defaultOpen", "defaultOpenValue", "suffixIcon", "presets", "clearIcon", "disabled", "disabledDate", "placeholder", "getPopupContainer", "panelRender", "inputRender", "onChange", "onOpenChange", "onPanelChange", "onFocus", "onBlur", "onMousedown", "onMouseup", "onMouseenter", "onMouseleave", "onContextmenu", "onClick", "onKeydown", "onSelect", "direction", "autocomplete", "showToday", "renderExtraFooter", "dateRender", "minuteStep", "hourStep", "secondStep", "hideDisabledOptions"],
|
||
setup(props, _ref) {
|
||
let {
|
||
attrs,
|
||
expose
|
||
} = _ref;
|
||
const inputRef = ref(null);
|
||
const presets = computed(() => props.presets);
|
||
const presetList = usePresets(presets);
|
||
const picker = computed(() => {
|
||
var _a;
|
||
return (_a = props.picker) !== null && _a !== void 0 ? _a : "date";
|
||
});
|
||
const needConfirmButton = computed(() => picker.value === "date" && !!props.showTime || picker.value === "time");
|
||
const formatList = computed(() => toArray$1(getDefaultFormat(props.format, picker.value, props.showTime, props.use12Hours)));
|
||
const panelDivRef = ref(null);
|
||
const inputDivRef = ref(null);
|
||
const containerRef = ref(null);
|
||
const [mergedValue, setInnerValue] = useMergedState(null, {
|
||
value: toRef(props, "value"),
|
||
defaultValue: props.defaultValue
|
||
});
|
||
const selectedValue = ref(mergedValue.value);
|
||
const setSelectedValue = (val) => {
|
||
selectedValue.value = val;
|
||
};
|
||
const operationRef = ref(null);
|
||
const [mergedOpen, triggerInnerOpen] = useMergedState(false, {
|
||
value: toRef(props, "open"),
|
||
defaultValue: props.defaultOpen,
|
||
postState: (postOpen) => props.disabled ? false : postOpen,
|
||
onChange: (newOpen) => {
|
||
if (props.onOpenChange) {
|
||
props.onOpenChange(newOpen);
|
||
}
|
||
if (!newOpen && operationRef.value && operationRef.value.onClose) {
|
||
operationRef.value.onClose();
|
||
}
|
||
}
|
||
});
|
||
const [valueTexts, firstValueText] = useValueTexts(selectedValue, {
|
||
formatList,
|
||
generateConfig: toRef(props, "generateConfig"),
|
||
locale: toRef(props, "locale")
|
||
});
|
||
const [text, triggerTextChange, resetText] = useTextValueMapping({
|
||
valueTexts,
|
||
onTextChange: (newText) => {
|
||
const inputDate = parseValue(newText, {
|
||
locale: props.locale,
|
||
formatList: formatList.value,
|
||
generateConfig: props.generateConfig
|
||
});
|
||
if (inputDate && (!props.disabledDate || !props.disabledDate(inputDate))) {
|
||
setSelectedValue(inputDate);
|
||
}
|
||
}
|
||
});
|
||
const triggerChange = (newValue) => {
|
||
const {
|
||
onChange,
|
||
generateConfig: generateConfig2,
|
||
locale: locale2
|
||
} = props;
|
||
setSelectedValue(newValue);
|
||
setInnerValue(newValue);
|
||
if (onChange && !isEqual(generateConfig2, mergedValue.value, newValue)) {
|
||
onChange(newValue, newValue ? formatValue(newValue, {
|
||
generateConfig: generateConfig2,
|
||
locale: locale2,
|
||
format: formatList.value[0]
|
||
}) : "");
|
||
}
|
||
};
|
||
const triggerOpen = (newOpen) => {
|
||
if (props.disabled && newOpen) {
|
||
return;
|
||
}
|
||
triggerInnerOpen(newOpen);
|
||
};
|
||
const forwardKeydown = (e) => {
|
||
if (mergedOpen.value && operationRef.value && operationRef.value.onKeydown) {
|
||
return operationRef.value.onKeydown(e);
|
||
}
|
||
{
|
||
return false;
|
||
}
|
||
};
|
||
const onInternalMouseup = function() {
|
||
if (props.onMouseup) {
|
||
props.onMouseup(...arguments);
|
||
}
|
||
if (inputRef.value) {
|
||
inputRef.value.focus();
|
||
triggerOpen(true);
|
||
}
|
||
};
|
||
const [inputProps, {
|
||
focused,
|
||
typing
|
||
}] = usePickerInput({
|
||
blurToCancel: needConfirmButton,
|
||
open: mergedOpen,
|
||
value: text,
|
||
triggerOpen,
|
||
forwardKeydown,
|
||
isClickOutside: (target) => !elementsContains([panelDivRef.value, inputDivRef.value, containerRef.value], target),
|
||
onSubmit: () => {
|
||
if (
|
||
// When user typing disabledDate with keyboard and enter, this value will be empty
|
||
!selectedValue.value || // Normal disabled check
|
||
props.disabledDate && props.disabledDate(selectedValue.value)
|
||
) {
|
||
return false;
|
||
}
|
||
triggerChange(selectedValue.value);
|
||
triggerOpen(false);
|
||
resetText();
|
||
return true;
|
||
},
|
||
onCancel: () => {
|
||
triggerOpen(false);
|
||
setSelectedValue(mergedValue.value);
|
||
resetText();
|
||
},
|
||
onKeydown: (e, preventDefault) => {
|
||
var _a;
|
||
(_a = props.onKeydown) === null || _a === void 0 ? void 0 : _a.call(props, e, preventDefault);
|
||
},
|
||
onFocus: (e) => {
|
||
var _a;
|
||
(_a = props.onFocus) === null || _a === void 0 ? void 0 : _a.call(props, e);
|
||
},
|
||
onBlur: (e) => {
|
||
var _a;
|
||
(_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, e);
|
||
}
|
||
});
|
||
watch([mergedOpen, valueTexts], () => {
|
||
if (!mergedOpen.value) {
|
||
setSelectedValue(mergedValue.value);
|
||
if (!valueTexts.value.length || valueTexts.value[0] === "") {
|
||
triggerTextChange("");
|
||
} else if (firstValueText.value !== text.value) {
|
||
resetText();
|
||
}
|
||
}
|
||
});
|
||
watch(picker, () => {
|
||
if (!mergedOpen.value) {
|
||
resetText();
|
||
}
|
||
});
|
||
watch(mergedValue, () => {
|
||
setSelectedValue(mergedValue.value);
|
||
});
|
||
const [hoverValue, onEnter, onLeave] = useHoverValue(text, {
|
||
formatList,
|
||
generateConfig: toRef(props, "generateConfig"),
|
||
locale: toRef(props, "locale")
|
||
});
|
||
const onContextSelect = (date, type) => {
|
||
if (type === "submit" || type !== "key" && !needConfirmButton.value) {
|
||
triggerChange(date);
|
||
triggerOpen(false);
|
||
}
|
||
};
|
||
useProvidePanel({
|
||
operationRef,
|
||
hideHeader: computed(() => picker.value === "time"),
|
||
onSelect: onContextSelect,
|
||
open: mergedOpen,
|
||
defaultOpenValue: toRef(props, "defaultOpenValue"),
|
||
onDateMouseenter: onEnter,
|
||
onDateMouseleave: onLeave
|
||
});
|
||
expose({
|
||
focus: () => {
|
||
if (inputRef.value) {
|
||
inputRef.value.focus();
|
||
}
|
||
},
|
||
blur: () => {
|
||
if (inputRef.value) {
|
||
inputRef.value.blur();
|
||
}
|
||
}
|
||
});
|
||
return () => {
|
||
const {
|
||
prefixCls = "rc-picker",
|
||
id,
|
||
tabindex,
|
||
dropdownClassName,
|
||
dropdownAlign,
|
||
popupStyle,
|
||
transitionName,
|
||
generateConfig: generateConfig2,
|
||
locale: locale2,
|
||
inputReadOnly,
|
||
allowClear,
|
||
autofocus,
|
||
picker: picker2 = "date",
|
||
defaultOpenValue,
|
||
suffixIcon,
|
||
clearIcon,
|
||
disabled,
|
||
placeholder,
|
||
getPopupContainer,
|
||
panelRender,
|
||
onMousedown,
|
||
onMouseenter,
|
||
onMouseleave,
|
||
onContextmenu,
|
||
onClick,
|
||
onSelect,
|
||
direction,
|
||
autocomplete = "off"
|
||
} = props;
|
||
const panelProps = _extends(_extends(_extends({}, props), attrs), {
|
||
class: classNames({
|
||
[`${prefixCls}-panel-focused`]: !typing.value
|
||
}),
|
||
style: void 0,
|
||
pickerValue: void 0,
|
||
onPickerValueChange: void 0,
|
||
onChange: null
|
||
});
|
||
let panelNode = createVNode("div", {
|
||
"class": `${prefixCls}-panel-layout`
|
||
}, [createVNode(PresetPanel, {
|
||
"prefixCls": prefixCls,
|
||
"presets": presetList.value,
|
||
"onClick": (nextValue) => {
|
||
triggerChange(nextValue);
|
||
triggerOpen(false);
|
||
}
|
||
}, null), createVNode(PickerPanel$1, _objectSpread$3(_objectSpread$3({}, panelProps), {}, {
|
||
"generateConfig": generateConfig2,
|
||
"value": selectedValue.value,
|
||
"locale": locale2,
|
||
"tabindex": -1,
|
||
"onSelect": (date) => {
|
||
onSelect === null || onSelect === void 0 ? void 0 : onSelect(date);
|
||
setSelectedValue(date);
|
||
},
|
||
"direction": direction,
|
||
"onPanelChange": (viewDate, mode) => {
|
||
const {
|
||
onPanelChange
|
||
} = props;
|
||
onLeave(true);
|
||
onPanelChange === null || onPanelChange === void 0 ? void 0 : onPanelChange(viewDate, mode);
|
||
}
|
||
}), null)]);
|
||
if (panelRender) {
|
||
panelNode = panelRender(panelNode);
|
||
}
|
||
const panel = createVNode("div", {
|
||
"class": `${prefixCls}-panel-container`,
|
||
"ref": panelDivRef,
|
||
"onMousedown": (e) => {
|
||
e.preventDefault();
|
||
}
|
||
}, [panelNode]);
|
||
let suffixNode;
|
||
if (suffixIcon) {
|
||
suffixNode = createVNode("span", {
|
||
"class": `${prefixCls}-suffix`
|
||
}, [suffixIcon]);
|
||
}
|
||
let clearNode;
|
||
if (allowClear && mergedValue.value && !disabled) {
|
||
clearNode = createVNode("span", {
|
||
"onMousedown": (e) => {
|
||
e.preventDefault();
|
||
e.stopPropagation();
|
||
},
|
||
"onMouseup": (e) => {
|
||
e.preventDefault();
|
||
e.stopPropagation();
|
||
triggerChange(null);
|
||
triggerOpen(false);
|
||
},
|
||
"class": `${prefixCls}-clear`,
|
||
"role": "button"
|
||
}, [clearIcon || createVNode("span", {
|
||
"class": `${prefixCls}-clear-btn`
|
||
}, null)]);
|
||
}
|
||
const mergedInputProps = _extends(_extends(_extends(_extends({
|
||
id,
|
||
tabindex,
|
||
disabled,
|
||
readonly: inputReadOnly || typeof formatList.value[0] === "function" || !typing.value,
|
||
value: hoverValue.value || text.value,
|
||
onInput: (e) => {
|
||
triggerTextChange(e.target.value);
|
||
},
|
||
autofocus,
|
||
placeholder,
|
||
ref: inputRef,
|
||
title: text.value
|
||
}, inputProps.value), {
|
||
size: getInputSize(picker2, formatList.value[0], generateConfig2)
|
||
}), getDataOrAriaProps(props)), {
|
||
autocomplete
|
||
});
|
||
const inputNode = props.inputRender ? props.inputRender(mergedInputProps) : createVNode("input", mergedInputProps, null);
|
||
const popupPlacement = direction === "rtl" ? "bottomRight" : "bottomLeft";
|
||
return createVNode("div", {
|
||
"ref": containerRef,
|
||
"class": classNames(prefixCls, attrs.class, {
|
||
[`${prefixCls}-disabled`]: disabled,
|
||
[`${prefixCls}-focused`]: focused.value,
|
||
[`${prefixCls}-rtl`]: direction === "rtl"
|
||
}),
|
||
"style": attrs.style,
|
||
"onMousedown": onMousedown,
|
||
"onMouseup": onInternalMouseup,
|
||
"onMouseenter": onMouseenter,
|
||
"onMouseleave": onMouseleave,
|
||
"onContextmenu": onContextmenu,
|
||
"onClick": onClick
|
||
}, [createVNode("div", {
|
||
"class": classNames(`${prefixCls}-input`, {
|
||
[`${prefixCls}-input-placeholder`]: !!hoverValue.value
|
||
}),
|
||
"ref": inputDivRef
|
||
}, [inputNode, suffixNode, clearNode]), createVNode(PickerTrigger, {
|
||
"visible": mergedOpen.value,
|
||
"popupStyle": popupStyle,
|
||
"prefixCls": prefixCls,
|
||
"dropdownClassName": dropdownClassName,
|
||
"dropdownAlign": dropdownAlign,
|
||
"getPopupContainer": getPopupContainer,
|
||
"transitionName": transitionName,
|
||
"popupPlacement": popupPlacement,
|
||
"direction": direction
|
||
}, {
|
||
default: () => [createVNode("div", {
|
||
"style": {
|
||
pointerEvents: "none",
|
||
position: "absolute",
|
||
top: 0,
|
||
bottom: 0,
|
||
left: 0,
|
||
right: 0
|
||
}
|
||
}, null)],
|
||
popupElement: () => panel
|
||
})]);
|
||
};
|
||
}
|
||
});
|
||
}
|
||
const Picker$1 = Picker();
|
||
function useRangeDisabled(_ref, openRecordsRef) {
|
||
let {
|
||
picker,
|
||
locale: locale2,
|
||
selectedValue,
|
||
disabledDate,
|
||
disabled,
|
||
generateConfig: generateConfig2
|
||
} = _ref;
|
||
const startDate = computed(() => getValue(selectedValue.value, 0));
|
||
const endDate = computed(() => getValue(selectedValue.value, 1));
|
||
function weekFirstDate(date) {
|
||
return generateConfig2.value.locale.getWeekFirstDate(locale2.value.locale, date);
|
||
}
|
||
function monthNumber(date) {
|
||
const year = generateConfig2.value.getYear(date);
|
||
const month = generateConfig2.value.getMonth(date);
|
||
return year * 100 + month;
|
||
}
|
||
function quarterNumber(date) {
|
||
const year = generateConfig2.value.getYear(date);
|
||
const quarter = getQuarter(generateConfig2.value, date);
|
||
return year * 10 + quarter;
|
||
}
|
||
const disabledStartDate = (date) => {
|
||
var _a;
|
||
if (disabledDate && ((_a = disabledDate === null || disabledDate === void 0 ? void 0 : disabledDate.value) === null || _a === void 0 ? void 0 : _a.call(disabledDate, date))) {
|
||
return true;
|
||
}
|
||
if (disabled[1] && endDate) {
|
||
return !isSameDate(generateConfig2.value, date, endDate.value) && generateConfig2.value.isAfter(date, endDate.value);
|
||
}
|
||
if (openRecordsRef.value[1] && endDate.value) {
|
||
switch (picker.value) {
|
||
case "quarter":
|
||
return quarterNumber(date) > quarterNumber(endDate.value);
|
||
case "month":
|
||
return monthNumber(date) > monthNumber(endDate.value);
|
||
case "week":
|
||
return weekFirstDate(date) > weekFirstDate(endDate.value);
|
||
default:
|
||
return !isSameDate(generateConfig2.value, date, endDate.value) && generateConfig2.value.isAfter(date, endDate.value);
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
const disabledEndDate = (date) => {
|
||
var _a;
|
||
if ((_a = disabledDate.value) === null || _a === void 0 ? void 0 : _a.call(disabledDate, date)) {
|
||
return true;
|
||
}
|
||
if (disabled[0] && startDate) {
|
||
return !isSameDate(generateConfig2.value, date, endDate.value) && generateConfig2.value.isAfter(startDate.value, date);
|
||
}
|
||
if (openRecordsRef.value[0] && startDate.value) {
|
||
switch (picker.value) {
|
||
case "quarter":
|
||
return quarterNumber(date) < quarterNumber(startDate.value);
|
||
case "month":
|
||
return monthNumber(date) < monthNumber(startDate.value);
|
||
case "week":
|
||
return weekFirstDate(date) < weekFirstDate(startDate.value);
|
||
default:
|
||
return !isSameDate(generateConfig2.value, date, startDate.value) && generateConfig2.value.isAfter(startDate.value, date);
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
return [disabledStartDate, disabledEndDate];
|
||
}
|
||
function getStartEndDistance(startDate, endDate, picker, generateConfig2) {
|
||
const startNext = getClosingViewDate(startDate, picker, generateConfig2, 1);
|
||
function getDistance(compareFunc) {
|
||
if (compareFunc(startDate, endDate)) {
|
||
return "same";
|
||
}
|
||
if (compareFunc(startNext, endDate)) {
|
||
return "closing";
|
||
}
|
||
return "far";
|
||
}
|
||
switch (picker) {
|
||
case "year":
|
||
return getDistance((start, end) => isSameDecade(generateConfig2, start, end));
|
||
case "quarter":
|
||
case "month":
|
||
return getDistance((start, end) => isSameYear(generateConfig2, start, end));
|
||
default:
|
||
return getDistance((start, end) => isSameMonth(generateConfig2, start, end));
|
||
}
|
||
}
|
||
function getRangeViewDate(values, index, picker, generateConfig2) {
|
||
const startDate = getValue(values, 0);
|
||
const endDate = getValue(values, 1);
|
||
if (index === 0) {
|
||
return startDate;
|
||
}
|
||
if (startDate && endDate) {
|
||
const distance = getStartEndDistance(startDate, endDate, picker, generateConfig2);
|
||
switch (distance) {
|
||
case "same":
|
||
return startDate;
|
||
case "closing":
|
||
return startDate;
|
||
default:
|
||
return getClosingViewDate(endDate, picker, generateConfig2, -1);
|
||
}
|
||
}
|
||
return startDate;
|
||
}
|
||
function useRangeViewDates(_ref) {
|
||
let {
|
||
values,
|
||
picker,
|
||
defaultDates,
|
||
generateConfig: generateConfig2
|
||
} = _ref;
|
||
const defaultViewDates = ref([getValue(defaultDates, 0), getValue(defaultDates, 1)]);
|
||
const viewDates = ref(null);
|
||
const startDate = computed(() => getValue(values.value, 0));
|
||
const endDate = computed(() => getValue(values.value, 1));
|
||
const getViewDate = (index) => {
|
||
if (defaultViewDates.value[index]) {
|
||
return defaultViewDates.value[index];
|
||
}
|
||
return getValue(viewDates.value, index) || getRangeViewDate(values.value, index, picker.value, generateConfig2.value) || startDate.value || endDate.value || generateConfig2.value.getNow();
|
||
};
|
||
const startViewDate = ref(null);
|
||
const endViewDate = ref(null);
|
||
watchEffect(() => {
|
||
startViewDate.value = getViewDate(0);
|
||
endViewDate.value = getViewDate(1);
|
||
});
|
||
function setViewDate(viewDate, index) {
|
||
if (viewDate) {
|
||
let newViewDates = updateValues(viewDates.value, viewDate, index);
|
||
defaultViewDates.value = updateValues(defaultViewDates.value, null, index) || [null, null];
|
||
const anotherIndex = (index + 1) % 2;
|
||
if (!getValue(values.value, anotherIndex)) {
|
||
newViewDates = updateValues(newViewDates, viewDate, anotherIndex);
|
||
}
|
||
viewDates.value = newViewDates;
|
||
} else if (startDate.value || endDate.value) {
|
||
viewDates.value = null;
|
||
}
|
||
}
|
||
return [startViewDate, endViewDate, setViewDate];
|
||
}
|
||
function tryOnScopeDispose(fn) {
|
||
if (getCurrentScope()) {
|
||
onScopeDispose(fn);
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
function resolveUnref(r) {
|
||
return typeof r === "function" ? r() : unref(r);
|
||
}
|
||
function unrefElement(elRef) {
|
||
var _a;
|
||
const plain = resolveUnref(elRef);
|
||
return (_a = plain === null || plain === void 0 ? void 0 : plain.$el) !== null && _a !== void 0 ? _a : plain;
|
||
}
|
||
function tryOnMounted(fn) {
|
||
let sync = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
|
||
if (getCurrentInstance()) onMounted(fn);
|
||
else if (sync) fn();
|
||
else nextTick(fn);
|
||
}
|
||
function useSupported(callback) {
|
||
let sync = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
|
||
const isSupported = shallowRef();
|
||
const update = () => isSupported.value = Boolean(callback());
|
||
update();
|
||
tryOnMounted(update, sync);
|
||
return isSupported;
|
||
}
|
||
const defaultWindow = void 0;
|
||
var __rest$2 = function(s, e) {
|
||
var t = {};
|
||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
|
||
if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
||
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
|
||
}
|
||
return t;
|
||
};
|
||
function useResizeObserver(target, callback) {
|
||
let options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
|
||
const {
|
||
window = defaultWindow
|
||
} = options, observerOptions = __rest$2(options, ["window"]);
|
||
let observer;
|
||
const isSupported = useSupported(() => window && "ResizeObserver" in window);
|
||
const cleanup = () => {
|
||
if (observer) {
|
||
observer.disconnect();
|
||
observer = void 0;
|
||
}
|
||
};
|
||
const stopWatch = watch(() => unrefElement(target), (el) => {
|
||
cleanup();
|
||
if (isSupported.value && window && el) {
|
||
observer = new ResizeObserver(callback);
|
||
observer.observe(el, observerOptions);
|
||
}
|
||
}, {
|
||
immediate: true,
|
||
flush: "post"
|
||
});
|
||
const stop = () => {
|
||
cleanup();
|
||
stopWatch();
|
||
};
|
||
tryOnScopeDispose(stop);
|
||
return {
|
||
isSupported,
|
||
stop
|
||
};
|
||
}
|
||
function useElementSize(target) {
|
||
let initialSize = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {
|
||
width: 0,
|
||
height: 0
|
||
};
|
||
let options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
|
||
const {
|
||
box = "content-box"
|
||
} = options;
|
||
const width = shallowRef(initialSize.width);
|
||
const height = shallowRef(initialSize.height);
|
||
useResizeObserver(target, (_ref) => {
|
||
let [entry] = _ref;
|
||
const boxSize = box === "border-box" ? entry.borderBoxSize : box === "content-box" ? entry.contentBoxSize : entry.devicePixelContentBoxSize;
|
||
if (boxSize) {
|
||
width.value = boxSize.reduce((acc, _ref2) => {
|
||
let {
|
||
inlineSize
|
||
} = _ref2;
|
||
return acc + inlineSize;
|
||
}, 0);
|
||
height.value = boxSize.reduce((acc, _ref3) => {
|
||
let {
|
||
blockSize
|
||
} = _ref3;
|
||
return acc + blockSize;
|
||
}, 0);
|
||
} else {
|
||
width.value = entry.contentRect.width;
|
||
height.value = entry.contentRect.height;
|
||
}
|
||
}, options);
|
||
watch(() => unrefElement(target), (ele) => {
|
||
width.value = ele ? initialSize.width : 0;
|
||
height.value = ele ? initialSize.height : 0;
|
||
});
|
||
return {
|
||
width,
|
||
height
|
||
};
|
||
}
|
||
function reorderValues(values, generateConfig2) {
|
||
if (values && values[0] && values[1] && generateConfig2.isAfter(values[0], values[1])) {
|
||
return [values[1], values[0]];
|
||
}
|
||
return values;
|
||
}
|
||
function canValueTrigger(value, index, disabled, allowEmpty) {
|
||
if (value) {
|
||
return true;
|
||
}
|
||
if (allowEmpty && allowEmpty[index]) {
|
||
return true;
|
||
}
|
||
if (disabled[(index + 1) % 2]) {
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
function RangerPicker() {
|
||
return defineComponent({
|
||
name: "RangerPicker",
|
||
inheritAttrs: false,
|
||
props: ["prefixCls", "id", "popupStyle", "dropdownClassName", "transitionName", "dropdownAlign", "getPopupContainer", "generateConfig", "locale", "placeholder", "autofocus", "disabled", "format", "picker", "showTime", "showNow", "showHour", "showMinute", "showSecond", "use12Hours", "separator", "value", "defaultValue", "defaultPickerValue", "open", "defaultOpen", "disabledDate", "disabledTime", "dateRender", "panelRender", "ranges", "allowEmpty", "allowClear", "suffixIcon", "clearIcon", "pickerRef", "inputReadOnly", "mode", "renderExtraFooter", "onChange", "onOpenChange", "onPanelChange", "onCalendarChange", "onFocus", "onBlur", "onMousedown", "onMouseup", "onMouseenter", "onMouseleave", "onClick", "onOk", "onKeydown", "components", "order", "direction", "activePickerIndex", "autocomplete", "minuteStep", "hourStep", "secondStep", "hideDisabledOptions", "disabledMinutes", "presets", "prevIcon", "nextIcon", "superPrevIcon", "superNextIcon"],
|
||
setup(props, _ref) {
|
||
let {
|
||
attrs,
|
||
expose
|
||
} = _ref;
|
||
const needConfirmButton = computed(() => props.picker === "date" && !!props.showTime || props.picker === "time");
|
||
const presets = computed(() => props.presets);
|
||
const ranges = computed(() => props.ranges);
|
||
const presetList = usePresets(presets, ranges);
|
||
const openRecordsRef = ref({});
|
||
const containerRef = ref(null);
|
||
const panelDivRef = ref(null);
|
||
const startInputDivRef = ref(null);
|
||
const endInputDivRef = ref(null);
|
||
const separatorRef = ref(null);
|
||
const startInputRef = ref(null);
|
||
const endInputRef = ref(null);
|
||
const arrowRef = ref(null);
|
||
const formatList = computed(() => toArray$1(getDefaultFormat(props.format, props.picker, props.showTime, props.use12Hours)));
|
||
const [mergedActivePickerIndex, setMergedActivePickerIndex] = useMergedState(0, {
|
||
value: toRef(props, "activePickerIndex")
|
||
});
|
||
const operationRef = ref(null);
|
||
const mergedDisabled = computed(() => {
|
||
const {
|
||
disabled
|
||
} = props;
|
||
if (Array.isArray(disabled)) {
|
||
return disabled;
|
||
}
|
||
return [disabled || false, disabled || false];
|
||
});
|
||
const [mergedValue, setInnerValue] = useMergedState(null, {
|
||
value: toRef(props, "value"),
|
||
defaultValue: props.defaultValue,
|
||
postState: (values) => props.picker === "time" && !props.order ? values : reorderValues(values, props.generateConfig)
|
||
});
|
||
const [startViewDate, endViewDate, setViewDate] = useRangeViewDates({
|
||
values: mergedValue,
|
||
picker: toRef(props, "picker"),
|
||
defaultDates: props.defaultPickerValue,
|
||
generateConfig: toRef(props, "generateConfig")
|
||
});
|
||
const [selectedValue, setSelectedValue] = useMergedState(mergedValue.value, {
|
||
postState: (values) => {
|
||
let postValues = values;
|
||
if (mergedDisabled.value[0] && mergedDisabled.value[1]) {
|
||
return postValues;
|
||
}
|
||
for (let i = 0; i < 2; i += 1) {
|
||
if (mergedDisabled.value[i] && !getValue(postValues, i) && !getValue(props.allowEmpty, i)) {
|
||
postValues = updateValues(postValues, props.generateConfig.getNow(), i);
|
||
}
|
||
}
|
||
return postValues;
|
||
}
|
||
});
|
||
const [mergedModes, setInnerModes] = useMergedState([props.picker, props.picker], {
|
||
value: toRef(props, "mode")
|
||
});
|
||
watch(() => props.picker, () => {
|
||
setInnerModes([props.picker, props.picker]);
|
||
});
|
||
const triggerModesChange = (modes, values) => {
|
||
var _a;
|
||
setInnerModes(modes);
|
||
(_a = props.onPanelChange) === null || _a === void 0 ? void 0 : _a.call(props, values, modes);
|
||
};
|
||
const [disabledStartDate, disabledEndDate] = useRangeDisabled({
|
||
picker: toRef(props, "picker"),
|
||
selectedValue,
|
||
locale: toRef(props, "locale"),
|
||
disabled: mergedDisabled,
|
||
disabledDate: toRef(props, "disabledDate"),
|
||
generateConfig: toRef(props, "generateConfig")
|
||
}, openRecordsRef);
|
||
const [mergedOpen, triggerInnerOpen] = useMergedState(false, {
|
||
value: toRef(props, "open"),
|
||
defaultValue: props.defaultOpen,
|
||
postState: (postOpen) => mergedDisabled.value[mergedActivePickerIndex.value] ? false : postOpen,
|
||
onChange: (newOpen) => {
|
||
var _a;
|
||
(_a = props.onOpenChange) === null || _a === void 0 ? void 0 : _a.call(props, newOpen);
|
||
if (!newOpen && operationRef.value && operationRef.value.onClose) {
|
||
operationRef.value.onClose();
|
||
}
|
||
}
|
||
});
|
||
const startOpen = computed(() => mergedOpen.value && mergedActivePickerIndex.value === 0);
|
||
const endOpen = computed(() => mergedOpen.value && mergedActivePickerIndex.value === 1);
|
||
const panelLeft = ref(0);
|
||
const arrowLeft = ref(0);
|
||
const popupMinWidth = ref(0);
|
||
const {
|
||
width: containerWidth
|
||
} = useElementSize(containerRef);
|
||
watch([mergedOpen, containerWidth], () => {
|
||
if (!mergedOpen.value && containerRef.value) {
|
||
popupMinWidth.value = containerWidth.value;
|
||
}
|
||
});
|
||
const {
|
||
width: panelDivWidth
|
||
} = useElementSize(panelDivRef);
|
||
const {
|
||
width: arrowWidth
|
||
} = useElementSize(arrowRef);
|
||
const {
|
||
width: startInputDivWidth
|
||
} = useElementSize(startInputDivRef);
|
||
const {
|
||
width: separatorWidth
|
||
} = useElementSize(separatorRef);
|
||
watch([mergedActivePickerIndex, mergedOpen, panelDivWidth, arrowWidth, startInputDivWidth, separatorWidth, () => props.direction], () => {
|
||
arrowLeft.value = 0;
|
||
if (mergedActivePickerIndex.value) {
|
||
if (startInputDivRef.value && separatorRef.value) {
|
||
arrowLeft.value = startInputDivWidth.value + separatorWidth.value;
|
||
if (panelDivWidth.value && arrowWidth.value && arrowLeft.value > panelDivWidth.value - arrowWidth.value - (props.direction === "rtl" || arrowRef.value.offsetLeft > arrowLeft.value ? 0 : arrowRef.value.offsetLeft)) {
|
||
panelLeft.value = arrowLeft.value;
|
||
}
|
||
}
|
||
} else if (mergedActivePickerIndex.value === 0) {
|
||
panelLeft.value = 0;
|
||
}
|
||
}, {
|
||
immediate: true
|
||
});
|
||
const triggerRef = ref();
|
||
function triggerOpen(newOpen, index) {
|
||
if (newOpen) {
|
||
clearTimeout(triggerRef.value);
|
||
openRecordsRef.value[index] = true;
|
||
setMergedActivePickerIndex(index);
|
||
triggerInnerOpen(newOpen);
|
||
if (!mergedOpen.value) {
|
||
setViewDate(null, index);
|
||
}
|
||
} else if (mergedActivePickerIndex.value === index) {
|
||
triggerInnerOpen(newOpen);
|
||
const openRecords = openRecordsRef.value;
|
||
triggerRef.value = setTimeout(() => {
|
||
if (openRecords === openRecordsRef.value) {
|
||
openRecordsRef.value = {};
|
||
}
|
||
});
|
||
}
|
||
}
|
||
function triggerOpenAndFocus(index) {
|
||
triggerOpen(true, index);
|
||
setTimeout(() => {
|
||
const inputRef = [startInputRef, endInputRef][index];
|
||
if (inputRef.value) {
|
||
inputRef.value.focus();
|
||
}
|
||
}, 0);
|
||
}
|
||
function triggerChange(newValue, sourceIndex) {
|
||
let values = newValue;
|
||
let startValue = getValue(values, 0);
|
||
let endValue = getValue(values, 1);
|
||
const {
|
||
generateConfig: generateConfig2,
|
||
locale: locale2,
|
||
picker,
|
||
order,
|
||
onCalendarChange,
|
||
allowEmpty,
|
||
onChange,
|
||
showTime
|
||
} = props;
|
||
if (startValue && endValue && generateConfig2.isAfter(startValue, endValue)) {
|
||
if (
|
||
// WeekPicker only compare week
|
||
picker === "week" && !isSameWeek(generateConfig2, locale2.locale, startValue, endValue) || // QuotaPicker only compare week
|
||
picker === "quarter" && !isSameQuarter(generateConfig2, startValue, endValue) || // Other non-TimePicker compare date
|
||
picker !== "week" && picker !== "quarter" && picker !== "time" && !(showTime ? isEqual(generateConfig2, startValue, endValue) : isSameDate(generateConfig2, startValue, endValue))
|
||
) {
|
||
if (sourceIndex === 0) {
|
||
values = [startValue, null];
|
||
endValue = null;
|
||
} else {
|
||
startValue = null;
|
||
values = [null, endValue];
|
||
}
|
||
openRecordsRef.value = {
|
||
[sourceIndex]: true
|
||
};
|
||
} else if (picker !== "time" || order !== false) {
|
||
values = reorderValues(values, generateConfig2);
|
||
}
|
||
}
|
||
setSelectedValue(values);
|
||
const startStr2 = values && values[0] ? formatValue(values[0], {
|
||
generateConfig: generateConfig2,
|
||
locale: locale2,
|
||
format: formatList.value[0]
|
||
}) : "";
|
||
const endStr2 = values && values[1] ? formatValue(values[1], {
|
||
generateConfig: generateConfig2,
|
||
locale: locale2,
|
||
format: formatList.value[0]
|
||
}) : "";
|
||
if (onCalendarChange) {
|
||
const info = {
|
||
range: sourceIndex === 0 ? "start" : "end"
|
||
};
|
||
onCalendarChange(values, [startStr2, endStr2], info);
|
||
}
|
||
const canStartValueTrigger = canValueTrigger(startValue, 0, mergedDisabled.value, allowEmpty);
|
||
const canEndValueTrigger = canValueTrigger(endValue, 1, mergedDisabled.value, allowEmpty);
|
||
const canTrigger = values === null || canStartValueTrigger && canEndValueTrigger;
|
||
if (canTrigger) {
|
||
setInnerValue(values);
|
||
if (onChange && (!isEqual(generateConfig2, getValue(mergedValue.value, 0), startValue) || !isEqual(generateConfig2, getValue(mergedValue.value, 1), endValue))) {
|
||
onChange(values, [startStr2, endStr2]);
|
||
}
|
||
}
|
||
let nextOpenIndex = null;
|
||
if (sourceIndex === 0 && !mergedDisabled.value[1]) {
|
||
nextOpenIndex = 1;
|
||
} else if (sourceIndex === 1 && !mergedDisabled.value[0]) {
|
||
nextOpenIndex = 0;
|
||
}
|
||
if (nextOpenIndex !== null && nextOpenIndex !== mergedActivePickerIndex.value && (!openRecordsRef.value[nextOpenIndex] || !getValue(values, nextOpenIndex)) && getValue(values, sourceIndex)) {
|
||
triggerOpenAndFocus(nextOpenIndex);
|
||
} else {
|
||
triggerOpen(false, sourceIndex);
|
||
}
|
||
}
|
||
const forwardKeydown = (e) => {
|
||
if (mergedOpen && operationRef.value && operationRef.value.onKeydown) {
|
||
return operationRef.value.onKeydown(e);
|
||
}
|
||
{
|
||
return false;
|
||
}
|
||
};
|
||
const sharedTextHooksProps = {
|
||
formatList,
|
||
generateConfig: toRef(props, "generateConfig"),
|
||
locale: toRef(props, "locale")
|
||
};
|
||
const [startValueTexts, firstStartValueText] = useValueTexts(computed(() => getValue(selectedValue.value, 0)), sharedTextHooksProps);
|
||
const [endValueTexts, firstEndValueText] = useValueTexts(computed(() => getValue(selectedValue.value, 1)), sharedTextHooksProps);
|
||
const onTextChange = (newText, index) => {
|
||
const inputDate = parseValue(newText, {
|
||
locale: props.locale,
|
||
formatList: formatList.value,
|
||
generateConfig: props.generateConfig
|
||
});
|
||
const disabledFunc = index === 0 ? disabledStartDate : disabledEndDate;
|
||
if (inputDate && !disabledFunc(inputDate)) {
|
||
setSelectedValue(updateValues(selectedValue.value, inputDate, index));
|
||
setViewDate(inputDate, index);
|
||
}
|
||
};
|
||
const [startText, triggerStartTextChange, resetStartText] = useTextValueMapping({
|
||
valueTexts: startValueTexts,
|
||
onTextChange: (newText) => onTextChange(newText, 0)
|
||
});
|
||
const [endText, triggerEndTextChange, resetEndText] = useTextValueMapping({
|
||
valueTexts: endValueTexts,
|
||
onTextChange: (newText) => onTextChange(newText, 1)
|
||
});
|
||
const [rangeHoverValue, setRangeHoverValue] = useState$1(null);
|
||
const [hoverRangedValue, setHoverRangedValue] = useState$1(null);
|
||
const [startHoverValue, onStartEnter, onStartLeave] = useHoverValue(startText, sharedTextHooksProps);
|
||
const [endHoverValue, onEndEnter, onEndLeave] = useHoverValue(endText, sharedTextHooksProps);
|
||
const onDateMouseenter = (date) => {
|
||
setHoverRangedValue(updateValues(selectedValue.value, date, mergedActivePickerIndex.value));
|
||
if (mergedActivePickerIndex.value === 0) {
|
||
onStartEnter(date);
|
||
} else {
|
||
onEndEnter(date);
|
||
}
|
||
};
|
||
const onDateMouseleave = () => {
|
||
setHoverRangedValue(updateValues(selectedValue.value, null, mergedActivePickerIndex.value));
|
||
if (mergedActivePickerIndex.value === 0) {
|
||
onStartLeave();
|
||
} else {
|
||
onEndLeave();
|
||
}
|
||
};
|
||
const getSharedInputHookProps = (index, resetText) => ({
|
||
forwardKeydown,
|
||
onBlur: (e) => {
|
||
var _a;
|
||
(_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, e);
|
||
},
|
||
isClickOutside: (target) => !elementsContains([panelDivRef.value, startInputDivRef.value, endInputDivRef.value, containerRef.value], target),
|
||
onFocus: (e) => {
|
||
var _a;
|
||
setMergedActivePickerIndex(index);
|
||
(_a = props.onFocus) === null || _a === void 0 ? void 0 : _a.call(props, e);
|
||
},
|
||
triggerOpen: (newOpen) => {
|
||
triggerOpen(newOpen, index);
|
||
},
|
||
onSubmit: () => {
|
||
if (
|
||
// When user typing disabledDate with keyboard and enter, this value will be empty
|
||
!selectedValue.value || // Normal disabled check
|
||
props.disabledDate && props.disabledDate(selectedValue.value[index])
|
||
) {
|
||
return false;
|
||
}
|
||
triggerChange(selectedValue.value, index);
|
||
resetText();
|
||
},
|
||
onCancel: () => {
|
||
triggerOpen(false, index);
|
||
setSelectedValue(mergedValue.value);
|
||
resetText();
|
||
}
|
||
});
|
||
const [startInputProps, {
|
||
focused: startFocused,
|
||
typing: startTyping
|
||
}] = usePickerInput(_extends(_extends({}, getSharedInputHookProps(0, resetStartText)), {
|
||
blurToCancel: needConfirmButton,
|
||
open: startOpen,
|
||
value: startText,
|
||
onKeydown: (e, preventDefault) => {
|
||
var _a;
|
||
(_a = props.onKeydown) === null || _a === void 0 ? void 0 : _a.call(props, e, preventDefault);
|
||
}
|
||
}));
|
||
const [endInputProps, {
|
||
focused: endFocused,
|
||
typing: endTyping
|
||
}] = usePickerInput(_extends(_extends({}, getSharedInputHookProps(1, resetEndText)), {
|
||
blurToCancel: needConfirmButton,
|
||
open: endOpen,
|
||
value: endText,
|
||
onKeydown: (e, preventDefault) => {
|
||
var _a;
|
||
(_a = props.onKeydown) === null || _a === void 0 ? void 0 : _a.call(props, e, preventDefault);
|
||
}
|
||
}));
|
||
const onPickerClick = (e) => {
|
||
var _a;
|
||
(_a = props.onClick) === null || _a === void 0 ? void 0 : _a.call(props, e);
|
||
if (!mergedOpen.value && !startInputRef.value.contains(e.target) && !endInputRef.value.contains(e.target)) {
|
||
if (!mergedDisabled.value[0]) {
|
||
triggerOpenAndFocus(0);
|
||
} else if (!mergedDisabled.value[1]) {
|
||
triggerOpenAndFocus(1);
|
||
}
|
||
}
|
||
};
|
||
const onPickerMousedown = (e) => {
|
||
var _a;
|
||
(_a = props.onMousedown) === null || _a === void 0 ? void 0 : _a.call(props, e);
|
||
if (mergedOpen.value && (startFocused.value || endFocused.value) && !startInputRef.value.contains(e.target) && !endInputRef.value.contains(e.target)) {
|
||
e.preventDefault();
|
||
}
|
||
};
|
||
const startStr = computed(() => {
|
||
var _a;
|
||
return ((_a = mergedValue.value) === null || _a === void 0 ? void 0 : _a[0]) ? formatValue(mergedValue.value[0], {
|
||
locale: props.locale,
|
||
format: "YYYYMMDDHHmmss",
|
||
generateConfig: props.generateConfig
|
||
}) : "";
|
||
});
|
||
const endStr = computed(() => {
|
||
var _a;
|
||
return ((_a = mergedValue.value) === null || _a === void 0 ? void 0 : _a[1]) ? formatValue(mergedValue.value[1], {
|
||
locale: props.locale,
|
||
format: "YYYYMMDDHHmmss",
|
||
generateConfig: props.generateConfig
|
||
}) : "";
|
||
});
|
||
watch([mergedOpen, startValueTexts, endValueTexts], () => {
|
||
if (!mergedOpen.value) {
|
||
setSelectedValue(mergedValue.value);
|
||
if (!startValueTexts.value.length || startValueTexts.value[0] === "") {
|
||
triggerStartTextChange("");
|
||
} else if (firstStartValueText.value !== startText.value) {
|
||
resetStartText();
|
||
}
|
||
if (!endValueTexts.value.length || endValueTexts.value[0] === "") {
|
||
triggerEndTextChange("");
|
||
} else if (firstEndValueText.value !== endText.value) {
|
||
resetEndText();
|
||
}
|
||
}
|
||
});
|
||
watch([startStr, endStr], () => {
|
||
setSelectedValue(mergedValue.value);
|
||
});
|
||
expose({
|
||
focus: () => {
|
||
if (startInputRef.value) {
|
||
startInputRef.value.focus();
|
||
}
|
||
},
|
||
blur: () => {
|
||
if (startInputRef.value) {
|
||
startInputRef.value.blur();
|
||
}
|
||
if (endInputRef.value) {
|
||
endInputRef.value.blur();
|
||
}
|
||
}
|
||
});
|
||
const panelHoverRangedValue = computed(() => {
|
||
if (mergedOpen.value && hoverRangedValue.value && hoverRangedValue.value[0] && hoverRangedValue.value[1] && props.generateConfig.isAfter(hoverRangedValue.value[1], hoverRangedValue.value[0])) {
|
||
return hoverRangedValue.value;
|
||
} else {
|
||
return null;
|
||
}
|
||
});
|
||
function renderPanel() {
|
||
let panelPosition = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
|
||
let panelProps = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
||
const {
|
||
generateConfig: generateConfig2,
|
||
showTime,
|
||
dateRender,
|
||
direction,
|
||
disabledTime,
|
||
prefixCls,
|
||
locale: locale2
|
||
} = props;
|
||
let panelShowTime = showTime;
|
||
if (showTime && typeof showTime === "object" && showTime.defaultValue) {
|
||
const timeDefaultValues = showTime.defaultValue;
|
||
panelShowTime = _extends(_extends({}, showTime), {
|
||
defaultValue: getValue(timeDefaultValues, mergedActivePickerIndex.value) || void 0
|
||
});
|
||
}
|
||
let panelDateRender = null;
|
||
if (dateRender) {
|
||
panelDateRender = (_ref2) => {
|
||
let {
|
||
current: date,
|
||
today
|
||
} = _ref2;
|
||
return dateRender({
|
||
current: date,
|
||
today,
|
||
info: {
|
||
range: mergedActivePickerIndex.value ? "end" : "start"
|
||
}
|
||
});
|
||
};
|
||
}
|
||
return createVNode(RangeContextProvider, {
|
||
"value": {
|
||
inRange: true,
|
||
panelPosition,
|
||
rangedValue: rangeHoverValue.value || selectedValue.value,
|
||
hoverRangedValue: panelHoverRangedValue.value
|
||
}
|
||
}, {
|
||
default: () => [createVNode(PickerPanel$1, _objectSpread$3(_objectSpread$3(_objectSpread$3({}, props), panelProps), {}, {
|
||
"dateRender": panelDateRender,
|
||
"showTime": panelShowTime,
|
||
"mode": mergedModes.value[mergedActivePickerIndex.value],
|
||
"generateConfig": generateConfig2,
|
||
"style": void 0,
|
||
"direction": direction,
|
||
"disabledDate": mergedActivePickerIndex.value === 0 ? disabledStartDate : disabledEndDate,
|
||
"disabledTime": (date) => {
|
||
if (disabledTime) {
|
||
return disabledTime(date, mergedActivePickerIndex.value === 0 ? "start" : "end");
|
||
}
|
||
return false;
|
||
},
|
||
"class": classNames({
|
||
[`${prefixCls}-panel-focused`]: mergedActivePickerIndex.value === 0 ? !startTyping.value : !endTyping.value
|
||
}),
|
||
"value": getValue(selectedValue.value, mergedActivePickerIndex.value),
|
||
"locale": locale2,
|
||
"tabIndex": -1,
|
||
"onPanelChange": (date, newMode) => {
|
||
if (mergedActivePickerIndex.value === 0) {
|
||
onStartLeave(true);
|
||
}
|
||
if (mergedActivePickerIndex.value === 1) {
|
||
onEndLeave(true);
|
||
}
|
||
triggerModesChange(updateValues(mergedModes.value, newMode, mergedActivePickerIndex.value), updateValues(selectedValue.value, date, mergedActivePickerIndex.value));
|
||
let viewDate = date;
|
||
if (panelPosition === "right" && mergedModes.value[mergedActivePickerIndex.value] === newMode) {
|
||
viewDate = getClosingViewDate(viewDate, newMode, generateConfig2, -1);
|
||
}
|
||
setViewDate(viewDate, mergedActivePickerIndex.value);
|
||
},
|
||
"onOk": null,
|
||
"onSelect": void 0,
|
||
"onChange": void 0,
|
||
"defaultValue": mergedActivePickerIndex.value === 0 ? getValue(selectedValue.value, 1) : getValue(selectedValue.value, 0)
|
||
}), null)]
|
||
});
|
||
}
|
||
const onContextSelect = (date, type) => {
|
||
const values = updateValues(selectedValue.value, date, mergedActivePickerIndex.value);
|
||
if (type === "submit" || type !== "key" && !needConfirmButton.value) {
|
||
triggerChange(values, mergedActivePickerIndex.value);
|
||
if (mergedActivePickerIndex.value === 0) {
|
||
onStartLeave();
|
||
} else {
|
||
onEndLeave();
|
||
}
|
||
} else {
|
||
setSelectedValue(values);
|
||
}
|
||
};
|
||
useProvidePanel({
|
||
operationRef,
|
||
hideHeader: computed(() => props.picker === "time"),
|
||
onDateMouseenter,
|
||
onDateMouseleave,
|
||
hideRanges: computed(() => true),
|
||
onSelect: onContextSelect,
|
||
open: mergedOpen
|
||
});
|
||
return () => {
|
||
const {
|
||
prefixCls = "rc-picker",
|
||
id,
|
||
popupStyle,
|
||
dropdownClassName,
|
||
transitionName,
|
||
dropdownAlign,
|
||
getPopupContainer,
|
||
generateConfig: generateConfig2,
|
||
locale: locale2,
|
||
placeholder,
|
||
autofocus,
|
||
picker = "date",
|
||
showTime,
|
||
separator = "~",
|
||
disabledDate,
|
||
panelRender,
|
||
allowClear,
|
||
suffixIcon,
|
||
clearIcon,
|
||
inputReadOnly,
|
||
renderExtraFooter,
|
||
onMouseenter,
|
||
onMouseleave,
|
||
onMouseup,
|
||
onOk,
|
||
components,
|
||
direction,
|
||
autocomplete = "off"
|
||
} = props;
|
||
const arrowPositionStyle = direction === "rtl" ? {
|
||
right: `${arrowLeft.value}px`
|
||
} : {
|
||
left: `${arrowLeft.value}px`
|
||
};
|
||
function renderPanels() {
|
||
let panels;
|
||
const extraNode = getExtraFooter(prefixCls, mergedModes.value[mergedActivePickerIndex.value], renderExtraFooter);
|
||
const rangesNode = getRanges({
|
||
prefixCls,
|
||
components,
|
||
needConfirmButton: needConfirmButton.value,
|
||
okDisabled: !getValue(selectedValue.value, mergedActivePickerIndex.value) || disabledDate && disabledDate(selectedValue.value[mergedActivePickerIndex.value]),
|
||
locale: locale2,
|
||
onOk: () => {
|
||
if (getValue(selectedValue.value, mergedActivePickerIndex.value)) {
|
||
triggerChange(selectedValue.value, mergedActivePickerIndex.value);
|
||
if (onOk) {
|
||
onOk(selectedValue.value);
|
||
}
|
||
}
|
||
}
|
||
});
|
||
if (picker !== "time" && !showTime) {
|
||
const viewDate = mergedActivePickerIndex.value === 0 ? startViewDate.value : endViewDate.value;
|
||
const nextViewDate = getClosingViewDate(viewDate, picker, generateConfig2);
|
||
const currentMode = mergedModes.value[mergedActivePickerIndex.value];
|
||
const showDoublePanel = currentMode === picker;
|
||
const leftPanel = renderPanel(showDoublePanel ? "left" : false, {
|
||
pickerValue: viewDate,
|
||
onPickerValueChange: (newViewDate) => {
|
||
setViewDate(newViewDate, mergedActivePickerIndex.value);
|
||
}
|
||
});
|
||
const rightPanel = renderPanel("right", {
|
||
pickerValue: nextViewDate,
|
||
onPickerValueChange: (newViewDate) => {
|
||
setViewDate(getClosingViewDate(newViewDate, picker, generateConfig2, -1), mergedActivePickerIndex.value);
|
||
}
|
||
});
|
||
if (direction === "rtl") {
|
||
panels = createVNode(Fragment, null, [rightPanel, showDoublePanel && leftPanel]);
|
||
} else {
|
||
panels = createVNode(Fragment, null, [leftPanel, showDoublePanel && rightPanel]);
|
||
}
|
||
} else {
|
||
panels = renderPanel();
|
||
}
|
||
let mergedNodes = createVNode("div", {
|
||
"class": `${prefixCls}-panel-layout`
|
||
}, [createVNode(PresetPanel, {
|
||
"prefixCls": prefixCls,
|
||
"presets": presetList.value,
|
||
"onClick": (nextValue) => {
|
||
triggerChange(nextValue, null);
|
||
triggerOpen(false, mergedActivePickerIndex.value);
|
||
},
|
||
"onHover": (hoverValue) => {
|
||
setRangeHoverValue(hoverValue);
|
||
}
|
||
}, null), createVNode("div", null, [createVNode("div", {
|
||
"class": `${prefixCls}-panels`
|
||
}, [panels]), (extraNode || rangesNode) && createVNode("div", {
|
||
"class": `${prefixCls}-footer`
|
||
}, [extraNode, rangesNode])])]);
|
||
if (panelRender) {
|
||
mergedNodes = panelRender(mergedNodes);
|
||
}
|
||
return createVNode("div", {
|
||
"class": `${prefixCls}-panel-container`,
|
||
"style": {
|
||
marginLeft: `${panelLeft.value}px`
|
||
},
|
||
"ref": panelDivRef,
|
||
"onMousedown": (e) => {
|
||
e.preventDefault();
|
||
}
|
||
}, [mergedNodes]);
|
||
}
|
||
const rangePanel = createVNode("div", {
|
||
"class": classNames(`${prefixCls}-range-wrapper`, `${prefixCls}-${picker}-range-wrapper`),
|
||
"style": {
|
||
minWidth: `${popupMinWidth.value}px`
|
||
}
|
||
}, [createVNode("div", {
|
||
"ref": arrowRef,
|
||
"class": `${prefixCls}-range-arrow`,
|
||
"style": arrowPositionStyle
|
||
}, null), renderPanels()]);
|
||
let suffixNode;
|
||
if (suffixIcon) {
|
||
suffixNode = createVNode("span", {
|
||
"class": `${prefixCls}-suffix`
|
||
}, [suffixIcon]);
|
||
}
|
||
let clearNode;
|
||
if (allowClear && (getValue(mergedValue.value, 0) && !mergedDisabled.value[0] || getValue(mergedValue.value, 1) && !mergedDisabled.value[1])) {
|
||
clearNode = createVNode("span", {
|
||
"onMousedown": (e) => {
|
||
e.preventDefault();
|
||
e.stopPropagation();
|
||
},
|
||
"onMouseup": (e) => {
|
||
e.preventDefault();
|
||
e.stopPropagation();
|
||
let values = mergedValue.value;
|
||
if (!mergedDisabled.value[0]) {
|
||
values = updateValues(values, null, 0);
|
||
}
|
||
if (!mergedDisabled.value[1]) {
|
||
values = updateValues(values, null, 1);
|
||
}
|
||
triggerChange(values, null);
|
||
triggerOpen(false, mergedActivePickerIndex.value);
|
||
},
|
||
"class": `${prefixCls}-clear`
|
||
}, [clearIcon || createVNode("span", {
|
||
"class": `${prefixCls}-clear-btn`
|
||
}, null)]);
|
||
}
|
||
const inputSharedProps = {
|
||
size: getInputSize(picker, formatList.value[0], generateConfig2)
|
||
};
|
||
let activeBarLeft = 0;
|
||
let activeBarWidth = 0;
|
||
if (startInputDivRef.value && endInputDivRef.value && separatorRef.value) {
|
||
if (mergedActivePickerIndex.value === 0) {
|
||
activeBarWidth = startInputDivRef.value.offsetWidth;
|
||
} else {
|
||
activeBarLeft = arrowLeft.value;
|
||
activeBarWidth = endInputDivRef.value.offsetWidth;
|
||
}
|
||
}
|
||
const activeBarPositionStyle = direction === "rtl" ? {
|
||
right: `${activeBarLeft}px`
|
||
} : {
|
||
left: `${activeBarLeft}px`
|
||
};
|
||
return createVNode("div", _objectSpread$3({
|
||
"ref": containerRef,
|
||
"class": classNames(prefixCls, `${prefixCls}-range`, attrs.class, {
|
||
[`${prefixCls}-disabled`]: mergedDisabled.value[0] && mergedDisabled.value[1],
|
||
[`${prefixCls}-focused`]: mergedActivePickerIndex.value === 0 ? startFocused.value : endFocused.value,
|
||
[`${prefixCls}-rtl`]: direction === "rtl"
|
||
}),
|
||
"style": attrs.style,
|
||
"onClick": onPickerClick,
|
||
"onMouseenter": onMouseenter,
|
||
"onMouseleave": onMouseleave,
|
||
"onMousedown": onPickerMousedown,
|
||
"onMouseup": onMouseup
|
||
}, getDataOrAriaProps(props)), [createVNode("div", {
|
||
"class": classNames(`${prefixCls}-input`, {
|
||
[`${prefixCls}-input-active`]: mergedActivePickerIndex.value === 0,
|
||
[`${prefixCls}-input-placeholder`]: !!startHoverValue.value
|
||
}),
|
||
"ref": startInputDivRef
|
||
}, [createVNode("input", _objectSpread$3(_objectSpread$3(_objectSpread$3({
|
||
"id": id,
|
||
"disabled": mergedDisabled.value[0],
|
||
"readonly": inputReadOnly || typeof formatList.value[0] === "function" || !startTyping.value,
|
||
"value": startHoverValue.value || startText.value,
|
||
"onInput": (e) => {
|
||
triggerStartTextChange(e.target.value);
|
||
},
|
||
"autofocus": autofocus,
|
||
"placeholder": getValue(placeholder, 0) || "",
|
||
"ref": startInputRef
|
||
}, startInputProps.value), inputSharedProps), {}, {
|
||
"autocomplete": autocomplete
|
||
}), null)]), createVNode("div", {
|
||
"class": `${prefixCls}-range-separator`,
|
||
"ref": separatorRef
|
||
}, [separator]), createVNode("div", {
|
||
"class": classNames(`${prefixCls}-input`, {
|
||
[`${prefixCls}-input-active`]: mergedActivePickerIndex.value === 1,
|
||
[`${prefixCls}-input-placeholder`]: !!endHoverValue.value
|
||
}),
|
||
"ref": endInputDivRef
|
||
}, [createVNode("input", _objectSpread$3(_objectSpread$3(_objectSpread$3({
|
||
"disabled": mergedDisabled.value[1],
|
||
"readonly": inputReadOnly || typeof formatList.value[0] === "function" || !endTyping.value,
|
||
"value": endHoverValue.value || endText.value,
|
||
"onInput": (e) => {
|
||
triggerEndTextChange(e.target.value);
|
||
},
|
||
"placeholder": getValue(placeholder, 1) || "",
|
||
"ref": endInputRef
|
||
}, endInputProps.value), inputSharedProps), {}, {
|
||
"autocomplete": autocomplete
|
||
}), null)]), createVNode("div", {
|
||
"class": `${prefixCls}-active-bar`,
|
||
"style": _extends(_extends({}, activeBarPositionStyle), {
|
||
width: `${activeBarWidth}px`,
|
||
position: "absolute"
|
||
})
|
||
}, null), suffixNode, clearNode, createVNode(PickerTrigger, {
|
||
"visible": mergedOpen.value,
|
||
"popupStyle": popupStyle,
|
||
"prefixCls": prefixCls,
|
||
"dropdownClassName": dropdownClassName,
|
||
"dropdownAlign": dropdownAlign,
|
||
"getPopupContainer": getPopupContainer,
|
||
"transitionName": transitionName,
|
||
"range": true,
|
||
"direction": direction
|
||
}, {
|
||
default: () => [createVNode("div", {
|
||
"style": {
|
||
pointerEvents: "none",
|
||
position: "absolute",
|
||
top: 0,
|
||
bottom: 0,
|
||
left: 0,
|
||
right: 0
|
||
}
|
||
}, null)],
|
||
popupElement: () => rangePanel
|
||
})]);
|
||
};
|
||
}
|
||
});
|
||
}
|
||
const InterRangerPicker = RangerPicker();
|
||
const genPikerPadding = (token, inputHeight, fontSize, paddingHorizontal) => {
|
||
const {
|
||
lineHeight
|
||
} = token;
|
||
const fontHeight = Math.floor(fontSize * lineHeight) + 2;
|
||
const paddingTop = Math.max((inputHeight - fontHeight) / 2, 0);
|
||
const paddingBottom = Math.max(inputHeight - fontHeight - paddingTop, 0);
|
||
return {
|
||
padding: `${paddingTop}px ${paddingHorizontal}px ${paddingBottom}px`
|
||
};
|
||
};
|
||
const genPickerCellInnerStyle = (token) => {
|
||
const {
|
||
componentCls,
|
||
pickerCellCls,
|
||
pickerCellInnerCls,
|
||
pickerPanelCellHeight,
|
||
motionDurationSlow,
|
||
borderRadiusSM,
|
||
motionDurationMid,
|
||
controlItemBgHover,
|
||
lineWidth,
|
||
lineType,
|
||
colorPrimary,
|
||
controlItemBgActive,
|
||
colorTextLightSolid,
|
||
controlHeightSM,
|
||
pickerDateHoverRangeBorderColor,
|
||
pickerCellBorderGap,
|
||
pickerBasicCellHoverWithRangeColor,
|
||
pickerPanelCellWidth,
|
||
colorTextDisabled,
|
||
colorBgContainerDisabled
|
||
} = token;
|
||
return {
|
||
"&::before": {
|
||
position: "absolute",
|
||
top: "50%",
|
||
insetInlineStart: 0,
|
||
insetInlineEnd: 0,
|
||
zIndex: 1,
|
||
height: pickerPanelCellHeight,
|
||
transform: "translateY(-50%)",
|
||
transition: `all ${motionDurationSlow}`,
|
||
content: '""'
|
||
},
|
||
// >>> Default
|
||
[pickerCellInnerCls]: {
|
||
position: "relative",
|
||
zIndex: 2,
|
||
display: "inline-block",
|
||
minWidth: pickerPanelCellHeight,
|
||
height: pickerPanelCellHeight,
|
||
lineHeight: `${pickerPanelCellHeight}px`,
|
||
borderRadius: borderRadiusSM,
|
||
transition: `background ${motionDurationMid}, border ${motionDurationMid}`
|
||
},
|
||
// >>> Hover
|
||
[`&:hover:not(${pickerCellCls}-in-view),
|
||
&:hover:not(${pickerCellCls}-selected):not(${pickerCellCls}-range-start):not(${pickerCellCls}-range-end):not(${pickerCellCls}-range-hover-start):not(${pickerCellCls}-range-hover-end)`]: {
|
||
[pickerCellInnerCls]: {
|
||
background: controlItemBgHover
|
||
}
|
||
},
|
||
// >>> Today
|
||
[`&-in-view${pickerCellCls}-today ${pickerCellInnerCls}`]: {
|
||
"&::before": {
|
||
position: "absolute",
|
||
top: 0,
|
||
insetInlineEnd: 0,
|
||
bottom: 0,
|
||
insetInlineStart: 0,
|
||
zIndex: 1,
|
||
border: `${lineWidth}px ${lineType} ${colorPrimary}`,
|
||
borderRadius: borderRadiusSM,
|
||
content: '""'
|
||
}
|
||
},
|
||
// >>> In Range
|
||
[`&-in-view${pickerCellCls}-in-range`]: {
|
||
position: "relative",
|
||
"&::before": {
|
||
background: controlItemBgActive
|
||
}
|
||
},
|
||
// >>> Selected
|
||
[`&-in-view${pickerCellCls}-selected ${pickerCellInnerCls},
|
||
&-in-view${pickerCellCls}-range-start ${pickerCellInnerCls},
|
||
&-in-view${pickerCellCls}-range-end ${pickerCellInnerCls}`]: {
|
||
color: colorTextLightSolid,
|
||
background: colorPrimary
|
||
},
|
||
[`&-in-view${pickerCellCls}-range-start:not(${pickerCellCls}-range-start-single),
|
||
&-in-view${pickerCellCls}-range-end:not(${pickerCellCls}-range-end-single)`]: {
|
||
"&::before": {
|
||
background: controlItemBgActive
|
||
}
|
||
},
|
||
[`&-in-view${pickerCellCls}-range-start::before`]: {
|
||
insetInlineStart: "50%"
|
||
},
|
||
[`&-in-view${pickerCellCls}-range-end::before`]: {
|
||
insetInlineEnd: "50%"
|
||
},
|
||
// >>> Range Hover
|
||
[`&-in-view${pickerCellCls}-range-hover-start:not(${pickerCellCls}-in-range):not(${pickerCellCls}-range-start):not(${pickerCellCls}-range-end),
|
||
&-in-view${pickerCellCls}-range-hover-end:not(${pickerCellCls}-in-range):not(${pickerCellCls}-range-start):not(${pickerCellCls}-range-end),
|
||
&-in-view${pickerCellCls}-range-hover-start${pickerCellCls}-range-start-single,
|
||
&-in-view${pickerCellCls}-range-hover-start${pickerCellCls}-range-start${pickerCellCls}-range-end${pickerCellCls}-range-end-near-hover,
|
||
&-in-view${pickerCellCls}-range-hover-end${pickerCellCls}-range-start${pickerCellCls}-range-end${pickerCellCls}-range-start-near-hover,
|
||
&-in-view${pickerCellCls}-range-hover-end${pickerCellCls}-range-end-single,
|
||
&-in-view${pickerCellCls}-range-hover:not(${pickerCellCls}-in-range)`]: {
|
||
"&::after": {
|
||
position: "absolute",
|
||
top: "50%",
|
||
zIndex: 0,
|
||
height: controlHeightSM,
|
||
borderTop: `${lineWidth}px dashed ${pickerDateHoverRangeBorderColor}`,
|
||
borderBottom: `${lineWidth}px dashed ${pickerDateHoverRangeBorderColor}`,
|
||
transform: "translateY(-50%)",
|
||
transition: `all ${motionDurationSlow}`,
|
||
content: '""'
|
||
}
|
||
},
|
||
// Add space for stash
|
||
[`&-range-hover-start::after,
|
||
&-range-hover-end::after,
|
||
&-range-hover::after`]: {
|
||
insetInlineEnd: 0,
|
||
insetInlineStart: pickerCellBorderGap
|
||
},
|
||
// Hover with in range
|
||
[`&-in-view${pickerCellCls}-in-range${pickerCellCls}-range-hover::before,
|
||
&-in-view${pickerCellCls}-range-start${pickerCellCls}-range-hover::before,
|
||
&-in-view${pickerCellCls}-range-end${pickerCellCls}-range-hover::before,
|
||
&-in-view${pickerCellCls}-range-start:not(${pickerCellCls}-range-start-single)${pickerCellCls}-range-hover-start::before,
|
||
&-in-view${pickerCellCls}-range-end:not(${pickerCellCls}-range-end-single)${pickerCellCls}-range-hover-end::before,
|
||
${componentCls}-panel
|
||
> :not(${componentCls}-date-panel)
|
||
&-in-view${pickerCellCls}-in-range${pickerCellCls}-range-hover-start::before,
|
||
${componentCls}-panel
|
||
> :not(${componentCls}-date-panel)
|
||
&-in-view${pickerCellCls}-in-range${pickerCellCls}-range-hover-end::before`]: {
|
||
background: pickerBasicCellHoverWithRangeColor
|
||
},
|
||
// range start border-radius
|
||
[`&-in-view${pickerCellCls}-range-start:not(${pickerCellCls}-range-start-single):not(${pickerCellCls}-range-end) ${pickerCellInnerCls}`]: {
|
||
borderStartStartRadius: borderRadiusSM,
|
||
borderEndStartRadius: borderRadiusSM,
|
||
borderStartEndRadius: 0,
|
||
borderEndEndRadius: 0
|
||
},
|
||
// range end border-radius
|
||
[`&-in-view${pickerCellCls}-range-end:not(${pickerCellCls}-range-end-single):not(${pickerCellCls}-range-start) ${pickerCellInnerCls}`]: {
|
||
borderStartStartRadius: 0,
|
||
borderEndStartRadius: 0,
|
||
borderStartEndRadius: borderRadiusSM,
|
||
borderEndEndRadius: borderRadiusSM
|
||
},
|
||
[`&-range-hover${pickerCellCls}-range-end::after`]: {
|
||
insetInlineStart: "50%"
|
||
},
|
||
// Edge start
|
||
[`tr > &-in-view${pickerCellCls}-range-hover:first-child::after,
|
||
tr > &-in-view${pickerCellCls}-range-hover-end:first-child::after,
|
||
&-in-view${pickerCellCls}-start${pickerCellCls}-range-hover-edge-start${pickerCellCls}-range-hover-edge-start-near-range::after,
|
||
&-in-view${pickerCellCls}-range-hover-edge-start:not(${pickerCellCls}-range-hover-edge-start-near-range)::after,
|
||
&-in-view${pickerCellCls}-range-hover-start::after`]: {
|
||
insetInlineStart: (pickerPanelCellWidth - pickerPanelCellHeight) / 2,
|
||
borderInlineStart: `${lineWidth}px dashed ${pickerDateHoverRangeBorderColor}`,
|
||
borderStartStartRadius: lineWidth,
|
||
borderEndStartRadius: lineWidth
|
||
},
|
||
// Edge end
|
||
[`tr > &-in-view${pickerCellCls}-range-hover:last-child::after,
|
||
tr > &-in-view${pickerCellCls}-range-hover-start:last-child::after,
|
||
&-in-view${pickerCellCls}-end${pickerCellCls}-range-hover-edge-end${pickerCellCls}-range-hover-edge-end-near-range::after,
|
||
&-in-view${pickerCellCls}-range-hover-edge-end:not(${pickerCellCls}-range-hover-edge-end-near-range)::after,
|
||
&-in-view${pickerCellCls}-range-hover-end::after`]: {
|
||
insetInlineEnd: (pickerPanelCellWidth - pickerPanelCellHeight) / 2,
|
||
borderInlineEnd: `${lineWidth}px dashed ${pickerDateHoverRangeBorderColor}`,
|
||
borderStartEndRadius: lineWidth,
|
||
borderEndEndRadius: lineWidth
|
||
},
|
||
// >>> Disabled
|
||
"&-disabled": {
|
||
color: colorTextDisabled,
|
||
pointerEvents: "none",
|
||
[pickerCellInnerCls]: {
|
||
background: "transparent"
|
||
},
|
||
"&::before": {
|
||
background: colorBgContainerDisabled
|
||
}
|
||
},
|
||
[`&-disabled${pickerCellCls}-today ${pickerCellInnerCls}::before`]: {
|
||
borderColor: colorTextDisabled
|
||
}
|
||
};
|
||
};
|
||
const genPanelStyle = (token) => {
|
||
const {
|
||
componentCls,
|
||
pickerCellInnerCls,
|
||
pickerYearMonthCellWidth,
|
||
pickerControlIconSize,
|
||
pickerPanelCellWidth,
|
||
paddingSM,
|
||
paddingXS,
|
||
paddingXXS,
|
||
colorBgContainer,
|
||
lineWidth,
|
||
lineType,
|
||
borderRadiusLG,
|
||
colorPrimary,
|
||
colorTextHeading,
|
||
colorSplit,
|
||
pickerControlIconBorderWidth,
|
||
colorIcon,
|
||
pickerTextHeight,
|
||
motionDurationMid,
|
||
colorIconHover,
|
||
fontWeightStrong,
|
||
pickerPanelCellHeight,
|
||
pickerCellPaddingVertical,
|
||
colorTextDisabled,
|
||
colorText,
|
||
fontSize,
|
||
pickerBasicCellHoverWithRangeColor,
|
||
motionDurationSlow,
|
||
pickerPanelWithoutTimeCellHeight,
|
||
pickerQuarterPanelContentHeight,
|
||
colorLink,
|
||
colorLinkActive,
|
||
colorLinkHover,
|
||
pickerDateHoverRangeBorderColor,
|
||
borderRadiusSM,
|
||
colorTextLightSolid,
|
||
borderRadius,
|
||
controlItemBgHover,
|
||
pickerTimePanelColumnHeight,
|
||
pickerTimePanelColumnWidth,
|
||
pickerTimePanelCellHeight,
|
||
controlItemBgActive,
|
||
marginXXS
|
||
} = token;
|
||
const pickerPanelWidth = pickerPanelCellWidth * 7 + paddingSM * 2 + 4;
|
||
const hoverCellFixedDistance = (pickerPanelWidth - paddingXS * 2) / 3 - pickerYearMonthCellWidth - paddingSM;
|
||
return {
|
||
[componentCls]: {
|
||
"&-panel": {
|
||
display: "inline-flex",
|
||
flexDirection: "column",
|
||
textAlign: "center",
|
||
background: colorBgContainer,
|
||
border: `${lineWidth}px ${lineType} ${colorSplit}`,
|
||
borderRadius: borderRadiusLG,
|
||
outline: "none",
|
||
"&-focused": {
|
||
borderColor: colorPrimary
|
||
},
|
||
"&-rtl": {
|
||
direction: "rtl",
|
||
[`${componentCls}-prev-icon,
|
||
${componentCls}-super-prev-icon`]: {
|
||
transform: "rotate(45deg)"
|
||
},
|
||
[`${componentCls}-next-icon,
|
||
${componentCls}-super-next-icon`]: {
|
||
transform: "rotate(-135deg)"
|
||
}
|
||
}
|
||
},
|
||
// ========================================================
|
||
// = Shared Panel =
|
||
// ========================================================
|
||
[`&-decade-panel,
|
||
&-year-panel,
|
||
&-quarter-panel,
|
||
&-month-panel,
|
||
&-week-panel,
|
||
&-date-panel,
|
||
&-time-panel`]: {
|
||
display: "flex",
|
||
flexDirection: "column",
|
||
width: pickerPanelWidth
|
||
},
|
||
// ======================= Header =======================
|
||
"&-header": {
|
||
display: "flex",
|
||
padding: `0 ${paddingXS}px`,
|
||
color: colorTextHeading,
|
||
borderBottom: `${lineWidth}px ${lineType} ${colorSplit}`,
|
||
"> *": {
|
||
flex: "none"
|
||
},
|
||
button: {
|
||
padding: 0,
|
||
color: colorIcon,
|
||
lineHeight: `${pickerTextHeight}px`,
|
||
background: "transparent",
|
||
border: 0,
|
||
cursor: "pointer",
|
||
transition: `color ${motionDurationMid}`
|
||
},
|
||
"> button": {
|
||
minWidth: "1.6em",
|
||
fontSize,
|
||
"&:hover": {
|
||
color: colorIconHover
|
||
}
|
||
},
|
||
"&-view": {
|
||
flex: "auto",
|
||
fontWeight: fontWeightStrong,
|
||
lineHeight: `${pickerTextHeight}px`,
|
||
button: {
|
||
color: "inherit",
|
||
fontWeight: "inherit",
|
||
verticalAlign: "top",
|
||
"&:not(:first-child)": {
|
||
marginInlineStart: paddingXS
|
||
},
|
||
"&:hover": {
|
||
color: colorPrimary
|
||
}
|
||
}
|
||
}
|
||
},
|
||
// Arrow button
|
||
[`&-prev-icon,
|
||
&-next-icon,
|
||
&-super-prev-icon,
|
||
&-super-next-icon`]: {
|
||
position: "relative",
|
||
display: "inline-block",
|
||
width: pickerControlIconSize,
|
||
height: pickerControlIconSize,
|
||
"&::before": {
|
||
position: "absolute",
|
||
top: 0,
|
||
insetInlineStart: 0,
|
||
display: "inline-block",
|
||
width: pickerControlIconSize,
|
||
height: pickerControlIconSize,
|
||
border: `0 solid currentcolor`,
|
||
borderBlockStartWidth: pickerControlIconBorderWidth,
|
||
borderBlockEndWidth: 0,
|
||
borderInlineStartWidth: pickerControlIconBorderWidth,
|
||
borderInlineEndWidth: 0,
|
||
content: '""'
|
||
}
|
||
},
|
||
[`&-super-prev-icon,
|
||
&-super-next-icon`]: {
|
||
"&::after": {
|
||
position: "absolute",
|
||
top: Math.ceil(pickerControlIconSize / 2),
|
||
insetInlineStart: Math.ceil(pickerControlIconSize / 2),
|
||
display: "inline-block",
|
||
width: pickerControlIconSize,
|
||
height: pickerControlIconSize,
|
||
border: "0 solid currentcolor",
|
||
borderBlockStartWidth: pickerControlIconBorderWidth,
|
||
borderBlockEndWidth: 0,
|
||
borderInlineStartWidth: pickerControlIconBorderWidth,
|
||
borderInlineEndWidth: 0,
|
||
content: '""'
|
||
}
|
||
},
|
||
[`&-prev-icon,
|
||
&-super-prev-icon`]: {
|
||
transform: "rotate(-45deg)"
|
||
},
|
||
[`&-next-icon,
|
||
&-super-next-icon`]: {
|
||
transform: "rotate(135deg)"
|
||
},
|
||
// ======================== Body ========================
|
||
"&-content": {
|
||
width: "100%",
|
||
tableLayout: "fixed",
|
||
borderCollapse: "collapse",
|
||
"th, td": {
|
||
position: "relative",
|
||
minWidth: pickerPanelCellHeight,
|
||
fontWeight: "normal"
|
||
},
|
||
th: {
|
||
height: pickerPanelCellHeight + pickerCellPaddingVertical * 2,
|
||
color: colorText,
|
||
verticalAlign: "middle"
|
||
}
|
||
},
|
||
"&-cell": _extends({
|
||
padding: `${pickerCellPaddingVertical}px 0`,
|
||
color: colorTextDisabled,
|
||
cursor: "pointer",
|
||
// In view
|
||
"&-in-view": {
|
||
color: colorText
|
||
}
|
||
}, genPickerCellInnerStyle(token)),
|
||
// DatePanel only
|
||
[`&-date-panel ${componentCls}-cell-in-view${componentCls}-cell-in-range${componentCls}-cell-range-hover-start ${pickerCellInnerCls},
|
||
&-date-panel ${componentCls}-cell-in-view${componentCls}-cell-in-range${componentCls}-cell-range-hover-end ${pickerCellInnerCls}`]: {
|
||
"&::after": {
|
||
position: "absolute",
|
||
top: 0,
|
||
bottom: 0,
|
||
zIndex: -1,
|
||
background: pickerBasicCellHoverWithRangeColor,
|
||
transition: `all ${motionDurationSlow}`,
|
||
content: '""'
|
||
}
|
||
},
|
||
[`&-date-panel
|
||
${componentCls}-cell-in-view${componentCls}-cell-in-range${componentCls}-cell-range-hover-start
|
||
${pickerCellInnerCls}::after`]: {
|
||
insetInlineEnd: -(pickerPanelCellWidth - pickerPanelCellHeight) / 2,
|
||
insetInlineStart: 0
|
||
},
|
||
[`&-date-panel ${componentCls}-cell-in-view${componentCls}-cell-in-range${componentCls}-cell-range-hover-end ${pickerCellInnerCls}::after`]: {
|
||
insetInlineEnd: 0,
|
||
insetInlineStart: -(pickerPanelCellWidth - pickerPanelCellHeight) / 2
|
||
},
|
||
// Hover with range start & end
|
||
[`&-range-hover${componentCls}-range-start::after`]: {
|
||
insetInlineEnd: "50%"
|
||
},
|
||
[`&-decade-panel,
|
||
&-year-panel,
|
||
&-quarter-panel,
|
||
&-month-panel`]: {
|
||
[`${componentCls}-content`]: {
|
||
height: pickerPanelWithoutTimeCellHeight * 4
|
||
},
|
||
[pickerCellInnerCls]: {
|
||
padding: `0 ${paddingXS}px`
|
||
}
|
||
},
|
||
"&-quarter-panel": {
|
||
[`${componentCls}-content`]: {
|
||
height: pickerQuarterPanelContentHeight
|
||
}
|
||
},
|
||
// ======================== Footer ========================
|
||
[`&-panel ${componentCls}-footer`]: {
|
||
borderTop: `${lineWidth}px ${lineType} ${colorSplit}`
|
||
},
|
||
"&-footer": {
|
||
width: "min-content",
|
||
minWidth: "100%",
|
||
lineHeight: `${pickerTextHeight - 2 * lineWidth}px`,
|
||
textAlign: "center",
|
||
"&-extra": {
|
||
padding: `0 ${paddingSM}`,
|
||
lineHeight: `${pickerTextHeight - 2 * lineWidth}px`,
|
||
textAlign: "start",
|
||
"&:not(:last-child)": {
|
||
borderBottom: `${lineWidth}px ${lineType} ${colorSplit}`
|
||
}
|
||
}
|
||
},
|
||
"&-now": {
|
||
textAlign: "start"
|
||
},
|
||
"&-today-btn": {
|
||
color: colorLink,
|
||
"&:hover": {
|
||
color: colorLinkHover
|
||
},
|
||
"&:active": {
|
||
color: colorLinkActive
|
||
},
|
||
[`&${componentCls}-today-btn-disabled`]: {
|
||
color: colorTextDisabled,
|
||
cursor: "not-allowed"
|
||
}
|
||
},
|
||
// ========================================================
|
||
// = Special =
|
||
// ========================================================
|
||
// ===================== Decade Panel =====================
|
||
"&-decade-panel": {
|
||
[pickerCellInnerCls]: {
|
||
padding: `0 ${paddingXS / 2}px`
|
||
},
|
||
[`${componentCls}-cell::before`]: {
|
||
display: "none"
|
||
}
|
||
},
|
||
// ============= Year & Quarter & Month Panel =============
|
||
[`&-year-panel,
|
||
&-quarter-panel,
|
||
&-month-panel`]: {
|
||
[`${componentCls}-body`]: {
|
||
padding: `0 ${paddingXS}px`
|
||
},
|
||
[pickerCellInnerCls]: {
|
||
width: pickerYearMonthCellWidth
|
||
},
|
||
[`${componentCls}-cell-range-hover-start::after`]: {
|
||
insetInlineStart: hoverCellFixedDistance,
|
||
borderInlineStart: `${lineWidth}px dashed ${pickerDateHoverRangeBorderColor}`,
|
||
borderStartStartRadius: borderRadiusSM,
|
||
borderBottomStartRadius: borderRadiusSM,
|
||
borderStartEndRadius: 0,
|
||
borderBottomEndRadius: 0,
|
||
[`${componentCls}-panel-rtl &`]: {
|
||
insetInlineEnd: hoverCellFixedDistance,
|
||
borderInlineEnd: `${lineWidth}px dashed ${pickerDateHoverRangeBorderColor}`,
|
||
borderStartStartRadius: 0,
|
||
borderBottomStartRadius: 0,
|
||
borderStartEndRadius: borderRadiusSM,
|
||
borderBottomEndRadius: borderRadiusSM
|
||
}
|
||
},
|
||
[`${componentCls}-cell-range-hover-end::after`]: {
|
||
insetInlineEnd: hoverCellFixedDistance,
|
||
borderInlineEnd: `${lineWidth}px dashed ${pickerDateHoverRangeBorderColor}`,
|
||
borderStartStartRadius: 0,
|
||
borderEndStartRadius: 0,
|
||
borderStartEndRadius: borderRadius,
|
||
borderEndEndRadius: borderRadius,
|
||
[`${componentCls}-panel-rtl &`]: {
|
||
insetInlineStart: hoverCellFixedDistance,
|
||
borderInlineStart: `${lineWidth}px dashed ${pickerDateHoverRangeBorderColor}`,
|
||
borderStartStartRadius: borderRadius,
|
||
borderEndStartRadius: borderRadius,
|
||
borderStartEndRadius: 0,
|
||
borderEndEndRadius: 0
|
||
}
|
||
}
|
||
},
|
||
// ====================== Week Panel ======================
|
||
"&-week-panel": {
|
||
[`${componentCls}-body`]: {
|
||
padding: `${paddingXS}px ${paddingSM}px`
|
||
},
|
||
// Clear cell style
|
||
[`${componentCls}-cell`]: {
|
||
[`&:hover ${pickerCellInnerCls},
|
||
&-selected ${pickerCellInnerCls},
|
||
${pickerCellInnerCls}`]: {
|
||
background: "transparent !important"
|
||
}
|
||
},
|
||
"&-row": {
|
||
td: {
|
||
transition: `background ${motionDurationMid}`,
|
||
"&:first-child": {
|
||
borderStartStartRadius: borderRadiusSM,
|
||
borderEndStartRadius: borderRadiusSM
|
||
},
|
||
"&:last-child": {
|
||
borderStartEndRadius: borderRadiusSM,
|
||
borderEndEndRadius: borderRadiusSM
|
||
}
|
||
},
|
||
"&:hover td": {
|
||
background: controlItemBgHover
|
||
},
|
||
[`&-selected td,
|
||
&-selected:hover td`]: {
|
||
background: colorPrimary,
|
||
[`&${componentCls}-cell-week`]: {
|
||
color: new TinyColor(colorTextLightSolid).setAlpha(0.5).toHexString()
|
||
},
|
||
[`&${componentCls}-cell-today ${pickerCellInnerCls}::before`]: {
|
||
borderColor: colorTextLightSolid
|
||
},
|
||
[pickerCellInnerCls]: {
|
||
color: colorTextLightSolid
|
||
}
|
||
}
|
||
}
|
||
},
|
||
// ====================== Date Panel ======================
|
||
"&-date-panel": {
|
||
[`${componentCls}-body`]: {
|
||
padding: `${paddingXS}px ${paddingSM}px`
|
||
},
|
||
[`${componentCls}-content`]: {
|
||
width: pickerPanelCellWidth * 7,
|
||
th: {
|
||
width: pickerPanelCellWidth
|
||
}
|
||
}
|
||
},
|
||
// ==================== Datetime Panel ====================
|
||
"&-datetime-panel": {
|
||
display: "flex",
|
||
[`${componentCls}-time-panel`]: {
|
||
borderInlineStart: `${lineWidth}px ${lineType} ${colorSplit}`
|
||
},
|
||
[`${componentCls}-date-panel,
|
||
${componentCls}-time-panel`]: {
|
||
transition: `opacity ${motionDurationSlow}`
|
||
},
|
||
// Keyboard
|
||
"&-active": {
|
||
[`${componentCls}-date-panel,
|
||
${componentCls}-time-panel`]: {
|
||
opacity: 0.3,
|
||
"&-active": {
|
||
opacity: 1
|
||
}
|
||
}
|
||
}
|
||
},
|
||
// ====================== Time Panel ======================
|
||
"&-time-panel": {
|
||
width: "auto",
|
||
minWidth: "auto",
|
||
direction: "ltr",
|
||
[`${componentCls}-content`]: {
|
||
display: "flex",
|
||
flex: "auto",
|
||
height: pickerTimePanelColumnHeight
|
||
},
|
||
"&-column": {
|
||
flex: "1 0 auto",
|
||
width: pickerTimePanelColumnWidth,
|
||
margin: `${paddingXXS}px 0`,
|
||
padding: 0,
|
||
overflowY: "hidden",
|
||
textAlign: "start",
|
||
listStyle: "none",
|
||
transition: `background ${motionDurationMid}`,
|
||
overflowX: "hidden",
|
||
"&::after": {
|
||
display: "block",
|
||
height: pickerTimePanelColumnHeight - pickerTimePanelCellHeight,
|
||
content: '""'
|
||
},
|
||
"&:not(:first-child)": {
|
||
borderInlineStart: `${lineWidth}px ${lineType} ${colorSplit}`
|
||
},
|
||
"&-active": {
|
||
background: new TinyColor(controlItemBgActive).setAlpha(0.2).toHexString()
|
||
},
|
||
"&:hover": {
|
||
overflowY: "auto"
|
||
},
|
||
"> li": {
|
||
margin: 0,
|
||
padding: 0,
|
||
[`&${componentCls}-time-panel-cell`]: {
|
||
marginInline: marginXXS,
|
||
[`${componentCls}-time-panel-cell-inner`]: {
|
||
display: "block",
|
||
width: pickerTimePanelColumnWidth - 2 * marginXXS,
|
||
height: pickerTimePanelCellHeight,
|
||
margin: 0,
|
||
paddingBlock: 0,
|
||
paddingInlineEnd: 0,
|
||
paddingInlineStart: (pickerTimePanelColumnWidth - pickerTimePanelCellHeight) / 2,
|
||
color: colorText,
|
||
lineHeight: `${pickerTimePanelCellHeight}px`,
|
||
borderRadius: borderRadiusSM,
|
||
cursor: "pointer",
|
||
transition: `background ${motionDurationMid}`,
|
||
"&:hover": {
|
||
background: controlItemBgHover
|
||
}
|
||
},
|
||
"&-selected": {
|
||
[`${componentCls}-time-panel-cell-inner`]: {
|
||
background: controlItemBgActive
|
||
}
|
||
},
|
||
"&-disabled": {
|
||
[`${componentCls}-time-panel-cell-inner`]: {
|
||
color: colorTextDisabled,
|
||
background: "transparent",
|
||
cursor: "not-allowed"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
// https://github.com/ant-design/ant-design/issues/39227
|
||
[`&-datetime-panel ${componentCls}-time-panel-column:after`]: {
|
||
height: pickerTimePanelColumnHeight - pickerTimePanelCellHeight + paddingXXS * 2
|
||
}
|
||
}
|
||
};
|
||
};
|
||
const genPickerStatusStyle = (token) => {
|
||
const {
|
||
componentCls,
|
||
colorBgContainer,
|
||
colorError,
|
||
colorErrorOutline,
|
||
colorWarning,
|
||
colorWarningOutline
|
||
} = token;
|
||
return {
|
||
[componentCls]: {
|
||
[`&-status-error${componentCls}`]: {
|
||
"&, &:not([disabled]):hover": {
|
||
backgroundColor: colorBgContainer,
|
||
borderColor: colorError
|
||
},
|
||
"&-focused, &:focus": _extends({}, genActiveStyle(merge(token, {
|
||
inputBorderActiveColor: colorError,
|
||
inputBorderHoverColor: colorError,
|
||
controlOutline: colorErrorOutline
|
||
}))),
|
||
[`${componentCls}-active-bar`]: {
|
||
background: colorError
|
||
}
|
||
},
|
||
[`&-status-warning${componentCls}`]: {
|
||
"&, &:not([disabled]):hover": {
|
||
backgroundColor: colorBgContainer,
|
||
borderColor: colorWarning
|
||
},
|
||
"&-focused, &:focus": _extends({}, genActiveStyle(merge(token, {
|
||
inputBorderActiveColor: colorWarning,
|
||
inputBorderHoverColor: colorWarning,
|
||
controlOutline: colorWarningOutline
|
||
}))),
|
||
[`${componentCls}-active-bar`]: {
|
||
background: colorWarning
|
||
}
|
||
}
|
||
}
|
||
};
|
||
};
|
||
const genPickerStyle = (token) => {
|
||
const {
|
||
componentCls,
|
||
antCls,
|
||
boxShadowPopoverArrow,
|
||
controlHeight,
|
||
fontSize,
|
||
inputPaddingHorizontal,
|
||
colorBgContainer,
|
||
lineWidth,
|
||
lineType,
|
||
colorBorder,
|
||
borderRadius,
|
||
motionDurationMid,
|
||
colorBgContainerDisabled,
|
||
colorTextDisabled,
|
||
colorTextPlaceholder,
|
||
controlHeightLG,
|
||
fontSizeLG,
|
||
controlHeightSM,
|
||
inputPaddingHorizontalSM,
|
||
paddingXS,
|
||
marginXS,
|
||
colorTextDescription,
|
||
lineWidthBold,
|
||
lineHeight,
|
||
colorPrimary,
|
||
motionDurationSlow,
|
||
zIndexPopup,
|
||
paddingXXS,
|
||
paddingSM,
|
||
pickerTextHeight,
|
||
controlItemBgActive,
|
||
colorPrimaryBorder,
|
||
sizePopupArrow,
|
||
borderRadiusXS,
|
||
borderRadiusOuter,
|
||
colorBgElevated,
|
||
borderRadiusLG,
|
||
boxShadowSecondary,
|
||
borderRadiusSM,
|
||
colorSplit,
|
||
controlItemBgHover,
|
||
presetsWidth,
|
||
presetsMaxWidth
|
||
} = token;
|
||
return [
|
||
{
|
||
[componentCls]: _extends(_extends(_extends({}, resetComponent(token)), genPikerPadding(token, controlHeight, fontSize, inputPaddingHorizontal)), {
|
||
position: "relative",
|
||
display: "inline-flex",
|
||
alignItems: "center",
|
||
background: colorBgContainer,
|
||
lineHeight: 1,
|
||
border: `${lineWidth}px ${lineType} ${colorBorder}`,
|
||
borderRadius,
|
||
transition: `border ${motionDurationMid}, box-shadow ${motionDurationMid}`,
|
||
"&:hover, &-focused": _extends({}, genHoverStyle(token)),
|
||
"&-focused": _extends({}, genActiveStyle(token)),
|
||
[`&${componentCls}-disabled`]: {
|
||
background: colorBgContainerDisabled,
|
||
borderColor: colorBorder,
|
||
cursor: "not-allowed",
|
||
[`${componentCls}-suffix`]: {
|
||
color: colorTextDisabled
|
||
}
|
||
},
|
||
[`&${componentCls}-borderless`]: {
|
||
backgroundColor: "transparent !important",
|
||
borderColor: "transparent !important",
|
||
boxShadow: "none !important"
|
||
},
|
||
// ======================== Input =========================
|
||
[`${componentCls}-input`]: {
|
||
position: "relative",
|
||
display: "inline-flex",
|
||
alignItems: "center",
|
||
width: "100%",
|
||
"> input": _extends(_extends({}, genBasicInputStyle(token)), {
|
||
flex: "auto",
|
||
// Fix Firefox flex not correct:
|
||
// https://github.com/ant-design/ant-design/pull/20023#issuecomment-564389553
|
||
minWidth: 1,
|
||
height: "auto",
|
||
padding: 0,
|
||
background: "transparent",
|
||
border: 0,
|
||
"&:focus": {
|
||
boxShadow: "none"
|
||
},
|
||
"&[disabled]": {
|
||
background: "transparent"
|
||
}
|
||
}),
|
||
"&:hover": {
|
||
[`${componentCls}-clear`]: {
|
||
opacity: 1
|
||
}
|
||
},
|
||
"&-placeholder": {
|
||
"> input": {
|
||
color: colorTextPlaceholder
|
||
}
|
||
}
|
||
},
|
||
// Size
|
||
"&-large": _extends(_extends({}, genPikerPadding(token, controlHeightLG, fontSizeLG, inputPaddingHorizontal)), {
|
||
[`${componentCls}-input > input`]: {
|
||
fontSize: fontSizeLG
|
||
}
|
||
}),
|
||
"&-small": _extends({}, genPikerPadding(token, controlHeightSM, fontSize, inputPaddingHorizontalSM)),
|
||
[`${componentCls}-suffix`]: {
|
||
display: "flex",
|
||
flex: "none",
|
||
alignSelf: "center",
|
||
marginInlineStart: paddingXS / 2,
|
||
color: colorTextDisabled,
|
||
lineHeight: 1,
|
||
pointerEvents: "none",
|
||
"> *": {
|
||
verticalAlign: "top",
|
||
"&:not(:last-child)": {
|
||
marginInlineEnd: marginXS
|
||
}
|
||
}
|
||
},
|
||
[`${componentCls}-clear`]: {
|
||
position: "absolute",
|
||
top: "50%",
|
||
insetInlineEnd: 0,
|
||
color: colorTextDisabled,
|
||
lineHeight: 1,
|
||
background: colorBgContainer,
|
||
transform: "translateY(-50%)",
|
||
cursor: "pointer",
|
||
opacity: 0,
|
||
transition: `opacity ${motionDurationMid}, color ${motionDurationMid}`,
|
||
"> *": {
|
||
verticalAlign: "top"
|
||
},
|
||
"&:hover": {
|
||
color: colorTextDescription
|
||
}
|
||
},
|
||
[`${componentCls}-separator`]: {
|
||
position: "relative",
|
||
display: "inline-block",
|
||
width: "1em",
|
||
height: fontSizeLG,
|
||
color: colorTextDisabled,
|
||
fontSize: fontSizeLG,
|
||
verticalAlign: "top",
|
||
cursor: "default",
|
||
[`${componentCls}-focused &`]: {
|
||
color: colorTextDescription
|
||
},
|
||
[`${componentCls}-range-separator &`]: {
|
||
[`${componentCls}-disabled &`]: {
|
||
cursor: "not-allowed"
|
||
}
|
||
}
|
||
},
|
||
// ======================== Range =========================
|
||
"&-range": {
|
||
position: "relative",
|
||
display: "inline-flex",
|
||
// Clear
|
||
[`${componentCls}-clear`]: {
|
||
insetInlineEnd: inputPaddingHorizontal
|
||
},
|
||
"&:hover": {
|
||
[`${componentCls}-clear`]: {
|
||
opacity: 1
|
||
}
|
||
},
|
||
// Active bar
|
||
[`${componentCls}-active-bar`]: {
|
||
bottom: -lineWidth,
|
||
height: lineWidthBold,
|
||
marginInlineStart: inputPaddingHorizontal,
|
||
background: colorPrimary,
|
||
opacity: 0,
|
||
transition: `all ${motionDurationSlow} ease-out`,
|
||
pointerEvents: "none"
|
||
},
|
||
[`&${componentCls}-focused`]: {
|
||
[`${componentCls}-active-bar`]: {
|
||
opacity: 1
|
||
}
|
||
},
|
||
[`${componentCls}-range-separator`]: {
|
||
alignItems: "center",
|
||
padding: `0 ${paddingXS}px`,
|
||
lineHeight: 1
|
||
},
|
||
[`&${componentCls}-small`]: {
|
||
[`${componentCls}-clear`]: {
|
||
insetInlineEnd: inputPaddingHorizontalSM
|
||
},
|
||
[`${componentCls}-active-bar`]: {
|
||
marginInlineStart: inputPaddingHorizontalSM
|
||
}
|
||
}
|
||
},
|
||
// ======================= Dropdown =======================
|
||
"&-dropdown": _extends(_extends(_extends({}, resetComponent(token)), genPanelStyle(token)), {
|
||
position: "absolute",
|
||
// Fix incorrect position of picker popup
|
||
// https://github.com/ant-design/ant-design/issues/35590
|
||
top: -9999,
|
||
left: {
|
||
_skip_check_: true,
|
||
value: -9999
|
||
},
|
||
zIndex: zIndexPopup,
|
||
[`&${componentCls}-dropdown-hidden`]: {
|
||
display: "none"
|
||
},
|
||
[`&${componentCls}-dropdown-placement-bottomLeft`]: {
|
||
[`${componentCls}-range-arrow`]: {
|
||
top: 0,
|
||
display: "block",
|
||
transform: "translateY(-100%)"
|
||
}
|
||
},
|
||
[`&${componentCls}-dropdown-placement-topLeft`]: {
|
||
[`${componentCls}-range-arrow`]: {
|
||
bottom: 0,
|
||
display: "block",
|
||
transform: "translateY(100%) rotate(180deg)"
|
||
}
|
||
},
|
||
[`&${antCls}-slide-up-enter${antCls}-slide-up-enter-active${componentCls}-dropdown-placement-topLeft,
|
||
&${antCls}-slide-up-enter${antCls}-slide-up-enter-active${componentCls}-dropdown-placement-topRight,
|
||
&${antCls}-slide-up-appear${antCls}-slide-up-appear-active${componentCls}-dropdown-placement-topLeft,
|
||
&${antCls}-slide-up-appear${antCls}-slide-up-appear-active${componentCls}-dropdown-placement-topRight`]: {
|
||
animationName: slideDownIn
|
||
},
|
||
[`&${antCls}-slide-up-enter${antCls}-slide-up-enter-active${componentCls}-dropdown-placement-bottomLeft,
|
||
&${antCls}-slide-up-enter${antCls}-slide-up-enter-active${componentCls}-dropdown-placement-bottomRight,
|
||
&${antCls}-slide-up-appear${antCls}-slide-up-appear-active${componentCls}-dropdown-placement-bottomLeft,
|
||
&${antCls}-slide-up-appear${antCls}-slide-up-appear-active${componentCls}-dropdown-placement-bottomRight`]: {
|
||
animationName: slideUpIn
|
||
},
|
||
[`&${antCls}-slide-up-leave${antCls}-slide-up-leave-active${componentCls}-dropdown-placement-topLeft,
|
||
&${antCls}-slide-up-leave${antCls}-slide-up-leave-active${componentCls}-dropdown-placement-topRight`]: {
|
||
animationName: slideDownOut
|
||
},
|
||
[`&${antCls}-slide-up-leave${antCls}-slide-up-leave-active${componentCls}-dropdown-placement-bottomLeft,
|
||
&${antCls}-slide-up-leave${antCls}-slide-up-leave-active${componentCls}-dropdown-placement-bottomRight`]: {
|
||
animationName: slideUpOut
|
||
},
|
||
// Time picker with additional style
|
||
[`${componentCls}-panel > ${componentCls}-time-panel`]: {
|
||
paddingTop: paddingXXS
|
||
},
|
||
// ======================== Ranges ========================
|
||
[`${componentCls}-ranges`]: {
|
||
marginBottom: 0,
|
||
padding: `${paddingXXS}px ${paddingSM}px`,
|
||
overflow: "hidden",
|
||
lineHeight: `${pickerTextHeight - 2 * lineWidth - paddingXS / 2}px`,
|
||
textAlign: "start",
|
||
listStyle: "none",
|
||
display: "flex",
|
||
justifyContent: "space-between",
|
||
"> li": {
|
||
display: "inline-block"
|
||
},
|
||
// https://github.com/ant-design/ant-design/issues/23687
|
||
[`${componentCls}-preset > ${antCls}-tag-blue`]: {
|
||
color: colorPrimary,
|
||
background: controlItemBgActive,
|
||
borderColor: colorPrimaryBorder,
|
||
cursor: "pointer"
|
||
},
|
||
[`${componentCls}-ok`]: {
|
||
marginInlineStart: "auto"
|
||
}
|
||
},
|
||
[`${componentCls}-range-wrapper`]: {
|
||
display: "flex",
|
||
position: "relative"
|
||
},
|
||
[`${componentCls}-range-arrow`]: _extends({
|
||
position: "absolute",
|
||
zIndex: 1,
|
||
display: "none",
|
||
marginInlineStart: inputPaddingHorizontal * 1.5,
|
||
transition: `left ${motionDurationSlow} ease-out`
|
||
}, roundedArrow(sizePopupArrow, borderRadiusXS, borderRadiusOuter, colorBgElevated, boxShadowPopoverArrow)),
|
||
[`${componentCls}-panel-container`]: {
|
||
overflow: "hidden",
|
||
verticalAlign: "top",
|
||
background: colorBgElevated,
|
||
borderRadius: borderRadiusLG,
|
||
boxShadow: boxShadowSecondary,
|
||
transition: `margin ${motionDurationSlow}`,
|
||
// ======================== Layout ========================
|
||
[`${componentCls}-panel-layout`]: {
|
||
display: "flex",
|
||
flexWrap: "nowrap",
|
||
alignItems: "stretch"
|
||
},
|
||
// ======================== Preset ========================
|
||
[`${componentCls}-presets`]: {
|
||
display: "flex",
|
||
flexDirection: "column",
|
||
minWidth: presetsWidth,
|
||
maxWidth: presetsMaxWidth,
|
||
ul: {
|
||
height: 0,
|
||
flex: "auto",
|
||
listStyle: "none",
|
||
overflow: "auto",
|
||
margin: 0,
|
||
padding: paddingXS,
|
||
borderInlineEnd: `${lineWidth}px ${lineType} ${colorSplit}`,
|
||
li: _extends(_extends({}, textEllipsis), {
|
||
borderRadius: borderRadiusSM,
|
||
paddingInline: paddingXS,
|
||
paddingBlock: (controlHeightSM - Math.round(fontSize * lineHeight)) / 2,
|
||
cursor: "pointer",
|
||
transition: `all ${motionDurationSlow}`,
|
||
"+ li": {
|
||
marginTop: marginXS
|
||
},
|
||
"&:hover": {
|
||
background: controlItemBgHover
|
||
}
|
||
})
|
||
}
|
||
},
|
||
// ======================== Panels ========================
|
||
[`${componentCls}-panels`]: {
|
||
display: "inline-flex",
|
||
flexWrap: "nowrap",
|
||
direction: "ltr",
|
||
[`${componentCls}-panel`]: {
|
||
borderWidth: `0 0 ${lineWidth}px`
|
||
},
|
||
"&:last-child": {
|
||
[`${componentCls}-panel`]: {
|
||
borderWidth: 0
|
||
}
|
||
}
|
||
},
|
||
[`${componentCls}-panel`]: {
|
||
verticalAlign: "top",
|
||
background: "transparent",
|
||
borderRadius: 0,
|
||
borderWidth: 0,
|
||
[`${componentCls}-content,
|
||
table`]: {
|
||
textAlign: "center"
|
||
},
|
||
"&-focused": {
|
||
borderColor: colorBorder
|
||
}
|
||
}
|
||
}
|
||
}),
|
||
"&-dropdown-range": {
|
||
padding: `${sizePopupArrow * 2 / 3}px 0`,
|
||
"&-hidden": {
|
||
display: "none"
|
||
}
|
||
},
|
||
"&-rtl": {
|
||
direction: "rtl",
|
||
[`${componentCls}-separator`]: {
|
||
transform: "rotate(180deg)"
|
||
},
|
||
[`${componentCls}-footer`]: {
|
||
"&-extra": {
|
||
direction: "rtl"
|
||
}
|
||
}
|
||
}
|
||
})
|
||
},
|
||
// Follow code may reuse in other components
|
||
initSlideMotion(token, "slide-up"),
|
||
initSlideMotion(token, "slide-down"),
|
||
initMoveMotion(token, "move-up"),
|
||
initMoveMotion(token, "move-down")
|
||
];
|
||
};
|
||
const initPickerPanelToken = (token) => {
|
||
const pickerTimePanelCellHeight = 28;
|
||
const {
|
||
componentCls,
|
||
controlHeightLG,
|
||
controlHeightSM,
|
||
colorPrimary,
|
||
paddingXXS
|
||
} = token;
|
||
return {
|
||
pickerCellCls: `${componentCls}-cell`,
|
||
pickerCellInnerCls: `${componentCls}-cell-inner`,
|
||
pickerTextHeight: controlHeightLG,
|
||
pickerPanelCellWidth: controlHeightSM * 1.5,
|
||
pickerPanelCellHeight: controlHeightSM,
|
||
pickerDateHoverRangeBorderColor: new TinyColor(colorPrimary).lighten(20).toHexString(),
|
||
pickerBasicCellHoverWithRangeColor: new TinyColor(colorPrimary).lighten(35).toHexString(),
|
||
pickerPanelWithoutTimeCellHeight: controlHeightLG * 1.65,
|
||
pickerYearMonthCellWidth: controlHeightLG * 1.5,
|
||
pickerTimePanelColumnHeight: pickerTimePanelCellHeight * 8,
|
||
pickerTimePanelColumnWidth: controlHeightLG * 1.4,
|
||
pickerTimePanelCellHeight,
|
||
pickerQuarterPanelContentHeight: controlHeightLG * 1.4,
|
||
pickerCellPaddingVertical: paddingXXS,
|
||
pickerCellBorderGap: 2,
|
||
pickerControlIconSize: 7,
|
||
pickerControlIconBorderWidth: 1.5
|
||
};
|
||
};
|
||
const useStyle = genComponentStyleHook("DatePicker", (token) => {
|
||
const pickerToken = merge(initInputToken(token), initPickerPanelToken(token));
|
||
return [
|
||
genPickerStyle(pickerToken),
|
||
genPickerStatusStyle(pickerToken),
|
||
// =====================================================
|
||
// == Space Compact ==
|
||
// =====================================================
|
||
genCompactItemStyle(token, {
|
||
focusElCls: `${token.componentCls}-focused`
|
||
})
|
||
];
|
||
}, (token) => ({
|
||
presetsWidth: 120,
|
||
presetsMaxWidth: 200,
|
||
zIndexPopup: token.zIndexPopupBase + 50
|
||
}));
|
||
const PickerButton = (props, _ref) => {
|
||
let {
|
||
attrs,
|
||
slots
|
||
} = _ref;
|
||
return createVNode(Button, _objectSpread$3(_objectSpread$3({
|
||
"size": "small",
|
||
"type": "primary"
|
||
}, props), attrs), slots);
|
||
};
|
||
function PickerTag(props, _ref) {
|
||
let {
|
||
slots,
|
||
attrs
|
||
} = _ref;
|
||
return createVNode(Tag, _objectSpread$3(_objectSpread$3({
|
||
"color": "blue"
|
||
}, props), attrs), slots);
|
||
}
|
||
function getPlaceholder(locale2, picker, customizePlaceholder) {
|
||
if (customizePlaceholder !== void 0) {
|
||
return customizePlaceholder;
|
||
}
|
||
if (picker === "year" && locale2.lang.yearPlaceholder) {
|
||
return locale2.lang.yearPlaceholder;
|
||
}
|
||
if (picker === "quarter" && locale2.lang.quarterPlaceholder) {
|
||
return locale2.lang.quarterPlaceholder;
|
||
}
|
||
if (picker === "month" && locale2.lang.monthPlaceholder) {
|
||
return locale2.lang.monthPlaceholder;
|
||
}
|
||
if (picker === "week" && locale2.lang.weekPlaceholder) {
|
||
return locale2.lang.weekPlaceholder;
|
||
}
|
||
if (picker === "time" && locale2.timePickerLocale.placeholder) {
|
||
return locale2.timePickerLocale.placeholder;
|
||
}
|
||
return locale2.lang.placeholder;
|
||
}
|
||
function getRangePlaceholder(locale2, picker, customizePlaceholder) {
|
||
if (customizePlaceholder !== void 0) {
|
||
return customizePlaceholder;
|
||
}
|
||
if (picker === "year" && locale2.lang.yearPlaceholder) {
|
||
return locale2.lang.rangeYearPlaceholder;
|
||
}
|
||
if (picker === "month" && locale2.lang.monthPlaceholder) {
|
||
return locale2.lang.rangeMonthPlaceholder;
|
||
}
|
||
if (picker === "week" && locale2.lang.weekPlaceholder) {
|
||
return locale2.lang.rangeWeekPlaceholder;
|
||
}
|
||
if (picker === "time" && locale2.timePickerLocale.placeholder) {
|
||
return locale2.timePickerLocale.rangePlaceholder;
|
||
}
|
||
return locale2.lang.rangePlaceholder;
|
||
}
|
||
function transPlacement2DropdownAlign(direction, placement) {
|
||
const overflow = {
|
||
adjustX: 1,
|
||
adjustY: 1
|
||
};
|
||
switch (placement) {
|
||
case "bottomLeft": {
|
||
return {
|
||
points: ["tl", "bl"],
|
||
offset: [0, 4],
|
||
overflow
|
||
};
|
||
}
|
||
case "bottomRight": {
|
||
return {
|
||
points: ["tr", "br"],
|
||
offset: [0, 4],
|
||
overflow
|
||
};
|
||
}
|
||
case "topLeft": {
|
||
return {
|
||
points: ["bl", "tl"],
|
||
offset: [0, -4],
|
||
overflow
|
||
};
|
||
}
|
||
case "topRight": {
|
||
return {
|
||
points: ["br", "tr"],
|
||
offset: [0, -4],
|
||
overflow
|
||
};
|
||
}
|
||
default: {
|
||
return {
|
||
points: direction === "rtl" ? ["tr", "br"] : ["tl", "bl"],
|
||
offset: [0, 4],
|
||
overflow
|
||
};
|
||
}
|
||
}
|
||
}
|
||
function commonProps() {
|
||
return {
|
||
id: String,
|
||
/**
|
||
* @deprecated `dropdownClassName` is deprecated which will be removed in next major
|
||
* version.Please use `popupClassName` instead.
|
||
*/
|
||
dropdownClassName: String,
|
||
popupClassName: String,
|
||
popupStyle: objectType(),
|
||
transitionName: String,
|
||
placeholder: String,
|
||
allowClear: booleanType(),
|
||
autofocus: booleanType(),
|
||
disabled: booleanType(),
|
||
tabindex: Number,
|
||
open: booleanType(),
|
||
defaultOpen: booleanType(),
|
||
/** Make input readOnly to avoid popup keyboard in mobile */
|
||
inputReadOnly: booleanType(),
|
||
format: someType([String, Function, Array]),
|
||
// Value
|
||
// format: string | CustomFormat<DateType> | (string | CustomFormat<DateType>)[];
|
||
// Render
|
||
// suffixIcon?: VueNode;
|
||
// clearIcon?: VueNode;
|
||
// prevIcon?: VueNode;
|
||
// nextIcon?: VueNode;
|
||
// superPrevIcon?: VueNode;
|
||
// superNextIcon?: VueNode;
|
||
getPopupContainer: functionType(),
|
||
panelRender: functionType(),
|
||
// // Events
|
||
onChange: functionType(),
|
||
"onUpdate:value": functionType(),
|
||
onOk: functionType(),
|
||
onOpenChange: functionType(),
|
||
"onUpdate:open": functionType(),
|
||
onFocus: functionType(),
|
||
onBlur: functionType(),
|
||
onMousedown: functionType(),
|
||
onMouseup: functionType(),
|
||
onMouseenter: functionType(),
|
||
onMouseleave: functionType(),
|
||
onClick: functionType(),
|
||
onContextmenu: functionType(),
|
||
onKeydown: functionType(),
|
||
// WAI-ARIA
|
||
role: String,
|
||
name: String,
|
||
autocomplete: String,
|
||
direction: stringType(),
|
||
showToday: booleanType(),
|
||
showTime: someType([Boolean, Object]),
|
||
locale: objectType(),
|
||
size: stringType(),
|
||
bordered: booleanType(),
|
||
dateRender: functionType(),
|
||
disabledDate: functionType(),
|
||
mode: stringType(),
|
||
picker: stringType(),
|
||
valueFormat: String,
|
||
placement: stringType(),
|
||
status: stringType(),
|
||
/** @deprecated Please use `disabledTime` instead. */
|
||
disabledHours: functionType(),
|
||
/** @deprecated Please use `disabledTime` instead. */
|
||
disabledMinutes: functionType(),
|
||
/** @deprecated Please use `disabledTime` instead. */
|
||
disabledSeconds: functionType()
|
||
};
|
||
}
|
||
function datePickerProps() {
|
||
return {
|
||
defaultPickerValue: someType([Object, String]),
|
||
defaultValue: someType([Object, String]),
|
||
value: someType([Object, String]),
|
||
presets: arrayType(),
|
||
disabledTime: functionType(),
|
||
renderExtraFooter: functionType(),
|
||
showNow: booleanType(),
|
||
monthCellRender: functionType(),
|
||
// deprecated Please use `monthCellRender"` instead.',
|
||
monthCellContentRender: functionType()
|
||
};
|
||
}
|
||
function rangePickerProps() {
|
||
return {
|
||
allowEmpty: arrayType(),
|
||
dateRender: functionType(),
|
||
defaultPickerValue: arrayType(),
|
||
defaultValue: arrayType(),
|
||
value: arrayType(),
|
||
presets: arrayType(),
|
||
disabledTime: functionType(),
|
||
disabled: someType([Boolean, Array]),
|
||
renderExtraFooter: functionType(),
|
||
separator: {
|
||
type: String
|
||
},
|
||
showTime: someType([Boolean, Object]),
|
||
ranges: objectType(),
|
||
placeholder: arrayType(),
|
||
mode: arrayType(),
|
||
onChange: functionType(),
|
||
"onUpdate:value": functionType(),
|
||
onCalendarChange: functionType(),
|
||
onPanelChange: functionType(),
|
||
onOk: functionType()
|
||
};
|
||
}
|
||
var __rest$1 = function(s, e) {
|
||
var t = {};
|
||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
|
||
if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
||
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
|
||
}
|
||
return t;
|
||
};
|
||
function generateSinglePicker(generateConfig2, extraProps) {
|
||
function getPicker(picker, displayName) {
|
||
const comProps = _extends(_extends(_extends({}, commonProps()), datePickerProps()), extraProps);
|
||
return defineComponent({
|
||
compatConfig: {
|
||
MODE: 3
|
||
},
|
||
name: displayName,
|
||
inheritAttrs: false,
|
||
props: comProps,
|
||
slots: Object,
|
||
setup(_props, _ref) {
|
||
let {
|
||
slots,
|
||
expose,
|
||
attrs,
|
||
emit
|
||
} = _ref;
|
||
const props = _props;
|
||
const formItemContext = useInjectFormItemContext();
|
||
const formItemInputContext = FormItemInputContext.useInject();
|
||
const {
|
||
prefixCls,
|
||
direction,
|
||
getPopupContainer,
|
||
size,
|
||
rootPrefixCls,
|
||
disabled
|
||
} = useConfigInject("picker", props);
|
||
const {
|
||
compactSize,
|
||
compactItemClassnames
|
||
} = useCompactItemContext(prefixCls, direction);
|
||
const mergedSize = computed(() => compactSize.value || size.value);
|
||
const [wrapSSR, hashId] = useStyle(prefixCls);
|
||
const pickerRef = ref();
|
||
expose({
|
||
focus: () => {
|
||
var _a;
|
||
(_a = pickerRef.value) === null || _a === void 0 ? void 0 : _a.focus();
|
||
},
|
||
blur: () => {
|
||
var _a;
|
||
(_a = pickerRef.value) === null || _a === void 0 ? void 0 : _a.blur();
|
||
}
|
||
});
|
||
const maybeToString = (date) => {
|
||
return props.valueFormat ? generateConfig2.toString(date, props.valueFormat) : date;
|
||
};
|
||
const onChange = (date, dateString) => {
|
||
const value2 = maybeToString(date);
|
||
emit("update:value", value2);
|
||
emit("change", value2, dateString);
|
||
formItemContext.onFieldChange();
|
||
};
|
||
const onOpenChange = (open) => {
|
||
emit("update:open", open);
|
||
emit("openChange", open);
|
||
};
|
||
const onFocus = (e) => {
|
||
emit("focus", e);
|
||
};
|
||
const onBlur = (e) => {
|
||
emit("blur", e);
|
||
formItemContext.onFieldBlur();
|
||
};
|
||
const onPanelChange = (date, mode) => {
|
||
const value2 = maybeToString(date);
|
||
emit("panelChange", value2, mode);
|
||
};
|
||
const onOk = (date) => {
|
||
const value2 = maybeToString(date);
|
||
emit("ok", value2);
|
||
};
|
||
const [contextLocale] = useLocaleReceiver("DatePicker", locale$1$1);
|
||
const value = computed(() => {
|
||
if (props.value) {
|
||
return props.valueFormat ? generateConfig2.toDate(props.value, props.valueFormat) : props.value;
|
||
}
|
||
return props.value === "" ? void 0 : props.value;
|
||
});
|
||
const defaultValue = computed(() => {
|
||
if (props.defaultValue) {
|
||
return props.valueFormat ? generateConfig2.toDate(props.defaultValue, props.valueFormat) : props.defaultValue;
|
||
}
|
||
return props.defaultValue === "" ? void 0 : props.defaultValue;
|
||
});
|
||
const defaultPickerValue = computed(() => {
|
||
if (props.defaultPickerValue) {
|
||
return props.valueFormat ? generateConfig2.toDate(props.defaultPickerValue, props.valueFormat) : props.defaultPickerValue;
|
||
}
|
||
return props.defaultPickerValue === "" ? void 0 : props.defaultPickerValue;
|
||
});
|
||
return () => {
|
||
var _a, _b, _c, _d, _e, _f;
|
||
const locale2 = _extends(_extends({}, contextLocale.value), props.locale);
|
||
const p = _extends(_extends({}, props), attrs);
|
||
const {
|
||
bordered = true,
|
||
placeholder,
|
||
suffixIcon = (_a = slots.suffixIcon) === null || _a === void 0 ? void 0 : _a.call(slots),
|
||
showToday = true,
|
||
transitionName,
|
||
allowClear = true,
|
||
dateRender = slots.dateRender,
|
||
renderExtraFooter = slots.renderExtraFooter,
|
||
monthCellRender = slots.monthCellRender || props.monthCellContentRender || slots.monthCellContentRender,
|
||
clearIcon = (_b = slots.clearIcon) === null || _b === void 0 ? void 0 : _b.call(slots),
|
||
id = formItemContext.id.value
|
||
} = p, restProps = __rest$1(p, ["bordered", "placeholder", "suffixIcon", "showToday", "transitionName", "allowClear", "dateRender", "renderExtraFooter", "monthCellRender", "clearIcon", "id"]);
|
||
const showTime = p.showTime === "" ? true : p.showTime;
|
||
const {
|
||
format
|
||
} = p;
|
||
let additionalOverrideProps = {};
|
||
if (picker) {
|
||
additionalOverrideProps.picker = picker;
|
||
}
|
||
const mergedPicker = picker || p.picker || "date";
|
||
additionalOverrideProps = _extends(_extends(_extends({}, additionalOverrideProps), showTime ? getTimeProps(_extends({
|
||
format,
|
||
picker: mergedPicker
|
||
}, typeof showTime === "object" ? showTime : {})) : {}), mergedPicker === "time" ? getTimeProps(_extends(_extends({
|
||
format
|
||
}, restProps), {
|
||
picker: mergedPicker
|
||
})) : {});
|
||
const pre = prefixCls.value;
|
||
const suffixNode = createVNode(Fragment, null, [suffixIcon || (picker === "time" ? createVNode(ClockCircleOutlined, null, null) : createVNode(CalendarOutlined, null, null)), formItemInputContext.hasFeedback && formItemInputContext.feedbackIcon]);
|
||
return wrapSSR(createVNode(Picker$1, _objectSpread$3(_objectSpread$3(_objectSpread$3({
|
||
"monthCellRender": monthCellRender,
|
||
"dateRender": dateRender,
|
||
"renderExtraFooter": renderExtraFooter,
|
||
"ref": pickerRef,
|
||
"placeholder": getPlaceholder(locale2, mergedPicker, placeholder),
|
||
"suffixIcon": suffixNode,
|
||
"dropdownAlign": transPlacement2DropdownAlign(direction.value, props.placement),
|
||
"clearIcon": clearIcon || createVNode(CloseCircleFilled, null, null),
|
||
"allowClear": allowClear,
|
||
"transitionName": transitionName || `${rootPrefixCls.value}-slide-up`
|
||
}, restProps), additionalOverrideProps), {}, {
|
||
"id": id,
|
||
"picker": mergedPicker,
|
||
"value": value.value,
|
||
"defaultValue": defaultValue.value,
|
||
"defaultPickerValue": defaultPickerValue.value,
|
||
"showToday": showToday,
|
||
"locale": locale2.lang,
|
||
"class": classNames({
|
||
[`${pre}-${mergedSize.value}`]: mergedSize.value,
|
||
[`${pre}-borderless`]: !bordered
|
||
}, getStatusClassNames(pre, getMergedStatus(formItemInputContext.status, props.status), formItemInputContext.hasFeedback), attrs.class, hashId.value, compactItemClassnames.value),
|
||
"disabled": disabled.value,
|
||
"prefixCls": pre,
|
||
"getPopupContainer": attrs.getCalendarContainer || getPopupContainer.value,
|
||
"generateConfig": generateConfig2,
|
||
"prevIcon": ((_c = slots.prevIcon) === null || _c === void 0 ? void 0 : _c.call(slots)) || createVNode("span", {
|
||
"class": `${pre}-prev-icon`
|
||
}, null),
|
||
"nextIcon": ((_d = slots.nextIcon) === null || _d === void 0 ? void 0 : _d.call(slots)) || createVNode("span", {
|
||
"class": `${pre}-next-icon`
|
||
}, null),
|
||
"superPrevIcon": ((_e = slots.superPrevIcon) === null || _e === void 0 ? void 0 : _e.call(slots)) || createVNode("span", {
|
||
"class": `${pre}-super-prev-icon`
|
||
}, null),
|
||
"superNextIcon": ((_f = slots.superNextIcon) === null || _f === void 0 ? void 0 : _f.call(slots)) || createVNode("span", {
|
||
"class": `${pre}-super-next-icon`
|
||
}, null),
|
||
"components": Components,
|
||
"direction": direction.value,
|
||
"dropdownClassName": classNames(hashId.value, props.popupClassName, props.dropdownClassName),
|
||
"onChange": onChange,
|
||
"onOpenChange": onOpenChange,
|
||
"onFocus": onFocus,
|
||
"onBlur": onBlur,
|
||
"onPanelChange": onPanelChange,
|
||
"onOk": onOk
|
||
}), null));
|
||
};
|
||
}
|
||
});
|
||
}
|
||
const DatePicker2 = getPicker(void 0, "ADatePicker");
|
||
const WeekPicker2 = getPicker("week", "AWeekPicker");
|
||
const MonthPicker2 = getPicker("month", "AMonthPicker");
|
||
const YearPicker2 = getPicker("year", "AYearPicker");
|
||
const TimePicker2 = getPicker("time", "TimePicker");
|
||
const QuarterPicker2 = getPicker("quarter", "AQuarterPicker");
|
||
return {
|
||
DatePicker: DatePicker2,
|
||
WeekPicker: WeekPicker2,
|
||
MonthPicker: MonthPicker2,
|
||
YearPicker: YearPicker2,
|
||
TimePicker: TimePicker2,
|
||
QuarterPicker: QuarterPicker2
|
||
};
|
||
}
|
||
var __rest = function(s, e) {
|
||
var t = {};
|
||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
|
||
if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
||
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
|
||
}
|
||
return t;
|
||
};
|
||
function generateRangePicker(generateConfig2, extraProps) {
|
||
const RangePicker2 = defineComponent({
|
||
compatConfig: {
|
||
MODE: 3
|
||
},
|
||
name: "ARangePicker",
|
||
inheritAttrs: false,
|
||
props: _extends(_extends(_extends({}, commonProps()), rangePickerProps()), extraProps),
|
||
slots: Object,
|
||
setup(_props, _ref) {
|
||
let {
|
||
expose,
|
||
slots,
|
||
attrs,
|
||
emit
|
||
} = _ref;
|
||
const props = _props;
|
||
const formItemContext = useInjectFormItemContext();
|
||
const formItemInputContext = FormItemInputContext.useInject();
|
||
const {
|
||
prefixCls,
|
||
direction,
|
||
getPopupContainer,
|
||
size,
|
||
rootPrefixCls,
|
||
disabled
|
||
} = useConfigInject("picker", props);
|
||
const {
|
||
compactSize,
|
||
compactItemClassnames
|
||
} = useCompactItemContext(prefixCls, direction);
|
||
const mergedSize = computed(() => compactSize.value || size.value);
|
||
const [wrapSSR, hashId] = useStyle(prefixCls);
|
||
const pickerRef = ref();
|
||
expose({
|
||
focus: () => {
|
||
var _a;
|
||
(_a = pickerRef.value) === null || _a === void 0 ? void 0 : _a.focus();
|
||
},
|
||
blur: () => {
|
||
var _a;
|
||
(_a = pickerRef.value) === null || _a === void 0 ? void 0 : _a.blur();
|
||
}
|
||
});
|
||
const maybeToStrings = (dates) => {
|
||
return props.valueFormat ? generateConfig2.toString(dates, props.valueFormat) : dates;
|
||
};
|
||
const onChange = (dates, dateStrings) => {
|
||
const values = maybeToStrings(dates);
|
||
emit("update:value", values);
|
||
emit("change", values, dateStrings);
|
||
formItemContext.onFieldChange();
|
||
};
|
||
const onOpenChange = (open) => {
|
||
emit("update:open", open);
|
||
emit("openChange", open);
|
||
};
|
||
const onFocus = (e) => {
|
||
emit("focus", e);
|
||
};
|
||
const onBlur = (e) => {
|
||
emit("blur", e);
|
||
formItemContext.onFieldBlur();
|
||
};
|
||
const onPanelChange = (dates, modes) => {
|
||
const values = maybeToStrings(dates);
|
||
emit("panelChange", values, modes);
|
||
};
|
||
const onOk = (dates) => {
|
||
const value2 = maybeToStrings(dates);
|
||
emit("ok", value2);
|
||
};
|
||
const onCalendarChange = (dates, dateStrings, info) => {
|
||
const values = maybeToStrings(dates);
|
||
emit("calendarChange", values, dateStrings, info);
|
||
};
|
||
const [contextLocale] = useLocaleReceiver("DatePicker", locale$1$1);
|
||
const value = computed(() => {
|
||
if (props.value) {
|
||
return props.valueFormat ? generateConfig2.toDate(props.value, props.valueFormat) : props.value;
|
||
}
|
||
return props.value;
|
||
});
|
||
const defaultValue = computed(() => {
|
||
if (props.defaultValue) {
|
||
return props.valueFormat ? generateConfig2.toDate(props.defaultValue, props.valueFormat) : props.defaultValue;
|
||
}
|
||
return props.defaultValue;
|
||
});
|
||
const defaultPickerValue = computed(() => {
|
||
if (props.defaultPickerValue) {
|
||
return props.valueFormat ? generateConfig2.toDate(props.defaultPickerValue, props.valueFormat) : props.defaultPickerValue;
|
||
}
|
||
return props.defaultPickerValue;
|
||
});
|
||
return () => {
|
||
var _a, _b, _c, _d, _e, _f, _g;
|
||
const locale2 = _extends(_extends({}, contextLocale.value), props.locale);
|
||
const p = _extends(_extends({}, props), attrs);
|
||
const {
|
||
prefixCls: customizePrefixCls,
|
||
bordered = true,
|
||
placeholder,
|
||
suffixIcon = (_a = slots.suffixIcon) === null || _a === void 0 ? void 0 : _a.call(slots),
|
||
picker = "date",
|
||
transitionName,
|
||
allowClear = true,
|
||
dateRender = slots.dateRender,
|
||
renderExtraFooter = slots.renderExtraFooter,
|
||
separator = (_b = slots.separator) === null || _b === void 0 ? void 0 : _b.call(slots),
|
||
clearIcon = (_c = slots.clearIcon) === null || _c === void 0 ? void 0 : _c.call(slots),
|
||
id = formItemContext.id.value
|
||
} = p, restProps = __rest(p, ["prefixCls", "bordered", "placeholder", "suffixIcon", "picker", "transitionName", "allowClear", "dateRender", "renderExtraFooter", "separator", "clearIcon", "id"]);
|
||
delete restProps["onUpdate:value"];
|
||
delete restProps["onUpdate:open"];
|
||
const {
|
||
format,
|
||
showTime
|
||
} = p;
|
||
let additionalOverrideProps = {};
|
||
additionalOverrideProps = _extends(_extends(_extends({}, additionalOverrideProps), showTime ? getTimeProps(_extends({
|
||
format,
|
||
picker
|
||
}, showTime)) : {}), picker === "time" ? getTimeProps(_extends(_extends({
|
||
format
|
||
}, omit(restProps, ["disabledTime"])), {
|
||
picker
|
||
})) : {});
|
||
const pre = prefixCls.value;
|
||
const suffixNode = createVNode(Fragment, null, [suffixIcon || (picker === "time" ? createVNode(ClockCircleOutlined, null, null) : createVNode(CalendarOutlined, null, null)), formItemInputContext.hasFeedback && formItemInputContext.feedbackIcon]);
|
||
return wrapSSR(createVNode(InterRangerPicker, _objectSpread$3(_objectSpread$3(_objectSpread$3({
|
||
"dateRender": dateRender,
|
||
"renderExtraFooter": renderExtraFooter,
|
||
"separator": separator || createVNode("span", {
|
||
"aria-label": "to",
|
||
"class": `${pre}-separator`
|
||
}, [createVNode(SwapRightOutlined, null, null)]),
|
||
"ref": pickerRef,
|
||
"dropdownAlign": transPlacement2DropdownAlign(direction.value, props.placement),
|
||
"placeholder": getRangePlaceholder(locale2, picker, placeholder),
|
||
"suffixIcon": suffixNode,
|
||
"clearIcon": clearIcon || createVNode(CloseCircleFilled, null, null),
|
||
"allowClear": allowClear,
|
||
"transitionName": transitionName || `${rootPrefixCls.value}-slide-up`
|
||
}, restProps), additionalOverrideProps), {}, {
|
||
"disabled": disabled.value,
|
||
"id": id,
|
||
"value": value.value,
|
||
"defaultValue": defaultValue.value,
|
||
"defaultPickerValue": defaultPickerValue.value,
|
||
"picker": picker,
|
||
"class": classNames({
|
||
[`${pre}-${mergedSize.value}`]: mergedSize.value,
|
||
[`${pre}-borderless`]: !bordered
|
||
}, getStatusClassNames(pre, getMergedStatus(formItemInputContext.status, props.status), formItemInputContext.hasFeedback), attrs.class, hashId.value, compactItemClassnames.value),
|
||
"locale": locale2.lang,
|
||
"prefixCls": pre,
|
||
"getPopupContainer": attrs.getCalendarContainer || getPopupContainer.value,
|
||
"generateConfig": generateConfig2,
|
||
"prevIcon": ((_d = slots.prevIcon) === null || _d === void 0 ? void 0 : _d.call(slots)) || createVNode("span", {
|
||
"class": `${pre}-prev-icon`
|
||
}, null),
|
||
"nextIcon": ((_e = slots.nextIcon) === null || _e === void 0 ? void 0 : _e.call(slots)) || createVNode("span", {
|
||
"class": `${pre}-next-icon`
|
||
}, null),
|
||
"superPrevIcon": ((_f = slots.superPrevIcon) === null || _f === void 0 ? void 0 : _f.call(slots)) || createVNode("span", {
|
||
"class": `${pre}-super-prev-icon`
|
||
}, null),
|
||
"superNextIcon": ((_g = slots.superNextIcon) === null || _g === void 0 ? void 0 : _g.call(slots)) || createVNode("span", {
|
||
"class": `${pre}-super-next-icon`
|
||
}, null),
|
||
"components": Components,
|
||
"direction": direction.value,
|
||
"dropdownClassName": classNames(hashId.value, props.popupClassName, props.dropdownClassName),
|
||
"onChange": onChange,
|
||
"onOpenChange": onOpenChange,
|
||
"onFocus": onFocus,
|
||
"onBlur": onBlur,
|
||
"onPanelChange": onPanelChange,
|
||
"onOk": onOk,
|
||
"onCalendarChange": onCalendarChange
|
||
}), null));
|
||
};
|
||
}
|
||
});
|
||
return RangePicker2;
|
||
}
|
||
const Components = {
|
||
button: PickerButton,
|
||
rangeItem: PickerTag
|
||
};
|
||
function toArray(list) {
|
||
if (!list) {
|
||
return [];
|
||
}
|
||
return Array.isArray(list) ? list : [list];
|
||
}
|
||
function getTimeProps(props) {
|
||
const {
|
||
format,
|
||
picker,
|
||
showHour,
|
||
showMinute,
|
||
showSecond,
|
||
use12Hours
|
||
} = props;
|
||
const firstFormat = toArray(format)[0];
|
||
const showTimeObj = _extends({}, props);
|
||
if (firstFormat && typeof firstFormat === "string") {
|
||
if (!firstFormat.includes("s") && showSecond === void 0) {
|
||
showTimeObj.showSecond = false;
|
||
}
|
||
if (!firstFormat.includes("m") && showMinute === void 0) {
|
||
showTimeObj.showMinute = false;
|
||
}
|
||
if (!firstFormat.includes("H") && !firstFormat.includes("h") && showHour === void 0) {
|
||
showTimeObj.showHour = false;
|
||
}
|
||
if ((firstFormat.includes("a") || firstFormat.includes("A")) && use12Hours === void 0) {
|
||
showTimeObj.use12Hours = true;
|
||
}
|
||
}
|
||
if (picker === "time") {
|
||
return showTimeObj;
|
||
}
|
||
if (typeof firstFormat === "function") {
|
||
delete showTimeObj.format;
|
||
}
|
||
return {
|
||
showTime: showTimeObj
|
||
};
|
||
}
|
||
function generatePicker(generateConfig2, extraProps) {
|
||
const {
|
||
DatePicker: DatePicker2,
|
||
WeekPicker: WeekPicker2,
|
||
MonthPicker: MonthPicker2,
|
||
YearPicker: YearPicker2,
|
||
TimePicker: TimePicker2,
|
||
QuarterPicker: QuarterPicker2
|
||
} = generateSinglePicker(generateConfig2, extraProps);
|
||
const RangePicker2 = generateRangePicker(generateConfig2, extraProps);
|
||
return {
|
||
DatePicker: DatePicker2,
|
||
WeekPicker: WeekPicker2,
|
||
MonthPicker: MonthPicker2,
|
||
YearPicker: YearPicker2,
|
||
TimePicker: TimePicker2,
|
||
QuarterPicker: QuarterPicker2,
|
||
RangePicker: RangePicker2
|
||
};
|
||
}
|
||
const {
|
||
DatePicker,
|
||
WeekPicker,
|
||
MonthPicker,
|
||
YearPicker,
|
||
TimePicker,
|
||
QuarterPicker,
|
||
RangePicker
|
||
} = generatePicker(generateConfig);
|
||
const DatePicker$1 = _extends(DatePicker, {
|
||
WeekPicker,
|
||
MonthPicker,
|
||
YearPicker,
|
||
RangePicker,
|
||
TimePicker,
|
||
QuarterPicker,
|
||
install: (app) => {
|
||
app.component(DatePicker.name, DatePicker);
|
||
app.component(RangePicker.name, RangePicker);
|
||
app.component(MonthPicker.name, MonthPicker);
|
||
app.component(WeekPicker.name, WeekPicker);
|
||
app.component(QuarterPicker.name, QuarterPicker);
|
||
return app;
|
||
}
|
||
});
|
||
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
||
__name: "BaseDatePicker",
|
||
__ssrInlineRender: true,
|
||
props: {
|
||
value: { type: [String, Number, Boolean, Array] },
|
||
disabledDate: { type: Boolean }
|
||
},
|
||
emits: ["update:value"],
|
||
setup(__props, { emit: __emit }) {
|
||
const disabledDate = (current) => {
|
||
if (props.disabledDate)
|
||
return current && current < dayjs().endOf("day");
|
||
else
|
||
return false;
|
||
};
|
||
const emit = __emit;
|
||
const props = __props;
|
||
const localValue = computed({
|
||
get() {
|
||
const dayjsDate = props.value ? dayjs(props.value) : null;
|
||
return dayjsDate;
|
||
},
|
||
set(value) {
|
||
const date = dayjs(value).format("YYYY-MM-DD");
|
||
emit("update:value", date);
|
||
}
|
||
});
|
||
return (_ctx, _push, _parent, _attrs) => {
|
||
_push(ssrRenderComponent(unref(DatePicker$1), mergeProps({
|
||
value: localValue.value,
|
||
"onUpdate:value": ($event) => localValue.value = $event,
|
||
"disabled-date": disabledDate,
|
||
class: "w-full",
|
||
inputReadOnly: ""
|
||
}, _attrs), null, _parent));
|
||
};
|
||
}
|
||
});
|
||
const _sfc_setup$1 = _sfc_main$1.setup;
|
||
_sfc_main$1.setup = (props, ctx) => {
|
||
const ssrContext = useSSRContext();
|
||
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/BasicPacks/BaseDatePicker/src/BaseDatePicker.vue");
|
||
return _sfc_setup$1 ? _sfc_setup$1(props, ctx) : void 0;
|
||
};
|
||
const locale$2 = {
|
||
locale: "fa_IR",
|
||
today: "\u0627\u0645\u0631\u0648\u0632",
|
||
now: "\u0627\u06A9\u0646\u0648\u0646",
|
||
backToToday: "\u0628\u0627\u0632\u06AF\u0634\u062A \u0628\u0647 \u0631\u0648\u0632",
|
||
ok: "\u0628\u0627\u0634\u0647",
|
||
clear: "\u067E\u0627\u06A9 \u06A9\u0631\u062F\u0646",
|
||
month: "\u0645\u0627\u0647",
|
||
year: "\u0633\u0627\u0644",
|
||
timeSelect: "\u0627\u0646\u062A\u062E\u0627\u0628 \u0632\u0645\u0627\u0646",
|
||
dateSelect: "\u0627\u0646\u062A\u062E\u0627\u0628 \u062A\u0627\u0631\u06CC\u062E",
|
||
monthSelect: "\u06CC\u06A9 \u0645\u0627\u0647 \u0631\u0627 \u0627\u0646\u062A\u062E\u0627\u0628 \u06A9\u0646\u06CC\u062F",
|
||
yearSelect: "\u06CC\u06A9 \u0633\u0627\u0644 \u0631\u0627 \u0627\u0646\u062A\u062E\u0627\u0628 \u06A9\u0646\u06CC\u062F",
|
||
decadeSelect: "\u06CC\u06A9 \u062F\u0647\u0647 \u0631\u0627 \u0627\u0646\u062A\u062E\u0627\u0628 \u06A9\u0646\u06CC\u062F",
|
||
yearFormat: "YYYY",
|
||
dateFormat: "M/D/YYYY",
|
||
dayFormat: "D",
|
||
dateTimeFormat: "M/D/YYYY HH:mm:ss",
|
||
monthBeforeYear: true,
|
||
previousMonth: "\u0645\u0627\u0647 \u0642\u0628\u0644 (PageUp)",
|
||
nextMonth: "\u0645\u0627\u0647 \u0628\u0639\u062F (PageDown)",
|
||
previousYear: "\u0633\u0627\u0644 \u0642\u0628\u0644 (Control + left)",
|
||
nextYear: "\u0633\u0627\u0644 \u0628\u0639\u062F (Control + right)",
|
||
previousDecade: "\u062F\u0647\u0647 \u0642\u0628\u0644",
|
||
nextDecade: "\u062F\u0647\u0647 \u0628\u0639\u062F",
|
||
previousCentury: "\u0642\u0631\u0646 \u0642\u0628\u0644",
|
||
nextCentury: "\u0642\u0631\u0646 \u0628\u0639\u062F"
|
||
};
|
||
const locale$1 = {
|
||
placeholder: "\u0627\u0646\u062A\u062E\u0627\u0628 \u0632\u0645\u0627\u0646",
|
||
rangePlaceholder: ["\u0632\u0645\u0627\u0646 \u0634\u0631\u0648\u0639", "\u0632\u0645\u0627\u0646 \u067E\u0627\u06CC\u0627\u0646"]
|
||
};
|
||
const locale = {
|
||
lang: _extends({
|
||
placeholder: "\u0627\u0646\u062A\u062E\u0627\u0628 \u062A\u0627\u0631\u06CC\u062E",
|
||
yearPlaceholder: "\u0627\u0646\u062A\u062E\u0627\u0628 \u0633\u0627\u0644",
|
||
quarterPlaceholder: "\u0627\u0646\u062A\u062E\u0627\u0628 \u0641\u0635\u0644",
|
||
monthPlaceholder: "\u0627\u0646\u062A\u062E\u0627\u0628 \u0645\u0627\u0647",
|
||
weekPlaceholder: "\u0627\u0646\u062A\u062E\u0627\u0628 \u0647\u0641\u062A\u0647",
|
||
rangePlaceholder: ["\u062A\u0627\u0631\u06CC\u062E \u0634\u0631\u0648\u0639", "\u062A\u0627\u0631\u06CC\u062E \u067E\u0627\u06CC\u0627\u0646"],
|
||
rangeYearPlaceholder: ["\u0633\u0627\u0644 \u0634\u0631\u0648\u0639", "\u0633\u0627\u0644 \u067E\u0627\u06CC\u0627\u0646"],
|
||
rangeMonthPlaceholder: ["\u0645\u0627\u0647 \u0634\u0631\u0648\u0639", "\u0645\u0627\u0647 \u067E\u0627\u06CC\u0627\u0646"],
|
||
rangeWeekPlaceholder: ["\u0647\u0641\u062A\u0647 \u0634\u0631\u0648\u0639", "\u0647\u0641\u062A\u0647 \u067E\u0627\u06CC\u0627\u0646"]
|
||
}, locale$2),
|
||
timePickerLocale: _extends({}, locale$1)
|
||
};
|
||
const _sfc_main = /* @__PURE__ */ defineComponent({
|
||
__name: "BaseDatePicker",
|
||
__ssrInlineRender: true,
|
||
props: {
|
||
value: { type: [String, Number, Boolean, Array] }
|
||
},
|
||
emits: ["update:value"],
|
||
setup(__props, { emit: __emit }) {
|
||
const config = useConfigStore();
|
||
moment.locale("fa", fa);
|
||
moment.loadPersian();
|
||
dayjs.extend(jalaliday);
|
||
const months = [
|
||
"\u0641\u0631\u0648\u0631\u062F\u06CC\u0646",
|
||
"\u0627\u0631\u062F\u06CC\u0628\u0647\u0634\u062A",
|
||
"\u062E\u0631\u062F\u0627\u062F",
|
||
"\u062A\u06CC\u0631",
|
||
"\u0645\u0631\u062F\u0627\u062F",
|
||
"\u0634\u0647\u0631\u06CC\u0648\u0631",
|
||
"\u0645\u0647\u0631",
|
||
"\u0622\u0628\u0627\u0646",
|
||
"\u0622\u0630\u0631",
|
||
"\u062F\u06CC",
|
||
"\u0628\u0647\u0645\u0646",
|
||
"\u0627\u0633\u0641\u0646\u062F"
|
||
];
|
||
dayjs.updateLocale("fa", {
|
||
monthsShort: months,
|
||
months
|
||
});
|
||
dayjs.calendar("jalali");
|
||
const emit = __emit;
|
||
const props = __props;
|
||
const localValue = computed({
|
||
get() {
|
||
const dayjsDate = props.value ? dayjs(props.value) : null;
|
||
return dayjsDate;
|
||
},
|
||
set(value) {
|
||
const date = dayjs(value).format("YYYY-MM-DD");
|
||
console.log(moment(date, "jYYYY/jM/jD HH:mm").format("YYYY-M-D"));
|
||
emit("update:value", moment(date, "jYYYY/jM/jD HH:mm").format("YYYY-M-D"));
|
||
}
|
||
});
|
||
return (_ctx, _push, _parent, _attrs) => {
|
||
_push(ssrRenderComponent(unref(DatePicker$1), mergeProps({
|
||
value: localValue.value,
|
||
"onUpdate:value": ($event) => localValue.value = $event,
|
||
locale: unref(locale),
|
||
class: "w-full",
|
||
placeholder: unref(config).useString("selectDate"),
|
||
inputReadOnly: ""
|
||
}, _attrs), null, _parent));
|
||
};
|
||
}
|
||
});
|
||
const _sfc_setup = _sfc_main.setup;
|
||
_sfc_main.setup = (props, ctx) => {
|
||
const ssrContext = useSSRContext();
|
||
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/BasicPacks/BaseDatePickerJalali/src/BaseDatePicker.vue");
|
||
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
|
||
};
|
||
|
||
export { _sfc_main$1 as _, _sfc_main as a };
|
||
//# sourceMappingURL=BaseDatePicker-CBTFfZPt.mjs.map
|