{"version":3,"sources":["webpack:///./app/containers/PermissionChecker/RedirectWithoutPermission.js","webpack:///./node_modules/reactstrap/es/FormGroup.js","webpack:///./node_modules/reactstrap/es/FormFeedback.js","webpack:///./app/containers/UserManagement/messages.js","webpack:///./app/components/RolesDisplay/FriendlyScope.js","webpack:///./app/components/RolesDisplay/index.js","webpack:///./app/components/ScopeAssignmentForm/messages.js","webpack:///./app/components/ScopeAssignmentForm/index.js","webpack:///./app/containers/UserManagement/RoleAssignmentForm.js","webpack:///./app/containers/UserManagement/AddEditInviteModal.js","webpack:///./app/containers/UserManagement/selectors.js","webpack:///./app/containers/UserManagement/constants.js","webpack:///./app/containers/UserManagement/actions.js","webpack:///./app/containers/UserManagement/sagas.js","webpack:///./app/containers/UserManagement/reducer.js","webpack:///./app/containers/UserManagement/index.js"],"names":["RedirectWithoutPermission","props","permissions","get","multiPermissions","hasAny","forEach","permission","userHasPermission","permissionName","resourceId","swimlanes","push","to","this","redirectWithoutPermission","Component","defaultProps","withConnect","connect","dispatch","bindActionCreators","compose","permissionChecker","propTypes","children","node","row","bool","check","inline","disabled","tag","className","string","cssModule","object","FormGroup","Tag","attributes","classes","createElement","valid","tooltip","undefined","FormFeedback","validMode","defineMessages","UserTitle","id","defaultMessage","PendingTitle","EditAssignments","CancelInvite","CancellingInvite","ResendInvite","ResendingInvite","InviteUser","AddRoleAssignmentHeader","RoleLable","HidePermissionsLabel","ViewPermissionsLabel","AllowPlatformPermissionsLabel","SelectAllSwimlanes","SelectAllSwimlaneMessage","ScopeLabel","userActivityLink","FriendlyScope","scope","roles","roleSrn","includes","role","List","find","style","fontStyle","isPlatformRole","swimlane","TextLink","color","pathname","search","qs","stringify","srn","RolesDisplay","data","removeRole","Table","marginBottom","borderTop","map","index","title","onClick","ScopeAssignmentForm","scopeInputValue","platformPerm","handleScopeInputChange","handlePlatformPermClick","canSelectAllSwimlanes","isDisabled","scopeOptions","toList","sortBy","toJS","value","label","FormLabel","required","margin","messages","Select","menuPlacement","isClearable","isMulti","options","onChange","checked","newVal","Tooltip","anchor","Icon","fontSize","fa","name","tooltipContent","getSelectedRole","roleOption","console","warn","styles","inlineform","display","gridTemplateColumns","alignItems","RoleAssignmentForm","useState","handleRoleOptionChange","hasNonSwimlanePerms","roleAssignments","user","getIn","filter","assignment","Map","getRoleAssignmentsForUser","userScopes","Set","ass","Object","values","option","selectedRoles","restrictToSwimlanes","platformRoles","swimlaneRoles","userRoleAssignments","allUsers","currentUser","userOrg","getCurrentOrg","specialOrgScope","userHasSpecialOrgScope","idisabled","updatingUserInvite","placeholder","params","onRoleAssignmentSelectionChange","findIndex","selected","concat","getOptionValue","getOptionLabel","gridColumnGap","paddingRight","getRoleLabel","matchingAssignments","length","getValidSwimlaneScopes","Button","thingsToAdd","addToRoleData","_","isEmpty","closeRoleForm","roleData","marginLeft","SectionHeader","small","spin","AddEditInviteModal","table","height","fontWeight","marginTop","banner","width","backgroundColor","setState","existingScopeMsg","newEmail","newName","shouldClear","showRoleForm","scopeGuy","setTimeout","event","state","scopes","showExistingScopeMsg","key","createOption","preventDefault","email","validFormatting","test","isExisting","unavailableEmails","existing","isPending","pending","emailIsValid","emailMsg","bruh","validateEmail","target","guy","inputValue","type","action","rows","api","getSelectedRows","fromJS","quickCheckValidEmail","inviteUser","getOuttaHereDumbos","urCoolLetsAddYa","existingAssignments","existingUser","assState","ea","updatePendingRoleAssignments","remove","add","dabba","prevState","filterNot","isValid","Input","handleEmailChange","invitingUser","invalid","handleNameChange","canViewData","noTitle","size","isDifferent","roleboi","exists","otherguy","debounce","leading","trailing","roleList","clearForm","isOpen","error","toggle","Modal","minWidth","ModalHeader","ModalBody","Error","description","getEditBody","getAddBody","ModalFooter","compareRollyBois","saveInvite","submitInvite","React","mapStateToProps","createStructuredSelector","selectSonraiUserSrn","selectSonraiUsers","selectAllRoles","selectSwimlanes","selectUserManagemenDomain","selectPendingUsers","createSelector","selectFetchingPendingUsers","selectInvitingUser","selectSonraiScopes","selectCancellingUserInvite","selectUpdatingUserInvite","selectResendingUserInvite","selectUserManagementError","FETCH_PENDING_USERS","INVITE_USER","UPDATE_USER_INVITE","RESEND_USER_INVITE","CANCEL_USER_INVITE","FETCH_SONRAI_ROLES","UPDATE_PENDING_ROLE_ASSIGNMENTS","fetchPendingUsers","createAction","fetchPendingUsersSuccess","inviteUserSuccess","updateUserInvite","updateUserInviteSuccess","updatePendingRoleAssignmentsSuccess","resendUserInvite","resendUserInviteSuccess","cancelUserInvite","cancelUserInviteSuccess","fetchSonraiRolesSuccess","setUserManagementError","clearUserManagementError","fetchSonraiRoles","userManagementSaga","CANCEL_SONRAI_INVITE_QUERY","INVITE_USER_MUTATION","client","getClient","query","gql","forceFetch","fetchPolicy","put","users","message","mutate","mutation","variables","input","payload","pendingRoleAssigners","assign","invitedUser","DELETE_PENDING_ROLE_ASSIGNMENT","added","removed","inviteSrn","response","items","errors","deleted","didCancel","pendingGuy","substring","pendingRoleAssignments","takeLatest","initialState","userManagementError","fetchingUsers","fetchingPendingUsers","pendingUsers","cancellingUserInvite","sonraiRoles","sonraiScopes","fetchingSonraiRoles","fetchingSonraiScopes","resendingUserInvite","userManagementReducer","handleActions","set","update","setIn","newAssignments","userIndex","merge","deleteIn","moment","Date","format","HTML5_FMT","DATETIME_LOCAL_MS","pu","SquareLoadingAnimation","UserManagement","container","gridTemplateRows","padding","doubleGuy","searchGuy","keepRight","justifyContent","body","userTable","gridArea","pendingTable","pendingUser","addEditModalIsOpen","assignments","userList","uniques","getUniqueStuff","stripTags","lastLogin","status","uniqueRoles","uniqueScopes","pendingList","invitedDude","dateSent","expiry","viewEdit","cancel","resend","foundUser","THE_GRID","usersLoading","buildUserList","DataTable","onDoubleClickRow","viewUser","autosize","noTableActions","customColumnConfig","headerName","cellRendererFramework","UserWidget","flex","date","hide","setPendingUser","openAddEditModal","existingEmails","pendingEmails","pender","buildPendingList","cantEditAnyUsers","redrawRows","config","aggFunc","WithPermission","viewRoles","cancellingUserInvites","enableRowGroup","menuTabs","suppressMenu","cancelInvite","resendInvite","onLoad","setApi","DynamicFormattedMessage","org","gridTemplateAreas","BorderedCard","renderUserTable","renderPendingUsers","closeModal","getAllEmails","selectSonraiUsersLoading","updatingUserRoles","selectUpdatingUserRoles","withSaga","injectSaga","saga","withReducer","injectReducer","reducer"],"mappings":"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","file":"23.e4f8f43726acd0e217eb.chunk.js","sourcesContent":["import { Component } from 'react'\nimport ImmutablePropTypes from 'react-immutable-proptypes'\nimport PropTypes from 'prop-types'\nimport { compose, bindActionCreators } from 'redux'\nimport { connect } from 'react-redux'\nimport { push } from 'connected-react-router'\nimport permissionChecker from './index'\n\nexport class RedirectWithoutPermission extends Component {\n componentDidMount() {\n this.redirectWithoutPermission()\n }\n\n componentDidUpdate() {\n this.redirectWithoutPermission()\n }\n\n redirectWithoutPermission = () => {\n if (!this.props.permissions.get('loading')) {\n if (this.props.multiPermissions) {\n let hasAny = false\n this.props.multiPermissions.forEach(permission => {\n if (\n this.props.userHasPermission({\n permissionName: permission.permissionName,\n resourceId: permission.resourceId,\n swimlanes: permission.swimlanes,\n })\n ) {\n hasAny = true\n }\n })\n if (!hasAny) {\n this.props.push(this.props.to)\n }\n } else {\n const hasPermission = this.props.userHasPermission({\n permissionName: this.props.permissionName,\n resourceId: this.props.resourceId,\n swimlanes: this.props.swimlanes,\n })\n if (!hasPermission) {\n this.props.push(this.props.to)\n }\n }\n }\n }\n\n render() {\n return null\n }\n}\n\nRedirectWithoutPermission.defaultProps = {\n to: '/App/SolutionCenter',\n}\n\nRedirectWithoutPermission.propTypes = {\n permissions: ImmutablePropTypes.contains({\n loading: PropTypes.bool,\n }).isRequired,\n permissionName: PropTypes.string,\n resourceId: PropTypes.string,\n swimlanes: PropTypes.arrayOf(PropTypes.string),\n\n // if you have multiple permissions, passs it this bad boy\n multiPermissions: PropTypes.arrayOf(\n PropTypes.shape({\n permissionName: PropTypes.string,\n resourceId: PropTypes.string,\n swimlanes: PropTypes.arrayOf(PropTypes.string),\n })\n ),\n // path to redirect to\n to: PropTypes.string,\n\n // userHasPermission populated from permissionChecker hoc\n userHasPermission: PropTypes.func.isRequired,\n\n // ~ bound action creator ~\n push: PropTypes.func.isRequired,\n}\n\nconst withConnect = connect(null, dispatch =>\n bindActionCreators({ push }, dispatch)\n)\n\nexport default compose(\n permissionChecker,\n withConnect\n)(RedirectWithoutPermission)\n","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules, tagPropType } from './utils';\nvar propTypes = {\n children: PropTypes.node,\n row: PropTypes.bool,\n check: PropTypes.bool,\n inline: PropTypes.bool,\n disabled: PropTypes.bool,\n tag: tagPropType,\n className: PropTypes.string,\n cssModule: PropTypes.object\n};\nvar defaultProps = {\n tag: 'div'\n};\n\nvar FormGroup = function FormGroup(props) {\n var className = props.className,\n cssModule = props.cssModule,\n row = props.row,\n disabled = props.disabled,\n check = props.check,\n inline = props.inline,\n Tag = props.tag,\n attributes = _objectWithoutPropertiesLoose(props, [\"className\", \"cssModule\", \"row\", \"disabled\", \"check\", \"inline\", \"tag\"]);\n\n var classes = mapToCssModules(classNames(className, row ? 'row' : false, check ? 'form-check' : 'form-group', check && inline ? 'form-check-inline' : false, check && disabled ? 'disabled' : false), cssModule);\n\n if (Tag === 'fieldset') {\n attributes.disabled = disabled;\n }\n\n return React.createElement(Tag, _extends({}, attributes, {\n className: classes\n }));\n};\n\nFormGroup.propTypes = propTypes;\nFormGroup.defaultProps = defaultProps;\nexport default FormGroup;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules, tagPropType } from './utils';\nvar propTypes = {\n children: PropTypes.node,\n tag: tagPropType,\n className: PropTypes.string,\n cssModule: PropTypes.object,\n valid: PropTypes.bool,\n tooltip: PropTypes.bool\n};\nvar defaultProps = {\n tag: 'div',\n valid: undefined\n};\n\nvar FormFeedback = function FormFeedback(props) {\n var className = props.className,\n cssModule = props.cssModule,\n valid = props.valid,\n tooltip = props.tooltip,\n Tag = props.tag,\n attributes = _objectWithoutPropertiesLoose(props, [\"className\", \"cssModule\", \"valid\", \"tooltip\", \"tag\"]);\n\n var validMode = tooltip ? 'tooltip' : 'feedback';\n var classes = mapToCssModules(classNames(className, valid ? \"valid-\" + validMode : \"invalid-\" + validMode), cssModule);\n return React.createElement(Tag, _extends({}, attributes, {\n className: classes\n }));\n};\n\nFormFeedback.propTypes = propTypes;\nFormFeedback.defaultProps = defaultProps;\nexport default FormFeedback;","import { defineMessages } from 'react-intl'\n\nexport default defineMessages({\n UserTitle: {\n id: 'app.containers.UserManagement.userTitle',\n defaultMessage: 'All Users',\n },\n PendingTitle: {\n id: 'app.containers.UserManagement.pendingTitle',\n defaultMessage: 'Pending User Invitations',\n },\n EditAssignments: {\n id: 'app.containers.UserManagement.editAssignments',\n defaultMessage: 'Edit Role Assignments',\n },\n CancelInvite: {\n id: 'app.containers.UserManagement.cancelInvite',\n defaultMessage: 'Cancel',\n },\n CancellingInvite: {\n id: 'app.containers.UserManagement.cancellingInvite',\n defaultMessage: 'Canceling...',\n },\n ResendInvite: {\n id: 'app.containers.UserManagement.resendInvite',\n defaultMessage: 'Resend Invitation',\n },\n ResendingInvite: {\n id: 'app.containers.UserManagement.resendingInvite',\n defaultMessage: 'Resending...',\n },\n InviteUser: {\n id: 'app.containers.UserManagement.invitedUser',\n defaultMessage: 'Invite User',\n },\n AddRoleAssignmentHeader: {\n id: 'app.containers.UserManagement.AddRoleAssignmentHeader',\n defaultMessage: 'Add Role Assignment',\n },\n RoleLable: {\n id: 'app.containers.UserManagement.RoleLable',\n defaultMessage: 'Role',\n },\n HidePermissionsLabel: {\n id: 'app.containers.UserManagement.ViewPermissionsLabel',\n defaultMessage: 'hide permissions',\n },\n ViewPermissionsLabel: {\n id: 'app.containers.UserManagement.ViewPermissionsLabel',\n defaultMessage: 'view permissions',\n },\n AllowPlatformPermissionsLabel: {\n id: 'app.containers.UserManagement.AllowPlatformPermissionsLabel',\n defaultMessage: 'Allow Platform Permissions',\n },\n SelectAllSwimlanes: {\n id: 'app.containers.UserManagement.SelectAllSwimlanes',\n defaultMessage: 'All Swimlanes',\n },\n SelectAllSwimlaneMessage: {\n id: 'app.containers.UserManagement.SelectAllSwimlaneMessage',\n defaultMessage:\n 'Assign this role for all swimlanes, including swimlanes created in the future',\n },\n ScopeLabel: {\n id: 'app.containers.UserManagement.ScopeLabel',\n defaultMessage: 'Swimlane(s)',\n },\n userActivityLink: {\n id: 'app.containers.UserManagement.userActivityLink',\n defaultMessage: 'User Activity Logs',\n },\n})\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport ImmutablePropTypes from 'react-immutable-proptypes'\nimport { List } from 'immutable'\nimport qs from 'query-string'\n\nimport TextLink from 'components/TextLink'\nimport { isPlatformRole } from 'utils/sonraiUtils'\n\nconst FriendlyScope = ({ scope, roles, swimlanes, roleSrn }) => {\n if (!scope.includes('/Swimlane')) {\n const role = roles\n .get('data', List())\n .find(role => role.get('srn') === roleSrn)\n\n if (!role) {\n return scope\n }\n\n const roleIsPlatform = isPlatformRole(role)\n if (roleIsPlatform) {\n return (Platform)\n } else {\n return (All Swimlanes)\n }\n }\n\n const swimlane = swimlanes.find(\n swimlane => swimlane.get('resourceId') === scope\n )\n\n if (!swimlane) {\n return scope\n }\n\n return (\n \n {swimlane.get('title')}\n \n )\n}\n\nFriendlyScope.propTypes = {\n scope: PropTypes.string,\n roleSrn: PropTypes.string,\n swimlanes: ImmutablePropTypes.iterable.isRequired,\n roles: ImmutablePropTypes.iterable.isRequired,\n}\n\nexport default FriendlyScope\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport ImmutablePropTypes from 'react-immutable-proptypes'\nimport { Table } from 'reactstrap'\n\nimport TextLink from 'components/TextLink'\n\nimport FriendlyScope from './FriendlyScope'\n\nconst RolesDisplay = ({ data, swimlanes, removeRole, roles }) => {\n return (\n \n \n \n \n \n \n \n \n {data.map((row, index) => (\n \n \n \n \n \n ))}\n \n
RoleScope\n
{row.role}\n \n \n {\n removeRole(row)\n }\n : undefined\n }\n >\n remove\n \n
\n )\n}\n\nRolesDisplay.propTypes = {\n data: PropTypes.array,\n swimlanes: ImmutablePropTypes.iterable.isRequired,\n removeRole: PropTypes.func,\n roles: ImmutablePropTypes.iterable.isRequired,\n}\n\nexport default RolesDisplay\nexport { default as FriendlyScope } from './FriendlyScope'\n","import { defineMessages } from 'react-intl'\n\nexport default defineMessages({\n SelectAllSwimlanes: {\n id: 'app.components.ScopeAssignmentForm.SelectAllSwimlanes',\n defaultMessage: 'All Swimlanes',\n },\n SelectAllSwimlaneMessage: {\n id: 'app.components.ScopeAssignmentForm.SelectAllSwimlaneMessage',\n defaultMessage:\n 'Assign this role for all swimlanes, including swimlanes created in the future',\n },\n ScopeLabel: {\n id: 'app.components.ScopeAssignmentForm.ScopeLabel',\n defaultMessage: 'Swimlane(s)',\n },\n})\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport ImmutablePropTypes from 'react-immutable-proptypes'\nimport { FormattedMessage } from 'react-intl'\nimport { FormGroup } from 'reactstrap'\n\nimport FormLabel from 'components/FormLabel'\nimport Select from 'components/Select'\nimport { PlainCheckbox } from 'components/Checkbox'\nimport Icon from 'components/Icon'\nimport Tooltip from 'components/Tooltip'\n\nimport messages from './messages'\n\nexport function ScopeAssignmentForm({\n swimlanes,\n scopeInputValue,\n platformPerm,\n handleScopeInputChange,\n handlePlatformPermClick,\n canSelectAllSwimlanes,\n isDisabled,\n}) {\n const onChangeCheckbox = newVal => {\n handleScopeInputChange([])\n handlePlatformPermClick(newVal)\n }\n\n const scopeOptions = swimlanes\n .toList()\n .sortBy(swimlane => swimlane.get('title'))\n .toJS()\n .map(({ resourceId: value, title: label }) => ({ value, label }))\n\n return (\n
\n \n \n \n \n
\n \n
\n
\n \n
\n {canSelectAllSwimlanes && (\n
\n {' '}\n \n  {' '}\n \n }\n tooltipContent={\n \n }\n />\n
\n )}\n \n
\n )\n}\n\nScopeAssignmentForm.propTypes = {\n swimlanes: ImmutablePropTypes.map.isRequired,\n scopeInputValue: PropTypes.array,\n platformPerm: PropTypes.bool,\n handleScopeInputChange: PropTypes.func,\n handlePlatformPermClick: PropTypes.func,\n canSelectAllSwimlanes: PropTypes.bool,\n isDisabled: PropTypes.bool,\n}\n\nexport default ScopeAssignmentForm\n","import React, { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport ImmutablePropTypes from 'react-immutable-proptypes'\nimport { List, Map, Set } from 'immutable'\nimport { FormattedMessage } from 'react-intl'\nimport { FormGroup } from 'reactstrap'\n\nimport Select from 'components/Select'\nimport permissionChecker from 'containers/PermissionChecker'\nimport Button from 'components/Button'\nimport Icon from 'components/Icon'\nimport Tooltip from 'components/Tooltip'\nimport ScopeAssignmentForm from 'components/ScopeAssignmentForm'\nimport FormLabel from 'components/FormLabel'\nimport { getCurrentOrg } from 'auth/current-org'\nimport { isPlatformRole } from 'utils/sonraiUtils'\nimport _ from 'lodash'\nimport messages from './messages'\nimport TextLink from 'components/TextLink'\n\nfunction getRoleOptions({ roles, selectedRoles, restrictToSwimlanes }) {\n const platformRoles = []\n const swimlaneRoles = []\n\n if (restrictToSwimlanes) {\n roles.get('data', List()).forEach(role => {\n if (!isPlatformRole(role)) {\n swimlaneRoles.push({\n label: role.get('name'),\n value: role.get('srn'),\n })\n }\n })\n\n return swimlaneRoles\n }\n\n roles.get('data', List()).forEach(role => {\n if (isPlatformRole(role)) {\n platformRoles.push({\n label: role.get('name'),\n value: role.get('srn'),\n })\n } else {\n swimlaneRoles.push({\n label: role.get('name'),\n value: role.get('srn'),\n })\n }\n })\n\n return platformRoles\n .filter(\n role =>\n selectedRoles.findIndex(selected => selected.roleSrn === role.value) ===\n -1\n )\n .concat(swimlaneRoles)\n}\n\nfunction getSelectedRole({ roles, roleOption }) {\n if (!roleOption) {\n return null // TODO is this right?\n }\n\n // find the role that is selected\n const role = roles\n .get('data', List())\n .find(role => role.get('srn') === roleOption.value)\n\n if (!role) {\n // eslint-disable-next-line no-console\n console.warn(\n 'could not find role ' +\n roleOption.value +\n ' in list of roles ' +\n roles.toJS()\n )\n return null\n }\n return role\n}\n\nfunction getRoleAssignmentsForUser({ user, role }) {\n if (!user) {\n return []\n }\n const assignments = role\n .getIn(['roleAssignments', 'items'], List())\n .filter(assignment => {\n // we might wanna consider moving this to graphql\n const assUser = assignment.getIn(['user', 'items', 0], Map())\n return assUser.get('srn') === user.get('srn')\n })\n return assignments\n}\n\nconst styles = {\n inlineform: {\n display: 'grid',\n gridTemplateColumns: 'auto 1fr',\n alignItems: 'center',\n },\n}\n\nexport function RoleAssignmentForm(props) {\n const [roleOption, handleRoleOptionChange] = useState(null)\n const [scopeInputValue, handleScopeInputChange] = useState(null)\n const [platformPerm, handlePlatformPermClick] = useState(false)\n\n const addRole = () => {\n const thingsToAdd = []\n if (roleOption) {\n if (scopeInputValue) {\n scopeInputValue.forEach(scope => {\n if (scope.value !== 'All') {\n thingsToAdd.push({\n role: roleOption.label,\n roleSrn: roleOption.value,\n scope: scope.value,\n })\n }\n })\n }\n\n const role = getSelectedRole({ ...props, roleOption })\n\n if (role && (platformPerm || isPlatformRole(role))) {\n const specialOrgScope = `/org/${getCurrentOrg()}/*`\n thingsToAdd.push({\n role: roleOption.label,\n roleSrn: roleOption.value,\n scope: specialOrgScope,\n })\n }\n\n props.addToRoleData(thingsToAdd)\n handleScopeInputChange(null)\n handleRoleOptionChange(null)\n handlePlatformPermClick(false)\n }\n }\n\n const role = getSelectedRole({ ...props, roleOption })\n const scopeOptions = []\n const hasNonSwimlanePerms = role ? isPlatformRole(role) : false\n\n if (role != null) {\n const roleAssignments = getRoleAssignmentsForUser({ ...props, role })\n const userScopes = new Set(roleAssignments.map(ass => ass.get('scope')))\n\n if (!hasNonSwimlanePerms) {\n Object.values(props.swimlanes.toJS())\n .filter(({ srn }) => !userScopes.includes(srn))\n .map(({ resourceId: value, title: label }) => ({ value, label }))\n .forEach(option => scopeOptions.push(option))\n }\n }\n\n const getRoleLabel = roleSrn => {\n if (!roleSrn) {\n return\n }\n const role = props.roles\n .get('data', List())\n .find(role => role.get('srn') === roleSrn)\n\n return (\n \n {role.get('name')}\n \n ({isPlatformRole(role) ? 'Platform Role' : 'Swimlane Role'})\n \n }\n tooltipContent={role.get('description')}\n />\n
\n )\n }\n\n const getValidSwimlaneScopes = () => {\n if (platformPerm) {\n return Map()\n }\n\n const matchingAssignments =\n props.selectedRoles.filter(\n assignment => assignment.roleSrn === role.get('srn')\n ) || []\n\n if (matchingAssignments.length === 0) {\n return props.swimlanes\n }\n\n return props.swimlanes.filter(swimlane => {\n const resourceId = swimlane.get('resourceId')\n return !matchingAssignments.find(\n assignment => assignment.scope === resourceId\n )\n })\n }\n\n const isDisabled = () => {\n if (role && !props.updatingUserInvite) {\n if (hasNonSwimlanePerms) {\n if (roleOption) {\n return false\n }\n } else {\n if (!_.isEmpty(scopeInputValue) || platformPerm) {\n return false\n }\n }\n }\n return true\n }\n\n const clearRoleForm = () => {\n handleRoleOptionChange(null)\n handleScopeInputChange(null)\n handlePlatformPermClick(false)\n props.closeRoleForm()\n }\n\n const onOptionChange = params => {\n handleRoleOptionChange(params)\n props.onRoleAssignmentSelectionChange(params)\n }\n\n const userRoleAssignments = props.allUsers.getIn(\n [props.currentUser || '', 'roleAssignments', 'items'],\n List()\n )\n\n const userOrg = getCurrentOrg()\n const specialOrgScope = `/org/${userOrg}/*`\n\n const userHasSpecialOrgScope = !!userRoleAssignments.find(role => {\n const permissions = role.getIn(['role', 'items', 0, 'permissions'])\n return (\n (permissions.includes('edit.roleassignments') ||\n permissions.includes('*')) &&\n role.get('scope') === specialOrgScope\n )\n })\n\n return (\n
\n \n \n \n \n\n option.value}\n getOptionLabel={option => getRoleLabel(option.value)}\n />\n \n\n {roleOption && !hasNonSwimlanePerms && (\n \n )}\n\n \n \n {props.closeRoleForm && !props.roleData.isEmpty() && (\n clearRoleForm()}\n >\n Close Role Form\n \n )}\n \n
\n )\n}\n\nRoleAssignmentForm.defaultProps = {\n style: {},\n}\n\nRoleAssignmentForm.propTypes = {\n // these props are all passed from parent\n addToRoleData: PropTypes.func,\n roles: ImmutablePropTypes.map.isRequired,\n selectedRoles: PropTypes.array,\n style: PropTypes.object,\n swimlanes: ImmutablePropTypes.map,\n closeRoleForm: PropTypes.func,\n roleData: ImmutablePropTypes.iterable,\n onRoleAssignmentSelectionChange: PropTypes.func,\n currentUser: PropTypes.string,\n allUsers: ImmutablePropTypes.iterable,\n\n //Used in getRoleAssignmentsForUser\n user: ImmutablePropTypes.map, //eslint-disable-line react/no-unused-prop-types\n updatingUserInvite: PropTypes.bool,\n restrictToSwimlanes: PropTypes.bool,\n}\n\nexport default permissionChecker(RoleAssignmentForm)\n","import React, { Fragment } from 'react'\nimport ImmutablePropTypes from 'react-immutable-proptypes'\nimport PropTypes from 'prop-types'\nimport { FormattedMessage } from 'react-intl'\nimport { createStructuredSelector } from 'reselect'\nimport { compose } from 'redux'\nimport { List, fromJS } from 'immutable'\nimport { connect } from 'react-redux'\nimport Button from 'components/Button'\nimport TextLink from 'components/TextLink'\nimport FormLabel from 'components/FormLabel'\nimport RolesDisplay from 'components/RolesDisplay'\nimport { selectSonraiUserSrn } from 'containers/UserProfileData/selectors'\nimport { selectSonraiUsers } from 'containers/SonraiData/selectors'\nimport {\n selectAllRoles,\n selectSwimlanes,\n} from 'containers/SonraiData/selectors'\nimport {\n Modal,\n ModalHeader,\n ModalBody,\n ModalFooter,\n Input,\n FormGroup,\n FormFeedback,\n} from 'reactstrap'\nimport Icon from 'components/Icon'\nimport SectionHeader from 'components/SectionHeader'\nimport RoleAssignmentForm from './RoleAssignmentForm'\nimport _ from 'lodash'\nimport Error from 'components/Error'\nimport messages from './messages'\n\nexport class AddEditInviteModal extends React.Component {\n styles = {\n table: {\n height: '350px',\n },\n label: {\n fontSize: '1em',\n fontWeight: '400',\n marginTop: '5px',\n },\n banner: {\n width: '100%',\n backgroundColor: 'red',\n },\n }\n\n constructor(props) {\n super(props)\n this.validateEmail = _.debounce(this.validateEmail, 1000, {\n leading: false,\n trailing: true,\n })\n const roleList = []\n if (props.user) {\n if (props.existingUser) {\n props.user.getIn(['roleAssignments', 'items']).forEach(assignment => {\n roleList.push({\n role: assignment.getIn(['role', 'items', 0, 'name']),\n roleSrn: assignment.getIn(['role', 'items', 0, 'srn']),\n scope: assignment.get('scope'),\n })\n })\n } else {\n props.user\n .getIn(['pendingRoleAssignments', 'items'])\n .forEach(assignment => {\n roleList.push({\n role: assignment.getIn(['role', 'items', 0, 'name']),\n roleSrn: assignment.getIn(['role', 'items', 0, 'srn']),\n scope: assignment.get('scope'),\n })\n })\n }\n }\n this.state = {\n roleOption: null,\n emailIsValid: true,\n isValid: true,\n emailMsg: null,\n scopeOptions: [],\n scopeInputValue: '',\n existingScopeMsg: null,\n newEmail: '',\n newName: '',\n roleData: fromJS(roleList),\n selectedRoles: List(),\n shouldClear: false,\n showRoleForm: false,\n }\n }\n\n clearForm = () => {\n this.setState({\n roleOption: null,\n scopeInputValue: '',\n existingScopeMsg: null,\n scopeOptions: [],\n newEmail: '',\n newName: '',\n roleData: List(),\n selectedRoles: List(),\n shouldClear: false,\n showRoleForm: false,\n })\n }\n\n showRoleForm = () => {\n this.setState({\n showRoleForm: true,\n })\n }\n\n createOption = label => ({\n label,\n value: label,\n })\n\n componentDidUpdate() {\n const pending =\n this.props.updatingUserInvite !== undefined\n ? this.props.updatingUserInvite\n : this.props.invitingUser\n\n if (this.state.shouldClear && !pending) {\n this.clearForm()\n if (this.props.isOpen && !this.props.error) {\n this.props.toggle()\n }\n }\n }\n\n showExistingScopeMsg = scopeGuy => {\n this.setState({\n existingScopeMsg: `Role with scope of \"${scopeGuy}\" already exists...`,\n })\n setTimeout(() => {\n this.setState({\n existingScopeMsg: null,\n })\n }, 3000)\n }\n\n handleScopeKeyDown = event => {\n const { scopeInputValue, scopeOptions } = this.state\n if (!scopeInputValue) return\n if (\n scopeOptions &&\n scopeOptions.find(scopes => scopes.label === scopeInputValue)\n ) {\n this.showExistingScopeMsg(scopeInputValue)\n this.setState({ scopeInputValue: '' })\n return\n }\n switch (event.key) {\n case 'Enter':\n case 'Tab':\n this.setState({\n scopeInputValue: '',\n scopeOptions: [...scopeOptions, this.createOption(scopeInputValue)],\n })\n event.preventDefault()\n }\n }\n\n validateEmail = email => {\n // eslint-disable-next-line\n const validFormatting = /^([a-zA-Z0-9+_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$/.test(\n email\n )\n const isExisting = this.props.unavailableEmails.existing.includes(email)\n const isPending = this.props.unavailableEmails.pending.includes(email)\n\n if (!validFormatting || isExisting || isPending) {\n this.setState({\n emailIsValid: false,\n emailMsg: !validFormatting\n ? 'Please enter a valid email.'\n : isExisting\n ? 'This email address is already associated with a user.'\n : isPending\n ? 'This email address already has a pending invite.'\n : null,\n })\n } else {\n this.setState({\n emailIsValid: true,\n emailMsg: null,\n })\n }\n }\n\n handleEmailChange = bruh => {\n this.validateEmail(bruh.target.value)\n this.setState({ newEmail: bruh.target.value })\n }\n\n handleNameChange = bruh => {\n this.setState({ newName: bruh.target.value })\n }\n\n handleRoleOptionChange = guy => {\n this.setState({ roleOption: guy })\n }\n\n handleScopeInputChange = inputValue => {\n this.setState({ scopeInputValue: inputValue })\n }\n\n handleScopeOptionChange = (guy, type) => {\n if (\n (type.action = 'remove-value') &&\n this.state.scopeOptions.length === 1\n ) {\n this.setState({ scopeOptions: [] })\n } else {\n this.setState({ scopeOptions: guy })\n }\n }\n\n handleSelectionChange = event => {\n const rows = event.api.getSelectedRows() || []\n this.setState({ selectedRoles: fromJS(rows) })\n }\n\n quickCheckValidEmail = () => {\n // eslint-disable-next-line\n const validFormatting = /^([a-zA-Z0-9+_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$/.test(\n this.state.newEmail\n )\n const isExisting = this.props.unavailableEmails.existing.includes(\n this.state.newEmail\n )\n const isPending = this.props.unavailableEmails.pending.includes(\n this.state.newEmail\n )\n if (!validFormatting || isExisting || isPending) {\n return false\n } else {\n return true\n }\n }\n\n submitInvite = () => {\n if (this.quickCheckValidEmail()) {\n this.props.inviteUser({\n name: this.state.newName,\n email: this.state.newEmail,\n roleAssignments: this.state.roleData\n .toJS()\n .map(role => ({ role: role.roleSrn, scope: role.scope })),\n })\n this.setState({ shouldClear: true })\n }\n }\n\n saveInvite = () => {\n // remove the goons and add the coolguys\n const getOuttaHereDumbos = []\n const urCoolLetsAddYa = []\n const existingAssignments = this.props.existingUser\n ? this.props.user.getIn(['roleAssignments', 'items'], List())\n : this.props.user.getIn(['pendingRoleAssignments', 'items'], List())\n\n this.state.roleData.forEach(assState => {\n if (\n !existingAssignments.find(\n ea =>\n assState.get('roleSrn') ===\n ea.getIn(['role', 'items', 0, 'srn'], null) &&\n assState.get('scope') === ea.getIn(['scope'], null)\n )\n ) {\n urCoolLetsAddYa.push(assState.toJS())\n }\n })\n\n existingAssignments.forEach(existing => {\n if (\n !this.state.roleData.find(\n data =>\n data.get('roleSrn') ===\n existing.getIn(['role', 'items', 0, 'srn'], null) &&\n data.get('scope') === existing.getIn(['scope'], null)\n )\n ) {\n getOuttaHereDumbos.push(existing.get('srn'))\n }\n })\n\n this.props.updatePendingRoleAssignments({\n srn: this.props.user.get('srn'),\n remove: getOuttaHereDumbos,\n add: urCoolLetsAddYa,\n })\n this.setState({ shouldClear: true })\n }\n\n getRoleOptions = () => {\n return this.props.roles\n .get('data')\n .toJS()\n .map(role => {\n return {\n label: role.name,\n value: role.srn,\n }\n })\n }\n\n // TOREMOVE\n addRole = () => {\n const thingsToAdd = []\n if (this.state.roleOption && this.state.scopeOptions) {\n this.state.scopeOptions.forEach(scope => {\n if (\n this.state.roleData.find(\n dabba =>\n dabba.roleSrn === this.state.roleOption.value &&\n dabba.scope === scope.value\n )\n ) {\n return\n } else {\n thingsToAdd.push({\n role: this.state.roleOption.label,\n roleSrn: this.state.roleOption.value,\n scope: scope.value,\n })\n }\n })\n this.setState(prevState => ({\n roleData: prevState.roleData.concat(fromJS(thingsToAdd)),\n }))\n this.setState({ roleOption: null, scopeOptions: [] })\n }\n }\n\n removeRole = data => {\n this.setState(prevState => ({\n roleData: prevState.roleData.filterNot(\n dabba =>\n dabba.get('scope') === data.scope &&\n dabba.get('roleSrn') === data.roleSrn\n ),\n }))\n }\n\n addToRoleData = thingsToAdd => {\n this.setState(prevState => ({\n roleData: prevState.roleData.concat(fromJS(thingsToAdd)),\n showRoleForm: false,\n isValid: true,\n }))\n }\n\n getEditBody = () => {\n const data = this.state.roleData.toJS().map(role => {\n return {\n ...role,\n removeRole: 'remove',\n }\n })\n\n return (\n
\n Assigned Roles\n
\n \n
\n
\n \n \n \n\n \n
\n
\n )\n }\n\n getNoRows = () => {\n return '
No roles added
'\n }\n\n onRoleAssignmentSelectionChange = params => {\n if (params) {\n this.setState({ isValid: false })\n } else {\n this.setState({ isValid: true })\n }\n }\n\n getAddBody = () => {\n const data = (this.state.roleData ? this.state.roleData.toJS() : []).map(\n role => {\n return {\n ...role,\n removeRole: 'remove',\n }\n }\n )\n\n return (\n
\n \n Email Address\n \n \n \n {this.state.emailMsg}\n \n\n Name\n \n \n \n {this.props.canViewData && (\n \n
\n {data.length === 0 && (\n You must assign at least one role.\n )}\n
\n\n {data.length > 0 && (\n \n )}\n\n {data.length > 0 && !this.state.showRoleForm && (\n \n Add Another Role\n \n )}\n\n {(data.length === 0 || this.state.showRoleForm) && (\n \n this.setState({ showRoleForm: false, isValid: true })\n }\n onRoleAssignmentSelectionChange={\n this.onRoleAssignmentSelectionChange\n }\n allUsers={this.props.allUsers}\n currentUser={this.props.currentUser}\n />\n )}\n
\n )}\n
\n )\n }\n\n compareRollyBois = user => {\n const roleSize = this.props.existingUser\n ? user.getIn(['roleAssignments', 'items'], List()).size\n : user.getIn(['pendingRoleAssignments', 'items'], List()).size\n // must be diff\n if (roleSize !== this.state.roleData.size) {\n return true\n } else {\n // loop em and check if they are the same\n let isDifferent = false\n\n const existingBoiz = (this.props.existingUser\n ? user.getIn(['roleAssignments', 'items'], List())\n : user.getIn(['pendingRoleAssignments', 'items'], List())\n ).map(assignment => ({\n roleSrn: assignment.getIn(['role', 'items', 0, 'srn']),\n scope: assignment.get('scope'),\n }))\n\n existingBoiz.forEach(roleboi => {\n let exists = false\n this.state.roleData.forEach(otherguy => {\n if (\n roleboi.roleSrn === otherguy.get('roleSrn') &&\n roleboi.scope === otherguy.get('scope')\n ) {\n exists = true\n }\n })\n if (!exists) {\n isDifferent = true\n }\n })\n\n return isDifferent\n }\n }\n\n render() {\n const { toggle, isOpen, user, error } = this.props\n\n return (\n \n \n {user\n ? `${\n this.props.existingUser ? `User` : `Pending User`\n } ${this.props.user.get('email')}`\n : 'Invite New User'}\n \n \n {!error ? (\n user ? (\n this.getEditBody()\n ) : (\n this.getAddBody()\n )\n ) : (\n \n )}\n \n \n \n Cancel\n \n {user ? (\n \n Save Roles\n \n ) : (\n \n Send Invite\n {this.props.invitingUser && (\n \n \n \n )}\n \n )}\n \n \n )\n }\n}\n\nconst mapStateToProps = createStructuredSelector({\n currentUser: selectSonraiUserSrn,\n allUsers: selectSonraiUsers,\n roles: selectAllRoles,\n swimlanes: selectSwimlanes,\n})\n\nconst withConnect = connect(mapStateToProps)\n\nAddEditInviteModal.propTypes = {\n unavailableEmails: PropTypes.object,\n user: ImmutablePropTypes.map,\n toggle: PropTypes.func,\n isOpen: PropTypes.bool,\n existingUser: PropTypes.bool,\n roles: ImmutablePropTypes.map,\n inviteUser: PropTypes.func,\n invitingUser: PropTypes.bool,\n swimlanes: ImmutablePropTypes.map,\n updatePendingRoleAssignments: PropTypes.func,\n updatingUserInvite: PropTypes.bool,\n canViewData: PropTypes.bool,\n restrictToSwimlanes: PropTypes.bool,\n error: PropTypes.string,\n allUsers: ImmutablePropTypes.iterable,\n currentUser: PropTypes.string,\n}\n\nexport default compose(withConnect)(AddEditInviteModal)\n","import { createSelector } from 'reselect'\nimport { Map, List, fromJS } from 'immutable'\n\nconst selectUserManagemenDomain = state =>\n state !== undefined ? state.get('userManagementData', Map()) : fromJS({})\n\nexport const selectUsers = createSelector(\n selectUserManagemenDomain,\n data => data.get('users') || List()\n)\n\nexport const selectPendingUsers = createSelector(\n selectUserManagemenDomain,\n data => data.get('pendingUsers') || List()\n)\n\nexport const selectFetchingUsers = createSelector(\n selectUserManagemenDomain,\n data => data.get('fetchingUsers')\n)\n\nexport const selectFetchingPendingUsers = createSelector(\n selectUserManagemenDomain,\n data => data.get('fetchingPendingUsers')\n)\n\nexport const selectInvitingUser = createSelector(\n selectUserManagemenDomain,\n data => data.get('invitingUser')\n)\n\nexport const selectSonraiScopes = createSelector(\n selectUserManagemenDomain,\n data => data.get('sonraiScopes') || List()\n)\n\nexport const selectSonraiRoles = createSelector(\n selectUserManagemenDomain,\n data => data.get('sonraiRoles') || List()\n)\n\nexport const selectFetchingSonraiRoles = createSelector(\n selectUserManagemenDomain,\n data => data.get('fetchingSonraiRoles')\n)\n\nexport const selectFetchingSonraiScopes = createSelector(\n selectUserManagemenDomain,\n data => data.get('fetchingSonraiScopes')\n)\n\nexport const selectCancellingUserInvite = createSelector(\n selectUserManagemenDomain,\n data => data.get('cancellingUserInvite')\n)\n\nexport const selectUpdatingUserInvite = createSelector(\n selectUserManagemenDomain,\n data => data.get('updatingUserInvite') || Map()\n)\n\nexport const selectResendingUserInvite = createSelector(\n selectUserManagemenDomain,\n data => data.get('resendingUserInvite')\n)\n\nexport const selectUserManagementError = createSelector(\n selectUserManagemenDomain,\n state => state.get('userManagementError')\n)\n","export const FETCH_USERS = 'app/UserManagement/FETCH_USERS'\nexport const FETCH_USERS_SUCCESS = 'app/UserManagement/FETCH_USERS_SUCCESS'\nexport const FETCH_PENDING_USERS = 'app/UserManagement/FETCH_PENDING_USERS'\nexport const FETCH_PENDING_USERS_SUCCESS =\n 'app/UserManagement/FETCH_PENDING_USERS_SUCCESS'\nexport const INVITE_USER = 'app/UserManagement/INVITE_USER'\nexport const INVITE_USER_SUCCESS = 'app/UserManagement/INVITE_USER_SUCCESS'\nexport const UPDATE_USER_INVITE = 'app/UserManagement/UPDATE_USER_INVITE'\nexport const UPDATE_USER_INVITE_SUCCESS =\n 'app/UserManagement/UPDATE_USER_INVITE_SUCCESS'\nexport const RESEND_USER_INVITE = 'app/UserManagement/RESEND_USER_INVITE'\nexport const RESEND_USER_INVITE_SUCCESS =\n 'app/UserManagement/RESEND_USER_INVITE_SUCCESS'\nexport const CANCEL_USER_INVITE = 'app/UserManagement/CANCEL_USER_INVITE'\nexport const CANCEL_USER_INVITE_SUCCESS =\n 'app/UserManagement/CANCEL_USER_INVITE_SUCCESS'\nexport const FETCH_SONRAI_ROLES = 'app/UserManagement/FETCH_SONRAI_ROLES'\nexport const FETCH_SONRAI_ROLES_SUCCESS =\n 'app/UserManagement/FETCH_SONRAI_ROLES_SUCCESS'\nexport const FETCH_SONRAI_SCOPES = 'app/UserManagement/FETCH_SONRAI_SCOPES'\nexport const FETCH_SONRAI_SCOPES_SUCCESS =\n 'app/UserManagement/FETCH_SONRAI_SCOPES_SUCCESS'\nexport const UPDATE_PENDING_ROLE_ASSIGNMENTS =\n 'app/UserManagement/UPDATE_PENDING_ROLE_ASSIGNMENTS'\nexport const UPDATE_PENDING_ROLE_ASSIGNMENTS_SUCCESS =\n 'app/UserManagement/UPDATE_PENDING_ROLE_ASSIGNMENTS_SUCCESS'\nexport const SET_USER_MANAGEMENT_ERROR =\n 'app/UserManagement/SET_USER_MANAGEMENT_ERROR'\nexport const CLEAR_USER_MANAGEMENT_ERROR =\n 'app/UserManagement/CLEAR_USER_MANAGEMENT_ERROR'\n","import { createAction } from 'redux-actions'\nimport {\n INVITE_USER,\n INVITE_USER_SUCCESS,\n UPDATE_USER_INVITE,\n UPDATE_USER_INVITE_SUCCESS,\n RESEND_USER_INVITE,\n RESEND_USER_INVITE_SUCCESS,\n CANCEL_USER_INVITE,\n CANCEL_USER_INVITE_SUCCESS,\n FETCH_PENDING_USERS,\n FETCH_PENDING_USERS_SUCCESS,\n FETCH_SONRAI_ROLES,\n FETCH_SONRAI_ROLES_SUCCESS,\n FETCH_SONRAI_SCOPES,\n FETCH_SONRAI_SCOPES_SUCCESS,\n UPDATE_PENDING_ROLE_ASSIGNMENTS,\n UPDATE_PENDING_ROLE_ASSIGNMENTS_SUCCESS,\n SET_USER_MANAGEMENT_ERROR,\n CLEAR_USER_MANAGEMENT_ERROR,\n} from './constants'\n\nexport const fetchPendingUsers = createAction(FETCH_PENDING_USERS)\nexport const fetchPendingUsersSuccess = createAction(\n FETCH_PENDING_USERS_SUCCESS\n)\nexport const inviteUser = createAction(INVITE_USER)\nexport const inviteUserSuccess = createAction(INVITE_USER_SUCCESS)\nexport const updateUserInvite = createAction(UPDATE_USER_INVITE)\nexport const updateUserInviteSuccess = createAction(UPDATE_USER_INVITE_SUCCESS)\nexport const updatePendingRoleAssignments = createAction(\n UPDATE_PENDING_ROLE_ASSIGNMENTS\n)\nexport const updatePendingRoleAssignmentsSuccess = createAction(\n UPDATE_PENDING_ROLE_ASSIGNMENTS_SUCCESS\n)\nexport const resendUserInvite = createAction(RESEND_USER_INVITE)\nexport const resendUserInviteSuccess = createAction(RESEND_USER_INVITE_SUCCESS)\nexport const cancelUserInvite = createAction(CANCEL_USER_INVITE)\nexport const cancelUserInviteSuccess = createAction(CANCEL_USER_INVITE_SUCCESS)\nexport const fetchSonraiRoles = createAction(FETCH_SONRAI_ROLES)\nexport const fetchSonraiRolesSuccess = createAction(FETCH_SONRAI_ROLES_SUCCESS)\nexport const fetchSonraiScopes = createAction(FETCH_SONRAI_SCOPES)\nexport const fetchSonraiScopesSuccess = createAction(\n FETCH_SONRAI_SCOPES_SUCCESS\n)\n\nexport const setUserManagementError = createAction(SET_USER_MANAGEMENT_ERROR)\nexport const clearUserManagementError = createAction(\n CLEAR_USER_MANAGEMENT_ERROR\n)\n","import { takeLatest, put } from 'redux-saga/effects'\n\nimport {\n FETCH_PENDING_USERS,\n FETCH_SONRAI_ROLES,\n CANCEL_USER_INVITE,\n INVITE_USER,\n UPDATE_USER_INVITE,\n RESEND_USER_INVITE,\n UPDATE_PENDING_ROLE_ASSIGNMENTS,\n} from './constants'\nimport {\n fetchPendingUsersSuccess,\n fetchSonraiRolesSuccess,\n cancelUserInviteSuccess,\n inviteUserSuccess,\n updateUserInviteSuccess,\n resendUserInviteSuccess,\n updatePendingRoleAssignmentsSuccess,\n setUserManagementError,\n} from './actions'\nimport { getClient } from 'apolloClient'\nimport gql from 'graphql-tag'\nimport _ from 'lodash'\n\nconst CANCEL_SONRAI_INVITE_QUERY = `\n mutation deleteSonraiInvite($input: [SonraiInviteDeleter!]!) {\n DeleteSonraiInvites(input: $input) {\n items {\n srn\n deleted\n }\n }\n }\n`\n\nconst INVITE_USER_MUTATION = `\n mutation inviteUser($input: [SonraiInviteCreator!]!) {\n CreateSonraiInvites(input: $input) {\n items {\n srn\n resourceId\n email\n dateSent\n expiry\n isPending\n pendingRoleAssignments {\n items {\n srn\n role {\n items {\n srn\n name\n }\n }\n scope\n }\n }\n }\n }\n }\n`\n\nfunction* fetchPendingUsers() {\n const GET_SONRAI_INVITES_QUERY = `\n query getInvites {\n SonraiInvites {\n items {\n srn\n email\n dateSent\n isPending\n expiry\n pendingRoleAssignments {\n items {\n srn\n role {\n items {\n srn\n name\n }\n }\n scope\n }\n }\n }\n }\n }\n `\n\n try {\n const client = getClient()\n const data = yield client.query({\n query: gql`\n ${GET_SONRAI_INVITES_QUERY}\n `,\n forceFetch: true,\n fetchPolicy: 'no-cache',\n })\n\n yield put(\n fetchPendingUsersSuccess({\n users: _.get(data, ['data', 'SonraiInvites', 'items'], []),\n })\n )\n } catch (e) {\n yield put(setUserManagementError(e.message))\n //eslint-disable-next-line no-console\n console.error('Error saving user profile', e)\n }\n}\n\nfunction* fetchSonraiRoles() {\n const FETCH_SONRAI_ROLES_QUERY = `\n query getRoles {\n SonraiRoles {\n items {\n srn\n resourceId\n name\n description\n permissions\n }\n }\n }\n `\n try {\n const client = getClient()\n const data = yield client.query({\n query: gql`\n ${FETCH_SONRAI_ROLES_QUERY}\n `,\n forceFetch: true,\n fetchPolicy: 'no-cache',\n })\n\n yield put(\n fetchSonraiRolesSuccess({\n roles: _.get(data, ['data', 'SonraiRoles', 'items'], []),\n })\n )\n } catch (e) {\n yield put(setUserManagementError(e.message))\n //eslint-disable-next-line no-console\n console.error('Error saving user profile', e)\n }\n}\n\nfunction* inviteUser(action) {\n try {\n const client = getClient()\n const data = yield client.mutate({\n mutation: gql`\n ${INVITE_USER_MUTATION}\n `,\n variables: {\n input: {\n email: action.payload.email,\n name: action.payload.name,\n pendingRoleAssigners: action.payload.roleAssignments.map(assign => {\n return { roleSrn: assign.role, scope: assign.scope }\n }),\n },\n },\n })\n\n const invitedUser = _.get(\n data,\n ['data', 'CreateSonraiInvites', 'items', 0],\n null\n )\n if (invitedUser) {\n yield put(inviteUserSuccess({ user: invitedUser }))\n }\n } catch (e) {\n yield put(setUserManagementError(e.message))\n yield put(inviteUserSuccess(null))\n //eslint-disable-next-line no-console\n console.error('Error saving user profile', e)\n }\n}\n\nfunction* updatePendingRoleAssignments(action) {\n const CREATE_PENDING_ROLE_ASSIGNMENT = `\n mutation createPendingRoleAssignment($assignment: [SonraiPendingRoleAssignmentCreator!]!) {\n CreateSonraiPendingRoleAssignments(input: $assignment) {\n items {\n srn\n role {\n items {\n srn\n name\n }\n }\n scope\n }\n }\n }\n `\n\n const DELETE_PENDING_ROLE_ASSIGNMENT = `\n mutation deletePendingRoleAssignment($input: [SonraiPendingRoleAssignmentDeleter!]!) {\n DeleteSonraiPendingRoleAssignments(input: $input) {\n items {\n srn\n deleted\n }\n }\n }\n `\n\n try {\n const added = []\n const removed = []\n const client = getClient()\n if (action.payload.add) {\n const response = yield client.mutate({\n mutation: gql`\n ${CREATE_PENDING_ROLE_ASSIGNMENT}\n `,\n variables: {\n assignment: action.payload.add.map(guy => ({\n inviteSrn: action.payload.srn,\n roleSrn: guy.roleSrn,\n scope: guy.scope,\n })),\n },\n })\n\n const items = _.get(response, [\n 'data',\n 'CreateSonraiPendingRoleAssignments',\n 'items',\n ])\n\n if (items) {\n items.forEach(response => {\n added.push(response)\n })\n } else if (response.errors) {\n yield put(\n setUserManagementError(\n _.get(\n response.errors,\n [0, 'message'],\n 'Error updating pending role assignments'\n )\n )\n )\n }\n }\n if (action.payload.remove) {\n const response = yield client.mutate({\n mutation: gql`\n ${DELETE_PENDING_ROLE_ASSIGNMENT}\n `,\n variables: {\n input: action.payload.remove.map(srn => ({\n srn: srn,\n })),\n },\n })\n\n const items = _.get(\n response,\n ['data', 'DeleteSonraiPendingRoleAssignments', 'items'],\n false\n )\n if (items) {\n items.forEach(response => {\n if (response.deleted) {\n removed.push(response.srn)\n }\n })\n } else if (response.errors) {\n yield put(\n setUserManagementError(\n _.get(\n response.errors,\n [0, 'message'],\n 'Error updating pending role assignments'\n )\n )\n )\n }\n }\n\n yield put(\n updatePendingRoleAssignmentsSuccess({\n srn: action.payload.srn,\n added: added,\n removed: removed,\n })\n )\n } catch (e) {\n yield put(setUserManagementError(e.message))\n //eslint-disable-next-line no-console\n console.error('Error saving user profile', e)\n }\n}\n\nfunction* updateUserInvite(action) {\n const UPDATE_USER_INVITE_QUERY = `\n mutation cancelUserInvite($input: [SonraiInviteDeleter!]!) {\n DeleteSonraiInvites(input: $input)\n }\n `\n try {\n const client = getClient()\n const data = yield client.mutate({\n mutation: gql`\n ${UPDATE_USER_INVITE_QUERY}\n `,\n variables: {\n input: { srn: action.payload.srn },\n },\n })\n if (data) {\n yield put(updateUserInviteSuccess())\n }\n } catch (e) {\n yield put(setUserManagementError(e.message))\n //eslint-disable-next-line no-console\n console.error('Error saving user profile', e)\n }\n}\n\nfunction* cancelUserInvite(action) {\n try {\n const client = getClient()\n const data = yield client.mutate({\n mutation: gql`\n ${CANCEL_SONRAI_INVITE_QUERY}\n `,\n variables: {\n input: { srn: action.payload.srn },\n },\n })\n\n if (\n _.get(data, ['data', 'DeleteSonraiInvites', 'items', 0, 'deleted'], false)\n ) {\n yield put(cancelUserInviteSuccess({ srn: action.payload.srn }))\n }\n } catch (e) {\n yield put(setUserManagementError(e.message))\n //eslint-disable-next-line no-console\n console.error('Error saving user profile', e)\n }\n}\n\nfunction* resendUserInvite(action) {\n try {\n const client = getClient()\n const didCancel = yield client.mutate({\n mutation: gql`\n ${CANCEL_SONRAI_INVITE_QUERY}\n `,\n variables: {\n input: { srn: action.payload.srn },\n },\n })\n\n if (\n _.get(\n didCancel,\n ['data', 'DeleteSonraiInvites', 'items', 0, 'deleted'],\n false\n )\n ) {\n const user = action.payload.pendingGuy.toJS()\n\n const didReinvite = yield client.mutate({\n mutation: gql`\n ${INVITE_USER_MUTATION}\n `,\n variables: {\n input: {\n email: user.email,\n name: user.email.substring(0, 9),\n pendingRoleAssigners: user.pendingRoleAssignments.items.map(\n assign => {\n return {\n roleSrn: assign.role.items[0].srn,\n scope: assign.scope,\n }\n }\n ),\n },\n },\n })\n if (didReinvite) {\n yield put(resendUserInviteSuccess({ srn: action.payload.srn }))\n }\n }\n } catch (e) {\n yield put(setUserManagementError(e.message))\n //eslint-disable-next-line no-console\n console.error('Error saving user profile', e)\n }\n}\n\nfunction* userManagementSaga() {\n yield takeLatest(FETCH_PENDING_USERS, fetchPendingUsers)\n yield takeLatest(FETCH_SONRAI_ROLES, fetchSonraiRoles)\n // yield takeLatest(FETCH_SONRAI_SCOPES, fetchSonraiScopes)\n yield takeLatest(INVITE_USER, inviteUser)\n yield takeLatest(RESEND_USER_INVITE, resendUserInvite)\n yield takeLatest(UPDATE_USER_INVITE, updateUserInvite)\n yield takeLatest(CANCEL_USER_INVITE, cancelUserInvite)\n yield takeLatest(\n UPDATE_PENDING_ROLE_ASSIGNMENTS,\n updatePendingRoleAssignments\n )\n}\n\nexport default userManagementSaga\n","import { fromJS, Map, List, merge } from 'immutable'\nimport moment from 'moment'\nimport { handleActions } from 'redux-actions'\nimport {\n FETCH_USERS,\n FETCH_USERS_SUCCESS,\n FETCH_PENDING_USERS,\n FETCH_PENDING_USERS_SUCCESS,\n INVITE_USER,\n INVITE_USER_SUCCESS,\n RESEND_USER_INVITE,\n RESEND_USER_INVITE_SUCCESS,\n CANCEL_USER_INVITE,\n CANCEL_USER_INVITE_SUCCESS,\n FETCH_SONRAI_ROLES,\n FETCH_SONRAI_ROLES_SUCCESS,\n FETCH_SONRAI_SCOPES,\n FETCH_SONRAI_SCOPES_SUCCESS,\n UPDATE_PENDING_ROLE_ASSIGNMENTS,\n UPDATE_PENDING_ROLE_ASSIGNMENTS_SUCCESS,\n SET_USER_MANAGEMENT_ERROR,\n CLEAR_USER_MANAGEMENT_ERROR,\n} from './constants'\n\nconst initialState = fromJS({\n userManagementError: null,\n fetchingUsers: false,\n fetchingPendingUsers: false,\n users: null,\n pendingUsers: null,\n invitingUser: false,\n cancellingUserInvite: Map(),\n sonraiRoles: null,\n sonraiScopes: null,\n fetchingSonraiRoles: false,\n fetchingSonraiScopes: false,\n updatingUserInvite: Map(),\n resendingUserInvite: Map(),\n})\n\nconst userManagementReducer = handleActions(\n {\n [FETCH_USERS]: state => state.set('fetchingUsers', true),\n [FETCH_USERS_SUCCESS]: (state, { payload }) =>\n state.set('fetchingUsers', false).set('users', fromJS(payload.users)),\n [FETCH_PENDING_USERS]: state => state.set('fetchingPendingUsers', true),\n [FETCH_PENDING_USERS_SUCCESS]: (state, { payload }) =>\n state\n .set('fetchingPendingUsers', false)\n .set('pendingUsers', fromJS(payload.users)),\n [INVITE_USER]: state => state.set('invitingUser', true),\n [INVITE_USER_SUCCESS]: (state, { payload }) => {\n if (!payload) {\n return state.set('invitingUser', false)\n }\n return state\n .update('pendingUsers', pendingUsers =>\n pendingUsers.push(fromJS(payload.user))\n )\n .set('invitingUser', false)\n },\n\n [UPDATE_PENDING_ROLE_ASSIGNMENTS]: (state, { payload }) =>\n state.setIn(['updatingUserInvite', payload.srn], true),\n [UPDATE_PENDING_ROLE_ASSIGNMENTS_SUCCESS]: (state, { payload }) => {\n let newAssignments = List()\n let userIndex = -1\n state.get('pendingUsers').forEach((user, index) => {\n if (user.get('srn') === payload.srn) {\n userIndex = index\n user\n .getIn(['pendingRoleAssignments', 'items'])\n .forEach(assignment => {\n if (!payload.removed.includes(assignment.get('srn'))) {\n newAssignments = newAssignments.push(assignment)\n }\n })\n }\n })\n newAssignments = merge(newAssignments, fromJS(payload.added))\n if (userIndex !== -1) {\n return state\n .setIn(\n ['pendingUsers', userIndex, 'pendingRoleAssignments', 'items'],\n newAssignments\n )\n .deleteIn(['updatingUserInvite', payload.srn])\n } else {\n return state.deleteIn(['updatingUserInvite', payload.srn])\n }\n },\n [RESEND_USER_INVITE]: (state, { payload }) =>\n state.setIn(['resendingUserInvite', payload.srn], true),\n [RESEND_USER_INVITE_SUCCESS]: (state, { payload }) =>\n state\n .deleteIn(['resendingUserInvite', payload.srn])\n // optimistically update the sent date\n .set(\n 'pendingUsers',\n state.get('pendingUsers').map(user => {\n if (payload.srn === user.get('srn')) {\n return user.set(\n 'dateSent',\n moment(new Date()).format(moment.HTML5_FMT.DATETIME_LOCAL_MS)\n )\n } else {\n return user\n }\n })\n ),\n [CANCEL_USER_INVITE]: (state, { payload }) =>\n state.setIn(['cancellingUserInvite', payload.srn], true),\n [CANCEL_USER_INVITE_SUCCESS]: (state, { payload }) =>\n state\n .deleteIn(['cancellingUserInvite', payload.srn])\n .set(\n 'pendingUsers',\n state.get('pendingUsers').filter(pu => pu.get('srn') !== payload.srn)\n ),\n [FETCH_SONRAI_ROLES]: state => state.set('fetchingSonraiRoles', true),\n [FETCH_SONRAI_ROLES_SUCCESS]: (state, { payload }) =>\n state\n .set('sonraiRoles', fromJS(payload.roles))\n .set('fetchingSonraiRoles', false),\n [FETCH_SONRAI_SCOPES]: state => state.set('fetchingSonraiScopes', true),\n [FETCH_SONRAI_SCOPES_SUCCESS]: (state, { payload }) =>\n state\n .set('sonraiScopes', fromJS(payload.scopes))\n .set('fetchingSonraiScopes', false),\n [SET_USER_MANAGEMENT_ERROR]: (state, { payload }) =>\n state.set('userManagementError', payload),\n [CLEAR_USER_MANAGEMENT_ERROR]: state =>\n state.set('userManagementError', null),\n },\n initialState\n)\n\nexport default userManagementReducer\n","import React from 'react'\nimport ImmutablePropTypes from 'react-immutable-proptypes'\nimport PropTypes from 'prop-types'\n\nimport { createStructuredSelector } from 'reselect'\nimport { compose, bindActionCreators } from 'redux'\nimport { connect } from 'react-redux'\nimport { push } from 'connected-react-router'\nimport qs from 'query-string'\nimport { FormattedMessage } from 'react-intl'\nimport messages from './messages'\nimport {\n selectFetchingPendingUsers,\n selectPendingUsers,\n selectSonraiScopes,\n selectInvitingUser,\n selectUpdatingUserInvite,\n selectCancellingUserInvite,\n selectResendingUserInvite,\n selectUserManagementError,\n} from './selectors'\nimport {\n selectSonraiUsers,\n selectSonraiUsersLoading,\n selectUpdatingUserRoles,\n} from 'containers/SonraiData/selectors'\nimport {\n fetchPendingUsers,\n inviteUser,\n cancelUserInvite,\n updateUserInvite,\n resendUserInvite,\n updatePendingRoleAssignments,\n clearUserManagementError,\n} from './actions'\nimport userManagementSaga from './sagas'\nimport userManagementReducer from './reducer'\nimport injectSaga from 'utils/injectSaga'\nimport injectReducer from 'utils/injectReducer'\n\nimport SectionHeader from 'components/SectionHeader'\nimport permissionChecker from 'containers/PermissionChecker'\nimport RedirectWithoutPermission from 'containers/PermissionChecker/RedirectWithoutPermission'\nimport WithPermission from 'containers/PermissionChecker/WithPermission'\nimport DataTable from 'components/DataTable'\nimport Button from 'components/Button'\nimport DynamicFormattedMessage from 'components/DynamicFormattedMessage'\nimport SquareLoadingAnimation from 'components/SquareLoadingAnimation'\nimport BorderedCard from 'components/BorderedCard'\nimport TextLink from 'components/TextLink'\nimport UserWidget from 'components/UserWidget'\nimport Icon from 'components/Icon'\nimport AddEditInviteModal from './AddEditInviteModal'\nimport moment from 'moment'\nimport { stripTags } from 'utils/sonraiUtils'\n\nexport class UserManagement extends React.Component {\n styles = {\n container: {\n display: 'grid',\n gridTemplateRows: 'auto 1fr',\n padding: '1rem',\n width: '100%',\n height: '100%',\n },\n doubleGuy: {\n display: 'grid',\n gridTemplateColumns: '1fr auto',\n alignItems: 'center',\n },\n searchGuy: {\n padding: '1rem 0px',\n },\n keepRight: {\n display: 'flex',\n justifyContent: 'flex-end',\n },\n body: {},\n userTable: {\n gridArea: 'user',\n marginBottom: '1rem',\n },\n pendingTable: {\n gridArea: 'pending',\n display: 'grid',\n gridTemplateRows: 'auto 1fr',\n },\n title: {\n fontSize: '1.2em',\n marginTop: '1.6em',\n },\n }\n\n constructor(props) {\n super(props)\n if (props.pendingUsers.isEmpty()) {\n props.fetchPendingUsers()\n }\n this.state = {\n addEditModalIsOpen: false,\n pendingUser: null,\n THE_GRID: null,\n }\n }\n\n setPendingUser = user => {\n this.setState({\n pendingUser: user,\n })\n }\n\n closeModal = () => {\n if (this.props.userManagementError) {\n this.props.clearUserManagementError()\n }\n this.setState({ pendingUser: null, addEditModalIsOpen: false })\n }\n\n openAddEditModal = () => {\n this.setState({ addEditModalIsOpen: true })\n }\n\n getUniqueStuff = assignments => {\n const roles = []\n const scopes = []\n assignments.toJS().items.forEach(assignment => {\n if (!scopes.includes(assignment.scope)) {\n scopes.push(assignment.scope)\n }\n assignment.role.items.forEach(role => {\n if (!roles.includes(role.srn)) {\n roles.push(role.srn)\n }\n })\n })\n return { roles: roles.length, scopes: scopes.length }\n }\n\n buildUserList = () => {\n const userList = []\n this.props.users.forEach(user => {\n const uniques = this.getUniqueStuff(user.get('roleAssignments'))\n userList.push({\n name: stripTags(user.get('name')),\n srn: user.get('srn'),\n email: stripTags(user.get('email')),\n lastLogin: user.get('lastLogin'),\n status: user.get('isActive'),\n uniqueRoles: uniques.roles,\n uniqueScopes: uniques.scopes,\n })\n })\n return userList\n }\n\n buildPendingList = () => {\n const pendingList = []\n this.props.pendingUsers.toJS().forEach(invitedDude => {\n pendingList.push({\n email: stripTags(invitedDude.email),\n dateSent: invitedDude.dateSent,\n isPending: invitedDude.isPending,\n expiry: invitedDude.expiry,\n viewEdit: invitedDude.srn,\n cancel: invitedDude.srn,\n resend: invitedDude.srn,\n resourceId: invitedDude.resourceId,\n })\n })\n return pendingList\n }\n\n viewUser = data => {\n let foundUser = null\n this.props.users.forEach(user => {\n if (user.get('email') === data.email) {\n foundUser = user.set()\n }\n })\n\n if (foundUser) {\n this.props.push({\n pathname: '/App/UserManagement/User',\n search: qs.stringify({\n srn: foundUser.get('srn'),\n }),\n })\n }\n }\n\n setApi = api => {\n this.setState({ THE_GRID: api })\n }\n\n renderUserTable = () => {\n if (this.props.usersLoading) {\n return (\n \n \n \n )\n } else {\n const users = this.buildUserList()\n\n return (\n {\n return \n },\n },\n email: {\n flex: 1,\n },\n lastLogin: {\n headerName: 'Last Login',\n cellRendererFramework: params => {\n const date = moment(params.value)\n if (date.isValid()) {\n return date.format('ll')\n } else {\n return '-'\n }\n },\n },\n srn: {\n hide: true,\n },\n }}\n />\n )\n }\n }\n\n cancelInvite = srn => {\n this.props.cancelUserInvite({ srn: srn })\n }\n\n resendInvite = srn => {\n this.props.pendingUsers.forEach(user => {\n if (user.get('srn') === srn) {\n this.props.resendUserInvite({ srn: srn, pendingGuy: user })\n }\n })\n }\n\n viewRoles = value => {\n this.props.pendingUsers.forEach(user => {\n if (user.get('srn') === value) {\n this.setPendingUser(user)\n this.openAddEditModal()\n }\n })\n }\n\n getAllEmails = () => {\n const existingEmails = []\n const pendingEmails = []\n this.props.users.forEach(user => {\n existingEmails.push(user.get('email'))\n })\n\n this.props.pendingUsers.forEach(pender => {\n pendingEmails.push(pender.get('email'))\n })\n\n return { existing: existingEmails, pending: pendingEmails }\n }\n\n renderPendingUsers = () => {\n if (this.props.fetchingPendingUsers) {\n return (\n \n \n \n )\n } else {\n const pending = this.buildPendingList()\n const cantEditAnyUsers =\n undefined ===\n pending.find(invitedDude => {\n let canInv = false\n canInv =\n this.props.userHasPermission({\n permissionName: 'edit.users',\n resourceId: invitedDude.resourceId,\n }) ||\n this.props.userHasPermission({\n permissionName: 'edit.invites',\n resourceId: invitedDude.resourceId,\n })\n return canInv\n })\n if (this.state.THE_GRID) {\n this.state.THE_GRID.api.redrawRows()\n }\n const config = {\n resourceId: {\n hide: true,\n },\n email: {\n flex: 1,\n },\n viewEdit: {\n hide: cantEditAnyUsers,\n aggFunc: null,\n headerName: '',\n width: 200,\n cellRendererFramework: params => {\n return (\n \n {\n this.viewRoles(params.value)\n }}\n disabled={this.props.cancellingUserInvites.get(params.value)}\n >\n \n \n \n )\n },\n },\n cancel: {\n hide: cantEditAnyUsers,\n aggFunc: null,\n headerName: '',\n enableRowGroup: false,\n menuTabs: [],\n suppressMenu: true,\n width: 140,\n cellRendererFramework: params => {\n return (\n \n {this.props.cancellingUserInvites.get(params.value) ? (\n
\n \n \n \n \n \n \n
\n ) : (\n {\n this.cancelInvite(params.value)\n }}\n disabled={this.props.resendingUserInvite.get(params.value)}\n >\n \n \n )}\n \n )\n },\n },\n resend: {\n hide: cantEditAnyUsers,\n aggFunc: null,\n headerName: '',\n enableRowGroup: false,\n menuTabs: [],\n suppressMenu: true,\n width: 190,\n cellRendererFramework: params => {\n return (\n \n {this.props.resendingUserInvite.get(params.value) ? (\n
\n \n \n \n \n \n \n
\n ) : (\n {\n this.resendInvite(params.value)\n }}\n disabled={this.props.cancellingUserInvites.get(\n params.value\n )}\n >\n \n \n )}\n \n )\n },\n },\n dateSent: {\n headerName: 'Date Sent',\n cellRendererFramework: params => {\n const date = moment(params.value)\n if (date.isValid()) {\n return date.format('ll')\n } else {\n return '-'\n }\n },\n },\n isPending: {\n headerName: 'Active',\n },\n expiry: {\n headerName: 'Expiry Date',\n cellRendererFramework: params => {\n const date = moment(params.value)\n if (date.isValid()) {\n return date.format('ll')\n } else {\n return '-'\n }\n },\n },\n }\n return (\n \n )\n }\n }\n\n render() {\n const canViewData = this.props.userHasPermission({\n permissionName: 'view.data',\n })\n return (\n
\n \n
\n \n \n \n
\n \n {\n this.props.push({\n pathname: '/App/UserManagement/UserActivity',\n })\n }}\n >\n \n \n \n `/org/${org}/`,\n },\n {\n permissionName: 'edit.invites',\n resourceId: ({ org }) => `/org/${org}/`,\n },\n ]}\n >\n \n \n \n \n
\n
\n \n
\n \n {this.renderUserTable()}\n \n
\n
\n
\n \n
\n \n {this.renderPendingUsers()}\n \n
\n
\n {this.state.addEditModalIsOpen && (\n \n )}\n \n )\n }\n}\n\nUserManagement.propTypes = {\n users: ImmutablePropTypes.map,\n sonraiScopes: ImmutablePropTypes.list,\n fetchPendingUsers: PropTypes.func,\n pendingUsers: ImmutablePropTypes.list,\n cancellingUserInvites: ImmutablePropTypes.map,\n fetchingPendingUsers: PropTypes.bool,\n usersLoading: PropTypes.bool,\n push: PropTypes.func,\n inviteUser: PropTypes.func,\n invitingUser: PropTypes.bool,\n updateUserInvite: PropTypes.func,\n updatingUserInvite: ImmutablePropTypes.map,\n resendUserInvite: PropTypes.func,\n cancelUserInvite: PropTypes.func,\n resendingUserInvite: ImmutablePropTypes.map,\n userHasPermission: PropTypes.func.isRequired,\n updatePendingRoleAssignments: PropTypes.func.isRequired,\n userManagementError: PropTypes.string,\n clearUserManagementError: PropTypes.func,\n updatingUserRoles: PropTypes.bool,\n}\n\nconst mapStateToProps = createStructuredSelector({\n users: selectSonraiUsers,\n usersLoading: selectSonraiUsersLoading,\n pendingUsers: selectPendingUsers,\n fetchingPendingUsers: selectFetchingPendingUsers,\n sonraiScopes: selectSonraiScopes,\n cancellingUserInvites: selectCancellingUserInvite,\n invitingUser: selectInvitingUser,\n updatingUserInvite: selectUpdatingUserInvite,\n resendingUserInvite: selectResendingUserInvite,\n userManagementError: selectUserManagementError,\n updatingUserRoles: selectUpdatingUserRoles,\n})\n\nfunction mapDispatchToProps(dispatch) {\n return bindActionCreators(\n {\n fetchPendingUsers,\n inviteUser,\n updateUserInvite,\n cancelUserInvite,\n resendUserInvite,\n updatePendingRoleAssignments,\n clearUserManagementError,\n push,\n },\n dispatch\n )\n}\n\nconst withConnect = connect(mapStateToProps, mapDispatchToProps)\n\nconst withSaga = injectSaga({\n key: 'userManagementData',\n saga: userManagementSaga,\n})\nconst withReducer = injectReducer({\n key: 'userManagementData',\n reducer: userManagementReducer,\n})\n\nexport default compose(\n withReducer,\n withSaga,\n withConnect,\n permissionChecker\n)(UserManagement)\n"],"sourceRoot":""}