changeset 1301:ff44f822bfdd

browser (photos): albums can now be deleted: when albums are deleted, there are removed from list of interest, and all photos inside are also deleted. Doesn't check permissions before deletion yet, so the button is always present even when it may fail.
author Goffi <goffi@goffi.org>
date Fri, 19 Jun 2020 16:47:51 +0200
parents 6e110baa707f
children 04e7dd6b6f4d
files libervia/pages/photos/_browser/__init__.py
diffstat 1 files changed, 62 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libervia/pages/photos/_browser/__init__.py	Fri Jun 19 16:47:51 2020 +0200
@@ -0,0 +1,62 @@
+from browser import window, bind, DOMNode
+from javascript import JSON
+from bridge import Bridge
+import dialog
+
+bridge = Bridge()
+
+
+def album_delete_cb(item_elt, item):
+    print(f"deleted {item['name']}")
+
+
+def album_delete_eb(failure, item_elt, item):
+    # TODO: cleaner error notification
+    window.alert(f"error while deleting {item['name']}: failure")
+
+
+def interest_retract_cb(item_elt, item):
+    print(f"{item['name']} removed successfuly from list of interests")
+    item_elt.classList.add("state_deleted")
+    item_elt.bind("transitionend", lambda evt: item_elt.remove())
+    bridge.fileSharingDelete(
+        item['service'],
+        item.get('path', ''),
+        item.get('files_namespace', ''),
+        callback=lambda __: album_delete_cb(item_elt, item),
+        errback=lambda failure: album_delete_eb(failure, item_elt, item),
+    )
+
+
+def interest_retract_eb(failure_, item_elt, item):
+    # TODO: cleaner error notification
+    window.alert(f"Can't delete album {item['name']}: {failure_['message']}")
+
+
+def delete_ok(evt, notif_elt, item_elt, item):
+    bridge.interestRetract(
+        "", item['id'],
+        callback=lambda: interest_retract_cb(item_elt, item),
+        errback=lambda failure:interest_retract_eb(failure, item_elt, item))
+
+
+def delete_cancel(evt, notif_elt, item_elt, item):
+    notif_elt.remove()
+    item_elt.classList.remove("selected_for_deletion")
+
+
+@bind(".action_delete", "click")
+def on_delete(evt):
+    evt.stopPropagation()
+    target = evt.currentTarget
+    item_elt = DOMNode(target.elt.closest('.item'))
+    item_elt.classList.add("selected_for_deletion")
+    item = JSON.parse(item_elt.dataset.item)
+    dialog.Confirm(
+        f"album {item['name']!r} will be deleted (inluding all its photos), "
+        f"are you sure?",
+        ok_label="delete",
+    ).show(
+        ok_cb=lambda evt, notif_elt: delete_ok(evt, notif_elt, item_elt, item),
+        cancel_cb=lambda evt, notif_elt: delete_cancel(evt, notif_elt, item_elt, item),
+    )