// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance // with the License. A copy of the License is located at // // http://aws.amazon.com/apache2.0/ // // or in the "LICENSE.txt" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES // OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions and // limitations under the License. import React, {useCallback, useEffect} from 'react' import {useSelector} from 'react-redux' import {useCollection} from '@cloudscape-design/collection-hooks' import {clearState, setState, useState} from '../../store' import {DeleteUser, ListUsers} from '../../model' // UI Elements import { Button, Header, Pagination, SpaceBetween, Table, TextFilter, } from '@cloudscape-design/components' // Components import EmptyState from '../../components/EmptyState' import DateView from '../../components/date/DateView' import { DeleteDialog, showDialog, hideDialog, } from '../../components/DeleteDialog' import Layout from '../Layout' import {useHelpPanel} from '../../components/help-panel/HelpPanel' import {User} from '../../types/users' import {Trans, useTranslation} from 'react-i18next' import TitleDescriptionHelpPanel from '../../components/help-panel/TitleDescriptionHelpPanel' import InfoLink from '../../components/InfoLink' import {extendCollectionsOptions} from '../../shared/extendCollectionsOptions' import AddUserModal from './AddUserModal' const selectUserIndex = (state: any) => state.users.index function UsersHelpPanel() { const {t} = useTranslation() return ( } /> ) } const usersSlug = 'users' export default function Users() { const {t} = useTranslation() const loading = !useSelector(selectUserIndex) const user_index = useSelector(selectUserIndex) || {} const usernames = Object.keys(user_index).sort() const users = usernames .map(username => user_index[username]) .map(user => ({ ...user, email: user.Attributes.email, // adds the email as first-level property so that Cloudscape can filter properly })) const userEmail = useState(['app', 'user', 'delete', 'Attributes', 'email']) const deletedUser = useState(['app', 'user', 'delete']) const [selectedUsers, setSelectedUsers] = React.useState([]) const currentUserEmail = useState(['identity', 'attributes', 'email']) const [addUserModalVisible, setAddUserModalVisible] = React.useState(false) useHelpPanel() useEffect(() => { ListUsers() }, []) const refreshUsers = useCallback(() => { ListUsers() }, []) const { items, actions, filteredItemsCount, collectionProps, filterProps, paginationProps, } = useCollection( users || [], extendCollectionsOptions({ filtering: { empty: ( } /> ), noMatch: ( actions.setFiltering('')}> {t('users.list.filtering.noMatch.action')} } /> ), }, sorting: { defaultState: { sortingColumn: { sortingField: 'email', }, }, }, selection: {}, }), ) const deleteUser = useCallback(() => { DeleteUser(deletedUser, (returned_user: any) => { clearState(['users', 'index', returned_user.Username]) setSelectedUsers([]) }) hideDialog('deleteUser') }, [deletedUser]) const isDeleteUserButtonDisabled = () => { return ( selectedUsers.length === 0 || currentUserEmail === selectedUsers[0].Attributes.email ) } const onSelectionChangeCallback = useCallback(({detail}) => { setSelectedUsers(detail.selectedItems) }, []) return ( {t('users.list.dialogs.delete.body', {userEmail})} item.email} variant="full-page" selectionType="single" stickyHeader header={
} />} actions={ } > {t('users.header.title')}
} columnDefinitions={[ { id: 'email', header: t('users.list.columns.email'), cell: item => item.email || '-', sortingField: 'email', }, { id: 'created', header: t('users.list.columns.created'), cell: item => , sortingField: 'UserCreateDate', }, ]} loading={loading} items={items} loadingText={t('users.list.filtering.loadingText')} pagination={} onSelectionChange={onSelectionChangeCallback} selectedItems={selectedUsers} filter={ } /> ) }