diff --git a/jsx/.eslintrc.json b/jsx/.eslintrc.json index 191fd680..7e9d4c74 100644 --- a/jsx/.eslintrc.json +++ b/jsx/.eslintrc.json @@ -12,7 +12,7 @@ "version": "detect" } }, - "plugins": ["eslint-plugin-react", "prettier"], + "plugins": ["eslint-plugin-react", "prettier", "unused-imports"], "env": { "es6": true, "browser": true @@ -20,7 +20,8 @@ "rules": { "semi": "off", "quotes": "off", - "prettier/prettier": "warn" + "prettier/prettier": "warn", + "no-unused-vars": "warn" }, "overrides": [ { diff --git a/jsx/package.json b/jsx/package.json index 27a7d156..3ac47cfa 100644 --- a/jsx/package.json +++ b/jsx/package.json @@ -34,6 +34,7 @@ "babel-loader": "^8.2.1", "bootstrap": "^4.5.3", "css-loader": "^5.0.1", + "eslint-plugin-unused-imports": "^1.1.1", "file-loader": "^6.2.0", "history": "^5.0.0", "prop-types": "^15.7.2", diff --git a/jsx/src/App.jsx b/jsx/src/App.jsx index b99a59d7..ab592e1d 100644 --- a/jsx/src/App.jsx +++ b/jsx/src/App.jsx @@ -1,4 +1,4 @@ -import React, { Component, useEffect } from "react"; +import React, { useEffect } from "react"; import ReactDOM from "react-dom"; import { Provider } from "react-redux"; import { createStore } from "redux"; @@ -6,7 +6,7 @@ import { compose } from "recompose"; import { initialState, reducers } from "./Store"; import { jhapiRequest } from "./util/jhapiUtil"; import withAPI from "./util/withAPI"; -import { HashRouter, Switch, Route, Link } from "react-router-dom"; +import { HashRouter, Switch, Route } from "react-router-dom"; import ServerDashboard from "./components/ServerDashboard/ServerDashboard"; import Groups from "./components/Groups/Groups"; @@ -19,17 +19,21 @@ import "./style/root.css"; const store = createStore(reducers, initialState); -const App = (props) => { +const App = () => { useEffect(() => { let { limit, user_page, groups_page } = initialState; jhapiRequest(`/users?offset=${user_page * limit}&limit=${limit}`, "GET") .then((data) => data.json()) - .then((data) => store.dispatch({ type: "USER_DATA", value: data })) + .then((data) => + store.dispatch({ type: "USER_PAGE", value: { data: data, page: 0 } }) + ) .catch((err) => console.log(err)); jhapiRequest(`/groups?offset=${groups_page * limit}&limit=${limit}`, "GET") .then((data) => data.json()) - .then((data) => store.dispatch({ type: "GROUPS_DATA", value: data })) + .then((data) => + store.dispatch({ type: "GROUPS_PAGE", value: { data: data, page: 0 } }) + ) .catch((err) => console.log(err)); }); diff --git a/jsx/src/Store.js b/jsx/src/Store.js index 3ba4fc72..34d7eada 100644 --- a/jsx/src/Store.js +++ b/jsx/src/Store.js @@ -17,10 +17,6 @@ export const reducers = (state = initialState, action) => { user_data: action.value.data, }); - // Deprecated - doesn't store pagination values - case "USER_DATA": - return Object.assign({}, state, { user_data: action.value }); - // Updates the client group model data and stores the page case "GROUPS_PAGE": return Object.assign({}, state, { @@ -28,10 +24,6 @@ export const reducers = (state = initialState, action) => { groups_data: action.value.data, }); - // Deprecated - doesn't store pagination values - case "GROUPS_DATA": - return Object.assign({}, state, { groups_data: action.value }); - default: return state; } diff --git a/jsx/src/components/AddUser/AddUser.jsx b/jsx/src/components/AddUser/AddUser.jsx index 2518361d..8ce0b75c 100644 --- a/jsx/src/components/AddUser/AddUser.jsx +++ b/jsx/src/components/AddUser/AddUser.jsx @@ -8,6 +8,7 @@ import { jhapiRequest } from "../../util/jhapiUtil"; const AddUser = (props) => { var [users, setUsers] = useState([]), [admin, setAdmin] = useState(false), + [errorAlert, setErrorAlert] = useState(null), limit = useSelector((state) => state.limit); var dispatch = useDispatch(); @@ -27,6 +28,15 @@ const AddUser = (props) => { return ( <>
+ {errorAlert != null ? ( +
+
+
{errorAlert}
+
+
+ ) : ( + <> + )}
@@ -82,11 +92,17 @@ const AddUser = (props) => { } addUsers(filtered_users, admin) - .then(() => - updateUsers(0, limit) - .then((data) => dispatchPageChange(data, 0)) - .then(() => history.push("/")) - .catch((err) => console.log(err)) + .then((data) => + data.status < 300 + ? updateUsers(0, limit) + .then((data) => dispatchPageChange(data, 0)) + .then(() => history.push("/")) + .catch((err) => console.log(err)) + : setErrorAlert( + `[${data.status}] Failed to create user. ${ + data.status == 409 ? "User already exists." : "" + }` + ) ) .catch((err) => console.log(err)); }} diff --git a/jsx/src/components/CreateGroup/CreateGroup.jsx b/jsx/src/components/CreateGroup/CreateGroup.jsx index 46c56cd7..0abd2fbf 100644 --- a/jsx/src/components/CreateGroup/CreateGroup.jsx +++ b/jsx/src/components/CreateGroup/CreateGroup.jsx @@ -5,13 +5,14 @@ import PropTypes from "prop-types"; const CreateGroup = (props) => { var [groupName, setGroupName] = useState(""), + [errorAlert, setErrorAlert] = useState(null), limit = useSelector((state) => state.limit); var dispatch = useDispatch(); var dispatchPageUpdate = (data, page) => { dispatch({ - type: "GROUPS_DATA", + type: "GROUPS_PAGE", value: { data: data, page: page, @@ -24,6 +25,15 @@ const CreateGroup = (props) => { return ( <>
+ {errorAlert != null ? ( +
+
+
{errorAlert}
+
+
+ ) : ( + <> + )}
@@ -54,11 +64,19 @@ const CreateGroup = (props) => { className="btn btn-primary" onClick={() => { createGroup(groupName) - .then( - updateGroups(0, limit) - .then((data) => dispatchPageUpdate(data, 0)) - .then(history.push("/groups")) - .catch((err) => console.log(err)) + .then((data) => + data.status < 300 + ? updateGroups(0, limit) + .then((data) => dispatchPageUpdate(data, 0)) + .then((data) => history.push("/groups")) + .catch((err) => console.log(err)) + : setErrorAlert( + `[${data.status}] Failed to create group. ${ + data.status == 409 + ? "Group already exists." + : "" + }` + ) ) .catch((err) => console.log(err)); }} diff --git a/jsx/yarn.lock b/jsx/yarn.lock index 8bfd4a66..e958ff32 100644 --- a/jsx/yarn.lock +++ b/jsx/yarn.lock @@ -3073,6 +3073,18 @@ eslint-plugin-react@^7.22.0: resolve "^1.18.1" string.prototype.matchall "^4.0.2" +eslint-plugin-unused-imports@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-1.1.1.tgz#a5433f8b394461201129a246d8d92d9613e69597" + integrity sha512-EApvRx9Q3XQI96Tg7xPPqY6OuOy95wWMXAtc8RrwdIRk9bv8vkJKwOVoE4HeWJOQhHeHcI8lUbOqmup/PxjfOw== + dependencies: + eslint-rule-composer "^0.3.0" + +eslint-rule-composer@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" + integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== + eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" diff --git a/share/jupyterhub/static/js/admin-react.js b/share/jupyterhub/static/js/admin-react.js index 5c89bfbc..a02d04f2 100644 --- a/share/jupyterhub/static/js/admin-react.js +++ b/share/jupyterhub/static/js/admin-react.js @@ -64,7 +64,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"./node_modules/react-dom/index.js\");\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! redux */ \"./node_modules/redux/es/redux.js\");\n/* harmony import */ var recompose__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! recompose */ \"./node_modules/recompose/dist/Recompose.esm.js\");\n/* harmony import */ var _Store__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Store */ \"./src/Store.js\");\n/* harmony import */ var _util_jhapiUtil__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util/jhapiUtil */ \"./src/util/jhapiUtil.js\");\n/* harmony import */ var _util_withAPI__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util/withAPI */ \"./src/util/withAPI.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/esm/react-router-dom.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/esm/react-router.js\");\n/* harmony import */ var _components_ServerDashboard_ServerDashboard__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/ServerDashboard/ServerDashboard */ \"./src/components/ServerDashboard/ServerDashboard.jsx\");\n/* harmony import */ var _components_Groups_Groups__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./components/Groups/Groups */ \"./src/components/Groups/Groups.jsx\");\n/* harmony import */ var _components_GroupEdit_GroupEdit__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./components/GroupEdit/GroupEdit */ \"./src/components/GroupEdit/GroupEdit.jsx\");\n/* harmony import */ var _components_CreateGroup_CreateGroup__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./components/CreateGroup/CreateGroup */ \"./src/components/CreateGroup/CreateGroup.jsx\");\n/* harmony import */ var _components_AddUser_AddUser__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./components/AddUser/AddUser */ \"./src/components/AddUser/AddUser.jsx\");\n/* harmony import */ var _components_EditUser_EditUser__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./components/EditUser/EditUser */ \"./src/components/EditUser/EditUser.jsx\");\n/* harmony import */ var _style_root_css__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./style/root.css */ \"./src/style/root.css\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar store = (0,redux__WEBPACK_IMPORTED_MODULE_14__.createStore)(_Store__WEBPACK_IMPORTED_MODULE_4__.reducers, _Store__WEBPACK_IMPORTED_MODULE_4__.initialState);\n\nvar App = function App(props) {\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var limit = _Store__WEBPACK_IMPORTED_MODULE_4__.initialState.limit,\n user_page = _Store__WEBPACK_IMPORTED_MODULE_4__.initialState.user_page,\n groups_page = _Store__WEBPACK_IMPORTED_MODULE_4__.initialState.groups_page;\n (0,_util_jhapiUtil__WEBPACK_IMPORTED_MODULE_5__.jhapiRequest)(\"/users?offset=\".concat(user_page * limit, \"&limit=\").concat(limit), \"GET\").then(function (data) {\n return data.json();\n }).then(function (data) {\n return store.dispatch({\n type: \"USER_DATA\",\n value: data\n });\n })[\"catch\"](function (err) {\n return console.log(err);\n });\n (0,_util_jhapiUtil__WEBPACK_IMPORTED_MODULE_5__.jhapiRequest)(\"/groups?offset=\".concat(groups_page * limit, \"&limit=\").concat(limit), \"GET\").then(function (data) {\n return data.json();\n }).then(function (data) {\n return store.dispatch({\n type: \"GROUPS_DATA\",\n value: data\n });\n })[\"catch\"](function (err) {\n return console.log(err);\n });\n });\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"resets\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_redux__WEBPACK_IMPORTED_MODULE_2__.Provider, {\n store: store\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_15__.HashRouter, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_16__.Switch, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_16__.Route, {\n exact: true,\n path: \"/\",\n component: (0,recompose__WEBPACK_IMPORTED_MODULE_3__.compose)(_util_withAPI__WEBPACK_IMPORTED_MODULE_6__.default)(_components_ServerDashboard_ServerDashboard__WEBPACK_IMPORTED_MODULE_7__.default)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_16__.Route, {\n exact: true,\n path: \"/groups\",\n component: (0,recompose__WEBPACK_IMPORTED_MODULE_3__.compose)(_util_withAPI__WEBPACK_IMPORTED_MODULE_6__.default)(_components_Groups_Groups__WEBPACK_IMPORTED_MODULE_8__.default)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_16__.Route, {\n exact: true,\n path: \"/group-edit\",\n component: (0,recompose__WEBPACK_IMPORTED_MODULE_3__.compose)(_util_withAPI__WEBPACK_IMPORTED_MODULE_6__.default)(_components_GroupEdit_GroupEdit__WEBPACK_IMPORTED_MODULE_9__.default)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_16__.Route, {\n exact: true,\n path: \"/create-group\",\n component: (0,recompose__WEBPACK_IMPORTED_MODULE_3__.compose)(_util_withAPI__WEBPACK_IMPORTED_MODULE_6__.default)(_components_CreateGroup_CreateGroup__WEBPACK_IMPORTED_MODULE_10__.default)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_16__.Route, {\n exact: true,\n path: \"/add-users\",\n component: (0,recompose__WEBPACK_IMPORTED_MODULE_3__.compose)(_util_withAPI__WEBPACK_IMPORTED_MODULE_6__.default)(_components_AddUser_AddUser__WEBPACK_IMPORTED_MODULE_11__.default)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_16__.Route, {\n exact: true,\n path: \"/edit-user\",\n component: (0,recompose__WEBPACK_IMPORTED_MODULE_3__.compose)(_util_withAPI__WEBPACK_IMPORTED_MODULE_6__.default)(_components_EditUser_EditUser__WEBPACK_IMPORTED_MODULE_12__.default)\n })))));\n};\n\nreact_dom__WEBPACK_IMPORTED_MODULE_1__.render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(App, null), document.getElementById(\"react-admin-hook\"));\n\n//# sourceURL=webpack://jupyterhub-admin-react/./src/App.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"./node_modules/react-dom/index.js\");\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! redux */ \"./node_modules/redux/es/redux.js\");\n/* harmony import */ var recompose__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! recompose */ \"./node_modules/recompose/dist/Recompose.esm.js\");\n/* harmony import */ var _Store__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Store */ \"./src/Store.js\");\n/* harmony import */ var _util_jhapiUtil__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./util/jhapiUtil */ \"./src/util/jhapiUtil.js\");\n/* harmony import */ var _util_withAPI__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./util/withAPI */ \"./src/util/withAPI.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/esm/react-router-dom.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/esm/react-router.js\");\n/* harmony import */ var _components_ServerDashboard_ServerDashboard__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/ServerDashboard/ServerDashboard */ \"./src/components/ServerDashboard/ServerDashboard.jsx\");\n/* harmony import */ var _components_Groups_Groups__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./components/Groups/Groups */ \"./src/components/Groups/Groups.jsx\");\n/* harmony import */ var _components_GroupEdit_GroupEdit__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./components/GroupEdit/GroupEdit */ \"./src/components/GroupEdit/GroupEdit.jsx\");\n/* harmony import */ var _components_CreateGroup_CreateGroup__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./components/CreateGroup/CreateGroup */ \"./src/components/CreateGroup/CreateGroup.jsx\");\n/* harmony import */ var _components_AddUser_AddUser__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./components/AddUser/AddUser */ \"./src/components/AddUser/AddUser.jsx\");\n/* harmony import */ var _components_EditUser_EditUser__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./components/EditUser/EditUser */ \"./src/components/EditUser/EditUser.jsx\");\n/* harmony import */ var _style_root_css__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./style/root.css */ \"./src/style/root.css\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar store = (0,redux__WEBPACK_IMPORTED_MODULE_14__.createStore)(_Store__WEBPACK_IMPORTED_MODULE_4__.reducers, _Store__WEBPACK_IMPORTED_MODULE_4__.initialState);\n\nvar App = function App() {\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var limit = _Store__WEBPACK_IMPORTED_MODULE_4__.initialState.limit,\n user_page = _Store__WEBPACK_IMPORTED_MODULE_4__.initialState.user_page,\n groups_page = _Store__WEBPACK_IMPORTED_MODULE_4__.initialState.groups_page;\n (0,_util_jhapiUtil__WEBPACK_IMPORTED_MODULE_5__.jhapiRequest)(\"/users?offset=\".concat(user_page * limit, \"&limit=\").concat(limit), \"GET\").then(function (data) {\n return data.json();\n }).then(function (data) {\n return store.dispatch({\n type: \"USER_PAGE\",\n value: {\n data: data,\n page: 0\n }\n });\n })[\"catch\"](function (err) {\n return console.log(err);\n });\n (0,_util_jhapiUtil__WEBPACK_IMPORTED_MODULE_5__.jhapiRequest)(\"/groups?offset=\".concat(groups_page * limit, \"&limit=\").concat(limit), \"GET\").then(function (data) {\n return data.json();\n }).then(function (data) {\n return store.dispatch({\n type: \"GROUPS_PAGE\",\n value: {\n data: data,\n page: 0\n }\n });\n })[\"catch\"](function (err) {\n return console.log(err);\n });\n });\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"resets\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_redux__WEBPACK_IMPORTED_MODULE_2__.Provider, {\n store: store\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_15__.HashRouter, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_16__.Switch, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_16__.Route, {\n exact: true,\n path: \"/\",\n component: (0,recompose__WEBPACK_IMPORTED_MODULE_3__.compose)(_util_withAPI__WEBPACK_IMPORTED_MODULE_6__.default)(_components_ServerDashboard_ServerDashboard__WEBPACK_IMPORTED_MODULE_7__.default)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_16__.Route, {\n exact: true,\n path: \"/groups\",\n component: (0,recompose__WEBPACK_IMPORTED_MODULE_3__.compose)(_util_withAPI__WEBPACK_IMPORTED_MODULE_6__.default)(_components_Groups_Groups__WEBPACK_IMPORTED_MODULE_8__.default)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_16__.Route, {\n exact: true,\n path: \"/group-edit\",\n component: (0,recompose__WEBPACK_IMPORTED_MODULE_3__.compose)(_util_withAPI__WEBPACK_IMPORTED_MODULE_6__.default)(_components_GroupEdit_GroupEdit__WEBPACK_IMPORTED_MODULE_9__.default)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_16__.Route, {\n exact: true,\n path: \"/create-group\",\n component: (0,recompose__WEBPACK_IMPORTED_MODULE_3__.compose)(_util_withAPI__WEBPACK_IMPORTED_MODULE_6__.default)(_components_CreateGroup_CreateGroup__WEBPACK_IMPORTED_MODULE_10__.default)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_16__.Route, {\n exact: true,\n path: \"/add-users\",\n component: (0,recompose__WEBPACK_IMPORTED_MODULE_3__.compose)(_util_withAPI__WEBPACK_IMPORTED_MODULE_6__.default)(_components_AddUser_AddUser__WEBPACK_IMPORTED_MODULE_11__.default)\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_16__.Route, {\n exact: true,\n path: \"/edit-user\",\n component: (0,recompose__WEBPACK_IMPORTED_MODULE_3__.compose)(_util_withAPI__WEBPACK_IMPORTED_MODULE_6__.default)(_components_EditUser_EditUser__WEBPACK_IMPORTED_MODULE_12__.default)\n })))));\n};\n\nreact_dom__WEBPACK_IMPORTED_MODULE_1__.render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(App, null), document.getElementById(\"react-admin-hook\"));\n\n//# sourceURL=webpack://jupyterhub-admin-react/./src/App.jsx?"); /***/ }), @@ -80,7 +80,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var reac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"initialState\": () => /* binding */ initialState,\n/* harmony export */ \"reducers\": () => /* binding */ reducers\n/* harmony export */ });\n\nvar initialState = {\n user_data: undefined,\n user_page: 0,\n groups_data: undefined,\n groups_page: 0,\n limit: 50\n};\nvar reducers = function reducers() {\n var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n var action = arguments.length > 1 ? arguments[1] : undefined;\n\n switch (action.type) {\n // Updates the client user model data and stores the page\n case \"USER_PAGE\":\n return Object.assign({}, state, {\n user_page: action.value.page,\n user_data: action.value.data\n });\n // Deprecated - doesn't store pagination values\n\n case \"USER_DATA\":\n return Object.assign({}, state, {\n user_data: action.value\n });\n // Updates the client group model data and stores the page\n\n case \"GROUPS_PAGE\":\n return Object.assign({}, state, {\n groups_page: action.value.page,\n groups_data: action.value.data\n });\n // Deprecated - doesn't store pagination values\n\n case \"GROUPS_DATA\":\n return Object.assign({}, state, {\n groups_data: action.value\n });\n\n default:\n return state;\n }\n};\n\n//# sourceURL=webpack://jupyterhub-admin-react/./src/Store.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"initialState\": () => /* binding */ initialState,\n/* harmony export */ \"reducers\": () => /* binding */ reducers\n/* harmony export */ });\n\nvar initialState = {\n user_data: undefined,\n user_page: 0,\n groups_data: undefined,\n groups_page: 0,\n limit: 50\n};\nvar reducers = function reducers() {\n var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n var action = arguments.length > 1 ? arguments[1] : undefined;\n\n switch (action.type) {\n // Updates the client user model data and stores the page\n case \"USER_PAGE\":\n return Object.assign({}, state, {\n user_page: action.value.page,\n user_data: action.value.data\n });\n // Updates the client group model data and stores the page\n\n case \"GROUPS_PAGE\":\n return Object.assign({}, state, {\n groups_page: action.value.page,\n groups_data: action.value.data\n });\n\n default:\n return state;\n }\n};\n\n//# sourceURL=webpack://jupyterhub-admin-react/./src/Store.js?"); /***/ }), @@ -95,7 +95,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var recompose__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! recompose */ \"./node_modules/recompose/dist/Recompose.esm.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/esm/react-router-dom.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _util_jhapiUtil__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../util/jhapiUtil */ \"./src/util/jhapiUtil.js\");\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _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.\"); }\n\nfunction _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); }\n\nfunction _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; }\n\nfunction _iterableToArrayLimit(arr, i) { if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\n\n\n\n\n\n\n\nvar AddUser = function AddUser(props) {\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState2 = _slicedToArray(_useState, 2),\n users = _useState2[0],\n setUsers = _useState2[1],\n _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n admin = _useState4[0],\n setAdmin = _useState4[1],\n limit = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(function (state) {\n return state.limit;\n });\n\n var dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useDispatch)();\n\n var dispatchPageChange = function dispatchPageChange(data, page) {\n dispatch({\n type: \"USER_PAGE\",\n value: {\n data: data,\n page: page\n }\n });\n };\n\n var addUsers = props.addUsers,\n failRegexEvent = props.failRegexEvent,\n updateUsers = props.updateUsers,\n history = props.history;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"container\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"row\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"col-md-10 col-md-offset-1 col-lg-8 col-lg-offset-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"panel panel-default\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"panel-heading\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"h4\", null, \"Add Users\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"panel-body\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"form\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"form-group\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"textarea\", {\n className: \"form-control\",\n id: \"add-user-textarea\",\n rows: \"3\",\n placeholder: \"usernames separated by line\",\n onBlur: function onBlur(e) {\n var split_users = e.target.value.split(\"\\n\");\n setUsers(split_users);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"input\", {\n className: \"form-check-input\",\n type: \"checkbox\",\n value: \"\",\n id: \"admin-check\",\n onChange: function onChange(e) {\n return setAdmin(e.target.checked);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"span\", null, \" \"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"label\", {\n className: \"form-check-label\"\n }, \"Admin\")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"panel-footer\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"button\", {\n id: \"return\",\n className: \"btn btn-light\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_5__.Link, {\n to: \"/\"\n }, \"Back\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"span\", null, \" \"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"button\", {\n id: \"submit\",\n className: \"btn btn-primary\",\n onClick: function onClick() {\n var filtered_users = users.filter(function (e) {\n return e.length > 2 && /[!@#$%^&*(),.?\":{}|<>]/g.test(e) == false;\n });\n\n if (filtered_users.length < users.length) {\n var removed_users = users.filter(function (e) {\n return !filtered_users.includes(e);\n });\n setUsers(filtered_users);\n failRegexEvent();\n }\n\n addUsers(filtered_users, admin).then(function () {\n return updateUsers(0, limit).then(function (data) {\n return dispatchPageChange(data, 0);\n }).then(function () {\n return history.push(\"/\");\n })[\"catch\"](function (err) {\n return console.log(err);\n });\n })[\"catch\"](function (err) {\n return console.log(err);\n });\n }\n }, \"Add Users\")))))));\n};\n\nAddUser.propTypes = {\n addUsers: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n failRegexEvent: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n updateUsers: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n history: prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n push: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n })\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AddUser);\n\n//# sourceURL=webpack://jupyterhub-admin-react/./src/components/AddUser/AddUser.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var recompose__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! recompose */ \"./node_modules/recompose/dist/Recompose.esm.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/esm/react-router-dom.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _util_jhapiUtil__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../util/jhapiUtil */ \"./src/util/jhapiUtil.js\");\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _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.\"); }\n\nfunction _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); }\n\nfunction _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; }\n\nfunction _iterableToArrayLimit(arr, i) { if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\n\n\n\n\n\n\n\nvar AddUser = function AddUser(props) {\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState2 = _slicedToArray(_useState, 2),\n users = _useState2[0],\n setUsers = _useState2[1],\n _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n admin = _useState4[0],\n setAdmin = _useState4[1],\n _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState6 = _slicedToArray(_useState5, 2),\n errorAlert = _useState6[0],\n setErrorAlert = _useState6[1],\n limit = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(function (state) {\n return state.limit;\n });\n\n var dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useDispatch)();\n\n var dispatchPageChange = function dispatchPageChange(data, page) {\n dispatch({\n type: \"USER_PAGE\",\n value: {\n data: data,\n page: page\n }\n });\n };\n\n var addUsers = props.addUsers,\n failRegexEvent = props.failRegexEvent,\n updateUsers = props.updateUsers,\n history = props.history;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"container\"\n }, errorAlert != null ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"row\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"col-md-10 col-md-offset-1 col-lg-8 col-lg-offset-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"alert alert-danger\"\n }, errorAlert))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"row\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"col-md-10 col-md-offset-1 col-lg-8 col-lg-offset-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"panel panel-default\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"panel-heading\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"h4\", null, \"Add Users\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"panel-body\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"form\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"form-group\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"textarea\", {\n className: \"form-control\",\n id: \"add-user-textarea\",\n rows: \"3\",\n placeholder: \"usernames separated by line\",\n onBlur: function onBlur(e) {\n var split_users = e.target.value.split(\"\\n\");\n setUsers(split_users);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"input\", {\n className: \"form-check-input\",\n type: \"checkbox\",\n value: \"\",\n id: \"admin-check\",\n onChange: function onChange(e) {\n return setAdmin(e.target.checked);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"span\", null, \" \"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"label\", {\n className: \"form-check-label\"\n }, \"Admin\")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"panel-footer\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"button\", {\n id: \"return\",\n className: \"btn btn-light\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_5__.Link, {\n to: \"/\"\n }, \"Back\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"span\", null, \" \"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"button\", {\n id: \"submit\",\n className: \"btn btn-primary\",\n onClick: function onClick() {\n var filtered_users = users.filter(function (e) {\n return e.length > 2 && /[!@#$%^&*(),.?\":{}|<>]/g.test(e) == false;\n });\n\n if (filtered_users.length < users.length) {\n var removed_users = users.filter(function (e) {\n return !filtered_users.includes(e);\n });\n setUsers(filtered_users);\n failRegexEvent();\n }\n\n addUsers(filtered_users, admin).then(function (data) {\n return data.status < 300 ? updateUsers(0, limit).then(function (data) {\n return dispatchPageChange(data, 0);\n }).then(function () {\n return history.push(\"/\");\n })[\"catch\"](function (err) {\n return console.log(err);\n }) : setErrorAlert(\"[\".concat(data.status, \"] Failed to create user. \").concat(data.status == 409 ? \"User already exists.\" : \"\"));\n })[\"catch\"](function (err) {\n return console.log(err);\n });\n }\n }, \"Add Users\")))))));\n};\n\nAddUser.propTypes = {\n addUsers: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n failRegexEvent: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n updateUsers: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n history: prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n push: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n })\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AddUser);\n\n//# sourceURL=webpack://jupyterhub-admin-react/./src/components/AddUser/AddUser.jsx?"); /***/ }), @@ -110,7 +110,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/esm/react-router-dom.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _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.\"); }\n\nfunction _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); }\n\nfunction _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; }\n\nfunction _iterableToArrayLimit(arr, i) { if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\n\n\n\n\n\nvar CreateGroup = function CreateGroup(props) {\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"),\n _useState2 = _slicedToArray(_useState, 2),\n groupName = _useState2[0],\n setGroupName = _useState2[1],\n limit = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(function (state) {\n return state.limit;\n });\n\n var dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useDispatch)();\n\n var dispatchPageUpdate = function dispatchPageUpdate(data, page) {\n dispatch({\n type: \"GROUPS_DATA\",\n value: {\n data: data,\n page: page\n }\n });\n };\n\n var createGroup = props.createGroup,\n updateGroups = props.updateGroups,\n history = props.history;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"container\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"row\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"col-md-10 col-md-offset-1 col-lg-8 col-lg-offset-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"panel panel-default\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"panel-heading\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"h4\", null, \"Create Group\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"panel-body\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"input-group\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"input\", {\n className: \"group-name-input\",\n type: \"text\",\n id: \"group-name\",\n value: groupName,\n placeholder: \"group name...\",\n onChange: function onChange(e) {\n setGroupName(e.target.value);\n }\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"panel-footer\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"button\", {\n id: \"return\",\n className: \"btn btn-light\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_3__.Link, {\n to: \"/\"\n }, \"Back\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"span\", null, \" \"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"button\", {\n id: \"submit\",\n className: \"btn btn-primary\",\n onClick: function onClick() {\n createGroup(groupName).then(updateGroups(0, limit).then(function (data) {\n return dispatchPageUpdate(data, 0);\n }).then(history.push(\"/groups\"))[\"catch\"](function (err) {\n return console.log(err);\n }))[\"catch\"](function (err) {\n return console.log(err);\n });\n }\n }, \"Create\")))))));\n};\n\nCreateGroup.propTypes = {\n createGroup: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n updateGroups: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n failRegexEvent: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n history: prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n push: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func)\n })\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CreateGroup);\n\n//# sourceURL=webpack://jupyterhub-admin-react/./src/components/CreateGroup/CreateGroup.jsx?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => __WEBPACK_DEFAULT_EXPORT__\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/esm/react-router-dom.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _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.\"); }\n\nfunction _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); }\n\nfunction _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; }\n\nfunction _iterableToArrayLimit(arr, i) { if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\n\n\n\n\n\nvar CreateGroup = function CreateGroup(props) {\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"),\n _useState2 = _slicedToArray(_useState, 2),\n groupName = _useState2[0],\n setGroupName = _useState2[1],\n _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState4 = _slicedToArray(_useState3, 2),\n errorAlert = _useState4[0],\n setErrorAlert = _useState4[1],\n limit = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useSelector)(function (state) {\n return state.limit;\n });\n\n var dispatch = (0,react_redux__WEBPACK_IMPORTED_MODULE_1__.useDispatch)();\n\n var dispatchPageUpdate = function dispatchPageUpdate(data, page) {\n dispatch({\n type: \"GROUPS_PAGE\",\n value: {\n data: data,\n page: page\n }\n });\n };\n\n var createGroup = props.createGroup,\n updateGroups = props.updateGroups,\n history = props.history;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"container\"\n }, errorAlert != null ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"row\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"col-md-10 col-md-offset-1 col-lg-8 col-lg-offset-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"alert alert-danger\"\n }, errorAlert))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"row\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"col-md-10 col-md-offset-1 col-lg-8 col-lg-offset-2\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"panel panel-default\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"panel-heading\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"h4\", null, \"Create Group\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"panel-body\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"input-group\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"input\", {\n className: \"group-name-input\",\n type: \"text\",\n id: \"group-name\",\n value: groupName,\n placeholder: \"group name...\",\n onChange: function onChange(e) {\n setGroupName(e.target.value);\n }\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"panel-footer\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"button\", {\n id: \"return\",\n className: \"btn btn-light\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_3__.Link, {\n to: \"/\"\n }, \"Back\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"span\", null, \" \"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"button\", {\n id: \"submit\",\n className: \"btn btn-primary\",\n onClick: function onClick() {\n createGroup(groupName).then(function (data) {\n return data.status < 300 ? updateGroups(0, limit).then(function (data) {\n return dispatchPageUpdate(data, 0);\n }).then(function (data) {\n return history.push(\"/groups\");\n })[\"catch\"](function (err) {\n return console.log(err);\n }) : setErrorAlert(\"[\".concat(data.status, \"] Failed to create group. \").concat(data.status == 409 ? \"Group already exists.\" : \"\"));\n })[\"catch\"](function (err) {\n return console.log(err);\n });\n }\n }, \"Create\")))))));\n};\n\nCreateGroup.propTypes = {\n createGroup: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n updateGroups: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n failRegexEvent: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n history: prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n push: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func)\n })\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CreateGroup);\n\n//# sourceURL=webpack://jupyterhub-admin-react/./src/components/CreateGroup/CreateGroup.jsx?"); /***/ }), @@ -3379,7 +3379,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /******/ /******/ /* webpack/runtime/getFullHash */ /******/ (() => { -/******/ __webpack_require__.h = () => "d06ae54567193c32db57" +/******/ __webpack_require__.h = () => "019ee51ab6860db1a020" /******/ })(); /******/ /******/ /* webpack/runtime/global */