Esempio n. 1
0
import Marionette from 'backbone.marionette';
import Radio from 'backbone.radio';
import Header from 'common/layout/views/header';
import template from 'common/layout/templates/default.hbs';

let contentChannel = Radio.channel('appContent');

export default Marionette.LayoutView.extend({
	template: template,
	regions: {
		header: '.header-wrapper',
  		content: '.content'
	},

	initialize() {
		Marionette.LayoutView.prototype.initialize.apply(this, arguments);
		contentChannel.on('updateContent', (content) => {
			this.showHeader();
			this.showChildView('content', content);
		});
	},

	showHeader() {
		if (! this.headerView) {
			this.headerView = new Header();
			this.showChildView('header', this.headerView);
		}
	}
});
Esempio n. 2
0
export default Marionette.LayoutView.extend({
    template: template,

    behaviors: {
        'l20n': {},
        'column': {},
    },

    regions: {
        'presetsNav': '.rg_presets_nav',
        'freeAdditionNav': '.rg_free_addition_nav',
    },

    ui: {
        'column': '#contrib_column',
    },

    initialize: function () {
        this._radio = Wreqr.radio.channel('global');
    },

    setModel: function (model) {
        this.model = model;

        this.render();
    },

    onBeforeOpen: function () {
        this._radio.vent.trigger('column:closeAll');
        this._radio.vent.trigger('widget:closeAll');
    },

    open: function () {
        this.triggerMethod('open');
    },

    close: function () {
        this.triggerMethod('close');
    },

    onRender: function () {
        var presetNavItems = [],
        presetsNav = new NavPillsStackedListView(),
        freeAdditionNav = new NavPillsStackedListView(),
        presetModels = this.options.theme.get('presets').models;

        for (var key in presetModels) {
            if (presetModels.hasOwnProperty(key)) {
                presetNavItems.push({
                    'label': presetModels[key].get('name'),
                    'description': presetModels[key].get('description'),
                    'callback': this._radio.commands.execute.bind(
                        this._radio.commands,
                        'column:showContribForm',
                        {
                            'model': this.model,
                            'presetModel': presetModels[key]
                        }
                    )
                });
            }
        }

        presetsNav.setItems(presetNavItems);

        freeAdditionNav.setItems([{
            'label': document.l10n.getSync('contribColumn_freeAddition'),
            'callback': this._radio.commands.execute.bind(
                this._radio.commands,
                'column:showContribForm',
                {
                    'model': this.model
                }
            )
        }]);

        this.getRegion('presetsNav').show( presetsNav );
        this.getRegion('freeAdditionNav').show( freeAdditionNav );
    },
});
Esempio n. 3
0
module.exports = Marionette.LayoutView.extend({
  template: template,

  regions: {
    modulesFilterMetaRegion: '.nm-module-filter-meta',
    modulesRegion: '#content',
    sidebarRegion: '#sidebar'
  },

  ui: {
    content: '#content',
    sidebar: '#sidebar',
    backToTopButton: '#back-to-top'
  },

  behaviors: {
    GoToTopBehavior: {
      behaviorClass: GoToTopBehavior
    }
  },

  initialize: function (options) {
    this.mods = options.mods;
  },

  events: {
    'click .js-nm-clear-filters': function () {
      this.facetsView.clearFilters();
    }
  },

  onShow: function () {
    $('.arrow-down, .arrow-right').click(function () {
      $(this)
          .toggleClass('arrow-down arrow-right')
          .siblings('ul').toggle();
    });

    function updateAncestors (el, checked) {
      var all = true;
      el.siblings().each(function() {
        all = $(this).children('input[type="checkbox"]')
            .prop('checked') === checked;
        return all;
      });
      if (all) {
        var grandparent = el.parent('ul').parent('li');
        if (grandparent.length) {
          grandparent.children('input[type="checkbox"]').prop({
            checked: checked,
            indeterminate: false
          });
          updateAncestors(grandparent, checked);
        }
      } else {
        el.parents('li').children('input[type="checkbox"]').prop({
          checked: false,
          indeterminate: true
        });
      }
    }

    $('#sidebar input[type="checkbox"]').click(function() {
      var $this = $(this);
      var checked = $this.prop('checked'),
          parent = $this.parent();
      parent.find('input[type="checkbox"]').prop({
        checked: checked,
        indeterminate: false
      });
      updateAncestors(parent, checked);
    });

    var typeFriendlyName = {
      CFM: 'Cross-Faculty',
      GEM: 'GEM',
      Module: 'Faculty',
      SSM: 'Singapore Studies',
      UEM: 'Breadth / UE'
    };

    var semesterNames = config.semesterNames;
    var mods = this.mods;
    _.each(mods, function (mod) {
      mod.level = mod.ModuleCode[mod.ModuleCode.search(/\d/)] * 1000;
      if (mod.Types) {
        mod.Types = _.map(mod.Types, function (type) {
          return typeFriendlyName[type] || type;
        });
      } else {
        mod.Types = ['Not in CORS'];
      }
      mod.semesterNames = [];
      for (var i = 0; i < mod.History.length; i++) {
        var history = mod.History[i];
        var sem = history.Semester;
        mod.semesterNames.push(semesterNames[sem - 1]);
        mod['LecturePeriods' + sem] = history.LecturePeriods || ['No Lectures'];
        mod['TutorialPeriods' + sem] = history.TutorialPeriods || ['No Tutorials'];
      }
    });

    var filteredModules = new ModuleCollection();

    var facets = new FacetCollection([], {
      filteredCollection: filteredModules,
      pageSize: 25,
      rawCollection: mods
    });
    facets.add(new ArrayFacetModel({
      filteredCollection: mods,
      key: 'semesterNames',
      label: 'Semesters',
      slug: 'semesters'
    }));
    facets.add(new ArrayFacetModel({
      filteredCollection: mods,
      key: 'Types',
      label: 'Types',
      slug: 'types'
    }));
    facets.add(_.map({
      Department: 'Faculty / Department',
      level: 'Level'
    }, function(label, key) {
      return {
        filteredCollection: mods,
        key: key,
        label: label,
        slug: slugify(label)
      };
    }));
    facets.add({
      filteredCollection: mods,
      key: 'ModuleCredit',
      label: 'Modular Credits (MCs)',
      slug: 'mcs',
      sortBy: function (filter) {
        return +filter.label;
      }
    });
    _.each([1, 2], function (semester) {
      facets.add(_.map(['Lecture Periods', 'Tutorial Periods'], function(label) {
        var currentLabel = 'Sem ' + semester + ' ' + label;
        return new ArrayFacetModel({
          filteredCollection: mods,
          key: label.replace(' ', '') + semester,
          label: currentLabel,
          slug: slugify(currentLabel)
        });
      }));
    });

    this.modulesRegion.show(new LoadingView());

    var that = this;

    var moduleFinderNamespace = config.namespaces.moduleFinder + ':';
    localforage.getItem(moduleFinderNamespace + 'filters', function (selectedFilters) {
      if (selectedFilters) {
        _.each(facets.models, function (facet) {
          var filters = selectedFilters[facet.get('label')];
          if (filters && filters.length) {
            _.each(facet.get('filters').models, function (filter) {
              if (filters.indexOf(filter.get('label')) > -1) {
                filter.select();
              }
            });
          }
        });
      }

      that.facetsView = new FacetsView({
        collection: facets,
        threshold: 600
      });
      that.sidebarRegion.show(that.facetsView);

      that.modulesFilterMetaView = new ModulesFilterMetaView({
        model: new Backbone.Model({
          selectedFilters: selectedFilters,
          resultsLength: that.facetsView.collection.rawFilteredCollection.length
        })
      });

      that.listenTo(that.facetsView, 'selectedFiltersChanged', function (selectedFilters) {
        that.modulesFilterMetaView.updateView(selectedFilters, that.facetsView.collection.rawFilteredCollection.length);
      });

      that.modulesFilterMetaRegion.show(that.modulesFilterMetaView);
      that.modulesRegion.show(new ModulesListingView({collection: filteredModules}));
    });
  }
});
Esempio n. 4
0
import application from '../application';


