示例#1
0
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;
}
示例#3
0
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();
    });
  };
示例#5
0
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;
}
示例#8
0
//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;
};
示例#9
0
//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;
}