Mercurial > libervia-web
annotate libervia/web/pages/_browser/jid_search.py @ 1629:961468588131 default tip
doc (chat): Add documentation for message origin:
fix 459
author | Goffi <goffi@goffi.org> |
---|---|
date | Sun, 08 Jun 2025 17:29:39 +0200 |
parents | a2cd4222c702 |
children |
rev | line source |
---|---|
1548
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
1 import json |
1619 | 2 from typing import Callable |
1548
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
3 from urllib.parse import quote, urljoin |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
4 |
1546
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 from bridge import AsyncBridge as Bridge |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 from browser import aio, console as log, window |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 from cache import cache |
1619 | 8 import errors |
1548
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
9 from template import Template |
1573
02432346e9b2
browser (jid_search): `submit_filter` option:
Goffi <goffi@goffi.org>
parents:
1556
diff
changeset
|
10 import jid |
1546
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 log.warning = log.warn |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 profile = window.profile or "" |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 bridge = Bridge() |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 class JidSearch: |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 |
1548
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
18 def __init__( |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
19 self, |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
20 search_elt, |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
21 container_elt=None, |
1619 | 22 filter_cb: Callable[[list[str]], None]|None = None, |
1548
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
23 empty_cb=None, |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
24 get_url=None, |
1556
5c4703870088
browser (jid_search): search items can now be customised:
Goffi <goffi@goffi.org>
parents:
1549
diff
changeset
|
25 click_cb=None, |
5c4703870088
browser (jid_search): search items can now be customised:
Goffi <goffi@goffi.org>
parents:
1549
diff
changeset
|
26 options: dict|None = None, |
1573
02432346e9b2
browser (jid_search): `submit_filter` option:
Goffi <goffi@goffi.org>
parents:
1556
diff
changeset
|
27 submit_filter: bool = True, |
1604
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
28 template: str = "components/search_item.html", |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
29 allow_multiple_selection: bool = False, |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
30 selected_item_class: str = 'is-selected-search_item', |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
31 selection_state_callback=None |
1556
5c4703870088
browser (jid_search): search items can now be customised:
Goffi <goffi@goffi.org>
parents:
1549
diff
changeset
|
32 ) -> None: |
1548
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
33 """Initialize the JidSearch instance |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
34 |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
35 @param search_elt: The HTML <input> element for search |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
36 @param container_elt: The HTML container to display the search results |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
37 @param filter_cb: The callback to filter the search results |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
38 @param empty_cb: The callback when the search box is empty |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
39 @param get_url: The function to get URL for each entity in the search result |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
40 @param click_cb: The function to handle the click event on each entity in the |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
41 search result |
1556
5c4703870088
browser (jid_search): search items can now be customised:
Goffi <goffi@goffi.org>
parents:
1549
diff
changeset
|
42 @param options: extra options. Key can be: |
5c4703870088
browser (jid_search): search items can now be customised:
Goffi <goffi@goffi.org>
parents:
1549
diff
changeset
|
43 no_group(bool) |
1619 | 44 True if entity groups should not be visible |
45 type (str) | |
46 Can be "group" or "one2one". Default to one2one. | |
1556
5c4703870088
browser (jid_search): search items can now be customised:
Goffi <goffi@goffi.org>
parents:
1549
diff
changeset
|
47 extra_cb(dict) |
5c4703870088
browser (jid_search): search items can now be customised:
Goffi <goffi@goffi.org>
parents:
1549
diff
changeset
|
48 a map from CSS selector to callback, the callback will be binded to the |
5c4703870088
browser (jid_search): search items can now be customised:
Goffi <goffi@goffi.org>
parents:
1549
diff
changeset
|
49 "click" event, and will be called with the ``item`` as argument |
1573
02432346e9b2
browser (jid_search): `submit_filter` option:
Goffi <goffi@goffi.org>
parents:
1556
diff
changeset
|
50 @param submit_filter: if True, only submit when a seemingly valid JID is entered |
1556
5c4703870088
browser (jid_search): search items can now be customised:
Goffi <goffi@goffi.org>
parents:
1549
diff
changeset
|
51 @param template: template to use |
1604
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
52 @param allow_multiple_selection: If True, allows multiple search entities to be |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
53 selected with checkboxes. |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
54 @param selected_item_class: The CSS class to apply when an item is selected. This |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
55 class should define distinctive styles to highlight selected items. |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
56 @param selection_state_callback: A callback function to execute when selection |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
57 state changes. Takes one boolean parameter indicating if items are selected. |
1548
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
58 """ |
1619 | 59 self.selected = set() |
60 self.current_items = set() | |
1556
5c4703870088
browser (jid_search): search items can now be customised:
Goffi <goffi@goffi.org>
parents:
1549
diff
changeset
|
61 self.search_item_tpl = Template(template) |
1546
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
62 self.search_elt = search_elt |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
63 self.search_elt.bind("input", self.on_search_input) |
1573
02432346e9b2
browser (jid_search): `submit_filter` option:
Goffi <goffi@goffi.org>
parents:
1556
diff
changeset
|
64 if submit_filter: |
1591
f1d09a4d38dc
browser (jid_search): fix `submit_filter` when there is no parent `<form>`
Goffi <goffi@goffi.org>
parents:
1573
diff
changeset
|
65 try: |
f1d09a4d38dc
browser (jid_search): fix `submit_filter` when there is no parent `<form>`
Goffi <goffi@goffi.org>
parents:
1573
diff
changeset
|
66 form_elt = self.search_elt.closest("form") |
f1d09a4d38dc
browser (jid_search): fix `submit_filter` when there is no parent `<form>`
Goffi <goffi@goffi.org>
parents:
1573
diff
changeset
|
67 except KeyError: |
f1d09a4d38dc
browser (jid_search): fix `submit_filter` when there is no parent `<form>`
Goffi <goffi@goffi.org>
parents:
1573
diff
changeset
|
68 log.debug("No parent <form> found, can't apply submit filter.") |
f1d09a4d38dc
browser (jid_search): fix `submit_filter` when there is no parent `<form>`
Goffi <goffi@goffi.org>
parents:
1573
diff
changeset
|
69 else: |
f1d09a4d38dc
browser (jid_search): fix `submit_filter` when there is no parent `<form>`
Goffi <goffi@goffi.org>
parents:
1573
diff
changeset
|
70 form_elt.bind("submit", self.on_form_submit) |
1546
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
71 self.last_query = None |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
72 self.current_query = None |
1548
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
73 self.container_elt = container_elt |
1556
5c4703870088
browser (jid_search): search items can now be customised:
Goffi <goffi@goffi.org>
parents:
1549
diff
changeset
|
74 if options is None: |
5c4703870088
browser (jid_search): search items can now be customised:
Goffi <goffi@goffi.org>
parents:
1549
diff
changeset
|
75 options = {} |
5c4703870088
browser (jid_search): search items can now be customised:
Goffi <goffi@goffi.org>
parents:
1549
diff
changeset
|
76 self.options = options |
1619 | 77 match options.get("type"): |
78 case None | "one2one": | |
79 self.group = False | |
80 case "group": | |
81 self.group = True | |
82 case _: | |
83 raise errors.InternalError(f"Invalid type: {options.get('type')!r}.") | |
1548
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
84 |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
85 if click_cb is not None and get_url is None: |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
86 self.get_url = lambda _: "#" |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
87 else: |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
88 self.get_url = get_url if get_url is not None else self.default_get_url |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
89 self.click_cb = click_cb |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
90 |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
91 if filter_cb is None: |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
92 if container_elt is None: |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
93 raise ValueError("container_elt must be set if filter_cb is not set") |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
94 filter_cb = self.show_items |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
95 self.filter_cb = filter_cb |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
96 |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
97 self.empty_cb = empty_cb or self.on_empty_search |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
98 |
1604
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
99 self.allow_multiple_selection = allow_multiple_selection |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
100 self.selected_item_class = selected_item_class |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
101 if selection_state_callback is None: |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
102 selection_state_callback = self.default_selection_state_callback |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
103 self.selection_state_callback = selection_state_callback |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
104 self._selected_jids = set() |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
105 self.has_selection = False |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
106 self.update_selection_state() |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
107 |
1546
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
108 current_search = search_elt.value.strip() or None |
1549
e47c24204449
browser (calls): update call to handle search, control buttons, and better UI/UX:
Goffi <goffi@goffi.org>
parents:
1548
diff
changeset
|
109 if not current_search: |
1593
c6976c5b85a1
browser (chat/select): add bookmarked entities on empty search
Goffi <goffi@goffi.org>
parents:
1591
diff
changeset
|
110 aio.run(self.empty_cb(self)) |
1549
e47c24204449
browser (calls): update call to handle search, control buttons, and better UI/UX:
Goffi <goffi@goffi.org>
parents:
1548
diff
changeset
|
111 else: |
1546
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
112 aio.run(self.perform_search(current_search)) |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
113 |
1604
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
114 @property |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
115 def selected_jids(self) -> list[str]: |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
116 return list(self._selected_jids) |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
117 |
1548
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
118 def default_get_url(self, item): |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
119 """Default method to get the URL for a given entity |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
120 |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
121 @param item: The item (entity) for which the URL is required |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
122 """ |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
123 return urljoin(f"{window.location.href}/", quote(item["entity"])) |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
124 |
1604
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
125 def default_selection_state_callback(self, has_selection: bool) -> None: |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
126 """Default callback to handle selection state changes. |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
127 |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
128 @param has_selection: Boolean indicating if any items are currently selected. |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
129 """ |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
130 if has_selection: |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
131 self.container_elt.classList.add('has-selected-items') |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
132 else: |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
133 self.container_elt.classList.remove('has-selected-items') |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
134 |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
135 def update_selection_state(self): |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
136 """ |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
137 Checks the selection state and triggers the callback accordingly. |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
138 """ |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
139 current_has_selection = bool(self._selected_jids) |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
140 if current_has_selection != self.has_selection: |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
141 self.has_selection = current_has_selection |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
142 self.selection_state_callback(self.has_selection) |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
143 |
1548
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
144 def show_items(self, items): |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
145 """Display the search items in the specified container |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
146 |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
147 @param items: The list of search items to be displayed |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
148 """ |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
149 assert self.container_elt is not None |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
150 self.container_elt.clear() |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
151 for item in items: |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
152 search_item_elt = self.search_item_tpl.get_elt({ |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
153 "url": self.get_url(item), |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
154 "item": item, |
1604
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
155 "multiple_selection": self.allow_multiple_selection, |
1556
5c4703870088
browser (jid_search): search items can now be customised:
Goffi <goffi@goffi.org>
parents:
1549
diff
changeset
|
156 "identities": cache.identities, |
5c4703870088
browser (jid_search): search items can now be customised:
Goffi <goffi@goffi.org>
parents:
1549
diff
changeset
|
157 "options": self.options, |
1548
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
158 }) |
1604
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
159 |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
160 if self.allow_multiple_selection: |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
161 # Include a checkbox and manage its state |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
162 checkbox = search_item_elt.select('.search-item__checkbox')[0] |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
163 checkbox.checked = item['entity'] in self._selected_jids |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
164 checkbox.bind('change', lambda evt, item=item: self.on_checkbox_change(evt, item)) |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
165 checkbox.bind('click', lambda evt: evt.stopPropagation()) |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
166 |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
167 # Highlight item if selected |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
168 if item['entity'] in self._selected_jids: |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
169 card = search_item_elt.select('.card')[0] |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
170 card.classList.add(self.selected_item_class) |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
171 |
1548
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
172 if self.click_cb is not None: |
1604
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
173 # Make the whole item clickable and perform the click callback function |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
174 search_item_elt.bind('click', lambda evt, item=item: self.click_cb(evt, item)) |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
175 |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
176 # Now append the whole element to the container |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
177 self.container_elt <= search_item_elt |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
178 |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
179 # Apply extra callbacks if defined in options |
1556
5c4703870088
browser (jid_search): search items can now be customised:
Goffi <goffi@goffi.org>
parents:
1549
diff
changeset
|
180 extra_cb = self.options.get("extra_cb") |
5c4703870088
browser (jid_search): search items can now be customised:
Goffi <goffi@goffi.org>
parents:
1549
diff
changeset
|
181 if extra_cb: |
5c4703870088
browser (jid_search): search items can now be customised:
Goffi <goffi@goffi.org>
parents:
1549
diff
changeset
|
182 for selector, cb in extra_cb.items(): |
5c4703870088
browser (jid_search): search items can now be customised:
Goffi <goffi@goffi.org>
parents:
1549
diff
changeset
|
183 for elt in search_item_elt.select(selector): |
1604
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
184 elt.bind("click", lambda evt, item=item, cb=cb: cb(evt, item)) |
1548
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
185 |
1546
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
186 def on_search_input(self, evt): |
1548
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
187 """Handle the 'input' event for the search element |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
188 |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
189 @param evt: The event object |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
190 """ |
1573
02432346e9b2
browser (jid_search): `submit_filter` option:
Goffi <goffi@goffi.org>
parents:
1556
diff
changeset
|
191 evt.stopPropagation() |
02432346e9b2
browser (jid_search): `submit_filter` option:
Goffi <goffi@goffi.org>
parents:
1556
diff
changeset
|
192 evt.preventDefault() |
1546
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
193 search_text = evt.target.value.strip() |
1548
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
194 if not search_text: |
1593
c6976c5b85a1
browser (chat/select): add bookmarked entities on empty search
Goffi <goffi@goffi.org>
parents:
1591
diff
changeset
|
195 aio.run(self.empty_cb(self)) |
1546
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
196 elif len(search_text) > 2: |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
197 aio.run(self.perform_search(search_text)) |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
198 |
1573
02432346e9b2
browser (jid_search): `submit_filter` option:
Goffi <goffi@goffi.org>
parents:
1556
diff
changeset
|
199 def on_form_submit(self, evt): |
02432346e9b2
browser (jid_search): `submit_filter` option:
Goffi <goffi@goffi.org>
parents:
1556
diff
changeset
|
200 search_text = self.search_elt.value.strip() |
02432346e9b2
browser (jid_search): `submit_filter` option:
Goffi <goffi@goffi.org>
parents:
1556
diff
changeset
|
201 search_jid = jid.JID(search_text) |
02432346e9b2
browser (jid_search): `submit_filter` option:
Goffi <goffi@goffi.org>
parents:
1556
diff
changeset
|
202 if not search_jid.is_valid(): |
02432346e9b2
browser (jid_search): `submit_filter` option:
Goffi <goffi@goffi.org>
parents:
1556
diff
changeset
|
203 evt.stopPropagation() |
02432346e9b2
browser (jid_search): `submit_filter` option:
Goffi <goffi@goffi.org>
parents:
1556
diff
changeset
|
204 evt.preventDefault() |
02432346e9b2
browser (jid_search): `submit_filter` option:
Goffi <goffi@goffi.org>
parents:
1556
diff
changeset
|
205 |
1546
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
206 async def perform_search(self, query): |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
207 if self.current_query is None: |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
208 log.debug(f"performing search: {query=}") |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
209 self.current_query = query |
1619 | 210 if self.group: |
211 options = {"entities": False, "groupchat": True} | |
212 else: | |
213 options = {"entities": True, "groupchat": False} | |
214 jid_items = json.loads(await bridge.jid_search(query, json.dumps(options))) | |
1546
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
215 await cache.fill_identities(i["entity"] for i in jid_items) |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
216 |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
217 self.last_query = query |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
218 self.current_query = None |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
219 current_query = self.search_elt.value.strip() |
1604
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
220 |
1546
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
221 if current_query != query: |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
222 await self.perform_search(current_query) |
7f3f5ae7d65a
browser (jid_search): implement a mechanism to get JIDs from search terms
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
223 return |
1604
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
224 |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
225 # Include selected items in the search result regardless of the filter |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
226 jid_items_set = {item['entity']: item for item in jid_items} |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
227 for jid in self._selected_jids: |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
228 if jid not in jid_items_set: |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
229 jid_items_set[jid] = {"entity": jid} |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
230 |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
231 # Union of search results and manually added selected items |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
232 filtered_items = [ |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
233 jid_items_set[jid] for jid in jid_items_set |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
234 ] |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
235 |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
236 self.filter_cb(filtered_items) |
1548
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
237 |
1593
c6976c5b85a1
browser (chat/select): add bookmarked entities on empty search
Goffi <goffi@goffi.org>
parents:
1591
diff
changeset
|
238 async def on_empty_search(self, jid_search): |
1548
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
239 """Handle the situation when the search box is empty""" |
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
240 assert self.container_elt is not None |
1619 | 241 if self.group: |
242 items = [] | |
243 else: | |
244 items = [ | |
245 { | |
246 "entity": jid_, | |
247 "groups": data["groups"] | |
248 } | |
249 for jid_, data in cache.roster.items() | |
250 ] | |
1548
66aa6e140ebb
browser: make `jid_search` more generic:
Goffi <goffi@goffi.org>
parents:
1546
diff
changeset
|
251 self.show_items(items) |
1604
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
252 |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
253 def on_checkbox_change(self, evt, item): |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
254 log.debug(f"checkbox_change {evt.target=} {item=}") |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
255 evt.stopPropagation() |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
256 cb = evt.target |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
257 |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
258 if cb.checked: |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
259 self._selected_jids.add(item['entity']) |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
260 cb.closest('.card').classList.add(self.selected_item_class) |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
261 else: |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
262 self._selected_jids.remove(item['entity']) |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
263 cb.closest('.card').classList.remove(self.selected_item_class) |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
264 |
4a9679369856
browser (call): implements group calls:
Goffi <goffi@goffi.org>
parents:
1593
diff
changeset
|
265 self.update_selection_state() |