const Content = Mn.LayoutView.extend({

    template: require('./templates/content'),

    regions: {
        header: '[role="complementary"]',
        tracks: '.tracks',
    },

    modelEvents: {
        'change:currentPlaylist': 'switchPlaylist'
    },

    onBeforeShow () {
        this.showChildView('header', new HeaderView({ model: this.model }));
        this.switchPlaylist(null, this.model.get('currentPlaylist'));
    },

    // only the router change the current playlist
    switchPlaylist (appState, currentPlaylist) {
        this.showChildView('tracks', new TracksView({
            collection: currentPlaylist.get('tracks')
        }));
    }
});

export default Content;
Esempio n. 5
0
var View = Marionette.LayoutView.extend({
  template: _.template(''),
  className: 'updatepassword view',
  events: {
    'submit form': 'updatePassword',
  },

  initialize: function() {
    this.session = Session.model.getInstance();
    this.dfd = $.Deferred();
  },

  onRender: function() {
    this.form = new Backbone.Form({
      template: require('./update_password.tpl.html'),
      schema: {
        cur_password: {
          type: 'Password',
          editorAttrs: {
            placeholder: 'Votre mot de passe actuel'
          },
          validators: ['required']
        },
        password: {
          type: 'Password',
          editorAttrs: {
            placeholder: 'Votre nouveau mot de passe'
          },
          validators: ['required', {
            type: 'regexp',
            regexp: /.{6,}/,
            message: 'Passwords to short'
          }]
        },
        password2: {
          type: 'Password',
          editorAttrs: {
            placeholder: 'Confirmer le nouveau mot de passe'
          },
          validators: ['required', {
            type: 'match',
            field: 'password',
            message: 'Passwords must match!'
          },]
        },
      }
    }).render();

    this.$el.append(this.form.$el);
  },

  updatePassword: function(e) {
    e.preventDefault();

    var self = this;
    var $form = this.$el.find('form');

    if ($form.hasClass('loading'))
        return false;

    var errors = this.form.validate();
    console.log(errors);
    if (errors)
        return false;

    var formValues = this.form.getValue();
    var curPassword = formValues.cur_password;
    var password = formValues.password;

    console.log(formValues);

    var user = User.getCurrent();

    var data = {
      uid: user.get('externId'),
      mail: user.get('email'),
      current_pass: curPassword,
      pass: password,
    };

    if (user.get('externId')) {
      //update serveur
      this.$el.addClass('block-ui');
      $form.addClass('loading');
      var query = {
        url: config.apiUrl + '/user/' + user.get('externId') + '.json',
        type: 'put',
        contentType: 'application/json',
        data: JSON.stringify(data),
        error: function(jqXHR, textStatus, errorThrown) {
          self.$el.removeClass('block-ui');
          $form.removeClass('loading');
          //TODO: Manage error type
          console.log(errorThrown);
          $form.find('input[name="cur_password"]').val('');
          Dialog.alert({
            closable: true,
            message: i18n.t('dialogs.passwdError')
          });
        },
        success: function(response) {
          self.$el.removeClass('block-ui');
          $form.removeClass('loading');
          self.dfd.resolve();
          self.dialogRequestNewpassword();
        }
      };
      this.session.getCredentials(query).done(function() {
        $.ajax(query);
      });
    }
  },

  dialogRequestNewpassword: function() {
    Dialog.show({
      title: 'Modification de votre mot de passe',
      message: 'Votre mot de passe a été modifié !',
      type: 'type-success',
      buttons: [{
        label: 'Fermer',
        action: function(dialogItself) {
          dialogItself.close();
        }
      }]
    });
  }
});
Esempio n. 6
0
var Layout = Marionette.LayoutView.extend({

  template: `<div><div id="toggles"></div><div id="data"></div></div>`,

  regions: {
    'toggles': '#toggles',
    'data': '#data'
  },
  handleTogglesChanged: function(toggleState) {
    this.state.toggles = Object.assign({}, this.state.toggles, toggleState);

    //in real app you would then update the collection
    //call fetch on that collection, which when updated will update other collections

    //this is maybe a little wierd, COULD use a Redux store and and subscribe to it?
    this.renderReact();
  },

  initialize: function initialize(options) {
    this.state = {
      toggles: {
        'mobile_market_type': '2G',
        'bandwidth_metric_type': 'Mean'
      }
    };
    this.render();
  },
  // thoughts on where to call this?
  // layout views pretty much only render once, so I suppose this is OK?
  onRender: function onRender() {
    this.renderReact();
  },

  renderReact: function renderReact() {
     ReactDOM.render(<Toggles
       togglesChanged={this.handleTogglesChanged.bind(this)}
       toggleState={this.state.toggles}
      />, document.getElementById('toggles'));
  }

});
module.exports = Marionette.LayoutView.extend({

  // Layouts have no immediate template
  template: false,

  /**
   * Add regions to the view by templating and attaching
   * a new region holder to the DOM.
   *
   * @example
   * view.addRegion('r1', { prefix: 'r1' });
   *
   * @public
   *
   * @param {string} name - Name of the region to add.
   * @param {object} definition - Region definition.
   */
  addRegion: function(name, definition) {
    // Append regions prior to assigning them
    var formatted = {
      el: this.appendRegion(name, definition)
    };

    Marionette.LayoutView.prototype.addRegion.call(this, name, formatted);
  },


  /**
   * Add multiple regions at one.
   *
   * @example
   * view.addRegions({
   *   'r1': { prefix: 'r1' },
   *   'r2': { prefix: 'r2' }
   * });
   *
   * @public
   *
   * @param {regions} name - Regions object where the key represents
   *   the region name and the value is the region definition.
   */
  addRegions: function(regions) {
    var formatted = {};

    // Append Regions prior to assigning them
    _.each(regions, function (val, key) {
      formatted[key] = {
        el: this.appendRegion(key, val)
      };
    }, this);

    Marionette.LayoutView.prototype.addRegions.call(this, formatted);
  },


  /**
   * Remove both region and holder el.
   *
   * @example
   * view.removeRegion('r1');
   *
   * @public
   *
   * @param {string} name - Name of the region to remove.
   */
  removeRegion: function(name) {
    // Remove $region element
    this.$regions[name].remove();

    Marionette.LayoutView.prototype.removeRegion.apply(this, arguments);
  },


  /**
   * Append app region template to DOM.
   *
   * @private
   *
   * @param {string} name - Name of the region to add.
   * @param {object} definition - Region definition.
   */
  appendRegion: function (name, definition) {
    var tmpl  = definition.tmpl,
        props = _.extend({ name: name }, definition);

    // Can template a javascript function
    delete props.tmpl;

    // Template will fail if props are missing
    _.defaults(props, {
      prefix: '',
      name: '',
      cls: ''
    });

    var $region = $(_.template(tmpl, props));

    // Append templateted html
    this.$regions = this.$regions || {};
    this.$regions[name] = $region;
    this.$el.append($region);

    return $region;
  }

});
Esempio n. 8
0
var Marionette = require('backbone.marionette');
var template = require('../templates/layout.hbs');
var App = require('../../../../app');

