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;