annotate libervia/web/pages/_browser/template.py @ 1619:a2cd4222c702

browser: Updates for new design: This patch add code to handle the new design for chat. New bridge method are used to invite users to MUC or get list of occupants. A new modules is used for components, with a first one for collapsible cards. rel 457
author Goffi <goffi@goffi.org>
date Sat, 12 Apr 2025 00:21:45 +0200
parents 9865013da86c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
1 """Integrate templating system using nunjucks"""
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
2
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
3 from js_modules.nunjucks import nunjucks
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
4 from browser import window, document
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
5 import javascript
1583
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
6 import jid
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
7
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
8
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 safe = nunjucks.runtime.SafeString.new
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
10 env = nunjucks.configure(
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
11 window.templates_root_url,
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 {
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 'autoescape': True,
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 'trimBlocks': True,
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
15 'lstripBlocks': True,
1509
106bae41f5c8 massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents: 1333
diff changeset
16 'web': {'use_cache': True},
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 })
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
18
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
19 nunjucks.installJinjaCompat()
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
20 env.addGlobal("profile", window.profile)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
21 env.addGlobal("csrf_token", window.csrf_token)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
22 # FIXME: integrate gettext or equivalent here
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
23 env.addGlobal("_", lambda txt: txt)
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
24
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
25
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
26 class Indexer:
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
27 """Index global to a page"""
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
28
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
29 def __init__(self):
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
30 self._indexes = {}
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
31
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
32 def next(self, value):
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
33 if value not in self._indexes:
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
34 self._indexes[value] = 0
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
35 return 0
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
36 self._indexes[value] += 1
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
37 return self._indexes[value]
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
38
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
39 def current(self, value):
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
40 return self._indexes.get(value)
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
41
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
42
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
43 gidx = Indexer()
1529
de7e468e2d44 browser (template): fix use of `auto*` in `date_fmt`
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
44 # suffix used to avoid collision with IDs generated in static page
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
45 SCRIPT_SUFF = "__script__"
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
46
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
47 def escape_html(txt):
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
48 return (
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
49 txt
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
50 .replace('&', '&amp;')
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
51 .replace('<', '&lt;')
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
52 .replace('>', '&gt;')
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
53 .replace('"', '&quot;')
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
54 )
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
55
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
56
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
57 def get_args(n_args, *sig_args, **sig_kwargs):
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
58 """Retrieve function args when they are transmitted using nunjucks convention
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
59
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
60 cf. https://mozilla.github.io/nunjucks/templating.html#keyword-arguments
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
61 @param n_args: argument from nunjucks call
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
62 @param sig_args: expected positional arguments
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
63 @param sig_kwargs: expected keyword arguments
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
64 @return: all expected arguments, with default value if not specified in nunjucks
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
65 """
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
66 # nunjucks set kwargs in last argument
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
67 given_args = list(n_args)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
68 try:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
69 given_kwargs = given_args.pop().to_dict()
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
70 except (AttributeError, IndexError):
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
71 # we don't have a dict as last argument
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
72 # that happens when there is no keyword argument
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
73 given_args = list(n_args)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
74 given_kwargs = {}
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
75 ret = given_args[:len(sig_args)]
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
76 # we check if we have remaining positional arguments
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
77 # in which case they may be specified in keyword arguments
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
78 for name in sig_args[len(given_args):]:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
79 try:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
80 value = given_kwargs.pop(name)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
81 except KeyError:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
82 raise ValueError(f"missing positional arguments {name!r}")
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
83 ret.append(value)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
84
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
85 extra_pos_args = given_args[len(sig_args):]
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
86 # and now the keyword arguments
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
87 for name, default in sig_kwargs.items():
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
88 if extra_pos_args:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
89 # kw args has been specified with a positional argument
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
90 ret.append(extra_pos_args.pop(0))
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
91 continue
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
92 value = given_kwargs.get(name, default)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
93 ret.append(value)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
94
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
95 return ret
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
96
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
97
1583
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
98 def _bare_jid(full_jid: str|jid.JID) -> str:
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
99 """Return the bare JID"""
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
100 return str(jid.JID(str(full_jid)).bare)
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
101
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
102 env.addFilter("bare_jid", _bare_jid)
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
103
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
104
1619
a2cd4222c702 browser: Updates for new design:
Goffi <goffi@goffi.org>
parents: 1583
diff changeset
105 def _initials(name: str) -> str:
a2cd4222c702 browser: Updates for new design:
Goffi <goffi@goffi.org>
parents: 1583
diff changeset
106 """Return the uppercased initials of a name."""
a2cd4222c702 browser: Updates for new design:
Goffi <goffi@goffi.org>
parents: 1583
diff changeset
107 name_parts = name.strip().split()
a2cd4222c702 browser: Updates for new design:
Goffi <goffi@goffi.org>
parents: 1583
diff changeset
108 if not name_parts:
a2cd4222c702 browser: Updates for new design:
Goffi <goffi@goffi.org>
parents: 1583
diff changeset
109 initials = "??"
a2cd4222c702 browser: Updates for new design:
Goffi <goffi@goffi.org>
parents: 1583
diff changeset
110 elif len(name_parts) == 1:
a2cd4222c702 browser: Updates for new design:
Goffi <goffi@goffi.org>
parents: 1583
diff changeset
111 initials = name_parts[0][:2]
a2cd4222c702 browser: Updates for new design:
Goffi <goffi@goffi.org>
parents: 1583
diff changeset
112 else:
a2cd4222c702 browser: Updates for new design:
Goffi <goffi@goffi.org>
parents: 1583
diff changeset
113 initials = name_parts[0][0] + name_parts[1][0]
a2cd4222c702 browser: Updates for new design:
Goffi <goffi@goffi.org>
parents: 1583
diff changeset
114 return initials.upper()
a2cd4222c702 browser: Updates for new design:
Goffi <goffi@goffi.org>
parents: 1583
diff changeset
115
a2cd4222c702 browser: Updates for new design:
Goffi <goffi@goffi.org>
parents: 1583
diff changeset
116 env.addFilter("initials", _initials)
a2cd4222c702 browser: Updates for new design:
Goffi <goffi@goffi.org>
parents: 1583
diff changeset
117
a2cd4222c702 browser: Updates for new design:
Goffi <goffi@goffi.org>
parents: 1583
diff changeset
118
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
119 def _next_gidx(value):
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
120 """Use next current global index as suffix"""
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
121 next_ = gidx.next(value)
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
122 return f"{value}{SCRIPT_SUFF}" if next_ == 0 else f"{value}_{SCRIPT_SUFF}{next_}"
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
123
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
124 env.addFilter("next_gidx", _next_gidx)
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
125
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
126
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
127 def _cur_gidx(value):
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
128 """Use current current global index as suffix"""
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
129 current = gidx.current(value)
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
130 return f"{value}{SCRIPT_SUFF}" if not current else f"{value}_{SCRIPT_SUFF}{current}"
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
131
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
132 env.addFilter("cur_gidx", _cur_gidx)
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
133
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
134
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
135 def _xmlattr(d, autospace=True):
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
136 if not d:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
137 return
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
138 d = d.to_dict()
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
139 ret = [''] if autospace else []
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
140 for key, value in d.items():
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
141 if value is not None:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
142 ret.append(f'{escape_html(key)}="{escape_html(str(value))}"')
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
143
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
144 return safe(' '.join(ret))
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
145
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
146 env.addFilter("xmlattr", _xmlattr)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
147
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
148
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
149 def _tojson(value):
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
150 return safe(escape_html(window.JSON.stringify(value)))
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
151
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
152 env.addFilter("tojson", _tojson)
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
153
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
154
1533
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
155 def _media_type_main(value: str|None) -> str|None:
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
156 """Return main type of a media type"""
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
157 if not value:
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
158 return None
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
159 return value.partition("/")[0]
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
160
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
161 env.addFilter("media_type_main", _media_type_main)
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
162
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
163
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
164 def _media_type_sub(value: str|None) -> str|None:
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
165 """Return main type of a media type"""
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
166 if not value:
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
167 return None
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
168 return value.partition("/")[1]
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
169
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
170 env.addFilter("media_type_sub", _media_type_sub)
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
171
285c49d7aad3 _browser (template): add `media_type_main` and `media_type_sub` filters:
Goffi <goffi@goffi.org>
parents: 1529
diff changeset
172
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
173 def _icon_use(name, cls=""):
1538
8d61654cb34f browser (template): fix `icon_use` when no class is specified
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
174 if cls:
8d61654cb34f browser (template): fix `icon_use` when no class is specified
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
175 kwargs = cls.to_dict()
8d61654cb34f browser (template): fix `icon_use` when no class is specified
Goffi <goffi@goffi.org>
parents: 1533
diff changeset
176 cls = kwargs.get('cls')
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
177 return safe(
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
178 '<svg class="svg-icon{cls}" xmlns="http://www.w3.org/2000/svg" '
1619
a2cd4222c702 browser: Updates for new design:
Goffi <goffi@goffi.org>
parents: 1583
diff changeset
179 'viewBox="0 0 100 100" fill="currentColor">\n'
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
180 ' <use href="#{name}"/>'
1619
a2cd4222c702 browser: Updates for new design:
Goffi <goffi@goffi.org>
parents: 1583
diff changeset
181 '</svg>\n'.format(name=name.replace(" ", "_"), cls=(" " + cls) if cls else "")
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
182 )
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
183
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
184 env.addGlobal("icon", _icon_use)
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
185
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
186
1583
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
187 def _date_fmt(timestamp, *args):
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
188 """Date formatting
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
189
1518
eb00d593801d refactoring: rename `libervia` to `libervia.web` + update imports following backend changes
Goffi <goffi@goffi.org>
parents: 1509
diff changeset
190 cf. libervia.backend.tools.common.date_utils for arguments details
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
191 """
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
192 fmt, date_only, auto_limit, auto_old_fmt, auto_new_fmt = get_args(
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
193 args, fmt="short", date_only=False, auto_limit=7, auto_old_fmt="short",
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
194 auto_new_fmt="relative",
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
195 )
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
196 from js_modules.moment import moment
1619
a2cd4222c702 browser: Updates for new design:
Goffi <goffi@goffi.org>
parents: 1583
diff changeset
197 # FIXME: we use `window.moment` as workaround for
a2cd4222c702 browser: Updates for new design:
Goffi <goffi@goffi.org>
parents: 1583
diff changeset
198 # https://github.com/brython-dev/brython/issues/2542 (see comments)
a2cd4222c702 browser: Updates for new design:
Goffi <goffi@goffi.org>
parents: 1583
diff changeset
199 date = window.moment.unix(timestamp)
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
200
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
201 if fmt == "auto_day":
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
202 fmt, auto_limit, auto_old_fmt, auto_new_fmt = "auto", 0, "short", "HH:mm"
1583
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
203
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
204 if fmt == "auto":
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
205 limit = moment().startOf('day').subtract(auto_limit, 'days')
1583
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
206 fmt = auto_old_fmt if date < limit else auto_new_fmt
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
207
1583
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
208 format_mapping = {
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
209 "short": "DD/MM/YY" if date_only else "DD/MM/YY HH:mm",
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
210 "medium": "DD MMM YYYY" if date_only else "DD MMM YYYY HH:mm",
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
211 "long": "D MMMM YYYY" if date_only else "D MMMM YYYY HH:mm",
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
212 "full": "dddd, D MMMM YYYY" if date_only else "dddd, D MMMM YYYY HH:mm",
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
213 "relative": date.fromNow(),
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
214 "iso": date.toISOString() if not date_only else "YYYY-MM-DD"
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
215 }
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
216
1583
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
217 # if `fmt` doesn't match any mapping, it's a free format
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
218 m_fmt = format_mapping.get(fmt, fmt)
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
219
9865013da86c browser(template): add `bare_jid` and fix `date_fmt`
Goffi <goffi@goffi.org>
parents: 1538
diff changeset
220 return m_fmt if fmt in ["relative", "iso"] else date.format(m_fmt)
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
221
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
222 env.addFilter("date_fmt", _date_fmt)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
223
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
224
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
225 class I18nExtension:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
226 """Extension to handle the {% trans %}{% endtrans %} statement"""
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
227 # FIXME: for now there is no translation, this extension only returns the string
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
228 # unmodified
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
229 tags = ['trans']
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
230
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
231 def parse(self, parser, nodes, lexer):
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
232 tok = parser.nextToken()
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
233 args = parser.parseSignature(None, True)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
234 parser.advanceAfterBlockEnd(tok.value)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
235 body = parser.parseUntilBlocks('endtrans')
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
236 parser.advanceAfterBlockEnd()
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
237 return nodes.CallExtension.new(self._js_ext, 'run', args, [body])
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
238
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
239 def run(self, context, *args):
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
240 body = args[-1]
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
241 return body()
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
242
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
243 @classmethod
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
244 def install(cls, env):
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
245 ext = cls()
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
246 ext_dict = {
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
247 "tags": ext.tags,
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
248 "parse": ext.parse,
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
249 "run": ext.run
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
250 }
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
251 ext._js_ext = javascript.pyobj2jsobj(ext_dict)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
252 env.addExtension(cls.__name__, ext._js_ext)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
253
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
254 I18nExtension.install(env)
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
255
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
256
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
257 class Template:
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
258
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
259 def __init__(self, tpl_name):
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
260 self._tpl = env.getTemplate(tpl_name, True)
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
261
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
262 def render(self, context):
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
263 return self._tpl.render(context)
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
264
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
265 def get_elt(self, context=None):
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
266 if context is None:
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
267 context = {}
1298
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
268 raw_html = self.render(context)
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
269 template_elt = document.createElement('template')
8aba2a2078ca browser: new template module:
Goffi <goffi@goffi.org>
parents:
diff changeset
270 template_elt.innerHTML = raw_html
1306
c07112ef01cd browser (template): adapted filters/global/extensions to manage SàT templates:
Goffi <goffi@goffi.org>
parents: 1298
diff changeset
271 return template_elt.content.firstElementChild