@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
201 lines (200 loc) • 7.31 kB
JavaScript
;
"use client";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _push = _interopRequireDefault(require("core-js-pure/stable/instance/push.js"));
var _react = _interopRequireWildcard(require("react"));
var _Input = _interopRequireDefault(require("../Input.js"));
var _TextMask = _interopRequireDefault(require("./TextMask.js"));
var _useHandleCursorPosition = _interopRequireDefault(require("./hooks/useHandleCursorPosition.js"));
var _classnames = _interopRequireDefault(require("classnames"));
var _FormLabel = _interopRequireDefault(require("../FormLabel.js"));
var _SpacingHelper = require("../space/SpacingHelper.js");
var _useMultiInputValues = require("./hooks/useMultiInputValues.js");
var _useId = _interopRequireDefault(require("../../shared/helpers/useId.js"));
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
function MultiInputMask({
id,
label,
labelDirection = 'horizontal',
inputs,
delimiter,
onChange: onChangeExternal,
disabled,
status,
statusState,
values: defaultValues,
className,
stretch,
inputMode,
suffix,
onBlur,
onFocus,
...props
}) {
var _inputs$;
id = (0, _useId.default)(id);
const [values, onChange] = (0, _useMultiInputValues.useMultiInputValue)({
inputs,
defaultValues,
callback: onChangeExternal
});
const inputRefs = (0, _react.useRef)([]);
const areInputsInFocus = (0, _react.useRef)(false);
const {
onKeyDown
} = (0, _useHandleCursorPosition.default)(inputRefs.current, getKeysToHandle());
const WrapperElement = label ? 'fieldset' : 'div';
return _react.default.createElement(WrapperElement, {
className: (0, _classnames.default)('dnb-multi-input-mask__fieldset', (0, _SpacingHelper.createSpacingClasses)(props), labelDirection === 'horizontal' && 'dnb-multi-input-mask__fieldset--horizontal')
}, _react.default.createElement(_Input.default, _extends({}, props, {
id: id,
label: label && _react.default.createElement(_FormLabel.default, {
element: "legend",
forId: `${id}-${(_inputs$ = inputs[0]) === null || _inputs$ === void 0 ? void 0 : _inputs$.id}`,
disabled: disabled,
labelDirection: labelDirection,
onClick: onLegendClick
}, label),
className: (0, _classnames.default)('dnb-multi-input-mask', className),
label_direction: labelDirection,
disabled: disabled,
status: status,
status_state: statusState,
suffix: suffix,
stretch: stretch,
input_element: inputs.map(({
id: inputId,
...rest
}, index) => {
return _react.default.createElement(MultiInputMaskInput, _extends({
key: inputId,
id: id,
inputId: inputId,
delimiter: index !== inputs.length - 1 ? delimiter : undefined,
disabled: disabled,
inputMode: inputMode,
onKeyDown: onKeyDown,
onChange: onChange,
onFocus: () => {
if (!areInputsInFocus.current) {
onFocus === null || onFocus === void 0 || onFocus(values);
}
areInputsInFocus.current = true;
},
onBlur: e => {
var _e$relatedTarget;
if (!((_e$relatedTarget = e.relatedTarget) !== null && _e$relatedTarget !== void 0 && (_e$relatedTarget = _e$relatedTarget.id) !== null && _e$relatedTarget !== void 0 && _e$relatedTarget.includes(id))) {
onBlur === null || onBlur === void 0 || onBlur(values);
areInputsInFocus.current = false;
}
},
getInputRef: getInputRef
}, rest, {
value: values[inputId]
}));
})
})));
function onLegendClick() {
if (disabled) {
return;
}
const firstInput = inputRefs.current[0].current;
firstInput.focus();
firstInput.setSelectionRange(0, 0);
}
function getInputRef(ref) {
const inputRef = ref === null || ref === void 0 ? void 0 : ref.inputRef;
if (inputRef && !inputRefs.current.includes(inputRef)) {
var _context;
(0, _push.default)(_context = inputRefs.current).call(_context, inputRef);
}
return inputRef;
}
function getKeysToHandle() {
const uniqueMasks = getUniqueMasks();
if (uniqueMasks.size === 1) {
const pattern = uniqueMasks.values().next().value.replace(/\//g, '');
return new RegExp(pattern);
}
return inputs.reduce((keys, {
id,
mask
}) => {
keys[id] = mask;
return keys;
}, {});
}
function getUniqueMasks() {
const masks = new Set();
inputs.forEach(input => {
input.mask.forEach(pattern => masks.add(String(pattern)));
});
return masks;
}
}
function MultiInputMaskInput({
id,
inputId,
label,
value,
mask,
placeholderCharacter,
delimiter,
disabled,
getInputRef,
onKeyDown,
onChange,
onBlur,
onFocus,
...attributes
}) {
const shouldHighlight = !disabled && /\w+/.test(value);
return _react.default.createElement(_react.default.Fragment, null, _react.default.createElement(_TextMask.default, _extends({
id: `${id}-${inputId}`,
"data-mask-id": inputId,
className: "dnb-input__input dnb-multi-input-mask__input" + (shouldHighlight ? " dnb-multi-input-mask__input--highlight" : ""),
disabled: disabled,
size: mask.length,
mask: mask,
value: value !== null && value !== void 0 ? value : '',
placeholderChar: placeholderCharacter,
guide: true,
showMask: true,
keepCharPositions: false,
"aria-label": label,
ref: getInputRef,
onKeyDown: onKeyDown,
onBlur: onBlur,
onFocus: ({
target,
...event
}) => {
target.focus();
target.select();
if (onFocus) {
onFocus({
target,
...event
});
}
},
onChange: event => {
onChange(inputId, removePlaceholder(event.target.value, placeholderCharacter));
}
}, attributes)), delimiter && _react.default.createElement("span", {
"aria-hidden": true,
className: 'dnb-multi-input-mask__delimiter' + (shouldHighlight ? " dnb-multi-input-mask__delimiter--highlight" : "")
}, delimiter));
}
function removePlaceholder(value, placeholder) {
return value.replace(RegExp(placeholder, 'gm'), '');
}
var _default = exports.default = MultiInputMask;
MultiInputMask._formElement = true;
MultiInputMask._supportsSpacingProps = true;
//# sourceMappingURL=MultiInputMask.js.map