diff --git a/.env.sample b/.env.sample index 42db9fd..bac955c 100644 --- a/.env.sample +++ b/.env.sample @@ -1,6 +1,8 @@ NODE_ENV='development' SERVER_URL='http://localhost' SERVER_PORT=5000 +MEMBER_CLIENT_PATH='/member-client' +USER_CLIENT_PATH='/user-client' HTTP_PORT=5000 HTTPS_PORT=5443 POSTGRES_HOST='localhost' diff --git a/README.md b/README.md index 4a6f4c9..7930df1 100644 --- a/README.md +++ b/README.md @@ -184,6 +184,12 @@ git clone https://github.com/sitcomlab/Ethics-app.git node npm install ``` +* Alternatively you can also use **yarn** for that (run the command with `sudo`, if you don't have permission): + +``` +yarn install +``` + ##### 2.4. Bower * Install Bower via **npm** (run the command with `sudo`, if you don't have permission): @@ -255,6 +261,8 @@ node server.js * `NODE_ENV`: server environment (default: `development`, option: `production`, which uses https with a certificate) * `SERVER_URL`: url/domain of the host-server (default: `http://ethics-app.uni-muenster.de`) * `SERVER_PORT`: port number of the host-server (default: `80`) + * `MEMBER_CLIENT_PATH`: path to the member-client on the host-server (default: `/member-client`) + * `USER_CLIENT_PATH`: path to the user-client on the host-server (default: `/user-client`) * `HTTP_PORT`: port number of the nodejs-server: (default: `5000`) * `HTTPS_PORT`: secure port number of the nodejs-server: (default: `HTTP_PORT + 443`) * `POSTGRES_HOST`: Postgres host address (default: `localhost`) diff --git a/controllers/documents/change_status.js b/controllers/documents/change_status.js index 5d3416f..c223b70 100644 --- a/controllers/documents/change_status.js +++ b/controllers/documents/change_status.js @@ -5,10 +5,10 @@ var types = require('pg').types; types.setTypeParser(1700, 'text', parseFloat); var _ = require('underscore'); var jwt = require('jsonwebtoken'); -var jwtSecret = require('../../server.js').jwtSecret; var mustache = require('mustache'); var moment = require('moment'); var domain = process.env.SERVER_URL + ":" + process.env.SERVER_PORT; +var user_client_path = process.env.USER_CLIENT_PATH; var pool = require('../../server.js').pool; var transporter = require('../../server.js').transporter; @@ -380,6 +380,7 @@ exports.request = function(req, res) { status_description_1: status_description_1, status_description_2: status_description_2, domain: domain, + user_client_path: user_client_path, year: moment().format("YYYY") }); diff --git a/controllers/documents/post.js b/controllers/documents/post.js index d87c5d3..77ba2e8 100644 --- a/controllers/documents/post.js +++ b/controllers/documents/post.js @@ -8,6 +8,7 @@ var uuid = require('uuid'); var mustache = require('mustache'); var moment = require('moment'); var domain = process.env.SERVER_URL + ":" + process.env.SERVER_PORT; +var user_client_path = process.env.USER_CLIENT_PATH; var pool = require('../../server.js').pool; var transporter = require('../../server.js').transporter; @@ -211,6 +212,7 @@ exports.request = function(req, res) { user: user, document: document, domain: domain, + user_client_path: user_client_path, year: moment().format("YYYY") }); diff --git a/controllers/documents/submit.js b/controllers/documents/submit.js index 74525c3..228e387 100644 --- a/controllers/documents/submit.js +++ b/controllers/documents/submit.js @@ -7,6 +7,7 @@ var _ = require('underscore'); var mustache = require('mustache'); var moment = require('moment'); var domain = process.env.SERVER_URL + ":" + process.env.SERVER_PORT; +var member_client_path = process.env.MEMBER_CLIENT_PATH; var pool = require('../../server.js').pool; var transporter = require('../../server.js').transporter; @@ -373,9 +374,6 @@ exports.request = function(req, res) { concern.q13_sign = "no"; } - // Formatting - document.link = domain + "/committee/documents/" + document.document_id + "/login"; - // Notify each committee member async.eachOfSeries(members, function (member, key, callback) { @@ -389,6 +387,7 @@ exports.request = function(req, res) { concern: concern, course: course, domain: domain, + member_client_path: member_client_path, year: moment().format("YYYY") }); diff --git a/controllers/members/post.js b/controllers/members/post.js index 77f8f95..33332c9 100644 --- a/controllers/members/post.js +++ b/controllers/members/post.js @@ -7,6 +7,7 @@ var _ = require('underscore'); var mustache = require('mustache'); var moment = require('moment'); var domain = process.env.SERVER_URL + ":" + process.env.SERVER_PORT; +var member_client_path = process.env.MEMBER_CLIENT_PATH; var jwt = require('jsonwebtoken'); var pool = require('../../server.js').pool; var transporter = require('../../server.js').transporter; @@ -38,7 +39,7 @@ exports.request = function(req, res) { var token = req.headers.authorization.substring(7); // Verify token - jwt.verify(token, jwtSecret, function(err, decoded) { + jwt.verify(token, process.env.JWTSECRET, function(err, decoded) { if(err){ callback(new Error("Authorization failed"), 401); } else { @@ -89,6 +90,7 @@ exports.request = function(req, res) { var output = mustache.render(template_member_account_created, { member: member, domain: domain, + member_client_path: member_client_path, year: moment().format("YYYY") }); diff --git a/controllers/members/put.js b/controllers/members/put.js index 60e3434..38f563f 100644 --- a/controllers/members/put.js +++ b/controllers/members/put.js @@ -7,6 +7,7 @@ var _ = require('underscore'); var mustache = require('mustache'); var moment = require('moment'); var domain = process.env.SERVER_URL + ":" + process.env.SERVER_PORT; +var member_client_path = process.env.MEMBER_CLIENT_PATH; var jwt = require('jsonwebtoken'); var pool = require('../../server.js').pool; var transporter = require('../../server.js').transporter; @@ -224,6 +225,7 @@ exports.request = function(req, res) { member: member, updated_member: updated_member, domain: domain, + member_client_path: member_client_path, year: moment().format("YYYY") }); } else { @@ -233,6 +235,7 @@ exports.request = function(req, res) { member: member, updated_member: updated_member, domain: domain, + member_client_path: member_client_path, year: moment().format("YYYY") }); } diff --git a/controllers/recovery/find_member_by_email.js b/controllers/recovery/find_member_by_email.js index 782cc7b..33aeb7c 100644 --- a/controllers/recovery/find_member_by_email.js +++ b/controllers/recovery/find_member_by_email.js @@ -7,6 +7,7 @@ var _ = require('underscore'); var mustache = require('mustache'); var moment = require('moment'); var domain = process.env.SERVER_URL + ":" + process.env.SERVER_PORT; +var member_client_path = process.env.MEMBER_CLIENT_PATH; var pool = require('../../server.js').pool; var transporter = require('../../server.js').transporter; var jwt = require('jsonwebtoken'); @@ -78,6 +79,7 @@ exports.request = function(req, res) { var output = mustache.render(template_member_recovery, { member: member, domain: domain, + member_client_path: member_client_path, year: moment().format("YYYY") }); diff --git a/controllers/recovery/find_user_by_email.js b/controllers/recovery/find_user_by_email.js index 61c308a..46d71e3 100644 --- a/controllers/recovery/find_user_by_email.js +++ b/controllers/recovery/find_user_by_email.js @@ -7,6 +7,7 @@ var _ = require('underscore'); var mustache = require('mustache'); var moment = require('moment'); var domain = process.env.SERVER_URL + ":" + process.env.SERVER_PORT; +var user_client_path = process.env.USER_CLIENT_PATH; var pool = require('../../server.js').pool; var transporter = require('../../server.js').transporter; @@ -142,6 +143,7 @@ exports.request = function(req, res) { amount: amount, amount_description: amount_description, domain: domain, + user_client_path: user_client_path, year: moment().format("YYYY") }); diff --git a/controllers/recovery/reset_password.js b/controllers/recovery/reset_password.js index 0e1a510..c10ac5a 100644 --- a/controllers/recovery/reset_password.js +++ b/controllers/recovery/reset_password.js @@ -7,6 +7,7 @@ var _ = require('underscore'); var mustache = require('mustache'); var moment = require('moment'); var domain = process.env.SERVER_URL + ":" + process.env.SERVER_PORT; +var member_client_path = process.env.MEMBER_CLIENT_PATH; var pool = require('../../server.js').pool; var transporter = require('../../server.js').transporter; var jwt = require('jsonwebtoken'); diff --git a/controllers/users/post.js b/controllers/users/post.js index b645acb..a3c2964 100644 --- a/controllers/users/post.js +++ b/controllers/users/post.js @@ -7,6 +7,7 @@ var _ = require('underscore'); var mustache = require('mustache'); var moment = require('moment'); var domain = process.env.SERVER_URL + ":" + process.env.SERVER_PORT; +var user_client_path = process.env.USER_CLIENT_PATH; var jwt = require('jsonwebtoken'); var pool = require('../../server.js').pool; var transporter = require('../../server.js').transporter; @@ -57,6 +58,7 @@ exports.request = function(req, res) { var output = mustache.render(template_user_account_created, { user: user, domain: domain, + user_client_path: user_client_path, year: moment().format("YYYY") }); diff --git a/controllers/users/put.js b/controllers/users/put.js index 8baaf69..ce2e0e6 100644 --- a/controllers/users/put.js +++ b/controllers/users/put.js @@ -7,9 +7,9 @@ var _ = require('underscore'); var mustache = require('mustache'); var moment = require('moment'); var domain = process.env.SERVER_URL + ":" + process.env.SERVER_PORT; +var user_client_path = process.env.USER_CLIENT_PATH; var jwt = require('jsonwebtoken'); var pool = require('../../server.js').pool; -var jwtSecret = require('../../server.js').jwtSecret; var transporter = require('../../server.js').transporter; var fs = require("fs"); @@ -141,6 +141,8 @@ exports.request = function(req, res) { output = mustache.render(template_user_account_blocked, { user: user, updated_user: updated_user, + domain: domain, + user_client_path: user_client_path, year: moment().format("YYYY") }); } else { @@ -149,6 +151,8 @@ exports.request = function(req, res) { output = mustache.render(template_user_account_reactivated, { user: user, updated_user: updated_user, + domain: domain, + user_client_path: user_client_path, year: moment().format("YYYY") }); } diff --git a/public/member-client/js/controllers/account/editController.js b/public/member-client/js/controllers/account/editController.js index 9831603..8e6bfa1 100644 --- a/public/member-client/js/controllers/account/editController.js +++ b/public/member-client/js/controllers/account/editController.js @@ -2,7 +2,7 @@ var app = angular.module("ethics-app"); // Account edit controller -app.controller("accountEditController", function($scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $authenticationService, $memberService, $universityService, $instituteService, $workingGroupService) { +app.controller("accountEditController", function($scope, $rootScope, $routeParams, $filter, $translate, $location, config, $window, $timeout, $authenticationService, $memberService, $universityService, $instituteService, $workingGroupService) { /************************************************* FUNCTIONS @@ -82,36 +82,40 @@ app.controller("accountEditController", function($scope, $rootScope, $routeParam // Cache token var token = $authenticationService.getToken(); - // Check if passwords are equal, if it has been changed + // Check if has been changed if($scope.updated_member.new_password){ + // Check if new passwords are equal if($scope.updated_member.password === $scope.repeated_password){ - $scope.$parent.loading = { status: true, message: $filter('translate')('SAVING_MEMBER') }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SAVING_ACCOUNT_SETTINGS') }; // Update member $memberService.edit($scope.authenticated_member.member_id, $scope.updated_member) .then(function onSuccess(response) { - var authenticated_member = response.data; - authenticated_member.token = token; - $authenticationService.set(authenticated_member); + response.data.token = token; + $authenticationService.set(response.data); + + // Reset navbar + $scope.$parent.authenticated_member = $authenticationService.get(); + $scope.$parent.loading = { status: false, message: "" }; // Redirect $scope.redirect("/members/" + $scope.authenticated_member.member_id); + }) .catch(function onError(response) { $window.alert(response.data); }); } else { - $window.alert("Your passwords are not equal!"); + $window.alert($filter('translate')('ALERT_PASSWORD_NOT_EQUAL')); } } else { - $scope.$parent.loading = { status: true, message: $filter('translate')('SAVING_MEMBER') }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SAVING_ACCOUNT_SETTINGS') }; // Update member $memberService.edit($scope.authenticated_member.member_id, $scope.updated_member) .then(function onSuccess(response) { - var authenticated_member = response.data; - authenticated_member.token = token; - $authenticationService.set(authenticated_member); + response.data.token = token; + $authenticationService.set(response.data); // Reset navbar $scope.$parent.authenticated_member = $authenticationService.get(); @@ -136,7 +140,7 @@ app.controller("accountEditController", function($scope, $rootScope, $routeParam // Check which kind of related data needs to be requested switch (related_data) { case 'universities': { - $scope.$parent.loading = { status: true, message: "Loading universities" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_UNIVERSITIES') }; // Load universities $universityService.list({ @@ -156,7 +160,7 @@ app.controller("accountEditController", function($scope, $rootScope, $routeParam case 'institutes': { if($scope.university_id){ if($scope.university_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading institutes" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_INSTITUTES') }; // Load related institutes $instituteService.listByUniversity($scope.university_id, { @@ -189,7 +193,7 @@ app.controller("accountEditController", function($scope, $rootScope, $routeParam case 'working_groups': { if($scope.institute_id){ if($scope.institute_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading working groups" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_WORKING_GROUPS') }; // Load related working groups $workingGroupService.listByInstitute($scope.institute_id, { @@ -225,6 +229,7 @@ app.controller("accountEditController", function($scope, $rootScope, $routeParam /************************************************* INIT *************************************************/ + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_ACCOUNT_SETTINGS') }; $scope.authenticated_member = $authenticationService.get(); $scope.repeated_password = ""; diff --git a/public/member-client/js/controllers/course/createController.js b/public/member-client/js/controllers/course/createController.js index 4d6e360..d9effc2 100644 --- a/public/member-client/js/controllers/course/createController.js +++ b/public/member-client/js/controllers/course/createController.js @@ -44,7 +44,7 @@ app.controller("courseCreateController", function($scope, $rootScope, $routePara $scope.createCourseForm.lecturer.$pristine = false; $scope.createCourseForm.institute_id.$pristine = false; } else { - $scope.$parent.loading = { status: true, message: "Creating new course" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('CREATING_NEW_COURSE') }; // Create new course $courseService.create($scope.new_course) @@ -111,7 +111,7 @@ app.controller("courseCreateController", function($scope, $rootScope, $routePara // Check which kind of related data needs to be requested switch (related_data) { case 'universities': { - $scope.$parent.loading = { status: true, message: "Loading universities" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_UNIVERSITIES') }; // Load universities $universityService.list({ @@ -131,7 +131,7 @@ app.controller("courseCreateController", function($scope, $rootScope, $routePara case 'institutes': { if($scope.university_id){ if($scope.university_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading institutes" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_INSTITUTES') }; // Load related institutes $instituteService.listByUniversity($scope.university_id, { @@ -172,7 +172,7 @@ app.controller("courseCreateController", function($scope, $rootScope, $routePara case 'members': { if($scope.new_course.institute_id){ if($scope.new_course.institute_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading members" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_MEMBERS') }; // Load related members $memberService.listByInstitute($scope.new_course.institute_id, { diff --git a/public/member-client/js/controllers/course/deleteController.js b/public/member-client/js/controllers/course/deleteController.js index 4726172..770be5d 100644 --- a/public/member-client/js/controllers/course/deleteController.js +++ b/public/member-client/js/controllers/course/deleteController.js @@ -22,7 +22,7 @@ app.controller("courseDeleteController", function($scope, $rootScope, $routePara * @return {[type]} [description] */ $scope.delete = function(){ - $scope.$parent.loading = { status: true, message: "Deleting course" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('DELETING_COURSE') }; // Delete course $courseService.remove($scope.course.course_id) @@ -37,7 +37,7 @@ app.controller("courseDeleteController", function($scope, $rootScope, $routePara /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading course" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_COURSE') }; $scope.input = ""; // Load course diff --git a/public/member-client/js/controllers/course/detailsController.js b/public/member-client/js/controllers/course/detailsController.js index 3fe4252..d4bfdcf 100644 --- a/public/member-client/js/controllers/course/detailsController.js +++ b/public/member-client/js/controllers/course/detailsController.js @@ -57,7 +57,7 @@ app.controller("courseDetailsController", function($scope, $rootScope, $routePar // Check which kind of related data needs to be requested switch (related_data) { case 'documents': { - $scope.$parent.loading = { status: true, message: "Loading related documents" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_RELATED_DOCUMENTS') }; // Load related documents $documentsService.listByCourse($scope.course.course_id, $scope.filter) @@ -93,7 +93,7 @@ app.controller("courseDetailsController", function($scope, $rootScope, $routePar break; } case 'members': { - $scope.$parent.loading = { status: true, message: "Loading related members" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_RELATED_MEMBERS') }; // Load related members $memberService.listByCourse($scope.course.course_id, $scope.filter) @@ -146,7 +146,7 @@ app.controller("courseDetailsController", function($scope, $rootScope, $routePar /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading course" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_COURSE') }; $scope.authenticated_member = $authenticationService.get(); // Filter diff --git a/public/member-client/js/controllers/course/editController.js b/public/member-client/js/controllers/course/editController.js index 0ef21d2..c14c603 100644 --- a/public/member-client/js/controllers/course/editController.js +++ b/public/member-client/js/controllers/course/editController.js @@ -44,7 +44,7 @@ app.controller("courseEditController", function($scope, $rootScope, $routeParams $scope.editCourseForm.lecturer.$pristine = false; $scope.editCourseForm.institute_id.$pristine = false; } else { - $scope.$parent.loading = { status: true, message: "Saving course" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SAVING_COURSE') }; // Updating course $courseService.edit($routeParams.course_id, $scope.updated_course) @@ -110,7 +110,7 @@ app.controller("courseEditController", function($scope, $rootScope, $routeParams // Check which kind of related data needs to be requested switch (related_data) { case 'universities': { - $scope.$parent.loading = { status: true, message: "Loading universities" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_UNIVERSITIES') }; // Load universities $universityService.list({ @@ -130,7 +130,7 @@ app.controller("courseEditController", function($scope, $rootScope, $routeParams case 'institutes': { if($scope.university_id){ if($scope.university_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading institutes" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_INSTITUTES') }; // Load related institutes $instituteService.listByUniversity($scope.university_id, { @@ -171,7 +171,7 @@ app.controller("courseEditController", function($scope, $rootScope, $routeParams case 'members': { if($scope.updated_course.institute_id){ if($scope.updated_course.institute_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading members" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_MEMBERS') }; // Load related members $memberService.listByInstitute($scope.updated_course.institute_id, { @@ -209,7 +209,7 @@ app.controller("courseEditController", function($scope, $rootScope, $routeParams /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading course" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_COURSE') }; $scope.selectedMember = {}; $scope.responsible_members = []; diff --git a/public/member-client/js/controllers/course/listController.js b/public/member-client/js/controllers/course/listController.js index e380248..e529542 100644 --- a/public/member-client/js/controllers/course/listController.js +++ b/public/member-client/js/controllers/course/listController.js @@ -128,7 +128,7 @@ app.controller("courseListController", function($scope, $rootScope, $filter, $tr /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading courses" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_COURSES') }; // Load courses $scope.filter = $courseService.getCachedFilter(); diff --git a/public/member-client/js/controllers/document/deleteController.js b/public/member-client/js/controllers/document/deleteController.js index ec11d75..362618c 100644 --- a/public/member-client/js/controllers/document/deleteController.js +++ b/public/member-client/js/controllers/document/deleteController.js @@ -22,7 +22,7 @@ app.controller("documentDeleteController", function($scope, $rootScope, $routePa * @return {[type]} [description] */ $scope.delete = function(){ - $scope.$parent.loading = { status: true, message: "Deleting document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('DELETING_DOCUMENT') }; // Delete document $documentService.remove($scope.document.document_id) @@ -48,7 +48,7 @@ app.controller("documentDeleteController", function($scope, $rootScope, $routePa /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_DOCUMENT') }; $scope.input = ""; // Update navbar diff --git a/public/member-client/js/controllers/document/detailsController.js b/public/member-client/js/controllers/document/detailsController.js index ccb656e..9edafd1 100644 --- a/public/member-client/js/controllers/document/detailsController.js +++ b/public/member-client/js/controllers/document/detailsController.js @@ -21,7 +21,7 @@ app.controller("documentDetailsController", function($scope, $rootScope, $routeP /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_DOCUMENT') }; // Reset $documentService.set(); @@ -34,7 +34,7 @@ app.controller("documentDetailsController", function($scope, $rootScope, $routeP $documentService.retrieve($routeParams.document_id) .then(function onSuccess(response) { $documentService.set(response.data); - $scope.$parent.loading = { status: true, message: "Loading revisions" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_REVISIONS') }; $timeout(function(){ // Load revisions diff --git a/public/member-client/js/controllers/document/editSettingsController.js b/public/member-client/js/controllers/document/editSettingsController.js index f651284..fd8b0bd 100644 --- a/public/member-client/js/controllers/document/editSettingsController.js +++ b/public/member-client/js/controllers/document/editSettingsController.js @@ -30,7 +30,7 @@ app.controller("documentEditSettingsController", function($scope, $rootScope, $r $scope.editDocumentForm.status.$pristine = false; $scope.editDocumentForm.course_id.$pristine = false; } else { - $scope.$parent.loading = { status: true, message: "Saving document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SAVING_DOCUMENT') }; // Save document $documentService.edit($routeParams.document_id, $scope.updated_document) @@ -85,7 +85,7 @@ app.controller("documentEditSettingsController", function($scope, $rootScope, $r // Check which kind of related data needs to be requested switch (related_data) { case 'universities': { - $scope.$parent.loading = { status: true, message: "Loading universities" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_UNIVERSITIES') }; // Load universities $universityService.list({ @@ -105,7 +105,7 @@ app.controller("documentEditSettingsController", function($scope, $rootScope, $r case 'institutes': { if($scope.university_id){ if($scope.university_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading institutes" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_INSTITUTES') }; // Load related institutes $instituteService.listByUniversity($scope.university_id, { @@ -138,7 +138,7 @@ app.controller("documentEditSettingsController", function($scope, $rootScope, $r case 'courses': { if($scope.institute_id){ if($scope.institute_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading courses" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_COURSES') }; // Load related courses $courseService.listByInstitute($scope.institute_id, { @@ -184,7 +184,7 @@ app.controller("documentEditSettingsController", function($scope, $rootScope, $r /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_DOCUMENT') }; $scope.document = $documentService.get(); $scope.updated_document = $documentService.copy($scope.document); $scope.authenticated_member = $authenticationService.get(); diff --git a/public/member-client/js/controllers/document/listController.js b/public/member-client/js/controllers/document/listController.js index 0f9c763..60f0bb3 100644 --- a/public/member-client/js/controllers/document/listController.js +++ b/public/member-client/js/controllers/document/listController.js @@ -158,7 +158,7 @@ app.controller("documentListController", function($scope, $rootScope, $filter, $ /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading documents" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_DOCUMENTS') }; $scope.authenticated_member = $authenticationService.get(); // Load documents with applied filter (default: documents, which need to be reviewed) and start the interval diff --git a/public/member-client/js/controllers/document/overviewController.js b/public/member-client/js/controllers/document/overviewController.js index f637fea..ed82c9c 100644 --- a/public/member-client/js/controllers/document/overviewController.js +++ b/public/member-client/js/controllers/document/overviewController.js @@ -22,7 +22,7 @@ app.controller("documentOverviewController", function($scope, $rootScope, $route * @return {[type]} [description] */ $scope.closeOverview = function(){ - $scope.$parent.loading = { status: true, message: "Saving notes" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SAVING_NOTES') }; // Save notes $noteService.save($scope.document.note_id, { "note": $scope.document.note }) @@ -168,7 +168,7 @@ app.controller("documentOverviewController", function($scope, $rootScope, $route * @return {[type]} [description] */ $scope.reviewDocument = function(){ - $scope.$parent.loading = { status: true, message: "Updating reviewer" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('UPDATING_REVIEWER') }; // Update reviewer var revision = $documentService.getLatestRevision(); @@ -182,21 +182,21 @@ app.controller("documentOverviewController", function($scope, $rootScope, $route status: 4 }) .then(function onSuccess(response) { - $scope.$parent.loading = { status: true, message: "Saving notes" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SAVING_NOTES') }; $timeout(function(){ // Save notes $noteService.save($scope.document.note_id, { "note": $scope.document.note }) .then(function onSuccess(response) { - $scope.$parent.loading = { status: true, message: "Loading document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_DOCUMENT') }; $timeout(function(){ // Load document $documentService.retrieve($routeParams.document_id) .then(function onSuccess(response) { $documentService.set(response.data); - $scope.$parent.loading = { status: true, message: "Loading revisions" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_REVISIONS') }; $timeout(function(){ @@ -346,7 +346,7 @@ app.controller("documentOverviewController", function($scope, $rootScope, $route /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading document overview" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_OVERVIEW') }; $scope.document = $documentService.get(); $scope.latest_revision = $documentService.getLatestRevision(); $scope.authenticated_member = $authenticationService.get(); diff --git a/public/member-client/js/controllers/document/reviewController.js b/public/member-client/js/controllers/document/reviewController.js index e352a5d..32e7161 100644 --- a/public/member-client/js/controllers/document/reviewController.js +++ b/public/member-client/js/controllers/document/reviewController.js @@ -147,7 +147,7 @@ app.controller("documentReviewController", function($scope, $rootScope, $routePa * @return {[type]} [description] */ $scope.saveReview = function(){ - $scope.$parent.loading = { status: true, message: "Saving review" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SAVING_REVIEW') }; // Save notes $noteService.save($scope.document.note_id, { "note": $scope.document.note }) @@ -195,7 +195,7 @@ app.controller("documentReviewController", function($scope, $rootScope, $routePa .then(function onSuccess(response) { if($scope.review_status !== null){ - $scope.$parent.loading = { status: true, message: "Saving review" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SAVING_REVIEW') }; // Publish comments for user $scope.latest_revision.comments.published = true; @@ -203,7 +203,7 @@ app.controller("documentReviewController", function($scope, $rootScope, $routePa // Save comments $commentService.edit($scope.latest_revision.comments.comment_id, $scope.latest_revision.comments) .then(function onSuccess(response) { - $scope.$parent.loading = { status: true, message: "Publishing review" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('PUBLISHING_REVIEW') }; // Change status of document $documentService.changeStatus($routeParams.document_id, { @@ -261,7 +261,7 @@ app.controller("documentReviewController", function($scope, $rootScope, $routePa /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading review" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_REVIEW') }; $scope.review_status = null; $scope.authenticated_member = $authenticationService.get(); $scope.document = $documentService.get(); diff --git a/public/member-client/js/controllers/document/showFilesController.js b/public/member-client/js/controllers/document/showFilesController.js index 32284fa..7f7d71b 100644 --- a/public/member-client/js/controllers/document/showFilesController.js +++ b/public/member-client/js/controllers/document/showFilesController.js @@ -31,14 +31,14 @@ app.controller("documentShowFilesController", function($scope, $rootScope, $rout /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_DOCUMENT') }; // Update navbar $scope.$parent.document = $documentService.get(); // Check status of document to generate files if($documentService.getStatus()===2 || $documentService.getStatus()===6){ - $scope.$parent.loading = { status: true, message: "Generating files" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('GENERATING_FILES') }; // Generate files on server $documentService.generateFiles($routeParams.document_id) @@ -55,7 +55,7 @@ app.controller("documentShowFilesController", function($scope, $rootScope, $rout $scope.redirect("/documents/" + $routeParams.document_id + "/overview"); }); } else { - $window.alert("Files can only be generated, if the document has been accepted"); + $window.alert($filter('translate')('ALERT_FILE_GENERATION_FAILED')); // Redirect $scope.redirect("/documents/" + $routeParams.document_id + "/overview"); diff --git a/public/member-client/js/controllers/document/showIdController.js b/public/member-client/js/controllers/document/showIdController.js index 7e4615d..a2fed82 100644 --- a/public/member-client/js/controllers/document/showIdController.js +++ b/public/member-client/js/controllers/document/showIdController.js @@ -50,7 +50,7 @@ app.controller("documentShowIdController", function($scope, $rootScope, $filter, /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_DOCUMENT') }; $scope.document = $documentService.get(); // Update navbar diff --git a/public/member-client/js/controllers/institute/createController.js b/public/member-client/js/controllers/institute/createController.js index 60ddcdc..790b622 100644 --- a/public/member-client/js/controllers/institute/createController.js +++ b/public/member-client/js/controllers/institute/createController.js @@ -28,7 +28,7 @@ app.controller("instituteCreateController", function($scope, $rootScope, $routeP $scope.createInstituteForm.institute_name.$pristine = false; $scope.createInstituteForm.university_id.$pristine = false; } else { - $scope.$parent.loading = { status: true, message: "Creating new institute" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('CREATING_NEW_INSTITUTE') }; // Create new Institute $instituteService.create($scope.new_institute) @@ -54,7 +54,7 @@ app.controller("instituteCreateController", function($scope, $rootScope, $routeP // Check which kind of related data needs to be requested switch (related_data) { case 'universities': { - $scope.$parent.loading = { status: true, message: "Loading universities" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_UNIVERSITIES') }; // Load universities $universityService.list({ diff --git a/public/member-client/js/controllers/institute/deleteController.js b/public/member-client/js/controllers/institute/deleteController.js index cc7c73a..db3ab31 100644 --- a/public/member-client/js/controllers/institute/deleteController.js +++ b/public/member-client/js/controllers/institute/deleteController.js @@ -22,7 +22,7 @@ app.controller("instituteDeleteController", function($scope, $rootScope, $routeP * @return {[type]} [description] */ $scope.delete = function(){ - $scope.$parent.loading = { status: true, message: "Deleting institute" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('DELETING_INSTITUTE') }; // Delete institute $instituteService.remove($scope.institute.institute_id) @@ -37,7 +37,7 @@ app.controller("instituteDeleteController", function($scope, $rootScope, $routeP /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading institute" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_INSTITUTE') }; $scope.input = ""; // Load institute diff --git a/public/member-client/js/controllers/institute/detailsController.js b/public/member-client/js/controllers/institute/detailsController.js index b47e971..38474c2 100644 --- a/public/member-client/js/controllers/institute/detailsController.js +++ b/public/member-client/js/controllers/institute/detailsController.js @@ -70,7 +70,7 @@ app.controller("instituteDetailsController", function($scope, $rootScope, $route // Check which kind of related data needs to be requested switch (related_data) { case 'working_groups': { - $scope.$parent.loading = { status: true, message: "Loading related working groups" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_RELATED_WORKING_GROUPS') }; // Load related working groups $workingGroupService.listByInstitute($scope.institute.institute_id, $scope.filter) @@ -106,7 +106,7 @@ app.controller("instituteDetailsController", function($scope, $rootScope, $route break; } case 'members': { - $scope.$parent.loading = { status: true, message: "Loading related members" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_RELATED_MEMBERS') }; // Load related members $memberService.listByInstitute($scope.institute.institute_id, $scope.filter) @@ -142,7 +142,7 @@ app.controller("instituteDetailsController", function($scope, $rootScope, $route break; } case 'users': { - $scope.$parent.loading = { status: true, message: "Loading related users" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_RELATED_USERS') }; // Load related users $userService.listByInstitute($scope.institute.institute_id, $scope.filter) @@ -178,7 +178,7 @@ app.controller("instituteDetailsController", function($scope, $rootScope, $route break; } case 'courses': { - $scope.$parent.loading = { status: true, message: "Loading related courses" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_RELATED_COURSES') }; // Load related courses $courseService.listByInstitute($scope.institute.institute_id, $scope.filter) @@ -231,7 +231,7 @@ app.controller("instituteDetailsController", function($scope, $rootScope, $route /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading institute" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_INSTITUTE') }; // Filter $scope.filter = { diff --git a/public/member-client/js/controllers/institute/editController.js b/public/member-client/js/controllers/institute/editController.js index 71d2bff..a8a9a98 100644 --- a/public/member-client/js/controllers/institute/editController.js +++ b/public/member-client/js/controllers/institute/editController.js @@ -27,7 +27,7 @@ app.controller("instituteEditController", function($scope, $rootScope, $routePar // Update UI $scope.editInstituteForm.institute_name.$pristine = false; } else { - $scope.$parent.loading = { status: true, message: "Saving institute" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SAVING_INSTITUTE') }; // Updating Institute $instituteService.edit($routeParams.institute_id, $scope.updated_institute) @@ -51,7 +51,7 @@ app.controller("instituteEditController", function($scope, $rootScope, $routePar // Check which kind of related data needs to be requested switch (related_data) { case 'universities': { - $scope.$parent.loading = { status: true, message: "Loading universities" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_UNIVERSITIES') }; // Load universities $universityService.list({ @@ -76,7 +76,7 @@ app.controller("instituteEditController", function($scope, $rootScope, $routePar /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading institute" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_INSTITUTE') }; // Load Institute $instituteService.retrieve($routeParams.institute_id) diff --git a/public/member-client/js/controllers/institute/listController.js b/public/member-client/js/controllers/institute/listController.js index b79a2bf..2036668 100644 --- a/public/member-client/js/controllers/institute/listController.js +++ b/public/member-client/js/controllers/institute/listController.js @@ -138,7 +138,7 @@ app.controller("instituteListController", function($scope, $rootScope, $filter, /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading institutes" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_INSTITUTES') }; // Load institutes $scope.filter = $instituteService.getCachedFilter(); diff --git a/public/member-client/js/controllers/loginByDocumentController.js b/public/member-client/js/controllers/loginByDocumentController.js index 0ca5452..744ec94 100644 --- a/public/member-client/js/controllers/loginByDocumentController.js +++ b/public/member-client/js/controllers/loginByDocumentController.js @@ -27,7 +27,7 @@ app.controller("loginByDocumentController", function($scope, $rootScope, $routeP $scope.loginForm.username.$pristine = false; $scope.loginForm.password.$pristine = false; } else { - $scope.$parent.loading = { status: true, message: "Logging in" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOGGING_IN') }; $authenticationService.login($scope.login_member) .then(function onSuccess(response) { @@ -53,7 +53,7 @@ app.controller("loginByDocumentController", function($scope, $rootScope, $routeP /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading application" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_APPLICATION') }; // Reset all services $authenticationService.set(); diff --git a/public/member-client/js/controllers/loginController.js b/public/member-client/js/controllers/loginController.js index 791a1cc..8dff53f 100644 --- a/public/member-client/js/controllers/loginController.js +++ b/public/member-client/js/controllers/loginController.js @@ -27,7 +27,7 @@ app.controller("loginController", function($scope, $rootScope, $filter, $transla $scope.loginForm.username.$pristine = false; $scope.loginForm.password.$pristine = false; } else { - $scope.$parent.loading = { status: true, message: "Logging in" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOGGING_IN') }; $authenticationService.login($scope.login_member) .then(function onSuccess(response) { @@ -53,7 +53,7 @@ app.controller("loginController", function($scope, $rootScope, $filter, $transla /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading application" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_APPLICATION') }; // Reset all services $authenticationService.set(); diff --git a/public/member-client/js/controllers/mainController.js b/public/member-client/js/controllers/mainController.js index bb9d221..29977e8 100644 --- a/public/member-client/js/controllers/mainController.js +++ b/public/member-client/js/controllers/mainController.js @@ -1,7 +1,7 @@ var app = angular.module("ethics-app"); // Main controller -app.controller("mainController", function($scope, $rootScope, $location, config, $authenticationService, $documentService) { +app.controller("mainController", function($scope, $rootScope, $filter, $translate, $location, config, $authenticationService, $documentService) { /************************************************* FUNCTIONS *************************************************/ @@ -33,6 +33,14 @@ app.controller("mainController", function($scope, $rootScope, $location, config, $location.url(path); }; + /************************************************* + LISTENERS + *************************************************/ + $rootScope.$on('updateAccount', function (event, data) { + $scope.authenticated_member = $authenticationService.get(); + $scope.loading = { status: false, message: "" }; + }); + /************************************************* INIT @@ -40,9 +48,6 @@ app.controller("mainController", function($scope, $rootScope, $location, config, $scope.config = config; $scope.authenticated_member = $authenticationService.get(); $scope.document = $documentService.get(); - $scope.loading = { - status: false, - message: "" - }; + $scope.loading = { status: false, message: "" }; }); diff --git a/public/member-client/js/controllers/member/createController.js b/public/member-client/js/controllers/member/createController.js index 1994f2a..0a02cb6 100644 --- a/public/member-client/js/controllers/member/createController.js +++ b/public/member-client/js/controllers/member/createController.js @@ -55,7 +55,7 @@ app.controller("memberCreateController", function($scope, $rootScope, $routePara $scope.createMemberForm.subscribed.$pristine = false; } else { if($scope.new_member.password === $scope.repeated_password){ - $scope.$parent.loading = { status: true, message: "Creating new member" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('CREATING_NEW_MEMBER') }; // Create new member $memberService.create($scope.new_member) @@ -69,7 +69,7 @@ app.controller("memberCreateController", function($scope, $rootScope, $routePara $window.alert(response.data); }); } else { - $window.alert("Your passwords are not equal!"); + $window.alert($filter('translate')('ALERT_PASSWORD_NOT_EQUAL')); } } }; @@ -83,7 +83,7 @@ app.controller("memberCreateController", function($scope, $rootScope, $routePara // Check which kind of related data needs to be requested switch (related_data) { case 'universities': { - $scope.$parent.loading = { status: true, message: "Loading universities" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_UNIVERSITIES') }; // Load universities $universityService.list({ @@ -103,7 +103,7 @@ app.controller("memberCreateController", function($scope, $rootScope, $routePara case 'institutes': { if($scope.university_id){ if($scope.university_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading institutes" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_INSTITUTES') }; // Load related institutes $instituteService.listByUniversity($scope.university_id, { @@ -136,7 +136,7 @@ app.controller("memberCreateController", function($scope, $rootScope, $routePara case 'working_groups': { if($scope.institute_id){ if($scope.institute_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading working groups" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_WORKING_GROUPS') }; // Load related working groups $workingGroupService.listByInstitute($scope.institute_id, { diff --git a/public/member-client/js/controllers/member/deleteController.js b/public/member-client/js/controllers/member/deleteController.js index a75c45b..7df9529 100644 --- a/public/member-client/js/controllers/member/deleteController.js +++ b/public/member-client/js/controllers/member/deleteController.js @@ -22,7 +22,7 @@ app.controller("memberDeleteController", function($scope, $rootScope, $routePara * @return {[type]} [description] */ $scope.delete = function(){ - $scope.$parent.loading = { status: true, message: "Deleting committee member" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('DELETING_MEMBER') }; // Delete member $memberService.remove($scope.member.member_id) @@ -37,7 +37,7 @@ app.controller("memberDeleteController", function($scope, $rootScope, $routePara /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading committee member" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_MEMBER') }; $scope.input = ""; // Load member diff --git a/public/member-client/js/controllers/member/detailsController.js b/public/member-client/js/controllers/member/detailsController.js index ff26063..7519a86 100644 --- a/public/member-client/js/controllers/member/detailsController.js +++ b/public/member-client/js/controllers/member/detailsController.js @@ -32,7 +32,7 @@ app.controller("memberDetailsController", function($scope, $rootScope, $routePar /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading committee member" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_MEMBER') }; $scope.authenticated_member = $authenticationService.get(); // Load member diff --git a/public/member-client/js/controllers/member/editController.js b/public/member-client/js/controllers/member/editController.js index 3a4dc52..3124236 100644 --- a/public/member-client/js/controllers/member/editController.js +++ b/public/member-client/js/controllers/member/editController.js @@ -95,7 +95,7 @@ app.controller("memberEditController", function($scope, $rootScope, $routeParams // Check if passwords are equal, if it has been changed if($scope.updated_member.new_password){ if($scope.updated_member.password === $scope.repeated_password){ - $scope.$parent.loading = { status: true, message: "Saving member" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SAVING_MEMBER') }; // Update member $memberService.edit($routeParams.member_id, $scope.updated_member) @@ -107,10 +107,10 @@ app.controller("memberEditController", function($scope, $rootScope, $routeParams $window.alert(response.data); }); } else { - $window.alert("Your passwords are not equal!"); + $window.alert($filter('translate')('ALERT_PASSWORD_NOT_EQUAL')); } } else { - $scope.$parent.loading = { status: true, message: "Saving member" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SAVING_MEMBER') }; // Update member $memberService.edit($routeParams.member_id, $scope.updated_member) @@ -134,7 +134,7 @@ app.controller("memberEditController", function($scope, $rootScope, $routeParams // Check which kind of related data needs to be requested switch (related_data) { case 'universities': { - $scope.$parent.loading = { status: true, message: "Loading universities" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_UNIVERSITIES') }; // Load universities $universityService.list({ @@ -154,7 +154,7 @@ app.controller("memberEditController", function($scope, $rootScope, $routeParams case 'institutes': { if($scope.university_id){ if($scope.university_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading institutes" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_INSTITUTES') }; // Load related institutes $instituteService.listByUniversity($scope.university_id, { @@ -187,7 +187,7 @@ app.controller("memberEditController", function($scope, $rootScope, $routeParams case 'working_groups': { if($scope.institute_id){ if($scope.institute_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading working groups" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_WORKING_GROUPS') }; // Load related working groups $workingGroupService.listByInstitute($scope.institute_id, { diff --git a/public/member-client/js/controllers/member/listController.js b/public/member-client/js/controllers/member/listController.js index c401698..2f88712 100644 --- a/public/member-client/js/controllers/member/listController.js +++ b/public/member-client/js/controllers/member/listController.js @@ -138,7 +138,7 @@ app.controller("memberListController", function($scope, $rootScope, $filter, $tr /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading committee members" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_MEMBERS') }; $scope.authenticated_member = $authenticationService.get(); // Load members diff --git a/public/member-client/js/controllers/recoveryController.js b/public/member-client/js/controllers/recoveryController.js index e949874..1f6ab1f 100644 --- a/public/member-client/js/controllers/recoveryController.js +++ b/public/member-client/js/controllers/recoveryController.js @@ -26,7 +26,7 @@ app.controller("recoveryController", function($scope, $rootScope, $filter, $tran // Update UI $scope.recoveryForm.email_address.$pristine = false; } else { - $scope.$parent.loading = { status: true, message: "Searching for Email-address" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SEARCHING_FOR_EMAIL_ADDRESS') }; $recoveryService.findByEmail($scope.recovery.email_address) .then(function onSuccess(response) { @@ -34,13 +34,13 @@ app.controller("recoveryController", function($scope, $rootScope, $filter, $tran $scope.recovery.email_address = ""; // Show info - $window.alert("An email to reset your password was sent to you!"); + $window.alert($filter('translate')('ALERT_RESET_EMAIL_SENT')); // Redirect $scope.redirect("/"); }) .catch(function onError(response) { - $window.alert("The email-address could not be found!"); + $window.alert($filter('translate')('ALERT_EMAIL_ADDRESS_NOT_FOUND')); // Reset $scope.recoveryForm.email_address.$pristine = false; diff --git a/public/member-client/js/controllers/university/createController.js b/public/member-client/js/controllers/university/createController.js index 12ee6a4..80ad844 100644 --- a/public/member-client/js/controllers/university/createController.js +++ b/public/member-client/js/controllers/university/createController.js @@ -27,7 +27,7 @@ app.controller("universityCreateController", function($scope, $rootScope, $route // Update UI $scope.createCourseForm.university_name.$pristine = false; } else { - $scope.$parent.loading = { status: true, message: "Creating new university" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('CREATING_NEW_UNIVERSITY') }; // Create new University $universityService.create($scope.new_university) diff --git a/public/member-client/js/controllers/university/deleteController.js b/public/member-client/js/controllers/university/deleteController.js index f479ddf..4b6bc16 100644 --- a/public/member-client/js/controllers/university/deleteController.js +++ b/public/member-client/js/controllers/university/deleteController.js @@ -22,7 +22,7 @@ app.controller("universityDeleteController", function($scope, $rootScope, $route * @return {[type]} [description] */ $scope.delete = function(){ - $scope.$parent.loading = { status: true, message: "Deleting university" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('DELETING_UNIVERSITY') }; // Delete university $universityService.remove($scope.university.university_id) @@ -37,7 +37,7 @@ app.controller("universityDeleteController", function($scope, $rootScope, $route /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading university" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_UNIVERSITY') }; $scope.input = ""; // Load university diff --git a/public/member-client/js/controllers/university/detailsController.js b/public/member-client/js/controllers/university/detailsController.js index 3c5e65c..45a416a 100644 --- a/public/member-client/js/controllers/university/detailsController.js +++ b/public/member-client/js/controllers/university/detailsController.js @@ -64,7 +64,7 @@ app.controller("universityDetailsController", function($scope, $rootScope, $rout // Check which kind of related data needs to be requested switch (related_data) { case 'institutes': { - $scope.$parent.loading = { status: true, message: "Loading related institutes" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_RELATED_INSTITUTES') }; // Load related institutes $instituteService.listByUniversity($scope.university.university_id, $scope.filter) @@ -100,7 +100,7 @@ app.controller("universityDetailsController", function($scope, $rootScope, $rout break; } case 'members': { - $scope.$parent.loading = { status: true, message: "Loading related members" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_RELATED_MEMBERS') }; // Load related members $memberService.listByInstitute($scope.university.university_id, $scope.filter) @@ -136,7 +136,7 @@ app.controller("universityDetailsController", function($scope, $rootScope, $rout break; } case 'users': { - $scope.$parent.loading = { status: true, message: "Loading related users" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_RELATED_USERS') }; // Load related users $userService.listByInstitute($scope.university.university_id, $scope.filter) @@ -189,7 +189,7 @@ app.controller("universityDetailsController", function($scope, $rootScope, $rout /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading university" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_UNIVERSITY') }; // Filter $scope.filter = { diff --git a/public/member-client/js/controllers/university/editController.js b/public/member-client/js/controllers/university/editController.js index a98e914..c425819 100644 --- a/public/member-client/js/controllers/university/editController.js +++ b/public/member-client/js/controllers/university/editController.js @@ -27,7 +27,7 @@ app.controller("universityEditController", function($scope, $rootScope, $routePa // Update UI $scope.editUniversityForm.university_name.$pristine = false; } else { - $scope.$parent.loading = { status: true, message: "Saving university" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SAVING_UNIVERSITY') }; // Updating University $universityService.edit($routeParams.university_id, $scope.updated_university) @@ -44,7 +44,7 @@ app.controller("universityEditController", function($scope, $rootScope, $routePa /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading university" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_UNIVERSITY') }; // Load University $universityService.retrieve($routeParams.university_id) diff --git a/public/member-client/js/controllers/university/listController.js b/public/member-client/js/controllers/university/listController.js index d526492..66c054c 100644 --- a/public/member-client/js/controllers/university/listController.js +++ b/public/member-client/js/controllers/university/listController.js @@ -128,7 +128,7 @@ app.controller("universityListController", function($scope, $rootScope, $filter, /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading universities" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_UNIVERSITIES') }; // Load universities $scope.filter = $universityService.getCachedFilter(); diff --git a/public/member-client/js/controllers/user/createController.js b/public/member-client/js/controllers/user/createController.js index 87950d2..25eea2c 100644 --- a/public/member-client/js/controllers/user/createController.js +++ b/public/member-client/js/controllers/user/createController.js @@ -45,7 +45,7 @@ app.controller("userCreateController", function($scope, $rootScope, $routeParams $scope.createUserForm.institute_id.$pristine = false; $scope.createUserForm.blocked.$pristine = false; } else { - $scope.$parent.loading = { status: true, message: "Creating new user" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('CREATING_NEW_USER') }; // Create new user $userService.create($scope.new_user) @@ -70,7 +70,7 @@ app.controller("userCreateController", function($scope, $rootScope, $routeParams // Check which kind of related data needs to be requested switch (related_data) { case 'universities': { - $scope.$parent.loading = { status: true, message: "Loading universities" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_UNIVERSITIES') }; // Load universities $universityService.list({ @@ -90,7 +90,7 @@ app.controller("userCreateController", function($scope, $rootScope, $routeParams case 'institutes': { if($scope.university_id){ if($scope.university_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading institutes" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_INSTITUTES') }; // Load related institutes $instituteService.listByUniversity($scope.university_id, { diff --git a/public/member-client/js/controllers/user/deleteController.js b/public/member-client/js/controllers/user/deleteController.js index 8f24516..e17b33b 100644 --- a/public/member-client/js/controllers/user/deleteController.js +++ b/public/member-client/js/controllers/user/deleteController.js @@ -22,7 +22,7 @@ app.controller("userDeleteController", function($scope, $rootScope, $routeParams * @return {[type]} [description] */ $scope.delete = function(){ - $scope.$parent.loading = { status: true, message: "Deleting user" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('DELETING_USER') }; // Delete user $userService.remove($scope.user.user_id) @@ -37,7 +37,7 @@ app.controller("userDeleteController", function($scope, $rootScope, $routeParams /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading user" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_USER') }; $scope.input = ""; // Load user diff --git a/public/member-client/js/controllers/user/detailsController.js b/public/member-client/js/controllers/user/detailsController.js index 6702f45..1124733 100644 --- a/public/member-client/js/controllers/user/detailsController.js +++ b/public/member-client/js/controllers/user/detailsController.js @@ -50,7 +50,7 @@ app.controller("userDetailsController", function($scope, $rootScope, $routeParam // Check which kind of related data needs to be requested switch (related_data) { case 'documents': { - $scope.$parent.loading = { status: true, message: "Loading related documents" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_RELATED_DOCUMENTS') }; // Load related documents $documentsService.listByUser($scope.user.user_id, $scope.filter) @@ -101,7 +101,7 @@ app.controller("userDetailsController", function($scope, $rootScope, $routeParam /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading user" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_USER') }; // Filter $scope.filter = { diff --git a/public/member-client/js/controllers/user/editController.js b/public/member-client/js/controllers/user/editController.js index 112327a..539af55 100644 --- a/public/member-client/js/controllers/user/editController.js +++ b/public/member-client/js/controllers/user/editController.js @@ -45,7 +45,7 @@ app.controller("userEditController", function($scope, $rootScope, $routeParams, $scope.editUserForm.institute_id.$pristine = false; $scope.editUserForm.blocked.$pristine = false; } else { - $scope.$parent.loading = { status: true, message: "Saving user" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SAVING_USER') }; // Updating user $userService.edit($routeParams.user_id, $scope.updated_user) @@ -69,7 +69,7 @@ app.controller("userEditController", function($scope, $rootScope, $routeParams, // Check which kind of related data needs to be requested switch (related_data) { case 'universities': { - $scope.$parent.loading = { status: true, message: "Loading universities" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_UNIVERSITIES') }; // Load universities $universityService.list({ @@ -89,7 +89,7 @@ app.controller("userEditController", function($scope, $rootScope, $routeParams, case 'institutes': { if($scope.university_id){ if($scope.university_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading institutes" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_INSTITUTES') }; // Load related institutes $instituteService.listByUniversity($scope.university_id, { @@ -125,7 +125,7 @@ app.controller("userEditController", function($scope, $rootScope, $routeParams, /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading user" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_USER') }; // Load user $userService.retrieve($routeParams.user_id) diff --git a/public/member-client/js/controllers/user/listController.js b/public/member-client/js/controllers/user/listController.js index 864b914..acbc081 100644 --- a/public/member-client/js/controllers/user/listController.js +++ b/public/member-client/js/controllers/user/listController.js @@ -138,7 +138,7 @@ app.controller("userListController", function($scope, $rootScope, $filter, $tran /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading users" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_USERS') }; // Load users $scope.filter = $userService.getCachedFilter(); diff --git a/public/member-client/js/controllers/working_group/createController.js b/public/member-client/js/controllers/working_group/createController.js index 3182ce3..c42d00e 100644 --- a/public/member-client/js/controllers/working_group/createController.js +++ b/public/member-client/js/controllers/working_group/createController.js @@ -29,7 +29,7 @@ app.controller("workingGroupCreateController", function($scope, $rootScope, $rou $scope.createWorkingGroupForm.institute_id.$pristine = false; $scope.createWorkingGroupForm.university_id.$pristine = false; } else { - $scope.$parent.loading = { status: true, message: "Creating new working group" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('CREATING_NEW_WORKING_GROUP') }; // Create new working group $workingGroupService.create($scope.new_working_group) @@ -54,7 +54,7 @@ app.controller("workingGroupCreateController", function($scope, $rootScope, $rou // Check which kind of related data needs to be requested switch (related_data) { case 'universities': { - $scope.$parent.loading = { status: true, message: "Loading universities" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_UNIVERSITIES') }; // Load universities $universityService.list({ @@ -74,7 +74,7 @@ app.controller("workingGroupCreateController", function($scope, $rootScope, $rou case 'institutes': { if($scope.university_id){ if($scope.university_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading institutes" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_INSTITUTES') }; // Load related institutes $instituteService.listByUniversity($scope.university_id, { diff --git a/public/member-client/js/controllers/working_group/deleteController.js b/public/member-client/js/controllers/working_group/deleteController.js index 343a573..bf6717a 100644 --- a/public/member-client/js/controllers/working_group/deleteController.js +++ b/public/member-client/js/controllers/working_group/deleteController.js @@ -22,7 +22,7 @@ app.controller("workingGroupDeleteController", function($scope, $rootScope, $rou * @return {[type]} [description] */ $scope.delete = function(){ - $scope.$parent.loading = { status: true, message: "Deleting working group" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('DELETING_WORKING_GROUP') }; // Delete working group $workingGroupService.remove($scope.working_group.working_group_id) @@ -38,7 +38,7 @@ app.controller("workingGroupDeleteController", function($scope, $rootScope, $rou /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading working group" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_WORKING_GROUP') }; $scope.input = ""; // Load university diff --git a/public/member-client/js/controllers/working_group/detailsController.js b/public/member-client/js/controllers/working_group/detailsController.js index 654beeb..c70ccb3 100644 --- a/public/member-client/js/controllers/working_group/detailsController.js +++ b/public/member-client/js/controllers/working_group/detailsController.js @@ -52,7 +52,7 @@ app.controller("workingGroupDetailsController", function($scope, $rootScope, $ro // Check which kind of related data needs to be requested switch (related_data) { case 'members': { - $scope.$parent.loading = { status: true, message: "Loading related members" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_RELATED_MEMBERS') }; // Load related members $memberService.listByWorkingGroup($scope.working_group.working_group_id, $scope.filter) @@ -104,7 +104,7 @@ app.controller("workingGroupDetailsController", function($scope, $rootScope, $ro /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading working group" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_WORKING_GROUP') }; // Filter $scope.filter = { diff --git a/public/member-client/js/controllers/working_group/editController.js b/public/member-client/js/controllers/working_group/editController.js index c8d2c3f..61d5769 100644 --- a/public/member-client/js/controllers/working_group/editController.js +++ b/public/member-client/js/controllers/working_group/editController.js @@ -39,7 +39,7 @@ app.controller("workingGroupEditController", function($scope, $rootScope, $route // Check which kind of related data needs to be requested switch (related_data) { case 'universities': { - $scope.$parent.loading = { status: true, message: "Loading universities" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_UNIVERSITIES') }; // Load universities $universityService.list({ @@ -59,7 +59,7 @@ app.controller("workingGroupEditController", function($scope, $rootScope, $route case 'institutes': { if($scope.university_id){ if($scope.university_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading institutes" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_INSTITUTES') }; // Load related institutes $instituteService.listByUniversity($scope.university_id, { @@ -102,7 +102,7 @@ app.controller("workingGroupEditController", function($scope, $rootScope, $route // Update UI $scope.editWorkingGroupForm.working_group_name.$pristine = false; } else { - $scope.$parent.loading = { status: true, message: "Saving working group" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SAVING_WORKING_GROUP') }; // Updating working group $workingGroupService.edit($routeParams.working_group_id, $scope.updated_working_group) @@ -119,7 +119,7 @@ app.controller("workingGroupEditController", function($scope, $rootScope, $route /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading working group" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_WORKING_GROUP') }; // Load working group $workingGroupService.retrieve($routeParams.working_group_id) diff --git a/public/member-client/js/controllers/working_group/listController.js b/public/member-client/js/controllers/working_group/listController.js index a0757a7..a0639ce 100644 --- a/public/member-client/js/controllers/working_group/listController.js +++ b/public/member-client/js/controllers/working_group/listController.js @@ -137,7 +137,7 @@ app.controller("workingGroupListController", function($scope, $rootScope, $filte /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading working groups" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_WORKING_GROUPS') }; // Load working groups $scope.filter = $workingGroupService.getCachedFilter(); diff --git a/public/member-client/js/modules/languages.js b/public/member-client/js/modules/languages.js index 6fb1b16..252dfc6 100644 --- a/public/member-client/js/modules/languages.js +++ b/public/member-client/js/modules/languages.js @@ -75,7 +75,6 @@ app.config(function ($translateProvider) { YEAR_ASC: 'Year ascending', YEAR_DESC: 'Year descending', - DELETE_THIS_DOCUMENT: 'Do you really want to delete this document', EXPLANATION_OF_DELETING_A_DOCUMENT: 'Deleting a document also deletes ALL ASSOCIATED data. PLEASE PROCEED WITH CAUTION!', PLEASE_TYPE_IN_THE_TITLE_OF_THE_DOCUMENT_TO_CONFIRM: 'Please type in the title of the document to confirm', @@ -163,7 +162,7 @@ app.config(function ($translateProvider) { CURRENT_STATUS: 'Current status', CHANGE_STATUS: 'Change status', NEW_STATUS: 'New status', - + PROVIDED_TO_PARTICIPANTS_AFTER_STUDY:'(provided to participants after the study)', TO_BE_FILLED_OUT_BY_PARTICIPANT:'(to be filled out by each participant)', SIGN_BY_YOURSELF:'(sign by yourself and add to archive)', @@ -248,8 +247,8 @@ app.config(function ($translateProvider) { SUBMIT_WARNING: 'You are about to finally submit your Proposal for review by the Ethics-Committee. Please be aware that after this step the Study cannot be changed or modified anymore, until a revised version is requested by the Ethics-Committee.', DOCUMENT_FILES: 'Download the associated Files', - - + + YES: 'yes', NO: 'no', EXPLANATION: 'Explanation', @@ -441,6 +440,86 @@ app.config(function ($translateProvider) { CHANGE_PASSWORD: 'Change password', DO_NOT_CHANGE_PASSWORD: 'Do not change password', + CREATING_NEW_MEMBER: 'Creating new committee member', + SAVING_MEMBER: 'Saving committee member', + DELETING_MEMBER: 'Deleting committee member', + + CREATING_NEW_USER: 'Creating new user', + SAVING_USER: 'Saving user', + DELETING_USER: 'Deleting user', + + CREATING_NEW_DOCUMENT: 'Creating new document', + SAVING_DOCUMENT: 'Saving document', + DELETING_DOCUMENT: 'Deleting document', + + CREATING_NEW_COURSE: 'Creating new course', + SAVING_COURSE: 'Saving course', + DELETING_COURSE: 'Deleting course', + + CREATING_NEW_UNIVERSITY: 'Creating new university', + SAVING_UNIVERSITY: 'Saving university', + DELETING_UNIVERSITY: 'Deleting university', + + CREATING_NEW_INSTITUTE: 'Creating new institute', + SAVING_INSTITUTE: 'Saving institute', + DELETING_INSTITUTE: 'Deleting institute', + + CREATING_NEW_WORKING_GROUP: 'Creating new working group', + SAVING_WORKING_GROUP: 'Saving working group', + DELETING_WORKING_GROUP: 'Deleting working group', + + LOADING_APPLICATION: 'Loading application', + LOGGING_IN: 'Logging in', + AUTO_SAVING: 'Auto saving', + + LOADING_DOCUMENT: 'Loading document', + LOADING_DOCUMENTS: 'Loading documents', + LOADING_RELATED_DOCUMENTS: 'Loading related documents', + LOADING_MEMBER: 'Loading committe member', + LOADING_MEMBERS: 'Loading committe members', + LOADING_RELATED_MEMBERS: 'Loading related committe members', + LOADING_USER: 'Loading user', + LOADING_USERS: 'Loading users', + LOADING_RELATED_USERS: 'Loading related users', + LOADING_COURSE: 'Loading course', + LOADING_COURSES: 'Loading courses', + LOADING_RELATED_COURSES: 'Loading related courses', + LOADING_UNIVERSITY: 'Loading university', + LOADING_UNIVERSITIES: 'Loading universities', + LOADING_INSTITUTE: 'Loading institute', + LOADING_INSTITUTES: 'Loading institutes', + LOADING_RELATED_INSTITUTES: 'Loading related institutes', + LOADING_WORKING_GROUP: 'Loading working group', + LOADING_WORKING_GROUPS: 'Loading working groups', + LOADING_RELATED_WORKING_GROUPS: 'Loading related working groups', + LOADING_REVISIONS: 'Loading revisions', + LOADING_SUBMISSION: 'Loading submission', + LOADING_OVERVIEW: 'Loading overview', + LOADING_REVIEW: 'Loading review', + LOADING_ACCOUNT_SETTINGS: 'Loading account settings', + + INITIALISING_NEW_DOCUMENT: 'Initialising new document', + CHECKING_AUTHENTICATION: 'Checking authentication', + + SAVING_ACCOUNT_SETTINGS: 'Saving account settings', + SAVING_NOTES: 'Saving notes', + SAVING_REVIEW: 'Saving review', + PUBLISHING_REVIEW: 'Publishing review', + UPDATING_REVIEWER: 'Updating reviewer', + SEARCHING_FOR_EMAIL_ADDRESS: 'Searching for Email-address', + SEARCHING_FOR_USER: 'Searching for user', + GENERATING_FILES: 'Generating files', + SUBMITTING_DOCUMENT: 'Submitting document', + + ALERT_SIGN_UP_SUCCESSFULL: 'You have successfully signed up, you can now create your document!', + ALERT_PASSWORD_NOT_EQUAL: 'Your passwords are not equal!', + ALERT_RESET_EMAIL_SENT: 'An email to reset your password was sent to you!', + ALERT_RECOVERY_EMAIL_SENT: 'An email with your document-IDs was sent to you!', + ALERT_EMAIL_ADDRESS_NOT_FOUND: 'The email-address could not be found!', + ALERT_DOCUMENT_CREATED: 'Your new document has been created and an email with the document-ID has been sent to you!', + ALERT_SUBMIT_DOCUMENT_FAILED: 'Your document can not be submitted, please fill out all required fields!', + ALERT_FILE_GENERATION_FAILED: 'Files can only be generated, if the document has been accepted!', + }); // Default Language (English) diff --git a/public/member-client/js/templates/help.html b/public/member-client/js/templates/help.html index 992df72..92c4d23 100644 --- a/public/member-client/js/templates/help.html +++ b/public/member-client/js/templates/help.html @@ -12,9 +12,16 @@ -
- General - FAQ - Troubleshooting +
+