var Layout = Marionette.LayoutView.extend({

    template: template,

    regions: {
        subjectPointers: '[data-region="subject-pointers"]',
        jumbotron: '[data-region="jumbotron"]',
        featurette : '[data-region="featurette"]'
    }

});

App.reqres.setHandler('new:establishingBotnets:layout', function () {
   return new Layout();
});

module.exports = Layout;
Esempio n. 9
0
var Marionette = require('backbone.marionette');

module.exports = Marionette.LayoutView.extend({
    template: require('../../tmpl/row.hbs'),

    childViews: [],

    initialize: function() {
        this.childViews.forEach(function(View, index) {
            this.addRegion('row' + index, '.row:nth-of-type(' + (index + 1) + ')');
        }.bind(this));
    },

    templateHelpers: function() {
        return {
            childViews: this.childViews
        };
    },

    onShow: function() {
        this.childViews.forEach(function(View, index) {
            this.getRegion('row' + index).show(new View(this.options));
        }.bind(this));
    }
});
Esempio n. 10
0
module.exports = Marionette.LayoutView.extend({
  template: require('./city_autocomplete.tpl.html'),
  className: '',
  events: {
    'submit form': 'onFormSubmit',
  },

  initialize: function(options) {
    this.options = options;
  },

  onRender: function() {
    var self = this;
    var city = City.model.getInstance();
    this.$el.find('input.js-autocomplete').autocomplete({
      select: function(event, ui) {
        self.selectedItem = ui.item;
      },
      source: function(request, response) {
        response(city.search(request.term));
      },
      appendTo: self.$el.find('.js-autocomplete-results'),
      minLength: 2
    });
  },

  onFormSubmit: function(e) {
    var self = this;
    e.preventDefault();

    if ( !this.selectedItem )
      return false;

    if ( window.cordova && window.cordova.plugins.Keyboard.isVisible ) {
      console.log('wait onKeyboardhide');
      self.onKeyboardhide = function() {
        console.log('onKeyboardhide');
        window.removeEventListener('native.keyboardhide', self.onKeyboardhide);
        self.saveUser();
      };
      window.addEventListener('native.keyboardhide', self.onKeyboardhide);
    } else
      self.saveUser();
  },

  saveUser: function() {
    console.log('saveUser');
    var user = User.getCurrent();
    user.set('city', this.selectedItem);
    user.save();
  },

  onDestroy: function() {
    var self = this;
  }
});
var ClassDef = Marionette.LayoutView.extend({
  template: require('./dashboard_logs.tpl.html'),
  className: 'inner logs',
  events: {
    'click .log-item': 'onLogClick'
  },

  initialize: function() {
    this.logs = User.getCurrent().get('logs');
    this.someHelp();
  },

  serializeData: function() {
    var logs = this.logs.toJSON();
    _.forEach(logs, function(log) {
      log.createdAt = moment(log.createdAt).calendar();
    });
    return {
      logs: logs
    };
  },

  someHelp: function(){
    var queryHash = window.location.hash;
    var params = _.parseQueryHash(queryHash);
    var currentUser = User.getCurrent();
    var helps = Help.collection.getInstance();
    helps.someHelp(params);
  },

  onLogClick: function(e) {
    var id = $(e.currentTarget).data('id');
    var log = this.logs.get(id);
    var category = log.get('category');
    if (category == 'mission')
    Router.getInstance().navigate('/mission/' + log.get('data').mission.id, {trigger: true});
  }
});
Esempio n. 12
0
var LoginLayout = Mn.LayoutView.extend({
	initialize: function () {
		this.model = new User({
			email: '',
			password: '', 
			message: ''
		});
		var thisView = this;

		// bind model change to validation function
	},
	// el: '#app-container',
	template: require('./login.layout.html'),
	bindings: {
		'#InputEmail': 'email',
		'#InputPassword1': 'password', 
		'#login-msg': 'message'
	},
	returnMsgBindings: {
		'#login-msg': 'message'
	},
	onRender: function() {
		if(this.model) {
			this.stickit();

		}
		this.model.set({email:'', password:'', message:''});
		$('#login-msg', this.$el).hide();
	},
	events: {
		'click #login-submit': function (e) {
			e.preventDefault();
			var thisView = this;
			this.model.login()
				.then(function(result) {
					if(result.code === 2000) {
						appData.user = result.user;
						appData.company = result.company;
						// clear value
						appData.isLogin = true;

						Backbone.history.navigate('/dashboard', true);

						// naviaget to dash board
					} else {
						// update result to dom
						$('#login-msg', thisView.$el).show();
						thisView.model.set('message', result.message);
					}
				});
		}
	}
});
Esempio n. 13
0
/**
 * A view to render the base structure for an element
 * of content with an associated header.
 *
 * Copyright 2015 Ethan Smith
 */

