function LoginView() { var topLevelView = new TopLevelView('Login'); var self = Ti.UI.createView({ layout : 'vertical', top : '120dip' }); topLevelView.add(self); var emailField = Ti.UI.createTextField({ width : '80%', hintText : 'Email', top : 20 }); var passwordField = Ti.UI.createTextField({ width : '80%', hintText : 'Password', passwordMask : true }); var loginButton = new ButtonView('Login', { width : '60%' }); var populateUserName = function() { var oldEmail = Ti.App.Properties.getString('email'); var loggedIn = Ti.App.Properties.getString('loggedIn'); if (oldEmail && loggedIn) emailField.setValue(oldEmail); }(); self.add(emailField); self.add(passwordField); self.add(new SeparatorView(Palette.SECONDARY_COLOR_LIGHT, Measurements.PADDING_SMALL)); self.add(loginButton); loginButton.addEventListener('click', function() { var email = emailField.getValue().trim(); var old_email = Ti.App.Properties.getString('email'); var password = passwordField.getValue(); if (old_email && (email.toLowerCase() !== old_email.toLowerCase())) { var confirmDialog = new ConfirmDialog(L("login_menu"), L("login_confirm_dialog"), onConfirm = function(e) { var DatabaseHelper = require("helpers/DatabaseHelper"); DatabaseHelper.clearDownloadedData(); loginHelper.login(email, password); }); confirmDialog.show(); } else { loginHelper.login(email, password); } }); return topLevelView; }
function SettingsView() { var topLevelView = new TopLevelView(L('settings_menu')); var self = Ti.UI.createView({ layout : 'vertical', top : '120dip' }); topLevelView.add(self); var confirmDialog = new ConfirmDialog(L("change_server"), L("change_server_message"), onConfirm = function(e) { var server_url = textField.getValue(); Ti.App.Properties.setString('server_url', server_url); DatabaseHelper.clearDatabase(); LoginHelper.expireSession(); Ti.App.Properties.setString('email', null); Ti.App.Properties.setString('password', null); topLevelView.fireEvent('settings_saved'); Ti.App.fireEvent('settings.refreshSurveys'); }); var label = Ti.UI.createLabel({ top : '20%', color : Palette.PRIMARY_COLOR, text : L('server_location'), left : 5, font : { fontSize : Measurements.FONT_MEDIUM } }); self.add(label); self.add(new SeparatorView(Palette.SECONDARY_COLOR_LIGHT, Measurements.PADDING_SMALL)); var textField = Ti.UI.createTextField({ borderStyle : Ti.UI.INPUT_BORDERSTYLE_ROUNDED, color : '#336699', right : 5, left : 5, value : Ti.App.Properties.getString('server_url') }); self.add(textField); var saveButton = new ButtonView(L('save'), { width : '80%' }); self.add(new SeparatorView(Palette.SECONDARY_COLOR_LIGHT, Measurements.PADDING_SMALL)); self.add(saveButton); saveButton.addEventListener('click', function(e) { var server_url = textField.getValue(); if (server_url.match(/^https?\:\/\/[\w-.]+(\.\w{2,4}|\:\d{2,5})$/i) == null) { alert(L("invalid_settings")); } else if (Ti.App.Properties.getString('server_url') === server_url) { topLevelView.fireEvent('settings_saved'); } else { confirmDialog.show(); } }); return topLevelView; }
function SettingsView() { var topLevelView = new TopLevelView('Settings'); var self = Ti.UI.createView({ layout : 'vertical', top : '120dip' }); topLevelView.add(self); var confirmDialog = new ConfirmDialog("Change of Server", "This will clear the database,\n Are you sure?", onConfirm = function(e) { var server_url = textField.getValue(); Ti.App.Properties.setString('server_url', server_url); DatabaseHelper.clearDatabase(); topLevelView.fireEvent('settings_saved'); Ti.App.fireEvent('settings.refreshSurveys'); }); //label using localization-ready strings from <app dir>/i18n/en/strings.xml var label = Ti.UI.createLabel({ top : '43dip', color : '#000000', text : 'Server location', height : 'auto', width : 'auto', left : 5 }); self.add(label); var textField = Ti.UI.createTextField({ borderStyle : Ti.UI.INPUT_BORDERSTYLE_ROUNDED, color : '#336699', right : 5, left : 5, value : Ti.App.Properties.getString('server_url') }); self.add(textField); var saveButton = new ButtonView('Save', { width : '80%' }); self.add(new SeparatorView(Palette.SECONDARY_COLOR_LIGHT, '5dip')); self.add(saveButton); saveButton.addEventListener('click', function(e) { var server_url = textField.getValue(); if (server_url.match(/^https?\:\/\/[\w-.]+(\.\w{2,4}|\:\d{2,5})$/i) == null) { alert("Your settings are invalid. Please check them before saving."); } else if (Ti.App.Properties.getString('server_url') === server_url) { topLevelView.fireEvent('settings_saved'); } else { confirmDialog.show(); } }); return topLevelView; }
var addImageView = function(image) { imageView = Ti.UI.createImageView({ width : 100, height : 100, image : image }); self.add(imageView); clearPictureButton = new ButtonView('Clear the Picture', { 'width' : '48%' }); self.add(clearPictureButton); clearPictureButton.addEventListener('click', function() { clearImage(); }); };
function LoginView() { var loginUrl = Ti.App.Properties.getString('server_url') + '/api/login'; var topLevelView = new TopLevelView('Login'); var self = Ti.UI.createView({ layout : 'vertical', top : '120dip' }) topLevelView.add(self); var emailField = Ti.UI.createTextField({ width : '80%', hintText : 'Email', top : 20 }); var passwordField = Ti.UI.createTextField({ width : '80%', hintText : 'Password', passwordMask : true }); var loginButton = new ButtonView('Login', { width : '60%'}); var activityIndicator = Ti.UI.createActivityIndicator({ message : 'Logging in...', height : 'auto', width : 'auto' }); Ti.App.addEventListener('network.server.unreachable', function(){ activityIndicator.hide(); }); Ti.App.addEventListener('network.offline', function(){ activityIndicator.hide(); }); self.add(activityIndicator); self.add(emailField); self.add(passwordField); self.add(new SeparatorView(Palette.SECONDARY_COLOR_LIGHT, '5dip')); self.add(loginButton); loginButton.addEventListener('click', function() { activityIndicator.show(); NetworkHelper.pingSurveyWebWithoutLoggedInCheck( onSuccess = function() { var email = emailField.getValue().trim(); var password = passwordField.getValue(); var client = Ti.Network.createHTTPClient(); client.autoRedirect = false; client.onload = function() { activityIndicator.hide(); var response = JSON.parse(this.responseText); (new Toast('Logged in successfully as '+ response.username)).show(); Ti.App.Properties.setString('access_token', response.access_token); Ti.App.Properties.setString('access_token_created_at', new Date().toString()); Ti.API.info(response.username); Ti.App.Properties.setString('username', response.username); Ti.App.Properties.setString('user_id', response.user_id); Ti.App.Properties.setString('organization_id', response.organization_id); topLevelView.fireEvent('login:completed'); }; client.onerror = function() { activityIndicator.hide(); alert("Login failed, sorry!"); }; client.open('POST', loginUrl); client.send({ username : email, password : password }); }); }); return topLevelView; }
//BasicQuestionView Component Constructor function PhotoQuestionView(question, image) { var self = Ti.UI.createView({ layout : 'vertical', height : Titanium.UI.SIZE }); var pictureButton = new ButtonView('Take a Picture', { 'width' : '48%' }); var path, imageView, clearPictureButton; var deleteImage = function() { if (path) { var imageFile = Ti.Filesystem.getFile(path); imageFile.deleteFile(); path = null; } }; var clearImage = function() { if(imageView) { self.remove(imageView); imageView = null; } deleteImage(); if(clearPictureButton){ self.remove(clearPictureButton); clearPictureButton = null; } }; var addImageView = function(image) { imageView = Ti.UI.createImageView({ width : 100, height : 100, image : image }); self.add(imageView); clearPictureButton = new ButtonView('Clear the Picture', { 'width' : '48%' }); self.add(clearPictureButton); clearPictureButton.addEventListener('click', function() { clearImage(); }); }; self.add(pictureButton); pictureButton.addEventListener('click', function() { Ti.Media.showCamera({ success : function(event) { if (event.mediaType == Ti.Media.MEDIA_TYPE_PHOTO) { _(self.getChildren()).each(function(childView) { if (childView != pictureButton) self.remove(childView); }); addImageView(event.media); var filename = "image_" + (new Date()).valueOf() + ".jpg"; var file = Titanium.Filesystem.getFile(Titanium.Filesystem.applicationDataDirectory, filename); file.write(event.media); event.media = null; path = file.nativePath; resize(file); } else { alert("got the wrong type back :" + event.mediaType); } }, cancel : function(event) { }, error : function(event) { Ti.API.info("camera error"); }, autohide : true, mediaTypes : [Ti.Media.MEDIA_TYPE_PHOTO], allowEditing: true }); }); var resize = function(file) { var ImageFactory = require('ti.imagefactory'); var image = file.read(); var new_width = 1000; if (image.width < new_width) { file = null; image = null; return; } var new_height = (image.height / image.width) * new_width; try { var image_module = require('org.selfkleptomaniac.ti.imageasresized'); image = image_module.cameraImageAsResized(image, new_width, new_height, 0); file.write(ImageFactory.compress(image, 0.6)); } catch(err) { alert(L("out_of_memory")); Ti.API.info("ERROR SAVING IMAGE " + err); clearImage(); } file = null; image = null; image_module = null; }; if (image) { var imageFile = Ti.Filesystem.getFile(image); addImageView(imageFile.read()); path = imageFile.nativePath; } self.getValue = function() { if (path) { Ti.API.info("Photo for photo question is " + path); return path; } return null; }; self.getSubQuestions = function() { return null; } return self; }
//A single survey function SurveyDetailsView(surveyID) { var _ = require('lib/underscore')._; var Survey = require('models/survey'); var TopLevelView = require('ui/common/components/TopLevelView'); var SeparatorView = require('ui/common/components/SeparatorView'); var Palette = require('ui/common/components/Palette'); var ButtonView = require('ui/common/components/ButtonView'); var self = new TopLevelView('Survey Details'); var survey = Survey.findOneById(surveyID); var detailsView = Ti.UI.createView({ top : self.headerHeight, backgroundColor : Palette.SECONDARY_COLOR_LIGHT, layout : 'vertical', }); var surveyNameLabel = Ti.UI.createLabel({ top : '10dip', text : survey.name, color : Palette.PRIMARY_COLOR, left : '5dip', font : { fontSize : '20dip' } }); var surveyDescriptionLabel = Ti.UI.createLabel({ text : survey.description, color : Palette.PRIMARY_COLOR, left : '5dip', font : { fontSize : '15dip' } }); var surveyExpiryLabel = Ti.UI.createLabel({ text : 'Expires on: ' + survey.expiry_date, color : Palette.PRIMARY_COLOR, left : '5dip', font : { fontSize : '15dip' } }); detailsView.add(surveyNameLabel); detailsView.add(surveyDescriptionLabel); detailsView.add(new SeparatorView(Palette.SECONDARY_COLOR_LIGHT, '5dip')); detailsView.add(surveyExpiryLabel); detailsView.add(new SeparatorView(Palette.SECONDARY_COLOR_LIGHT, '20dip')); var createResponseButton = new ButtonView('Add Response'); var responsesIndexButton = new ButtonView('See all Responses'); detailsView.add(new SeparatorView(Palette.SECONDARY_COLOR_LIGHT, '5dip')); detailsView.add(createResponseButton); detailsView.add(new SeparatorView(Palette.SECONDARY_COLOR_LIGHT, '5dip')); detailsView.add(responsesIndexButton); createResponseButton.addEventListener('click', function(e) { self.fireEvent('SurveyDetailsView:createResponse', { surveyID : surveyID }); }); responsesIndexButton.addEventListener('click', function(e) { self.fireEvent('SurveyDetailsView:responsesIndex', { surveyID : surveyID }); }); self.add(detailsView); return self; }
//A single survey function ResponseShowView(responseID) { var _ = require('lib/underscore')._; var Survey = require('models/survey'); var Answer = require('models/answer'); var Question = require('models/question'); var Response = require('models/response'); var TopLevelView = require('ui/common/components/TopLevelView'); var ButtonView = require('ui/common/components/ButtonView'); var SeparatorView = require('ui/common/components/SeparatorView'); var Palette = require('ui/common/components/Palette'); var Toast = require('ui/common/components/Toast'); var convertResponseDataForTable = function() { var response = Response.findOneById(responseID); var answers = response.answers(); var responses = _(answers).map(function(answer) { var row = Ti.UI.createTableViewRow({ layout : 'vertical' }); var questionLabel = Ti.UI.createLabel({ text : Question.findOneById(answer.question_id).content, color : Palette.PRIMARY_COLOR, font : { fontSize : '20dip', fontStyle : 'bold', }, left : '5dip' }); var answerLabel = Ti.UI.createLabel({ text : answer.contentForDisplay() || '', color : Palette.PRIMARY_COLOR, left : '5dip', font : { fontSize : '15dip' } }); row.add(questionLabel); row.add(answerLabel); if (answer.isImage()) { var imageView = Ti.UI.createImageView({ width : 100, height : 100, image : answer.image }); row.add(imageView); } row.add(new SeparatorView(Palette.SECONDARY_COLOR_LIGHT, '5dip')); row.add(new SeparatorView(Palette.WHITE, '5dip')); return (row); }); return responses; } var self = new TopLevelView('Response Details'); // now assign that array to the table's data property to add those objects as rows var table = Titanium.UI.createTableView({ separatorColor : 'transparent', top : self.headerHeight, data : convertResponseDataForTable() }); var responseEditButton = new ButtonView('Edit this Response', { 'width' : '80%' }); responseEditButton.addEventListener('click', function(e) { self.fireEvent('ResponseShowView:responseEdit', { responseID : responseID }); }); var responseDeleteButton = new ButtonView('Delete this Response', { 'width' : '80%' }); responseDeleteButton.addEventListener('click', function(e) { var response = Response.findOneById(responseID); response.destroyAnswers(); response.destroy(); (new Toast('Response deleted')).show(); self.fireEvent('ResponseShowView:responseDeleted', { responseID : responseID }); }); var buttonsView = Ti.UI.createView({ layout : 'vertical' }); buttonsView.add(responseEditButton); buttonsView.add(new SeparatorView(Palette.SECONDARY_COLOR_LIGHT, '5dip')); buttonsView.add(responseDeleteButton); table.setFooterView(buttonsView); var refreshView = function() { table.setData(convertResponseDataForTable()); }; Ti.App.addEventListener('updatedResponse', refreshView); self.add(table); return self; };
//All the questoin in a survey function ResponseEditView(responseID) { var _ = require('lib/underscore')._; var Question = require('models/question'); var Answer = require('models/answer'); var Response = require('models/response'); var Survey = require('models/survey'); var QuestionView = require('ui/common/questions/QuestionView'); var ResponseViewHelper = require('ui/common/responses/ResponseViewHelper'); var TopLevelView = require('ui/common/components/TopLevelView'); var responseViewHelper = new ResponseViewHelper; var ButtonView = require('ui/common/components/ButtonView'); var Toast = require('ui/common/components/Toast'); var self = new TopLevelView('Edit Response'); var scrollableView = Ti.UI.createScrollableView({ top : self.headerHeight, showPagingControl : true }); self.add(scrollableView); var saveButton = new ButtonView('Save', { 'width' : '48%' }); var completeButton = new ButtonView('Complete', { 'width' : '48%' }); var response = Response.findOneById(responseID); var survey = Survey.findOneById(response.survey_id); var questions = survey.firstLevelQuestions(); responseViewHelper.paginate(questions, scrollableView, [saveButton, completeButton], response); var activityIndicator = Ti.UI.createActivityIndicator({ message : 'Saving...', height : 'auto', width : 'auto' }); self.add(activityIndicator); var validateAndUpdateAnswers = function(e, status) { activityIndicator.show(); var questionViews = responseViewHelper.getQuestionViews(scrollableView.getViews()); var answersData = _(questionViews).map(function(questionView, questionID) { Ti.API.info("questionid:" + questionID); Ti.API.info("content:" + questionView.getValueField().getValue()); return { 'id' : questionView.answerID, 'question_id' : questionID, 'content' : questionView.getValueField().getValue() }; }); responseErrors = Response.validate(answersData, status); if (!_.isEmpty(responseErrors)) { responseViewHelper.displayErrors(responseErrors, questionViews); responseViewHelper.scrollToFirstErrorPage(scrollableView, responseErrors); (new Toast('There were some errors in the response.')).show(); } else { var response = Response.findOneById(responseID); response.update(status, answersData); (new Toast('Response saved')).show(); self.fireEvent('ResponsesEditView:savedResponse'); } activityIndicator.hide(); }; completeButton.addEventListener('click', function(event) { validateAndUpdateAnswers(event, "complete"); }); saveButton.addEventListener('click', function(event) { validateAndUpdateAnswers(event, "incomplete"); }); return self; }