diff --git a/src/Client/Pages/DataAnnotator/DataAnnotator.fs b/src/Client/Pages/DataAnnotator/DataAnnotator.fs index 0a8623be..55c386d2 100644 --- a/src/Client/Pages/DataAnnotator/DataAnnotator.fs +++ b/src/Client/Pages/DataAnnotator/DataAnnotator.fs @@ -101,11 +101,11 @@ module private DataAnnotatorHelper = ] ] - let RequestPathButton (fileName: string option, requestPath) = + let RequestPathButton (fileName: string option, requestPath, isLoading: bool) = let fileName = defaultArg fileName "Choose File" Html.label [ - prop.className "join flex" prop.onClick requestPath + prop.className "join flex" prop.children [ Html.button [ prop.className "btn btn-primary join-item" @@ -117,6 +117,13 @@ module private DataAnnotatorHelper = prop.value fileName prop.readOnly true ] + Html.span [ + prop.className "btn btn-primary join-item btn-disabled" + prop.children [ + if isLoading then + Daisy.loading [] + ] + ] ] ] @@ -346,7 +353,6 @@ type DataAnnotator = promise { let! content = e.text() let dtf = DataFile.create(e.name, e.``type``, content, e.size) - setShowModal true dtf |> Some |> UpdateDataFile |> DataAnnotatorMsg |> dispatch } |> Async.AwaitPromise @@ -355,9 +361,9 @@ type DataAnnotator = UpdateDataFile None |> DataAnnotatorMsg |> dispatch if ref.current.IsSome then ref.current.Value.value <- null - let requestFileFromARCitect = fun _ -> + let requestFileFromARCitect = fun (e: Browser.Types.MouseEvent) -> + e.preventDefault() if model.PersistentStorageState.IsARCitect then - setShowModal true Elmish.ApiCall.Start () |> ARCitect.RequestFile |> ARCitectMsg @@ -371,7 +377,8 @@ type DataAnnotator = | true -> DataAnnotatorHelper.DataAnnotatorButtons.RequestPathButton( model.DataAnnotatorModel.DataFile |> Option.map _.DataFileName, - requestFileFromARCitect + requestFileFromARCitect, + model.DataAnnotatorModel.Loading ) | false -> DataAnnotatorHelper.DataAnnotatorButtons.UploadButton ref model uploadFileOnChange diff --git a/src/Client/States/DataAnnotator.fs b/src/Client/States/DataAnnotator.fs index 83ee6e8b..7e3f7a62 100644 --- a/src/Client/States/DataAnnotator.fs +++ b/src/Client/States/DataAnnotator.fs @@ -100,10 +100,12 @@ type Model = { DataFile: DataFile option ParsedFile: ParsedDataFile option + Loading: bool } static member init () = { DataFile = None ParsedFile = None + Loading = false } type Msg = diff --git a/src/Client/Update.fs b/src/Client/Update.fs index c8df31b9..6129ae1f 100644 --- a/src/Client/Update.fs +++ b/src/Client/Update.fs @@ -154,8 +154,10 @@ module DataAnnotator = DataAnnotator.ParsedDataFile.fromFileBySeparator s file ) let nextState: DataAnnotator.Model = { - DataFile = dataFile - ParsedFile = parsedFile + state with + DataFile = dataFile + ParsedFile = parsedFile + Loading = false } nextState, model, Cmd.none | DataAnnotator.ToggleHeader -> diff --git a/src/Client/Update/ARCitectUpdate.fs b/src/Client/Update/ARCitectUpdate.fs index 3dc402b6..9519ea89 100644 --- a/src/Client/Update/ARCitectUpdate.fs +++ b/src/Client/Update/ARCitectUpdate.fs @@ -85,7 +85,6 @@ module ARCitect = state, {model with FilePickerState.FileNames = paths}, Cmd.none | ARCitect.RequestFile msg -> - log "Starting RequestFile" match msg with | Start () -> let cmd = @@ -94,19 +93,22 @@ module ARCitect = () (Finished >> ARCitect.RequestFile >> ARCitectMsg) (curry GenericError Cmd.none >> DevMsg) - state, model, cmd + let nextModel = + {model with DataAnnotatorModel.Loading = true; DataAnnotatorModel.DataFile = None; DataAnnotatorModel.ParsedFile = None} + state, nextModel, cmd | ApiCall.Finished wasSuccessful -> + let nextModel = {model with DataAnnotatorModel.Loading = false} let cmd = if wasSuccessful then Cmd.none else GenericError (Cmd.none, exn("RequestFile failed")) |> DevMsg |> Cmd.ofMsg - state, model, cmd + state, nextModel, cmd | ARCitect.ResponseFile file -> let dataFile = DataAnnotator.DataFile.create(file.name, file.mimetype, file.content, file.size) let msg = dataFile |> Some |> DataAnnotator.UpdateDataFile |> DataAnnotatorMsg - state, model , Cmd.ofMsg msg + state, {model with DataAnnotatorModel.Loading = true} , Cmd.ofMsg msg | ARCitect.RequestPersons msg -> match msg with