diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OItem.scala b/modules/backend/src/main/scala/docspell/backend/ops/OItem.scala index ed235531..f8e8b4a7 100644 --- a/modules/backend/src/main/scala/docspell/backend/ops/OItem.scala +++ b/modules/backend/src/main/scala/docspell/backend/ops/OItem.scala @@ -53,6 +53,12 @@ trait OItem[F[_]] { def setFolder(item: Ident, folder: Option[Ident], collective: Ident): F[UpdateResult] + def setFolderMultiple( + items: NonEmptyList[Ident], + folder: Option[Ident], + collective: Ident + ): F[UpdateResult] + def setCorrOrg(item: Ident, org: Option[Ident], collective: Ident): F[AddResult] def addCorrOrg(item: Ident, org: OOrganization.OrgAndContacts): F[AddResult] @@ -269,6 +275,27 @@ object OItem { onSuccessIgnoreError(fts.updateFolder(logger, item, collective, folder)) ) + def setFolderMultiple( + items: NonEmptyList[Ident], + folder: Option[Ident], + collective: Ident + ): F[UpdateResult] = + for { + results <- items.traverse(i => setFolder(i, folder, collective)) + err <- results.traverse { + case UpdateResult.NotFound => + logger.info("An item was not found when updating the folder") *> 0.pure[F] + case UpdateResult.Failure(err) => + logger.error(err)("An item failed to update its folder") *> 1.pure[F] + case UpdateResult.Success => + 0.pure[F] + } + res = + if (results.size == err.fold) + UpdateResult.failure(new Exception("All items failed to update")) + else UpdateResult.success + } yield res + def setCorrOrg(item: Ident, org: Option[Ident], collective: Ident): F[AddResult] = store .transact(RItem.updateCorrOrg(item, collective, org)) diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/ItemMultiRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/ItemMultiRoutes.scala index 9b4a0441..2c691c80 100644 --- a/modules/restserver/src/main/scala/docspell/restserver/routes/ItemMultiRoutes.scala +++ b/modules/restserver/src/main/scala/docspell/restserver/routes/ItemMultiRoutes.scala @@ -76,7 +76,7 @@ object ItemMultiRoutes { case req @ PUT -> Root / "name" => for { - json <- req.as[ItemsAndName] + json <- req.as[ItemsAndName] items <- readIds[F](json.items) res <- backend.item.setNameMultiple( items, @@ -86,6 +86,13 @@ object ItemMultiRoutes { resp <- Ok(Conversions.basicResult(res, "Name updated")) } yield resp + case req @ PUT -> Root / "folder" => + for { + json <- req.as[ItemsAndRef] + items <- readIds[F](json.items) + res <- backend.item.setFolderMultiple(items, json.ref, user.account.collective) + resp <- Ok(Conversions.basicResult(res, "Folder updated")) + } yield resp // case req @ PUT -> Root / "direction" => // for { @@ -94,13 +101,6 @@ object ItemMultiRoutes { // resp <- Ok(Conversions.basicResult(res, "Direction updated")) // } yield resp - // case req @ PUT -> Root / "folder" => - // for { - // idref <- req.as[OptionalId] - // res <- backend.item.setFolder(id, idref.id, user.account.collective) - // resp <- Ok(Conversions.basicResult(res, "Folder updated")) - // } yield resp - // case req @ PUT -> Root / "corrOrg" => // for { // idref <- req.as[OptionalId] diff --git a/modules/webapp/src/main/elm/Api.elm b/modules/webapp/src/main/elm/Api.elm index 6811a90f..077975ca 100644 --- a/modules/webapp/src/main/elm/Api.elm +++ b/modules/webapp/src/main/elm/Api.elm @@ -83,6 +83,7 @@ module Api exposing , setCorrPerson , setDirection , setFolder + , setFolderMultiple , setItemDate , setItemDueDate , setItemName @@ -134,6 +135,7 @@ import Api.Model.ItemProposals exposing (ItemProposals) import Api.Model.ItemSearch exposing (ItemSearch) import Api.Model.ItemUploadMeta exposing (ItemUploadMeta) import Api.Model.ItemsAndName exposing (ItemsAndName) +import Api.Model.ItemsAndRef exposing (ItemsAndRef) import Api.Model.ItemsAndRefs exposing (ItemsAndRefs) import Api.Model.JobPriority exposing (JobPriority) import Api.Model.JobQueueState exposing (JobQueueState) @@ -1312,6 +1314,20 @@ setNameMultiple flags data receive = } +setFolderMultiple : + Flags + -> ItemsAndRef + -> (Result Http.Error BasicResult -> msg) + -> Cmd msg +setFolderMultiple flags data receive = + Http2.authPut + { url = flags.config.baseUrl ++ "/api/v1/sec/items/folder" + , account = getAccount flags + , body = Http.jsonBody (Api.Model.ItemsAndRef.encode data) + , expect = Http.expectJson receive Api.Model.BasicResult.decoder + } + + --- Item diff --git a/modules/webapp/src/main/elm/Comp/ItemDetail/FormChange.elm b/modules/webapp/src/main/elm/Comp/ItemDetail/FormChange.elm index 1768f310..8ac01514 100644 --- a/modules/webapp/src/main/elm/Comp/ItemDetail/FormChange.elm +++ b/modules/webapp/src/main/elm/Comp/ItemDetail/FormChange.elm @@ -7,6 +7,7 @@ import Api import Api.Model.BasicResult exposing (BasicResult) import Api.Model.IdName exposing (IdName) import Api.Model.ItemsAndName exposing (ItemsAndName) +import Api.Model.ItemsAndRef exposing (ItemsAndRef) import Api.Model.ItemsAndRefs exposing (ItemsAndRefs) import Api.Model.ReferenceList exposing (ReferenceList) import Data.Direction exposing (Direction) @@ -55,5 +56,12 @@ multiUpdate flags ids change receive = in Api.setNameMultiple flags data receive + FolderChange id -> + let + data = + ItemsAndRef items (Maybe.map .id id) + in + Api.setFolderMultiple flags data receive + _ -> Cmd.none