mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-05-23 09:09:36 +02:00
Admin tools: fix minor bugs
This commit is contained in:
@@ -279,6 +279,7 @@ async function deleteProject(projectId, options = {}) {
|
||||
{ projectId, userId: project.owner_ref },
|
||||
'successfully deleted project'
|
||||
)
|
||||
return { deletedAt: deleterData.deletedAt, deleterId: deleterData.deleterId }
|
||||
} catch (err) {
|
||||
logger.warn({ err }, 'problem deleting project')
|
||||
throw err
|
||||
|
||||
@@ -69,6 +69,10 @@ export default {
|
||||
AuthorizationMiddleware.ensureUserIsSiteAdmin,
|
||||
ProjectListController.purgeDeletedProject
|
||||
)
|
||||
webRouter.delete('/admin/project/:project_id',
|
||||
AuthorizationMiddleware.ensureUserIsSiteAdmin,
|
||||
ProjectListController.deleteProject
|
||||
)
|
||||
webRouter.post('/admin/project/:project_id/undelete',
|
||||
AuthorizationMiddleware.ensureUserIsSiteAdmin,
|
||||
ProjectListController.undeleteProject
|
||||
|
||||
@@ -117,7 +117,7 @@ function _sortAndPaginate(projects, sort, page) {
|
||||
throw new OError('Invalid sorting criteria', { sort })
|
||||
}
|
||||
|
||||
// sorting by owner is not implemented, it is mot needed
|
||||
// sorting by owner is not implemented, it is not needed
|
||||
const sortedProjects =
|
||||
sort.by === 'title'
|
||||
? [...projects].sort((a, b) =>
|
||||
@@ -162,7 +162,7 @@ function _formatDeletedProjectInfo(deletedProject, maxDate) {
|
||||
trashed,
|
||||
deleted: true,
|
||||
deletedAt: deletedProject.deleterData?.deletedAt?.toISOString(),
|
||||
deletedBy: deletedProject.deleterData?.deleterId,
|
||||
deleterId: deletedProject.deleterData?.deleterId,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -212,6 +212,14 @@ async function untrashProjectForUser(req, res) {
|
||||
res.sendStatus(200)
|
||||
}
|
||||
|
||||
async function deleteProject(req, res) {
|
||||
const projectId = req.params.project_id
|
||||
const deleterId = SessionManager.getLoggedInUserId(req.session)
|
||||
const options = { deleterUser: {_id: deleterId } }
|
||||
const deletedProjectData = await ProjectDeleter.promises.deleteProject(projectId, options)
|
||||
return res.json(deletedProjectData)
|
||||
}
|
||||
|
||||
async function undeleteProject(req, res) {
|
||||
const projectId = req.params.project_id
|
||||
const { userId } = req.body
|
||||
@@ -232,6 +240,7 @@ async function purgeDeletedProject(req, res) {
|
||||
export default {
|
||||
manageProjectsPage: expressify(manageProjectsPage),
|
||||
getProjectsJson: expressify(getProjectsJson),
|
||||
deleteProject: expressify(deleteProject),
|
||||
undeleteProject: expressify(undeleteProject),
|
||||
purgeDeletedProject: expressify(purgeDeletedProject),
|
||||
trashProjectForUser: expressify(trashProjectForUser),
|
||||
|
||||
@@ -34,11 +34,13 @@ function DeleteProjectButton({ project, children }: DeleteProjectButtonProps) {
|
||||
}, [isMounted])
|
||||
|
||||
const handleDeleteProject = useCallback(async () => {
|
||||
await deleteProject(project.id)
|
||||
toggleSelectedProject(project.id, false)
|
||||
updateProjectViewData({
|
||||
...project,
|
||||
deleted: true,
|
||||
return deleteProject(project.id).then(data => {
|
||||
toggleSelectedProject(project.id, false)
|
||||
updateProjectViewData({
|
||||
...project,
|
||||
...data,
|
||||
deleted: true,
|
||||
})
|
||||
})
|
||||
}, [project, toggleSelectedProject, updateProjectViewData])
|
||||
|
||||
|
||||
@@ -35,7 +35,6 @@ function RestoreProjectButton({
|
||||
}, [isMounted])
|
||||
|
||||
const handleRestoreProject = useCallback(() => {
|
||||
// const ownerId = project.owner ?? getMeta('ol-user_id')
|
||||
return undeleteProject(project.id, project.owner).then(data => {
|
||||
toggleSelectedProject(project.id, false)
|
||||
updateProjectViewData({
|
||||
|
||||
@@ -19,7 +19,7 @@ function ProjectListTableRow({ project, selected, filter }: ProjectListTableRowP
|
||||
const ownerName = getUserNameById(project.owner)
|
||||
const actorName = filter !== 'deleted' ?
|
||||
getUserNameById(project.lastUpdatedBy) :
|
||||
getUserNameById(project.deletedBy)
|
||||
getUserNameById(project.deleterId)
|
||||
const eventDate = filter !== 'deleted' ? project.lastUpdated : project.deletedAt
|
||||
|
||||
return (
|
||||
|
||||
@@ -28,11 +28,13 @@ function DeleteProjectsButton() {
|
||||
}
|
||||
|
||||
const handleDeleteProject = async (project: Project) => {
|
||||
await deleteProject(project.id)
|
||||
toggleSelectedProject(project.id, false)
|
||||
updateProjectViewData({
|
||||
...project,
|
||||
deleted: true,
|
||||
return deleteProject(project.id).then(data => {
|
||||
toggleSelectedProject(project.id, false)
|
||||
updateProjectViewData({
|
||||
...project,
|
||||
...data,
|
||||
deleted: true,
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -184,7 +184,7 @@ export function ProjectListProvider({ projectsOwnerId, children }: ProjectListPr
|
||||
|
||||
const loadMoreProjects = useCallback(() => {
|
||||
setMaxVisibleProjects(v => v + loadMoreCount)
|
||||
}, [maxVisibleProjects])
|
||||
}, [loadMoreCount])
|
||||
|
||||
const [selectedProjectIds, setSelectedProjectIds] = useState(
|
||||
() => new Set<string>()
|
||||
@@ -213,9 +213,8 @@ export function ProjectListProvider({ projectsOwnerId, children }: ProjectListPr
|
||||
return visibleProjects.filter(project => selectedProjectIds.has(project.id))
|
||||
}, [selectedProjectIds, visibleProjects])
|
||||
|
||||
|
||||
const selectOrUnselectAllProjects = useCallback(
|
||||
(checked: any) => {
|
||||
(checked: boolean) => {
|
||||
setSelectedProjectIds(prevSelectedProjectIds => {
|
||||
const selectedProjectIds = new Set(prevSelectedProjectIds)
|
||||
for (const project of visibleProjects) {
|
||||
|
||||
@@ -20,7 +20,7 @@ export function getProjects(
|
||||
}
|
||||
|
||||
export function deleteProject(projectId: string) {
|
||||
return deleteJSON(`/project/${projectId}`)
|
||||
return deleteJSON(`/admin/project/${projectId}`)
|
||||
}
|
||||
|
||||
export function purgeProject(projectId: string) {
|
||||
|
||||
@@ -10,7 +10,6 @@ const order = (order: SortingOrder, projects: Project[]) => {
|
||||
function cmp(a, b) {
|
||||
const aEmpty = a == null || a === ""
|
||||
const bEmpty = b == null || b === ""
|
||||
if (aEmpty && bEmpty) return Compare.SORT_KEEP_ORDER
|
||||
if (aEmpty) return Compare.SORT_A_AFTER_B
|
||||
if (bEmpty) return Compare.SORT_A_BEFORE_B
|
||||
return a.localeCompare(b)
|
||||
@@ -57,7 +56,7 @@ export const defaultComparator = (
|
||||
if (value1 !== value2) {
|
||||
if (value1 === undefined) return Compare.SORT_A_BEFORE_B
|
||||
if (value2 === undefined) return Compare.SORT_A_AFTER_B
|
||||
return value1 < value2 ? Compare.SORT_A_BEFORE_B : Compare.SORT_A_AFTER_B
|
||||
return value1.localeCompare(value2)
|
||||
}
|
||||
|
||||
return Compare.SORT_KEEP_ORDER
|
||||
|
||||
@@ -40,7 +40,7 @@ export type ProjectApi = {
|
||||
trashed: boolean
|
||||
deleted: boolean
|
||||
inactive?: boolean
|
||||
deletedBy?: string
|
||||
deleterId?: string
|
||||
deletedAt?: Date
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user