common-ui-components-lib
Version:
React UI components including JsonGrid and MultiSelectDropdown
103 lines (88 loc) • 7.18 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var React = require('react');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
function styleInject(css, ref) {
if ( ref === void 0 ) ref = {};
var insertAt = ref.insertAt;
if (!css || typeof document === 'undefined') { return; }
var head = document.head || document.getElementsByTagName('head')[0];
var style = document.createElement('style');
style.type = 'text/css';
if (insertAt === 'top') {
if (head.firstChild) {
head.insertBefore(style, head.firstChild);
} else {
head.appendChild(style);
}
} else {
head.appendChild(style);
}
if (style.styleSheet) {
style.styleSheet.cssText = css;
} else {
style.appendChild(document.createTextNode(css));
}
}
var css_248z$1 = ".json-grid-container {\r\n width: 100%;\r\n overflow-x: auto;\r\n}\r\n\r\n.json-grid {\r\n width: 100%;\r\n border-collapse: collapse;\r\n border-spacing: 0;\r\n}\r\n\r\n.json-grid th,\r\n.json-grid td {\r\n padding: 8px;\r\n text-align: left;\r\n border: 1px solid #ddd;\r\n}\r\n\r\n.json-grid th {\r\n background-color: #f5f5f5;\r\n font-weight: bold;\r\n}\r\n\r\n.json-grid tr:nth-child(even) {\r\n background-color: #f9f9f9;\r\n}\r\n\r\n.json-grid tr:hover {\r\n background-color: #f5f5f5;\r\n}\r\n\r\n.json-grid-empty {\r\n padding: 20px;\r\n text-align: center;\r\n color: #666;\r\n}";
styleInject(css_248z$1);
const JsonGrid = ({ data }) => {
const dataArray = Array.isArray(data) ? data : [data];
if (dataArray.length === 0) {
return React__default["default"].createElement("div", { className: "json-grid-empty" }, "No data available");
}
const headers = [...new Set(dataArray.flatMap(obj => Object.keys(obj)))];
return (React__default["default"].createElement("div", { className: "json-grid-container" },
React__default["default"].createElement("table", { className: "json-grid" },
React__default["default"].createElement("thead", null,
React__default["default"].createElement("tr", null, headers.map((header) => (React__default["default"].createElement("th", { key: header }, header))))),
React__default["default"].createElement("tbody", null, dataArray.map((item, rowIndex) => (React__default["default"].createElement("tr", { key: rowIndex }, headers.map((header) => (React__default["default"].createElement("td", { key: `${rowIndex}-${header}` }, item[header] !== undefined && item[header] !== null
? typeof item[header] === 'object'
? JSON.stringify(item[header])
: String(item[header])
: ''))))))))));
};
var css_248z = ".multi-select-dropdown {\r\n position: relative;\r\n width: 100%;\r\n max-width: 300px;\r\n}\r\n\r\n.dropdown-header {\r\n padding: 10px;\r\n border: 1px solid #ddd;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n}\r\n\r\n.dropdown-header:hover {\r\n background-color: #f5f5f5;\r\n}\r\n\r\n.arrow {\r\n transition: transform 0.2s ease;\r\n}\r\n\r\n.arrow.open {\r\n transform: rotate(180deg);\r\n}\r\n\r\n.dropdown-list {\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n right: 0;\r\n margin: 0;\r\n padding: 0;\r\n list-style: none;\r\n border: 1px solid #ddd;\r\n border-top: none;\r\n border-radius: 0 0 4px 4px;\r\n background-color: white;\r\n max-height: 200px;\r\n overflow-y: auto;\r\n z-index: 1000;\r\n}\r\n\r\n.dropdown-list li {\r\n padding: 8px 10px;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.dropdown-list li:hover {\r\n background-color: #f5f5f5;\r\n}\r\n\r\n.dropdown-list li.selected {\r\n background-color: #e6f7ff;\r\n}\r\n\r\n.selected-items {\r\n margin-top: 10px;\r\n}\r\n\r\n.selected-items h4 {\r\n margin: 0 0 8px 0;\r\n font-size: 14px;\r\n}\r\n\r\n.selected-items ul {\r\n list-style: none;\r\n padding: 0;\r\n margin: 0;\r\n}\r\n\r\n.selected-items li {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 4px 8px;\r\n background-color: #e6f7ff;\r\n border-radius: 4px;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.selected-items button {\r\n background: none;\r\n border: none;\r\n cursor: pointer;\r\n padding: 0 4px;\r\n font-size: 16px;\r\n color: #666;\r\n}\r\n\r\n.selected-items button:hover {\r\n color: #ff4d4f;\r\n}";
styleInject(css_248z);
const MultiSelectDropdown = ({ data, onChange }) => {
const [isOpen, setIsOpen] = React.useState(false);
const [selectedItems, setSelectedItems] = React.useState([]);
const toggleDropdown = () => {
setIsOpen(!isOpen);
};
const handleItemClick = (item) => {
const isSelected = selectedItems.some(selected => selected.id === item.id);
let newSelectedItems;
if (isSelected) {
newSelectedItems = selectedItems.filter(selected => selected.id !== item.id);
}
else {
newSelectedItems = [...selectedItems, item];
}
setSelectedItems(newSelectedItems);
if (onChange) {
onChange(newSelectedItems);
}
};
return (React__default["default"].createElement("div", { className: "multi-select-dropdown" },
React__default["default"].createElement("div", { className: "dropdown-header", onClick: toggleDropdown },
selectedItems.length > 0
? `${selectedItems.length} item(s) selected`
: 'Select items',
React__default["default"].createElement("span", { className: `arrow ${isOpen ? 'open' : ''}` }, "\u25BC")),
isOpen && (React__default["default"].createElement("ul", { className: "dropdown-list" }, data.map(item => (React__default["default"].createElement("li", { key: item.id, onClick: () => handleItemClick(item), className: selectedItems.some(selected => selected.id === item.id) ? 'selected' : '' },
React__default["default"].createElement("input", { type: "checkbox", checked: selectedItems.some(selected => selected.id === item.id), readOnly: true }),
React__default["default"].createElement("span", null, item.name)))))),
selectedItems.length > 0 && (React__default["default"].createElement("div", { className: "selected-items" },
React__default["default"].createElement("h4", null, "Selected Items:"),
React__default["default"].createElement("ul", null, selectedItems.map(item => (React__default["default"].createElement("li", { key: item.id },
item.name,
React__default["default"].createElement("button", { onClick: (e) => {
e.stopPropagation();
handleItemClick(item);
} }, "\u00D7")))))))));
};
exports.JsonGrid = JsonGrid;
exports.MultiSelectDropdown = MultiSelectDropdown;
//# sourceMappingURL=index.js.map