Delete multiple items

This commit is contained in:
Eike Kettner 2020-10-26 14:18:42 +01:00
parent 9193d7ca51
commit 998aad5627
5 changed files with 56 additions and 10 deletions

View File

@ -130,6 +130,8 @@ trait OItem[F[_]] {
def deleteItem(itemId: Ident, collective: Ident): F[Int] def deleteItem(itemId: Ident, collective: Ident): F[Int]
def deleteItemMultiple(items: NonEmptyList[Ident], collective: Ident): F[Int]
def deleteAttachment(id: Ident, collective: Ident): F[Int] def deleteAttachment(id: Ident, collective: Ident): F[Int]
def moveAttachmentBefore(itemId: Ident, source: Ident, target: Ident): F[AddResult] def moveAttachmentBefore(itemId: Ident, source: Ident, target: Ident): F[AddResult]
@ -547,6 +549,13 @@ object OItem {
.delete(store)(itemId, collective) .delete(store)(itemId, collective)
.flatTap(_ => fts.removeItem(logger, itemId)) .flatTap(_ => fts.removeItem(logger, itemId))
def deleteItemMultiple(items: NonEmptyList[Ident], collective: Ident): F[Int] =
for {
itemIds <- store.transact(RItem.filterItems(items, collective))
results <- itemIds.traverse(item => deleteItem(item, collective))
n = results.fold(0)(_ + _)
} yield n
def getProposals(item: Ident, collective: Ident): F[MetaProposalList] = def getProposals(item: Ident, collective: Ident): F[MetaProposalList] =
store.transact(QAttachment.getMetaProposals(item, collective)) store.transact(QAttachment.getMetaProposals(item, collective))

View File

@ -151,18 +151,23 @@ object ItemMultiRoutes {
case req @ POST -> Root / "reprocess" => case req @ POST -> Root / "reprocess" =>
for { for {
json <- req.as[IdList] json <- req.as[IdList]
items <- readIds[F](json.ids) items <- readIds[F](json.ids)
res <- backend.item.reprocessAll(items, user.account, true) res <- backend.item.reprocessAll(items, user.account, true)
resp <- Ok(Conversions.basicResult(res, "Re-process task(s) submitted.")) resp <- Ok(Conversions.basicResult(res, "Re-process task(s) submitted."))
} yield resp } yield resp
// case POST -> Root / "deleteAll" => case req @ POST -> Root / "deleteAll" =>
// for { for {
// n <- backend.item.deleteItem(id, user.account.collective) json <- req.as[IdList]
// res = BasicResult(n > 0, if (n > 0) "Item deleted" else "Item deletion failed.") items <- readIds[F](json.ids)
// resp <- Ok(res) n <- backend.item.deleteItemMultiple(items, user.account.collective)
// } yield resp res = BasicResult(
n > 0,
if (n > 0) "Item(s) deleted" else "Item deletion failed."
)
resp <- Ok(res)
} yield resp
} }
} }

View File

@ -15,6 +15,7 @@ module Api exposing
, createNewFolder , createNewFolder
, createNotifyDueItems , createNotifyDueItems
, createScanMailbox , createScanMailbox
, deleteAllItems
, deleteAttachment , deleteAttachment
, deleteEquip , deleteEquip
, deleteFolder , deleteFolder
@ -130,6 +131,7 @@ import Api.Model.EquipmentList exposing (EquipmentList)
import Api.Model.FolderDetail exposing (FolderDetail) import Api.Model.FolderDetail exposing (FolderDetail)
import Api.Model.FolderList exposing (FolderList) import Api.Model.FolderList exposing (FolderList)
import Api.Model.GenInvite exposing (GenInvite) import Api.Model.GenInvite exposing (GenInvite)
import Api.Model.IdList exposing (IdList)
import Api.Model.IdResult exposing (IdResult) import Api.Model.IdResult exposing (IdResult)
import Api.Model.ImapSettings exposing (ImapSettings) import Api.Model.ImapSettings exposing (ImapSettings)
import Api.Model.ImapSettingsList exposing (ImapSettingsList) import Api.Model.ImapSettingsList exposing (ImapSettingsList)
@ -182,6 +184,7 @@ import Data.Priority exposing (Priority)
import File exposing (File) import File exposing (File)
import Http import Http
import Json.Encode as JsonEncode import Json.Encode as JsonEncode
import Set exposing (Set)
import Task import Task
import Url import Url
import Util.File import Util.File
@ -1435,6 +1438,20 @@ setConcEquipmentMultiple flags data receive =
} }
deleteAllItems :
Flags
-> Set String
-> (Result Http.Error BasicResult -> msg)
-> Cmd msg
deleteAllItems flags ids receive =
Http2.authPost
{ url = flags.config.baseUrl ++ "/api/v1/sec/items/deleteAll"
, account = getAccount flags
, body = Http.jsonBody (Api.Model.IdList.encode (IdList (Set.toList ids)))
, expect = Http.expectJson receive Api.Model.BasicResult.decoder
}
--- Item --- Item

View File

@ -169,6 +169,7 @@ type Msg
| EditMenuMsg Comp.ItemDetail.EditMenu.Msg | EditMenuMsg Comp.ItemDetail.EditMenu.Msg
| MultiUpdateResp (Result Http.Error BasicResult) | MultiUpdateResp (Result Http.Error BasicResult)
| ReplaceChangedItemsResp (Result Http.Error ItemLightList) | ReplaceChangedItemsResp (Result Http.Error ItemLightList)
| DeleteAllResp (Result Http.Error BasicResult)
type SearchType type SearchType

View File

@ -346,7 +346,7 @@ update mId key flags settings msg model =
cmd = cmd =
if confirmed then if confirmed then
Cmd.none Api.deleteAllItems flags svm.ids DeleteAllResp
else else
Cmd.none Cmd.none
@ -373,6 +373,20 @@ update mId key flags settings msg model =
_ -> _ ->
noSub ( model, Cmd.none ) noSub ( model, Cmd.none )
DeleteAllResp (Ok res) ->
if res.success then
let
nm =
{ model | viewMode = SearchView }
in
doSearch flags settings False nm
else
noSub ( model, Cmd.none )
DeleteAllResp (Err _) ->
noSub ( model, Cmd.none )
RequestDeleteSelected -> RequestDeleteSelected ->
case model.viewMode of case model.viewMode of
SelectView svm -> SelectView svm ->