· 8 years ago · Jan 15, 2018, 08:34 AM
1Ti.UI.setBackgroundColor('#000');
2var activity = Ti.Android.currentActivity;
3
4var LEVENTS = {
5 TABLE_LISTS_CHANGED: 'tlistChanged',
6 TABLE_ENTRIES_CHANGED: 'tentriesChanged'
7};
8var DB_NAME = 'listit.db';
9
10var lUtils = {
11 notify: function(msg) {
12 if(msg) {
13 Ti.UI.createNotification({
14 message : msg
15 }).show();
16 }
17 },
18
19 dbgInfo: function(msg) {
20 Ti.API.info(msg);
21 }
22};
23// this sets the background color of the master UIView (when there are no windows/tab groups on it)
24var tableList = {
25 setOnCreateNewList: function(fn) {
26 tableList.onCreateNewList = fn;
27 },
28
29 setOnViewList: function(fn) {
30 tableList.onViewList = fn;
31 },
32
33 init: function() {
34 tableList.winTblList = Ti.UI.createWindow({
35 title: "My Lists",
36 backgroundColor: "#efefef",
37 exitOnClose: true,
38 layout: 'vertical',
39 navBarHidden: false
40 });
41 tableList.winTblList.open();
42
43 tableList.btnNewList = Ti.UI.createButton({
44 backgroundImage:'/images/BUTT_grn_off.png',
45 backgroundSelectedImage:'/images/BUTT_grn_on.png',
46 top:5,
47 width:301,
48 height:57,
49 font:{fontSize:20,fontWeight:'bold',fontFamily:'Helvetica Neue'},
50 title: "New List"
51 });
52
53 tableList.btnNewList.addEventListener('click', function() {
54 lUtils.notify('Create new list');
55 if(tableList.onCreateNewList) tableList.onCreateNewList();
56 });
57 },
58
59 refreshData: function() {
60 var db = Ti.Database.open(DB_NAME);
61 db.execute('CREATE TABLE IF NOT EXISTS listnames (id INTEGER PRIMARY KEY, name TEXT, created_at NUMERIC)');
62
63 // Empty array "rowData" for our tableview
64 var rowData = [];
65
66 lUtils.dbgInfo("Selecting from DB");
67 var rows = db.execute("SELECT * FROM listnames");
68 var i = 0;
69 while (rows.isValidRow()) {
70 var name = rows.fieldByName('name');
71 var created_at = rows.fieldByName('created_at');
72
73 rowData.push({
74 title: name,
75 hasChild: true,
76 color: '#000',
77 font:{fontSize:20,fontWeight:'bold',fontFamily:'Helvetica Neue'},
78 selectedColor: 'red'
79 });
80
81 rows.next();
82 };
83 /*rowData.push({
84 title: "test name",
85 hasChild: true,
86 color: '#000',
87 font:{fontSize:20,fontWeight:'bold',fontFamily:'Helvetica Neue'},
88 selectedColor: 'red'
89 });*/
90
91 rows.close();
92 db.close();
93
94 // Create the table view and set its data source to "rowData" array
95 if(!tableList.tableView) {
96 tableList.tableView = Ti.UI.createTableView({
97 data : rowData
98 });
99
100 tableList.tableView.addEventListener('click', function(e) {
101 var tblName = e.rowData.title;
102 lUtils.notify('Opening ' + tblName);
103 if(tableList.onViewList) tableList.onViewList(tblName);
104 });
105 //Add the table view to the window
106 tableList.winTblList.add(tableList.tableView);
107 tableList.winTblList.add(tableList.btnNewList);
108 }
109 else {
110 tableList.tableView.data = rowData;
111 }
112 }
113};
114
115var addTable = {
116 init: function () {
117 lUtils.notify('Create New List');
118
119 addTable.win = Ti.UI.createWindow({
120 title: "Create New List",
121 backgroundColor: "#efefef",
122 navBarHidden: false,
123 layout: 'vertical'
124 });
125 addTable.win.addEventListener('open', function(){
126 addTable.colNames = [];
127
128 var lblTblName = Ti.UI.createLabel({
129 text:'Name',
130 height:'auto',
131 width:'auto',
132 shadowColor:'#aaa',
133 shadowOffset:{x:5,y:5},
134 color:'#900',
135 font:{fontSize:20,fontWeight:'bold',fontFamily:'Helvetica Neue'},
136 textAlign:'left',
137 left: 5
138 });
139 addTable.win.add(lblTblName);
140
141 var tfName = Ti.UI.createTextField({
142 height:'auto',
143 width:'300',
144 font:{fontSize:20},
145 left: 10
146 });
147 addTable.win.add(tfName);
148
149 var lblColumns = Ti.UI.createLabel({
150 text:'Column Names',
151 height:'auto',
152 width:'auto',
153 shadowColor:'#aaa',
154 shadowOffset:{x:5,y:5},
155 color:'#900',
156 font:{fontSize:20,fontWeight:'bold',fontFamily:'Helvetica Neue'},
157 textAlign:'left',
158 left: 5
159 });
160 addTable.win.add(lblColumns);
161
162 var lblColumnHelp = Ti.UI.createLabel({
163 text:'(leave empty for unwanted columns)',
164 height:'auto',
165 width:'auto',
166 shadowColor:'#aaa',
167 shadowOffset:{x:5,y:5},
168 color:'#000',
169 font:{fontSize:10,fontFamily:'Helvetica Neue'},
170 textAlign:'left',
171 left: 5
172 });
173 addTable.win.add(lblColumnHelp);
174
175 for(var colIndex=0; colIndex < 5; colIndex++) {
176 var tfColName = Ti.UI.createTextField({
177 height:'auto',
178 width:'300',
179 font:{fontSize:20},
180 left: 10
181 });
182 if(colIndex == 0) tfColName.value = "text";
183 addTable.win.add(tfColName);
184 addTable.colNames.push(tfColName);
185 }
186
187 var btnNext = Ti.UI.createButton({
188 backgroundImage:'/images/BUTT_grn_off.png',
189 backgroundSelectedImage:'/images/BUTT_grn_on.png',
190 top: 5,
191 width:301,
192 height:57,
193 font:{fontSize:20,fontWeight:'bold',fontFamily:'Helvetica Neue'},
194 title: "Create"
195 });
196
197 var nextBtnHandler = function() {
198 addTable.tableName = tfName.value;
199 if(!addTable.tableName || !addTable.tableName.length) return;
200 addTable.createTable();
201 };
202
203 btnNext.addEventListener('click', nextBtnHandler);
204
205 addTable.win.add(btnNext);
206 });
207 addTable.win.open();
208 },
209
210 createTable: function() {
211 var db = Ti.Database.open(DB_NAME);
212
213 var sql = 'CREATE TABLE IF NOT EXISTS ' + addTable.tableName + " (id INTEGER PRIMARY KEY";
214 for(var colIndex=0; colIndex < 5; colIndex++) {
215 var colName = addTable.colNames[colIndex].value;
216 if(colName) {
217 sql += (", " + colName + " TEXT");
218 }
219 }
220 sql += ')';
221
222 db.execute(sql);
223 db.execute('INSERT INTO listnames (name, created_at) VALUES(?, ?)', addTable.tableName, new Date());
224 db.close();
225 lUtils.notify('Created list: ' + addTable.tableName);
226 addTable.win.close();
227 Ti.Utils.fireEvent(LEVENTS.TABLE_LISTS_CHANGED, null);
228 }
229};
230
231var viewTable = {
232 setOnViewRow: function(fn) {
233 viewTable.onViewRow = fn;
234 },
235
236 setOnAddRow: function(fn) {
237 viewTable.onAddRow = fn;
238 },
239
240 init: function(tblName) {
241 viewTable.tableName = tblName;
242 viewTable.win = Ti.UI.createWindow({
243 title: "List: " + viewTable.tableName,
244 backgroundColor: "#efefef",
245 navBarHidden: false,
246 layout: 'vertical'
247 });
248
249 viewTable.win.addEventListener('open', function(){
250 viewTable.createScreen();
251 viewTable.refreshData();
252 });
253 viewTable.win.open();
254 },
255
256 createScreen: function() {
257 // Create the table view and set its data source to "rowData" array
258 viewTable.tableView = Ti.UI.createTableView();
259
260 viewTable.tableView.addEventListener('click', function(e) {
261 lUtils.dbgInfo("Name: " + viewTable.tableName);
262 lUtils.notify('Details');
263
264 if(viewTable.onViewRow) {
265 viewTable.onViewRow(viewTable.tableName, viewTable.colNames, viewTable.rowCols[e.index]);
266 }
267 });
268 //Add the table view to the window
269 viewTable.win.add(viewTable.tableView);
270
271 var btnAdd = Ti.UI.createButton({
272 backgroundImage:'/images/BUTT_grn_off.png',
273 backgroundSelectedImage:'/images/BUTT_grn_on.png',
274 top: 5,
275 width:301,
276 height:57,
277 font:{fontSize:20,fontWeight:'bold',fontFamily:'Helvetica Neue'},
278 title: "Add Data"
279 });
280
281 var addBtnHandler = function() {
282 lUtils.dbgInfo("Add an entry to: " + viewTable.tableName);
283 lUtils.notify('Add to list');
284
285 if(viewTable.onAddRow) {
286 viewTable.onAddRow(viewTable.tableName, viewTable.colNames, null);
287 }
288 };
289 btnAdd.addEventListener('click', addBtnHandler);
290 viewTable.win.add(btnAdd);
291
292 var btnDeleteList = Ti.UI.createButton({
293 backgroundImage:'/images/BUTT_grn_off.png',
294 backgroundSelectedImage:'/images/BUTT_grn_on.png',
295 top: 5,
296 width:301,
297 height:57,
298 font:{fontSize:20,fontWeight:'bold',fontFamily:'Helvetica Neue'},
299 title: "Delete List"
300 });
301
302 var delListBtnHandler = function() {
303 var db = Ti.Database.open(DB_NAME);
304 db.execute('DROP TABLE IF EXISTS ' + viewTable.tableName);
305 db.execute('DELETE FROM listnames where name = ?', viewTable.tableName);
306 viewTable.win.close();
307 lUtils.notify('Deleted ' + viewTable.tableName);
308 Ti.Utils.fireEvent(LEVENTS.TABLE_LISTS_CHANGED, null);
309 db.close();
310 };
311
312 btnDeleteList.addEventListener('click', delListBtnHandler);
313
314 viewTable.win.add(btnDeleteList);
315 },
316
317 refreshData: function() {
318 var rowData = [];
319 viewTable.rowCols = [];
320 var db = Ti.Database.open(DB_NAME);
321
322 viewTable.colNames = [];
323
324 lUtils.dbgInfo("Selecting from DB: " + viewTable.tableName);
325 var rows = db.execute("SELECT * FROM " + viewTable.tableName);
326 var i = 0;
327 lUtils.dbgInfo("Num columns: " + rows.fieldCount);
328
329 for(var colCount=0; colCount < rows.fieldCount; colCount++) {
330 viewTable.colNames.push(rows.fieldName(colCount));
331 }
332
333 lUtils.dbgInfo("rows: " + rows + " count:" + rows.rowCount + " is not null:" + (null != rows));
334 while ((null != rows) && (rows.rowCount > 0) && rows.isValidRow()) {
335 lUtils.dbgInfo("Got a row");
336
337 var data = "";
338 var rowColsData = [];
339 var fieldsAdded = 0;
340 for(var fieldNum=0; fieldNum < viewTable.colNames.length; fieldNum++) {
341 var colData = rows.fieldByName(viewTable.colNames[fieldNum]);
342 rowColsData.push(colData);
343 if(viewTable.colNames[fieldNum] != 'id') {
344 if(fieldsAdded > 0) data += " | ";
345 data += colData;
346 fieldsAdded++;
347 }
348 }
349
350 viewTable.rowCols.push(rowColsData);
351 rowData.push({
352 title: data,
353 hasChild: true,
354 color: '#000',
355 font:{fontSize:20,fontWeight:'bold',fontFamily:'Helvetica Neue'},
356 selectedColor: 'red'
357 });
358 rows.next();
359 };
360 /*
361 rowData.push({
362 title: "test name",
363 hasChild: true,
364 color: '#000',
365 font:{fontSize:20,fontWeight:'bold',fontFamily:'Helvetica Neue'},
366 selectedColor: 'red'
367 });
368 */
369 if(null != rows) rows.close();
370 db.close();
371 viewTable.tableView.data = rowData;
372 }
373};
374
375var viewRow = {
376 updateBtnHandler: function() {
377 var db = Ti.Database.open(DB_NAME);
378 var sql = 'UPDATE ' + viewRow.tableName + ' SET ';
379
380 var colsAdded = 0;
381 for(var colIndex=0; colIndex < viewRow.colNames.length; colIndex++) {
382 if(viewRow.colNames[colIndex] != 'id') {
383 if(colsAdded > 0) sql += ', ';
384 var colVal = viewRow.tfCols[colsAdded].value ? viewRow.tfCols[colsAdded].value : '';
385 sql += (viewRow.colNames[colIndex] + "='" + colVal + "'");
386 colsAdded++;
387 }
388 }
389 sql += (' WHERE id=' + viewRow.rowId);
390 lUtils.dbgInfo("SQL: " + sql);
391 db.execute(sql);
392 db.close();
393
394 lUtils.notify('Changed');
395
396 viewRow.win.close();
397 Ti.Utils.fireEvent(LEVENTS.TABLE_ENTRIES_CHANGED, null);
398 },
399
400 insertBtnHandler: function() {
401 var db = Ti.Database.open(DB_NAME);
402 var sql = 'INSERT INTO ' + viewRow.tableName + '(';
403
404 var colIndex;
405 var colsAdded = 0;
406 for(colIndex=0; colIndex < viewRow.colNames.length; colIndex++) {
407 if(viewRow.colNames[colIndex] != 'id') {
408 if(colsAdded > 0) sql += ', ';
409 sql += viewRow.colNames[colIndex];
410 colsAdded++;
411 }
412 }
413
414 sql += ') VALUES (';
415
416 colsAdded = 0;
417 for(colIndex=0; colIndex < viewRow.colNames.length; colIndex++) {
418 if(viewRow.colNames[colIndex] != 'id') {
419 if(colsAdded > 0) sql += ', ';
420 var colVal = viewRow.tfCols[colsAdded].value ? viewRow.tfCols[colsAdded].value : '';
421 sql += ("'" + colVal + "'");
422 colsAdded++;
423 }
424 }
425 sql += ')';
426
427 lUtils.dbgInfo("SQL: " + sql);
428 db.execute(sql);
429 db.close();
430
431 lUtils.notify('Added');
432
433 viewRow.win.close();
434 Ti.Utils.fireEvent(LEVENTS.TABLE_ENTRIES_CHANGED, null);
435 },
436
437 init: function(tableName, colNames, colData) {
438 //var rowData = [];
439 var db = Ti.Database.open(DB_NAME);
440 viewRow.tfCols = [];
441 viewRow.rowId = -1;
442
443 viewRow.win = Ti.UI.createWindow({
444 title: (colData ? ("From " + tableName) : ('Add to ' + tableName)),
445 backgroundColor: "#efefef",
446 navBarHidden: false,
447 layout: 'vertical'
448 });
449 viewRow.tableName = tableName;
450 viewRow.colNames = colNames;
451
452 lUtils.dbgInfo("Showing/Adding a row from " + viewRow.tableName);
453
454 viewRow.win.addEventListener('open', function(){
455 lUtils.dbgInfo("Col names " + viewRow.colNames);
456 for(var colIndex=0; colIndex < viewRow.colNames.length; colIndex++) {
457 lUtils.dbgInfo("Col name " + viewRow.colNames[colIndex]);
458 if(viewRow.colNames[colIndex] == 'id') {
459 if(colData && colData[colIndex] >= 0) viewRow.rowId = colData[colIndex];
460 }
461 else {
462 var lblColName = Ti.UI.createLabel({
463 text: viewRow.colNames[colIndex],
464 height:'auto',
465 width:'auto',
466 shadowColor:'#aaa',
467 shadowOffset:{x:5,y:5},
468 color:'#900',
469 font:{fontSize:20,fontWeight:'bold',fontFamily:'Helvetica Neue'},
470 textAlign:'left',
471 left: 5
472 });
473 viewRow.win.add(lblColName);
474
475 var tfColData = Ti.UI.createTextField({
476 height:'auto',
477 width:'300',
478 font:{fontSize:20},
479 left: 10
480 });
481 if(colData && colData[colIndex]) tfColData.value = colData[colIndex];
482 viewRow.tfCols.push(tfColData);
483 viewRow.win.add(tfColData);
484 }
485 }
486
487 var btnAdd = Ti.UI.createButton({
488 backgroundImage:'/images/BUTT_grn_off.png',
489 backgroundSelectedImage:'/images/BUTT_grn_on.png',
490 top: 5,
491 width:301,
492 height:57,
493 font:{fontSize:20,fontWeight:'bold',fontFamily:'Helvetica Neue'}
494 });
495
496 if(viewRow.rowId < 0) {
497 btnAdd.addEventListener('click', viewRow.insertBtnHandler);
498 btnAdd.title = "Add";
499 }
500 else {
501 btnAdd.addEventListener('click', viewRow.updateBtnHandler);
502 btnAdd.title = "Change";
503 }
504 viewRow.win.add(btnAdd);
505
506 if(viewRow.rowId >= 0) {
507 var btnDelete = Ti.UI.createButton({
508 backgroundImage:'/images/BUTT_grn_off.png',
509 backgroundSelectedImage:'/images/BUTT_grn_on.png',
510 top: 5,
511 width:301,
512 height:57,
513 font:{fontSize:20,fontWeight:'bold',fontFamily:'Helvetica Neue'},
514 title: "Delete"
515 });
516
517 var delBtnHandler = function() {
518 if(viewRow.rowId < 0) return;
519 var db = Ti.Database.open(DB_NAME);
520 db.execute('DELETE FROM ' + viewRow.tableName + ' where id = ?', viewRow.rowId);
521 db.close();
522
523 lUtils.notify('Deleted');
524
525 viewRow.win.close();
526 Ti.Utils.fireEvent(LEVENTS.TABLE_ENTRIES_CHANGED, null);
527 };
528 btnDelete.addEventListener('click', delBtnHandler);
529 viewRow.win.add(btnDelete);
530 }
531 });
532 viewRow.win.open();
533 }
534};
535tableList.init();
536tableList.refreshData();
537
538tableList.setOnCreateNewList(addTable.init);
539tableList.setOnViewList(viewTable.init);
540viewTable.setOnViewRow(viewRow.init);
541viewTable.setOnAddRow(viewRow.init);
542
543Ti.Utils.addEventListener(LEVENTS.TABLE_LISTS_CHANGED, tableList.refreshData);
544Ti.Utils.addEventListener(LEVENTS.TABLE_ENTRIES_CHANGED, viewTable.refreshData);