@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
391 lines (390 loc) • 18 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.prepareStartupState = exports.prepareDerivedState = exports.preSelectData = exports.parseCurrentValue = exports.parseContentTitle = exports.normalizeData = exports.hasObjectKeyAsValue = exports.getSelectedItemValue = exports.getEventData = exports.getData = exports.getCurrentIndex = exports.getCurrentDataTitle = exports.getCurrentData = exports.findClosest = exports.drawerListProviderPropTypes = exports.drawerListProviderDefaultProps = exports.drawerListPropTypes = exports.drawerListDefaultProps = void 0;
var _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _componentHelper = require("../../shared/component-helper");
var _SpacingHelper = require("../../components/space/SpacingHelper");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
const drawerListPropTypes = exports.drawerListPropTypes = _objectSpread(_objectSpread({
id: _propTypes.default.string,
role: _propTypes.default.string,
cache_hash: _propTypes.default.string,
triangle_position: _propTypes.default.string,
scrollable: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),
focusable: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),
direction: _propTypes.default.oneOf(['auto', 'top', 'bottom']),
size: _propTypes.default.oneOf(['default', 'small', 'medium', 'large']),
max_height: _propTypes.default.number,
no_animation: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),
no_scroll_animation: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),
prevent_selection: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),
action_menu: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),
is_popup: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),
align_drawer: _propTypes.default.oneOf(['left', 'right']),
options_render: _propTypes.default.oneOfType([_propTypes.default.object, _propTypes.default.func, _propTypes.default.node]),
wrapper_element: _propTypes.default.oneOfType([_propTypes.default.object, _propTypes.default.func, _propTypes.default.node]),
default_value: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]),
value: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]),
skip_portal: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),
portal_class: _propTypes.default.string,
list_class: _propTypes.default.string,
prevent_close: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),
independent_width: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),
fixed_position: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),
keep_open: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),
prevent_focus: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),
skip_keysearch: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),
opened: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),
data: _propTypes.default.oneOfType([_propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.func, _propTypes.default.node, _propTypes.default.object]), _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.node]), _propTypes.default.shape({
selectedKey: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]),
selected_key: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]),
selected_value: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.node]),
suffix_value: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.node]),
disabled: _propTypes.default.bool,
content: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.node, _propTypes.default.arrayOf(_propTypes.default.string)])
})]))]),
prepared_data: _propTypes.default.array,
raw_data: _propTypes.default.oneOfType([_propTypes.default.array, _propTypes.default.object, _propTypes.default.func]),
ignore_events: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool])
}, _SpacingHelper.spacingPropTypes), {}, {
className: _propTypes.default.string,
children: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.func, _propTypes.default.node, _propTypes.default.object, _propTypes.default.array]),
on_show: _propTypes.default.func,
on_hide: _propTypes.default.func,
handle_dismiss_focus: _propTypes.default.func,
on_change: _propTypes.default.func,
on_pre_change: _propTypes.default.func,
on_resize: _propTypes.default.func,
on_select: _propTypes.default.func,
on_state_update: _propTypes.default.func
});
const drawerListDefaultProps = exports.drawerListDefaultProps = {
id: null,
role: 'listbox',
cache_hash: null,
triangle_position: 'left',
scrollable: true,
focusable: false,
max_height: null,
direction: 'auto',
size: 'default',
no_animation: false,
no_scroll_animation: false,
prevent_selection: false,
action_menu: false,
is_popup: false,
align_drawer: 'left',
wrapper_element: null,
default_value: null,
value: 'initval',
portal_class: null,
list_class: null,
skip_portal: null,
prevent_close: false,
keep_open: false,
prevent_focus: false,
fixed_position: false,
independent_width: false,
skip_keysearch: false,
opened: null,
data: null,
prepared_data: null,
raw_data: null,
ignore_events: null,
className: null,
children: null,
on_show: null,
on_hide: null,
handle_dismiss_focus: null,
on_change: null,
on_pre_change: null,
on_resize: null,
on_select: null,
on_state_update: null,
options_render: null
};
const drawerListProviderPropTypes = exports.drawerListProviderPropTypes = {
enable_body_lock: _propTypes.default.bool,
page_offset: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]),
observer_element: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.node]),
min_height: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number])
};
const drawerListProviderDefaultProps = exports.drawerListProviderDefaultProps = {
enable_body_lock: false,
page_offset: null,
observer_element: null,
min_height: 10
};
const parseContentTitle = function (dataItem) {
var _dataItem;
let {
separator = '\n',
removeNumericOnlyValues = false,
preferSelectedValue = false
} = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
let ret = '';
const onlyNumericRegex = /[0-9.,-\s]+/;
if (Array.isArray(dataItem) && dataItem.length > 0) {
dataItem = {
content: dataItem
};
}
const hasValue = (_dataItem = dataItem) === null || _dataItem === void 0 ? void 0 : _dataItem.selected_value;
if (!(preferSelectedValue && hasValue) && dataItem && Array.isArray(dataItem.content)) {
ret = dataItem.content.reduce((acc, cur) => {
cur = (0, _componentHelper.convertJsxToString)(cur, ' ');
if (cur === false) {
return acc;
}
const found = removeNumericOnlyValues && cur && cur.match(onlyNumericRegex);
if (!(found && found[0].length === cur.length)) {
acc.push(cur);
}
return acc;
}, []).join(separator);
} else {
ret = (0, _componentHelper.convertJsxToString)(dataItem && dataItem.content || dataItem, ' ');
}
if (hasValue) {
if (preferSelectedValue) {
ret = String((0, _componentHelper.convertJsxToString)(dataItem.selected_value, separator, word => {
var _nestedChildren$props;
const nestedChildren = !word.props.children && typeof (word === null || word === void 0 ? void 0 : word.type) === 'function' && word.type();
return nestedChildren !== null && nestedChildren !== void 0 && (_nestedChildren$props = nestedChildren.props) !== null && _nestedChildren$props !== void 0 && _nestedChildren$props.children ? nestedChildren : word;
}));
} else if (!onlyNumericRegex.test(dataItem.selected_value)) {
ret = String((0, _componentHelper.convertJsxToString)()) + separator + ret;
}
}
if (Array.isArray(dataItem) && dataItem.length === 0) {
ret = null;
}
if (ret && ret.length === 1 && ret[0].ignore_events) {
return null;
}
return ret;
};
exports.parseContentTitle = parseContentTitle;
const hasObjectKeyAsValue = data => {
var _data;
data = ((_data = data) === null || _data === void 0 ? void 0 : _data.raw_data) || data;
return data && typeof data === 'object' && !Array.isArray(data);
};
exports.hasObjectKeyAsValue = hasObjectKeyAsValue;
const preSelectData = data => {
if (typeof data === 'string') {
data = data[0] === '{' || data[0] === '[' ? JSON.parse(data) : null;
} else if (data && _react.default.isValidElement(data)) {
data = [];
} else if (typeof data === 'function') {
data = data();
}
return data;
};
exports.preSelectData = preSelectData;
const normalizeData = props => {
let data = preSelectData(props.data || props.children || props);
if (data && typeof data === 'object' && !Array.isArray(data)) {
const list = [];
for (const key in data) {
list.push({
selectedKey: key,
selected_key: key,
value: key,
content: data[key],
type: 'object'
});
}
data = list;
}
return (data || []).map((item, __id) => {
var _item;
if (typeof item === 'number' || typeof item === 'string' || Array.isArray(item) || _react.default.isValidElement(item)) {
item = {
content: item,
__isTransformed: true
};
}
return typeof ((_item = item) === null || _item === void 0 ? void 0 : _item.__id) !== 'undefined' ? item : _objectSpread(_objectSpread({}, item), {}, {
__id
});
});
};
exports.normalizeData = normalizeData;
const getData = props => {
if (props.prepared_data && Array.isArray(props.prepared_data)) {
return props.prepared_data;
}
return normalizeData(props);
};
exports.getData = getData;
const getCurrentIndex = (value, data) => {
if (/[^0-9]/.test(String(value))) {
return data === null || data === void 0 ? void 0 : data.findIndex(cur => parseCurrentValue(cur) === value);
}
if (selectedKeyExists()) {
const index = data === null || data === void 0 ? void 0 : data.findIndex(cur => String(parseCurrentValue(cur)) === String(value));
if (index > -1) {
return index;
}
}
if (!isNaN(parseFloat(value))) {
return value;
}
return null;
function selectedKeyExists() {
for (let i = 0, l = data === null || data === void 0 ? void 0 : data.length; i < l; i++) {
var _data$i, _data$i2, _data$i3;
if (i > 10) {
return false;
}
if (typeof ((_data$i = data[i]) === null || _data$i === void 0 ? void 0 : _data$i.selectedKey) !== 'undefined' || typeof ((_data$i2 = data[i]) === null || _data$i2 === void 0 ? void 0 : _data$i2.selected_key) !== 'undefined' || ((_data$i3 = data[i]) === null || _data$i3 === void 0 ? void 0 : _data$i3.type) === 'object') {
return true;
}
}
}
};
exports.getCurrentIndex = getCurrentIndex;
const getSelectedItemValue = (value, state) => {
if (hasObjectKeyAsValue(state)) {
return parseCurrentValue(state.data.filter((_, i) => i === parseFloat(value))[0]);
}
return value;
};
exports.getSelectedItemValue = getSelectedItemValue;
const parseCurrentValue = current => {
if (typeof (current === null || current === void 0 ? void 0 : current.selectedKey) !== 'undefined') {
return current === null || current === void 0 ? void 0 : current.selectedKey;
}
if (typeof (current === null || current === void 0 ? void 0 : current.selected_key) !== 'undefined') {
return current === null || current === void 0 ? void 0 : current.selected_key;
}
if (typeof (current === null || current === void 0 ? void 0 : current.content) !== 'undefined') {
return current === null || current === void 0 ? void 0 : current.content;
}
return current;
};
exports.parseCurrentValue = parseCurrentValue;
const getEventData = (item_index, data) => {
data = getCurrentData(item_index, data);
if (data && data.__id) {
data = _objectSpread({}, data);
delete data.__id;
delete data.__isTransformed;
}
return data;
};
exports.getEventData = getEventData;
const getCurrentData = (item_index, data) => {
if (typeof data === 'function') {
data = normalizeData(data);
}
data = data && data.find(_ref => {
let {
__id
} = _ref;
return __id == item_index;
}) || null;
if (data && data.__isTransformed) {
return data.content;
}
return data;
};
exports.getCurrentData = getCurrentData;
const prepareStartupState = props => {
const selected_item = null;
const raw_data = preSelectData(props.raw_data || props.data || props.children);
const data = getData(props);
const opened = props.opened !== null ? (0, _componentHelper.isTrue)(props.opened) : null;
const state = {
opened,
data,
original_data: data,
raw_data,
direction: props.direction,
max_height: props.max_height,
selected_item,
active_item: selected_item,
on_hide: props.on_hide,
on_show: props.on_show,
on_change: props.on_change,
on_select: props.on_select
};
if (props.value !== null && typeof props.value !== 'undefined' && props.value !== 'initval') {
state.selected_item = state.active_item = getCurrentIndex(props.value, data);
} else if (props.default_value !== null) {
state.selected_item = state.active_item = getCurrentIndex(props.default_value, data);
state._value = props.value;
}
return state;
};
exports.prepareStartupState = prepareStartupState;
const prepareDerivedState = (props, state) => {
if (state.opened && !state.data && typeof props.data === 'function') {
state.data = getData(props);
}
if (props.data && props.data !== state._data) {
if (state._data) {
state.cache_hash = state.cache_hash + Date.now();
}
state.data = getData(props);
state.original_data = getData(props);
}
state.usePortal = props.skip_portal !== null ? !(0, _componentHelper.isTrue)(props.skip_portal) : true;
if (typeof props.wrapper_element === 'string' && typeof document !== 'undefined') {
const wrapper_element = document.querySelector(props.wrapper_element);
if (wrapper_element) {
state.wrapper_element = wrapper_element;
}
} else if (props.wrapper_element) {
state.wrapper_element = props.wrapper_element;
}
if (state.selected_item !== props.value && (state._value !== props.value || (0, _componentHelper.isTrue)(props.prevent_selection))) {
if (props.value === 'initval') {
state.selected_item = null;
} else {
state.selected_item = getCurrentIndex(props.value, state.original_data);
}
if (typeof props.on_state_update === 'function') {
(0, _componentHelper.dispatchCustomElementEvent)({
props
}, 'on_state_update', {
selected_item: state.selected_item,
value: getSelectedItemValue(state.selected_item, state),
data: getEventData(state.selected_item, state.data)
});
}
}
if (!(parseFloat(state.active_item) > -2) || state._value !== props.value) {
state.active_item = state.selected_item;
}
if (props.direction !== 'auto' && props.direction !== state.direction) {
state.direction = props.direction;
}
if (parseFloat(state.selected_item) > -1) {
state.current_title = getCurrentDataTitle(state.selected_item, state.data);
}
state._data = props.data;
state._value = props.value;
return state;
};
exports.prepareDerivedState = prepareDerivedState;
const getCurrentDataTitle = (selected_item, data) => {
const currentData = getCurrentData(selected_item, data);
return parseContentTitle(currentData, {
separator: ' ',
preferSelectedValue: true
});
};
exports.getCurrentDataTitle = getCurrentDataTitle;
const findClosest = (arr, val) => Math.max.apply(null, arr.filter(v => v <= val));
exports.findClosest = findClosest;
//# sourceMappingURL=DrawerListHelpers.js.map