var Marionette = require('backbone.marionette');

var SummaryBlock = Marionette.LayoutView.extend({
   tagName: 'div',
   template: '#template-summaryblock',
   regions: {
      "content": ".content",
      "toolbar": ".toolbar",
   },
   className: function() {
      return ('summaryBlock ' + this.model.get('nestDepth') + ' ' + this.model.get('classes')).trim();
   }
});

module.exports = SummaryBlock;
'use strict';

var Backbone = require('backbone'),
    $ = require('jquery'),
    _ = require('lodash'),
    i18n = require('i18next'),
    Marionette = require('backbone.marionette');

var Layout = Marionette.LayoutView.extend({
  header: {
    titleKey: 'settings',
    buttons: {
      left: ['back']
    }
  },
  template: require('./settings.tpl.html'),
  className: 'page settings ns-full-height',
  events: {},

  initialize: function() {},
  serializeData: function() {},

  onRender: function(options) {},

  onShow: function() {},

});

module.exports = Layout;
Esempio n. 15
0
var View = Marionette.LayoutView.extend({
  header: 'none',
  template: require('./footer.tpl.html'),
  className: '',
  events: {
    'click .capture-photo-js': 'capturePhoto',
    'submit form': 'uploadPhoto',
    'click .forest-time-js': 'forestTime',
    'click .btn-clue': 'onBtnClueClick'
  },
  /*triggers: {
    'click .btn-clue': 'btn:clue:click'
  },*/

  initialize: function() {
    this.moment = require('moment');
    this.Main = require('../main/main.view.js');

    this.listenTo(User.collection.getInstance(), 'change:current', this.onCurrentUserChange);
    this.listenTo(User.getCurrent().getTimeForest(), 'change:total', this.displayTimeForest);

    /*this.on('btn:clue:click', function(e) {
      //Hack: enable to 
      setTimeout(function() {
        console.log('default btn:clue:click', e);
      });
    });*/
  },

  onCurrentUserChange: function(newUser, prevUser) {
    this.stopListening(prevUser.getTimeForest());
    this.listenTo(newUser.getTimeForest(), 'change:total', this.displayTimeForest);
    this.render();
  },

  serializeData: function() {},

  onRender: function(options) {
    var self = this;
    this.$fabDial = this.$el.find('.fab-dial');
    this.$fabDial.nsFabDial();

   this.onBackBtnClick = this.onBackBtnClick || function(e) {
     self.$fabDial.trigger('click');
     e.isDefaultPrevented = true;
   };

    this.$fabDial.on('show.bs.dropdown', function(e) {
      $('body').addClass('show-footer-overlay');
     document.addEventListener('backbutton', self.onBackBtnClick, false);
    });
    this.$fabDial.on('hide.bs.dropdown', function(e) {
      $('body').removeClass('show-footer-overlay');
     document.removeEventListener('backbutton', self.onBackBtnClick, false);
    });

    this.displayTimeForest();
  },

  onBtnClueClick: function(e) {
    this.trigger('btn:clue:click', e);
    if ( !e.isDefaultPrevented() )
      Router.getInstance().navigate('clue', {trigger:true});
  },

  displayTimeForest: function() {
    var duration = User.getCurrent().getTimeForest().get('total');
    var display = this.moment.duration(duration, 'seconds').format('h[h] mm[min] ss[s]');
    this.$el.find('.time-forest-display-js').text(display);
  },

  capturePhoto: function() {
    var self = this;

    this.Main.getInstance().showLoader();
    if (!window.cordova)
      self.createObservation();
    else {
      // Take picture using device camera and retrieve image as a local path
      navigator.camera.getPicture(
        _.bind(self.onSuccess, self),
        _.bind(self.onFail, self), {
          /* jshint ignore:start */
          quality: 75,
          targetWidth: 1000,
          targetHeight: 1000,
          destinationType: Camera.DestinationType.FILE_URI,
          correctOrientation: true,
          sourceType: Camera.PictureSourceType.CAMERA,
          /* jshint ignore:end */
        }
      );
    }
  },

  onSuccess: function(imageURI) {
    var self = this;

    if (window.cordova) {
      //TODO put tag projet in config
      var tagprojet = 'noe-obf';
      var fsFail = function(error) {
        console.log('failed with error code: ' + error.code);
      };
      var copiedFile = function(fileEntry) {
        // save observation and navigate to obsvertion
        // self.uploadPhotoMob(fileEntry.nativeURL);
        self.createObservation(fileEntry.nativeURL);

      };
      var gotFileEntry = function(fileEntry) {
        console.log('got image file entry: ' + fileEntry.nativeURL);
        var gotFileSystem = function(fileSystem) {
          fileSystem.root.getDirectory(tagprojet, {
            create: true,
            exclusive: false
          }, function(dossier) {
            fileEntry.moveTo(dossier, (new Date()).getTime() + '_' + tagprojet + '.jpg', copiedFile, fsFail);
          }, fsFail);
        };
        /* jshint ignore:start */
        window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFileSystem, fsFail);
        /* jshint ignore:end */
      };
      window.resolveLocalFileSystemURI(imageURI, gotFileEntry, fsFail);
    }
  },

  onFail: function(message) {
    console.log(message);
    this.Main.getInstance().hideLoader();
  },

  createObservation: function(fe, id) {
    var self = this;

    var router = require('../routing/router');
    var observationModel = new(Observation.model.getClass())();
    var currentPos = CurrentPos.model.getInstance();

    currentPos.watch().always(function(){
      //set observation model
      observationModel.set({
        'userId': User.getCurrent().get('id'),
        'date': self.moment().format('X'),
        'photos': [{
          'url': fe ? fe : '',
          'externId': id ? id : ''
        }],
        'coords': {
          latitude: _.get(currentPos.get('coords'), 'latitude', 0),
          longitude: _.get(currentPos.get('coords'), 'longitude', 0)
        }
      });

      //Save observation in localstorage
      Observation.collection.getInstance().add(observationModel)
        .save()
        .done(function(data) {
          //navigate
          router.getInstance().navigate('observation/' + data.id, {
            trigger: true
          });
          self.Main.getInstance().hideLoader();
        })
        .fail(function(e) {
          console.log(e);
        });
    });
  },

  forestTime: function(e) {
    e.preventDefault();
    e.stopPropagation();

    User.getCurrent().getTimeForest().toggleStart();

  }

});
Esempio n. 16
0
import Marionette from 'backbone.marionette';
import $ from 'jquery';

