react-date-picker
Version:
A carefully crafted date picker for React
430 lines (328 loc) • 10.7 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = function (_ref10) {
var oldValue = _ref10.oldValue;
var range = _ref10.range;
var event = _ref10.event;
var _ref10$separator = _ref10.separator;
var separator = _ref10$separator === undefined ? ':' : _ref10$separator;
var incrementNext = _ref10.incrementNext;
var circular = _ref10.circular;
var propagate = _ref10.propagate;
var hours24 = _ref10.hours24;
var meridiem = _ref10.meridiem;
var newChar = String.fromCharCode(event.which);
var start = range.start;
var end = range.end;
var key = event.key;
if (key == 'Delete' || key == 'Backspace') {
return getValueOnDelete({
key: key,
oldValue: oldValue,
range: range,
separator: separator,
meridiem: meridiem
});
}
var dir = ARROWS[key];
if (dir) {
return getValueOnDirection({
hours24: hours24,
meridiem: meridiem,
dir: dir,
oldValue: oldValue,
range: range,
circular: circular,
propagate: propagate,
separator: separator,
incrementNext: incrementNext
});
}
if (key == 'Unidentified' && newChar * 1 == newChar) {
return getValueOnNumber({
num: newChar * 1,
circular: circular,
separator: separator,
oldValue: oldValue,
range: range,
meridiem: meridiem
});
}
return {
value: oldValue
};
};
var _objectAssign = require('object-assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
var _toTimeValue = require('./toTimeValue');
var _toTimeValue2 = _interopRequireDefault(_toTimeValue);
var _leftPad = require('../utils/leftPad');
var _leftPad2 = _interopRequireDefault(_leftPad);
var _clamp = require('../utils/clamp');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var removeAt = function removeAt(_ref) {
var value = _ref.value;
var index = _ref.index;
var _ref$len = _ref.len;
var len = _ref$len === undefined ? 1 : _ref$len;
return value.substring(0, index) + value.substring(index + len);
};
var replaceAt = function replaceAt(_ref2) {
var value = _ref2.value;
var index = _ref2.index;
var _ref2$len = _ref2.len;
var len = _ref2$len === undefined ? 1 : _ref2$len;
var str = _ref2.str;
return value.substring(0, index) + str + value.substring(index + len);
};
var replaceBetween = function replaceBetween(_ref3) {
var value = _ref3.value;
var start = _ref3.start;
var end = _ref3.end;
var str = _ref3.str;
return (value.substring(0, start) || '') + str + (value.substring(end) || '');
};
var toggleMeridiem = function toggleMeridiem(meridiem) {
return {
am: 'pm',
AM: 'PM',
pm: 'am',
PM: 'pm'
}[meridiem];
};
var getValueOnDelete = function getValueOnDelete(_ref4) {
var oldValue = _ref4.oldValue;
var range = _ref4.range;
var key = _ref4.key;
var separator = _ref4.separator;
var meridiem = _ref4.meridiem;
var start = range.start;
var end = range.end;
var selectedValue = oldValue.substring(start, end);
var value = void 0;
if (selectedValue) {
var replacement = selectedValue.split('').map(function (c) {
if (c == separator || c == ' ') {
return c;
}
if (meridiem && c * 1 != c) {
return c == 'p' ? 'a' : c == 'P' ? 'A' : c;
}
return 0;
}).join('');
value = replaceBetween({ value: oldValue, start: start, end: end, str: replacement });
return {
value: value,
update: value != oldValue,
caretPos: key == 'Backspace' ? start : end
};
} else {
var back = key == 'Backspace';
var index = start + (back ? -1 : 0);
var caretPos = start + (back ? -1 : 1);
if (index < 0) {
return {
value: oldValue,
update: false
};
}
var char = oldValue[index];
value = oldValue;
var _replacement = char == separator || char == ' ' ? char : 0;
if (char && char * 1 != char && _replacement === 0 && meridiem) {
if (char == 'p') {
_replacement = 'a';
} else if (char == 'P') {
_replacement = 'A';
} else if (char == 'M' || char == 'm' || char == 'a' || char == 'A') {
_replacement = char;
}
}
value = replaceAt({ value: oldValue, index: index, str: _replacement });
return {
update: value != oldValue,
value: value,
caretPos: caretPos
};
}
};
var ARROWS = {
ArrowUp: 1,
ArrowDown: -1,
PageUp: 10,
PageDown: -10
};
var TIME_PARTS = {
24: [{ start: 0, end: 2, name: 'hours', max: 23 }, { start: 3, end: 5, name: 'minutes', max: 59 }, { start: 6, end: 8, name: 'seconds', max: 59 }],
12: [{ start: 0, end: 2, name: 'hours', max: 12, min: 1 }, { start: 3, end: 5, name: 'minutes', max: 59 }, { start: 6, end: 8, name: 'seconds', max: 59 }]
};
var getActiveTimePartIndex = function getActiveTimePartIndex(_ref5) {
var value = _ref5.value;
var timeValue = _ref5.timeValue;
var separator = _ref5.separator;
var range = _ref5.range;
var hours24 = _ref5.hours24;
var meridiem = _ref5.meridiem;
var start = range.start;
var timeParts = TIME_PARTS[hours24 ? 24 : 12];
var partIndex = 0;
var currentPart = void 0;
while (currentPart = timeParts[partIndex]) {
if (currentPart.name == 'seconds' && timeValue && !timeValue.seconds) {
return 4; //the index of the meridiem
}
if (start >= currentPart.start && start <= currentPart.end) {
return partIndex;
}
partIndex++;
}
return 4;
};
var getTimePartAt = function getTimePartAt(index, _ref6) {
var hours24 = _ref6.hours24;
return (0, _objectAssign2.default)({}, TIME_PARTS[hours24 ? 24 : 12][index]);
};
var getActiveTimePart = function getActiveTimePart(_ref7) {
var value = _ref7.value;
var timeValue = _ref7.timeValue;
var separator = _ref7.separator;
var range = _ref7.range;
var hours24 = _ref7.hours24;
var meridiem = _ref7.meridiem;
var index = getActiveTimePartIndex({ value: value, timeValue: timeValue, separator: separator, range: range, hours24: hours24 });
if (index == 4 && meridiem) {
var timePart = {
start: 6, end: 8, name: 'meridiem'
};
if (timeValue.seconds) {
timePart.start += 3;
timePart.end += 3;
}
return timePart;
}
return getTimePartAt(index, { hours24: hours24 });
};
var getValueOnDirection = function getValueOnDirection(_ref8) {
var oldValue = _ref8.oldValue;
var range = _ref8.range;
var separator = _ref8.separator;
var dir = _ref8.dir;
var incrementNext = _ref8.incrementNext;
var circular = _ref8.circular;
var propagate = _ref8.propagate;
var hours24 = _ref8.hours24;
var meridiem = _ref8.meridiem;
var start = range.start;
var end = range.end;
var value = void 0;
var timeValue = (0, _toTimeValue2.default)({ value: oldValue, separator: separator, meridiem: meridiem });
var activeTimePart = getActiveTimePart({ value: oldValue, timeValue: timeValue, separator: separator, range: range, hours24: hours24, meridiem: meridiem });
if (activeTimePart.name != 'meridiem') {
timeValue[activeTimePart.name] = dir + timeValue[activeTimePart.name] * 1;
}
var hours = timeValue.hours;
var minutes = timeValue.minutes;
var seconds = timeValue.seconds;
var toggleMeridiemValue = false;
hours *= 1;
minutes *= 1;
if (seconds) {
seconds *= 1;
}
if (activeTimePart.name != 'meridiem') {
if (seconds && (seconds > 59 || seconds < 0)) {
if (propagate) {
minutes += seconds > 59 ? 1 : -1;
}
if (circular) {
seconds %= 60;
if (seconds < 0) {
seconds = 60 + seconds;
}
}
}
if (minutes && (minutes > 59 || minutes < 0)) {
if (propagate) {
hours += minutes > 59 ? 1 : -1;
}
if (circular) {
minutes %= 60;
if (minutes < 0) {
minutes = 60 + minutes;
}
}
}
if (meridiem && circular && (hours > 12 || hours < 1)) {
toggleMeridiemValue = true;
}
}
hours = (0, _leftPad2.default)((0, _clamp.clampHour)(hours * 1, { circular: circular, max: activeTimePart.max, min: activeTimePart.min }));
minutes = (0, _leftPad2.default)((0, _clamp.clampMinute)(minutes * 1, { circular: circular }));
if (seconds != undefined) {
seconds = (0, _leftPad2.default)((0, _clamp.clampSecond)(seconds * 1, { circular: circular }));
}
value = hours + separator + minutes;
if (seconds) {
value += separator + seconds;
}
if (activeTimePart.name == 'meridiem') {
toggleMeridiemValue = true;
}
if (meridiem) {
value += ' ' + (toggleMeridiemValue ? toggleMeridiem(timeValue.meridiem) : timeValue.meridiem);
}
return {
value: value,
caretPos: activeTimePart || range.start,
update: oldValue != value
};
};
var getValueOnNumber = function getValueOnNumber(_ref9) {
var oldValue = _ref9.oldValue;
var num = _ref9.num;
var range = _ref9.range;
var separator = _ref9.separator;
var circular = _ref9.circular;
var hours24 = _ref9.hours24;
var meridiem = _ref9.meridiem;
var activeTimePartIndex = getActiveTimePartIndex({ value: oldValue, separator: separator, range: range, hours24: hours24 });
var activeTimePart = getTimePartAt(activeTimePartIndex, { hours24: hours24 });
if (activeTimePart && range.start == range.end && activeTimePart.end == range.end) {
activeTimePart = getTimePartAt(activeTimePartIndex + 1, { hours24: hours24 });
}
if (!activeTimePart) {
return {
value: value,
update: false
};
}
var name = activeTimePart.name;
var timeParts = (0, _toTimeValue2.default)({ value: oldValue, separator: separator, meridiem: meridiem });
var timePartValue = timeParts[name] + '';
var caretPos = void 0;
if (range.start <= activeTimePart.start) {
var maxFirstChar = (activeTimePart.max + '').charAt(0) * 1;
caretPos = range.start + (num > maxFirstChar ? 3 : range.start < activeTimePart.start ? 2 : 1);
timeParts[name] = num > maxFirstChar ? '0' + num : num + timeParts[name].charAt(1);
} else {
caretPos = range.start + 2;
timeParts[name] = (0, _clamp.clampNamed)(name, replaceAt({ value: timePartValue, index: 1, str: num }) * 1, { circular: circular });
}
var hours = timeParts.hours;
var minutes = timeParts.minutes;
var seconds = timeParts.seconds;
var value = hours + separator + minutes;
if (seconds) {
value += separator + seconds;
}
if (meridiem) {
value += ' ' + timeParts.meridiem;
}
return {
value: value,
caretPos: caretPos,
update: true
};
};