annotate libervia/pages/_browser/dialog.py @ 1466:cff720e26089

pages (blog/view): activate pagination when a single item is shown: `previous_page_url` and `next_page_url` are set when `item_id` is used. For now, they are both activated even if there is no item before or after, as it would request to make extra request to check it. This may be improved in 0.9 by using internal cache. fix 399
author Goffi <goffi@goffi.org>
date Thu, 30 Sep 2021 17:04:22 +0200
parents 4b6f711b09cb
children 409d10211b20
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1299
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
1 """manage common dialogs"""
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
2
1385
4b6f711b09cb browser (dialog): new `ashow` method to use `Confirm` in async methods
Goffi <goffi@goffi.org>
parents: 1343
diff changeset
3 from browser import document, window, timer
1299
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
4 from template import Template
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
5
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
6
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
7 class Confirm:
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
8
1343
8729d2708f65 browser (dialog): color of `OK` button can be specified:
Goffi <goffi@goffi.org>
parents: 1328
diff changeset
9 def __init__(self, message, ok_label="", cancel_label="", ok_color="success"):
1299
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
10 self._tpl = Template("dialogs/confirm.html")
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
11 self.message = message
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
12 self.ok_label = ok_label
1343
8729d2708f65 browser (dialog): color of `OK` button can be specified:
Goffi <goffi@goffi.org>
parents: 1328
diff changeset
13 assert ok_color in ("success", "danger")
8729d2708f65 browser (dialog): color of `OK` button can be specified:
Goffi <goffi@goffi.org>
parents: 1328
diff changeset
14 self.ok_color = ok_color
1299
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
15 self.cancel_label = cancel_label
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
16
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
17 def cancel_cb(self, evt, notif_elt):
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
18 notif_elt.remove()
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
19
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
20 def show(self, ok_cb, cancel_cb=None):
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
21 if cancel_cb is None:
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
22 cancel_cb = self.cancel_cb
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
23 notif_elt = self._tpl.get_elt({
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
24 "message": self.message,
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
25 "ok_label": self.ok_label,
1343
8729d2708f65 browser (dialog): color of `OK` button can be specified:
Goffi <goffi@goffi.org>
parents: 1328
diff changeset
26 "ok_color": self.ok_color,
1299
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
27 "cancel_label": self.cancel_label,
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
28 })
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
29
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
30 document['notifs_area'] <= notif_elt
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
31 timer.set_timeout(lambda: notif_elt.classList.add('state_appended'), 0)
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
32 for cancel_elt in notif_elt.select(".click_to_cancel"):
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
33 cancel_elt.bind("click", lambda evt: cancel_cb(evt, notif_elt))
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
34 for cancel_elt in notif_elt.select(".click_to_ok"):
053141849206 browser: module to handle dialogs, first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
35 cancel_elt.bind("click", lambda evt: ok_cb(evt, notif_elt))
1328
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
36
1385
4b6f711b09cb browser (dialog): new `ashow` method to use `Confirm` in async methods
Goffi <goffi@goffi.org>
parents: 1343
diff changeset
37 def _ashow_cb(self, evt, notif_elt, resolve_cb, confirmed):
4b6f711b09cb browser (dialog): new `ashow` method to use `Confirm` in async methods
Goffi <goffi@goffi.org>
parents: 1343
diff changeset
38 evt.stopPropagation()
4b6f711b09cb browser (dialog): new `ashow` method to use `Confirm` in async methods
Goffi <goffi@goffi.org>
parents: 1343
diff changeset
39 notif_elt.remove()
4b6f711b09cb browser (dialog): new `ashow` method to use `Confirm` in async methods
Goffi <goffi@goffi.org>
parents: 1343
diff changeset
40 resolve_cb(confirmed)
4b6f711b09cb browser (dialog): new `ashow` method to use `Confirm` in async methods
Goffi <goffi@goffi.org>
parents: 1343
diff changeset
41
4b6f711b09cb browser (dialog): new `ashow` method to use `Confirm` in async methods
Goffi <goffi@goffi.org>
parents: 1343
diff changeset
42 async def ashow(self):
4b6f711b09cb browser (dialog): new `ashow` method to use `Confirm` in async methods
Goffi <goffi@goffi.org>
parents: 1343
diff changeset
43 return window.Promise.new(
4b6f711b09cb browser (dialog): new `ashow` method to use `Confirm` in async methods
Goffi <goffi@goffi.org>
parents: 1343
diff changeset
44 lambda resolve_cb, reject_cb:
4b6f711b09cb browser (dialog): new `ashow` method to use `Confirm` in async methods
Goffi <goffi@goffi.org>
parents: 1343
diff changeset
45 self.show(
4b6f711b09cb browser (dialog): new `ashow` method to use `Confirm` in async methods
Goffi <goffi@goffi.org>
parents: 1343
diff changeset
46 lambda evt, notif_elt: self._ashow_cb(evt, notif_elt, resolve_cb, True),
4b6f711b09cb browser (dialog): new `ashow` method to use `Confirm` in async methods
Goffi <goffi@goffi.org>
parents: 1343
diff changeset
47 lambda evt, notif_elt: self._ashow_cb(evt, notif_elt, resolve_cb, False)
4b6f711b09cb browser (dialog): new `ashow` method to use `Confirm` in async methods
Goffi <goffi@goffi.org>
parents: 1343
diff changeset
48 )
4b6f711b09cb browser (dialog): new `ashow` method to use `Confirm` in async methods
Goffi <goffi@goffi.org>
parents: 1343
diff changeset
49 )
4b6f711b09cb browser (dialog): new `ashow` method to use `Confirm` in async methods
Goffi <goffi@goffi.org>
parents: 1343
diff changeset
50
1328
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
51
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
52 class Notification:
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
53
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
54 def __init__(self):
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
55 self._tpl = Template("dialogs/notification.html")
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
56
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
57 def close(self, notif_elt):
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
58 notif_elt.classList.remove('state_appended')
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
59 notif_elt.bind("transitionend", lambda __: notif_elt.remove())
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
60
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
61 def show(
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
62 self,
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
63 message: str,
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
64 level: str = "info",
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
65 delay: int = 5
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
66 ) -> None:
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
67 # we log in console error messages, may be useful
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
68 if level in ("warning", "error"):
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
69 print(f"[{level}] {message}")
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
70 notif_elt = self._tpl.get_elt({
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
71 "message": message,
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
72 "level": level,
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
73 })
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
74 document["notifs_area"] <= notif_elt
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
75 timer.set_timeout(lambda: notif_elt.classList.add('state_appended'), 0)
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
76 timer.set_timeout(lambda: self.close(notif_elt), delay * 1000)
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
77 for elt in notif_elt.select('.click_to_close'):
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
78 elt.bind('click', lambda __: self.close(notif_elt))
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
79
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
80
683e50799d6d browser (dialog): new class to handle notifications
Goffi <goffi@goffi.org>
parents: 1299
diff changeset
81 notification = Notification()