Refresh item after addon is done

This commit is contained in:
eikek
2022-05-18 00:23:46 +02:00
parent 5abbe92f2b
commit 29a5894884
15 changed files with 123 additions and 19 deletions

View File

@ -314,13 +314,16 @@ updateWithSub msg model =
ReceiveWsMessage data ->
case data of
Ok (JobDone task) ->
Ok (JobDone details) ->
let
isProcessItem =
task == "process-item"
details.task == "process-item"
isDownloadZip =
task == "download-query-zip"
details.task == "download-query-zip"
isAddonExistingItem =
Data.ServerEvent.isAddonExistingItem model.itemDetailModel.detail.item.id details
newModel =
{ model
@ -337,6 +340,9 @@ updateWithSub msg model =
else if Page.isDashboardPage model.page && isProcessItem then
updateDashboard texts Page.Dashboard.Data.reloadDashboardData newModel
else if Page.isDetailPage model.page && isAddonExistingItem then
updateItemDetail texts (Page.ItemDetail.Data.ReloadItem True) newModel
else
( newModel, Cmd.none, Sub.none )

View File

@ -76,7 +76,7 @@ view texts model =
, a
[ class S.successMessageLink
, href "#"
, onClick ReloadItem
, onClick (ReloadItem False)
]
[ text texts.refreshNow
]

View File

@ -281,7 +281,7 @@ initSelectViewModel =
type Msg
= ToggleMenu
| ReloadItem
| ReloadItem Bool
| Init
| SetItem ItemDetail
| SetActiveAttachment Int

View File

@ -387,12 +387,22 @@ update inav env msg model =
resultModel
{ model | menuOpen = not model.menuOpen }
ReloadItem ->
ReloadItem withFile ->
if model.item.id == "" then
resultModel model
else
resultModelCmd ( model, Api.itemDetail env.flags model.item.id GetItemResp )
resultModelCmd
( model
, Cmd.batch
[ Api.itemDetail env.flags model.item.id GetItemResp
, if withFile then
Ports.refreshFileView "ds-pdf-view-iframe"
else
Cmd.none
]
)
FolderDropdownMsg m ->
let
@ -1002,7 +1012,7 @@ update inav env msg model =
DeleteAttachResp (Ok res) ->
if res.success then
update inav env ReloadItem model
update inav env (ReloadItem False) model
else
resultModel model

View File

@ -5,7 +5,7 @@
-}
module Data.ServerEvent exposing (AddonInfo, ServerEvent(..), decode)
module Data.ServerEvent exposing (AddonInfo, JobDoneDetails, ServerEvent(..), decode, isAddonExistingItem)
import Json.Decode as D
import Json.Decode.Pipeline as P
@ -13,7 +13,7 @@ import Json.Decode.Pipeline as P
type ServerEvent
= JobSubmitted String
| JobDone String
| JobDone JobDoneDetails
| JobsWaiting Int
| AddonInstalled AddonInfo
@ -26,6 +26,32 @@ type alias AddonInfo =
}
type alias JobDoneDetails =
{ task : String
, args : Maybe D.Value
, result : Maybe D.Value
}
{-| Return wether the job done details belong to running an addon of
that item with the given id.
-}
isAddonExistingItem : String -> JobDoneDetails -> Bool
isAddonExistingItem itemId details =
let
itemIdDecoder =
D.field "itemId" D.string
-- This decodes the structure from scalas ItemAddonTaskArgs (only itemId)
decodedId =
Maybe.map (D.decodeValue itemIdDecoder) details.args
|> Maybe.andThen Result.toMaybe
in
details.task
== "addon-existing-item"
&& (itemId /= "" && decodedId == Just itemId)
addonInfoDecoder : D.Decoder AddonInfo
addonInfoDecoder =
D.succeed AddonInfo
@ -51,8 +77,7 @@ decodeTag : String -> D.Decoder ServerEvent
decodeTag tag =
case tag of
"job-done" ->
D.field "content" D.string
|> D.map JobDone
D.field "content" (D.map JobDone decodeJobDoneDetails)
"job-submitted" ->
D.field "content" D.string
@ -68,3 +93,11 @@ decodeTag tag =
_ ->
D.fail ("Unknown tag: " ++ tag)
decodeJobDoneDetails : D.Decoder JobDoneDetails
decodeJobDoneDetails =
D.map3 JobDoneDetails
(D.field "task" D.string)
(D.field "args" (D.maybe D.value))
(D.field "result" (D.maybe D.value))

View File

@ -14,6 +14,7 @@ module Page exposing
, hasSidebar
, href
, isDashboardPage
, isDetailPage
, isOpen
, isSearchPage
, isSecured
@ -175,6 +176,16 @@ isDashboardPage page =
False
isDetailPage : Page -> Bool
isDetailPage page =
case page of
ItemDetailPage _ ->
True
_ ->
False
pageName : Page -> String
pageName page =
case page of

View File

@ -38,6 +38,7 @@ type Msg
| ItemResp (Result Http.Error ItemDetail)
| ScrollResult (Result Dom.Error ())
| UiSettingsUpdated
| ReloadItem Bool
type alias UpdateResult =

View File

@ -47,6 +47,13 @@ update inav env msg model =
, selectedItems = env.selectedItems
}
ReloadItem withFiles ->
let
m =
ItemDetailMsg (Comp.ItemDetail.Model.ReloadItem withFiles)
in
update inav env m model
ItemDetailMsg lmsg ->
let
result =

View File

@ -11,6 +11,7 @@ port module Ports exposing
, printElement
, receiveCheckQueryResult
, receiveServerEvent
, refreshFileView
, removeAccount
, setAccount
, setUiTheme
@ -54,6 +55,11 @@ port printElement : String -> Cmd msg
port receiveWsMessage : (D.Value -> msg) -> Sub msg
{-| Given an ID of an element that is either EMBED or IFRAME the js will reload its src
-}
port refreshFileView : String -> Cmd msg
--- Higher level functions based on ports