1
- from django .shortcuts import render
2
1
from django .template .loader import render_to_string
3
2
from django .utils .encoding import smart_str
4
3
from django .utils .safestring import mark_safe
11
10
import htmlement
12
11
import xml .etree .ElementTree as ET
13
12
from .utils import get_id , get_component_name , instance_class
13
+ from .utils import get_vars , snakecase
14
14
15
15
def livewire_message (request , component_name ):
16
16
inst = instance_class (component_name )
@@ -21,30 +21,41 @@ def livewire_message(request, component_name):
21
21
22
22
23
23
class LivewireComponent (object ):
24
- id = None
24
+ __id = None
25
+
25
26
26
27
def __init__ (self , ** kwargs ):
27
- self .kwargs = kwargs
28
+ self .__kwargs = kwargs
28
29
29
30
def get_component_name (self ):
30
- name = self .__class__ .__name__ .lower ()
31
- return name .replace ("livewire" ,"" )
31
+ name = self .__class__ .__name__ .replace ("Livewire" ,"" )
32
+ name = snakecase (name )
33
+ return name
32
34
33
35
def get_dom (self ):
34
36
context = self .get_context ()
35
37
return self ._render_component (context )
36
38
39
+ def fill (self , context ): # Livewire Compatility https://laravel-livewire.com/docs/properties
40
+ self .update_context (context )
41
+
37
42
def get_context (self ):
38
- kwargs = self .kwargs
39
- return self .mount (** kwargs )
43
+ kwargs = self .__kwargs
44
+ mount_result = {}
45
+ if hasattr (self , "mount" ): # Livewire Compatility
46
+ mount_result = self .mount (** kwargs )
47
+ params = get_vars (self )
48
+ for property in params :
49
+ mount_result [property ] = getattr (self , property )
50
+ return mount_result
40
51
41
52
def get_response (self ):
42
53
dom = self .get_dom ()
43
54
return {
44
- 'id' : self .id ,
55
+ 'id' : self .__id ,
45
56
'name' : self .get_component_name (),
46
57
'dom' : dom ,
47
- 'fromPrefetch' :'' ,
58
+ 'fromPrefetch' : '' ,
48
59
'redirectTo' : '' ,
49
60
'children' : [],
50
61
'dirtyInputs' : [],
@@ -59,20 +70,20 @@ def update_context(self, data_context):
59
70
context = self .get_context ()
60
71
context .update (data_context )
61
72
for key , value in context .items ():
62
- setattr (self , key ,value )
73
+ setattr (self , key , value )
63
74
return context
64
75
65
76
66
77
def parser_payload (self , payload ):
67
- self .id = payload .get ("id" )
78
+ self .__id = payload .get ("id" )
68
79
self .update_context (payload .get ("data" ))
69
80
action_queue = payload .get ("actionQueue" , [])
70
81
for action in action_queue :
71
82
action_type = action .get ("type" )
72
83
payload = action .get ("payload" )
73
84
if action_type == "callMethod" :
74
85
method = payload .get ("method" )
75
- params = payload .get ("params" ,[])
86
+ params = payload .get ("params" , [])
76
87
"""
77
88
TODO:
78
89
RUN THIS IT IS REALLY SAFE ???
@@ -81,37 +92,40 @@ def parser_payload(self, payload):
81
92
"""
82
93
local_method = getattr (self , method )
83
94
local_method (* params )
95
+ elif action_type == "syncInput" :
96
+ data = {}
97
+ data [payload ["name" ]] = payload ["value" ]
98
+ self .update_context (data )
84
99
85
100
def render (self ):
86
101
response = self .get_response ()
87
102
return response
88
103
89
- def _render_component (self , context , initial_data = {} ):
104
+ def _render_component (self , context , initial_data = {}):
90
105
component_name = self .get_component_name ()
91
106
component_render = render_to_string (f'{ component_name } .livewire.html' ,
92
107
context = self .get_context ())
93
108
root = htmlement .fromstring (component_render ).find ("div" )
94
- root .set ('wire:id' , self .id )
109
+ root .set ('wire:id' , self .__id )
95
110
if initial_data :
96
- root .set ("wire:initial-data" ,json .dumps (initial_data ))
111
+ root .set ("wire:initial-data" , json .dumps (initial_data ))
97
112
res = ET .tostring (root )
98
- return mark_safe (smart_str (res ))
99
-
113
+ return mark_safe (smart_str (res ))
100
114
101
115
def render_initial (self ):
102
- self .id = get_id ()
116
+ self .__id = get_id ()
103
117
component = self .get_component_name ()
104
118
context = self .get_context ()
105
119
initial_data = {
106
- 'id' : self .id ,
120
+ 'id' : self .__id ,
107
121
'name' : component ,
108
122
'redirectTo' : False ,
109
123
"events" : [],
110
124
"eventQueue" : [],
111
125
"dispatchQueue" : [],
112
- "data" : context ,
126
+ "data" : context ,
113
127
"children" : {},
114
- "checksum" : "9e4c194bb6aabf5f1" # TODO: checksum
128
+ "checksum" : "9e4c194bb6aabf5f1" # TODO: checksum
115
129
}
116
130
return self ._render_component (context , initial_data = initial_data )
117
131
0 commit comments