diff --git a/README.md b/README.md index 0844c2b1..60ad72ee 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,8 @@ services: environment: - ADMIN_USERNAME=your-admin-username - ADMIN_PASSWORD=your-admin-password - - SECRET_KEY=replace_with_random_string_can_be_anything + # A key for signing login cookies is generated on first start and kept in + # /data, so there is nothing to set here. See docs/Security.md # The domain your instance is hosted at. e.x: demo.fireshare.net # this is required for opengraph to work correctly for shared links. - DOMAIN= diff --git a/app/client/src/components/admin/ImageFileManager.js b/app/client/src/components/admin/ImageFileManager.js index 64acbcf8..d91a77f2 100644 --- a/app/client/src/components/admin/ImageFileManager.js +++ b/app/client/src/components/admin/ImageFileManager.js @@ -34,6 +34,7 @@ import SearchIcon from '@mui/icons-material/Search' import FolderIcon from '@mui/icons-material/Folder' import OpenInNewIcon from '@mui/icons-material/OpenInNew' import LockIcon from '@mui/icons-material/Lock' +import PersonIcon from '@mui/icons-material/Person' import LockOpenIcon from '@mui/icons-material/LockOpen' import RefreshIcon from '@mui/icons-material/Refresh' import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown' @@ -305,6 +306,9 @@ export default function ImageFileManager({ setAlert }) { const [moveModalOpen, setMoveModalOpen] = useState(false) const [createFolderDialogOpen, setCreateFolderDialogOpen] = useState(false) const [renameDialogOpen, setRenameDialogOpen] = useState(false) + const [uploaderDialogOpen, setUploaderDialogOpen] = useState(false) + const [uploaderChoice, setUploaderChoice] = useState(null) + const [uploaderOptions, setUploaderOptions] = useState([]) const [colVisAnchor, setColVisAnchor] = useState(null) // Rename form state @@ -493,7 +497,7 @@ export default function ImageFileManager({ setAlert }) { setActionLoading(true) try { const { data } = await Api().post(endpoint, body) - const updatedCount = (data.updated ?? data.moved ?? data.deleted ?? []).length + const updatedCount = data.updated_images ?? (data.updated ?? data.moved ?? data.deleted ?? []).length const errorCount = (data.errors ?? []).length if (errorCount > 0) { setAlert({ @@ -597,6 +601,23 @@ export default function ImageFileManager({ setAlert }) { } } + useEffect(() => { + if (!uploaderDialogOpen) return + Api() + .get('/api/admin/uploaders') + .then((res) => setUploaderOptions(res.data.users || [])) + .catch(() => setUploaderOptions([])) + }, [uploaderDialogOpen]) + + const handleSetUploader = async () => { + const ok = await runBulkAction( + '/api/admin/image-files/bulk-set-uploader', + { image_ids: [...selected], username: uploaderChoice }, + uploaderChoice ? `Attributed to ${uploaderChoice}` : 'Uploader cleared', + ) + if (ok) setUploaderDialogOpen(false) + } + const handleSetPrivacy = async (isPrivate) => { await runBulkAction( '/api/admin/image-files/bulk-set-privacy', @@ -709,6 +730,26 @@ export default function ImageFileManager({ setAlert }) { + + + { + setUploaderChoice(null) + setUploaderDialogOpen(true) + }} + sx={{ + border: '1px solid #3399FF44', + borderRadius: 1, + color: '#7FBFFF', + '&:hover': { bgcolor: '#3399FF12' }, + }} + > + + + + + + + + +