mirror of
https://github.com/garraflavatra/rolens.git
synced 2025-04-16 15:51:03 +00:00
96 lines
2.2 KiB
JavaScript
96 lines
2.2 KiB
JavaScript
import { isInt } from '$lib/math';
|
|
import { canBeObjectId, int32, int64, uint64 } from '$lib/mongo';
|
|
import { jsonLooseParse } from '$lib/strings';
|
|
|
|
export default function input(node, { autofocus, type, onValid, onInvalid, mandatory } = {
|
|
autofocus: false,
|
|
type: '',
|
|
onValid: () => 0,
|
|
onInvalid: () => 0,
|
|
mandatory: false,
|
|
}) {
|
|
|
|
const getMessage = () => {
|
|
const checkInteger = () => (isInt(node.value) ? false : 'Value must be an integer');
|
|
const checkNumberBoundaries = boundaries => {
|
|
if (node.value < boundaries[0]) {
|
|
return `Input is too low for type ${type}`;
|
|
}
|
|
else if (node.value > boundaries[1]) {
|
|
return `Input is too high for type ${type}`;
|
|
}
|
|
else {
|
|
return true;
|
|
}
|
|
};
|
|
|
|
switch (type) {
|
|
case 'json':
|
|
try {
|
|
jsonLooseParse(node.value);
|
|
return false;
|
|
}
|
|
catch {
|
|
return 'Invalid JSON';
|
|
}
|
|
|
|
case 'int': // int32
|
|
return checkInteger() || checkNumberBoundaries(int32);
|
|
|
|
case 'long': // int64
|
|
return checkInteger() || checkNumberBoundaries(int64);
|
|
|
|
case 'uint64':
|
|
return checkInteger() || checkNumberBoundaries(uint64);
|
|
|
|
case 'string':
|
|
if (mandatory && (!node.value)) {
|
|
return 'This field cannot empty';
|
|
}
|
|
return false;
|
|
|
|
case 'objectid':
|
|
return !canBeObjectId(node.value) && 'Invalid string representation of an ObjectId';
|
|
|
|
case 'double':
|
|
case 'decimal':
|
|
default:
|
|
return false;
|
|
}
|
|
};
|
|
|
|
const handleInput = () => {
|
|
const invalid = getMessage();
|
|
if (invalid) {
|
|
node.classList.add('invalid');
|
|
node.setCustomValidity(invalid);
|
|
node.reportValidity();
|
|
onInvalid?.();
|
|
}
|
|
else {
|
|
node.classList.remove('invalid');
|
|
node.setCustomValidity('');
|
|
node.reportValidity();
|
|
onValid?.();
|
|
}
|
|
};
|
|
|
|
const handleFocus = () => {
|
|
node.select();
|
|
};
|
|
|
|
node.addEventListener('focus', handleFocus);
|
|
node.addEventListener('input', handleInput);
|
|
|
|
if (autofocus) {
|
|
node.focus();
|
|
}
|
|
|
|
return {
|
|
destroy: () => {
|
|
node.removeEventListener('focus', handleFocus);
|
|
node.removeEventListener('input', handleInput);
|
|
},
|
|
};
|
|
}
|