Mercurial > nebulaweb3
comparison default/assets/vendors/theme-widgets/widgets.js @ 0:1d038bc9b3d2 default tip
Up:default
author | Liny <dev@neowd.com> |
---|---|
date | Sat, 31 May 2025 09:21:51 +0800 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:1d038bc9b3d2 |
---|---|
1 /* Todo Widget | |
2 * -------------------- | |
3 * Fetches latest tweets for the user provided | |
4 * in the plugin options. | |
5 */ | |
6 | |
7 | |
8 var Todo = function Todo(node) { | |
9 var tasks = []; | |
10 | |
11 // Initialise list from the node | |
12 var lists = node.getElementsByTagName('li'); | |
13 for( var i = 0; i < lists.length; i++ ) { | |
14 var item = { | |
15 text: lists[i].innerHTML, | |
16 checked: JSON.parse( JSON.stringify( lists[i].dataset ) ).checked ? true : false | |
17 }; | |
18 tasks.push(item); | |
19 } | |
20 | |
21 // Todo App | |
22 var Todo = { | |
23 data: { | |
24 tasks: [], | |
25 }, | |
26 oninit: function(vnode) { | |
27 vnode.state.data.tasks = tasks; | |
28 }, | |
29 view: function(vnode) { | |
30 var self = this; | |
31 var ctrl = this.ctrl(vnode); | |
32 return [ | |
33 m('div.list-group', [ | |
34 vnode.state.data.tasks.map(function(item, index) { | |
35 return [ | |
36 m('div', { | |
37 class: 'list-group-item todo-item checkbox checkbox-info ' + ( item.checked ? ' checked' : ''), | |
38 }, [ | |
39 m('label', [ | |
40 m('input[type="checkbox"]', { | |
41 onchange: m.withAttr("value", ctrl.checkTask), | |
42 value: index, | |
43 checked: item.checked, | |
44 }), | |
45 m('span.label-text', item.text), | |
46 ]), | |
47 | |
48 m('span.delete-item.material-icons', { | |
49 onclick: m.withAttr("value", ctrl.deleteTask), | |
50 value: index, | |
51 }, 'delete'), | |
52 | |
53 m('span.edit-item.material-icons', { | |
54 onclick: m.withAttr("value", ctrl.editTask), | |
55 value: index, | |
56 }, 'edit'), | |
57 ]), | |
58 ]; | |
59 }), | |
60 m(this.noTaskMessage, { tasks: vnode.state.data.tasks } ), | |
61 ]), | |
62 m('input[type="text"].form-control', { | |
63 onkeypress: ctrl.addTask, | |
64 placeholder: 'add new task', | |
65 }, 'Add task'), | |
66 ]; | |
67 }, | |
68 | |
69 ctrl: function( vnode ) { | |
70 return { | |
71 | |
72 // Adding task on Enter Press of Input field | |
73 addTask: function(e) { | |
74 if( e.keyCode == 13 ) { | |
75 var val = e.target.value; | |
76 vnode.state.data.tasks.push( { text: val, checked: false } ); | |
77 e.target.value = ''; | |
78 } | |
79 }, | |
80 | |
81 // Check to task on click | |
82 checkTask: function(index) { | |
83 if( vnode.state.data.tasks[index] !== undefined) | |
84 vnode.state.data.tasks[index].checked = !vnode.state.data.tasks[index].checked; | |
85 }, | |
86 | |
87 // Delete task | |
88 deleteTask: function(index) { | |
89 vnode.state.data.tasks.splice(index, 1); | |
90 }, | |
91 | |
92 // Edit Task by adding a text field in the list | |
93 editTask: function(index) { | |
94 var parentNode = this.parentNode; | |
95 var labelText = parentNode.getElementsByClassName('label-text')[0]; | |
96 var text = labelText.innerHTML; | |
97 labelText.style.display = "none"; | |
98 parentNode.getElementsByClassName('delete-item')[0].style.display = "none"; | |
99 parentNode.getElementsByClassName('edit-item')[0].style.display = "none"; | |
100 | |
101 // View of the Text Field | |
102 var EditField = { | |
103 view: function() { | |
104 var self = this; | |
105 return [ | |
106 m('div.edit-field', [ | |
107 m('form.mr-t-0', { | |
108 onsubmit: function( e ) { | |
109 var container = parentNode.getElementsByClassName('edit-container-field')[0]; | |
110 var value = container.getElementsByTagName('input')[0].value; | |
111 vnode.state.data.tasks[index].text = value; | |
112 labelText.style.display = "block"; | |
113 parentNode.getElementsByClassName('delete-item')[0].style.display = "block"; | |
114 parentNode.getElementsByClassName('edit-item')[0].style.display = "block"; | |
115 container.parentNode.removeChild( container ); | |
116 } | |
117 }, m('input[type="text"].form-control', { | |
118 value: text, | |
119 }), | |
120 m('button[type="submit"].submit-btn.btn.btn-info', [ | |
121 m('i.material-icons', 'send'), | |
122 ]) | |
123 ), | |
124 ]), | |
125 ]; | |
126 } | |
127 }; | |
128 | |
129 var prevEditField = parentNode.parentNode.getElementsByClassName('edit-container-field'); | |
130 if ( prevEditField.length ) { | |
131 var event = document.createEvent('HTMLEvents'); | |
132 event.initEvent('submit', true, false); | |
133 prevEditField[0].getElementsByTagName('form')[0].dispatchEvent( event ); | |
134 } | |
135 var editContainer = document.createElement('div'); | |
136 editContainer.classList.add('edit-container-field'); | |
137 parentNode.getElementsByTagName('label')[0].appendChild( editContainer ); | |
138 m.mount( editContainer, EditField ); | |
139 }, | |
140 }; | |
141 }, | |
142 }; | |
143 | |
144 // View of Message when there is no task in the list | |
145 Todo.noTaskMessage = { | |
146 view: function(vnode) { | |
147 if( vnode.attrs.tasks.length === 0 ) { | |
148 return [ | |
149 m('div.list-group-item', [ | |
150 m('label', 'no tasks to display'), | |
151 ]), | |
152 ]; | |
153 } | |
154 return null; | |
155 } | |
156 }; | |
157 | |
158 return m.mount(node, Todo); | |
159 } | |
160 | |
161 | |
162 | |
163 | |
164 /* Twitter Feed Widgets | |
165 * -------------------- | |
166 * Fetches latest tweets for the user provided | |
167 * in the plugin options. | |
168 */ | |
169 | |
170 var TwitterWidget = function TwitterWidget(node, options) { | |
171 var WidgetOptions = options; | |
172 | |
173 var TweetsList = { | |
174 view: function(vnode) { | |
175 if ( vnode.attrs.tweets !== undefined ) { | |
176 return vnode.attrs.tweets.map( function(tweet, index) { | |
177 var hidden = index !== 0 ? 'hidden' : ''; | |
178 return m('div.status', { | |
179 class: 'animated fadeInLeft', | |
180 hidden: hidden, | |
181 },[ | |
182 m('p', tweet.text), | |
183 ]); | |
184 }); | |
185 } | |
186 return m('p', 'no items to show'); | |
187 }, | |
188 }; | |
189 | |
190 var TwitterWidget = { | |
191 data: { | |
192 tweets: [], | |
193 user: { | |
194 name: 'John Doe', | |
195 screen_name: 'johndoe', | |
196 profile_image_url: 'assets/demo/users/user-image.png', | |
197 }, | |
198 }, | |
199 oninit: function(vnode) { | |
200 var ctrl = this.ctrl(vnode); | |
201 ctrl.getQuery(); | |
202 }, | |
203 view: function(vnode) { | |
204 var ctrl = this.ctrl(vnode); | |
205 return [ | |
206 m('div.status-container', [ | |
207 m('div.user-info', [ | |
208 m('img.user-profile-picture', { src: vnode.state.data.user.profile_image_url, alt: vnode.state.data.user.screen_name + ' profile picture' }), | |
209 m('div.user-name-group', [ | |
210 m('h5.user-name', vnode.state.data.user.name), | |
211 m('h6.user-screen-name.ltr', '@' + vnode.state.data.user.screen_name), | |
212 ]), | |
213 m('i.widget-icon.feather.feather-twitter', null), | |
214 ]), | |
215 m('div.flex-1', null), | |
216 m( TweetsList, { oncreate: ctrl.slideTweets, tweets: vnode.state.data.tweets } ), | |
217 ]), | |
218 ]; | |
219 }, | |
220 ctrl: function(vnode) { | |
221 return { | |
222 getQuery: function() { | |
223 var queryString = ""; | |
224 queryString = m.buildQueryString(JSON.parse(WidgetOptions)); | |
225 queryString = '?' + queryString; | |
226 var url = 'assets/vendors/theme-widgets/getTwitterFeed.php' + queryString; | |
227 m.request({ | |
228 method: "GET", | |
229 url: url, | |
230 callbackKey: 'none' | |
231 }).then( function(results) { | |
232 if ( results.error === undefined ) { | |
233 vnode.state.data.tweets = JSON.parse( JSON.stringify(results) ); | |
234 vnode.state.data.user = vnode.state.data.tweets[0].user; | |
235 } | |
236 else | |
237 console.error( results ); | |
238 }).catch( console.error ); | |
239 }, | |
240 | |
241 slideTweets: function() { | |
242 var current = 0; | |
243 var statusDoms = vnode.dom.getElementsByClassName('status'); | |
244 function showSlide() { | |
245 if ( vnode.state.data.tweets.length === 0 ) return; | |
246 | |
247 var prev = current - 1; | |
248 if ( prev == -1 ) prev = vnode.state.data.tweets.length - 1; | |
249 | |
250 var currentStatusNode = statusDoms[current]; | |
251 if ( currentStatusNode !== undefined ) | |
252 currentStatusNode.hidden = ''; | |
253 | |
254 var prevStatusNode = statusDoms[prev]; | |
255 if ( prevStatusNode !== undefined ) | |
256 prevStatusNode.hidden = 'hidden'; | |
257 | |
258 if ( current == vnode.state.data.tweets.length - 1 ) current = 0; | |
259 else current++; | |
260 } | |
261 showSlide(); | |
262 setInterval(showSlide, 5000); | |
263 }, | |
264 }; | |
265 }, | |
266 }; | |
267 | |
268 var App = { | |
269 view: function(vnode) { | |
270 return m('h4','jfdkas'); | |
271 }, | |
272 }; | |
273 | |
274 m.mount( node, TwitterWidget ); | |
275 } | |
276 | |
277 | |
278 | |
279 | |
280 /* Facebook Feed Widget | |
281 * -------------------- | |
282 * Fetches latest tweets for the user provided | |
283 * in the plugin options. | |
284 */ | |
285 | |
286 var FacebookWidget = function FacebookWidget(node, options) { | |
287 var WidgetOptions = options; | |
288 var FacebookList = { | |
289 view: function(vnode) { | |
290 if ( vnode.attrs.statuses !== undefined ) { | |
291 return [ | |
292 vnode.attrs.statuses.map(function(status, index) { | |
293 var hidden = ( index !== 0 ) ? 'hidden' : ''; | |
294 var story = ''; | |
295 if ( status.message !== undefined ) | |
296 story = status.message; | |
297 else if ( status.story !== undefined ) | |
298 story = status.story; | |
299 | |
300 story = story.length > 160 ? story.substring(0,160) : story; | |
301 return m('div.status', { | |
302 class: "animated fadeInLeft", | |
303 hidden: hidden, | |
304 },[ | |
305 m('p', story), | |
306 ]); | |
307 }), | |
308 ]; | |
309 } | |
310 | |
311 return m('p','no posts to show'); | |
312 }, | |
313 }; | |
314 | |
315 var FacebookWidget = { | |
316 data: { | |
317 statuses: [], | |
318 user: { | |
319 name: 'John Doe', | |
320 username: 'johndoe', | |
321 picture: { | |
322 data: { | |
323 url: 'assets/demo/users/user-image.png', | |
324 } | |
325 } | |
326 } | |
327 }, | |
328 oninit: function(vnode) { | |
329 var ctrl = this.ctrl(vnode); | |
330 ctrl.fetchStatus(); | |
331 }, | |
332 view: function(vnode) { | |
333 var ctrl = this.ctrl(vnode); | |
334 return [ | |
335 m('div.status-container',[ | |
336 m('div.user-info',[ | |
337 m('img.user-profile-picture', { src: vnode.state.data.user.picture.data.url }), | |
338 m('div.user-name-group', [ | |
339 m('h5.user-name', vnode.state.data.user.username), | |
340 m('h6.user-screen-name.ltr', '@' + vnode.state.data.user.username), | |
341 ]), | |
342 m('i.widget-icon.feather.feather-facebook', null), | |
343 ]), | |
344 m('div.flex-1', null), | |
345 m(FacebookList, { oncreate: ctrl.slideStatus, statuses: vnode.state.data.statuses } ), | |
346 ]), | |
347 ]; | |
348 }, | |
349 | |
350 ctrl: function(vnode) { | |
351 return { | |
352 fetchStatus: function() { | |
353 var queryString = ""; | |
354 queryString = m.buildQueryString(JSON.parse(WidgetOptions)); | |
355 queryString = '?' + queryString; | |
356 var url = 'assets/vendors/theme-widgets/getFacebookFeed.php' + queryString; | |
357 m.request({ | |
358 method: 'GET', | |
359 url: url, | |
360 callbackKey: 'none' | |
361 }).then(function(results) { | |
362 if ( results.error === undefined ) { | |
363 vnode.state.data.statuses = results[0].data; | |
364 vnode.state.data.user = results[1]; | |
365 } | |
366 else { | |
367 results.dom = node; | |
368 console.error( results ); | |
369 } | |
370 }).catch(function(err) { | |
371 err.dom = node; | |
372 console.error( err ); | |
373 }); | |
374 }, | |
375 | |
376 slideStatus: function() { | |
377 var current = 0; | |
378 var statusDoms = vnode.dom.getElementsByClassName('status'); | |
379 function showSlide() { | |
380 var prev = current - 1; | |
381 if ( prev == -1 ) prev = vnode.state.data.statuses.length - 1; | |
382 | |
383 var currentStatusNode = statusDoms[current]; | |
384 if ( currentStatusNode !== undefined ) | |
385 currentStatusNode.hidden = ''; | |
386 | |
387 var prevStatusNode = statusDoms[prev]; | |
388 if ( prevStatusNode !== undefined ) | |
389 prevStatusNode.hidden = 'hidden'; | |
390 | |
391 if ( current == vnode.state.data.statuses.length - 1 ) current = 0; | |
392 else current++; | |
393 } | |
394 showSlide(); | |
395 setInterval(showSlide, 5000); | |
396 }, | |
397 }; | |
398 }, | |
399 }; | |
400 | |
401 m.mount( node, FacebookWidget); | |
402 } | |
403 | |
404 window.Todo = Todo; | |
405 window.FacebookWidget = FacebookWidget; | |
406 window.TwitterWidget = TwitterWidget; |