Troubleshooting:

+
+ I forgot my password, what should I do?
+ Please click on the "Forgot your password?" button on the login page.
+
+ The App does not work!
+ If you encounter any problems with the Ethics-App, please contact us directly and we will look into the problem.
+
+

Contact:


+ If you experience any difficulties with the Ethics-App please contact us at webteam@uni-muenster.de.
Please refer to "[Ethics-App] - Problem with ________ " in the Subject Line.
diff --git a/public/member-client/js/templates/manual.html b/public/member-client/js/templates/manual.html index a4aedc5..b8e0271 100644 --- a/public/member-client/js/templates/manual.html +++ b/public/member-client/js/templates/manual.html @@ -16,46 +16,81 @@

Important Questions to be asked during review:

-
-
    -
  1. General questions:
    - -

  2. -
  3. - If obtaining an Informed Consent Form is impossible or not feasible the procedure can still be ethical if the research cannot be reasonably assumed to create distress or harm and
    -
      -
    1. takes place in an education setting to study classroom management methods, educational practices, job/organisational effectiveness; or
    2. -
    3. involves only archival research, public observations without collecting identifiable personal information, or anonymous questionnaires (e.g. big data studies, street surveys).
    4. -
    -
  4. +
      +
    1. + General questions: +
      +
        +
      • + Are the participants likely to leave the study in the same (or better) mood that they started it in? If their wellbeing is compromised during the study, are the suggested debriefing procedures likely to ensure that the participant + does not leave the procedure distressed, sad, anxious or unhappy? If not - identify the main causes of distress and suggest substitution. If substitution is impossible, providing an explicit opportunity to stop and quit the study + during critical moments can be a solution. +
      • +
      • + Are all participants (e.g. across all experimental groups) treated with the same level of ethical awareness and subject to the same risks? Is there a possibility that members of one particular experimental group leave the study at + a worse mood than the others? If levels of safety need to be raised they should typically be raised equally for all groups to ensure comparable study conditions. +
      • +
      +
    2. +
      +
    3. + If obtaining an Informed Consent Form is impossible or not feasible the procedure can still be ethical if the research cannot be reasonably assumed to create distress or harm and +
      +
        +
      1. + takes place in an education setting to study classroom management methods, educational practices, job/organisational effectiveness; or +
      2. +
      3. + involves only archival research, public observations without collecting identifiable personal information, or anonymous questionnaires (e.g. big data studies, street surveys). +
      4. +
      +
    4. +
      +
    5. + If deception is involved: +
      +
        +
      • + can the study be conducted without deception? (if yes - always preferred) +
      • +
      • + can the deception cause strong psychological distress? (if yes - unethical) +
      • +
      • + is the deception explained and disclosed as soon as possible after the data collection? +
      • +
      • + is the participant informed before and after the study about the right to withdraw at any point? +
      • +
      • + after the study, is the participant informed that even if retracting own data he/she will still be paid for participation (if payment applicable)? +
      • +
      +
    6. +
      +
    7. + If other live observers are present who are invisible to the participant: +
      +
        +
      • + unethical w.r.t. German Psychological Society (DGP) ethics conduct; +
      • +
      • + potentially allowed by other standards if the study takes place in a public area/situation; +
      • +
      • + potentially allowed by DGP in exceptional cases (where the experiment is impossible to conduct otherwise) but the information must be provided at debriefing and the payment must still be given even if data is retracted; +
      • +
      • + otherwise the participant must be told about the presence of other live observers. +
      • +
      +
    8. +

    -
  5. - If deception is involved:
    - -

  6. -
  7. If other live observers are present who are invisible to the participant:
    - -
  8. -
