1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-24 12:58:34 +00:00
Files
seahub/frontend/src/metadata/components/dialog/peoples-dialog/index.js
2025-07-30 11:31:27 +08:00

98 lines
3.5 KiB
JavaScript

import React, { useCallback, useMemo, useState } from 'react';
import PropTypes from 'prop-types';
import { Modal, ModalBody, ModalFooter, Button, FormGroup, Label } from 'reactstrap';
import CustomizeSelect from '../../../../components/customize-select';
import SeahubModalHeader from '@/components/common/seahub-modal-header';
import People from './people';
import { gettext } from '../../../../utils/constants';
import { useMetadataView } from '../../../hooks/metadata-view';
import './index.css';
const PeoplesDialog = ({ selectedImages, onToggle, onSubmit }) => {
const [selectedPeopleIds, setSelectedPeopleIds] = useState([]);
const [isSubmitting, setSubmitting] = useState(false);
const { metadata } = useMetadataView();
const peopleOptions = useMemo(() => {
return metadata.rows.filter(people => people._is_someone).map(people => {
const isSelected = selectedPeopleIds.some(id => id === people._id);
return {
value: people._id,
label: (
<div className="select-option-people">
<People people={people} />
<div className="people-check-icon">
{isSelected && <i className="sf2-icon-tick"></i>}
</div>
</div>
),
};
});
}, [metadata, selectedPeopleIds]);
const onSelectPeople = useCallback((value) => {
if (selectedPeopleIds.some(id => id === value)) {
setSelectedPeopleIds(selectedPeopleIds.filter(id => id !== value));
} else {
setSelectedPeopleIds([...selectedPeopleIds, value]);
}
}, [selectedPeopleIds]);
const handleSubmit = useCallback(() => {
setSubmitting(true);
onSubmit(selectedPeopleIds, selectedImages, {
success_callback: onToggle,
fail_callback: () => setSubmitting(false),
});
}, [selectedImages, selectedPeopleIds, onToggle, onSubmit]);
const onDelete = useCallback((event, people) => {
event.stopPropagation();
setSelectedPeopleIds(selectedPeopleIds.filter(id => id !== people._id));
}, [selectedPeopleIds]);
const selectedValue = useMemo(() => {
return (
<div className="sf-metadata-delete-people">
{Array.isArray(selectedPeopleIds) && selectedPeopleIds.length > 0 && selectedPeopleIds.map(id => {
const people = metadata.rows.find(people => people._id === id);
if (!people) return null;
return <People key={id} people={people} isCancellable={true} onDelete={onDelete} />;
})}
</div>
);
}, [selectedPeopleIds, metadata, onDelete]);
return (
<Modal isOpen={true} toggle={() => onToggle()} className="sf-metadata-peoples-dialog">
<SeahubModalHeader toggle={() => onToggle()}>{gettext('People')}</SeahubModalHeader>
<ModalBody>
<FormGroup className="">
<Label>{gettext('People')}</Label>
<CustomizeSelect
value={selectedValue ? { label: selectedValue } : {}}
options={peopleOptions}
onSelectOption={onSelectPeople}
supportMultipleSelect={true}
searchable={true}
/>
</FormGroup>
</ModalBody>
<ModalFooter>
<Button color="secondary" onClick={() => onToggle()}>{gettext('Cancel')}</Button>
<Button color="primary" disabled={isSubmitting || !selectedPeopleIds.length} onClick={handleSubmit}>{gettext('Submit')}</Button>
</ModalFooter>
</Modal>
);
};
PeoplesDialog.propTypes = {
onToggle: PropTypes.func,
selectedImages: PropTypes.array,
onSubmit: PropTypes.func,
};
export default PeoplesDialog;