import React, { useState, useEffect, useMemo } from 'react' import Checkbox from '@material-ui/core/Checkbox' import CheckBoxIcon from '@material-ui/icons/CheckBox' import CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank' import { List, ListItem, ListItemIcon, ListItemText, Typography, Box, } from '@material-ui/core' import { useGetList, useTranslate } from 'react-admin' import PropTypes from 'prop-types' import { makeStyles } from '@material-ui/core' const useStyles = makeStyles((theme) => ({ root: { width: '960px', maxWidth: '100%', }, headerContainer: { display: 'flex', alignItems: 'center', marginBottom: theme.spacing(1), paddingLeft: theme.spacing(1), }, masterCheckbox: { padding: '7px', marginLeft: '-9px', marginRight: theme.spacing(1), }, libraryList: { height: '120px', overflow: 'auto', border: `1px solid ${theme.palette.divider}`, borderRadius: theme.shape.borderRadius, backgroundColor: theme.palette.background.paper, }, listItem: { paddingTop: 0, paddingBottom: 0, }, emptyMessage: { padding: theme.spacing(2), textAlign: 'center', color: theme.palette.text.secondary, }, })) const EmptyLibraryMessage = () => { const classes = useStyles() return (
No libraries available
) } const LibraryListItem = ({ library, isSelected, onToggle }) => { const classes = useStyles() return ( onToggle(library)} dense > } checkedIcon={} checked={isSelected} tabIndex={-1} disableRipple /> ) } export const SelectLibraryInput = ({ onChange, value = [], isNewUser = false, }) => { const classes = useStyles() const translate = useTranslate() const [selectedLibraryIds, setSelectedLibraryIds] = useState([]) const [hasInitialized, setHasInitialized] = useState(false) const { ids, data, isLoading } = useGetList( 'library', { page: 1, perPage: -1 }, { field: 'name', order: 'ASC' }, ) const options = useMemo( () => (ids && ids.map((id) => data[id])) || [], [ids, data], ) // Reset initialization state when isNewUser changes useEffect(() => { if (isNewUser) { setHasInitialized(false) } }, [isNewUser]) // Pre-select default libraries for new users useEffect(() => { if ( isNewUser && !isLoading && options.length > 0 && !hasInitialized && Array.isArray(value) && value.length === 0 ) { const defaultLibraryIds = options .filter((lib) => lib.defaultNewUsers) .map((lib) => lib.id) if (defaultLibraryIds.length > 0) { setSelectedLibraryIds(defaultLibraryIds) onChange(defaultLibraryIds) } setHasInitialized(true) } }, [isNewUser, isLoading, options, hasInitialized, value, onChange]) // Update selectedLibraryIds when value prop changes (for editing mode and pre-selection) useEffect(() => { // For new users, only sync from value prop if it has actual data // This prevents empty initial state from overriding our pre-selection if (isNewUser && Array.isArray(value) && value.length === 0) { return } if (Array.isArray(value)) { const libraryIds = value.map((item) => typeof item === 'object' ? item.id : item, ) setSelectedLibraryIds(libraryIds) } else if (value.length === 0) { // Handle case where value is explicitly set to empty array (for existing users) setSelectedLibraryIds([]) } }, [value, isNewUser, hasInitialized]) const isLibrarySelected = (library) => selectedLibraryIds.includes(library.id) const handleLibraryToggle = (library) => { const isSelected = selectedLibraryIds.includes(library.id) let newSelection if (isSelected) { newSelection = selectedLibraryIds.filter((id) => id !== library.id) } else { newSelection = [...selectedLibraryIds, library.id] } setSelectedLibraryIds(newSelection) onChange(newSelection) } const handleMasterCheckboxChange = () => { const isAllSelected = selectedLibraryIds.length === options.length const newSelection = isAllSelected ? [] : options.map((lib) => lib.id) setSelectedLibraryIds(newSelection) onChange(newSelection) } const selectedCount = selectedLibraryIds.length const totalCount = options.length const isAllSelected = selectedCount === totalCount && totalCount > 0 const isIndeterminate = selectedCount > 0 && selectedCount < totalCount return (
{options.length > 1 && ( {translate('resources.user.message.selectAllLibraries')} )} {options.length === 0 ? ( ) : ( options.map((library) => ( )) )}
) } SelectLibraryInput.propTypes = { onChange: PropTypes.func.isRequired, value: PropTypes.array, isNewUser: PropTypes.bool, } LibraryListItem.propTypes = { library: PropTypes.object.isRequired, isSelected: PropTypes.bool.isRequired, onToggle: PropTypes.func.isRequired, }