@@ -20,76 +20,47 @@ def livewire_message(request, component_name):
20
20
inst = instance_class (component_name )
21
21
if request .method == "POST" :
22
22
inst .parser_payload (request )
23
- return JsonResponse (inst .render (request ), safe = False )
23
+ return JsonResponse (inst .render (), safe = False )
24
24
25
25
26
- class LivewireComponent (object ):
27
- __id = None
28
- __request = None
29
26
30
- def __init__ (self , ** kwargs ):
31
- self .__kwargs = kwargs
32
-
33
- def get_component_name (self ):
34
- name = self .__class__ .__name__ .replace ("Livewire" , "" )
35
- name = snakecase (name )
36
- return name
37
-
38
- def get_dom (self ):
39
- context = self .get_context ()
40
- log .debug (context )
41
- return self ._render_component (context )
42
-
43
- def fill (
44
- self , context
45
- ): # Livewire Compatility https://laravel-livewire.com/docs/properties
46
- self .update_context (context )
47
-
48
- def get_context (self ):
49
- kwargs = self .__kwargs
50
- mount_result = {}
51
- # call mount if exists
52
- if hasattr (self , "mount" ) and callable (self .mount ): # Livewire Compatility
53
- mount_result = self .mount (** kwargs )
54
-
55
- params = get_vars (self )
56
- for property in params :
57
- mount_result [property ] = getattr (self , property )
58
- return mount_result
59
-
60
- def get_response (self ): # TODO: chnge to use render method on component view
61
- dom = self .get_dom ()
62
- json_response = {
63
- "id" : self .__id ,
64
- "name" : self .get_component_name (),
65
- "dom" : dom ,
66
- "fromPrefetch" : "" ,
67
- "redirectTo" : "" ,
68
- "children" : [],
69
- "dirtyInputs" : [],
70
- "data" : self .get_context (),
27
+ class LivewireTemplateTag :
28
+ def render_to_templatetag (self ):
29
+ self .id = get_id ()
30
+ component = self .get_component_name ()
31
+ context = self .get_context_data ()
32
+ initial_data = {
33
+ "id" : self .id ,
34
+ "name" : component ,
35
+ "redirectTo" : False ,
36
+ "events" : [],
71
37
"eventQueue" : [],
72
38
"dispatchQueue" : [],
73
- "events" : [],
74
- "checksum" : "c24" ,
39
+ "data" : context ,
40
+ "children" : {},
41
+ "checksum" : "9e4c194bb6aabf5f1" , # TODO: checksum
75
42
}
76
- if hasattr (self , "updates_query_string" ):
77
- json_response .update ({'updatesQueryString' : self .updates_query_string })
78
- return json_response
43
+ context ["initial_data" ] = initial_data
44
+ component_template = self .get_template_name ()
45
+ return self .render_component (component_template , context )
46
+
47
+ class LivewireProcessData :
48
+
49
+ def fill (self , context ): # Livewire Compatility https://laravel-livewire.com/docs/properties
50
+ self .update_context (context )
79
51
80
52
def update_context (self , data_context ):
81
53
for key , value in data_context .items ():
82
54
setattr (self , key , value )
83
-
84
- context = self .get_context ()
55
+ context = self .get_context_data ()
85
56
if data_context :
86
57
context .update (data_context )
87
58
return context
88
59
89
60
def parser_payload (self , request ):
90
- self .__request = request
61
+ self .request = request
91
62
payload = json .loads (request .body )
92
- self .__id = payload .get ("id" )
63
+ self .id = payload .get ("id" )
93
64
action_queue = payload .get ("actionQueue" , [])
94
65
for action in action_queue :
95
66
action_type = action .get ("type" )
@@ -111,36 +82,80 @@ def parser_payload(self, request):
111
82
data [action_payload ["name" ]] = action_payload ["value" ]
112
83
self .update_context (data )
113
84
114
- # TODO: chnge to use render method on component view
115
- def render (self , request ):
116
- response = self .get_response ()
117
- return response
118
85
119
- def _render_component (self , context , initial_data = {}):
120
- component_name = self .get_component_name ()
86
+ class LivewireComponent (LivewireTemplateTag , LivewireProcessData ):
87
+ id = None
88
+
89
+ def __init__ (self , ** kwargs ):
90
+ for key , value in kwargs .items ():
91
+ setattr (self , key , value )
92
+
93
+ def get_component_name (self ):
94
+ name = self .__class__ .__name__ .replace ("Livewire" , "" )
95
+ name = snakecase (name )
96
+ return name
97
+
98
+ def get_template_name (self ):
99
+ return self .template_name
100
+
101
+
102
+ def get_context_data (self ):
103
+ mount_result = {}
104
+ # call mount if exists
105
+ if hasattr (self , "mount" ) and callable (self .mount ): # Livewire Compatility
106
+ mount_result = self .mount ()
107
+
108
+ params = get_vars (self )
109
+ for property in params :
110
+ mount_result [property ] = getattr (self , property )
111
+ return mount_result
112
+
113
+ def get_dom (self ):
114
+ context = self .get_context_data ()
115
+ template_name = self .get_template_name ()
116
+ return self .render_component (template_name , context )
117
+
118
+ def render (self , context = {}):
119
+ """
120
+ A Livewire component's render method gets called on the initial page load AND every subsequent component update.
121
+
122
+ """
123
+ template_name = self .get_template_name ()
124
+ return self .view (template_name , context )
125
+
126
+ def view (self , template_name , context ):
127
+ dom = self .get_dom ()
128
+ return self .render_to_response (template_name , dom )
129
+
130
+ def render_component (self , component_template , context = {}):
131
+ initial_data = context .get ("initial_data" )
132
+ if initial_data :
133
+ del context ["initial_data" ]
121
134
component_render = render_to_string (
122
- f" { component_name } .livewire.html" , context = context
135
+ component_template , context = context
123
136
)
124
137
root = htmlement .fromstring (component_render ).find ("div" )
125
- root .set ("wire:id" , self .__id )
138
+ root .set ("wire:id" , self .id )
126
139
if initial_data :
127
140
root .set ("wire:initial-data" , json .dumps (initial_data ))
128
141
res = ET .tostring (root )
129
142
return mark_safe (smart_str (res ))
130
143
131
- def render_initial (self ):
132
- self .__id = get_id ()
133
- component = self .get_component_name ()
134
- context = self .get_context ()
135
- initial_data = {
136
- "id" : self .__id ,
137
- "name" : component ,
138
- "redirectTo" : False ,
139
- "events" : [],
144
+ def render_to_response (self , template_name , dom ): # TODO: chnge to use render method on component view
145
+ json_response = {
146
+ "id" : self .id ,
147
+ "name" : self .get_component_name (),
148
+ "dom" : dom ,
149
+ "fromPrefetch" : "" ,
150
+ "redirectTo" : "" ,
151
+ "children" : [],
152
+ "dirtyInputs" : [],
153
+ "data" : self .get_context_data (),
140
154
"eventQueue" : [],
141
155
"dispatchQueue" : [],
142
- "data" : context ,
143
- "children" : {},
144
- "checksum" : "9e4c194bb6aabf5f1" , # TODO: checksum
156
+ "events" : [],
157
+ "checksum" : "c24" ,
145
158
}
146
- return self ._render_component (context , initial_data = initial_data )
159
+ if hasattr (self , "updates_query_string" ):
160
+ json_response .update ({'updatesQueryString' : self .updates_query_string })
161
+ return json_response
0 commit comments