design-system-govbr-rnp
Version:
## Padrão Digital de Governo - React Biblioteca de componentes React que implementa o [Padrão Visual digital do governo](https://www.gov.br/ds/). O objetivo da biblioteca é facilitar a implementação e promover a padronização das interfaces de sistemas do
434 lines (432 loc) • 20.9 kB
JavaScript
;
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = _interopRequireWildcard(require("react"));
var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
var _propTypes = _interopRequireDefault(require("prop-types"));
var _CheckboxGroup = _interopRequireDefault(require("../CheckBox/CheckboxGroup"));
var _Types = require("./Types");
var _UseKeyPress = require("./UseKeyPress");
var _styles = require("./styles");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
var Select = function Select(_ref) {
var width = _ref.width,
typeForSelection = _ref.typeForSelection,
label = _ref.label,
options = _ref.options,
name = _ref.name;
var _useState = (0, _react.useState)(options),
_useState2 = _slicedToArray(_useState, 2),
optionsList = _useState2[0],
setOptionsList = _useState2[1];
var _useState3 = (0, _react.useState)(""),
_useState4 = _slicedToArray(_useState3, 2),
value = _useState4[0],
setValue = _useState4[1];
var _useState5 = (0, _react.useState)(""),
_useState6 = _slicedToArray(_useState5, 2),
classNameList = _useState6[0],
setClassNameList = _useState6[1];
var _useState7 = (0, _react.useState)(""),
_useState8 = _slicedToArray(_useState7, 2),
classNameRotate = _useState8[0],
setClassNameRotate = _useState8[1];
var refList = (0, _react.useRef)();
var refSelectBox = (0, _react.useRef)();
var refIconButton = (0, _react.useRef)();
var refSelectInput = (0, _react.useRef)();
var removeDisplay = (0, _react.useCallback)(function () {
var _refList$current;
var options = (_refList$current = refList.current) === null || _refList$current === void 0 ? void 0 : _refList$current.querySelectorAll("".concat(typeForSelection === _Types.CheckBox ? "label" : "li"));
var _iterator = _createForOfIteratorHelper(options),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var option = _step.value;
if (option.style.display === "none") option.style.display = "";
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
}, [typeForSelection]);
var showList = function showList() {
setClassNameList("show");
setClassNameRotate("rotate");
};
var hiddenList = (0, _react.useCallback)(function () {
setClassNameList("");
setClassNameRotate("");
removeDisplay();
}, [removeDisplay]);
var handleValueSelect = (0, _react.useCallback)(function () {
var optionsSelected = optionsList.filter(function (option) {
return option.checked;
});
setValue(optionsSelected.length > 0 ? "".concat(optionsSelected[0].label, " + (").concat(optionsSelected.length - 1, ")") : refSelectInput.current.value = "");
}, [optionsList]);
var handleSelect = (0, _react.useCallback)(function (e) {
var currentInput;
var currentInputIndex;
var newOptions = _toConsumableArray(options);
var _options$filter = options.filter(function (item) {
return item.id === e.id;
});
var _options$filter2 = _slicedToArray(_options$filter, 1);
currentInput = _options$filter2[0];
currentInput.checked = !currentInput.checked;
currentInputIndex = options.map(function (option) {
return option.id;
}).indexOf(e === null || e === void 0 ? void 0 : e.id);
newOptions[currentInputIndex] = currentInput;
setOptionsList(newOptions);
handleValueSelect();
}, [handleValueSelect, options]);
var handleSelectAll = (0, _react.useCallback)(function (event) {
if (event.checked) {
setOptionsList(optionsList.map(function (option) {
option.checked = true;
return option;
}));
} else {
setOptionsList(optionsList.map(function (option) {
option.checked = false;
return option;
}));
}
handleValueSelect();
}, [handleValueSelect, optionsList]);
var handleChangeBackgroundOption = (0, _react.useCallback)(function (e, selectAll) {
handleValueSelect();
if (e.checked) {
e.labels[0].classList.add("checked");
} else {
e.labels[0].classList.remove("checked");
}
if (selectAll && e.checked) {
var _refList$current2;
var _options = (_refList$current2 = refList.current) === null || _refList$current2 === void 0 ? void 0 : _refList$current2.querySelectorAll("label");
var _iterator2 = _createForOfIteratorHelper(_options),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var option = _step2.value;
option.classList.add("checked");
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
}
if (selectAll && !e.checked) {
var _refList$current3;
var _options2 = (_refList$current3 = refList.current) === null || _refList$current3 === void 0 ? void 0 : _refList$current3.querySelectorAll("label");
var _iterator3 = _createForOfIteratorHelper(_options2),
_step3;
try {
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
var _option = _step3.value;
_option.classList.remove("checked");
}
} catch (err) {
_iterator3.e(err);
} finally {
_iterator3.f();
}
}
}, [handleValueSelect]);
var handleOnClickButtonArrow = function handleOnClickButtonArrow() {
var _refList$current4;
if (!((_refList$current4 = refList.current) !== null && _refList$current4 !== void 0 && _refList$current4.classList.contains("show"))) {
showList();
} else {
hiddenList();
}
};
var handlerOpenAndFocus = (0, _react.useCallback)(function (e) {
// Abre a lista com arrowDown e da focus para primeira opção
if (e.key === "ArrowDown") {
var _refList$current5, _optionsVisible$;
var Options = (_refList$current5 = refList.current) === null || _refList$current5 === void 0 ? void 0 : _refList$current5.querySelectorAll("".concat(typeForSelection === _Types.CheckBox ? "label" : "li"));
var _iterator4 = _createForOfIteratorHelper(Options),
_step4;
try {
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
var option = _step4.value;
option.tabIndex = "0";
}
} catch (err) {
_iterator4.e(err);
} finally {
_iterator4.f();
}
showList();
var optionsVisible = [];
var _iterator5 = _createForOfIteratorHelper(Options),
_step5;
try {
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
var _option2 = _step5.value;
if (_option2.style.display === "") optionsVisible.push(_option2);
}
} catch (err) {
_iterator5.e(err);
} finally {
_iterator5.f();
}
(_optionsVisible$ = optionsVisible[0]) === null || _optionsVisible$ === void 0 ? void 0 : _optionsVisible$.focus();
e.preventDefault();
}
}, [typeForSelection]);
var handlerInputShowList = (0, _react.useCallback)(function (e) {
// Abre a lista com qualquer valor inserido no input
if (e.key !== "Shift" && e.key !== "Escape" && e.key !== "Enter" && e.key !== "Tab") {
showList();
}
if (e.key === "Enter" && e.srcElement === (refSelectInput === null || refSelectInput === void 0 ? void 0 : refSelectInput.current)) {
showList();
}
handlerOpenAndFocus(e);
}, [handlerOpenAndFocus]);
var handler = (0, _react.useCallback)(function (e) {
// Fecha lista ao apertar "Esc"
if (e.key === "Escape" && e.key !== "Enter") {
var _refSelectInput$curre;
hiddenList();
(_refSelectInput$curre = refSelectInput.current) === null || _refSelectInput$curre === void 0 ? void 0 : _refSelectInput$curre.focus();
}
}, [hiddenList]);
var hiddenListEvent = (0, _react.useCallback)(function (e) {
var _refSelectBox$current;
// Fecha lista ao clicar fora
if (!((_refSelectBox$current = refSelectBox.current) !== null && _refSelectBox$current !== void 0 && _refSelectBox$current.contains(e.srcElement))) {
hiddenList();
}
}, [hiddenList]);
var handlerMoveOption = (0, _react.useCallback)(function (e) {
var _refList$current6;
// Permite a movimentação entre as opções com arrow keys
var nextItem;
var previousItem;
var includeInOptions = false;
var optionVisible = [];
var Options = (_refList$current6 = refList.current) === null || _refList$current6 === void 0 ? void 0 : _refList$current6.querySelectorAll("".concat(typeForSelection === _Types.CheckBox ? "label" : "li"));
var _iterator6 = _createForOfIteratorHelper(options),
_step6;
try {
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
var option = _step6.value;
option.tabIndex = "0";
}
} catch (err) {
_iterator6.e(err);
} finally {
_iterator6.f();
}
var _iterator7 = _createForOfIteratorHelper(Options),
_step7;
try {
for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
var _option3 = _step7.value;
if ((_option3 === null || _option3 === void 0 ? void 0 : _option3.style.display) !== "none") {
optionVisible.push(_option3);
}
if (_option3 === e.srcElement) includeInOptions = true;
}
} catch (err) {
_iterator7.e(err);
} finally {
_iterator7.f();
}
for (var i = 0; i < optionVisible.length; i++) {
if (optionVisible[i] === e.srcElement) {
nextItem = optionVisible[i + 1];
previousItem = optionVisible[i - 1];
}
}
if (e.key === "Tab" && refList !== null && refList !== void 0 && refList.current.contains(e.srcElement)) {
e.preventDefault();
}
if (e.key === "ArrowDown" && includeInOptions) {
var _nextItem;
(_nextItem = nextItem) === null || _nextItem === void 0 ? void 0 : _nextItem.focus();
}
if (e.key === "ArrowUp" && includeInOptions) {
var _previousItem;
(_previousItem = previousItem) === null || _previousItem === void 0 ? void 0 : _previousItem.focus();
}
var input = e.srcElement.querySelector("input");
var label = e.srcElement.querySelector("label");
if (e.srcElement !== refIconButton.current) {
// Select
if (e.key === "Enter" && input !== null && input !== void 0 && input.id.match(/option/)) {
if (typeForSelection === _Types.CheckBox) {
handleSelect(input);
handleChangeBackgroundOption(input);
} else {
input.checked = true;
removeDisplay();
setValue(label.innerText);
}
}
// Select all
if (e.key === "Enter" && !(input !== null && input !== void 0 && input.id.match(/option/))) {
var checked = e.srcElement.querySelector("input").checked;
e.srcElement.querySelector("input").checked = !checked;
handleSelectAll(input);
removeDisplay();
handleChangeBackgroundOption(input, true);
}
}
}, [handleChangeBackgroundOption, handleSelect, handleSelectAll, options, removeDisplay, typeForSelection]);
(0, _UseKeyPress.useKeyPress)("click", hiddenListEvent);
(0, _UseKeyPress.useKeyPress)("keydown", handler, refSelectBox === null || refSelectBox === void 0 ? void 0 : refSelectBox.current);
(0, _UseKeyPress.useKeyPress)("keydown", handlerInputShowList, refSelectInput === null || refSelectInput === void 0 ? void 0 : refSelectInput.current);
(0, _UseKeyPress.useKeyPress)("keydown", handlerMoveOption, refList === null || refList === void 0 ? void 0 : refList.current);
(0, _UseKeyPress.useKeyPress)("keydown", handlerOpenAndFocus, refIconButton === null || refIconButton === void 0 ? void 0 : refIconButton.current);
(0, _react.useEffect)(function () {
setValue("");
if (typeForSelection === _Types.Radio) {
var _iterator8 = _createForOfIteratorHelper(options),
_step8;
try {
for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
var option = _step8.value;
if (option.checked) {
setValue(option.label);
}
}
} catch (err) {
_iterator8.e(err);
} finally {
_iterator8.f();
}
}
}, [options, typeForSelection]);
var filterFunction = function filterFunction(e) {
var _refList$current7;
setValue(e.target.value);
var filter = e.target.value.toUpperCase();
var options = (_refList$current7 = refList.current) === null || _refList$current7 === void 0 ? void 0 : _refList$current7.querySelectorAll("".concat(typeForSelection === _Types.CheckBox ? "label" : "li"));
for (var i = 0; i < options.length; i++) {
var txtValue = options[i].textContent || options[i].innerText;
if (txtValue.toUpperCase().indexOf(filter) > -1) {
options[i].style.display = "";
} else {
options[i].style.display = "none";
}
}
};
var renderSelect = function renderSelect(options) {
return /*#__PURE__*/_react.default.createElement(_styles.Container, {
width: width
}, /*#__PURE__*/_react.default.createElement("label", {
htmlFor: "select"
}, label), /*#__PURE__*/_react.default.createElement(_styles.SelectBox, {
ref: refSelectBox,
id: "inpBox"
}, /*#__PURE__*/_react.default.createElement("input", {
ref: refSelectInput,
autoComplete: "off",
id: "select",
onChange: function onChange(e) {
filterFunction(e);
},
onClick: function onClick() {
showList();
},
type: "text",
placeholder: typeForSelection === _Types.CheckBox ? "Selecione os itens" : "Selecione o item",
value: value
}), /*#__PURE__*/_react.default.createElement(_styles.ButtonIcon, {
ref: refIconButton,
className: classNameRotate,
id: "button",
title: "buttonArrow",
onClick: function onClick() {
return handleOnClickButtonArrow();
}
}, /*#__PURE__*/_react.default.createElement(_styles.SelectIcon, {
id: "svg",
icon: _freeSolidSvgIcons.faAngleDown
})), /*#__PURE__*/_react.default.createElement(_styles.List, {
tabIndex: "0",
ref: refList,
className: "".concat(classNameList),
id: "list",
maxHeight: "250px"
}, typeForSelection === "radio" ? renderListRadio(options, name) : renderListCheckbox(options, name))));
};
var renderListRadio = function renderListRadio(options, name) {
return /*#__PURE__*/_react.default.createElement("ul", null, options.map(function (option) {
return /*#__PURE__*/_react.default.createElement("li", {
key: option.id
}, /*#__PURE__*/_react.default.createElement("input", {
value: option.value,
type: _Types.Radio,
id: option.id,
checked: option.checked,
onClick: function onClick(event) {
if (event.target.checked) {
setValue(option.label);
removeDisplay();
}
},
onChange: function onChange(event) {
if (event.target.checked) {
setValue(option.label);
removeDisplay();
}
},
name: name
}), /*#__PURE__*/_react.default.createElement("label", {
className: "option",
htmlFor: option.id
}, option.label));
}));
};
var renderListCheckbox = function renderListCheckbox(options) {
return /*#__PURE__*/_react.default.createElement(_CheckboxGroup.default, {
selectAllOptions: {
label: "Selecionar Tudo",
onChange: function onChange(event) {
handleChangeBackgroundOption(event.target, true);
removeDisplay();
}
},
onChange: function onChange(e) {
handleValueSelect();
handleChangeBackgroundOption(e.target);
removeDisplay();
},
options: options
});
};
return renderSelect(optionsList);
};
Select.propTypes = {
typeForSelection: _propTypes.default.string,
label: _propTypes.default.string,
options: _propTypes.default.array,
name: _propTypes.default.string.isRequired
};
var _default = Select;
exports.default = _default;