src/components/controls/InputSelect/utils.js
import { findIndex, isEmpty } from 'lodash';
export const inArray = (array = [], item = {}) => {
return array.some(arrayItem => arrayItem.id === item.id);
};
export const groupData = (data, groupFieldId) =>
data.reduce((r, a) => {
r[a[groupFieldId]] = r[a[groupFieldId]] || [];
r[a[groupFieldId]].push(a);
return r;
}, {});
export const isDisabled = (item, selected, disabled) =>
inArray(disabled, item) || inArray(selected, item);
const getNextNotDisabledId = (
data,
selected,
disabled,
initialId,
distance,
valueFieldId
) => {
let index = findIndex(data, item => item[valueFieldId] === initialId);
while (
data[index + distance] &&
isDisabled(data[index + distance], selected, disabled)
) {
index += distance;
}
if (!data[index + distance]) return initialId;
return data[index + distance][valueFieldId];
};
const getIdByDistance = (
data,
currentId,
distance,
valueFieldId,
selected,
disabled
) => {
if (isEmpty(data)) return;
const id = currentId ? currentId : data[0][valueFieldId];
return getNextNotDisabledId(
data,
selected,
disabled,
id,
distance,
valueFieldId
);
};
export const getFirstNotDisabledId = (
data,
selected,
disabled,
valueFieldId
) => {
if (isEmpty(data)) return;
if (!isDisabled(data[0], selected, disabled)) return data[0][valueFieldId];
return getNextNotDisabledId(
data,
selected,
disabled,
data[0][valueFieldId],
1,
valueFieldId
);
};
export const getNextId = (data, currentId, valueFieldId, selected, disabled) =>
getIdByDistance(data, currentId, 1, valueFieldId, selected, disabled);
export const getPrevId = (data, currentId, valueFieldId, selected, disabled) =>
getIdByDistance(data, currentId, -1, valueFieldId, selected, disabled);