import templateNotFound from '../templates/not-found.html';
let NotFoundLayoutView = Marionette.LayoutView.extend({
	//Can't use arrow function in initialize method, because template isn't recognized
	initialize: function() {
		var html = templateNotFound({message: 'Page Not Found'});
		this.template = html;
	},
	onShow: () => {
		$('.loading').hide();
	},
	onDestroy: () => {
	}
});

export default NotFoundLayoutView;
module.exports = Marionette.LayoutView.extend({
  template: require('./mission_sheet.tpl.html'),
  events: {
    'click .btn-accept': 'onAcceptClick',
    'click .btn-sheet': 'openWindow',
    'click .btn-back': 'onBackClick'
  },
  attributes: function () {
    var user = User.getCurrent();
    var classNames = 'page page-mission_sheet';
    if (user.hasCompletedMission(this.model))
      classNames += ' is-complete';
    else if (user.hasAcceptedMission(this.model))
      classNames += ' is-accept';
    return {
      'class': classNames
    };
  },

  regions: {
    observations: '.observations'
  },

  initialize: function () {
    var self = this;
    var user = User.getCurrent();

    this.header = {
      title: this.model.get('title'),
      buttons: {
        left: ['back']
      }
    };

    this.listenTo(user, 'change:acceptedMissions', this.onAcceptChange);
    this.listenTo(Observation.collection.getInstance(), 'add', function (observation) {
      observation.set({
        'missionId': self.model.get('id'),
        'cd_nom': self.model.get('cd_nom'),
        'comment': self.model.get('comment')
      });
      observation.save();
    });

    this.listenTo(Footer.getInstance(), 'btn:clue:click', function (e) {
      e.preventDefault();
      Router.getInstance().navigate('clue?missionId=' + self.model.get('id'), {
        trigger: true
      });
    });
/*
    var queryHash = "missionsheet";
    var params = _.parseQueryHash(queryHash);

    var currentUser = User.getCurrent();
    var helps = Help.collection.getInstance();

    helps.someHelp(params);
*/
  },

  openWindow: function (ev) {
    var toOpen;
    if (ev.currentTarget.id === "url")
      toOpen = this.model.get('url');
    else
      toOpen = ev.currentTarget.innerHTML;
    window.open(toOpen, '_blank');
  },

  onRender: function () {
    var user = User.getCurrent();
    var observations = Observation.collection.getInstance();
    observations = observations.where({
      userId: user.get('id'),
      missionId: this.model.get('id')
    });
    var ObservationsView = require('../../observation/observation_list.view');
    this.showChildView('observations', new ObservationsView({
      collection: new Backbone.Collection(observations)
    }));

    switch (this.model.get('environment')) {
      case "affleurements rocheux":
        this.$el.find('.badge').addClass("grey");
        break;
      case 'forêts de conifères':
        this.$el.find('.badge').addClass("green");
        break;
      case "forêts de feuillus":
        this.$el.find('.badge').addClass("green-light");
        break;
      case "fourrés et boisements":
        this.$el.find('.badge').addClass("yellow");
        break;
      case "jardins et parcs":
        this.$el.find('.badge').addClass("pink");
        break;
      case "landes sèches":
        this.$el.find('.badge').addClass("orange");
        break;
      case "prairies":
        this.$el.find('.badge').addClass("grey-light");
        break;
      case "rivières, mares et étangs":
        this.$el.find('.badge').addClass("blue");
        break;
      case "vergers":
        this.$el.find('.badge').addClass("yellow-light");
        break;
      case "villages et zones urbaines":
        this.$el.find('.badge').addClass("orange-light");
        break;
      case "zones humides":
        this.$el.find('.badge').addClass("blue-light");
        break;
      default:
        console.log("wrong environment");
        break;
    }
  },

  serializeData: function () {
    return {
      taxon: this.model.toJSON()
    };
  },

  onAcceptClick: function (e) {
    var user = User.getCurrent();
    user.toggleAcceptedMission(this.model);
    user.save();
  },

  onAcceptChange: function () {
    var user = User.getCurrent();
    if (user.hasAcceptedMission(this.model))
      this.$el.addClass('is-accept');
    else
      this.$el.removeClass('is-accept');
  },

  onBackClick: function () {
    Router.getInstance().back();
  },

  onDestroy: function () {
    var self = this;
  }
});
Esempio n. 18
0
module.exports = Marionette.LayoutView.extend({
  initialize: function () {
  },
  template: template,
  regions: {
    friendsListRegion: '.nm-friends-list',
    friendsSelectedListRegion: '.nm-friends-selected-list',
    timetableRegion: '.nm-friends-timetable'
  },
  ui: {
    'addButton': '.js-nm-friends-add-button'
  },
  onShow: function () {
    var that = this;
    localforage.getItem('timetable:friends', function (data) {
      var friendsList = _.map(data, function (friend) {
        return new FriendModel(friend);
      });
      that.friendsListCollection = new Backbone.Collection(friendsList);
      that.friendsListView = new FriendsListView({collection: that.friendsListCollection});
      that.friendsListRegion.show(that.friendsListView);

      var friendsSelectedList = that.friendsListCollection.where({selected: true});
      that.friendsSelectedListView = new FriendsSelectedListView();
      that.friendsSelectedListView.collection = new Backbone.Collection(friendsSelectedList);
      that.friendsSelectedListRegion.show(that.friendsSelectedListView);
      that.showSelectedFriendsList();
      that.updateDisplayedTimetable();

      that.friendsListCollection.on('change', function () {
        var friendsSelectedList = that.friendsListCollection.where({selected: true});
        that.friendsSelectedListView.collection = new Backbone.Collection(friendsSelectedList);
        that.updateDisplayedTimetable();
        that.showSelectedFriendsList();
        that.friendsListView.render();
      });

    });
    this.ui.addButton.popover({
      html: true,
      placement: 'bottom',
      content: addFriendTimetableModalTemplate()
    });
  },
  events: {
    'click .js-nm-friends-add': 'addFriendTimetable'
  },
  showSelectedFriendsList: function () {
    this.friendsSelectedListView.render();
  },
  addFriendTimetable: function () {
    var that = this;
    var timetableUrl = $('#url').val();
    var friendName = $('#name').val();
    this.getFinalTimetableUrl(timetableUrl, function (data) {
      that.ui.addButton.popover('hide');
      that.insertFriendTimetableFromUrl(friendName, data.redirectedUrl);
    });
  },
  getFinalTimetableUrl: function (timetableUrl, callback) {
    $.ajax({
      url: 'http://nusmods.com/redirect.php',
      type: 'GET',
      crossDomain: true,
      dataType: 'json',
      data: {
        timetable: timetableUrl
      },
      success: function (result) {
        if (callback) {
          callback(result);
        }
      },
      error: function (xhr, status, error) {
        alert(status);
      }
    });
  },
  insertFriendTimetableFromUrl: function (name, timetableUrl) {
    var urlFragments = timetableUrl.split('/');
    var queryFragments = urlFragments.slice(-1)[0].split('?');
    var semester = parseInt(queryFragments[0].slice(3));
    var timetableQueryString = queryFragments[1];
    this.friendsListCollection.add(new FriendModel({
      name: name,
      semester: semester,
      queryString: timetableQueryString,
      selected: false
    }));
    var friendsData = _.pluck(this.friendsListCollection.models, 'attributes');
    friendsData = _.map(friendsData, function (person) {
      return _.omit(person, 'moduleInformation');
    });
    queryDB.setItemToDB('timetable:friends', friendsData);
  },
  updateDisplayedTimetable: function () {

    var combinedLessons = _.map(this.friendsSelectedListView.collection.models, function (person) {
      return _.map(person.get('moduleInformation').timetable.models, function (lesson) {
        return lesson.attributes;
      });
    });

    combinedLessons = _.reduce(combinedLessons, function (a, b) {
      return a.concat(b);
    }, []);

    var TimetableFlexModel = new Backbone.Model({
      lessonsList: combinedLessons,
      mergeMode: true
    });

    this.timetableRegion.show(new TimetableFlexView({
      model: TimetableFlexModel
    }));
  }
});
Esempio n. 19
0
var Marionette = require("backbone.marionette");