-
-
- +

Different Document Status:

@@ -66,7 +101,7 @@

Name in Member Client Name in User Client Description - @@ -75,13 +110,13 @@

- {{ 'INITIALISED' | translate }} - + {{ 'INITIALISED' | translate }} + - {{ 'INITIALISED' | translate }} - + {{ 'INITIALISED' | translate }} + The Document has been created but the User has not yet provided any information. @@ -93,13 +128,13 @@

- {{ 'UNSUBMITTED' | translate }} - + {{ 'UNSUBMITTED' | translate }} + - {{ 'UNSUBMITTED_IN_PROGRESS' | translate }} - + {{ 'UNSUBMITTED_IN_PROGRESS' | translate }} + The Document has been created and the User is currently filling out the required forms. @@ -111,13 +146,13 @@

- {{ 'AUTO_ACCEPTED' | translate }} - + {{ 'AUTO_ACCEPTED' | translate }} + - {{ 'REVIEWED_ACCEPTED' | translate }} - + {{ 'REVIEWED_ACCEPTED' | translate }} + The Document has been submitted by the user and automatically accepted by the System as it stated to pose no ethical concerns. @@ -129,16 +164,16 @@

- {{ 'REVIEW_REQUIRED' | translate }} - + {{ 'REVIEW_REQUIRED' | translate }} + - {{ 'REVIEW_REQUESTED' | translate }} - + {{ 'REVIEW_REQUESTED' | translate }} + - The Document has been submitted by the user and there is need for a manual review of the Study by a Ethics Committee Member. The Review has not yet been started. + The Document has been submitted by the user and there is need for a manual review of the Study by a Ethics Committee Member. The Review has not yet been started. @@ -147,16 +182,16 @@

