diff --git a/SQL/0000-00-06-BiobankTables.sql b/SQL/0000-00-06-BiobankTables.sql index b7cd3b8bf25..c75bf6f4cb5 100644 --- a/SQL/0000-00-06-BiobankTables.sql +++ b/SQL/0000-00-06-BiobankTables.sql @@ -182,7 +182,9 @@ CREATE TABLE `biobank_specimen_protocol_attribute_rel` ( `SpecimenAttributeID` int(10) unsigned NOT NULL, `Required` tinyint(1) DEFAULT NULL, `showInDataTable` tinyint(1) DEFAULT NULL, + `OrderIndex` INT UNSIGNED NOT NULL, PRIMARY KEY (`SpecimenProtocolID`,`SpecimenAttributeID`), + UNIQUE KEY `UK_SpecimenProtocolId_OrderIndex` (`SpecimenProtocolID`, `OrderIndex`), KEY `FK_biobank_specimen_protocol_attribute_rel_SpecimenAttributeID` (`SpecimenAttributeID`), CONSTRAINT `FK_biobank_specimen_protocol_attribute__rel_SpecimenProtocolID` FOREIGN KEY (`SpecimenProtocolID`) REFERENCES `biobank_specimen_protocol` (`SpecimenProtocolID`), CONSTRAINT `FK_biobank_specimen_protocol_attribute_rel_SpecimenAttributeID` FOREIGN KEY (`SpecimenAttributeID`) REFERENCES `biobank_specimen_attribute` (`SpecimenAttributeID`) diff --git a/SQL/New_patches/2025-10-29_add-order-index-to-specimen-protocols.sql b/SQL/New_patches/2025-10-29_add-order-index-to-specimen-protocols.sql new file mode 100644 index 00000000000..29f1ecd91c3 --- /dev/null +++ b/SQL/New_patches/2025-10-29_add-order-index-to-specimen-protocols.sql @@ -0,0 +1,41 @@ +-- Step 1: Add the column allowing NULL (temporarily) +-- This allows the operation to succeed on a table that already has existing rows. +ALTER TABLE biobank_specimen_protocol_attribute_rel +ADD COLUMN OrderIndex INT UNSIGNED NULL; + +-- Step 2: Populate the existing rows with unique, non-NULL OrderIndex values. +-- This uses a variable-based method to assign a sequential number (0, 1, 2, ...) +-- to each row within the same SpecimenProtocolID group. + +SET @r := -1; +SET @g := 0; + +-- A temporary table/derived table is used to calculate the unique index for each group +UPDATE biobank_specimen_protocol_attribute_rel AS t1 +INNER JOIN ( + SELECT + t2.SpecimenProtocolID, + t2.SpecimenAttributeID, + @r := CASE WHEN @g = t2.SpecimenProtocolID THEN @r + 1 ELSE 0 END AS new_OrderIndex, + @g := t2.SpecimenProtocolID AS current_group + FROM + biobank_specimen_protocol_attribute_rel AS t2 + ORDER BY + t2.SpecimenProtocolID, t2.SpecimenAttributeID + +) AS ranked_data +ON t1.SpecimenProtocolID = ranked_data.SpecimenProtocolID +AND t1.SpecimenAttributeID = ranked_data.SpecimenAttributeID +SET t1.OrderIndex = ranked_data.new_OrderIndex; + +-- Step 3: Enforce the constraints (NOT NULL and UNIQUE). +-- Now that every row has a valid, unique value, these operations will succeed. + +-- 3a. Add the UNIQUE Constraint +ALTER TABLE biobank_specimen_protocol_attribute_rel +ADD CONSTRAINT UK_SpecimenProtocolId_OrderIndex +UNIQUE (SpecimenProtocolID, OrderIndex); + +-- 3b. Change the Column to NOT NULL +ALTER TABLE biobank_specimen_protocol_attribute_rel +MODIFY COLUMN OrderIndex INT UNSIGNED NOT NULL; diff --git a/modules/biobank/js/biobankIndex.js b/modules/biobank/js/biobankIndex.js new file mode 100644 index 00000000000..b726ab663bd --- /dev/null +++ b/modules/biobank/js/biobankIndex.js @@ -0,0 +1,25151 @@ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "./jsx/DataTable.js": +/*!**************************!*\ + !*** ./jsx/DataTable.js ***! + \**************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); +var _typeof3 = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"); +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; +var _typeof2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js")); +var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js")); +var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js")); +var _assertThisInitialized2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "./node_modules/@babel/runtime/helpers/assertThisInitialized.js")); +var _inherits2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/inherits.js")); +var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js")); +var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js")); +var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); +var _propTypes = _interopRequireDefault(__webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js")); +var _PaginationLinks = _interopRequireDefault(__webpack_require__(/*! jsx/PaginationLinks */ "./jsx/PaginationLinks.js")); +var _reactAddonsCreateFragment = _interopRequireDefault(__webpack_require__(/*! react-addons-create-fragment */ "./node_modules/react-addons-create-fragment/index.js")); +var _Form = __webpack_require__(/*! jsx/Form */ "./jsx/Form.js"); +var _reactI18next = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) { if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } } return n["default"] = e, t && t.set(e, n), n; } +function _createSuper(t) { var r = _isNativeReflectConstruct(); return function () { var e, o = (0, _getPrototypeOf2["default"])(t); if (r) { var s = (0, _getPrototypeOf2["default"])(this).constructor; e = Reflect.construct(o, arguments, s); } else e = o.apply(this, arguments); return (0, _possibleConstructorReturn2["default"])(this, e); }; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +/** + * Data Table component + * Displays a set of data that is receives via props. + */ +var DataTable = /*#__PURE__*/function (_Component) { + (0, _inherits2["default"])(DataTable, _Component); + var _super = _createSuper(DataTable); + /** + * @constructor + * @param {object} props - React Component properties + */ + function DataTable(props) { + var _this; + (0, _classCallCheck2["default"])(this, DataTable); + _this = _super.call(this, props); + _this.state = { + page: { + number: 1, + rows: 20 + }, + sort: { + column: -1, + ascending: true + } + }; + _this.changePage = _this.changePage.bind((0, _assertThisInitialized2["default"])(_this)); + _this.setSortColumn = _this.setSortColumn.bind((0, _assertThisInitialized2["default"])(_this)); + _this.updateSortColumn = _this.updateSortColumn.bind((0, _assertThisInitialized2["default"])(_this)); + _this.toggleSortOrder = _this.toggleSortOrder.bind((0, _assertThisInitialized2["default"])(_this)); + _this.updatePageNumber = _this.updatePageNumber.bind((0, _assertThisInitialized2["default"])(_this)); + _this.updatePageRows = _this.updatePageRows.bind((0, _assertThisInitialized2["default"])(_this)); + _this.downloadCSV = _this.downloadCSV.bind((0, _assertThisInitialized2["default"])(_this)); + _this.getFilteredRowIndexes = _this.getFilteredRowIndexes.bind((0, _assertThisInitialized2["default"])(_this)); + _this.sortRows = _this.sortRows.bind((0, _assertThisInitialized2["default"])(_this)); + _this.hasFilterKeyword = _this.hasFilterKeyword.bind((0, _assertThisInitialized2["default"])(_this)); + _this.renderActions = _this.renderActions.bind((0, _assertThisInitialized2["default"])(_this)); + return _this; + } + + /** + * Set the component page variable + * to a new value + * + * @param {number} i - Page index + */ + (0, _createClass2["default"])(DataTable, [{ + key: "changePage", + value: function changePage(i) { + var page = this.state.page; + page.number = i; + this.setState({ + page: page + }); + } + + /** + * Update the sort column + * If component sort.column is already set to column + * Toggle sort.ascending + * + * @param {number} column - The column index + */ + }, { + key: "setSortColumn", + value: function setSortColumn(column) { + if (this.state.sort.column === column) { + this.toggleSortOrder(); + } else { + this.updateSortColumn(column); + } + } + + /** + * Update the sort column + * + * @param {number} column - The column index + */ + }, { + key: "updateSortColumn", + value: function updateSortColumn(column) { + var sort = this.state.sort; + sort.column = column; + this.setState({ + sort: sort + }); + } + + /** + * Toggle sort.ascending + */ + }, { + key: "toggleSortOrder", + value: function toggleSortOrder() { + var sort = this.state.sort; + sort.ascending = !sort.ascending; + this.setState({ + sort: sort + }); + } + + /** + * Updates page state + * + * @param {number} number - Number of page + */ + }, { + key: "updatePageNumber", + value: function updatePageNumber(number) { + var page = this.state.page; + page.number = number; + this.setState({ + page: page + }); + } + + /** + * Update number of rows per page + * + * @param {object} e - Event from which to abstract value + */ + }, { + key: "updatePageRows", + value: function updatePageRows(e) { + var page = Object.assign({}, this.state.page); + page.rows = e.target.value; + page.number = 1; + this.setState({ + page: page + }); + } + + /** + * Export the filtered rows and columns into a csv + * + * @param {number[]} filteredRowIndexes - The filtered Row Indexes + */ + }, { + key: "downloadCSV", + value: function downloadCSV(filteredRowIndexes) { + var _this2 = this; + var csvData = filteredRowIndexes.map(function (id) { + return _this2.props.data[id]; + }); + // Map cell data to proper values if applicable. + if (this.props.getMappedCell) { + csvData = csvData.map(function (row, i) { + return _this2.props.fields.flatMap(function (field, j) { + return _this2.props.getMappedCell(field.label, row[j], row, _this2.props.fields.map(function (val) { + return val.label; + }), j); + }); + }); + } + var csvworker = new Worker(loris.BaseURL + '/js/workers/savecsv.js'); + csvworker.addEventListener('message', function (e) { + var dataURL; + var dataDate; + var link; + if (e.data.cmd === 'SaveCSV') { + dataDate = new Date().toISOString(); + dataURL = window.URL.createObjectURL(e.data.message); + link = document.createElement('a'); + link.download = 'data-' + dataDate + '.csv'; + link.type = 'text/csv'; + link.href = dataURL; + document.body.appendChild(link); + $(link)[0].click(); + document.body.removeChild(link); + } + }); + var headerList = this.props.fields.map(function (field) { + return field.label; + }); + csvworker.postMessage({ + cmd: 'SaveFile', + data: csvData, + headers: headerList, + identifiers: this.props.RowNameMap + }); + } + + /** + * Get the Filtered Row Indexes + */ + }, { + key: "getFilteredRowIndexes", + value: function getFilteredRowIndexes() { + var useKeyword = false; + var filterValuesCount = Object.keys(this.props.filters).length; + var tableData = this.props.data; + var fieldData = this.props.fields; + var filteredIndexes = []; + + // If there are no filters set, use all the data. + var hasFilters = filterValuesCount !== 0; + if (hasFilters === false) { + for (var i = 0; i < tableData.length; i++) { + filteredIndexes.push(i); + } + return filteredIndexes; + } + if (this.props.filters.keyword) { + useKeyword = true; + } + if (useKeyword) { + filterValuesCount -= 1; + } + for (var _i = 0; _i < tableData.length; _i++) { + var headerCount = 0; + var keywordMatch = 0; + for (var j = 0; j < fieldData.length; j++) { + var data = tableData[_i] ? tableData[_i][j] : null; + if (this.hasFilterKeyword((fieldData[j].filter || {}).name, data)) { + headerCount++; + } + if (useKeyword) { + if (this.hasFilterKeyword('keyword', data)) { + keywordMatch++; + } + } + } + if (headerCount === filterValuesCount && (useKeyword === true && keywordMatch > 0 || useKeyword === false && keywordMatch === 0)) { + filteredIndexes.push(_i); + } + } + return filteredIndexes; + } + + /** + * Sort the given rows according to the sort configuration + * + * @param {number[]} rowIndexes - The row indexes + * @return {object[]} + */ + }, { + key: "sortRows", + value: function sortRows(rowIndexes) { + var _this3 = this; + var index = []; + for (var i = 0; i < rowIndexes.length; i++) { + var idx = rowIndexes[i]; + var val = this.props.data[idx][this.state.sort.column] || undefined; + + // If sortColumn is equal to default No. column, set value to be + // index + 1 + if (this.state.sort.column === -1) { + val = idx + 1; + } + var isString = typeof val === 'string' || val instanceof String; + var isNumber = !isNaN(val) && (0, _typeof2["default"])(val) !== 'object'; + if (val === '.') { + // hack to handle non-existent items in DQT + val = null; + } else if (isNumber) { + // perform type conversion (from string to int/float) + val = Number(val); + } else if (isString) { + // if string with text convert to lowercase + val = val.toLowerCase(); + } else if (Array.isArray(val)) { + val = val.join(', '); + } else { + val = undefined; + } + if (this.props.RowNameMap) { + index.push({ + RowIdx: idx, + Value: val, + Content: this.props.RowNameMap[idx] + }); + } else { + index.push({ + RowIdx: idx, + Value: val, + Content: idx + 1 + }); + } + } + index.sort(function (a, b) { + if (_this3.state.sort.ascending) { + if (a.Value === b.Value) { + // If all values are equal, sort by rownum + if (a.RowIdx < b.RowIdx) return -1; + if (a.RowIdx > b.RowIdx) return 1; + } + // Check if null values + if (a.Value === null || typeof a.Value === 'undefined') return -1; + if (b.Value === null || typeof b.Value === 'undefined') return 1; + + // Sort by value + if (a.Value < b.Value) return -1; + if (a.Value > b.Value) return 1; + } else { + if (a.Value === b.Value) { + // If all values are equal, sort by rownum + if (a.RowIdx < b.RowIdx) return 1; + if (a.RowIdx > b.RowIdx) return -1; + } + // Check if null values + if (a.Value === null || typeof a.Value === 'undefined') return 1; + if (b.Value === null || typeof b.Value === 'undefined') return -1; + + // Sort by value + if (a.Value < b.Value) return 1; + if (a.Value > b.Value) return -1; + } + // They're equal.. + return 0; + }); + return index; + } + + /** + * Searches for the filter keyword in the column cell + * + * Note: Search is case-insensitive. + * + * @param {string} name field name + * @param {string} data search string + * @return {boolean} true, if filter value is found to be a substring + * of one of the column values, false otherwise. + */ + }, { + key: "hasFilterKeyword", + value: function hasFilterKeyword(name, data) { + var filterData = null; + var exactMatch = false; + var opposite = false; + var result = false; + var searchKey = null; + var searchString = null; + if (this.props.filters[name]) { + filterData = this.props.filters[name].value; + exactMatch = this.props.filters[name].exactMatch; + opposite = this.props.filters[name].opposite; + } + + // Handle null inputs + if (filterData === null || data === null) { + return false; + } + + // Handle numeric inputs + if (typeof filterData === 'number') { + var intData = Number.parseInt(data, 10); + result = filterData === intData; + } + + // Handle string inputs + if (typeof filterData === 'string') { + searchKey = filterData.toLowerCase(); + switch ((0, _typeof2["default"])(data)) { + case 'object': + // Handles the case where the data is an array (typeof 'object') + // and you want to search through it for + // the string you are filtering by + var searchArray = data.map(function (e) { + return e.toLowerCase(); + }); + if (exactMatch) { + result = searchArray.includes(searchKey); + } else { + result = searchArray.find(function (e) { + return e.indexOf(searchKey) > -1; + }) !== undefined; + } + break; + default: + searchString = data ? data.toString().toLowerCase() : ''; + if (exactMatch) { + result = searchString === searchKey; + } else if (opposite) { + result = searchString !== searchKey; + } else { + result = searchString.indexOf(searchKey) > -1; + } + break; + } + } + + // Handle boolean inputs + if (typeof filterData === 'boolean') { + result = filterData === data; + } + + // Handle array inputs for multiselects + if ((0, _typeof2["default"])(filterData) === 'object') { + var match = false; + for (var i = 0; i < filterData.length; i += 1) { + searchKey = filterData[i].toLowerCase(); + searchString = data ? data.toString().toLowerCase() : ''; + var _searchArray = searchString.split(','); + match = _searchArray.includes(searchKey); + if (match) { + result = true; + } + } + } + return result; + } + + /** + * Called by React when the component has been rendered on the page. + */ + }, { + key: "componentDidMount", + value: function componentDidMount() { + if (!this.props.noDynamicTable) { + $('.dynamictable').DynamicTable(); + } + } + + /** + * Renders the Actions buttons. + * + * @return {string[]|void} - Array of React Elements + */ + }, { + key: "renderActions", + value: function renderActions() { + if (this.props.actions) { + return this.props.actions.map(function (action, key) { + if (action.show !== false) { + return /*#__PURE__*/_react["default"].createElement(_Form.CTA, { + key: key, + label: action.label, + onUserInput: action.action + }); + } + }); + } + } + + /** + * Renders the React component. + * + * @return {JSX} - React markup for the component + */ + }, { + key: "render", + value: function render() { + var _this4 = this; + if ((this.props.data === null || this.props.data.length === 0) && !this.props.nullTableShow) { + return /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("div", { + className: "row" + }, /*#__PURE__*/_react["default"].createElement("div", { + className: "col-xs-12" + }, /*#__PURE__*/_react["default"].createElement("div", { + className: "pull-right", + style: { + marginRight: '10px' + } + }, this.renderActions()))), /*#__PURE__*/_react["default"].createElement("div", { + className: "alert alert-info no-result-found-panel" + }, /*#__PURE__*/_react["default"].createElement("strong", null, "No result found."))); + } + var rowsPerPage = this.state.page.rows; + var headers = this.props.hide.defaultColumn === true ? [] : [/*#__PURE__*/_react["default"].createElement("th", { + key: "th_col_0", + onClick: function onClick() { + _this4.setSortColumn(-1); + } + }, this.props.rowNumLabel)]; + var _loop = function _loop(i) { + if (_this4.props.fields[i].show === true) { + var colIndex = i + 1; + if (_this4.props.fields[i].freezeColumn === true) { + headers.push( /*#__PURE__*/_react["default"].createElement("th", { + key: 'th_col_' + colIndex, + id: _this4.props.freezeColumn, + onClick: function onClick() { + _this4.setSortColumn(i); + } + }, _this4.props.fields[i].label)); + } else { + headers.push( /*#__PURE__*/_react["default"].createElement("th", { + key: 'th_col_' + colIndex, + onClick: function onClick() { + _this4.setSortColumn(i); + } + }, _this4.props.fields[i].label)); + } + } + }; + for (var i = 0; i < this.props.fields.length; i += 1) { + _loop(i); + } + var rows = []; + var filteredRowIndexes = this.getFilteredRowIndexes(); + var filteredCount = filteredRowIndexes.length; + var index = this.sortRows(filteredRowIndexes); + var currentPageRow = rowsPerPage * (this.state.page.number - 1); + + // Format each cell for the data table. + var _loop2 = function _loop2(_i2) { + var rowIndex = index[_i2].RowIdx; + var rowData = _this4.props.data[rowIndex]; + var curRow = []; + + // Iterates through headers to populate row columns + // with corresponding data + var _loop3 = function _loop3(j) { + if (_this4.props.fields[j].show === false) { + return "continue"; + } + var celldata = rowData[j]; + var cell = null; + var row = {}; + _this4.props.fields.forEach(function (field, k) { + return row[field.label] = rowData[k]; + }); + var headers = _this4.props.fields.map(function (val) { + return val.label; + }); + + // Get custom cell formatting if available + if (_this4.props.getFormattedCell) { + cell = _this4.props.getFormattedCell(_this4.props.fields[j].label, celldata, row, headers, j); + } else { + cell = /*#__PURE__*/_react["default"].createElement("td", null, celldata); + } + if (cell !== null) { + curRow.push( /*#__PURE__*/_react["default"].cloneElement(cell, { + key: 'td_col_' + j + })); + } else { + curRow.push((0, _reactAddonsCreateFragment["default"])({ + celldata: celldata + })); + } + }; + for (var j = 0; j < _this4.props.fields.length; j += 1) { + var _ret = _loop3(j); + if (_ret === "continue") continue; + } + var rowIndexDisplay = index[_i2].Content; + rows.push( /*#__PURE__*/_react["default"].createElement("tr", { + key: 'tr_' + rowIndex, + colSpan: headers.length + }, _this4.props.hide.defaultColumn === true ? null : /*#__PURE__*/_react["default"].createElement("td", { + key: 'td_' + rowIndex + }, rowIndexDisplay), curRow)); + }; + for (var _i2 = currentPageRow; _i2 < filteredCount && rows.length < rowsPerPage; _i2++) { + _loop2(_i2); + } + var rowsPerPageDropdown = /*#__PURE__*/_react["default"].createElement("select", { + className: "input-sm perPage", + onChange: this.updatePageRows, + value: this.state.page.rows + }, /*#__PURE__*/_react["default"].createElement("option", null, "20"), /*#__PURE__*/_react["default"].createElement("option", null, "50"), /*#__PURE__*/_react["default"].createElement("option", null, "100"), /*#__PURE__*/_react["default"].createElement("option", null, "1000"), /*#__PURE__*/_react["default"].createElement("option", null, "5000"), /*#__PURE__*/_react["default"].createElement("option", null, "10000")); + + // This doesn't feel like a very robust way to handle the dropdown. + // It's not clear if there's any good way to structure this for locales that + // use RTL languages or prefer a different kind of parenthesis. + var changeRowsDropdown = /*#__PURE__*/_react["default"].createElement("span", null, "(", this.props.t('Maximum rows per page:'), " ", rowsPerPageDropdown, ")"); + var header = this.props.hide.rowsPerPage === true ? '' : /*#__PURE__*/_react["default"].createElement("div", { + className: "table-header" + }, /*#__PURE__*/_react["default"].createElement("div", { + className: "row" + }, /*#__PURE__*/_react["default"].createElement("div", { + style: { + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + flexWrap: 'wrap', + padding: '5px 15px' + } + }, /*#__PURE__*/_react["default"].createElement("div", { + style: { + order: '1', + padding: '5px 0' + } + }, this.props.t('{{pageCount}} rows displayed of {{totalCount}}.', { + pageCount: rows.length, + totalCount: filteredCount + }), changeRowsDropdown), /*#__PURE__*/_react["default"].createElement("div", { + style: { + order: '2', + display: 'flex', + justifyContent: 'flex-end', + alignItems: 'center', + flexWrap: 'wrap', + padding: '5px 0', + marginLeft: 'auto' + } + }, this.renderActions(), this.props.hide.downloadCSV === true ? '' : /*#__PURE__*/_react["default"].createElement("button", { + className: "btn btn-primary", + onClick: this.downloadCSV.bind(null, filteredRowIndexes) + }, this.props.t('Download Data as CSV')), /*#__PURE__*/_react["default"].createElement(_PaginationLinks["default"], { + Total: filteredCount, + onChangePage: this.changePage, + RowsPerPage: rowsPerPage, + Active: this.state.page.number + }))))); + var footer = /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("div", { + className: "row" + }, /*#__PURE__*/_react["default"].createElement("div", { + style: { + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + flexWrap: 'wrap', + padding: '5px 15px' + } + }, /*#__PURE__*/_react["default"].createElement("div", { + style: { + order: '1', + padding: '5px 0' + } + }, this.props.t('{{pageCount}} rows displayed of {{totalCount}}.', { + pageCount: rows.length, + totalCount: filteredCount + }), changeRowsDropdown), /*#__PURE__*/_react["default"].createElement("div", { + style: { + order: '2', + padding: '5px 0', + marginLeft: 'auto' + } + }, /*#__PURE__*/_react["default"].createElement(_PaginationLinks["default"], { + Total: filteredCount, + onChangePage: this.changePage, + RowsPerPage: rowsPerPage, + Active: this.state.page.number + }))))); + return /*#__PURE__*/_react["default"].createElement("div", { + style: { + margin: '14px' + } + }, header, /*#__PURE__*/_react["default"].createElement("table", { + className: "table table-hover table-primary table-bordered dynamictable", + id: "dynamictable" + }, /*#__PURE__*/_react["default"].createElement("thead", null, /*#__PURE__*/_react["default"].createElement("tr", { + className: "info" + }, headers)), this.props.folder, /*#__PURE__*/_react["default"].createElement("tbody", null, rows)), footer); + } + }]); + return DataTable; +}(_react.Component); +DataTable.propTypes = { + data: _propTypes["default"].array.isRequired, + rowNumLabel: _propTypes["default"].string, + // Function of which returns a JSX element for a table cell, takes + // parameters of the form: func(ColumnName, CellData, EntireRowData) + getFormattedCell: _propTypes["default"].func, + onSort: _propTypes["default"].func, + actions: _propTypes["default"].array, + hide: _propTypes["default"].object, + nullTableShow: _propTypes["default"].bool, + noDynamicTable: _propTypes["default"].bool, + getMappedCell: _propTypes["default"].func, + fields: _propTypes["default"].array, + RowNameMap: _propTypes["default"].array, + filters: _propTypes["default"].object, + freezeColumn: _propTypes["default"].string, + loading: _propTypes["default"].element, + folder: _propTypes["default"].element, + // Provided by withTranslation HOC + t: _propTypes["default"].func +}; +DataTable.defaultProps = { + headers: [], + data: {}, + rowNumLabel: 'No.', + filters: {}, + hide: { + rowsPerPage: false, + downloadCSV: false, + defaultColumn: false + }, + nullTableShow: false, + noDynamicTable: false +}; +var _default = exports["default"] = (0, _reactI18next.withTranslation)(['loris'])(DataTable); + +/***/ }), + +/***/ "./jsx/Filter.js": +/*!***********************!*\ + !*** ./jsx/Filter.js ***! + \***********************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); +var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"); +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; +var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); +var _propTypes = _interopRequireDefault(__webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js")); +var _Form = __webpack_require__(/*! jsx/Form */ "./jsx/Form.js"); +var _DateTimePartialElement = _interopRequireDefault(__webpack_require__(/*! jsx/form/DateTimePartialElement */ "./jsx/form/DateTimePartialElement.tsx")); +var _reactI18next = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) { if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } } return n["default"] = e, t && t.set(e, n), n; } +/** + * Filter component + * A wrapper for form elements inside a selection filter. + * + * Constructs filter fields based on this.props.fields configuration object + * + * Alters the filter object and sends it to parent on every update. + * + * @param {props} props + * @return {JSX} + */ +function Filter(props) { + /** + * Takes query params from url and triggers an update of the fields that are + * associated with those params, if they exist. + */ + (0, _react.useEffect)(function () { + var searchParams = new URLSearchParams(location.search); + searchParams.forEach(function (value, name) { + // This checks to make sure the filter actually exists + if (props.fields.find(function (field) { + return (field.filter || {}).name == name; + })) { + onFieldUpdate(name, searchParams.getAll(name)); + } + }); + }, []); + + /** + * Sets filter object to reflect values of input fields. + * + * @param {string} name - form element type (i.e component name) + * @param {string} value - the name of the form element + */ + var onFieldUpdate = function onFieldUpdate(name, value) { + var _JSON$parse = JSON.parse(JSON.stringify(props)), + fields = _JSON$parse.fields; + var type = fields.find(function (field) { + return (field.filter || {}).name == name; + }).filter.type; + var exactMatch = !(type === 'text' || type === 'date' || type === 'datetime' || type === 'multiselect'); + if (value === null || value === '' || value.constructor === Array && value.length === 0 || type === 'checkbox' && value === false) { + props.removeFilter(name); + } else { + props.addFilter(name, value, exactMatch); + } + }; + + /** + * Renders the filters based on the defined fields. + * + * @return {array} + */ + var renderFilterFields = function renderFilterFields() { + return props.fields.reduce(function (result, field) { + var filter = field.filter; + if (filter && filter.hide !== true) { + var element; + switch (filter.type) { + case 'text': + element = /*#__PURE__*/_react["default"].createElement(_Form.TextboxElement, null); + break; + case 'select': + element = /*#__PURE__*/_react["default"].createElement(_Form.SelectElement, { + options: filter.options, + sortByValue: filter.sortByValue, + autoSelect: false + }); + break; + case 'multiselect': + element = /*#__PURE__*/_react["default"].createElement(_Form.SelectElement, { + options: filter.options, + sortByValue: filter.sortByValue, + multiple: true, + emptyOption: false + }); + break; + case 'numeric': + element = /*#__PURE__*/_react["default"].createElement(_Form.NumericElement, { + options: filter.options + }); + break; + case 'date': + element = /*#__PURE__*/_react["default"].createElement(_Form.DateElement, null); + break; + case 'datetime': + element = /*#__PURE__*/_react["default"].createElement(_DateTimePartialElement["default"], null); + break; + case 'checkbox': + element = /*#__PURE__*/_react["default"].createElement(_Form.CheckboxElement, null); + break; + case 'time': + element = /*#__PURE__*/_react["default"].createElement(_Form.TimeElement, null); + break; + default: + element = /*#__PURE__*/_react["default"].createElement(_Form.TextboxElement, null); + } + + // The value prop has to default to false if the first two options + // are undefined so that the checkbox component is a controlled input + // element with a starting default value + result.push( /*#__PURE__*/_react["default"].cloneElement(element, { + key: filter.name, + name: filter.name, + label: field.label, + value: (props.filters[filter.name] || {}).value || null, + onUserInput: onFieldUpdate + })); + } + return result; + }, []); + }; + var filterPresets = function filterPresets() { + if (props.filterPresets) { + var presets = props.filterPresets.map(function (preset) { + var handleClick = function handleClick() { + return props.updateFilters(preset.filter); + }; + return /*#__PURE__*/_react["default"].createElement("li", null, /*#__PURE__*/_react["default"].createElement("a", { + onClick: handleClick + }, preset.label)); + }); + return /*#__PURE__*/_react["default"].createElement("li", { + className: "dropdown" + }, /*#__PURE__*/_react["default"].createElement("a", { + className: "dropdown-toggle", + "data-toggle": "dropdown", + role: "button" + }, "Load Filter Preset ", /*#__PURE__*/_react["default"].createElement("span", { + className: "caret" + })), /*#__PURE__*/_react["default"].createElement("ul", { + className: "dropdown-menu", + role: "menu" + }, presets)); + } + }; + var filterActions = /*#__PURE__*/_react["default"].createElement("ul", { + className: "nav nav-tabs navbar-right", + style: { + borderBottom: 'none' + } + }, filterPresets(), /*#__PURE__*/_react["default"].createElement("li", null, /*#__PURE__*/_react["default"].createElement("a", { + role: "button", + name: "reset", + onClick: props.clearFilters + }, props.t('Clear Filters')))); + return /*#__PURE__*/_react["default"].createElement(_Form.FormElement, { + id: props.id, + name: props.name + }, /*#__PURE__*/_react["default"].createElement(_Form.FieldsetElement, { + columns: props.columns, + legend: props.title + }, filterActions, renderFilterFields())); +} +Filter.defaultProps = { + id: null, + clearFilter: function clearFilter() { + console.warn('onUpdate() callback is not set!'); + }, + columns: 1 +}; +Filter.propTypes = { + filters: _propTypes["default"].object.isRequired, + clearFilter: _propTypes["default"].func.isRequired, + id: _propTypes["default"].string, + name: _propTypes["default"].string, + columns: _propTypes["default"].number, + title: _propTypes["default"].string, + fields: _propTypes["default"].array.isRequired, + removeFilter: _propTypes["default"].func, + addFilter: _propTypes["default"].func, + filterPresets: _propTypes["default"].array, + updateFilters: _propTypes["default"].func, + clearFilters: _propTypes["default"].func, + // Provided by withTranslation HOC + t: _propTypes["default"].func +}; +var _default = exports["default"] = (0, _reactI18next.withTranslation)(['loris'])(Filter); + +/***/ }), + +/***/ "./jsx/FilterableDataTable.js": +/*!************************************!*\ + !*** ./jsx/FilterableDataTable.js ***! + \************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); +var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"); +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; +var _slicedToArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "./node_modules/@babel/runtime/helpers/slicedToArray.js")); +var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js")); +var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js")); +var _assertThisInitialized2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "./node_modules/@babel/runtime/helpers/assertThisInitialized.js")); +var _inherits2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/inherits.js")); +var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js")); +var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js")); +var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); +var _propTypes = _interopRequireDefault(__webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js")); +var _Panel = _interopRequireDefault(__webpack_require__(/*! jsx/Panel */ "./jsx/Panel.js")); +var _DataTable = _interopRequireDefault(__webpack_require__(/*! jsx/DataTable */ "./jsx/DataTable.js")); +var _Filter = _interopRequireDefault(__webpack_require__(/*! jsx/Filter */ "./jsx/Filter.js")); +var _ProgressBar = _interopRequireDefault(__webpack_require__(/*! jsx/ProgressBar */ "./jsx/ProgressBar.js")); +var _reactI18next = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) { if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } } return n["default"] = e, t && t.set(e, n), n; } +function _createSuper(t) { var r = _isNativeReflectConstruct(); return function () { var e, o = (0, _getPrototypeOf2["default"])(t); if (r) { var s = (0, _getPrototypeOf2["default"])(this).constructor; e = Reflect.construct(o, arguments, s); } else e = o.apply(this, arguments); return (0, _possibleConstructorReturn2["default"])(this, e); }; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +/** + * FilterableDataTable component. + * A wrapper for all datatables that handles filtering. + * + * Handles the updating and clearing of the filter state based on changes sent + * from the FitlerForm. + * + * Passes the Filter to the Datatable. + * + * Deprecates Filter Form. + */ +var FilterableDataTable = /*#__PURE__*/function (_Component) { + (0, _inherits2["default"])(FilterableDataTable, _Component); + var _super = _createSuper(FilterableDataTable); + /** + * @constructor + * @param {object} props - React Component properties + */ + function FilterableDataTable(props) { + var _this; + (0, _classCallCheck2["default"])(this, FilterableDataTable); + _this = _super.call(this, props); + _this.state = { + filters: {} + }; + _this.updateFilters = _this.updateFilters.bind((0, _assertThisInitialized2["default"])(_this)); + _this.clearFilters = _this.clearFilters.bind((0, _assertThisInitialized2["default"])(_this)); + _this.validFilters = _this.validFilters.bind((0, _assertThisInitialized2["default"])(_this)); + _this.addFilter = _this.addFilter.bind((0, _assertThisInitialized2["default"])(_this)); + _this.removeFilter = _this.removeFilter.bind((0, _assertThisInitialized2["default"])(_this)); + return _this; + } + + /** + * Updates filter state + * + * @param {object} filters + */ + (0, _createClass2["default"])(FilterableDataTable, [{ + key: "updateFilters", + value: function updateFilters(filters) { + this.updateQueryParams(filters); + this.setState({ + filters: filters + }); + if (this.props.updateFilterCallback) { + this.props.updateFilterCallback(filters); + } + } + + /** + * Updates URL Query Params + * + * @param {object} filters + */ + }, { + key: "updateQueryParams", + value: function updateQueryParams(filters) { + var searchParams = new URLSearchParams(); + Object.entries(filters).forEach(function (_ref) { + var _ref2 = (0, _slicedToArray2["default"])(_ref, 2), + name = _ref2[0], + filter = _ref2[1]; + if (filter.value.constructor === Array) { + filter.value.forEach(function (v) { + return searchParams.append(name, v); + }); + } else { + searchParams.set(name, filter.value); + } + }); + history.replaceState({}, '', "?".concat(searchParams.toString())); + } + + /** + * Add new filter to the filter object + * + * @param {string} name + * @param {*} value + * @param {boolean} exactMatch + */ + }, { + key: "addFilter", + value: function addFilter(name, value, exactMatch) { + var filters = this.state.filters; + filters[name] = { + value: value, + exactMatch: exactMatch + }; + this.updateFilters(filters); + } + + /** + * Remove filter from the filter object + * + * @param {string} name + */ + }, { + key: "removeFilter", + value: function removeFilter(name) { + var filters = this.state.filters; + delete filters[name]; + this.updateFilters(filters); + } + + /** + * Sets Filter to empty object + */ + }, { + key: "clearFilters", + value: function clearFilters() { + this.updateFilters({}); + } + + /** + * Returns the filter state, with filters that are + * set to an invalid option removed from the returned + * filters + * + * @return {object} + */ + }, { + key: "validFilters", + value: function validFilters() { + var _this2 = this; + var filters = {}; + this.props.fields.forEach(function (field) { + if (!field.filter) { + return; + } + var filtername = field.filter.name; + var filterval = _this2.state.filters[filtername]; + if (!filterval) { + return; + } + if (field.filter.type !== 'select') { + filters[filtername] = filterval; + return; + } + if (!(filterval.value in field.filter.options)) { + return; + } + filters[filtername] = filterval; + }); + return filters; + } + + /** + * Renders the React component. + * + * @return {JSX} - React markup for the component + */ + }, { + key: "render", + value: function render() { + var filters = this.validFilters(); + var filter = /*#__PURE__*/_react["default"].createElement(_Filter["default"], { + name: this.props.name + '_filter', + id: this.props.name + '_filter', + columns: this.props.columns, + filters: filters, + title: this.props.t('Selection Filter'), + filterPresets: this.props.filterPresets, + fields: this.props.fields, + addFilter: this.addFilter, + updateFilters: this.updateFilters, + removeFilter: this.removeFilter, + clearFilters: this.clearFilters + }); + var progress = this.props.progress; + var dataTable = !isNaN(progress) && progress < 100 ? /*#__PURE__*/_react["default"].createElement(_ProgressBar["default"], { + value: progress + }) : /*#__PURE__*/_react["default"].createElement(_DataTable["default"], { + data: this.props.data, + fields: this.props.fields, + filters: filters, + actions: this.props.actions, + loading: this.props.loading, + getFormattedCell: this.props.getFormattedCell, + getMappedCell: this.props.getMappedCell, + folder: this.props.folder, + nullTableShow: this.props.nullTableShow, + noDynamicTable: this.props.noDynamicTable + }); + return /*#__PURE__*/_react["default"].createElement(_Panel["default"], { + title: this.props.title + }, filter, this.props.children, dataTable); + } + }]); + return FilterableDataTable; +}(_react.Component); +FilterableDataTable.defaultProps = { + columns: 3, + noDynamicTable: false +}; +FilterableDataTable.propTypes = { + name: _propTypes["default"].string.isRequired, + title: _propTypes["default"].string, + data: _propTypes["default"].array.isRequired, + filterPresets: _propTypes["default"].object, + fields: _propTypes["default"].array.isRequired, + columns: _propTypes["default"].number, + getFormattedCell: _propTypes["default"].func, + actions: _propTypes["default"].array, + updateFilterCallback: _propTypes["default"].func, + noDynamicTable: _propTypes["default"].bool, + loading: _propTypes["default"].element, + progress: _propTypes["default"].number, + getMappedCell: _propTypes["default"].func, + folder: _propTypes["default"].element, + nullTableShow: _propTypes["default"].element, + children: _propTypes["default"].node, + // Provided by withTranslation HOC + t: _propTypes["default"].func +}; +var _default = exports["default"] = (0, _reactI18next.withTranslation)(['loris'])(FilterableDataTable); + +/***/ }), + +/***/ "./jsx/Form.js": +/*!*********************!*\ + !*** ./jsx/Form.js ***! + \*********************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); +var _typeof3 = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"); +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = exports.TimeElement = exports.TextboxElement = exports.TextareaElement = exports.TagsElement = exports.StaticElement = exports.SliderElement = exports.SelectElement = exports.SearchableDropdown = exports.RadioElement = exports.PasswordElement = exports.NumericElement = exports.LorisElement = exports.LinkElement = exports.HeaderElement = exports.FormElement = exports.FileElement = exports.FieldsetElement = exports.EmailElement = exports.DateTimeElement = exports.DateElement = exports.CheckboxElement = exports.CTA = exports.ButtonElement = void 0; +var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/defineProperty.js")); +var _typeof2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js")); +var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js")); +var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js")); +var _assertThisInitialized2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "./node_modules/@babel/runtime/helpers/assertThisInitialized.js")); +var _inherits2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/inherits.js")); +var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js")); +var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js")); +var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); +var _propTypes = _interopRequireDefault(__webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js")); +var _InputLabel = _interopRequireDefault(__webpack_require__(/*! jsx/form/InputLabel */ "./jsx/form/InputLabel.tsx")); +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) { if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } } return n["default"] = e, t && t.set(e, n), n; } +function _createSuper(t) { var r = _isNativeReflectConstruct(); return function () { var e, o = (0, _getPrototypeOf2["default"])(t); if (r) { var s = (0, _getPrototypeOf2["default"])(this).constructor; e = Reflect.construct(o, arguments, s); } else e = o.apply(this, arguments); return (0, _possibleConstructorReturn2["default"])(this, e); }; } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } /** + * This file contains React components for Loris form elements. + * + * @author Loris Team + * @version 1.0.0 + */ +/** + * Form Component. + * React wrapper for