diff --git a/jsx/.eslintrc.json b/jsx/.eslintrc.json
new file mode 100644
index 00000000..b7064bb1
--- /dev/null
+++ b/jsx/.eslintrc.json
@@ -0,0 +1,41 @@
+{
+ "extends": [
+ "plugin:react/recommended"
+ ],
+ "parserOptions": {
+ "ecmaVersion": 6,
+ "sourceType": "module",
+ "ecmaFeatures": {
+ "jsx": true
+ }
+ },
+ "settings": {
+ "react": {
+ "version": "detect"
+ }
+ },
+ "plugins": [
+ "eslint-plugin-react",
+ "prettier"
+ ],
+ "env": {
+ "es6": true,
+ "browser": true
+ },
+ "rules": {
+ "semi": "off",
+ "quotes": "off",
+ "prettier/prettier": "warn"
+ },
+ "overrides": [
+ {
+ "files": [
+ "**/*.test.js",
+ "**/*.test.jsx"
+ ],
+ "env": {
+ "jest": true
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/jsx/build/admin-react.js b/jsx/build/admin-react.js
index dd415f99..334a7658 100644
--- a/jsx/build/admin-react.js
+++ b/jsx/build/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_11__ = __webpack_require__(/*! redux */ \"./node_modules/redux/es/redux.js\");\n/* harmony import */ var _Store__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Store */ \"./src/Store.js\");\n/* harmony import */ var _util_jhapiUtil__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util/jhapiUtil */ \"./src/util/jhapiUtil.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_13__ = __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_14__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/esm/react-router.js\");\n/* harmony import */ var history__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! history */ \"./node_modules/history/index.js\");\n/* harmony import */ var _components_ServerDashboard_ServerDashboard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/ServerDashboard/ServerDashboard */ \"./src/components/ServerDashboard/ServerDashboard.js\");\n/* harmony import */ var _components_Groups_Groups__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/Groups/Groups */ \"./src/components/Groups/Groups.js\");\n/* harmony import */ var _components_GroupEdit_GroupEdit__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/GroupEdit/GroupEdit */ \"./src/components/GroupEdit/GroupEdit.js\");\n/* harmony import */ var _components_AddUser_AddUser__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./components/AddUser/AddUser */ \"./src/components/AddUser/AddUser.js\");\n/* harmony import */ var _components_EditUser_EditUser__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./components/EditUser/EditUser */ \"./src/components/EditUser/EditUser.js\");\n/* harmony import */ var _style_root_css__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./style/root.css */ \"./src/style/root.css\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar store = (0,redux__WEBPACK_IMPORTED_MODULE_11__.createStore)(_Store__WEBPACK_IMPORTED_MODULE_3__.reducers, _Store__WEBPACK_IMPORTED_MODULE_3__.initialState),\n routerHistory = (0,history__WEBPACK_IMPORTED_MODULE_12__.createBrowserHistory)();\n\nvar App = /*#__PURE__*/function (_Component) {\n _inherits(App, _Component);\n\n var _super = _createSuper(App);\n\n function App() {\n _classCallCheck(this, App);\n\n return _super.apply(this, arguments);\n }\n\n _createClass(App, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n (0,_util_jhapiUtil__WEBPACK_IMPORTED_MODULE_4__.jhapiRequest)(\"/users\", \"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_4__.jhapiRequest)(\"/groups\", \"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 }, {\n key: \"render\",\n value: function render() {\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_13__.HashRouter, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_14__.Switch, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_14__.Route, {\n exact: true,\n path: \"/\",\n component: _components_ServerDashboard_ServerDashboard__WEBPACK_IMPORTED_MODULE_5__.default\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_14__.Route, {\n exact: true,\n path: \"/groups\",\n component: _components_Groups_Groups__WEBPACK_IMPORTED_MODULE_6__.default\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_14__.Route, {\n exact: true,\n path: \"/group-edit\",\n component: _components_GroupEdit_GroupEdit__WEBPACK_IMPORTED_MODULE_7__.default\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_14__.Route, {\n exact: true,\n path: \"/add-users\",\n component: _components_AddUser_AddUser__WEBPACK_IMPORTED_MODULE_8__.default\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_14__.Route, {\n exact: true,\n path: \"/edit-user\",\n component: _components_EditUser_EditUser__WEBPACK_IMPORTED_MODULE_9__.default\n })))));\n }\n }]);\n\n return App;\n}(react__WEBPACK_IMPORTED_MODULE_0__.Component);\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_12__ = __webpack_require__(/*! redux */ \"./node_modules/redux/es/redux.js\");\n/* harmony import */ var _Store__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Store */ \"./src/Store.js\");\n/* harmony import */ var _util_jhapiUtil__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util/jhapiUtil */ \"./src/util/jhapiUtil.js\");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_14__ = __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_15__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router/esm/react-router.js\");\n/* harmony import */ var history__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! history */ \"./node_modules/history/index.js\");\n/* harmony import */ var _components_ServerDashboard_ServerDashboard__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/ServerDashboard/ServerDashboard */ \"./src/components/ServerDashboard/ServerDashboard.js\");\n/* harmony import */ var _components_Groups_Groups__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/Groups/Groups */ \"./src/components/Groups/Groups.js\");\n/* harmony import */ var _components_GroupEdit_GroupEdit__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/GroupEdit/GroupEdit */ \"./src/components/GroupEdit/GroupEdit.js\");\n/* harmony import */ var _components_CreateGroup_CreateGroup__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./components/CreateGroup/CreateGroup */ \"./src/components/CreateGroup/CreateGroup.js\");\n/* harmony import */ var _components_AddUser_AddUser__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./components/AddUser/AddUser */ \"./src/components/AddUser/AddUser.js\");\n/* harmony import */ var _components_EditUser_EditUser__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./components/EditUser/EditUser */ \"./src/components/EditUser/EditUser.js\");\n/* harmony import */ var _style_root_css__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./style/root.css */ \"./src/style/root.css\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar store = (0,redux__WEBPACK_IMPORTED_MODULE_12__.createStore)(_Store__WEBPACK_IMPORTED_MODULE_3__.reducers, _Store__WEBPACK_IMPORTED_MODULE_3__.initialState),\n routerHistory = (0,history__WEBPACK_IMPORTED_MODULE_13__.createBrowserHistory)();\n\nvar App = /*#__PURE__*/function (_Component) {\n _inherits(App, _Component);\n\n var _super = _createSuper(App);\n\n function App() {\n _classCallCheck(this, App);\n\n return _super.apply(this, arguments);\n }\n\n _createClass(App, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n (0,_util_jhapiUtil__WEBPACK_IMPORTED_MODULE_4__.jhapiRequest)(\"/users\", \"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_4__.jhapiRequest)(\"/groups\", \"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 }, {\n key: \"render\",\n value: function render() {\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_14__.HashRouter, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_15__.Switch, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_15__.Route, {\n exact: true,\n path: \"/\",\n component: _components_ServerDashboard_ServerDashboard__WEBPACK_IMPORTED_MODULE_5__.default\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_15__.Route, {\n exact: true,\n path: \"/groups\",\n component: _components_Groups_Groups__WEBPACK_IMPORTED_MODULE_6__.default\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_15__.Route, {\n exact: true,\n path: \"/group-edit\",\n component: _components_GroupEdit_GroupEdit__WEBPACK_IMPORTED_MODULE_7__.default\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_15__.Route, {\n exact: true,\n path: \"/create-group\",\n component: _components_CreateGroup_CreateGroup__WEBPACK_IMPORTED_MODULE_8__.default\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_15__.Route, {\n exact: true,\n path: \"/add-users\",\n component: _components_AddUser_AddUser__WEBPACK_IMPORTED_MODULE_9__.default\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_15__.Route, {\n exact: true,\n path: \"/edit-user\",\n component: _components_EditUser_EditUser__WEBPACK_IMPORTED_MODULE_10__.default\n })))));\n }\n }]);\n\n return App;\n}(react__WEBPACK_IMPORTED_MODULE_0__.Component);\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?");
/***/ }),
@@ -114,6 +114,36 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
/***/ }),
+/***/ "./src/components/CreateGroup/CreateGroup.js":
+/*!***************************************************!*\
+ !*** ./src/components/CreateGroup/CreateGroup.js ***!
+ \***************************************************/
+/*! namespace exports */
+/*! export default [provided] [no usage info] [missing usage info prevents renaming] */
+/*! other exports [not provided] [no usage info] */
+/*! runtime requirements: __webpack_require__, __webpack_exports__, __webpack_require__.r, __webpack_require__.d, __webpack_require__.* */
+/***/ ((__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_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var recompose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! recompose */ \"./node_modules/recompose/dist/Recompose.esm.js\");\n/* harmony import */ var _util_jhapiUtil__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../util/jhapiUtil */ \"./src/util/jhapiUtil.js\");\n/* harmony import */ var _CreateGroup_pre__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./CreateGroup.pre */ \"./src/components/CreateGroup/CreateGroup.pre.jsx\");\n\n\n\n\nvar withUserAPI = (0,recompose__WEBPACK_IMPORTED_MODULE_1__.withProps)(function (props) {\n return {\n createGroup: function createGroup(groupName) {\n return (0,_util_jhapiUtil__WEBPACK_IMPORTED_MODULE_2__.jhapiRequest)(\"/groups/\" + groupName, \"POST\");\n },\n failRegexEvent: function failRegexEvent() {\n return alert(\"Removed \" + JSON.stringify(removed_users) + \" for either containing special characters or being too short.\");\n },\n refreshGroupsData: function refreshGroupsData() {\n return (0,_util_jhapiUtil__WEBPACK_IMPORTED_MODULE_2__.jhapiRequest)(\"/groups\", \"GET\").then(function (data) {\n return data.json();\n }).then(function (data) {\n return props.dispatch({\n type: \"GROUPS_DATA\",\n value: data\n });\n });\n }\n };\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,recompose__WEBPACK_IMPORTED_MODULE_1__.compose)((0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(), withUserAPI)(_CreateGroup_pre__WEBPACK_IMPORTED_MODULE_3__.CreateGroup));\n\n//# sourceURL=webpack://jupyterhub-admin-react/./src/components/CreateGroup/CreateGroup.js?");
+
+/***/ }),
+
+/***/ "./src/components/CreateGroup/CreateGroup.pre.jsx":
+/*!********************************************************!*\
+ !*** ./src/components/CreateGroup/CreateGroup.pre.jsx ***!
+ \********************************************************/
+/*! namespace exports */
+/*! export CreateGroup [provided] [no usage info] [missing usage info prevents renaming] */
+/*! other exports [not provided] [no usage info] */
+/*! runtime requirements: __webpack_require__, __webpack_require__.n, __webpack_require__.r, __webpack_exports__, __webpack_require__.d, __webpack_require__.* */
+/***/ ((__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 */ \"CreateGroup\": () => /* binding */ CreateGroup\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_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_1__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _Multiselect_Multiselect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Multiselect/Multiselect */ \"./src/components/Multiselect/Multiselect.jsx\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\nvar CreateGroup = /*#__PURE__*/function (_Component) {\n _inherits(CreateGroup, _Component);\n\n var _super = _createSuper(CreateGroup);\n\n _createClass(CreateGroup, null, [{\n key: \"propTypes\",\n get: function get() {\n return {\n createGroup: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n refreshGroupsData: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n failRegexEvent: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n history: prop_types__WEBPACK_IMPORTED_MODULE_1___default().shape({\n push: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func)\n })\n };\n }\n }]);\n\n function CreateGroup(props) {\n var _this;\n\n _classCallCheck(this, CreateGroup);\n\n _this = _super.call(this, props);\n _this.state = {\n groupName: \"\"\n };\n return _this;\n }\n\n _createClass(CreateGroup, [{\n key: \"render\",\n value: function render() {\n var _this2 = this;\n\n var _this$props = this.props,\n createGroup = _this$props.createGroup,\n refreshGroupsData = _this$props.refreshGroupsData;\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 value: this.state.groupName,\n id: \"group-name\",\n placeholder: \"group name...\",\n onChange: function onChange(e) {\n console.log(e.target.value);\n\n _this2.setState({\n groupName: e.target.value\n });\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 var groupName = _this2.state.groupName;\n createGroup(groupName).then(refreshGroupsData()).then(_this2.props.history.push(\"/groups\"))[\"catch\"](function (err) {\n return console.log(err);\n });\n }\n }, \"Add Users\")))))));\n }\n }]);\n\n return CreateGroup;\n}(react__WEBPACK_IMPORTED_MODULE_0__.Component);\n\n//# sourceURL=webpack://jupyterhub-admin-react/./src/components/CreateGroup/CreateGroup.pre.jsx?");
+
+/***/ }),
+
/***/ "./src/components/EditUser/EditUser.js":
/*!*********************************************!*\
!*** ./src/components/EditUser/EditUser.js ***!
@@ -155,7 +185,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_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var recompose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! recompose */ \"./node_modules/recompose/dist/Recompose.esm.js\");\n/* harmony import */ var _util_jhapiUtil__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../util/jhapiUtil */ \"./src/util/jhapiUtil.js\");\n/* harmony import */ var _GroupEdit_pre__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GroupEdit.pre */ \"./src/components/GroupEdit/GroupEdit.pre.jsx\");\n\n\n\n\nvar withGroupsAPI = (0,recompose__WEBPACK_IMPORTED_MODULE_1__.withProps)(function (props) {\n return {\n addToGroup: function addToGroup(users, groupname) {\n return (0,_util_jhapiUtil__WEBPACK_IMPORTED_MODULE_2__.jhapiRequest)(\"/groups/\" + groupname + \"/users\", \"POST\", {\n users: users\n });\n },\n removeFromGroup: function removeFromGroup(users, groupname) {\n return (0,_util_jhapiUtil__WEBPACK_IMPORTED_MODULE_2__.jhapiRequest)(\"/groups/\" + groupname + \"/users\", \"DELETE\", {\n users: users\n });\n }\n };\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,recompose__WEBPACK_IMPORTED_MODULE_1__.compose)((0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(), withGroupsAPI)(_GroupEdit_pre__WEBPACK_IMPORTED_MODULE_3__.GroupEdit));\n\n//# sourceURL=webpack://jupyterhub-admin-react/./src/components/GroupEdit/GroupEdit.js?");
+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_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-redux */ \"./node_modules/react-redux/es/index.js\");\n/* harmony import */ var recompose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! recompose */ \"./node_modules/recompose/dist/Recompose.esm.js\");\n/* harmony import */ var _util_jhapiUtil__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../util/jhapiUtil */ \"./src/util/jhapiUtil.js\");\n/* harmony import */ var _GroupEdit_pre__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./GroupEdit.pre */ \"./src/components/GroupEdit/GroupEdit.pre.jsx\");\n\n\n\n\nvar withGroupsAPI = (0,recompose__WEBPACK_IMPORTED_MODULE_1__.withProps)(function (props) {\n return {\n addToGroup: function addToGroup(users, groupname) {\n return (0,_util_jhapiUtil__WEBPACK_IMPORTED_MODULE_2__.jhapiRequest)(\"/groups/\" + groupname + \"/users\", \"POST\", {\n users: users\n });\n },\n removeFromGroup: function removeFromGroup(users, groupname) {\n return (0,_util_jhapiUtil__WEBPACK_IMPORTED_MODULE_2__.jhapiRequest)(\"/groups/\" + groupname + \"/users\", \"DELETE\", {\n users: users\n });\n },\n deleteGroup: function deleteGroup(name) {\n return (0,_util_jhapiUtil__WEBPACK_IMPORTED_MODULE_2__.jhapiRequest)(\"/groups/\" + name, \"DELETE\");\n },\n refreshGroupsData: function refreshGroupsData() {\n return (0,_util_jhapiUtil__WEBPACK_IMPORTED_MODULE_2__.jhapiRequest)(\"/groups\", \"GET\").then(function (data) {\n return data.json();\n }).then(function (data) {\n return props.dispatch({\n type: \"GROUPS_DATA\",\n value: data\n });\n });\n }\n };\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,recompose__WEBPACK_IMPORTED_MODULE_1__.compose)((0,react_redux__WEBPACK_IMPORTED_MODULE_0__.connect)(), withGroupsAPI)(_GroupEdit_pre__WEBPACK_IMPORTED_MODULE_3__.GroupEdit));\n\n//# sourceURL=webpack://jupyterhub-admin-react/./src/components/GroupEdit/GroupEdit.js?");
/***/ }),
@@ -170,7 +200,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 */ \"GroupEdit\": () => /* binding */ GroupEdit\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_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 _Multiselect_Multiselect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Multiselect/Multiselect */ \"./src/components/Multiselect/Multiselect.jsx\");\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 _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\nvar GroupEdit = /*#__PURE__*/function (_Component) {\n _inherits(GroupEdit, _Component);\n\n var _super = _createSuper(GroupEdit);\n\n _createClass(GroupEdit, null, [{\n key: \"propTypes\",\n get: function get() {\n return {\n location: prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n state: prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n group_data: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\n user_data: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array),\n callback: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func)\n })\n }),\n history: prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n push: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func)\n }),\n addToGroup: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n removeFromGroup: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func)\n };\n }\n }]);\n\n function GroupEdit(props) {\n var _this;\n\n _classCallCheck(this, GroupEdit);\n\n _this = _super.call(this, props);\n _this.state = {\n selected: [],\n changed: false,\n added: undefined,\n removed: undefined\n };\n return _this;\n }\n\n _createClass(GroupEdit, [{\n key: \"render\",\n value: function render() {\n var _this2 = this;\n\n if (!this.props.location.state) {\n this.props.history.push(\"/groups\");\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null);\n }\n\n var _this$props$location$ = this.props.location.state,\n group_data = _this$props$location$.group_data,\n user_data = _this$props$location$.user_data,\n callback = _this$props$location$.callback;\n var _this$props = this.props,\n addToGroup = _this$props.addToGroup,\n removeFromGroup = _this$props.removeFromGroup;\n if (!(group_data && user_data)) return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", null);\n return /*#__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(\"h3\", null, \"Editing Group \", group_data.name), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"alert alert-info\"\n }, \"Select group members\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_Multiselect_Multiselect__WEBPACK_IMPORTED_MODULE_1__.default, {\n options: user_data.map(function (e) {\n return e.name;\n }),\n value: group_data.users,\n onChange: function onChange(selection, options) {\n _this2.setState({\n selected: selection,\n changed: true\n });\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"br\", null), /*#__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: \"/groups\"\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 // check for changes\n if (!_this2.state.changed) {\n _this2.props.history.push(\"/groups\");\n\n return;\n }\n\n var new_users = _this2.state.selected.filter(function (e) {\n return !group_data.users.includes(e);\n });\n\n var removed_users = group_data.users.filter(function (e) {\n return !_this2.state.selected.includes(e);\n });\n\n _this2.setState(Object.assign({}, _this2.state, {\n added: new_users,\n removed: removed_users\n }));\n\n var promiseQueue = [];\n if (new_users.length > 0) promiseQueue.push(addToGroup(new_users, group_data.name));\n if (removed_users.length > 0) promiseQueue.push(removeFromGroup(removed_users, group_data.name));\n Promise.all(promiseQueue).then(function (e) {\n return callback();\n })[\"catch\"](function (err) {\n return console.log(err);\n });\n\n _this2.props.history.push(\"/groups\");\n }\n }, \"Apply\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"br\", null))));\n }\n }]);\n\n return GroupEdit;\n}(react__WEBPACK_IMPORTED_MODULE_0__.Component);\n\n//# sourceURL=webpack://jupyterhub-admin-react/./src/components/GroupEdit/GroupEdit.pre.jsx?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"GroupEdit\": () => /* binding */ GroupEdit\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_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 _Multiselect_Multiselect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Multiselect/Multiselect */ \"./src/components/Multiselect/Multiselect.jsx\");\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 _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\nvar GroupEdit = /*#__PURE__*/function (_Component) {\n _inherits(GroupEdit, _Component);\n\n var _super = _createSuper(GroupEdit);\n\n _createClass(GroupEdit, null, [{\n key: \"propTypes\",\n get: function get() {\n return {\n location: prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n state: prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n group_data: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\n user_data: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array),\n callback: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func)\n })\n }),\n history: prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n push: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func)\n }),\n addToGroup: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n removeFromGroup: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n deleteGroup: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func)\n };\n }\n }]);\n\n function GroupEdit(props) {\n var _this;\n\n _classCallCheck(this, GroupEdit);\n\n _this = _super.call(this, props);\n _this.state = {\n selected: [],\n changed: false,\n added: undefined,\n removed: undefined\n };\n return _this;\n }\n\n _createClass(GroupEdit, [{\n key: \"render\",\n value: function render() {\n var _this2 = this;\n\n if (!this.props.location.state) {\n this.props.history.push(\"/groups\");\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null);\n }\n\n var _this$props$location$ = this.props.location.state,\n group_data = _this$props$location$.group_data,\n user_data = _this$props$location$.user_data,\n callback = _this$props$location$.callback;\n var _this$props = this.props,\n addToGroup = _this$props.addToGroup,\n removeFromGroup = _this$props.removeFromGroup,\n deleteGroup = _this$props.deleteGroup,\n refreshGroupsData = _this$props.refreshGroupsData;\n if (!(group_data && user_data)) return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", null);\n return /*#__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(\"h3\", null, \"Editing Group \", group_data.name), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"alert alert-info\"\n }, \"Select group members\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_Multiselect_Multiselect__WEBPACK_IMPORTED_MODULE_1__.default, {\n options: user_data.map(function (e) {\n return e.name;\n }),\n value: group_data.users,\n onChange: function onChange(selection, options) {\n _this2.setState({\n selected: selection,\n changed: true\n });\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"br\", null), /*#__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: \"/groups\"\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 // check for changes\n if (!_this2.state.changed) {\n _this2.props.history.push(\"/groups\");\n\n return;\n }\n\n var new_users = _this2.state.selected.filter(function (e) {\n return !group_data.users.includes(e);\n });\n\n var removed_users = group_data.users.filter(function (e) {\n return !_this2.state.selected.includes(e);\n });\n\n _this2.setState(Object.assign({}, _this2.state, {\n added: new_users,\n removed: removed_users\n }));\n\n var promiseQueue = [];\n if (new_users.length > 0) promiseQueue.push(addToGroup(new_users, group_data.name));\n if (removed_users.length > 0) promiseQueue.push(removeFromGroup(removed_users, group_data.name));\n Promise.all(promiseQueue).then(function (e) {\n return callback();\n })[\"catch\"](function (err) {\n return console.log(err);\n });\n\n _this2.props.history.push(\"/groups\");\n }\n }, \"Apply\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"button\", {\n className: \"btn btn-danger\",\n style: {\n \"float\": \"right\"\n },\n onClick: function onClick() {\n var groupName = group_data.name;\n deleteGroup(groupName).then(refreshGroupsData()).then(_this2.props.history.push(\"/groups\"))[\"catch\"](function (err) {\n return console.log(err);\n });\n }\n }, \"Delete Group\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"br\", null))));\n }\n }]);\n\n return GroupEdit;\n}(react__WEBPACK_IMPORTED_MODULE_0__.Component);\n\n//# sourceURL=webpack://jupyterhub-admin-react/./src/components/GroupEdit/GroupEdit.pre.jsx?");
/***/ }),
@@ -200,7 +230,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 */ \"Groups\": () => /* binding */ Groups\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_router_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/esm/react-router-dom.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\nvar Groups = /*#__PURE__*/function (_Component) {\n _inherits(Groups, _Component);\n\n var _super = _createSuper(Groups);\n\n _createClass(Groups, null, [{\n key: \"propTypes\",\n get: function get() {\n return {\n user_data: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().array),\n groups_data: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().array),\n refreshUserData: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n refreshGroupsData: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func)\n };\n }\n }]);\n\n function Groups(props) {\n _classCallCheck(this, Groups);\n\n return _super.call(this, props);\n }\n\n _createClass(Groups, [{\n key: \"render\",\n value: function render() {\n var _this$props = this.props,\n user_data = _this$props.user_data,\n groups_data = _this$props.groups_data,\n refreshGroupsData = _this$props.refreshGroupsData,\n refreshUserData = _this$props.refreshUserData;\n\n if (!groups_data || !user_data) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", null);\n }\n\n return /*#__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-12 col-lg-10 col-lg-offset-1\"\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, \"Groups\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"panel-body\"\n }, groups_data.map(function (e, i) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n key: \"group-edit\" + i,\n className: \"group-edit-link\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"h4\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__.Link, {\n to: {\n pathname: \"/group-edit\",\n state: {\n group_data: e,\n user_data: user_data,\n callback: function callback() {\n refreshGroupsData();\n refreshUserData();\n }\n }\n }\n }, e.name)));\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"panel-footer\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"btn btn-light\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__.Link, {\n to: \"/\"\n }, \"Back\")))))));\n }\n }]);\n\n return Groups;\n}(react__WEBPACK_IMPORTED_MODULE_0__.Component);\n\n//# sourceURL=webpack://jupyterhub-admin-react/./src/components/Groups/Groups.pre.jsx?");
+eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Groups\": () => /* binding */ Groups\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_router_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-router-dom */ \"./node_modules/react-router-dom/esm/react-router-dom.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\nvar Groups = /*#__PURE__*/function (_Component) {\n _inherits(Groups, _Component);\n\n var _super = _createSuper(Groups);\n\n _createClass(Groups, null, [{\n key: \"propTypes\",\n get: function get() {\n return {\n user_data: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().array),\n groups_data: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().array),\n refreshUserData: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n refreshGroupsData: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func)\n };\n }\n }]);\n\n function Groups(props) {\n _classCallCheck(this, Groups);\n\n return _super.call(this, props);\n }\n\n _createClass(Groups, [{\n key: \"render\",\n value: function render() {\n var _this = this;\n\n var _this$props = this.props,\n user_data = _this$props.user_data,\n groups_data = _this$props.groups_data,\n refreshGroupsData = _this$props.refreshGroupsData,\n refreshUserData = _this$props.refreshUserData;\n\n if (!groups_data || !user_data) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", null);\n }\n\n return /*#__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-12 col-lg-10 col-lg-offset-1\"\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, \"Groups\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"panel-body\"\n }, groups_data.length > 0 ? groups_data.map(function (e, i) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n key: \"group-edit\" + i,\n className: \"group-edit-link\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"h4\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__.Link, {\n to: {\n pathname: \"/group-edit\",\n state: {\n group_data: e,\n user_data: user_data,\n callback: function callback() {\n refreshGroupsData();\n refreshUserData();\n }\n }\n }\n }, e.name)));\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"h4\", null, \"no groups created...\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n className: \"panel-footer\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"button\", {\n className: \"btn btn-light adjacent-span-spacing\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__.Link, {\n to: \"/\"\n }, \"Back\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"button\", {\n className: \"btn btn-primary adjacent-span-spacing\",\n onClick: function onClick() {\n _this.props.history.push(\"/create-group\");\n }\n }, \"New Group\"))))));\n }\n }]);\n\n return Groups;\n}(react__WEBPACK_IMPORTED_MODULE_0__.Component);\n\n//# sourceURL=webpack://jupyterhub-admin-react/./src/components/Groups/Groups.pre.jsx?");
/***/ }),
@@ -350,7 +380,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
/***/ ((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 _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__);\n// Imports\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default()(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root {\\n --red: #d7191e,\\n --orange: #f1ad4e,\\n --blue: #2e7ab6,\\n --white: #ffffff,\\n --gray: #f7f7f7\\n}\\n\\n/* Color Classes */\\n.red {\\n background-color: var(--red);\\n}\\n.orange {\\n background-color: var(--orange);\\n}\\n.blue {\\n background-color: var(--blue);\\n}\\n.white {\\n background-color: var(--white);\\n}\\n\\n/* Resets */\\n\\n.resets .modal {\\n display: block;\\n visibility: visible;\\n z-index: 2000\\n}\", \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://jupyterhub-admin-react/./src/style/root.css?./node_modules/css-loader/dist/cjs.js");
+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 _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0__);\n// Imports\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_0___default()(function(i){return i[1]});\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root {\\n --red: #d7191e;\\n --orange: #f1ad4e;\\n --blue: #2e7ab6;\\n --white: #ffffff;\\n --gray: #f7f7f;\\n}\\n\\n/* Color Classes */\\n.red {\\n background-color: var(--red);\\n}\\n.orange {\\n background-color: var(--orange);\\n}\\n.blue {\\n background-color: var(--blue);\\n}\\n.white {\\n background-color: var(--white);\\n}\\n\\n/* Resets */\\n\\n.resets .modal {\\n display: block;\\n visibility: visible;\\n z-index: 2000\\n}\\n\\n/* Global Util Classes */\\n.adjacent-span-spacing {\\n margin-right: 5px;\\n margin-left: 5px;\\n}\", \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://jupyterhub-admin-react/./src/style/root.css?./node_modules/css-loader/dist/cjs.js");
/***/ }),
@@ -3386,7 +3416,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
/******/
/******/ /* webpack/runtime/getFullHash */
/******/ (() => {
-/******/ __webpack_require__.h = () => "89fe0d4a635d103a853a"
+/******/ __webpack_require__.h = () => "cf7cb68db8ca626e6bc6"
/******/ })();
/******/
/******/ /* webpack/runtime/global */
diff --git a/jsx/src/App.jsx b/jsx/src/App.jsx
index 4d420ff1..cfe6b836 100644
--- a/jsx/src/App.jsx
+++ b/jsx/src/App.jsx
@@ -11,6 +11,7 @@ import { createBrowserHistory } from "history";
import ServerDashboard from "./components/ServerDashboard/ServerDashboard";
import Groups from "./components/Groups/Groups";
import GroupEdit from "./components/GroupEdit/GroupEdit";
+import CreateGroup from "./components/CreateGroup/CreateGroup"
import AddUser from "./components/AddUser/AddUser";
import EditUser from "./components/EditUser/EditUser";
@@ -41,6 +42,7 @@ class App extends Component {