- {{ 'REVIEW_IN_PROGRESS' | translate }} - + {{ 'REVIEW_IN_PROGRESS' | translate }} + - {{ 'UNDER_REVIEW' | translate }} - + {{ 'UNDER_REVIEW' | translate }} + - The Document is currently being reviewed by a Member of the Ethics Committee. + The Document is currently being reviewed by a Member of the Ethics Committee. @@ -165,16 +200,16 @@

- {{ 'PARTLY_ACCEPTED' | translate }} - + {{ 'PARTLY_ACCEPTED' | translate }} + - {{ 'REVIEWED_PARTLY_ACCEPTED' | translate }} - + {{ 'REVIEWED_PARTLY_ACCEPTED' | translate }} + - The Review concluded that the study has one or more unadressed ethical concerns and needs to be revised by the user. The User will have to modify the study accordingly and needs to submit it for review again. + The Review concluded that the study has one or more unadressed ethical concerns and needs to be revised by the user. The User will have to modify the study accordingly and needs to submit it for review again. @@ -183,16 +218,16 @@

- {{ 'ACCEPTED' | translate }} - + {{ 'ACCEPTED' | translate }} + - {{ 'REVIEWED_ACCEPTED' | translate }} - + {{ 'REVIEWED_ACCEPTED' | translate }} + - The Study has been reviewed by a Committee Member and has been deemed free of unadressed ethical concerns. The User is now able to download the Documents. + The Study has been reviewed by a Committee Member and has been deemed free of unadressed ethical concerns. The User is now able to download the Documents. @@ -201,16 +236,16 @@