module.exports = Marionette.LayoutView.extend({
    regions: {
        "pluginsContainer": ".plugins-loader-container",
        "configurationsContainer": ".configurations-manager-container"
    },

    getPluginsContainerRegion: function () {
        return this.getRegion("pluginsContainer");
    },

    getConfigurationsContainerRegion: function () {
        return this.getRegion("configurationsContainer");
    }
});
    tagName: "ul",
    className: "material-list",
    childView: CheapestSubstitutesItem,
    onChildviewLinkClicked: function (childView) {
        this.triggerMethod("brand:clicked", childView.model.get('brand'));
    }
});

var ChartLayout = Marionette.LayoutView.extend({
    template: require('./chart_template.tpl'),
    regions: {
        "chartRegion": "#chart-region"
    },
    initialize: function (options) {
        this.model = options.model;
    },
    onShow: function () {
        var chartView = new Views.Chart({
            set: this.model.get('medicine').unit_price,
            subset: this.model.get('medicine').unit_price - this.model.get('cheapestAlternatives')[0].medicine.unit_price
        });
        this.chartRegion.show(chartView);
    }
});

module.exports = Marionette.LayoutView.extend({
    template: require('./layout_template.tpl'),
    tagName: "div",
    id: "cheapest_substitute",
    regions: {
        "chartRegion": "#chart-region",
        "listRegion": "#substitutes-list-region"
Esempio n. 21
0
module.exports = Marionette.LayoutView.extend({
    initialize: function(options) {
        options = options || {};
        if (!options.editorApp) {
            console.error("No editorApp passed to EditorLayout");
            return;
        }
        this.editorApp = options.editorApp;
        _.bindAll(this, "onShow");
    },
    regions: {
        "tools": ".editor-tools-container",
        "mapview": ".editor-mapview-container",
        "codeview": ".editor-codeview-container",
        "imageTranslator": ".editor-imagetranslator-container"
    },
    className: "editorAppView",
    template: window.JST["editor/layout"],
    onShow: function() {
        //add all subviews into the rendered view
        this.tools.show(new EditorToolsLayout({
            editorApp: this.editorApp
        }));

        this.mapview.show(new EditorMapView({
            viewsettings: this.editorApp.viewsettings,
            editorsettings: this.editorApp.editorsettings,
            model: this.editorApp.map
        }));

        this.codeview.show(new EditorCodeView({
            model: this.editorApp.map,
        }));

        this.imageTranslator.show(new EditorImageTranslatorLayout({
            imageTranslator: this.editorApp.imageTranslator,
            map: this.editorApp.map
        }));
    }
});
module.exports = Marionette.LayoutView.extend({
  template: require('./missions_aroundme_manually.tpl.html'),
  className: 'state state-manually',
  events: {
    'click .btn-geoloc': 'onGeolocClick'
  },

  initialize: function(options) {
    this.options = options;

    Header.getInstance().set({
      titleKey: 'missionsAroundmeManually',
      buttons: {
        left: ['back']
      }
    });
  },

  onShow: function() {
/*    this.$el.find('input.js-autocomplete').autocomplete({
//      source: departement.collection.getInstance().toJSON(),
      appendTo: this.$el.find('.js-autocomplete-results'),
      _renderItem: function(ul, item) {
        var $li = $('<li />');
        $li.text(item.title).data(item).appendTo(ul);
        return ul;
      },
      select: function(event, ui) {
        var user = User.getCurrent();
        user.set({
          forceDepartement: true,
          departementIds: [ui.item.id]
        });
        user.save();
        Router.getInstance().navigate('#missions/aroundme', {trigger: true});
      }
    });*/
  },

  onGeolocClick: function() {
    var user = User.getCurrent();
    user.set({
      forceDepartement: false
    }).save();
    Router.getInstance().navigate('#missions/aroundme', {trigger: true});
  }
});
Esempio n. 23
0
var View = Marionette.LayoutView.extend({
  template: require('./header.html'),
  className: 'inner clearfix',
  events: {
    'click .btn_back': 'historyBack',
    'click .btn_close': 'historyBack'
  },
  triggers: {
    'click .btn_menu': 'btn:menu:click',
    'click .btn_option': 'btn:option:click',
    'click .btn_plus': 'btn:plus:click'
  },
  btns: {
    menu: {
      icon: 'hamburger'
    },
    back: {
      icon: 'arrow_left'
    },
    plus: {
      icon: 'plus'
    },
    search: {
      icon: 'search'
    },
    option: {
      icon: 'khebab'
    },
    close: {
      icon: 'close'
    }
  },

  serializeData: function() {
    var self = this;

    var data = self.data || {};
    data = _.defaultsDeep(data, {
      title: '',
      titleKey: '',
      titleArgs: {},
      buttons: {
        left: ['menu'],
        right: [],
      }
    });

    if ( !data.title && data.titleKey ) {
      console.log(data);
      data.title = i18n.t('header.titles.'+data.titleKey, data.titleArgs);
    }

    _.forEach(data.buttons, function(side) {
      _.forEach(side, function(btnName, index) {
        var config = self.btns[btnName];
        side[index] = {
          name: btnName,
          icon: config.icon
        };
      });
    });

    return data;
  },

  set: function(data) {
    var self = this;

    self.data = _.cloneDeep(data);
    if (!self.data || self.data == 'none')
            self.data = {
              classNames: 'hidden'
            };

    Marionette.LayoutView.prototype.render.apply(self);
  },

  onRender: function(options) {
    var self = this;

    //self.$el.i18n();
    self.$el.parent('header').attr('class', _.get(self.data, 'classNames', ''));
  },

  historyBack: function() {
    console.log('header back');
    Router.getInstance().back();
  }

  /*onBtnMenuClick: function(e) {
  	var app = require('app');
  	app.rootView.rgSidenav.currentView.toggleShow();
  }*/
});
Esempio n. 24
0
module.exports = Marionette.LayoutView.extend({
  template: template,
  initialize: function () {
    // TODO: Populate default values of form elements for first time users.
    var formElements = {
      'faculty': '#faculty',
      'student': 'input:radio[name="student-radios"]',
      'mode': 'input:radio[name="mode-radios"]',
      'theme': '#theme-options'
    };
    _.each(formElements, function (selector, item) {
      localforage.getItem(item, function (value) {
        if (value) {
          $(selector).val([value]);
        }
      });
    });

    localforage.getItem('ivle:ivleModuleHistory', function (value) {
      if (value) {
        $('#ivle-status-success').removeClass('hidden');
      }
    });

    this.ivleDialog = null;
  },
  events: {
    'click .random-theme': 'randomTheme',
    'change #faculty, input:radio[name="student-radios"], input:radio[name="mode-radios"], #theme-options': 'updatePreference',
    'keydown': 'toggleTheme',
    'click .connect-ivle': 'connectIvle'
  },
  connectIvle: function () {
    var that = this;
    if (that.ivleDialog === null || that.ivleDialog.closed) {
      var w = 255,
          h = 210,
          left = (screen.width / 2) - (w / 2),
          top = (screen.height / 3) - (h / 2);
      var options = 'dependent, toolbar=no, location=no, directories=no, ' +
                    'status=no, menubar=no, scrollbars=no, resizable=no, ' +
                    'copyhistory=no, width=' + w + ', height=' + h +
                    ', top=' + top + ', left=' + left;

      window.ivleLoginSuccessful = function (token) {
        $('#ivle-status-success').addClass('hidden');
        $('#ivle-status-loading').removeClass('hidden');
        localforage.setItem('ivle:ivleToken', token);
        that.fetchModuleHistory(token);
        window.ivleLoginSuccessful = undefined;
      };

      var callbackUrl = window.location.protocol + '//' + window.location.host + '/ivlelogin.html';
      var popUpUrl = 'https://ivle.nus.edu.sg/api/login/?apikey=APILoadTest&url=' + callbackUrl;
      that.ivleDialog = window.open(popUpUrl, '', options);
    }
    else {
      that.ivleDialog.focus();
    }
  },
  fetchModuleHistory: function (ivleToken) {
    var that = this;
    $.get(
      'https://ivle.nus.edu.sg/api/Lapi.svc/UserID_Get',
      {
        'APIKey': 'APILoadTest',
        'Token': ivleToken
      },
      function (studentId) {
        $.get(
          'https://ivle.nus.edu.sg/api/Lapi.svc/Modules_Taken',
          {
            'APIKey': 'APILoadTest',
            'AuthToken': ivleToken,
            'StudentID': studentId
          },
          function (data) { that.saveModuleHistory(data); },
          'jsonp'
        );
      },
      'jsonp'
    );
  },
  saveModuleHistory: function (moduleHistory) {
    localforage.setItem('ivle:ivleModuleHistory', moduleHistory.Results);
    $('#ivle-status-success').removeClass('hidden');
    $('#ivle-status-loading').addClass('hidden');
  },
  randomTheme: function () {
    themePicker.selectRandomTheme();
  },
  updatePreference: function ($ev) {
    var $target = $($ev.target);
    $target.blur();
    var property = $target.attr('data-pref-type');
    var value = $target.val();
    this.savePreference(property, value);
  },
  savePreference: function (property, value) {
    if (property === 'faculty' && value === 'default') {
      alert('You have to select a faculty.');
      localforage.getItem(property, function (value) {
        $('#faculty').val(value);
      });
      return;
    }
    localforage.setItem(property, value);
    if (property === 'theme') {
      themePicker.applyTheme(value);
    } else if (property === 'mode') {
      themePicker.toggleMode();
    }
  }
});
Esempio n. 25
0
import _ from 'underscore';
import hljs from 'highlightjs';

import Handlebars from 'handlebars';

import indexTemplate from '../../templates/index.template.html!text';

import 'highlightjs/styles/monokai.css!';
import 'highlightjs/styles/monokai_sublime.css!';


const IndexView = Marionette.LayoutView.extend({
    template: Handlebars.compile(indexTemplate),

    ui: {
        codeBlocks: 'pre',
    },

    templateHelpers: {
        simple_url: window.APP_CONTEXT.urls.simple,
    },

    onShow() {
        _.each(this.ui.codeBlocks, (block) => {
            hljs.highlightBlock(block);
        });
    }
});

export default IndexView;
Esempio n. 26
0
var _ = require('underscore'), 
    Mn = require('backbone.marionette'), 
    tpl = require('./layout-view.tpl');

module.exports = Mn.LayoutView.extend(
    {
        regions : {
            sampleRegion : '#sample-region'  
        },

        template : _.template(tpl),
        
        onRender : function() {
            
            this.sampleRegion.show(
                new Mn.ItemView(
                    {
                        className : 'well',
                        template: _.template('<p>I\'m a Marionette view rendered on server side inside a region !</p>')
                    }
                )
            );
            
        }
    }
);
Esempio n. 27
0
var ClassDef = Marionette.LayoutView.extend({
  template: require('./dashboard_missions.tpl.html'),
  className: 'inner missions',
  events: {
  },

  regions: {
    list: '.list-outer',
    listSuccessful: '.list-successful'
  },

  initialize: function() {
    var acceptedMissions = User.getCurrent().getAcceptedMissions();
    var completedMissions = User.getCurrent().getCompletedMissions();

    this.missions = _.filter(acceptedMissions, function(mission) {
      return completedMissions.indexOf(mission) == -1;
    });
    this.missions = _.sortBy(this.missions, function(mission) {
      return mission.inSeason().end.delta;
    });
    this.successfulMissions = User.getCurrent().getCompletedMissions();
  },

  serializeData: function() {
    return {
      missions: this.missions,
      successfulMissions : this.successfulMissions
    };
  },

  onRender: function() {
    var collectionView = new CollectionView({
      collection: new Backbone.Collection(this.missions)
    });
    var successfulMissionCollectionView = new CollectionView({
      collection: new Backbone.Collection(this.successfulMissions)
    });

    this.showChildView('list', collectionView);
    this.showChildView('listSuccessful', successfulMissionCollectionView);

  }
});
Esempio n. 28
0
 * Copyright (C) 2009-2016 SonarSource SA
 * mailto:contact AT sonarsource DOT com
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
import Marionette from 'backbone.marionette';
import Template from './templates/metrics-layout.hbs';

export default Marionette.LayoutView.extend({
  template: Template,

  regions: {
    headerRegion: '#metrics-header',
    listRegion: '#metrics-list',
    listFooterRegion: '#metrics-list-footer'
  }
});

Esempio n. 29
0
'use strict';

var Marionette = require('backbone.marionette');
var template = require('../templates/team.hbs');

module.exports = Marionette.LayoutView.extend({
  template: template
});
Esempio n. 30
0
var View = Marionette.LayoutView.extend({
    template: require('./add_item.tpl.html'),
    className: 'add-item-view',

    events:{
        'submit #add-form' : 'submitForm',
    },
    ui :{
        titleFields : 'input[name=title]',
        descFields : 'input[name=description]',
        verbFields : 'input[name=verb]',
        headersFields: 'input[name=headers]',
        reqBodyFields: 'input[name=reqBody]',
        resStatusFields: 'input[name=resStatus]',
        resBodyFields: 'input[name=resBody]',
        commentFields: 'input[name=comment]',
    },
    initialize: function(options) {

    },

    submitForm: function (e){
        console.log("submit ok" );
        
        e.preventDefault();

        this.ui.titleFields.val();
        console.log("données :  \n"+
            "title :  " +this.ui.titleFields.val()+"\n"+
            "verb :  " +this.ui.verbFields.val()+"\n"+
            "description :  " +this.ui.descFields.val()+"\n"+
            "headers :  " +this.ui.headersFields.val()+"\n"+
            "reqBody :  " +this.ui.reqBodyFields.val()+"\n"+
            "resStatus :  " +this.ui.resStatusFields.val()+"\n"+
            "resBody :  " +this.ui.resBodyFields.val()+"\n"+
            "comment :  " +this.ui.commentFields.val()+"\n"
            );
        var model = formAddItem.getNewInstance();
        model.set({
            title : this.ui.titleFields.val(),
            verb :this.ui.verbFields.val(),
            description :this.ui.descFields.val(),
            headers :this.ui.headersFields.val(),
            resBody :this.ui.reqBodyFields.val(),
            resStatus:this.ui.resStatusFields.val(),
            resBody:this.ui.resBodyFields.val(),
            comment:this.ui.commentFields.val(),
        });
        //console.log(model)
        //this.collection.add(model);
    },

    onShow: function(){
        console.log('show new item ');
        this.render();
        console.log(this.$el);
    },

    
});