summaryrefslogtreecommitdiff
path: root/elm
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2019-11-04 15:49:20 +0100
committerYorhel <git@yorhel.nl>2019-11-10 12:44:55 +0100
commit3af0103b6bcc791142f78664bc449263c99571fb (patch)
tree6a350ca45d1b2bc862cc43515067a324b6e66035 /elm
parentde6df4ab815a4f4447122d7f19888afd1b3e50ec (diff)
ulist: Implement deletion of items from the list
Diffstat (limited to 'elm')
-rw-r--r--elm/UList/Opt.elm39
-rw-r--r--elm/UList/Opt.js16
2 files changed, 45 insertions, 10 deletions
diff --git a/elm/UList/Opt.elm b/elm/UList/Opt.elm
index 22350b7c..edbdf187 100644
--- a/elm/UList/Opt.elm
+++ b/elm/UList/Opt.elm
@@ -1,4 +1,4 @@
-module UList.Opt exposing (main)
+port module UList.Opt exposing (main)
import Html exposing (..)
import Html.Attributes exposing (..)
@@ -12,7 +12,7 @@ import Lib.Api as Api
import Gen.Types as T
import Gen.Api as GApi
import Gen.UListVNOpt as GVO
-
+import Gen.UListDel as GDE
main : Program GVO.Send Model Msg
main = Browser.element
@@ -22,27 +22,34 @@ main = Browser.element
, update = update
}
+port ulistVNDeleted : Bool -> Cmd msg
+
type alias Model =
- { state : Api.State
- , flags : GVO.Send
- , del : Bool
+ { flags : GVO.Send
+ , del : Bool
+ , delState : Api.State
}
init : GVO.Send -> Model
init f =
- { state = Api.Normal
- , flags = f
- , del = False
+ { flags = f
+ , del = False
+ , delState = Api.Normal
}
type Msg
= Del Bool
+ | Delete
+ | Deleted GApi.Response
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
Del b -> ({ model | del = b }, Cmd.none)
+ Delete -> ({ model | delState = Api.Loading }, Api.post "/u/ulist/del.json" (GDE.encode { uid = model.flags.uid, vid = model.flags.vid }) Deleted)
+ Deleted GApi.Success -> (model, ulistVNDeleted True)
+ Deleted e -> ({ model | delState = Api.Error e }, Cmd.none)
view : Model -> Html Msg
@@ -53,7 +60,7 @@ view model =
[ td [ colspan 5 ]
[ textarea ([ placeholder "Notes", rows 2, cols 100 ] ++ GVO.valNotes) [ text model.flags.notes ]
, div [ ]
- [ div [ class "spinner" ] []
+ [ div [ class "spinner invisible" ] []
, br_ 2
, a [ href "#", onClickD (Del True) ] [ text "Remove VN" ]
]
@@ -76,4 +83,16 @@ view model =
, td [ class "tco5" ] [ a [ href ("/r"++String.fromInt r.id), title r.original ] [ text r.title ] ]
]
- in table [] <| (if model.flags.own then opt else []) ++ List.indexedMap rel model.flags.rels
+ confirm =
+ div []
+ [ text "Are you sure you want to remove this visual novel from your list? "
+ , a [ onClickD Delete ] [ text "Yes" ]
+ , text " | "
+ , a [ onClickD (Del False) ] [ text "Cancel" ]
+ ]
+
+ in case (model.del, model.delState) of
+ (False, _) -> table [] <| (if model.flags.own then opt else []) ++ List.indexedMap rel model.flags.rels
+ (_, Api.Normal) -> confirm
+ (_, Api.Loading) -> div [ class "spinner" ] []
+ (_, Api.Error e) -> b [ class "standout" ] [ text <| "Error removing item: " ++ Api.showResponse e ]
diff --git a/elm/UList/Opt.js b/elm/UList/Opt.js
new file mode 100644
index 00000000..6a4f126f
--- /dev/null
+++ b/elm/UList/Opt.js
@@ -0,0 +1,16 @@
+var init = Elm.UList.Opt.init;
+Elm.UList.Opt.init = function(opt) {
+ // TODO: This module is more often than not hidden from the page, lazily loading it could improve page load time.
+ var app = init(opt);
+
+ app.ports.ulistVNDeleted.subscribe(function(b) {
+ var e = document.getElementById('ulist_tr_'+opt.flags.vid);
+ e.parentNode.removeChild(e.nextElementSibling);
+ e.parentNode.removeChild(e);
+
+ // Have to restripe after deletion :(
+ var rows = document.querySelectorAll('.ulist > table > tbody > tr');
+ for(var i=0; i<rows.length; i++)
+ rows[i].classList.toggle('odd', Math.floor(i/2) % 2 == 0);
+ });
+};