- {{ 'REJECTED' | translate }} - + {{ 'REJECTED' | translate }} + - {{ 'REVIEWED_REJECTED' | translate }} - + {{ 'REVIEWED_REJECTED' | translate }} + - The study has been deemed ethically unacceptable and no ethical approval is granted. The User is not allowed to modify the study anymore as even with modification the study would not adhere to ethical standards. + The study has been deemed ethically unacceptable and no ethical approval is granted. The User is not allowed to modify the study anymore as even with modification the study would not adhere to ethical standards. @@ -219,8 +254,8 @@

Study Proposal Lifecycle:

- - + + diff --git a/public/member-client/js/templates/member/details.html b/public/member-client/js/templates/member/details.html index a6b59be..0c6967f 100644 --- a/public/member-client/js/templates/member/details.html +++ b/public/member-client/js/templates/member/details.html @@ -83,7 +83,9 @@

- {{ 'OFFICE' | translate }}: {{member.office_room_number}} + + {{ 'OFFICE' | translate }}: {{member.office_room_number}} +
diff --git a/public/user-client/js/controllers/account/editController.js b/public/user-client/js/controllers/account/editController.js index e5fdc97..e256010 100644 --- a/public/user-client/js/controllers/account/editController.js +++ b/public/user-client/js/controllers/account/editController.js @@ -39,7 +39,7 @@ app.controller("accountEditController", function($scope, $rootScope, $filter, $t $scope.editAccountForm.last_name.$pristine = false; $scope.editAccountForm.institute_id.$pristine = false; } else { - $scope.$parent.loading = { status: true, message: "Saving account settings" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SAVING_ACCOUNT_SETTINGS') }; $userService.edit($authenticationService.getId(), $scope.updated_user) .then(function onSuccess(response) { @@ -69,7 +69,7 @@ app.controller("accountEditController", function($scope, $rootScope, $filter, $t // Check which kind of related data needs to be requested switch (related_data) { case 'universities': { - $scope.$parent.loading = { status: true, message: "Loading universities" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_UNIVERSITIES') }; // Load universities $universityService.list({ @@ -89,7 +89,7 @@ app.controller("accountEditController", function($scope, $rootScope, $filter, $t case 'institutes': { if($scope.university_id){ if($scope.university_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading institutes" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_INSTITUTES') }; // Load related institutes $instituteService.listByUniversity($scope.university_id, { @@ -124,7 +124,7 @@ app.controller("accountEditController", function($scope, $rootScope, $filter, $t /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading account settings" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_ACCOUNT_SETTINGS') }; $scope.authenticated_user = $authenticationService.get(); $scope.updated_user = $authenticationService.copy(); diff --git a/public/user-client/js/controllers/document/createController.js b/public/user-client/js/controllers/document/createController.js index 1e629fb..2b3d8f0 100644 --- a/public/user-client/js/controllers/document/createController.js +++ b/public/user-client/js/controllers/document/createController.js @@ -46,7 +46,7 @@ app.controller("documentCreateController", function($scope, $rootScope, $filter, $scope.createDocumentForm.document_email_address.$pristine = false; $scope.createDocumentForm.course_id.$pristine = false; } else { - $scope.$parent.loading = { status: true, message: "Searching for user" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SEARCHING_FOR_USER') }; $timeout(function () { // Check if user exists @@ -55,12 +55,12 @@ app.controller("documentCreateController", function($scope, $rootScope, $filter, // Check if user was found if(JSON.parse(response.data)){ $timeout(function() { - $scope.$parent.loading = { status: true, message: "Creating new document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('CREATING_NEW_DOCUMENT') }; // Create new document $documentService.create($scope.new_document) .then(function onSuccess(response) { - $window.alert("Your new document has been created and an email with the document-ID has been sent to you!"); + $window.alert($filter('translate')('ALERT_DOCUMENT_CREATED')); // Redirect $scope.redirect("/"); @@ -100,12 +100,12 @@ app.controller("documentCreateController", function($scope, $rootScope, $filter, $scope.createUserForm.university_id.$pristine = false; $scope.createUserForm.institute_id.$pristine = false; } else { - $scope.$parent.loading = { status: true, message: "Creating new user" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('CREATING_NEW_USER') }; // Create new user $userService.create($scope.new_user) .then(function onSuccess(response) { - $window.alert("You have successfully signed up, you can now create your document!"); + $window.alert($filter('translate')('ALERT_SIGN_UP_SUCCESSFULL')); // Change tab to send the new document again $scope.new_document.email_address = $scope.new_user.email_address || ""; @@ -130,7 +130,7 @@ app.controller("documentCreateController", function($scope, $rootScope, $filter, // Check which kind of related data needs to be requested switch (related_data) { case 'universities': { - $scope.$parent.loading = { status: true, message: "Loading universities" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_UNIVERSITIES') }; // Load universities $universityService.list({ @@ -150,7 +150,7 @@ app.controller("documentCreateController", function($scope, $rootScope, $filter, case 'institutes': { if($scope.university_id){ if($scope.university_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading institutes" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_INSTITUTES') }; // Load related institutes $instituteService.listByUniversity($scope.university_id, { @@ -184,7 +184,7 @@ app.controller("documentCreateController", function($scope, $rootScope, $filter, /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Initialising new document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('INITIALISING_NEW_DOCUMENT') }; $scope.new_document = $documentService.init(); $scope.new_user = $userService.init(); diff --git a/public/user-client/js/controllers/document/deleteController.js b/public/user-client/js/controllers/document/deleteController.js index 48b4ef1..b2d9443 100644 --- a/public/user-client/js/controllers/document/deleteController.js +++ b/public/user-client/js/controllers/document/deleteController.js @@ -30,7 +30,7 @@ app.controller("documentDeleteController", function($scope, $rootScope, $filter, * @return {[type]} [description] */ $scope.delete = function(){ - $scope.$parent.loading = { status: true, message: "Deleting document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('DELETING_DOCUMENT') }; $documentService.delete($documentService.getId()) .then(function onSuccess(response) { @@ -51,7 +51,7 @@ app.controller("documentDeleteController", function($scope, $rootScope, $filter, /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_DOCUMENT') }; $scope.input = ""; $scope.document = $documentService.get(); $scope.$parent.loading = { status: false, message: "" }; diff --git a/public/user-client/js/controllers/document/detailsController.js b/public/user-client/js/controllers/document/detailsController.js index 9b21adf..33bf01b 100644 --- a/public/user-client/js/controllers/document/detailsController.js +++ b/public/user-client/js/controllers/document/detailsController.js @@ -23,21 +23,21 @@ app.controller("documentDetailsController", function($scope, $rootScope, $routeP *************************************************/ $timeout(function(){ - $scope.$parent.loading = { status: true, message: "Check authentication" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('CHECKING_AUTHENTICATION') }; $timeout(function(){ // Authentication $authenticationService.loginByDocumentId($routeParams.document_id) .then(function onSuccess(response) { $authenticationService.set(response.data); - $scope.$parent.loading = { status: true, message: "Loading document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_DOCUMENT') }; $timeout(function(){ // Load document $documentService.retrieve($routeParams.document_id) .then(function onSuccess(response) { $documentService.set(response.data); - $scope.$parent.loading = { status: true, message: "Loading revisions" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_REVISIONS') }; $timeout(function(){ // Load revisions @@ -135,7 +135,7 @@ app.controller("documentDetailsController", function($scope, $rootScope, $routeP // Update navbar $scope.$parent.authenticated_user = $authenticationService.get(); $scope.$parent.document = $documentService.get(); - $scope.$parent.loading = { status: true, message: "Generating files" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('GENERATING_FILES') }; // Check status of document to generate files if($documentService.getStatus()===2 || $documentService.getStatus()===6){ diff --git a/public/user-client/js/controllers/document/editController.js b/public/user-client/js/controllers/document/editController.js index dc5218c..90259fc 100644 --- a/public/user-client/js/controllers/document/editController.js +++ b/public/user-client/js/controllers/document/editController.js @@ -40,7 +40,7 @@ app.controller("documentEditController", function($scope, $rootScope, $filter, $ * @return {[type]} [description] */ $scope.saveDocument = function(tab){ - $scope.$parent.loading = { status: true, message: "Auto saving" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('AUTO_SAVING') }; var save_descriptions = $q.defer(); var save_concerns = $q.defer(); @@ -185,9 +185,9 @@ app.controller("documentEditController", function($scope, $rootScope, $filter, $ $scope.editDocumentForm.q13_explanation.$pristine = false; } - $window.alert("Your document can not be submitted, please fill out all required fields"); + $window.alert($filter('translate')('ALERT_SUBMIT_DOCUMENT_FAILED')); } else { - $scope.$parent.loading = { status: true, message: "Submitting document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SUBMITTING_DOCUMENT') }; // Submit document $documentService.submit($documentService.getId()) diff --git a/public/user-client/js/controllers/document/editSettingsController.js b/public/user-client/js/controllers/document/editSettingsController.js index 635df20..915700e 100644 --- a/public/user-client/js/controllers/document/editSettingsController.js +++ b/public/user-client/js/controllers/document/editSettingsController.js @@ -30,7 +30,7 @@ app.controller("documentEditSettingsController", function($scope, $rootScope, $f * @return {[type]} [description] */ $scope.save = function(){ - $scope.$parent.loading = { status: true, message: "Saving document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SAVING_DOCUMENT') }; $documentService.edit($documentService.getId(), $scope.updated_document) .then(function onSuccess(response) { @@ -57,7 +57,7 @@ app.controller("documentEditSettingsController", function($scope, $rootScope, $f // Check which kind of related data needs to be requested switch (related_data) { case 'universities': { - $scope.$parent.loading = { status: true, message: "Loading universities" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_UNIVERSITIES') }; // Load universities $universityService.list({ @@ -77,7 +77,7 @@ app.controller("documentEditSettingsController", function($scope, $rootScope, $f case 'institutes': { if($scope.university_id){ if($scope.university_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading institutes" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_INSTITUTES') }; // Load related institutes $instituteService.listByUniversity($scope.university_id, { @@ -109,7 +109,7 @@ app.controller("documentEditSettingsController", function($scope, $rootScope, $f case 'courses': { if($scope.institute_id){ if($scope.institute_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading courses" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_COURSES') }; // Load related courses $courseService.listByInstitute($scope.institute_id, { @@ -162,7 +162,7 @@ app.controller("documentEditSettingsController", function($scope, $rootScope, $f /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_DOCUMENT') }; $scope.document = $documentService.get(); $scope.updated_document = $documentService.copy(); diff --git a/public/user-client/js/controllers/document/reviseController.js b/public/user-client/js/controllers/document/reviseController.js index 87c0a3e..0401752 100644 --- a/public/user-client/js/controllers/document/reviseController.js +++ b/public/user-client/js/controllers/document/reviseController.js @@ -148,7 +148,7 @@ app.controller("documentReviseController", function($scope, $rootScope, $filter, * @return {[type]} [description] */ $scope.saveDocument = function(tab){ - $scope.$parent.loading = { status: true, message: "Auto saving" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('AUTO_SAVING') }; var save_descriptions = $q.defer(); var save_concerns = $q.defer(); @@ -296,9 +296,9 @@ app.controller("documentReviseController", function($scope, $rootScope, $filter, $scope.editDocumentForm.q13_explanation.$pristine = false; } - $window.alert("Your document can not be submitted, please fill out all required fields"); + $window.alert($filter('translate')('ALERT_SUBMIT_DOCUMENT_FAILED')); } else { - $scope.$parent.loading = { status: true, message: "Submitting document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SUBMITTING_DOCUMENT') }; // Submit document $documentService.submit($documentService.getId()) diff --git a/public/user-client/js/controllers/document/showIdController.js b/public/user-client/js/controllers/document/showIdController.js index b25cf8d..c50d1b4 100644 --- a/public/user-client/js/controllers/document/showIdController.js +++ b/public/user-client/js/controllers/document/showIdController.js @@ -47,7 +47,7 @@ app.controller("documentShowIdController", function($scope, $rootScope, $filter, /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_DOCUMENT') }; $scope.document = $documentService.get(); $scope.$parent.loading = { status: false, message: "" }; }); diff --git a/public/user-client/js/controllers/document/showIntroController.js b/public/user-client/js/controllers/document/showIntroController.js index 2f40867..436484c 100644 --- a/public/user-client/js/controllers/document/showIntroController.js +++ b/public/user-client/js/controllers/document/showIntroController.js @@ -39,7 +39,7 @@ app.controller("documentShowIntroController", function($scope, $rootScope, $rout * @return {[type]} [description] */ $scope.send = function(){ - $scope.$parent.loading = { status: true, message: "Auto saving" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('AUTO_SAVING') }; if($documentService.getStatus()===0){ // Confirm intro @@ -68,7 +68,7 @@ app.controller("documentShowIntroController", function($scope, $rootScope, $rout * @return {[type]} [description] */ $scope.save = function(){ - $scope.$parent.loading = { status: true, message: "Saving document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SAVING_DOCUMENT') }; // Save document $documentService.edit($routeParams.document_id, $scope.updated_document) @@ -100,7 +100,7 @@ app.controller("documentShowIntroController", function($scope, $rootScope, $rout // Check which kind of related data needs to be requested switch (related_data) { case 'universities': { - $scope.$parent.loading = { status: true, message: "Loading universities" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_UNIVERSITIES') }; // Load universities $universityService.list({ @@ -120,7 +120,7 @@ app.controller("documentShowIntroController", function($scope, $rootScope, $rout case 'institutes': { if($scope.university_id){ if($scope.university_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading institutes" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_INSTITUTES') }; // Load related institutes $instituteService.listByUniversity($scope.university_id, { @@ -153,7 +153,7 @@ app.controller("documentShowIntroController", function($scope, $rootScope, $rout case 'courses': { if($scope.institute_id){ if($scope.institute_id !== null){ - $scope.$parent.loading = { status: true, message: "Loading courses" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_COURSES') }; // Load related courses $courseService.listByInstitute($scope.institute_id, { @@ -206,7 +206,7 @@ app.controller("documentShowIntroController", function($scope, $rootScope, $rout /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_DOCUMENT') }; $scope.document = $documentService.get(); $scope.updated_document = $documentService.copy($scope.document); $scope.authenticated_user = $authenticationService.get(); diff --git a/public/user-client/js/controllers/document/showSubmissionController.js b/public/user-client/js/controllers/document/showSubmissionController.js index 14c29bc..a45bfde 100644 --- a/public/user-client/js/controllers/document/showSubmissionController.js +++ b/public/user-client/js/controllers/document/showSubmissionController.js @@ -153,7 +153,7 @@ app.controller("documentShowSubmissionController", function($scope, $rootScope, /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading submission" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_SUBMISSION') }; $scope.document = $documentService.get(); $scope.latest_revision = $documentService.getLatestRevision(); diff --git a/public/user-client/js/controllers/loginController.js b/public/user-client/js/controllers/loginController.js index fefd561..3eb9138 100644 --- a/public/user-client/js/controllers/loginController.js +++ b/public/user-client/js/controllers/loginController.js @@ -26,7 +26,7 @@ app.controller("loginController", function($scope, $rootScope, $filter, $transla // Update UI $scope.loginForm.document_id.$pristine = false; } else { - $scope.$parent.loading = { status: true, message: "Logging in" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOGGING_IN') }; $scope.redirect("/documents/" + $scope.login.document_id); } }; @@ -35,7 +35,7 @@ app.controller("loginController", function($scope, $rootScope, $filter, $transla /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading application" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_APPLICATION') }; // Reset all services $authenticationService.set(); diff --git a/public/user-client/js/controllers/mainController.js b/public/user-client/js/controllers/mainController.js index 36d1431..e281e22 100644 --- a/public/user-client/js/controllers/mainController.js +++ b/public/user-client/js/controllers/mainController.js @@ -1,7 +1,7 @@ var app = angular.module("ethics-app"); // Main controller -app.controller("mainController", function($scope, $rootScope, $location, config, $documentService, $authenticationService) { +app.controller("mainController", function($scope, $rootScope, $filter, $translate, $location, config, $documentService, $authenticationService) { /************************************************* FUNCTIONS diff --git a/public/user-client/js/controllers/member/detailsController.js b/public/user-client/js/controllers/member/detailsController.js index ac6ebc9..7070e6c 100644 --- a/public/user-client/js/controllers/member/detailsController.js +++ b/public/user-client/js/controllers/member/detailsController.js @@ -21,7 +21,7 @@ app.controller("memberDetailsController", function($scope, $rootScope, $routePar /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading committee member" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_MEMBER') }; // Load member $memberService.retrieve($routeParams.member_id) diff --git a/public/user-client/js/controllers/member/listController.js b/public/user-client/js/controllers/member/listController.js index df133b4..608904d 100644 --- a/public/user-client/js/controllers/member/listController.js +++ b/public/user-client/js/controllers/member/listController.js @@ -142,7 +142,7 @@ app.controller("memberListController", function($scope, $rootScope, $filter, $tr /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading committee members" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_MEMBERS') }; $scope.authenticated_user = $authenticationService.get(); // Load members diff --git a/public/user-client/js/controllers/recoveryController.js b/public/user-client/js/controllers/recoveryController.js index 5102323..0f7d692 100644 --- a/public/user-client/js/controllers/recoveryController.js +++ b/public/user-client/js/controllers/recoveryController.js @@ -26,7 +26,7 @@ app.controller("recoveryController", function($scope, $rootScope, $filter, $tran // Update UI $scope.recoveryForm.email_address.$pristine = false; } else { - $scope.$parent.loading = { status: true, message: "Searching for Email-address" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('SEARCHING_FOR_EMAIL_ADDRESS') }; $recoveryService.findByEmail($scope.recovery.email_address) .then(function onSuccess(response) { @@ -34,7 +34,7 @@ app.controller("recoveryController", function($scope, $rootScope, $filter, $tran $scope.recovery.email_address = $authenticationService.getEmailAddress() || ""; // Show info - $window.alert("An email with your document-IDs was sent!"); + $window.alert($filter('translate')('ALERT_RECOVERY_EMAIL_SENT')); // Redirect if($authenticationService.get()){ @@ -45,7 +45,7 @@ app.controller("recoveryController", function($scope, $rootScope, $filter, $tran }) .catch(function onError(response) { - $window.alert("The email-address could not be found!"); + $window.alert($filter('translate')('ALERT_EMAIL_ADDRESS_NOT_FOUND')); // Reset $scope.recoveryForm.email_address.$pristine = false; diff --git a/public/user-client/js/controllers/status/statusController.js b/public/user-client/js/controllers/status/statusController.js index 12c0bdf..451f5ef 100644 --- a/public/user-client/js/controllers/status/statusController.js +++ b/public/user-client/js/controllers/status/statusController.js @@ -21,7 +21,7 @@ app.controller("statusController", function($scope, $rootScope, $filter, $transl /************************************************* INIT *************************************************/ - $scope.$parent.loading = { status: true, message: "Loading document" }; + $scope.$parent.loading = { status: true, message: $filter('translate')('LOADING_DOCUMENT') }; $scope.document = $documentService.get(); $scope.latest_revision = $documentService.getLatestRevision(); $scope.files = $fileService.get(); diff --git a/public/user-client/js/modules/languages.js b/public/user-client/js/modules/languages.js index a02dcd8..252dfc6 100644 --- a/public/user-client/js/modules/languages.js +++ b/public/user-client/js/modules/languages.js @@ -75,7 +75,6 @@ app.config(function ($translateProvider) { YEAR_ASC: 'Year ascending', YEAR_DESC: 'Year descending', - DELETE_THIS_DOCUMENT: 'Do you really want to delete this document', EXPLANATION_OF_DELETING_A_DOCUMENT: 'Deleting a document also deletes ALL ASSOCIATED data. PLEASE PROCEED WITH CAUTION!', PLEASE_TYPE_IN_THE_TITLE_OF_THE_DOCUMENT_TO_CONFIRM: 'Please type in the title of the document to confirm', @@ -441,6 +440,86 @@ app.config(function ($translateProvider) { CHANGE_PASSWORD: 'Change password', DO_NOT_CHANGE_PASSWORD: 'Do not change password', + CREATING_NEW_MEMBER: 'Creating new committee member', + SAVING_MEMBER: 'Saving committee member', + DELETING_MEMBER: 'Deleting committee member', + + CREATING_NEW_USER: 'Creating new user', + SAVING_USER: 'Saving user', + DELETING_USER: 'Deleting user', + + CREATING_NEW_DOCUMENT: 'Creating new document', + SAVING_DOCUMENT: 'Saving document', + DELETING_DOCUMENT: 'Deleting document', + + CREATING_NEW_COURSE: 'Creating new course', + SAVING_COURSE: 'Saving course', + DELETING_COURSE: 'Deleting course', + + CREATING_NEW_UNIVERSITY: 'Creating new university', + SAVING_UNIVERSITY: 'Saving university', + DELETING_UNIVERSITY: 'Deleting university', + + CREATING_NEW_INSTITUTE: 'Creating new institute', + SAVING_INSTITUTE: 'Saving institute', + DELETING_INSTITUTE: 'Deleting institute', + + CREATING_NEW_WORKING_GROUP: 'Creating new working group', + SAVING_WORKING_GROUP: 'Saving working group', + DELETING_WORKING_GROUP: 'Deleting working group', + + LOADING_APPLICATION: 'Loading application', + LOGGING_IN: 'Logging in', + AUTO_SAVING: 'Auto saving', + + LOADING_DOCUMENT: 'Loading document', + LOADING_DOCUMENTS: 'Loading documents', + LOADING_RELATED_DOCUMENTS: 'Loading related documents', + LOADING_MEMBER: 'Loading committe member', + LOADING_MEMBERS: 'Loading committe members', + LOADING_RELATED_MEMBERS: 'Loading related committe members', + LOADING_USER: 'Loading user', + LOADING_USERS: 'Loading users', + LOADING_RELATED_USERS: 'Loading related users', + LOADING_COURSE: 'Loading course', + LOADING_COURSES: 'Loading courses', + LOADING_RELATED_COURSES: 'Loading related courses', + LOADING_UNIVERSITY: 'Loading university', + LOADING_UNIVERSITIES: 'Loading universities', + LOADING_INSTITUTE: 'Loading institute', + LOADING_INSTITUTES: 'Loading institutes', + LOADING_RELATED_INSTITUTES: 'Loading related institutes', + LOADING_WORKING_GROUP: 'Loading working group', + LOADING_WORKING_GROUPS: 'Loading working groups', + LOADING_RELATED_WORKING_GROUPS: 'Loading related working groups', + LOADING_REVISIONS: 'Loading revisions', + LOADING_SUBMISSION: 'Loading submission', + LOADING_OVERVIEW: 'Loading overview', + LOADING_REVIEW: 'Loading review', + LOADING_ACCOUNT_SETTINGS: 'Loading account settings', + + INITIALISING_NEW_DOCUMENT: 'Initialising new document', + CHECKING_AUTHENTICATION: 'Checking authentication', + + SAVING_ACCOUNT_SETTINGS: 'Saving account settings', + SAVING_NOTES: 'Saving notes', + SAVING_REVIEW: 'Saving review', + PUBLISHING_REVIEW: 'Publishing review', + UPDATING_REVIEWER: 'Updating reviewer', + SEARCHING_FOR_EMAIL_ADDRESS: 'Searching for Email-address', + SEARCHING_FOR_USER: 'Searching for user', + GENERATING_FILES: 'Generating files', + SUBMITTING_DOCUMENT: 'Submitting document', + + ALERT_SIGN_UP_SUCCESSFULL: 'You have successfully signed up, you can now create your document!', + ALERT_PASSWORD_NOT_EQUAL: 'Your passwords are not equal!', + ALERT_RESET_EMAIL_SENT: 'An email to reset your password was sent to you!', + ALERT_RECOVERY_EMAIL_SENT: 'An email with your document-IDs was sent to you!', + ALERT_EMAIL_ADDRESS_NOT_FOUND: 'The email-address could not be found!', + ALERT_DOCUMENT_CREATED: 'Your new document has been created and an email with the document-ID has been sent to you!', + ALERT_SUBMIT_DOCUMENT_FAILED: 'Your document can not be submitted, please fill out all required fields!', + ALERT_FILE_GENERATION_FAILED: 'Files can only be generated, if the document has been accepted!', + }); // Default Language (English) diff --git a/public/user-client/js/templates/help.html b/public/user-client/js/templates/help.html index b597e4e..68f72af 100644 --- a/public/user-client/js/templates/help.html +++ b/public/user-client/js/templates/help.html @@ -12,7 +12,7 @@
-
+

Frequently Asked Questions:


Why can I not download the Documents after filling out all the forms?
@@ -36,7 +36,7 @@

Frequently Asked Questions:

Troubleshooting:


I forgot my Document-ID, what should I do?
- Please click on the "I forgot my Document-ID" Button on the login page.
+ Please click on the "Forgot your document-ID?" button on the login page.

The App does not work!
If you encounter any problems with the Ethics-App, please contact us directly and we will look into the problem.
diff --git a/public/user-client/js/templates/member/details.html b/public/user-client/js/templates/member/details.html index 7672b4a..0b51fb1 100644 --- a/public/user-client/js/templates/member/details.html +++ b/public/user-client/js/templates/member/details.html @@ -72,7 +72,9 @@

- {{ 'OFFICE' | translate }}: {{member.office_room_number}} + + {{ 'OFFICE' | translate }}: {{member.office_room_number}} +
diff --git a/sql/queries/members/get_by_member.sql b/sql/queries/members/get_by_member.sql index f6a2608..2115895 100644 --- a/sql/queries/members/get_by_member.sql +++ b/sql/queries/members/get_by_member.sql @@ -4,6 +4,17 @@ SELECT member.title, member.first_name, member.last_name, + CONCAT( + CASE + WHEN member.title IS NOT NULL + THEN CONCAT(member.title, ' ') END, + CASE + WHEN member.title IS NULL + THEN '' END, + member.first_name, + ' ', + member.last_name + ) AS full_name, working_group.working_group_id, working_group.working_group_name, institute.institute_id, diff --git a/templates/emails/document_created.html b/templates/emails/document_created.html index c1053a3..c714bc6 100644 --- a/templates/emails/document_created.html +++ b/templates/emails/document_created.html @@ -104,7 +104,7 @@


- +
@@ -130,7 +130,7 @@

diff --git a/templates/emails/document_recovery.html b/templates/emails/document_recovery.html index 670f4bd..72f9ff1 100644 --- a/templates/emails/document_recovery.html +++ b/templates/emails/document_recovery.html @@ -105,7 +105,7 @@


{{#documents}} - +
@@ -132,7 +132,7 @@

diff --git a/templates/emails/document_status_changed.html b/templates/emails/document_status_changed.html index 2b14296..0d85d7a 100644 --- a/templates/emails/document_status_changed.html +++ b/templates/emails/document_status_changed.html @@ -104,7 +104,7 @@


- +
@@ -130,7 +130,7 @@

diff --git a/templates/emails/member_account_created.html b/templates/emails/member_account_created.html index c8857d3..0a52f8c 100644 --- a/templates/emails/member_account_created.html +++ b/templates/emails/member_account_created.html @@ -105,7 +105,7 @@

diff --git a/templates/emails/member_account_deactivated.html b/templates/emails/member_account_deactivated.html index ac8fe73..fb9a46d 100644 --- a/templates/emails/member_account_deactivated.html +++ b/templates/emails/member_account_deactivated.html @@ -105,7 +105,7 @@

diff --git a/templates/emails/member_account_reactivated.html b/templates/emails/member_account_reactivated.html index 7ec03fd..39ce2c3 100644 --- a/templates/emails/member_account_reactivated.html +++ b/templates/emails/member_account_reactivated.html @@ -105,7 +105,7 @@

diff --git a/templates/emails/member_recovery.html b/templates/emails/member_recovery.html index ebd372b..870bc04 100644 --- a/templates/emails/member_recovery.html +++ b/templates/emails/member_recovery.html @@ -96,7 +96,7 @@

Please follow this link to reset your password:

- {{domain}}/member-client/reset/{{member.token}} + {{domain}}/member-client/reset/{{member.token}}

Attention: This link expires in {{member.expires}}. @@ -111,7 +111,7 @@

diff --git a/templates/emails/member_review_required.html b/templates/emails/member_review_required.html index 2d3a4bb..95a98f3 100644 --- a/templates/emails/member_review_required.html +++ b/templates/emails/member_review_required.html @@ -104,7 +104,7 @@


- +
@@ -496,7 +496,7 @@
Ethical concerns
diff --git a/templates/emails/user_account_blocked.html b/templates/emails/user_account_blocked.html index 55bb154..907b8fa 100644 --- a/templates/emails/user_account_blocked.html +++ b/templates/emails/user_account_blocked.html @@ -102,7 +102,7 @@

diff --git a/templates/emails/user_account_created.html b/templates/emails/user_account_created.html index baabe80..5631fcc 100644 --- a/templates/emails/user_account_created.html +++ b/templates/emails/user_account_created.html @@ -108,7 +108,7 @@

diff --git a/templates/emails/user_account_reactivated.html b/templates/emails/user_account_reactivated.html index d21eb7c..c4f6f24 100644 --- a/templates/emails/user_account_reactivated.html +++ b/templates/emails/user_account_reactivated.html @@ -102,7 +102,7 @@

diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..736ddec --- /dev/null +++ b/yarn.lock @@ -0,0 +1,2128 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 +accepts@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + +addressparser@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/addressparser/-/addressparser-1.0.1.tgz#47afbe1a2a9262191db6838e4fd1d39b40821746" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ap@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ap/-/ap-0.2.0.tgz#ae0942600b29912f0d2b14ec60c45e8f330b6110" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +array-uniq@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert-plus@^1.0.0, assert-plus@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +async@^2.0.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.4.1.tgz#62a56b279c98a11d0987096a01cc3eeb8eb7bbd7" + dependencies: + lodash "^4.14.0" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +base64url@^2.0.0, base64url@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64url/-/base64url-2.0.0.tgz#eac16e03ea1438eff9423d69baa36262ed1f70bb" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +beeper@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" + +body-parser@^1.15.2: + version "1.17.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.2.tgz#f8892abc8f9e627d42aedafbca66bf5ab99104ee" + dependencies: + bytes "2.4.0" + content-type "~1.0.2" + debug "2.6.7" + depd "~1.1.0" + http-errors "~1.6.1" + iconv-lite "0.4.15" + on-finished "~2.3.0" + qs "6.4.0" + raw-body "~2.2.0" + type-is "~1.6.15" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +bower@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/bower/-/bower-1.8.0.tgz#55dbebef0ad9155382d9e9d3e497c1372345b44a" + +brace-expansion@^1.0.0: + version "1.1.7" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + +buffer-shims@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +buffer-writer@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-1.0.1.tgz#22a936901e3029afcd7547eb4487ceb697a3bf08" + +buildmail@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/buildmail/-/buildmail-4.0.1.tgz#877f7738b78729871c9a105e3b837d2be11a7a72" + dependencies: + addressparser "1.0.1" + libbase64 "0.1.0" + libmime "3.0.0" + libqp "1.1.0" + nodemailer-fetch "1.6.0" + nodemailer-shared "1.1.0" + punycode "1.4.1" + +bytes@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" + +camelize@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + +chalk@^1.0.0, chalk@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +clone-stats@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + +clone@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" + +clone@^1.0.0, clone@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" + +colors@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.0.tgz#53f7d43c51c5e43f81c8fdd03321c631be68d611" + dependencies: + inherits "~2.0.1" + readable-stream "~2.0.0" + typedarray "~0.0.5" + +connect@3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.2.tgz#694e8d20681bfe490282c8ab886be98f09f42fe7" + dependencies: + debug "2.6.7" + finalhandler "1.0.3" + parseurl "~1.3.1" + utils-merge "1.0.0" + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + +content-security-policy-builder@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/content-security-policy-builder/-/content-security-policy-builder-1.1.0.tgz#d91f1b076236c119850c7dee9924bf55e05772b3" + dependencies: + dashify "^0.2.0" + +content-type@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + +cookie-parser@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.3.tgz#0fe31fa19d000b95f4aadf1f53fdc2b8a203baa5" + dependencies: + cookie "0.3.1" + cookie-signature "1.0.6" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +core-util-is@~1.0.0, core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +dasherize@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dasherize/-/dasherize-2.0.0.tgz#6d809c9cd0cf7bb8952d80fc84fa13d47ddb1308" + +dashify@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dashify/-/dashify-0.2.2.tgz#6a07415a01c91faf4a32e38d9dfba71f61cb20fe" + +dateformat@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" + +debug@0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" + +debug@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" + dependencies: + ms "2.0.0" + +defaults@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +depd@~1.1.0, depd@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + +deprecated@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-file@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" + dependencies: + fs-exists-sync "^0.1.0" + +dns-prefetch-control@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz#60ddb457774e178f1f9415f0cabb0e85b0b300b2" + +dont-sniff-mimetype@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz#5932890dc9f4e2f19e5eb02a20026e5e5efc8f58" + +dotenv@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d" + +duplexer2@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + dependencies: + readable-stream "~1.1.9" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ecdsa-sig-formatter@1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz#4bc926274ec3b5abb5016e7e1d60921ac262b2a1" + dependencies: + base64url "^2.0.0" + safe-buffer "^5.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +encodeurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + +end-of-stream@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" + dependencies: + once "~1.3.0" + +es6-promise@~4.0.3: + version "4.0.5" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.0.5.tgz#7882f30adde5b240ccfa7f7d78c548330951ae42" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +etag@~1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +expand-tilde@^1.2.1, expand-tilde@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" + dependencies: + os-homedir "^1.0.1" + +expect-ct@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/expect-ct/-/expect-ct-0.1.0.tgz#52735678de18530890d8d7b95f0ac63640958094" + +express@^4.14.0: + version "4.15.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.15.3.tgz#bab65d0f03aa80c358408972fc700f916944b662" + dependencies: + accepts "~1.3.3" + array-flatten "1.1.1" + content-disposition "0.5.2" + content-type "~1.0.2" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.7" + depd "~1.1.0" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + finalhandler "~1.0.3" + fresh "0.5.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.1" + path-to-regexp "0.1.7" + proxy-addr "~1.1.4" + qs "6.4.0" + range-parser "~1.2.0" + send "0.15.3" + serve-static "1.12.3" + setprototypeof "1.0.3" + statuses "~1.3.1" + type-is "~1.6.15" + utils-merge "1.0.0" + vary "~1.1.1" + +extend@^3.0.0, extend@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extract-zip@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.5.0.tgz#92ccf6d81ef70a9fa4c1747114ccef6d8688a6c4" + dependencies: + concat-stream "1.5.0" + debug "0.7.4" + mkdirp "0.5.0" + yauzl "2.4.1" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +fancy-log@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" + dependencies: + chalk "^1.1.1" + time-stamp "^1.0.0" + +fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + dependencies: + pend "~1.2.0" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +finalhandler@~1.0.3, finalhandler@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89" + dependencies: + debug "2.6.7" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.1" + statuses "~1.3.1" + unpipe "~1.0.0" + +find-index@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" + +findup-sync@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" + dependencies: + detect-file "^0.1.0" + is-glob "^2.0.1" + micromatch "^2.3.7" + resolve-dir "^0.1.0" + +fined@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.0.2.tgz#5b28424b760d7598960b7ef8480dff8ad3660e97" + dependencies: + expand-tilde "^1.2.1" + lodash.assignwith "^4.0.7" + lodash.isempty "^4.2.1" + lodash.isplainobject "^4.0.4" + lodash.isstring "^4.0.1" + lodash.pick "^4.2.1" + parse-filepath "^1.0.1" + +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + +flagged-respawn@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +forwarded@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" + +frameguard@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/frameguard/-/frameguard-3.0.0.tgz#7bcad469ee7b96e91d12ceb3959c78235a9272e9" + +fresh@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" + +fs-exists-sync@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" + +fs-extra@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + +gaze@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" + dependencies: + globule "~0.1.0" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +generic-pool@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-2.4.3.tgz#780c36f69dfad05a5a045dd37be7adca11a4f6ff" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob-stream@^3.1.5: + version "3.1.18" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" + dependencies: + glob "^4.3.1" + glob2base "^0.0.12" + minimatch "^2.0.1" + ordered-read-streams "^0.1.0" + through2 "^0.6.1" + unique-stream "^1.0.0" + +glob-watcher@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" + dependencies: + gaze "^0.5.1" + +glob@^4.3.1: + version "4.5.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "^2.0.1" + once "^1.3.0" + +glob@~3.1.21: + version "3.1.21" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" + dependencies: + graceful-fs "~1.2.0" + inherits "1" + minimatch "~0.2.11" + +glob2base@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + dependencies: + find-index "^0.1.1" + +global-modules@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" + dependencies: + global-prefix "^0.1.4" + is-windows "^0.2.0" + +global-prefix@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" + dependencies: + homedir-polyfill "^1.0.0" + ini "^1.3.4" + is-windows "^0.2.0" + which "^1.2.12" + +globule@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" + dependencies: + glob "~3.1.21" + lodash "~1.0.1" + minimatch "~0.2.11" + +glogg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" + dependencies: + sparkles "^1.0.0" + +graceful-fs@^3.0.0: + version "3.0.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" + dependencies: + natives "^1.1.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +graceful-fs@~1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +gulp-util@^3.0.0: + version "3.0.8" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^2.0.0" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + +gulp@^3.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" + dependencies: + archy "^1.0.0" + chalk "^1.0.0" + deprecated "^0.0.1" + gulp-util "^3.0.0" + interpret "^1.0.0" + liftoff "^2.1.0" + minimist "^1.1.0" + orchestrator "^0.3.0" + pretty-hrtime "^1.0.0" + semver "^4.1.0" + tildify "^1.0.0" + v8flags "^2.0.2" + vinyl-fs "^0.3.0" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + dependencies: + glogg "^1.0.0" + +har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-gulplog@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" + dependencies: + sparkles "^1.0.0" + +hasha@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" + dependencies: + is-stream "^1.0.1" + pinkie-promise "^2.0.0" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +helmet-csp@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/helmet-csp/-/helmet-csp-2.4.0.tgz#7e53a157167a0645aadd7177d12ae6c605c1842e" + dependencies: + camelize "1.0.0" + content-security-policy-builder "1.1.0" + dasherize "2.0.0" + lodash.reduce "4.6.0" + platform "1.3.3" + +helmet@^3.4.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/helmet/-/helmet-3.6.1.tgz#91f3aa7fa4c94671595fb568dfd8c28489a388be" + dependencies: + connect "3.6.2" + dns-prefetch-control "0.1.0" + dont-sniff-mimetype "1.0.0" + expect-ct "0.1.0" + frameguard "3.0.0" + helmet-csp "2.4.0" + hide-powered-by "1.0.0" + hpkp "2.0.0" + hsts "2.0.0" + ienoopen "1.0.0" + nocache "2.0.0" + referrer-policy "1.1.0" + x-xss-protection "1.0.0" + +hide-powered-by@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hide-powered-by/-/hide-powered-by-1.0.0.tgz#4a85ad65881f62857fc70af7174a1184dccce32b" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +homedir-polyfill@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + dependencies: + parse-passwd "^1.0.0" + +hpkp@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hpkp/-/hpkp-2.0.0.tgz#10e142264e76215a5d30c44ec43de64dee6d1672" + +hsts@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hsts/-/hsts-2.0.0.tgz#a52234c6070decf214b2b6b70bb144d07e4776c7" + dependencies: + core-util-is "1.0.2" + +html-pdf@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/html-pdf/-/html-pdf-2.1.0.tgz#c34d518f7f802ffbc834bf80279cfce7da2cce4b" + optionalDependencies: + phantomjs-prebuilt "^2.1.4" + +http-errors@~1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" + dependencies: + depd "1.1.0" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +httpntlm@1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/httpntlm/-/httpntlm-1.6.1.tgz#ad01527143a2e8773cfae6a96f58656bb52a34b2" + dependencies: + httpreq ">=0.4.22" + underscore "~1.7.0" + +httpreq@>=0.4.22: + version "0.4.23" + resolved "https://registry.yarnpkg.com/httpreq/-/httpreq-0.4.23.tgz#0f460fe0c781029bcad7f47cad08de6cc1130212" + +iconv-lite@0.4.15: + version "0.4.15" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" + +ienoopen@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ienoopen/-/ienoopen-1.0.0.tgz#346a428f474aac8f50cf3784ea2d0f16f62bda6b" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@~2.0.1, inherits@2, inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" + +ini@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +interpret@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" + +ip@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + +ipaddr.js@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec" + +is-absolute@^0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" + dependencies: + is-relative "^0.2.1" + is-windows "^0.2.0" + +is-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + +is-dotfile@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-my-json-valid@^2.12.4: + version "2.16.0" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-number@^2.0.2, is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-relative@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" + dependencies: + is-unc-path "^0.1.1" + +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-unc-path@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9" + dependencies: + unc-path-regex "^0.1.0" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-windows@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" + +isarray@~1.0.0, isarray@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isemail@1.x.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/isemail/-/isemail-1.2.0.tgz#be03df8cc3e29de4d2c5df6501263f1fa4595e9a" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +jodid25519@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" + dependencies: + jsbn "~0.1.0" + +joi@^6.10.1: + version "6.10.1" + resolved "https://registry.yarnpkg.com/joi/-/joi-6.10.1.tgz#4d50c318079122000fe5f16af1ff8e1917b77e06" + dependencies: + hoek "2.x.x" + isemail "1.x.x" + moment "2.x.x" + topo "1.x.x" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonpointer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" + +jsonwebtoken@^7.2.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-7.4.1.tgz#7ca324f5215f8be039cd35a6c45bb8cb74a448fb" + dependencies: + joi "^6.10.1" + jws "^3.1.4" + lodash.once "^4.0.0" + ms "^2.0.0" + xtend "^4.0.1" + +jsprim@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" + dependencies: + assert-plus "1.0.0" + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +jwa@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.5.tgz#a0552ce0220742cd52e153774a32905c30e756e5" + dependencies: + base64url "2.0.0" + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.9" + safe-buffer "^5.0.1" + +jws@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.4.tgz#f9e8b9338e8a847277d6444b1464f61880e050a2" + dependencies: + base64url "^2.0.0" + jwa "^1.1.4" + safe-buffer "^5.0.1" + +kew@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + optionalDependencies: + graceful-fs "^4.1.9" + +libbase64@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/libbase64/-/libbase64-0.1.0.tgz#62351a839563ac5ff5bd26f12f60e9830bb751e6" + +libmime@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/libmime/-/libmime-3.0.0.tgz#51a1a9e7448ecbd32cda54421675bb21bc093da6" + dependencies: + iconv-lite "0.4.15" + libbase64 "0.1.0" + libqp "1.1.0" + +libqp@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/libqp/-/libqp-1.1.0.tgz#f5e6e06ad74b794fb5b5b66988bf728ef1dedbe8" + +liftoff@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" + dependencies: + extend "^3.0.0" + findup-sync "^0.4.2" + fined "^1.0.1" + flagged-respawn "^0.3.2" + lodash.isplainobject "^4.0.4" + lodash.isstring "^4.0.1" + lodash.mapvalues "^4.4.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basetostring@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + +lodash._basevalues@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash._reescape@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" + +lodash._reevaluate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + +lodash._root@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + +lodash.assignwith@^4.0.7: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz#127a97f02adc41751a954d24b0de17e100e038eb" + +lodash.escape@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + dependencies: + lodash._root "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.isempty@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" + +lodash.isplainobject@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.mapvalues@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + +lodash.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + +lodash.reduce@4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.template@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + dependencies: + lodash._basecopy "^3.0.0" + lodash._basetostring "^3.0.0" + lodash._basevalues "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.keys "^3.0.0" + lodash.restparam "^3.0.0" + lodash.templatesettings "^3.0.0" + +lodash.templatesettings@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + +lodash@^4.14.0: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +lodash@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +mailcomposer@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/mailcomposer/-/mailcomposer-4.0.1.tgz#0e1c44b2a07cf740ee17dc149ba009f19cadfeb4" + dependencies: + buildmail "4.0.1" + libmime "3.0.0" + +map-cache@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^2.3.7: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +mime-db@~1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" + +mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7: + version "2.1.15" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" + dependencies: + mime-db "~1.27.0" + +mime@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +minimatch@^2.0.1: + version "2.0.10" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + dependencies: + brace-expansion "^1.0.0" + +minimatch@~0.2.11: + version "0.2.14" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimist@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +mkdirp@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mkdirp@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" + dependencies: + minimist "0.0.8" + +moment@^2.14.1, moment@2.x.x: + version "2.18.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" + +ms@^2.0.0, ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +multipipe@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" + dependencies: + duplexer2 "0.0.2" + +mustache@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.0.tgz#4028f7778b17708a489930a6e52ac3bca0da41d0" + +natives@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +nocache@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.0.0.tgz#202b48021a0c4cbde2df80de15a17443c8b43980" + +nodemailer-direct-transport@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz#e96fafb90358560947e569017d97e60738a50a86" + dependencies: + nodemailer-shared "1.1.0" + smtp-connection "2.12.0" + +nodemailer-fetch@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz#79c4908a1c0f5f375b73fe888da9828f6dc963a4" + +nodemailer-shared@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz#cf5994e2fd268d00f5cf0fa767a08169edb07ec0" + dependencies: + nodemailer-fetch "1.6.0" + +nodemailer-smtp-pool@2.8.2: + version "2.8.2" + resolved "https://registry.yarnpkg.com/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz#2eb94d6cf85780b1b4725ce853b9cbd5e8da8c72" + dependencies: + nodemailer-shared "1.1.0" + nodemailer-wellknown "0.1.10" + smtp-connection "2.12.0" + +nodemailer-smtp-transport@2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz#03d71c76314f14ac7dbc7bf033a6a6d16d67fb77" + dependencies: + nodemailer-shared "1.1.0" + nodemailer-wellknown "0.1.10" + smtp-connection "2.12.0" + +nodemailer-wellknown@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz#586db8101db30cb4438eb546737a41aad0cf13d5" + +nodemailer@^2.7.0: + version "2.7.2" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-2.7.2.tgz#f242e649aeeae39b6c7ed740ef7b061c404d30f9" + dependencies: + libmime "3.0.0" + mailcomposer "4.0.1" + nodemailer-direct-transport "3.3.2" + nodemailer-shared "1.1.0" + nodemailer-smtp-pool "2.8.2" + nodemailer-smtp-transport "2.7.2" + socks "1.1.9" + +normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-assign@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +orchestrator@^0.3.0: + version "0.3.8" + resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" + dependencies: + end-of-stream "~0.1.5" + sequencify "~0.0.7" + stream-consume "~0.1.0" + +ordered-read-streams@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" + +os-homedir@^1.0.0, os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +packet-reader@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-0.3.1.tgz#cd62e60af8d7fea8a705ec4ff990871c46871f27" + +parse-filepath@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73" + dependencies: + is-absolute "^0.2.3" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + +parseurl@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + dependencies: + path-root-regex "^0.1.0" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + +pg-connection-string@0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz#da1847b20940e42ee1492beaf65d49d91b245df7" + +pg-pool@1.*: + version "1.7.1" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-1.7.1.tgz#421105cb7469979dcc48d6fc4fe3fe4659437437" + dependencies: + generic-pool "2.4.3" + object-assign "4.1.0" + +pg-types@1.*: + version "1.11.0" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-1.11.0.tgz#aae91a82d952b633bb88d006350a166daaf6ea90" + dependencies: + ap "~0.2.0" + postgres-array "~1.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.0" + postgres-interval "~1.0.0" + +pg@^6.1.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/pg/-/pg-6.2.2.tgz#f778c129e16c6f88da564f76faf854f832c724c0" + dependencies: + buffer-writer "1.0.1" + packet-reader "0.3.1" + pg-connection-string "0.1.3" + pg-pool "1.*" + pg-types "1.*" + pgpass "1.x" + semver "4.3.2" + +pgpass@1.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.2.tgz#2a7bb41b6065b67907e91da1b07c1847c877b306" + dependencies: + split "^1.0.0" + +phantomjs-prebuilt@^2.1.4: + version "2.1.14" + resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.14.tgz#d53d311fcfb7d1d08ddb24014558f1188c516da0" + dependencies: + es6-promise "~4.0.3" + extract-zip "~1.5.0" + fs-extra "~1.0.0" + hasha "~2.2.0" + kew "~0.7.0" + progress "~1.1.8" + request "~2.79.0" + request-progress "~2.0.1" + which "~1.2.10" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +platform@1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.3.tgz#646c77011899870b6a0903e75e997e8e51da7461" + +postgres-array@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-1.0.2.tgz#8e0b32eb03bf77a5c0a7851e0441c169a256a238" + +postgres-bytea@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" + +postgres-date@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.3.tgz#e2d89702efdb258ff9d9cee0fe91bd06975257a8" + +postgres-interval@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.0.2.tgz#7261438d862b412921c6fdb7617668424b73a6ed" + dependencies: + xtend "^4.0.0" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-hrtime@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +progress@~1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + +proxy-addr@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.4.tgz#27e545f6960a44a627d9b44467e35c1b6b4ce2f3" + dependencies: + forwarded "~0.1.0" + ipaddr.js "1.3.0" + +punycode@^1.4.1, punycode@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@~6.3.0: + version "6.3.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" + +qs@6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +randomatic@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + dependencies: + is-number "^2.0.2" + kind-of "^3.0.2" + +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +raw-body@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.15" + unpipe "1.0.0" + +readable-stream@^2.1.5: + version "2.2.9" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" + dependencies: + buffer-shims "~1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~1.0.0" + util-deprecate "~1.0.1" + +"readable-stream@>=1.0.33-1 <1.1.0-0": + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +referrer-policy@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/referrer-policy/-/referrer-policy-1.1.0.tgz#35774eb735bf50fb6c078e83334b472350207d79" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +remove-trailing-separator@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + +request-progress@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" + dependencies: + throttleit "^1.0.0" + +request@~2.79.0: + version "2.79.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + qs "~6.3.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + uuid "^3.0.0" + +resolve-dir@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" + dependencies: + expand-tilde "^1.2.2" + global-modules "^0.2.3" + +resolve@^1.1.6, resolve@^1.1.7: + version "1.3.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" + dependencies: + path-parse "^1.0.5" + +safe-buffer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" + +semver@^4.1.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + +semver@4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" + +send@0.15.3: + version "0.15.3" + resolved "https://registry.yarnpkg.com/send/-/send-0.15.3.tgz#5013f9f99023df50d1bd9892c19e3defd1d53309" + dependencies: + debug "2.6.7" + depd "~1.1.0" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + fresh "0.5.0" + http-errors "~1.6.1" + mime "1.3.4" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.1" + +sequencify@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" + +serve-static@1.12.3: + version "1.12.3" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.3.tgz#9f4ba19e2f3030c547f8af99107838ec38d5b1e2" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.1" + send "0.15.3" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +smart-buffer@^1.0.4: + version "1.1.15" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" + +smtp-connection@2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/smtp-connection/-/smtp-connection-2.12.0.tgz#d76ef9127cb23c2259edb1e8349c2e8d5e2d74c1" + dependencies: + httpntlm "1.6.1" + nodemailer-shared "1.1.0" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +socks@1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.9.tgz#628d7e4d04912435445ac0b6e459376cb3e6d691" + dependencies: + ip "^1.1.2" + smart-buffer "^1.0.4" + +sparkles@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" + +split@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.0.tgz#c4395ce683abcd254bc28fe1dabb6e5c27dcffae" + dependencies: + through "2" + +sshpk@^1.7.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jodid25519 "^1.0.0" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +"statuses@>= 1.3.1 < 2", statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +stream-consume@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.1.tgz#62e200f039955a6810d8df0a33ffc0f013662d98" + dependencies: + safe-buffer "^5.0.1" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" + dependencies: + first-chunk-stream "^1.0.0" + is-utf8 "^0.2.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +throttleit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + +through@2: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +through2@^0.6.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +tildify@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" + dependencies: + os-homedir "^1.0.0" + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + +topo@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/topo/-/topo-1.1.0.tgz#e9d751615d1bb87dc865db182fa1ca0a5ef536d5" + dependencies: + hoek "2.x.x" + +tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-is@~1.6.15: + version "1.6.15" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.15" + +typedarray@~0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +unc-path-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + +underscore@^1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" + +underscore@~1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" + +unique-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" + +unpipe@~1.0.0, unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +utils-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + +uuid@^3.0.0, uuid@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" + +v8flags@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + +vary@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +vinyl-fs@^0.3.0: + version "0.3.14" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" + dependencies: + defaults "^1.0.0" + glob-stream "^3.1.5" + glob-watcher "^0.0.6" + graceful-fs "^3.0.0" + mkdirp "^0.5.0" + strip-bom "^1.0.0" + through2 "^0.6.1" + vinyl "^0.4.0" + +vinyl@^0.4.0: + version "0.4.6" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" + dependencies: + clone "^0.2.0" + clone-stats "^0.0.1" + +vinyl@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +which@^1.2.12, which@~1.2.10: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +x-xss-protection@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/x-xss-protection/-/x-xss-protection-1.0.0.tgz#898afb93869b24661cf9c52f9ee8db8ed0764dd9" + +xtend@^4.0.0, xtend@^4.0.1, "xtend@>=4.0.0 <4.1.0-0", xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +yauzl@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + dependencies: + fd-slicer "~1.0.1" +