8000 move templates to interpreter · kevin808/pyscript@ee1db16 · GitHub
[go: up one dir, main page]

Skip to content

Commit ee1db16

Browse files
committed
move templates to interpreter
1 parent a6d0031 commit ee1db16

File tree

2 files changed

+134
-118
lines changed

2 files changed

+134
-118
lines changed

pyscriptjs/examples/pylist.py

Lines changed: 5 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -3,116 +3,6 @@
33
from js import console, HTMLElement, document
44

55

6-
def add_classes(element, class_list):
7-
for klass in class_list.split(' '):
8-
element.classList.add(klass)
9-
10-
def create(what, id_=None, classes=''):
11-
element = document.createElement(what)
12-
if id_:
13-
element.id = id_
14-
add_classes(element, classes)
15-
return Element(id_, element)
16-
17-
class PyWidgetTheme:
18-
def __init__(self, main_style_classes):
19-
self.main_style_classes = main_style_classes
20-
21-
def theme_it(self, widget):
22-
for klass in self.main_style_classes.split(' '):
23-
widget.classList.add(klass)
24-
25-
26-
class PyListTemplate:
27-
theme = PyWidgetTheme("flex flex-col-reverse mt-4")
28-
29-
30-
def __init__(self, parent):
31-
self.parent = parent
32-
self._children = []
33-
self.id = self.parent.id
34-
35-
def connect(self):
36-
self.md = main_div = document.createElement('div');
37-
main_div.id = self.id + "-list-tasks-container"
38-
39-
if self.theme:
40-
self.theme.theme_it(main_div)
41-
42-
self.parent.appendChild(main_div)
43-
44-
def add(self, data, labels):
45-
child = PyItem(self, data, labels)
46-
return self._add(child)
47-
48-
def _add(self, child_elem):
49-
console.log("appending child", child_elem.element)
50-
self.pre_child_append(child_elem)
51-
child_elem.pre_append()
52-
self._children.append(child_elem)
53-
self.md.appendChild(child_elem.create().element)
54-
child_elem.post_append()
55-
self.child_appended(child_elem)
56-
return child_elem
57-
58-
def pre_child_append(self, child):
59-
pass
60-
61-
def child_appended(self, child):
62-
"""Overwrite me to define logic"""
63-
pass
64-
65-
66-
class PyItemTemplate(Element):
67-
def __init__(self, parent, data, labels):
68-
self._parent = parent
69-
self.id = f"{self._parent.id}-c-{len(self._parent._children)}"
70-
self.data = data
71-
self.data['id'] = self.id
72-
self.labels = labels
73-
74-
super().__init__(self.id)
75-
76-
def create(self):
77-
console.log('creating section')
78-
new_child = create('section', self.id, "task bg-white my-1")
79-
console.log('creating values')
80-
values = ' - '.join([self.data[f] for f in self.labels])
81-
console.log('creating innerHtml')
82-
new_child._element.innerHTML = f"""
83-
<label for="flex items-center p-2 ">
84-
<input class="mr-2" type="checkbox" class="task-check">
85-
<p class="m-0 inline">{values}</p>
86-
</label>
87-
"""
88-
89-
# check = new_child.select('input').element
90-
# check.onclick = self.check_task
91-
console.log('returning')
92-
return new_child
93-
94-
def on_click(self, evt):
95-
pass
96-
97-
def pre_append(self):
98-
pass
99-
100-
def post_append(self):
101-
self.element.click = self.on_click
102-
self.element.onclick = self.on_click
103-
104-
self._post_append()
105-
106-
def _post_append(self):
107-
pass
108-
109-
def strike(self, value):
110-
if value:
111-
self.add_class("line-through")
112-
else:
113-
self.remove_class("line-through")
114-
115-
1166
class PyList(PyListTemplate):
1177
pass
1188

@@ -124,14 +14,11 @@ def on_click(self, evt=None):
12414

12515
self.select('input').element.checked = self.data['done']
12616

17+
def display(self):
18+
return self.data['content']
19+
12720

12821
def add_task(*ags, **kws):
129-
console.log(new_task_content.value)
130-
console.log('adding1', myList)
131-
task = {
132-
"content": new_task_content.value,
133-
F438 "done": False,
134-
"created_at": dt.now()
135-
}
136-
myList.add(task, ['content'])
22+
task = { "content": new_task_content.value, "done": False, "created_at": dt.now() }
23+
myList.add(PyItem(task, labels=['content'], state_key="done"))
13724
new_task_content.clear()

