Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F100888130
defaultListboxReducer.js
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Mon, Feb 3, 15:40
Size
8 KB
Mime Type
text/x-java
Expires
Wed, Feb 5, 15:40 (1 d, 21 h)
Engine
blob
Format
Raw Data
Handle
24049705
Attached To
rOACCT Open Access Compliance Check Tool (OACCT)
defaultListboxReducer.js
View Options
import _extends from "@babel/runtime/helpers/esm/extends";
import { ActionTypes } from './useListbox.types';
const pageSize = 5;
function findValidOptionToHighlight(index, lookupDirection, options, focusDisabled, isOptionDisabled, wrapAround) {
if (options.length === 0 || options.every((o, i) => isOptionDisabled(o, i))) {
return -1;
}
let nextFocus = index;
for (;;) {
// No valid options found
if (!wrapAround && lookupDirection === 'next' && nextFocus === options.length || !wrapAround && lookupDirection === 'previous' && nextFocus === -1) {
return -1;
}
const nextFocusDisabled = focusDisabled ? false : isOptionDisabled(options[nextFocus], nextFocus);
if (nextFocusDisabled) {
nextFocus += lookupDirection === 'next' ? 1 : -1;
if (wrapAround) {
nextFocus = (nextFocus + options.length) % options.length;
}
} else {
return nextFocus;
}
}
}
function getNewHighlightedOption(options, previouslyHighlightedOption, diff, lookupDirection, highlightDisabled, isOptionDisabled, wrapAround, optionComparer) {
var _options$nextIndex;
const maxIndex = options.length - 1;
const defaultHighlightedIndex = -1;
let nextIndexCandidate;
const previouslyHighlightedIndex = previouslyHighlightedOption == null ? -1 : options.findIndex(option => optionComparer(option, previouslyHighlightedOption));
if (diff === 'reset') {
var _options$defaultHighl;
return defaultHighlightedIndex === -1 ? null : (_options$defaultHighl = options[defaultHighlightedIndex]) != null ? _options$defaultHighl : null;
}
if (diff === 'start') {
nextIndexCandidate = 0;
} else if (diff === 'end') {
nextIndexCandidate = maxIndex;
} else {
const newIndex = previouslyHighlightedIndex + diff;
if (newIndex < 0) {
if (!wrapAround && previouslyHighlightedIndex !== -1 || Math.abs(diff) > 1) {
nextIndexCandidate = 0;
} else {
nextIndexCandidate = maxIndex;
}
} else if (newIndex > maxIndex) {
if (!wrapAround || Math.abs(diff) > 1) {
nextIndexCandidate = maxIndex;
} else {
nextIndexCandidate = 0;
}
} else {
nextIndexCandidate = newIndex;
}
}
const nextIndex = findValidOptionToHighlight(nextIndexCandidate, lookupDirection, options, highlightDisabled, isOptionDisabled, wrapAround);
return (_options$nextIndex = options[nextIndex]) != null ? _options$nextIndex : null;
}
function handleOptionSelection(option, state, props) {
const {
multiple,
optionComparer = (o, v) => o === v,
isOptionDisabled = () => false
} = props;
const {
selectedValue
} = state;
const optionIndex = props.options.findIndex(o => props.optionComparer(option, o));
if (isOptionDisabled(option, optionIndex)) {
return state;
}
if (multiple) {
var _ref, _ref2;
const selectedValues = (_ref = selectedValue) != null ? _ref : [];
// if the option is already selected, remove it from the selection, otherwise add it
const newSelectedValues = selectedValues.some(sv => optionComparer(sv, option)) ? selectedValue.filter(v => !optionComparer(v, option)) : [...((_ref2 = selectedValue) != null ? _ref2 : []), option];
return {
selectedValue: newSelectedValues,
highlightedValue: option
};
}
if (selectedValue != null && optionComparer(option, selectedValue)) {
return state;
}
return {
selectedValue: option,
highlightedValue: option
};
}
function handleKeyDown(event, state, props) {
const {
options,
isOptionDisabled,
disableListWrap,
disabledItemsFocusable,
optionComparer
} = props;
const moveHighlight = (diff, direction, wrapAround) => {
return getNewHighlightedOption(options, state.highlightedValue, diff, direction, disabledItemsFocusable != null ? disabledItemsFocusable : false, isOptionDisabled != null ? isOptionDisabled : () => false, wrapAround, optionComparer);
};
switch (event.key) {
case 'Home':
return _extends({}, state, {
highlightedValue: moveHighlight('start', 'next', false)
});
case 'End':
return _extends({}, state, {
highlightedValue: moveHighlight('end', 'previous', false)
});
case 'PageUp':
return _extends({}, state, {
highlightedValue: moveHighlight(-pageSize, 'previous', false)
});
case 'PageDown':
return _extends({}, state, {
highlightedValue: moveHighlight(pageSize, 'next', false)
});
case 'ArrowUp':
// TODO: extend current selection with Shift modifier
return _extends({}, state, {
highlightedValue: moveHighlight(-1, 'previous', !(disableListWrap != null ? disableListWrap : false))
});
case 'ArrowDown':
// TODO: extend current selection with Shift modifier
return _extends({}, state, {
highlightedValue: moveHighlight(1, 'next', !(disableListWrap != null ? disableListWrap : false))
});
case 'Enter':
case ' ':
if (state.highlightedValue === null) {
return state;
}
return handleOptionSelection(state.highlightedValue, state, props);
default:
break;
}
return state;
}
function handleBlur(state) {
return _extends({}, state, {
highlightedValue: null
});
}
const textCriteriaMatches = (nextFocus, searchString, stringifyOption) => {
var _stringifyOption;
const text = (_stringifyOption = stringifyOption(nextFocus)) == null ? void 0 : _stringifyOption.trim().toLowerCase();
if (!text || text.length === 0) {
// Make option not navigable if stringification fails or results in empty string.
return false;
}
return text.indexOf(searchString) === 0;
};
function handleTextNavigation(state, searchString, props) {
const {
options,
isOptionDisabled,
disableListWrap,
disabledItemsFocusable,
optionComparer,
optionStringifier
} = props;
const moveHighlight = previouslyHighlightedOption => {
return getNewHighlightedOption(options, previouslyHighlightedOption, 1, 'next', disabledItemsFocusable != null ? disabledItemsFocusable : false, isOptionDisabled != null ? isOptionDisabled : () => false, !(disableListWrap != null ? disableListWrap : false), optionComparer);
};
const startWithCurrentOption = searchString.length > 1;
let nextOption = startWithCurrentOption ? state.highlightedValue : moveHighlight(state.highlightedValue);
// use `for` instead of `while` prevent infinite loop
for (let index = 0; index < options.length; index += 1) {
// Return un-mutated state if looped back to the currently highlighted value
if (!nextOption || !startWithCurrentOption && state.highlightedValue === nextOption) {
return state;
}
if (textCriteriaMatches(nextOption, searchString, optionStringifier) && (!isOptionDisabled(nextOption, options.indexOf(nextOption)) || disabledItemsFocusable)) {
// The nextOption is the element to be highlighted
return _extends({}, state, {
highlightedValue: nextOption
});
}
// Move to the next element.
nextOption = moveHighlight(nextOption);
}
// No option match text search criteria
return state;
}
function handleOptionsChange(options, previousOptions, state, props) {
var _options$find, _options$find2;
const {
multiple,
optionComparer
} = props;
const newHighlightedOption = state.highlightedValue == null ? null : (_options$find = options.find(option => optionComparer(option, state.highlightedValue))) != null ? _options$find : null;
if (multiple) {
var _ref3;
// exclude selected values that are no longer in the options
const selectedValues = (_ref3 = state.selectedValue) != null ? _ref3 : [];
const newSelectedValues = selectedValues.filter(selectedValue => options.some(option => optionComparer(option, selectedValue)));
return {
highlightedValue: newHighlightedOption,
selectedValue: newSelectedValues
};
}
const newSelectedValue = (_options$find2 = options.find(option => optionComparer(option, state.selectedValue))) != null ? _options$find2 : null;
return {
highlightedValue: newHighlightedOption,
selectedValue: newSelectedValue
};
}
export default function defaultListboxReducer(state, action) {
const {
type
} = action;
switch (type) {
case ActionTypes.keyDown:
return handleKeyDown(action.event, state, action.props);
case ActionTypes.optionClick:
return handleOptionSelection(action.option, state, action.props);
case ActionTypes.blur:
return handleBlur(state);
case ActionTypes.setValue:
return _extends({}, state, {
selectedValue: action.value
});
case ActionTypes.setHighlight:
return _extends({}, state, {
highlightedValue: action.highlight
});
case ActionTypes.textNavigation:
return handleTextNavigation(state, action.searchString, action.props);
case ActionTypes.optionsChange:
return handleOptionsChange(action.options, action.previousOptions, state, action.props);
default:
return state;
}
}
Event Timeline
Log In to Comment