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 e9fb35b9..5d1e816c 100644 --- a/modules/backend/src/main/scala/docspell/backend/ops/OItem.scala +++ b/modules/backend/src/main/scala/docspell/backend/ops/OItem.scala @@ -98,13 +98,17 @@ trait OItem[F[_]] { collective: Ident ): F[AddResult] - def setItemDate(item: Ident, date: Option[Timestamp], collective: Ident): F[AddResult] - - def setItemDueDate( - item: Ident, + def setItemDate( + item: NonEmptyList[Ident], date: Option[Timestamp], collective: Ident - ): F[AddResult] + ): F[UpdateResult] + + def setItemDueDate( + item: NonEmptyList[Ident], + date: Option[Timestamp], + collective: Ident + ): F[UpdateResult] def getProposals(item: Ident, collective: Ident): F[MetaProposalList] @@ -480,24 +484,24 @@ object OItem { .map(AddResult.fromUpdate) def setItemDate( - item: Ident, + items: NonEmptyList[Ident], date: Option[Timestamp], collective: Ident - ): F[AddResult] = - store - .transact(RItem.updateDate(item, collective, date)) - .attempt - .map(AddResult.fromUpdate) + ): F[UpdateResult] = + UpdateResult.fromUpdate( + store + .transact(RItem.updateDate(items, collective, date)) + ) def setItemDueDate( - item: Ident, + items: NonEmptyList[Ident], date: Option[Timestamp], collective: Ident - ): F[AddResult] = - store - .transact(RItem.updateDueDate(item, collective, date)) - .attempt - .map(AddResult.fromUpdate) + ): F[UpdateResult] = + UpdateResult.fromUpdate( + store + .transact(RItem.updateDueDate(items, collective, date)) + ) def deleteItem(itemId: Ident, collective: Ident): F[Int] = QItem diff --git a/modules/joex/src/main/scala/docspell/joex/process/LinkProposal.scala b/modules/joex/src/main/scala/docspell/joex/process/LinkProposal.scala index fde5fcd3..8d4fc493 100644 --- a/modules/joex/src/main/scala/docspell/joex/process/LinkProposal.scala +++ b/modules/joex/src/main/scala/docspell/joex/process/LinkProposal.scala @@ -1,5 +1,6 @@ package docspell.joex.process +import cats.data.NonEmptyList import cats.effect.Sync import cats.implicits._ @@ -88,7 +89,11 @@ object LinkProposal { val ts = Timestamp.from(ld.atStartOfDay(Timestamp.UTC)) ctx.logger.debug(s"Updating item date ${value.id}") *> ctx.store.transact( - RItem.updateDate(itemId, ctx.args.meta.collective, Some(ts)) + RItem.updateDate( + NonEmptyList.of(itemId), + ctx.args.meta.collective, + Some(ts) + ) ) case None => ctx.logger.info(s"Cannot read value '${value.id}' into a date.") *> @@ -100,7 +105,11 @@ object LinkProposal { val ts = Timestamp.from(ld.atStartOfDay(Timestamp.UTC)) ctx.logger.debug(s"Updating item due-date suggestion ${value.id}") *> ctx.store.transact( - RItem.updateDueDate(itemId, ctx.args.meta.collective, Some(ts)) + RItem.updateDueDate( + NonEmptyList.of(itemId), + ctx.args.meta.collective, + Some(ts) + ) ) case None => ctx.logger.info(s"Cannot read value '${value.id}' into a date.") *> 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 4114b9bd..6239d0a3 100644 --- a/modules/restserver/src/main/scala/docspell/restserver/routes/ItemMultiRoutes.scala +++ b/modules/restserver/src/main/scala/docspell/restserver/routes/ItemMultiRoutes.scala @@ -102,6 +102,22 @@ object ItemMultiRoutes { resp <- Ok(Conversions.basicResult(res, "Direction updated")) } yield resp + case req @ PUT -> Root / "date" => + for { + json <- req.as[ItemsAndDate] + items <- readIds[F](json.items) + res <- backend.item.setItemDate(items, json.date, user.account.collective) + resp <- Ok(Conversions.basicResult(res, "Item date updated")) + } yield resp + + case req @ PUT -> Root / "duedate" => + for { + json <- req.as[ItemsAndDate] + items <- readIds[F](json.items) + res <- backend.item.setItemDueDate(items, json.date, user.account.collective) + resp <- Ok(Conversions.basicResult(res, "Item due date updated")) + } yield resp + // case req @ PUT -> Root / "corrOrg" => // for { // idref <- req.as[OptionalId] @@ -130,22 +146,6 @@ object ItemMultiRoutes { // resp <- Ok(Conversions.basicResult(res, "Concerned equipment updated")) // } yield resp - // case req @ PUT -> Root / "duedate" => - // for { - // date <- req.as[OptionalDate] - // _ <- logger.fdebug(s"Setting item due date to ${date.date}") - // res <- backend.item.setItemDueDate(id, date.date, user.account.collective) - // resp <- Ok(Conversions.basicResult(res, "Item due date updated")) - // } yield resp - - // case req @ PUT -> Root / "date" => - // for { - // date <- req.as[OptionalDate] - // _ <- logger.fdebug(s"Setting item date to ${date.date}") - // res <- backend.item.setItemDate(id, date.date, user.account.collective) - // resp <- Ok(Conversions.basicResult(res, "Item date updated")) - // } yield resp - // case req @ POST -> Root / "reprocess" => // for { // data <- req.as[IdList] diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/ItemRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/ItemRoutes.scala index 3cbb0c3f..9fa473cf 100644 --- a/modules/restserver/src/main/scala/docspell/restserver/routes/ItemRoutes.scala +++ b/modules/restserver/src/main/scala/docspell/restserver/routes/ItemRoutes.scala @@ -264,7 +264,11 @@ object ItemRoutes { for { date <- req.as[OptionalDate] _ <- logger.fdebug(s"Setting item due date to ${date.date}") - res <- backend.item.setItemDueDate(id, date.date, user.account.collective) + res <- backend.item.setItemDueDate( + NonEmptyList.of(id), + date.date, + user.account.collective + ) resp <- Ok(Conversions.basicResult(res, "Item due date updated")) } yield resp @@ -272,7 +276,11 @@ object ItemRoutes { for { date <- req.as[OptionalDate] _ <- logger.fdebug(s"Setting item date to ${date.date}") - res <- backend.item.setItemDate(id, date.date, user.account.collective) + res <- backend.item.setItemDate( + NonEmptyList.of(id), + date.date, + user.account.collective + ) resp <- Ok(Conversions.basicResult(res, "Item date updated")) } yield resp diff --git a/modules/store/src/main/scala/docspell/store/records/RItem.scala b/modules/store/src/main/scala/docspell/store/records/RItem.scala index 88599a4f..dbb15dfd 100644 --- a/modules/store/src/main/scala/docspell/store/records/RItem.scala +++ b/modules/store/src/main/scala/docspell/store/records/RItem.scala @@ -285,18 +285,8 @@ object RItem { ).update.run } yield n - def updateDate(itemId: Ident, coll: Ident, date: Option[Timestamp]): ConnectionIO[Int] = - for { - t <- currentTime - n <- updateRow( - table, - and(id.is(itemId), cid.is(coll)), - commas(itemDate.setTo(date), updated.setTo(t)) - ).update.run - } yield n - - def updateDueDate( - itemId: Ident, + def updateDate( + itemIds: NonEmptyList[Ident], coll: Ident, date: Option[Timestamp] ): ConnectionIO[Int] = @@ -304,7 +294,21 @@ object RItem { t <- currentTime n <- updateRow( table, - and(id.is(itemId), cid.is(coll)), + and(id.isIn(itemIds), cid.is(coll)), + commas(itemDate.setTo(date), updated.setTo(t)) + ).update.run + } yield n + + def updateDueDate( + itemIds: NonEmptyList[Ident], + coll: Ident, + date: Option[Timestamp] + ): ConnectionIO[Int] = + for { + t <- currentTime + n <- updateRow( + table, + and(id.isIn(itemIds), cid.is(coll)), commas(dueDate.setTo(date), updated.setTo(t)) ).update.run } yield n diff --git a/modules/webapp/src/main/elm/Api.elm b/modules/webapp/src/main/elm/Api.elm index bb0ad81b..39f36b7e 100644 --- a/modules/webapp/src/main/elm/Api.elm +++ b/modules/webapp/src/main/elm/Api.elm @@ -81,8 +81,10 @@ module Api exposing , setConfirmed , setCorrOrg , setCorrPerson + , setDateMultiple , setDirection , setDirectionMultiple + , setDueDateMultiple , setFolder , setFolderMultiple , setItemDate @@ -135,6 +137,7 @@ import Api.Model.ItemLightList exposing (ItemLightList) import Api.Model.ItemProposals exposing (ItemProposals) import Api.Model.ItemSearch exposing (ItemSearch) import Api.Model.ItemUploadMeta exposing (ItemUploadMeta) +import Api.Model.ItemsAndDate exposing (ItemsAndDate) import Api.Model.ItemsAndDirection exposing (ItemsAndDirection) import Api.Model.ItemsAndName exposing (ItemsAndName) import Api.Model.ItemsAndRef exposing (ItemsAndRef) @@ -1344,6 +1347,34 @@ setDirectionMultiple flags data receive = } +setDateMultiple : + Flags + -> ItemsAndDate + -> (Result Http.Error BasicResult -> msg) + -> Cmd msg +setDateMultiple flags data receive = + Http2.authPut + { url = flags.config.baseUrl ++ "/api/v1/sec/items/date" + , account = getAccount flags + , body = Http.jsonBody (Api.Model.ItemsAndDate.encode data) + , expect = Http.expectJson receive Api.Model.BasicResult.decoder + } + + +setDueDateMultiple : + Flags + -> ItemsAndDate + -> (Result Http.Error BasicResult -> msg) + -> Cmd msg +setDueDateMultiple flags data receive = + Http2.authPut + { url = flags.config.baseUrl ++ "/api/v1/sec/items/duedate" + , account = getAccount flags + , body = Http.jsonBody (Api.Model.ItemsAndDate.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 53f491a7..5edd9da8 100644 --- a/modules/webapp/src/main/elm/Comp/ItemDetail/FormChange.elm +++ b/modules/webapp/src/main/elm/Comp/ItemDetail/FormChange.elm @@ -6,6 +6,7 @@ module Comp.ItemDetail.FormChange exposing import Api import Api.Model.BasicResult exposing (BasicResult) import Api.Model.IdName exposing (IdName) +import Api.Model.ItemsAndDate exposing (ItemsAndDate) import Api.Model.ItemsAndDirection exposing (ItemsAndDirection) import Api.Model.ItemsAndName exposing (ItemsAndName) import Api.Model.ItemsAndRef exposing (ItemsAndRef) @@ -71,5 +72,19 @@ multiUpdate flags ids change receive = in Api.setDirectionMultiple flags data receive + ItemDateChange date -> + let + data = + ItemsAndDate items date + in + Api.setDateMultiple flags data receive + + DueDateChange date -> + let + data = + ItemsAndDate items date + in + Api.setDueDateMultiple flags data receive + _ -> Cmd.none