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' },
+ }}
+ >
+
+
+
+
+
+
+ }
+ onClick={() => {
+ setUploaderChoice(null)
+ setUploaderDialogOpen(true)
+ }}
+ sx={{
+ textTransform: 'none',
+ borderColor: '#3399FF44',
+ color: '#7FBFFF',
+ '&:hover': { borderColor: '#3399FF99', bgcolor: '#3399FF12' },
+ }}
+ >
+ Uploader
+
+
+