pyscriptjs/src/interpreter.ts

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ class Element:
5151
self._id = element_id
5252
self._element = element
5353
54+
@property
55+
def id(self):
56+
return self._id
57+
5458
@property
5559
def element(self):
5660
"""Return the dom element"""
@@ -115,6 +119,131 @@ class Element:
115119
def add_class(self, classname):
116120
self.element.classList.add(classname)
117121
122+
def add_classes(element, class_list):
123+
for klass in class_list.split(' '):
124+
element.classList.add(klass)
125+
126+
def create(what, id_=None, classes=''):
127+
element = document.createElement(what)
128+
if id_:
129+
element.id = id_
130+
add_classes(element, classes)
131+
return Element(id_, element)
132+
133+
class PyWidgetTheme:
134+
def __init__(self, main_style_classes):
135+
self.main_style_classes = main_style_classes
136+
137+
def theme_it(self, widget):
138+
for klass in self.main_style_classes.split(' '):
139+
widget.classList. 10000 add(klass)
140+
141+
142+
class PyListTemplate:
143+
theme = PyWidgetTheme("flex flex-col-reverse mt-4")
144+
145+
146+
def __init__(self, parent):
147+
self.parent = parent
148+
self._children = []
149+
self._id = self.parent.id
150+
151+
def connect(self):
152+
self.md = main_div = document.createElement('div');
153+
main_div.id = self._id + "-list-tasks-container"
154+
155+
if self.theme:
156+
self.theme.theme_it(main_div)
157+
158+
self.parent.appendChild(main_div)
159+
160+
def add(self, child):
161+
child.register_parent(self)
162+
return self._add(child)
163+
164+
def _add(self, child_elem):
165+
console.log("appending child", child_elem.element)
166+
self.pre_child_append(child_elem)
167+
child_elem.pre_append()
168+
self._children.append(child_elem)
169+
self.md.appendChild(child_elem.create().element)
170+
child_elem.post_append()
171+
self.child_appended(child_elem)
172+
return child_elem
173+
174+
def pre_child_append(self, child):
175+
pass
176+
177+
def child_appended(self, child):
178+
"""Overwrite me to define logic"""
179+
pass
180+
181+
182+
class PyItemTemplate(Element):
183+
label_fields = None
184+
185+
def __init__(self, data, labels=None, state_key=None, parent=None):
186+
self.data = data
187+
188+
self.register_parent(parent)
189+
190+
if not labels:
191+
labels = list(self.data.keys())
192+
self.labels = labels
193+
194+
self.state_key = state_key
195+
196+
super().__init__(self._id)
197+
198+
def register_parent(self, parent):
199+
self._parent = parent
200+
if parent:
201+
self._id = f"{self._parent._id}-c-{len(self._parent._children)}"
202+
self.data['id'] = self._id
203+
else:
204+
self._id = None
205+
206+
def create(self):
207+
console.log('creating section')
208+
new_child = create('section', self._id, "task bg-white my-1")
209+
console.log('creating values')
210+
211+
console.log('creating innerHtml')
212+
new_child._element.innerHTML = f"""
213+
<label for="flex items-center p-2 ">
214+
<input class="mr-2" type="checkbox" class="task-check">
215+
<p class="m-0 inline">{self.render_content()}</p>
216+
</label>
217+
"""
218+
219+
console.log('returning')
220+
return new_child
221+
222+
def on_click(self, evt):
223+
pass
224+
225+
def pre_append(self):
226+
pass
227+
228+
def post_append(self):
229+
self.element.click = self.on_click
230+
self.element.onclick = self.on_click
231+
232+
self._post_append()
233+
234+
def _post_append(self):
235+
pass
236+
237+
def strike(self, value):
238+
if value:
239+
self.add_class("line-through")
240+
else:
241+
self.remove_class("line-through")
242+
243+
def render_content(self):
244+
return ' - '.join([self.data[f] for f in self.labels])
245+
246+
118247
class OutputCtxManager:
119248
def __init__(self, out=None, output_to_console=True, append=True):
120249
self._out = out

0 commit comments

Comments
 (0)
0