From 515e857e04076aad01ec0e9aa4405f906d1c400e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Sans?= Date: Fri, 17 Feb 2017 12:54:41 +0200 Subject: [PATCH 01/33] [#1948] disabled buttons should appear as so --- Dashboard/app/css/library.scss | 10 ++++++---- Dashboard/app/css/main.scss | 28 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/Dashboard/app/css/library.scss b/Dashboard/app/css/library.scss index 8c25986f4c..268e9f39f7 100644 --- a/Dashboard/app/css/library.scss +++ b/Dashboard/app/css/library.scss @@ -206,13 +206,15 @@ $width-large: 1200px; &.disabled { cursor: not-allowed; - background-color: rgba(128, 128, 128, 0.1); - color: rgba(128, 128, 128, 0.4); + background-color: rgba(128, 128, 128, 0.1) !important; + color: rgba(128, 128, 128, 0.4) !important; + border: 1px solid transparent; &:hover { cursor: not-allowed; - background-color: rgba(128, 128, 128, 0.1); - color: rgba(128, 128, 128, 0.4); + background-color: rgba(128, 128, 128, 0.1) !important; + color: rgba(128, 128, 128, 0.4) !important; + border: 1px solid transparent; } } } diff --git a/Dashboard/app/css/main.scss b/Dashboard/app/css/main.scss index 6392a81f98..4a340ff1b7 100644 --- a/Dashboard/app/css/main.scss +++ b/Dashboard/app/css/main.scss @@ -206,6 +206,20 @@ pre { /************************* links *************************/ .button, .standardBtn { @include button($flowAnchorLink); + + &.noChanges, &.disabled { + cursor: not-allowed; + background-color: rgba(128, 128, 128, 0.1) !important; + color: rgba(128, 128, 128, 0.4) !important; + border: 1px solid transparent; + + &:hover { + cursor: not-allowed; + background-color: rgba(128, 128, 128, 0.1) !important; + color: rgba(128, 128, 128, 0.4) !important; + border: 1px solid transparent; + } + } } .smallButton, .smallBtn { @@ -2376,6 +2390,20 @@ a.editGroupName, a.addMenuAction, a.makeMonitorGroup, a.manageNotifications, a.deleteGroup, a.addFolder, a.editFolder, a.cancelFolder, a.saveMenuAction { @include btnOutline($flowAnchorLink); + + &.noChanges, &.disabled { + cursor: not-allowed; + background-color: rgba(128, 128, 128, 0.1) !important; + color: rgba(128, 128, 128, 0.4) !important; + border: 1px solid transparent; + + &:hover { + cursor: not-allowed; + background-color: rgba(128, 128, 128, 0.1) !important; + color: rgba(128, 128, 128, 0.4) !important; + border: 1px solid transparent; + } + } } /* Survey Asset From 7a16caf5836bea74af79eaa1c2d88bed3110789f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Sans?= Date: Wed, 22 Feb 2017 11:14:09 +0200 Subject: [PATCH 02/33] [#1955] Removed gap --- Dashboard/app/css/main.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dashboard/app/css/main.scss b/Dashboard/app/css/main.scss index 6392a81f98..155ac0da2a 100644 --- a/Dashboard/app/css/main.scss +++ b/Dashboard/app/css/main.scss @@ -1698,7 +1698,7 @@ th.action { nav.tabNav { display: block; - padding: 15px 0 1px 0; + padding: 0px 0 1px 0; width: 100%; background-color: white; position: fixed; @@ -2090,7 +2090,7 @@ a.FadeIt { section.topBar { position: fixed; - margin: -20px auto 0 auto; + margin: -35px auto 0 auto; z-index: 9998; width: 100%; background: white; From 286d212e805d46765ede04bd3951519df1d2ee5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Sans?= Date: Wed, 22 Feb 2017 12:58:00 +0200 Subject: [PATCH 03/33] [#1850] removed listed items --- Dashboard/app/css/main.scss | 2 +- Dashboard/app/js/templates/navData/bulk-upload.handlebars | 2 -- .../app/js/templates/navData/cascade-resources.handlebars | 2 +- Dashboard/app/js/templates/navData/data-cleaning.handlebars | 1 - Dashboard/app/js/templates/navData/monitoring-data.handlebars | 4 ++-- .../navDevices/bootstrap-tab/survey-bootstrap.handlebars | 1 - .../app/js/templates/navMessages/nav-messages.handlebars | 1 - .../app/js/templates/navReports/chart-reports.handlebars | 1 - .../app/js/templates/navReports/export-reports.handlebars | 1 - Dashboard/app/js/templates/navSurveys/form.handlebars | 1 - Dashboard/app/js/templates/navSurveys/project.handlebars | 2 +- 11 files changed, 5 insertions(+), 13 deletions(-) diff --git a/Dashboard/app/css/main.scss b/Dashboard/app/css/main.scss index 6392a81f98..8069a22d7f 100644 --- a/Dashboard/app/css/main.scss +++ b/Dashboard/app/css/main.scss @@ -4990,7 +4990,7 @@ table.surveyDetails { #tabs { .fullWidth { - padding-top: 15px; + padding-top: 25px; } } diff --git a/Dashboard/app/js/templates/navData/bulk-upload.handlebars b/Dashboard/app/js/templates/navData/bulk-upload.handlebars index a2eef946eb..db3cf1518c 100644 --- a/Dashboard/app/js/templates/navData/bulk-upload.handlebars +++ b/Dashboard/app/js/templates/navData/bulk-upload.handlebars @@ -1,8 +1,6 @@
{{#view FLOW.BulkUploadAppletView}} -

{{t _bulk_upload_data}}

-

{{t _upload_applet_text_}}

diff --git a/Dashboard/app/js/templates/navData/cascade-resources.handlebars b/Dashboard/app/js/templates/navData/cascade-resources.handlebars index ed3f803ddd..943de674e8 100644 --- a/Dashboard/app/js/templates/navData/cascade-resources.handlebars +++ b/Dashboard/app/js/templates/navData/cascade-resources.handlebars @@ -34,7 +34,7 @@
{{#if view.oneSelected}}
- {{t _cascade_resource}}

{{FLOW.selectedControl.selectedCascadeResource.name}}

+

{{FLOW.selectedControl.selectedCascadeResource.name}}

  • {{t _publish}}
  • {{t _delete}}
  • diff --git a/Dashboard/app/js/templates/navData/data-cleaning.handlebars b/Dashboard/app/js/templates/navData/data-cleaning.handlebars index f34869afd9..bd39cb9a52 100644 --- a/Dashboard/app/js/templates/navData/data-cleaning.handlebars +++ b/Dashboard/app/js/templates/navData/data-cleaning.handlebars @@ -1,6 +1,5 @@
    {{#view FLOW.ExportReportsAppletView}} -

    {{t _data_cleaning}}

    {{#unless FLOW.projectControl.isLoading}} {{view FLOW.DataCleaningSurveySelectionView}} diff --git a/Dashboard/app/js/templates/navData/monitoring-data.handlebars b/Dashboard/app/js/templates/navData/monitoring-data.handlebars index 1f1cf20c2f..30aa9c9cc3 100644 --- a/Dashboard/app/js/templates/navData/monitoring-data.handlebars +++ b/Dashboard/app/js/templates/navData/monitoring-data.handlebars @@ -1,8 +1,8 @@ {{#view FLOW.MonitoringDataTableView}}
    -

    {{t _choose_survey_data_to_display}}:

    -
    + +
    {{#unless FLOW.projectControl.isLoading}} {{view FLOW.SurveySelectionView showMonitoringSurveysOnly=true}} {{/unless}} diff --git a/Dashboard/app/js/templates/navDevices/bootstrap-tab/survey-bootstrap.handlebars b/Dashboard/app/js/templates/navDevices/bootstrap-tab/survey-bootstrap.handlebars index 5bdeccb7ea..fd9506e531 100644 --- a/Dashboard/app/js/templates/navDevices/bootstrap-tab/survey-bootstrap.handlebars +++ b/Dashboard/app/js/templates/navDevices/bootstrap-tab/survey-bootstrap.handlebars @@ -1,6 +1,5 @@ {{#view FLOW.SurveyBootstrap}}
    -

    {{t _manual_survey_transfer}}

    diff --git a/Dashboard/app/js/templates/navMessages/nav-messages.handlebars b/Dashboard/app/js/templates/navMessages/nav-messages.handlebars index 790a6fded1..af33227f60 100644 --- a/Dashboard/app/js/templates/navMessages/nav-messages.handlebars +++ b/Dashboard/app/js/templates/navMessages/nav-messages.handlebars @@ -1,7 +1,6 @@ {{#view FLOW.MessagesListView}}
    -

    {{t _messages}}

    diff --git a/Dashboard/app/js/templates/navReports/chart-reports.handlebars b/Dashboard/app/js/templates/navReports/chart-reports.handlebars index 8dc6bd05e8..d0a892a509 100644 --- a/Dashboard/app/js/templates/navReports/chart-reports.handlebars +++ b/Dashboard/app/js/templates/navReports/chart-reports.handlebars @@ -1,6 +1,5 @@
    {{#view FLOW.chartView}} -

    {{t _chart_builder}}

    {{#unless FLOW.projectControl.isLoading}} {{view FLOW.SurveySelectionView}} {{/unless}} diff --git a/Dashboard/app/js/templates/navReports/export-reports.handlebars b/Dashboard/app/js/templates/navReports/export-reports.handlebars index 22d85b69ec..803986e288 100644 --- a/Dashboard/app/js/templates/navReports/export-reports.handlebars +++ b/Dashboard/app/js/templates/navReports/export-reports.handlebars @@ -2,7 +2,6 @@
    {{#view FLOW.ExportReportsAppletView}}
    -

    {{t _export_data}}

    {{#unless FLOW.projectControl.isLoading}} {{view FLOW.SurveySelectionView}} {{/unless}} diff --git a/Dashboard/app/js/templates/navSurveys/form.handlebars b/Dashboard/app/js/templates/navSurveys/form.handlebars index 21aa97e514..743ae3b65f 100644 --- a/Dashboard/app/js/templates/navSurveys/form.handlebars +++ b/Dashboard/app/js/templates/navSurveys/form.handlebars @@ -25,7 +25,6 @@ {{view Ember.TextField valueBinding="form.name" disabledBinding="view.disableFormFields"}} -
    - - - -
    -
    • {{#if view.hasPrevPage}} diff --git a/Dashboard/app/js/templates/navData/manage-attributes.handlebars b/Dashboard/app/js/templates/navData/manage-attributes.handlebars index a12e991231..0cad6a5a27 100644 --- a/Dashboard/app/js/templates/navData/manage-attributes.handlebars +++ b/Dashboard/app/js/templates/navData/manage-attributes.handlebars @@ -35,12 +35,6 @@ {{/each}} - - - - This is the footer. - - diff --git a/Dashboard/app/js/templates/navData/monitoring-data.handlebars b/Dashboard/app/js/templates/navData/monitoring-data.handlebars index 1f1cf20c2f..02cd7f8edc 100644 --- a/Dashboard/app/js/templates/navData/monitoring-data.handlebars +++ b/Dashboard/app/js/templates/navData/monitoring-data.handlebars @@ -42,11 +42,6 @@ {{view FLOW.DataPointView contentBinding="this"}} {{/each}} - - - This is the footer. - -
      • {{#if view.hasPrevPage}} @@ -160,21 +155,11 @@ {{/each}} - - - This is the footer. - - {{/each}} - - - This is the footer. - -
        diff --git a/Dashboard/app/js/templates/navDevices/assignment-list-tab/assignment-list.handlebars b/Dashboard/app/js/templates/navDevices/assignment-list-tab/assignment-list.handlebars index cee81fdbc1..5618c547c3 100644 --- a/Dashboard/app/js/templates/navDevices/assignment-list-tab/assignment-list.handlebars +++ b/Dashboard/app/js/templates/navDevices/assignment-list-tab/assignment-list.handlebars @@ -25,11 +25,5 @@ {{/each}} - - - - This is the footer. - - {{/view}}
    \ No newline at end of file diff --git a/Dashboard/app/js/templates/navDevices/devices-list-tab/devices-list.handlebars b/Dashboard/app/js/templates/navDevices/devices-list-tab/devices-list.handlebars index b206c3b376..24afcd27fd 100644 --- a/Dashboard/app/js/templates/navDevices/devices-list-tab/devices-list.handlebars +++ b/Dashboard/app/js/templates/navDevices/devices-list-tab/devices-list.handlebars @@ -48,12 +48,6 @@ {{/each}} - - - - This is the footer. - - - - - This is the footer. - -
    • {{#if view.hasPrevPage}} ‹ {{t _previous}} {{/if}}
    • From f5b3df9a25179f5fa3641da74d8850e503c6dd51 Mon Sep 17 00:00:00 2001 From: Emmanuel Mulo Date: Mon, 27 Feb 2017 11:04:59 +0100 Subject: [PATCH 05/33] [#1850] Remove whitespace --- Dashboard/app/js/templates/navData/monitoring-data.handlebars | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dashboard/app/js/templates/navData/monitoring-data.handlebars b/Dashboard/app/js/templates/navData/monitoring-data.handlebars index 30aa9c9cc3..e47b0d3ab0 100644 --- a/Dashboard/app/js/templates/navData/monitoring-data.handlebars +++ b/Dashboard/app/js/templates/navData/monitoring-data.handlebars @@ -2,7 +2,7 @@
      -
      +
      {{#unless FLOW.projectControl.isLoading}} {{view FLOW.SurveySelectionView showMonitoringSurveysOnly=true}} {{/unless}} From fc226a9c22be8e7c469fc176a38c125008c03c80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Sans?= Date: Wed, 1 Mar 2017 10:39:26 +0200 Subject: [PATCH 06/33] [#1850] Fixed inconsistencies in Data tab --- Dashboard/app/css/main.scss | 8 ++++---- .../app/js/templates/navData/inspect-data.handlebars | 3 +-- .../app/js/templates/navData/monitoring-data.handlebars | 3 +-- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Dashboard/app/css/main.scss b/Dashboard/app/css/main.scss index 8069a22d7f..5d18a7e44f 100644 --- a/Dashboard/app/css/main.scss +++ b/Dashboard/app/css/main.scss @@ -3875,7 +3875,7 @@ table.dataTable.notificationTable thead tr th a:visited { align-items: flex-start; select:first-child { - margin-left: 1%; + margin-left: 0.5%; } } @@ -3921,8 +3921,8 @@ div.chooseSurveyData { position: relative; display: block; float: left; - margin: 0 1% 2em 0.5em; - width: 48%; + margin: 10px 0; + width: 100%; height: 20px; } @@ -4990,7 +4990,7 @@ table.surveyDetails { #tabs { .fullWidth { - padding-top: 25px; + padding-top: 35px; } } diff --git a/Dashboard/app/js/templates/navData/inspect-data.handlebars b/Dashboard/app/js/templates/navData/inspect-data.handlebars index ef8ce4e217..57a9bfde2c 100644 --- a/Dashboard/app/js/templates/navData/inspect-data.handlebars +++ b/Dashboard/app/js/templates/navData/inspect-data.handlebars @@ -1,7 +1,6 @@ {{#view FLOW.inspectDataTableView}} -
      +
      -

      {{t _choose_survey_data_to_display}}:

      {{#unless FLOW.projectControl.isLoading}} {{view FLOW.SurveySelectionView}} diff --git a/Dashboard/app/js/templates/navData/monitoring-data.handlebars b/Dashboard/app/js/templates/navData/monitoring-data.handlebars index e47b0d3ab0..e1bbee6271 100644 --- a/Dashboard/app/js/templates/navData/monitoring-data.handlebars +++ b/Dashboard/app/js/templates/navData/monitoring-data.handlebars @@ -1,7 +1,6 @@ {{#view FLOW.MonitoringDataTableView}} -
      +
      -
      {{#unless FLOW.projectControl.isLoading}} {{view FLOW.SurveySelectionView showMonitoringSurveysOnly=true}} From 0e4086aad03bc51b03e8cca77f10a66ce2617288 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Sans?= Date: Thu, 2 Mar 2017 08:24:51 +0200 Subject: [PATCH 07/33] [#1850] fix select appearing out of place --- Dashboard/app/css/main.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dashboard/app/css/main.scss b/Dashboard/app/css/main.scss index 5d18a7e44f..bbd26dc6d5 100644 --- a/Dashboard/app/css/main.scss +++ b/Dashboard/app/css/main.scss @@ -3921,7 +3921,7 @@ div.chooseSurveyData { position: relative; display: block; float: left; - margin: 10px 0; + margin: -30px 0 10px 0; width: 100%; height: 20px; } From 8e83774e75b0a54b4d83284d850de10dfadc3ebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stellan=20Lagerstr=C3=B6m?= Date: Thu, 2 Mar 2017 09:08:38 +0100 Subject: [PATCH 08/33] [#1968]Extract JSON content; test the same name be creatred --- .../GraphicalSurveySummaryExporter.java | 5 ++--- .../dataexport/SurveySummaryExporter.java | 21 +++++++++++++++++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/GAE/src/org/waterforpeople/mapping/dataexport/GraphicalSurveySummaryExporter.java b/GAE/src/org/waterforpeople/mapping/dataexport/GraphicalSurveySummaryExporter.java index c2ef5b985c..6e4ecf767f 100644 --- a/GAE/src/org/waterforpeople/mapping/dataexport/GraphicalSurveySummaryExporter.java +++ b/GAE/src/org/waterforpeople/mapping/dataexport/GraphicalSurveySummaryExporter.java @@ -1426,11 +1426,10 @@ private void writeSummaryReport( while (sheet == null) { sheet = wb.getSheet(curTitle); if (sheet == null) { - sheet = wb.createSheet(WorkbookUtil - .createSafeSheetName(curTitle)); + sheet = wb.createSheet(curTitle); } else { sheet = null; - curTitle = title + " " + sheetCount; + curTitle = WorkbookUtil.createSafeSheetName(title + " " + sheetCount); sheetCount++; } } diff --git a/GAE/src/org/waterforpeople/mapping/dataexport/SurveySummaryExporter.java b/GAE/src/org/waterforpeople/mapping/dataexport/SurveySummaryExporter.java index bf4476ff29..e57b80b40b 100644 --- a/GAE/src/org/waterforpeople/mapping/dataexport/SurveySummaryExporter.java +++ b/GAE/src/org/waterforpeople/mapping/dataexport/SurveySummaryExporter.java @@ -192,9 +192,26 @@ protected Set formRollupStrings(Map responseMap) { String rollup = ""; int count = 0; for (int i = 0; i < rollupOrder.size() - j; i++) { - String val = responseMap.get(rollupOrder.get(i).getKeyId() - .toString()); + String val = responseMap.get(rollupOrder.get(i).getKeyId().toString()); if (val != null && val.trim().length() > 0) { + //Extract from JSON, if any + if (val.startsWith("[{")) { + try { + JSONArray arr = new JSONArray(val); + if (arr != null) { + JSONObject json = arr.getJSONObject(0); + if (json != null) { + QuestionGroupDto dto = new QuestionGroupDto(); + if (json.has("text")) { + val = json.getString("text"); + } + } + } + } catch (Exception e) { + log.error("Error in json parsing: " + e.getMessage(), e); + } + } + if (count > 0) { rollup += "|"; } From 368225598a6e93a13da65c9f8b1a0470ae567c9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stellan=20Lagerstr=C3=B6m?= Date: Thu, 2 Mar 2017 09:17:35 +0100 Subject: [PATCH 09/33] [#1968]Update copyright year. Fix spelling. --- .../mapping/dataexport/SurveySummaryExporter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GAE/src/org/waterforpeople/mapping/dataexport/SurveySummaryExporter.java b/GAE/src/org/waterforpeople/mapping/dataexport/SurveySummaryExporter.java index e57b80b40b..5d031f31d0 100644 --- a/GAE/src/org/waterforpeople/mapping/dataexport/SurveySummaryExporter.java +++ b/GAE/src/org/waterforpeople/mapping/dataexport/SurveySummaryExporter.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010-2016 Stichting Akvo (Akvo Foundation) + * Copyright (C) 2010-2017 Stichting Akvo (Akvo Foundation) * * This file is part of Akvo FLOW. * @@ -102,7 +102,7 @@ public class SurveySummaryExporter extends AbstractDataExporter { }); ROLLUP_MAP.put("MW", new String[] { "District", - "Tradtional Authoriaty (TA)", + "Traditional Authority (TA)", "Sub-Traditional Authority (Sub-TA)" }); ROLLUP_MAP.put("RW", new String[] { From 53d23296fc798a5d7a2bb87073b2b1d1edd44c4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Perdomo?= Date: Thu, 2 Mar 2017 10:03:11 +0100 Subject: [PATCH 10/33] [#1970] Refactor BaseDAO - Accepts `userId` as parameter - Uses generics to avoid raw types --- .../framework/dao/BaseDAO.java | 44 ++++++++++--------- .../gallatinsystems/survey/dao/SurveyDAO.java | 4 +- .../survey/dao/SurveyGroupDAO.java | 1 - 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/GAE/src/com/gallatinsystems/framework/dao/BaseDAO.java b/GAE/src/com/gallatinsystems/framework/dao/BaseDAO.java index 1791d432a4..c49f2122a9 100644 --- a/GAE/src/com/gallatinsystems/framework/dao/BaseDAO.java +++ b/GAE/src/com/gallatinsystems/framework/dao/BaseDAO.java @@ -284,32 +284,21 @@ public List list(Class c, String cursorString, Inte * * @return */ - @SuppressWarnings({ - "rawtypes", "unchecked" - }) - public List filterByUserAuthorizationObjectId(List allObjectsList) { + public List filterByUserAuthorizationObjectId(List allObjectsList, + Long userId) { if (!concreteClass.isAssignableFrom(SurveyGroup.class) && !concreteClass.isAssignableFrom(Survey.class)) { throw new UnsupportedOperationException("Cannot filter " + concreteClass.getSimpleName()); } - final Authentication authentication = SecurityContextHolder.getContext() - .getAuthentication(); - final Long userId = (Long) authentication.getCredentials(); - - // super admin list all - if (authentication.getAuthorities().contains(AppRole.SUPER_ADMIN)) { - return allObjectsList; - } - UserAuthorizationDAO userAuthorizationDAO = new UserAuthorizationDAO(); List userAuthorizationList = userAuthorizationDAO.listByUser(userId); if (userAuthorizationList.isEmpty()) { return Collections.emptyList(); } - Set securedObjectIds = new HashSet(); + Set securedObjectIds = new HashSet<>(); for (UserAuthorization auth : userAuthorizationList) { if (auth.getSecuredObjectId() != null) { securedObjectIds.add(auth.getSecuredObjectId()); @@ -317,7 +306,7 @@ public List filterByUserAuthorizationObjectId(List allObjectsList) { } // Set of all ancestor ids of secured objects - Set securedAncestorIds = new HashSet(); + Set securedAncestorIds = new HashSet<>(); for (Object obj : allObjectsList) { SecuredObject securedObject = (SecuredObject) obj; if (securedObjectIds.contains(securedObject.getObjectId())) { @@ -325,33 +314,46 @@ public List filterByUserAuthorizationObjectId(List allObjectsList) { } } - Set authorizedSet = new HashSet(); + Set authorizedSet = new HashSet<>(); if (concreteClass.isAssignableFrom(SurveyGroup.class)) { - for (Object obj : allObjectsList) { + for (E obj : allObjectsList) { SurveyGroup sg = (SurveyGroup) obj; Long sgId = sg.getKey().getId(); if (hasAuthorizedAncestors(sg.getAncestorIds(), securedObjectIds) || securedObjectIds.contains(sgId) || securedAncestorIds.contains(sgId)) { - authorizedSet.add(sg); + authorizedSet.add(obj); } } } else { - for (Object obj : allObjectsList) { + for (E obj : allObjectsList) { Survey s = (Survey) obj; List ancestorIds = s.getAncestorIds(); if (hasAuthorizedAncestors(ancestorIds, securedObjectIds)) { - authorizedSet.add(s); + authorizedSet.add(obj); } } } - List authorizedList = new ArrayList(); + List authorizedList = new ArrayList<>(); authorizedList.addAll(authorizedSet); return authorizedList; } + public List filterByUserAuthorizationObjectId(List allObjectsList) { + final Authentication authentication = SecurityContextHolder.getContext() + .getAuthentication(); + final Long userId = (Long) authentication.getCredentials(); + + // super admin list all + if (authentication.getAuthorities().contains(AppRole.SUPER_ADMIN)) { + return allObjectsList; + } + + return filterByUserAuthorizationObjectId(allObjectsList, userId); + } + /** * Check whether one or more items in the list of an entity's ancestor ids is present in the * list of authorized objects for a user. Return true if this is the case diff --git a/GAE/src/com/gallatinsystems/survey/dao/SurveyDAO.java b/GAE/src/com/gallatinsystems/survey/dao/SurveyDAO.java index 3e86a9c67f..580fac69b0 100644 --- a/GAE/src/com/gallatinsystems/survey/dao/SurveyDAO.java +++ b/GAE/src/com/gallatinsystems/survey/dao/SurveyDAO.java @@ -134,7 +134,6 @@ public String getSurveyDocument(Long id) { * * @return */ - @SuppressWarnings("unchecked") public List listAllFilteredByUserAuthorization() { List allSurveys = list(Constants.ALL_RESULTS); return filterByUserAuthorizationObjectId(allSurveys); @@ -224,8 +223,7 @@ public Survey getByPath(String code, String path) { * Deletes a survey * * @param survey - * @throws IllegalDeletionException - * - if the system contains responses for this survey + * @throws IllegalDeletionException - if the system contains responses for this survey */ public void delete(Survey survey) throws IllegalDeletionException { QuestionGroupDao qgDao = new QuestionGroupDao(); diff --git a/GAE/src/com/gallatinsystems/survey/dao/SurveyGroupDAO.java b/GAE/src/com/gallatinsystems/survey/dao/SurveyGroupDAO.java index 475c2c0556..48228891b5 100644 --- a/GAE/src/com/gallatinsystems/survey/dao/SurveyGroupDAO.java +++ b/GAE/src/com/gallatinsystems/survey/dao/SurveyGroupDAO.java @@ -98,7 +98,6 @@ public List listByProjectFolderId(Long parentId) { * * @return */ - @SuppressWarnings("unchecked") public List listAllFilteredByUserAuthorization() { List allSurveyGroups = list(Constants.ALL_RESULTS); return filterByUserAuthorizationObjectId(allSurveyGroups); From ddc1dbf4067093fd1c09652b3612f2b910838e1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Perdomo?= Date: Thu, 2 Mar 2017 10:07:03 +0100 Subject: [PATCH 11/33] [#1970] Update copyright header --- GAE/src/com/gallatinsystems/framework/dao/BaseDAO.java | 2 +- GAE/src/com/gallatinsystems/survey/dao/SurveyDAO.java | 2 +- GAE/src/com/gallatinsystems/survey/dao/SurveyGroupDAO.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/GAE/src/com/gallatinsystems/framework/dao/BaseDAO.java b/GAE/src/com/gallatinsystems/framework/dao/BaseDAO.java index c49f2122a9..d875469c12 100644 --- a/GAE/src/com/gallatinsystems/framework/dao/BaseDAO.java +++ b/GAE/src/com/gallatinsystems/framework/dao/BaseDAO.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010-2015 Stichting Akvo (Akvo Foundation) + * Copyright (C) 2010-2017 Stichting Akvo (Akvo Foundation) * * This file is part of Akvo FLOW. * diff --git a/GAE/src/com/gallatinsystems/survey/dao/SurveyDAO.java b/GAE/src/com/gallatinsystems/survey/dao/SurveyDAO.java index 580fac69b0..72da80a94d 100644 --- a/GAE/src/com/gallatinsystems/survey/dao/SurveyDAO.java +++ b/GAE/src/com/gallatinsystems/survey/dao/SurveyDAO.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010-2013 Stichting Akvo (Akvo Foundation) + * Copyright (C) 2010-2017 Stichting Akvo (Akvo Foundation) * * This file is part of Akvo FLOW. * diff --git a/GAE/src/com/gallatinsystems/survey/dao/SurveyGroupDAO.java b/GAE/src/com/gallatinsystems/survey/dao/SurveyGroupDAO.java index 48228891b5..19bfe55390 100644 --- a/GAE/src/com/gallatinsystems/survey/dao/SurveyGroupDAO.java +++ b/GAE/src/com/gallatinsystems/survey/dao/SurveyGroupDAO.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010-2012 Stichting Akvo (Akvo Foundation) + * Copyright (C) 2010-2017 Stichting Akvo (Akvo Foundation) * * This file is part of Akvo FLOW. * From 82da2592b416c67d291b3f57c3fc8a240d094709 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Sans?= Date: Mon, 6 Mar 2017 13:35:25 +0200 Subject: [PATCH 12/33] [#1974] Aligned button to new style --- Dashboard/app/css/main.scss | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/Dashboard/app/css/main.scss b/Dashboard/app/css/main.scss index 2ffb597c0d..de7f98e2d8 100644 --- a/Dashboard/app/css/main.scss +++ b/Dashboard/app/css/main.scss @@ -1558,16 +1558,9 @@ table.previewList { } #assignSurveys .fieldSetWrap fieldset table tfoot td a { - display: block; float: right; - padding: 5px 3px; - width: 10%; - background: rgb(0, 123, 182); - color: white; - -webkit-transition: background 0.5s ease-in; - transition: background 0.5s ease-in; - -o-border-radius: 0 0 5px 5px; - border-radius: 0 0 5px 5px; + + @include button($flowAnchorLink); } #assignSurveys .fieldSetWrap fieldset table tfoot td a:hover { From 8675faa18558a2aeaae55a6d7516050369c59174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Sans?= Date: Mon, 6 Mar 2017 13:39:41 +0200 Subject: [PATCH 13/33] [#1974] Hover state dealt with --- Dashboard/app/css/main.scss | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Dashboard/app/css/main.scss b/Dashboard/app/css/main.scss index de7f98e2d8..1781ce8e6d 100644 --- a/Dashboard/app/css/main.scss +++ b/Dashboard/app/css/main.scss @@ -1563,11 +1563,6 @@ table.previewList { @include button($flowAnchorLink); } -#assignSurveys .fieldSetWrap fieldset table tfoot td a:hover { - background: rgb(107, 134, 141); - color: white; -} - .groupPreview { width: 37.5%; } From 9dee3ca7eff8de128707de9caf6d855103142f10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Sans?= Date: Tue, 7 Mar 2017 15:15:51 +0200 Subject: [PATCH 14/33] [#1852] First batch of changes --- Dashboard/app/css/main.scss | 744 ++++++++---------- .../assignment-list.handlebars | 2 +- .../bootstrap-tab/survey-bootstrap.handlebars | 2 +- .../devices-list-tab/devices-list.handlebars | 2 +- .../navDevices/nav-devices.handlebars | 16 +- 5 files changed, 356 insertions(+), 410 deletions(-) diff --git a/Dashboard/app/css/main.scss b/Dashboard/app/css/main.scss index b330f1c3f0..4f6ea6a11e 100644 --- a/Dashboard/app/css/main.scss +++ b/Dashboard/app/css/main.scss @@ -27,6 +27,7 @@ body { height: 100%; -ms-overflow-style: -ms-autohiding-scrollbar; overflow-x: hidden; + padding-top: 110px; } h1 { @@ -204,11 +205,11 @@ pre { } /************************* links *************************/ -.button { +.button, .standardBtn { @include button($flowAnchorLink); } -.smallButton { +.smallButton, .smallBtn { @include smallButton($flowAnchorLink); } @@ -559,66 +560,6 @@ label[for=newDeviceGroupName] { width: 70%; } -/* page structure ---------------------------------------------- */ - -.widthConstraint { - position: relative; - margin: 0 auto 0 auto; - padding: 0; - width: 100%; - min-width: 768px; -} - -.belowHeader { - padding-top: 55px; - padding-bottom: 0px; - background: white; -} - -.middleSection { - overflow: hidden; - - /*margin: 0 0 20px 0;*/ - padding: 90px 0 40px 0; -} - -.leftSidebar { - box-sizing: border-box; - left: 0; - top: 112px; - bottom: 56px; - position: fixed; - float: left; - width: 20em; - overflow-y: scroll; - overflow-x: hidden; -} - -.mainRight { - float: left; - width: calc(100% - 20em); - margin-left: 20em; - overflow-y: auto; -} - -.mainLeft { - position: relative; - float: left; - width: 78%; -} - -.fullWidth { - position: relative; - width: 100%; -} - -.mainContent { - margin: 0 auto; - padding: 0 0 0 0; - width: 99%; -} - /* .header --------------------------------------------- */ @@ -670,9 +611,7 @@ header.top { } .languageSelector { - position: absolute; - top: 7px; - right: 0.25%; + margin-top: 4px; .labelText { display: block; @@ -993,6 +932,35 @@ nav.appNav { } } */ +/* page structure +--------------------------------------------- */ + +.widthConstraint { + position: relative; + margin: 0 auto 0 auto; + padding: 0; + width: 100%; + min-width: 768px; +} + +.middleSection { + overflow: hidden; + + /*margin: 0 0 20px 0;*/ + padding: 90px 0 40px 0; +} + +.fullWidth { + position: relative; + width: 100%; +} + +.mainContent { + margin: 0 auto; + padding: 0 0 0 0; + width: 99%; +} + @mixin bgDetails { background-repeat: no-repeat; background-position: center 12px; @@ -1651,143 +1619,6 @@ th.action { display: inline-block; } -/*-------------------------------------------------------------------- - Tabs Styling -----------------------------------------------------------------------*/ -#tabs { - position: relative; - - /*overflow-y: scroll;*/ - height: 100%; - width: 99.5%; - margin: 0 auto; -} - -#tabs div > section { - border-top: thin solid white; - background: white; - - &.cascadeSection { - background: $projectBackground; - box-sizing: border-box; - width: 100%; - padding: 15px 0; - margin: 0 auto; - -ms-overflow-style: none; - overflow-y: scroll; - } -} - -#tabs section h1, -.messagesList h1, -.usersList h1, -.surveyTranslation > h1 { - display: block; - margin: 0.5em 0 0.5em 0.5em; - color: $flowAnchorLinkHover; - font-weight: 400; -} - -#tabs div > section h3 { - -moz-text-shadow: 0 -1px 0 rgb(185, 185, 185), 0 2px 0 white; - -webkit-text-shadow: 0 -1px 0 rgb(185, 185, 185), 0 2px 0 white; - -o-text-shadow: 0 -1px 0 rgb(185, 185, 185), 0 2px 0 white; - text-shadow: 0 -1px 0 rgb(185, 185, 185), 0 2px 0 white; -} - -#tabs { - position: relative; - - nav.tabNav { - display: block; - padding: 15px 0 1px 0; - width: 100%; - background-color: white; - position: fixed; - margin-top: -40px; - z-index: 9999; - - ul { - padding: 0; - overflow: auto; - background: rgb(252, 252, 255); - - &:after { - content: ""; - display: block; - overflow: auto; - margin-top: -1px; - width: 100%; - height: 1px; - border-bottom: thin solid rgba($akvoBlack, 0.2); - } - - li { - display: inline; - float: left; - margin: 0 0px -2px 0; - font-size: 90%; - - @include border-radius(0 0 0 0); - - background: rgba($akvoBlack, 0); - -webkit-background-clip: padding-box; - background-clip: padding-box; - -webkit-transition: none; - transition: none; - -moz-background-clip: padding; - -webkit-background-clip: padding-box; - border: thin solid transparent; - - &:hover { - border: thin solid rgba($akvoBlack, 0.2); - border-bottom: thin solid white; - } - - &.active { - position: relative; - background: rgba(white, 1); - border-top: 2px solid rgba($akvoFlow, 1); - border-left: thin solid rgba($akvoBlack, 0.2); - border-right: thin solid rgba($akvoBlack, 0.2); - border-bottom: thin solid white; - cursor: not-allowed; - - &:hover { - background: rgba($akvoBlack, 0); - } - - a { - color: rgba($akvoBlack, 1); - text-shadow: none; - -webkit-text-shadow: none; - -moz-text-shadow: none; - - &:hover { - color: rgba($akvoBlack, 1); - text-shadow: none; - -webkit-text-shadow: none; - -moz-text-shadow: none; - } - } - } - - a { - display: block; - padding: 10px 15px; - color: rgba($akvoBlack, 0.5); - -webkit-transition: none; - transition: none; - - &:hover { - color: rgba($akvoBlack, 1); - } - } - } - } - } -} - /* Survey styles --------------------------------------------- */ @@ -1825,23 +1656,6 @@ a.text_label {} width: 77%; } -.topBar { - input[type="text"] { - padding: 5px; - margin: 16px 0 0 10px; - width: 20%; - } - - .addCascade { - input[type="text"] { - width: 50%; - margin: 0 10px 0 0; - padding: 9px 10px; - background: lighten($akvoDarkBlue, 50%); - } - } -} - .no-textshadow .leftSidebar h2 { color: rgb(125, 125, 125); } @@ -2092,166 +1906,212 @@ a.FadeIt { section.topBar { position: fixed; - margin: -20px auto 0 auto; + top: 53px; + margin: 0px auto 0 auto; z-index: 9998; width: 100%; - background: white; box-shadow: 0 1px 3px rgba($akvoBlack, 0.1); - - #tabs & { - margin-top: 0px; - padding-top: 10px; - } + padding: 0 0 0px 0; + background: white; &.activeMenu { border: 1px solid rgb(212, 212, 212); } -} -section.topBar ~ * { - margin-top: 70px; + /*-------------------------------------------------------------------- + Tabs Styling + ----------------------------------------------------------------------*/ + #tabs { + position: relative; - #tabs & { - margin-top: 90px; + /*overflow-y: scroll;*/ + height: 100%; + width: 100%; + margin: 0 auto; } -} -.surveyLandingText { - display: inherit; - vertical-align: middle; - text-align: center; - color: rgb(204, 204, 204); - padding: 1em 3em; - text-shadow: 0px 2px 1px rgba(247, 242, 229, 0.5); -} + #tabs div > section { + border-top: thin solid white; -section.topBar h2 { - display: inline-table; - max-width: 45%; - color: rgb(44, 42, 116); + &.cascadeSection { + background: $projectBackground; + box-sizing: border-box; + width: 100%; + padding: 15px 0; + margin: 0 auto; + -ms-overflow-style: none; + overflow-y: scroll; + } + } - @include noWrapTxt; + #tabs section h1, + .messagesList h1, + .usersList h1, + .surveyTranslation > h1 { + display: block; + margin: 0.5em 0 0.5em 0.5em; + color: $flowAnchorLinkHover; + font-weight: 400; + } - margin: 5px 0 0 15px; -} + #tabs div > section h3 { + -moz-text-shadow: 0 -1px 0 rgb(185, 185, 185), 0 2px 0 white; + -webkit-text-shadow: 0 -1px 0 rgb(185, 185, 185), 0 2px 0 white; + -o-text-shadow: 0 -1px 0 rgb(185, 185, 185), 0 2px 0 white; + text-shadow: 0 -1px 0 rgb(185, 185, 185), 0 2px 0 white; + } -section.topBar > a { - position: relative; - display: inline-block; -} + #tabs { + position: relative; -section.topBar > a:hover { - color: $flowAnchorLinkHover; -} + nav.tabNav { + display: block; + padding: 0px 0 0px 0; + width: 100%; + background-color: white; + position: fixed; + z-index: 9999; + margin-bottom: 0px; -section.topBar > a.smallBtn { - margin: 0 10px; - color: rgb(235, 235, 235); -} + ul { + padding: 0; + overflow: auto; + background: rgb(252, 252, 255); -nav.menuTopbar { - margin: 0 auto 0; - padding: 0 0 10px 0; -} + &:after { + content: ""; + display: block; + overflow: auto; + margin-top: -1px; + width: 100%; + height: 1px; + border-bottom: thin solid rgba($akvoBlack, 0.2); + } -section.topBar { - padding: 0 0 10px 0; - width: 100%; + li { + display: inline; + float: left; + margin: 0 0px -2px 0; + font-size: 90%; - nav { - &.breadCrumb { - margin-left: 0.5%; - padding: 10px 0; - width: 65.5%; - float: left; - } + @include border-radius(0 0 0 0); - &.menuTopbar { - margin-right: 0.5%; - padding: 10px 0; - width: 33.5%; - float: right; - } - } + background: rgba($akvoBlack, 0); + -webkit-background-clip: padding-box; + background-clip: padding-box; + -webkit-transition: none; + transition: none; + -moz-background-clip: padding; + -webkit-background-clip: padding-box; + border: thin solid transparent; - nav.breadCrumb { - ul li { - display: inline-block; - height: 34px; - line-height: 34px; - width: auto; - margin: 5px 3px 0 0; - text-indent: 19px; - position: relative; - } + &:hover { + border: thin solid rgba($akvoBlack, 0.2); + border-bottom: thin solid white; + } - ul li:before { - content: " "; - height: 0; - width: 0; - position: absolute; - left: -2px; - border-style: solid; - border-width: 17px 0 17px 17px; - border-color: transparent transparent transparent #fff; - z-index: 0; - } + &.active { + position: relative; + background: rgba(white, 1); + border-top: 2px solid rgba($akvoFlow, 1); + border-left: thin solid rgba($akvoBlack, 0.2); + border-right: thin solid rgba($akvoBlack, 0.2); + border-bottom: thin solid white; + cursor: not-allowed; - ul li:first-child:before { - border-color: transparent; - } + &:hover { + background: rgba($akvoBlack, 0); + } + + a { + color: rgba($akvoBlack, 1); + text-shadow: none; + -webkit-text-shadow: none; + -moz-text-shadow: none; - ul li a:after { - content: " "; - height: 0; - width: 0; - position: absolute; - right: -17px; - border-style: solid; - border-width: 17px 0 17px 17px; - border-color: transparent transparent transparent $akvoLightBlue; - z-index: 10; + &:hover { + color: rgba($akvoBlack, 1); + text-shadow: none; + -webkit-text-shadow: none; + -moz-text-shadow: none; + } + } + } + + a { + display: block; + padding: 10px 15px; + color: rgba($akvoBlack, 0.5); + -webkit-transition: none; + transition: none; + + &:hover { + color: rgba($akvoBlack, 1); + } + } + } + } } + } - ul li a { - display: block; - background: $akvoLightBlue; - color: white; + nav { + &.breadCrumb { + margin-left: 0.5%; + width: 65.5%; + float: left; - @include noWrapTxt; + ul li { + white-space: nowrap; + display: inline-block; + height: 34px; + line-height: 34px; + width: auto; + margin: 5px 3px 0 -1px; + text-indent: 19px; + position: relative; + max-width: 175px; + } - &:hover { - background: $flowAnchorLinkHover; + ul li:before { + content: " "; + height: 0; + width: 0; + position: absolute; + left: -2px; + border-style: solid; + border-width: 17px 0 17px 17px; + border-color: transparent transparent transparent #fff; + z-index: 0; } - &.homeRoot { - border-radius: 3px 0 0 3px; - width: 40px; - background: url(../images/breadCrumb-Root.png) center center no-repeat $akvoLightBlue; - text-indent: -9999px; - z-index: 9999; - margin-left: 0; + ul li:first-child:before { + border-color: transparent; + } - &:hover { - background: url(../images/breadCrumb-Root.png) center center no-repeat $flowAnchorLinkHover; - } + ul li a:after { + content: " "; + height: 0; + width: 0; + position: absolute; + right: -17px; + border-style: solid; + border-width: 17px 0 17px 17px; + border-color: transparent transparent transparent $akvoLightBlue; + z-index: 10; } - } - ul li a:hover:after { - border-color: transparent transparent transparent $flowAnchorLinkHover; - } + ul li a { + display: block; + background: $akvoLightBlue; + color: white; - ul li:last-of-type { - opacity: 0.8; + @include noWrapTxt; - a { - border-radius: 0 3px 3px 0; - padding-right: 15px; - background: $flowAnchorLinkHover; + &:hover { + background: $flowAnchorLinkHover; + } &.homeRoot { - padding-right: 0; border-radius: 3px 0 0 3px; width: 40px; background: url(../images/breadCrumb-Root.png) center center no-repeat $akvoLightBlue; @@ -2259,85 +2119,167 @@ section.topBar { z-index: 9999; margin-left: 0; - &:after { - content: " "; - height: 0; - width: 0; - position: absolute; - right: -17px; - border-style: solid; - border-width: 17px 0 17px 17px; - border-color: transparent transparent transparent $akvoLightBlue; - z-index: 10; + &:hover { + background: url(../images/breadCrumb-Root.png) center center no-repeat $flowAnchorLinkHover; } + } + } - &:hover { + ul li a:hover:after { + border-color: transparent transparent transparent $flowAnchorLinkHover; + } + + ul li:last-of-type { + opacity: 0.8; + + a { + border-radius: 0 3px 3px 0; + padding-right: 15px; + background: $flowAnchorLinkHover; + + &.homeRoot { + padding-right: 0; + border-radius: 3px 0 0 3px; + width: 40px; background: url(../images/breadCrumb-Root.png) center center no-repeat $akvoLightBlue; + text-indent: -9999px; + z-index: 9999; + margin-left: 0; + + &:after { + content: " "; + height: 0; + width: 0; + position: absolute; + right: -17px; + border-style: solid; + border-width: 17px 0 17px 17px; + border-color: transparent transparent transparent $akvoLightBlue; + z-index: 10; + } + + &:hover { + background: url(../images/breadCrumb-Root.png) center center no-repeat $akvoLightBlue; + } } - } - &:after { - border-width: 0; + &:after { + border-width: 0; - &:hover { - background: $akvoLightBlue; + &:hover { + background: $akvoLightBlue; + } } } } } - } - nav.menuTopbar { - margin: 0 auto 0; - padding: 10px 0; + &.menuTopbar { + margin-right: 0.5%; + width: 33.5%; + float: right; - h3 { - color: rgb(198, 198, 198); - margin: 0; - padding: 0; + h3 { + color: rgb(198, 198, 198); + margin: 0; + padding: 0; - &.actionTitleEdit { - padding: 5px 5px 5px 15px; - background: url(../images/IconEditGreyLight.svg) left center no-repeat; - background-size: 15px; + &.actionTitleEdit { + padding: 5px 5px 5px 15px; + background: url(../images/IconEditGreyLight.svg) left center no-repeat; + background-size: 15px; + } } - } - ul { - width: 100%; + ul { + width: 100%; - li { - margin: 10px 10px 0 0; - float: right; + li { + margin: 10px 10px 0 0; + float: right; - &:first-child { - margin: 10px 0 0 0; - } + &:first-child { + margin: 10px 0 0 0; + } - p { - color: $midGrey; + p { + color: $midGrey; - .itemMoved { - color: $akvoDarkBlue; - font-weight: bold; - margin-right: 5px; - margin-left: 5px; + .itemMoved { + color: $akvoDarkBlue; + font-weight: bold; + margin-right: 5px; + margin-left: 5px; + } } } } - } - &.actionHighLighted { - border: 1px solid rgb(241, 242, 242); + &.actionHighLighted { + border: 1px solid rgb(241, 242, 242); - li { - &:first-child { - float: left; - margin: 10px 0 0 10px; + li { + &:first-child { + float: left; + margin: 10px 0 0 10px; + } } } } } + + input[type="text"] { + padding: 5px; + margin: 16px 0 0 10px; + width: 20%; + } + + .addCascade { + input[type="text"] { + width: 50%; + margin: 0 10px 0 0; + padding: 9px 10px; + background: lighten($akvoDarkBlue, 50%); + } + } +} + +.surveyLandingText { + display: inherit; + vertical-align: middle; + text-align: center; + color: rgb(204, 204, 204); + padding: 1em 3em; + text-shadow: 0px 2px 1px rgba(247, 242, 229, 0.5); +} + +section.topBar h2 { + display: inline-table; + max-width: 45%; + color: rgb(44, 42, 116); + + @include noWrapTxt; + + margin: 5px 0 0 15px; +} + +section.topBar > a { + position: relative; + display: inline-block; +} + +section.topBar > a:hover { + color: $flowAnchorLinkHover; +} + +section.topBar > a.smallBtn { + margin: 0 10px; + color: rgb(235, 235, 235); +} + +nav.menuTopbar { + margin: 0 auto 0; + padding: 0 0 10px 0; } #surveyCreator nav.menuTopbar ul { @@ -2421,6 +2363,7 @@ li.aSurvey { -o-border-radius: 0.3em; border-radius: 0.3em; clear: both; + overflow: auto; &:hover { cursor: default; @@ -3413,7 +3356,7 @@ nav.questionActionMenu a:hover { display: inline; } -.innerContent nav ul li a.standardBtn { +.innerContent nav ul li a.button { margin: 2em 1.5em auto auto; width: 15%; } @@ -4128,6 +4071,7 @@ div.dataCollectedDate label input { background: rgb(241, 241, 241); overflow-style: marquee-line; border-bottom: 2px solid rgb(158, 158, 158); + font-size: 80%; } #pointDetails h2 { @@ -4180,8 +4124,6 @@ div.dataCollectedDate label input { border-top: none; } -.publicPage {} - div#drawHandleWrap { position: relative; display: block; @@ -4279,6 +4221,7 @@ div.drawHandle { -----------------------------------------------*/ footer.bottomPage { + position: absolute; bottom: 0; margin: 20px 0 0 0; padding: 10px 0 0 0; @@ -5962,6 +5905,8 @@ ul.cascadeAction { a { @include btnOutline($flowAnchorLink); + padding-left: 30px; + &.saveNewSurvey { background: rgba(32, 32, 36, 0.5) url(../images/IconSave.svg) left center no-repeat; background-size: 40px 40px; @@ -6182,16 +6127,14 @@ li.disable { /* Set device buttons on device tab to position: fixed */ .deviceControls { position: fixed; - top: 100px; + top: 96px; left: 0px; right: 0px; - height: 40px; z-index: 1; background-color: white; box-shadow: 0 1px 3px rgba(32, 32, 36, 0.1); width: 99.5%; - margin: 0 0.25%; - padding: 5px 0.25%; + padding: 5px 0.25% 10px 0.25%; > a { margin-top: 10px; @@ -6204,7 +6147,7 @@ li.disable { } + div + .dataTable { - margin-top: 80px; + margin-top: 40px; } + .dataTable { @@ -6426,6 +6369,7 @@ html.navMaps, .public { } iframe { + height: 100vh; min-height: calc(100% - 225px); } diff --git a/Dashboard/app/js/templates/navDevices/assignment-list-tab/assignment-list.handlebars b/Dashboard/app/js/templates/navDevices/assignment-list-tab/assignment-list.handlebars index cee81fdbc1..fc13f56ccd 100644 --- a/Dashboard/app/js/templates/navDevices/assignment-list-tab/assignment-list.handlebars +++ b/Dashboard/app/js/templates/navDevices/assignment-list-tab/assignment-list.handlebars @@ -1,4 +1,4 @@ -
      +
      {{#view FLOW.AssignmentsListTabView}} diff --git a/Dashboard/app/js/templates/navDevices/bootstrap-tab/survey-bootstrap.handlebars b/Dashboard/app/js/templates/navDevices/bootstrap-tab/survey-bootstrap.handlebars index 5bdeccb7ea..7d989377ad 100644 --- a/Dashboard/app/js/templates/navDevices/bootstrap-tab/survey-bootstrap.handlebars +++ b/Dashboard/app/js/templates/navDevices/bootstrap-tab/survey-bootstrap.handlebars @@ -1,5 +1,5 @@ {{#view FLOW.SurveyBootstrap}} -
      +

      {{t _manual_survey_transfer}}

      diff --git a/Dashboard/app/js/templates/navDevices/devices-list-tab/devices-list.handlebars b/Dashboard/app/js/templates/navDevices/devices-list-tab/devices-list.handlebars index b206c3b376..0a9ee809a3 100644 --- a/Dashboard/app/js/templates/navDevices/devices-list-tab/devices-list.handlebars +++ b/Dashboard/app/js/templates/navDevices/devices-list-tab/devices-list.handlebars @@ -1,4 +1,4 @@ -
      +
      {{#view FLOW.CurrentDevicesTabView}} diff --git a/Dashboard/app/js/templates/navDevices/nav-devices.handlebars b/Dashboard/app/js/templates/navDevices/nav-devices.handlebars index 307330536f..f307453983 100644 --- a/Dashboard/app/js/templates/navDevices/nav-devices.handlebars +++ b/Dashboard/app/js/templates/navDevices/nav-devices.handlebars @@ -1,8 +1,10 @@ -
      -
      - +
      +
      + +
      +
      +
      {{outlet}} -
      -
      +
      From 336e5056c2a3549b4b2c3159dbaa976655cda9a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Sans?= Date: Tue, 7 Mar 2017 15:34:20 +0200 Subject: [PATCH 15/33] [#1852] Data tab revisited --- Dashboard/app/css/main.scss | 6 ++++-- .../navData/cascade-resources.handlebars | 2 +- .../js/templates/navData/nav-data.handlebars | 18 ++++++++++-------- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Dashboard/app/css/main.scss b/Dashboard/app/css/main.scss index 4f6ea6a11e..0d49c4f4ac 100644 --- a/Dashboard/app/css/main.scss +++ b/Dashboard/app/css/main.scss @@ -12,7 +12,6 @@ html { width: 100%; height: 100%; overflow-y: scroll; - border-top: 3px solid rgb(38, 8, 89); box-sizing: border-box; color: rgb(36, 48, 50); font-size: 16px; @@ -27,7 +26,6 @@ body { height: 100%; -ms-overflow-style: -ms-autohiding-scrollbar; overflow-x: hidden; - padding-top: 110px; } h1 { @@ -943,6 +941,10 @@ nav.appNav { min-width: 768px; } +.belowHeader { + padding-top: 110px; +} + .middleSection { overflow: hidden; diff --git a/Dashboard/app/js/templates/navData/cascade-resources.handlebars b/Dashboard/app/js/templates/navData/cascade-resources.handlebars index ed3f803ddd..d66643613b 100644 --- a/Dashboard/app/js/templates/navData/cascade-resources.handlebars +++ b/Dashboard/app/js/templates/navData/cascade-resources.handlebars @@ -1,7 +1,7 @@ {{#view FLOW.CascadeResourceView}}
      -
      +
      From b7b702438e8aa17d1227c0c129347b93cbccfb8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stellan=20Lagerstr=C3=B6m?= Date: Wed, 8 Mar 2017 18:15:13 +0100 Subject: [PATCH 17/33] [#1968]Use our std util for extracting string from JSON. --- .../dataexport/SurveySummaryExporter.java | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/GAE/src/org/waterforpeople/mapping/dataexport/SurveySummaryExporter.java b/GAE/src/org/waterforpeople/mapping/dataexport/SurveySummaryExporter.java index 5d031f31d0..a63edbb22d 100644 --- a/GAE/src/org/waterforpeople/mapping/dataexport/SurveySummaryExporter.java +++ b/GAE/src/org/waterforpeople/mapping/dataexport/SurveySummaryExporter.java @@ -37,6 +37,7 @@ import javax.swing.JLabel; import javax.swing.JPanel; +import org.akvo.flow.domain.DataUtils; import org.apache.log4j.Logger; import org.json.JSONArray; import org.json.JSONObject; @@ -195,21 +196,9 @@ protected Set formRollupStrings(Map responseMap) { String val = responseMap.get(rollupOrder.get(i).getKeyId().toString()); if (val != null && val.trim().length() > 0) { //Extract from JSON, if any - if (val.startsWith("[{")) { - try { - JSONArray arr = new JSONArray(val); - if (arr != null) { - JSONObject json = arr.getJSONObject(0); - if (json != null) { - QuestionGroupDto dto = new QuestionGroupDto(); - if (json.has("text")) { - val = json.getString("text"); - } - } - } - } catch (Exception e) { - log.error("Error in json parsing: " + e.getMessage(), e); - } + String jsonval = DataUtils.jsonResponsesToPipeSeparated(val); + if (jsonval.length() > 0) { + val = jsonval; } if (count > 0) { From ac9a9b875aa9a23b2414c189af6791071cf72562 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Perdomo?= Date: Wed, 8 Mar 2017 19:45:21 +0100 Subject: [PATCH 18/33] [#1970] Update call site of BaseDAO.filterByUserAuthorizationObjectId - Based on code review from @muloem --- .../mapping/app/web/rest/SurveyRestService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/GAE/src/org/waterforpeople/mapping/app/web/rest/SurveyRestService.java b/GAE/src/org/waterforpeople/mapping/app/web/rest/SurveyRestService.java index 13b2bdf9e3..6173cc6afe 100644 --- a/GAE/src/org/waterforpeople/mapping/app/web/rest/SurveyRestService.java +++ b/GAE/src/org/waterforpeople/mapping/app/web/rest/SurveyRestService.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012-2015 Stichting Akvo (Akvo Foundation) + * Copyright (C) 2012-2017 Stichting Akvo (Akvo Foundation) * * This file is part of Akvo FLOW. * @@ -16,6 +16,8 @@ package org.waterforpeople.mapping.app.web.rest; +import static com.gallatinsystems.common.Constants.ANCESTOR_IDS_FIELD; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -42,7 +44,6 @@ import org.waterforpeople.mapping.app.web.rest.dto.SurveyPayload; import org.waterforpeople.mapping.dao.QuestionAnswerStoreDao; -import static com.gallatinsystems.common.Constants.ANCESTOR_IDS_FIELD; import com.gallatinsystems.survey.dao.SurveyDAO; import com.gallatinsystems.survey.dao.SurveyUtils; import com.gallatinsystems.survey.domain.Survey; @@ -143,9 +144,8 @@ public Map listSurveysByGroupId( } if (surveys != null) { - for (Object obj : surveyDao.filterByUserAuthorizationObjectId(surveys)) { + for (Survey s : surveyDao.filterByUserAuthorizationObjectId(surveys)) { SurveyDto dto = new SurveyDto(); - Survey s = (Survey) obj; DtoMarshaller.copyToDto(s, dto); // add surveyInstance Count From f803a30ba7d7a74225e966e3554d749e30ae10e6 Mon Sep 17 00:00:00 2001 From: Emmanuel Mulo Date: Thu, 9 Mar 2017 18:23:05 +0100 Subject: [PATCH 19/33] [#498] Remove `countries` element from flowenv object --- .../controllers/maps-controllers-common.js | 47 ------------------- .../mapping/app/web/EnvServlet.java | 24 ---------- 2 files changed, 71 deletions(-) diff --git a/Dashboard/app/js/lib/controllers/maps-controllers-common.js b/Dashboard/app/js/lib/controllers/maps-controllers-common.js index 8c6a049810..17d4592635 100644 --- a/Dashboard/app/js/lib/controllers/maps-controllers-common.js +++ b/Dashboard/app/js/lib/controllers/maps-controllers-common.js @@ -153,53 +153,6 @@ FLOW.placemarkController = Ember.ArrayController.create({ }); -FLOW.countryController = Ember.ArrayController.create({ - content: [], - country: null, - countryCode: null, - - init: function () { - this._super(); - if (!Ember.none(FLOW.Env) && !Ember.none(FLOW.Env.countries)) { - this.set('content', this.getContent(FLOW.Env.countries)); - } - }, - - /** - Helper function to parse backend countries to countryList - */ - getContent: function (countries) { - var countryList = []; - - countries.sort(function (a, b) { - if (a.name < b.name) return -1; - if (a.name > b.name) return 1; - return 0; - }); - - for (var i = 0; i < countries.length; i++) { - if (!Ember.none(countries[i].centroidLat) && !Ember.none(countries[i].centroidLon)) { - var zoom = 7; // default zoom level - if (!Ember.none(countries[i].zoomLevel)) { - zoom = countries[i].zoomLevel; - } - - countryList.push( - Ember.Object.create({ - label: countries[i].name, - iso: countries[i].isoAlpha2Code, - lat: countries[i].centroidLat, - lon: countries[i].centroidLon, - zoom: zoom - }) - ); - } - } - return countryList; - } -}); - - FLOW.placemarkDetailController = Ember.ArrayController.create({ content: Ember.A(), sortProperties: ['order'], diff --git a/GAE/src/org/waterforpeople/mapping/app/web/EnvServlet.java b/GAE/src/org/waterforpeople/mapping/app/web/EnvServlet.java index ed13c7ae78..c2f2d322b0 100644 --- a/GAE/src/org/waterforpeople/mapping/app/web/EnvServlet.java +++ b/GAE/src/org/waterforpeople/mapping/app/web/EnvServlet.java @@ -36,14 +36,9 @@ import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; -import org.json.JSONArray; -import org.json.JSONObject; import org.waterforpeople.mapping.app.web.rest.security.AppRole; -import com.gallatinsystems.common.Constants; import com.gallatinsystems.common.util.PropertyUtil; -import com.gallatinsystems.framework.dao.BaseDAO; -import com.gallatinsystems.gis.geography.domain.Country; import com.gallatinsystems.user.dao.UserDao; import com.gallatinsystems.user.domain.User; import com.google.appengine.api.users.UserServiceFactory; @@ -142,25 +137,6 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) props.put("appId", SystemProperty.applicationId.get()); - final BaseDAO countryDAO = new BaseDAO(Country.class); - final JSONArray jsonArray = new JSONArray(); - for (Country c : countryDAO.list(Constants.ALL_RESULTS)) { - if (c.getIncludeInExternal() != null - && c.getIncludeInExternal() - && (c.getCentroidLat().equals(0d) || c.getCentroidLon() - .equals(0d))) { - log.log(Level.SEVERE, - "Country " - + c.getIsoAlpha2Code() - + " was configured to show in the map, but doesn't have proper centroids"); - continue; - } - if (c.getIncludeInExternal() != null && c.getIncludeInExternal()) { - jsonArray.put(new JSONObject(c)); - } - } - props.put("countries", jsonArray.toString()); - // load language configuration and strings if present addLocale(props); From 77ec8192ed7378353ac59db0cb6901658eefa511 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Perdomo?= Date: Fri, 10 Mar 2017 10:46:12 +0100 Subject: [PATCH 20/33] [#1985] Enable tracing of Remote API calls with a different enpoint - The client must configure the `remoteApiPath` to be something unique in order to group calls for a given API request - The Remote API functionality remains unchanged, we just expose it in in a different path: /traced_remote_api/* - The client can use *anything* after the last slash, e.g. /traced_remote_api// /traced_remote_api/// The only restriction is to use the same path within the set of requests --- .../akvo/flow/api/TracedRemoteApiServlet.java | 51 +++++++++++++++++++ GAE/war/WEB-INF/web.xml | 8 +++ 2 files changed, 59 insertions(+) create mode 100644 GAE/src/org/akvo/flow/api/TracedRemoteApiServlet.java diff --git a/GAE/src/org/akvo/flow/api/TracedRemoteApiServlet.java b/GAE/src/org/akvo/flow/api/TracedRemoteApiServlet.java new file mode 100644 index 0000000000..13804980be --- /dev/null +++ b/GAE/src/org/akvo/flow/api/TracedRemoteApiServlet.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2017 Stichting Akvo (Akvo Foundation) + * + * This file is part of Akvo FLOW. + * + * Akvo FLOW is free software: you can redistribute it and modify it under the terms of + * the GNU Affero General Public License (AGPL) as published by the Free Software Foundation, + * either version 3 of the License or any later version. + * + * Akvo FLOW is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU Affero General Public License included below for more details. + * + * The full license text can also be seen at . + */ + +package org.akvo.flow.api; + +import java.io.IOException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.google.apphosting.utils.remoteapi.RemoteApiServlet; + +/* + * A class used for tracing/grouping Remote API calls + * + * Rationale: We want to be able to group/trace/correlate a set of Remote API calls, + * to achieve this the client _must_ configure the RemoteApiOptions.remoteApiPath to be a unique + * identifier for grouping requests, e.g. /traced_remote_api/uuid-1 + * Then we should be able in the logs to filter by a particular set as + * `path:/traced_remote_api/uuid-1` to get the relative cost of a given execution + * + * The API calls are just delegated to the default RemoteApiServlet + */ +public class TracedRemoteApiServlet extends RemoteApiServlet { + + private static final long serialVersionUID = 1762368166833558193L; + + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + super.doGet(request, response); + } + + @Override + public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + super.doPost(request, response); + } + +} diff --git a/GAE/war/WEB-INF/web.xml b/GAE/war/WEB-INF/web.xml index 9fcd68909b..acd64b635b 100644 --- a/GAE/war/WEB-INF/web.xml +++ b/GAE/war/WEB-INF/web.xml @@ -480,6 +480,14 @@ RemoteApi /remote_api + + TracedRemoteApi + org.akvo.flow.api.TracedRemoteApiServlet + + + RemoteApi + /traced_remote_api/* + persistenceFilter From a27f86f79788ce1cb6ed8172edeea566ce14ddd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Sans?= Date: Fri, 10 Mar 2017 11:49:45 +0200 Subject: [PATCH 21/33] [#1852] Fixed cascade tab --- Dashboard/app/css/main.scss | 15 ++++++++++++++ .../navData/cascade-resources.handlebars | 4 ++-- .../js/templates/navData/nav-data.handlebars | 20 +++++++++---------- .../navDevices/nav-devices.handlebars | 20 +++++++++---------- .../navReports/nav-reports.handlebars | 20 +++++++++---------- 5 files changed, 47 insertions(+), 32 deletions(-) diff --git a/Dashboard/app/css/main.scss b/Dashboard/app/css/main.scss index 2e531df6c6..2b829a79e3 100644 --- a/Dashboard/app/css/main.scss +++ b/Dashboard/app/css/main.scss @@ -6138,6 +6138,21 @@ li.disable { width: 99.5%; padding: 5px 0.25% 10px 0.25%; + nav { + &.doubleMenu { + width: 49%; + + &:first-child { + float: left; + } + + &:last-child { + float: right; + text-align: right; + } + } + } + > a { margin-top: 10px; } diff --git a/Dashboard/app/js/templates/navData/cascade-resources.handlebars b/Dashboard/app/js/templates/navData/cascade-resources.handlebars index d66643613b..a1fc28629d 100644 --- a/Dashboard/app/js/templates/navData/cascade-resources.handlebars +++ b/Dashboard/app/js/templates/navData/cascade-resources.handlebars @@ -1,8 +1,8 @@ {{#view FLOW.CascadeResourceView}}
      -
      -
      From d446dfa39d47699683a87a86c111da587cc80215 Mon Sep 17 00:00:00 2001 From: Charles Kimani Date: Fri, 10 Mar 2017 18:17:02 +0300 Subject: [PATCH 25/33] [#1831] revert change made to question groups --- .../app/js/templates/navSurveys/edit-questions.handlebars | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dashboard/app/js/templates/navSurveys/edit-questions.handlebars b/Dashboard/app/js/templates/navSurveys/edit-questions.handlebars index 39efaaac08..a338c52266 100644 --- a/Dashboard/app/js/templates/navSurveys/edit-questions.handlebars +++ b/Dashboard/app/js/templates/navSurveys/edit-questions.handlebars @@ -36,7 +36,7 @@ {{#each questionGroup in FLOW.questionGroupControl.arrangedContent}} {{#view FLOW.QuestionGroupItemView contentBinding="questionGroup"}}
      -
      {{t _group}} {{view.content.order}} +
      {{t _group}} {{view.content.order}} {{#if view.amCopying}}
      {{t _copying}}
      {{/if}} @@ -45,7 +45,7 @@ {{#if view.showQGroupNameEditField}} {{view Ember.TextField valueBinding="view.content.code" size=45}} {{else}} -

      {{view.content.code}}

      +

      {{view.content.code}}

      {{/if}}
      {{#if view.amVisible}} From 06a8621cf8b6a4a0ebc0fcea0d50f5de843c354e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Sans?= Date: Fri, 10 Mar 2017 17:19:46 +0200 Subject: [PATCH 26/33] [#1852] fixed last issues Appart from 1., 4., 5. In https://github.com/akvo/akvo-flow/issues/1852 --- Dashboard/app/css/main.scss | 81 +++++-------------- .../navReports/chart-reports.handlebars | 2 +- .../navReports/export-reports.handlebars | 2 +- 3 files changed, 22 insertions(+), 63 deletions(-) diff --git a/Dashboard/app/css/main.scss b/Dashboard/app/css/main.scss index d597730b5f..db142bcd2e 100644 --- a/Dashboard/app/css/main.scss +++ b/Dashboard/app/css/main.scss @@ -975,7 +975,7 @@ nav.appNav { .belowHeader { padding-top: 110px; - padding-bottom: 60px; + padding-bottom: 90px; box-sizing: border-box; } @@ -1430,6 +1430,7 @@ input.hasDatepicker { padding: 1em 0.5% 1.5em 0.5%; min-height: 200px; width: 49%; + max-width: 49%; } .manualTransfer .fieldSetWrap fieldset.fullWidth { @@ -1585,13 +1586,11 @@ th.action { color: rgb(0, 123, 182); } -#assignSurveys .fieldSetWrap fieldset.formLeftPanel div.SelectLayout { - display: block; - width: 100%; -} +#assignSurveys .fieldSetWrap fieldset.formLeftPanel div.SelectLayout {} #assignSurveys .fieldSetWrap fieldset.formLeftPanel div.formSelectorList { - display: block; + position: relative; + display: inline-block; width: 100%; margin-top: 30px; @@ -1845,7 +1844,7 @@ a.FadeIt { .noFormsContainer { background: white; - padding: 2em 0; + padding: 10px 0; li.formList { padding: 10px 0; @@ -2159,7 +2158,7 @@ section.topBar { } &.menuTopbar { - margin-right: 0.5%; + margin-right: 0.25%; width: 33.5%; float: right; @@ -2182,8 +2181,8 @@ section.topBar { margin: 10px 10px 0 0; float: right; - &:first-child { - margin: 10px 0 0 0; + &:first-of-type { + margin: 10px 0px 0 0; } p { @@ -3795,32 +3794,12 @@ table.dataTable.notificationTable thead tr th a:visited { /****** Data Page ****************************************************************************/ .modularSelection { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-box-pack: justify; - -webkit-justify-content: flex-start; - -ms-flex-pack: center; - justify-content: flex-start; - text-align: left; - -webkit-align-items: flex-start; - align-items: flex-start; + padding: 0 0 22px 0.5%; select { max-width: 20%; - } - - select:first-child { - margin-left: 0.5%; + float: left; + display: inline; } } @@ -4519,12 +4498,7 @@ label.languageSelector:after { ********************************************************************************************************************************/ .reportsSection > div > div > section.reportTools select, -.reportTools > div > select { - display: inline; - width: 32%; - float: left; - margin: 0 0 1em 1%; -} +.reportTools > div > select {} #reportBlocks.reportTools { .geoshapeExport { @@ -4540,14 +4514,11 @@ label.languageSelector:after { .reportTools select:last-child { display: inline; - width: 30%; float: left; - margin: 0 1% 1em 1%; } .reportTools a.standardBtn { clear: both; - margin: 0.1em 0 1em 1%; } .reportTools div.block a.standardBtn { @@ -4565,7 +4536,7 @@ label.languageSelector:after { .reportTools div.block { display: block; clear: both; - width: 96%; + width: 97%; margin: 0.5em auto 1.5em auto; background: rgb(240, 240, 240); padding: 1em 1%; @@ -4621,13 +4592,7 @@ label.languageSelector:after { .chartSetting { display: block; clear: both; - padding: 0.5em 0; - margin: 1em auto; - border-bottom: thin solid rgb(198, 198, 198); -} - -.chartSetting h4 { - margin-left: 1%; + padding: 0.5em 0 0 10px; } .reportTools .chartSetting select { @@ -4640,7 +4605,7 @@ label.languageSelector:after { .groupChartSelect { display: inline-block; - margin: 0.1em 0.5em 0 1.5em; + margin: 0 5px 0 10px; } .chartSetting .groupChartSelect input { @@ -4655,16 +4620,9 @@ label.languageSelector:after { top: 120px; width: 100%; background-color: white; - height: 120px; z-index: 2; border-bottom: thin solid #c6c6c6; } - - .rawDataReport { - &.dataExport { - margin-top: 135px; - } - } } /* ------------------------------------------------------------------------------------------ @@ -5263,7 +5221,7 @@ table.surveyDetails { } .forms { - padding: 2em 0 0 0; + padding: 5px 0 0 0; background: white; #tabs { @@ -5635,7 +5593,7 @@ table.surveyDetails { box-sizing: border-box; width: 100%; padding: 15px 0; - margin: 0 auto; + margin: 50px auto 0 auto; overflow-y: hidden; overflow-x: hidden; @@ -6245,16 +6203,17 @@ li.disable { nav { &.doubleMenu { - padding-top: 5px; width: 49%; &:first-child { float: left; + margin-top: 7px; } &:last-child { float: right; text-align: right; + margin-top: 3px; } } } diff --git a/Dashboard/app/js/templates/navReports/chart-reports.handlebars b/Dashboard/app/js/templates/navReports/chart-reports.handlebars index d0a892a509..dadbf1f31b 100644 --- a/Dashboard/app/js/templates/navReports/chart-reports.handlebars +++ b/Dashboard/app/js/templates/navReports/chart-reports.handlebars @@ -36,7 +36,7 @@ {{#if view.isDoughnut}} {{/if}} - {{t _build_chart}} + {{t _build_chart}}
      {{#if view.noChoiceBool}}

      {{t _please_select_survey_group_survey_and_question}}

      diff --git a/Dashboard/app/js/templates/navReports/export-reports.handlebars b/Dashboard/app/js/templates/navReports/export-reports.handlebars index 803986e288..3c1f633022 100644 --- a/Dashboard/app/js/templates/navReports/export-reports.handlebars +++ b/Dashboard/app/js/templates/navReports/export-reports.handlebars @@ -1,7 +1,7 @@
      {{#view FLOW.ExportReportsAppletView}} -
      +
      {{#unless FLOW.projectControl.isLoading}} {{view FLOW.SurveySelectionView}} {{/unless}} From 24252c007d3bcb699a7dabf241adbfaa876419e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Sans?= Date: Fri, 10 Mar 2017 18:14:57 +0200 Subject: [PATCH 27/33] [#1852] footer no longer anchored --- Dashboard/app/css/main.scss | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Dashboard/app/css/main.scss b/Dashboard/app/css/main.scss index db142bcd2e..e72ce6082d 100644 --- a/Dashboard/app/css/main.scss +++ b/Dashboard/app/css/main.scss @@ -975,13 +975,13 @@ nav.appNav { .belowHeader { padding-top: 110px; - padding-bottom: 90px; + padding-bottom: 25px; box-sizing: border-box; } .middleSection { /*margin: 0 0 20px 0;*/ - padding: 50px 0 60px 0; + padding: 50px 0 25px 0; } .fullWidth { @@ -3803,6 +3803,10 @@ table.dataTable.notificationTable thead tr th a:visited { } } +.modularSelection + select { + margin-left: 0.5%; +} + .filterData { border: thin solid rgb(224, 224, 224); border-top: 1px solid white; @@ -4206,7 +4210,6 @@ div.drawHandle { -----------------------------------------------*/ footer.bottomPage { - position: absolute; bottom: 0; padding: 10px 0 10px 0; width: 100%; From e23902107b905390a0aedc0347abfa89d4dac7bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Sans?= Date: Fri, 10 Mar 2017 18:33:33 +0200 Subject: [PATCH 28/33] [#1852] Attempts to fix select misalignment --- Dashboard/app/css/main.scss | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/Dashboard/app/css/main.scss b/Dashboard/app/css/main.scss index e72ce6082d..53ebff2da1 100644 --- a/Dashboard/app/css/main.scss +++ b/Dashboard/app/css/main.scss @@ -3794,7 +3794,8 @@ table.dataTable.notificationTable thead tr th a:visited { /****** Data Page ****************************************************************************/ .modularSelection { - padding: 0 0 22px 0.5%; + padding: 0 0 22px 0%; + display: block; select { max-width: 20%; @@ -3803,8 +3804,22 @@ table.dataTable.notificationTable thead tr th a:visited { } } -.modularSelection + select { - margin-left: 0.5%; +.reportTools { + padding-left: 0.5%; +} + +div.chooseSurveyData { + position: relative; + display: block; + margin: 0px 0 10px 0; + width: 100%; + overflow: auto; + + > select { + max-width: 20%; + float: left; + display: inline; + } } .filterData { @@ -3858,13 +3873,6 @@ label.collectedTo { margin: 0; } -div.chooseSurveyData { - position: relative; - display: block; - margin: 0px 0 10px 0; - width: 100%; -} - #monitoringData { div.chooseSurveyData { width: 98%; From 34de59852a5e5c80d9ef6d33f0e1a3eda4055935 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Perdomo?= Date: Sat, 11 Mar 2017 21:11:47 +0100 Subject: [PATCH 29/33] [#1985] Deleted code is debugged code - Instead of having a subclass that doesn't do *anything* we just expose the same servlet on a different path - If we need extra functionality, we can bring the `TracedRemoteApiServlet` again --- .../akvo/flow/api/TracedRemoteApiServlet.java | 51 ------------------- GAE/war/WEB-INF/web.xml | 2 +- 2 files changed, 1 insertion(+), 52 deletions(-) delete mode 100644 GAE/src/org/akvo/flow/api/TracedRemoteApiServlet.java diff --git a/GAE/src/org/akvo/flow/api/TracedRemoteApiServlet.java b/GAE/src/org/akvo/flow/api/TracedRemoteApiServlet.java deleted file mode 100644 index 13804980be..0000000000 --- a/GAE/src/org/akvo/flow/api/TracedRemoteApiServlet.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2017 Stichting Akvo (Akvo Foundation) - * - * This file is part of Akvo FLOW. - * - * Akvo FLOW is free software: you can redistribute it and modify it under the terms of - * the GNU Affero General Public License (AGPL) as published by the Free Software Foundation, - * either version 3 of the License or any later version. - * - * Akvo FLOW is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU Affero General Public License included below for more details. - * - * The full license text can also be seen at . - */ - -package org.akvo.flow.api; - -import java.io.IOException; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import com.google.apphosting.utils.remoteapi.RemoteApiServlet; - -/* - * A class used for tracing/grouping Remote API calls - * - * Rationale: We want to be able to group/trace/correlate a set of Remote API calls, - * to achieve this the client _must_ configure the RemoteApiOptions.remoteApiPath to be a unique - * identifier for grouping requests, e.g. /traced_remote_api/uuid-1 - * Then we should be able in the logs to filter by a particular set as - * `path:/traced_remote_api/uuid-1` to get the relative cost of a given execution - * - * The API calls are just delegated to the default RemoteApiServlet - */ -public class TracedRemoteApiServlet extends RemoteApiServlet { - - private static final long serialVersionUID = 1762368166833558193L; - - @Override - public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { - super.doGet(request, response); - } - - @Override - public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { - super.doPost(request, response); - } - -} diff --git a/GAE/war/WEB-INF/web.xml b/GAE/war/WEB-INF/web.xml index acd64b635b..75d54e14b8 100644 --- a/GAE/war/WEB-INF/web.xml +++ b/GAE/war/WEB-INF/web.xml @@ -482,7 +482,7 @@ TracedRemoteApi - org.akvo.flow.api.TracedRemoteApiServlet + com.google.apphosting.utils.remoteapi.RemoteApiServlet RemoteApi From 3e9710ff3abdddc1cb9a2a7e290d6d1b2456ad36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Perdomo?= Date: Mon, 13 Mar 2017 06:35:37 +0100 Subject: [PATCH 30/33] [#1985] Remove extra servlet definition - Use an extra definiton for the same servlet - Via code review from @muloem --- GAE/war/WEB-INF/web.xml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/GAE/war/WEB-INF/web.xml b/GAE/war/WEB-INF/web.xml index 75d54e14b8..46e52a5ccc 100644 --- a/GAE/war/WEB-INF/web.xml +++ b/GAE/war/WEB-INF/web.xml @@ -479,16 +479,8 @@ RemoteApi /remote_api - - - TracedRemoteApi - com.google.apphosting.utils.remoteapi.RemoteApiServlet - - - RemoteApi /traced_remote_api/* - persistenceFilter com.gallatinsystems.framework.servlet.PersistenceFilter From bf2f767c1ed8c0fb54fe9c4deaefa82280a2a7a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stellan=20Lagerstr=C3=B6m?= Date: Mon, 13 Mar 2017 11:28:36 +0100 Subject: [PATCH 31/33] [#498]Do not try loading deleted controller. --- GAE/war/Env.vm | 1 - 1 file changed, 1 deletion(-) diff --git a/GAE/war/Env.vm b/GAE/war/Env.vm index 972b94068c..5f43495703 100644 --- a/GAE/war/Env.vm +++ b/GAE/war/Env.vm @@ -9,7 +9,6 @@ loader.register('akvo-flow/flowenv', function(require) { showMonitoringFeature: $env.showMonitoringFeature, mandatoryQuestionID: $env.mandatoryQuestionID, showExternalSourcesFeature: $env.showExternalSourcesFeature, - countries: $env.countries, mapsProvider: '$env.mapsProvider', googleMapsRegionBias: '$env.googleMapsRegionBias', cartodbHost: '$env.cartodbHost', From 86bb09f27c10ca8e92e1b0b156dd0eb03d4bdf6e Mon Sep 17 00:00:00 2001 From: Oliver Galloway Date: Fri, 17 Mar 2017 11:53:47 +0000 Subject: [PATCH 32/33] [#2005] Added release notes for v1.9.15. --- RELEASE_NOTES.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 7a95e912b9..7e04e754c0 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,5 +1,18 @@ # Akvo Flow Release Notes ---- +#1.9.15 Nifty Nuthatch +Date: 20 March 2017 + +# New and noteworthy +* **Easier question text editing** - The question text can now be edited by clicking on the text itself as well as using the Edit button [#1831]. +* **Messages tab improvements** - We renamed the Survey ID column to Form ID and removed the unused User column [#1976]. +* **Dashboard styling and layout improvements** - We corrected the colour of certain page elements for consistency [#1974] [#1848], improved page layout to remove excess space [#1955] [#1852], fixed table alignments [#1848], tidied up page element labelling [#1850] and improved the distinction between enabled and disabled buttons [#1948]. + +# Resolved issues +* **Code clean-up** - We removed unused and obsolete code related to the maps functionality [#498] and refactored some user ID related code [#1970]. +* **Fixed exports with roll-up sheets** - These exports can now handle JSON responses without failing [#1968]. + + #1.9.14 Masterful Mouse Date: 23 February 2017 From bffc1e1a5dad57dd89c8acd27ee4210f74b54a6b Mon Sep 17 00:00:00 2001 From: Oliver Galloway Date: Fri, 17 Mar 2017 12:46:14 +0000 Subject: [PATCH 33/33] [#2005] Corrected Markdown formatting and layout. Ensure release numbers are displayed correctly in GitHub (stricter MD handling). Corrected MD format for more recent section headings. Corrected spacing for consistency. --- RELEASE_NOTES.md | 350 +++++++++++++++++++++++++---------------------- 1 file changed, 189 insertions(+), 161 deletions(-) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 7e04e754c0..c362bdbc49 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,45 +1,45 @@ # Akvo Flow Release Notes ---- -#1.9.15 Nifty Nuthatch +# 1.9.15 Nifty Nuthatch Date: 20 March 2017 -# New and noteworthy +## New and noteworthy * **Easier question text editing** - The question text can now be edited by clicking on the text itself as well as using the Edit button [#1831]. * **Messages tab improvements** - We renamed the Survey ID column to Form ID and removed the unused User column [#1976]. * **Dashboard styling and layout improvements** - We corrected the colour of certain page elements for consistency [#1974] [#1848], improved page layout to remove excess space [#1955] [#1852], fixed table alignments [#1848], tidied up page element labelling [#1850] and improved the distinction between enabled and disabled buttons [#1948]. -# Resolved issues +## Resolved issues * **Code clean-up** - We removed unused and obsolete code related to the maps functionality [#498] and refactored some user ID related code [#1970]. * **Fixed exports with roll-up sheets** - These exports can now handle JSON responses without failing [#1968]. -#1.9.14 Masterful Mouse +# 1.9.14 Masterful Mouse Date: 23 February 2017 -# Resolved issues +## Resolved issues * **Dashboard footer design improvements** [#1920] - Slight design improvements to the layout of the footer on the dashboard * **Fix bug that prevents users tab from loading** [#1959] - The users tab was not loading because of an error while retrieving the list of dashboard users -#1.9.13.1 Laughing Liger hotfix +# 1.9.13.1 Laughing Liger hotfix Date: 17 February 2017 -# Resolved issues +## Resolved issues * **Change `FormInstance.formId` to parse both String and Long data types** [#1942] - We enable the dashboard to process data files that may erroneously contain a string instead of a long value for the formId * **Bootstrap file generation: add surveyId to the xml file** [#1927] - We add the `surveyId` to the survey xml definition that is exported to the device. This will simplify processing of the file to identify the `surveyId` during manual survey assignments. -#1.9.13 Laughing Liger +# 1.9.13 Laughing Liger Date: 9 February 2017 -# New and noteworthy +## New and noteworthy * **New Akvo caddisfly tests** [#1915] - We introduce a number of new caddisfly tests as part of caddisfly questions e.g. ammonium strip test, chloride strip test, total alkalinity, total hardness, residual chlorine * **Dashboard User Interface refactoring** We have implemented a number of changes to clean up and simplify the user interface of the dashboard including: changing the typography, buttons and layout elements [#1869], removing redundant elements like survey and form descriptions [#1861] [#1860], fixing the text of links in the page footer [#1847][#1920], swapping positions of the user login/logout button and the language selector dropdown [#1846] -# Resolved issues +## Resolved issues * **Fix regression for datapoint name creation** [#1934] - We resolved an issue where the datapoint names for existing data points were not correctly refreshed when a survey was edited and published * **Refactor loading of caddisfly test definitions** [#1918] - We refactor the caddisfly test definitions to load them more optimally @@ -49,17 +49,17 @@ Date: 9 February 2017 * **Only include google maps library when needed** [#1732] - We introduce this change to improve on the performance of the dashboard only loading libraries when they are required -#1.9.12 Kinky Kookaburra +# 1.9.12 Kinky Kookaburra Date: 19 January 2017 -# New and noteworthy +## New and noteworthy * **Add 2 new Caddisfly sensors to Flow Caddisfly** [#1863] - We add two items to the list of available caddisfly tests; new soil EC (SEC) sensor and soil moisture (SOM) sensor * **Export Caddisfly data to reports** [#1643] - We implement the generation of caddisfly results as a new column(s) in raw data reports * **Assign responsible users to an approval group in a survey** [#1774] - We introduce the possibility to assign responsible users to steps of a data approval group in a survey -# Resolved issues +## Resolved issues * **Refactor `UserList` data script to use service accounts** [#1888] - We fix the data script to use service accounts based authorization * **Approval status incorrect for rejected points** [#1882] - We fix an issue where the approval status of a data point was not correctly displayed in the case that one of the steps was rejected @@ -87,21 +87,22 @@ Date: 19 January 2017 * **Invalid empty repeat question group error** [#1684] - We fix an error that was caused by the existence of empty (phantom) rows when importing a raw data spreadsheet -#1.9.11.1 Jubilant Jaguar Hotfix +# 1.9.11.1 Jubilant Jaguar Hotfix Date: 7 December 2016 -# Resolved issues +## Resolved issues * **RemoteException calls failing** [#1823] - The backend has been failing to process error messages from devices with more recent versions of Android because their `phoneNumber` attribute was missing. The consequence is that devices have been constantly resubmitting these error messages, and using up unnecessary resources on the backend -#1.9.11 Jubilant Jaguar + +# 1.9.11 Jubilant Jaguar Date: 7 November 2016 -# New and noteworthy +## New and noteworthy * **Integration of the Akvo Caddisfly mobile app with the Flow dashboard** - As part of the [integration of the Akvo Caddisfly app with the Flow dashboard](https://github.com/akvo/akvo-product-design/issues/5), we introduce changes to; create a new question that is of type `Akvo Caddisfly` [#1577], and enable correctly transforming and displaying data gathered by the caddisfly app [#1570]. With this you can now add an Akvo Caddisfly water quality test to your Akvo Flow survey. * **Implement data approval workflow management** - As part of the larger [data approval feature](https://github.com/akvo/akvo-product-design/issues/82), we have a number of changes introduced in this release that include; introducing a new tab in under the `Data > Data Approval`, where one is able to handle the creation and management of data approval groups along with their associated steps [#1803], enabling a user to activate data approval for a particular survey and associate a set of approval steps with a survey [#1660, #1771], and approving data points gathered in a survey, based on approval steps from the associated approval group [#1664]. This feature is currently under testing and is not available to all our partners yet. -# Resolved issues +## Resolved issues * **Improve copying of surveys between instances** [#873] - While copying surveys across different dashboards, a number of manual steps were required to complate the process. We have now resolved these actions and copying the surveys across instances requires almost no manual intervention. The task is done by our Flow support team. * **Hide Data Cleaning tab if permission is not given** [#1528] - Even for users who did not have any data cleaning permissions, we were showing the data cleaning tab with an empty list of surveys in the drop down box to select for data cleaning. We now completely hide this tab if the user has no data cleaning permissions on any survey whatsoever. @@ -117,15 +118,15 @@ Date: 7 November 2016 * **Update the copyright year in the application footer to 2016** [#1815] -#1.9.10 Intriguing Iguana +# 1.9.10 Intriguing Iguana Date: 18 August 2016 -# New and noteworthy +## New and noteworthy * **Handle geotagged media on maps** [#1653] - Photos and videos having geolocation information associated with them during data collection, are now shown on (CartoDB) maps, when previewing the gathered data. * **Add Vietnamese language to dashboard** [#1728] -# Resolved issues +## Resolved issues * **Empty repeat-question-group row error** [#1684] - A fix for a bug where importing of raw data reports, that contain an empty row, would result in the entire import failing. * **Devices without phone numbers are matched with wrong assignments** [#1741] - In a number of cases, some devices have been spontaneously downloading surveys that were not explicitly assigned to them. This is as a result of the internal phone number not being set correctly. This fix resolves this issue. @@ -133,17 +134,17 @@ Date: 18 August 2016 * **Remove language dropdown from 'public' page** [#1657] - The public page on the dashboard had a language dropdown that was not functioning because the langauges are now associated with the users and not with the browser in which the dashboard is being viewed. We have therefore eliminated language selection from the publicly visible part of the dashboard. -#1.9.9 Hazardous Hedgehog +# 1.9.9 Hazardous Hedgehog Date: 18 July 2016 -# New and noteworthy +## New and noteworthy * **Output multiple choice, option question responses into separate columns** [#1605] - We now enable the possibility to generate raw data reports with the responses to multiple choice, option questions split into separate columns, i.e., one column for each response. This is facilitates the analysis of this data by external systems. * **Include geolocation data from geotagged media in raw data reports** [#1652] - For photos and videos that have been tagged with geolocation data, this data will now be included as extra columns in the raw data reports. Note that these columns will only be visible in raw data reports that are *exported* for use in external systems, that is, the geolocation data cannot be reimported or edited. * **Displaying drone imagery in Flow** [#1562] - Besides the already existing Terrain, Street and Satellite layers, Flow maps now introduce an extra layer, the drone imagery layer. This enables partners who have gathered aerial images through drones or similar equipment to render these images on a Flow map. -# Resolved issues +## Resolved issues * **Standardizing the date format** [#1637] - correctly format the date and time stamp displayed when browsing data points under the CartoDB maps. This is part of a larger effort to standardize the date and time display on the entire Flow dashboard (#257) * **Rendering multiple geoshapes when previewing data points under the (CartoDB) map tab** [#1694] - correctly render all geoshapes for forms that may contain more than one geoshape question. Prior to this fix only the first geoshape response was rendered correctly. @@ -158,72 +159,88 @@ Date: 18 July 2016 * **Enable multi-lingual support for the 'Show' and 'Hide'** links under the maps tab [#1695] -#1.9.8 Grappling Garanuug + +# 1.9.8 Grappling Garanuug Date: 8 June 2016 -# New and noteworthy + +## New and noteworthy * Start using android Id for identification of devices internally in the dashboard. This should improve on the stability of data transfers to and from the devices [#998] -# Resolved issues +## Resolved issues * Video responses url on cartodb maps point to the collecting device's internal storage [#1674] * Change forms endpoint on CartoDB maps from cartodb storage to dashboard storage [#1655] * Improve speed of dashboard loading [#987] -#1.9.7 - Fashionable Flamingo + +# 1.9.7 - Fashionable Flamingo Date: 16 May 2016 -# New and noteworthy + +## New and noteworthy * Order cascade resources in drop-downs alphabetically to enable easier finding of a cascade resource in the list [#1615] * Add Bahasa/Indonesian language to dashboard [#1566] * Geotagging in photos in the dashboard. We now show the latitude/longitude data for photos that have been geotagged when previewing responses [#1527] -# Resolved issues +## Resolved issues * Device identification [#1644] * Signature in CartoDB maps display incorrect [#1622] * Update RemoteAPI datascripts to use service accounts [#1620] * Disable manual input of bacode [#1522] * Spreadsheet Import converts data to numbers regardless of the type of data expected by the associated question [#923] -#1.9.6.2 + +# 1.9.6.2 Date: 29 April 2016 -# Resolved issues + +## Resolved issues * Dashboard doesn't load for users with uppercase letters in email [#1602] -#1.9.6.1 + +# 1.9.6.1 Date: 22 April 2016 -# Resolved issues + +## Resolved issues * Update Portuguese translations in FLOW dashboard [#1578] -#1.9.6 - Easygoing Elephant + +# 1.9.6 - Easygoing Elephant Date: 20 April 2016 -# New and noteworthy + +## New and noteworthy * Better timezone handling in export raw data reports. Consistently display dates using ISO 8601 [#257] * Geotagging in photos: include location information, if available, in media responses [#1527] * Portuguese translations in FLOW dashboard [#1578] * Improve performance by dynamically loading languages in dashboard [#1602] * Switch to Oauth2-based authentication in GAE deployments [#1625] -# Resolved issues +## Resolved issues * Ignore blank last cell in raw data reports [#1553] * Graphical survey summary report gives a decimal in the summary sheet [#1580] * Update device last contact time to the dashboard [#1585] * Tasks are unnecessarily rerun for every form response submitted [#1594] * NPE on non-monitored survey publishing [#1611] -#1.9.5.2 + +# 1.9.5.2 Date: 15 March 2016 -# Resolved issues + +## Resolved issues * API returning JSON encoded response for options whereas the API version is expected to return pipe separated strings [#1589] -#1.9.5.1 + +# 1.9.5.1 Date: 4 March 2016 -# Resolved issues + +## Resolved issues * Fix an equality check that prevented the automated building of datapoint names[#1576] -#1.9.5 - Decubitus Dingo + +# 1.9.5 - Decubitus Dingo Date: 3 March 2016 -# New and noteworthy + +## New and noteworthy * Enforce the use of SSL via configuration. Access to all dashboard URLs will now be encrypted. [#1564] -# Resolved issues +## Resolved issues * Update device last contact time to the dashboard [#1585] * Improved French translations for both the dashboard and app [#1579] * Dynamically build datapoint names[#1576] @@ -231,16 +248,17 @@ Date: 3 March 2016 * Displaying signature responses on cartodb point overlays [#1560] * Caching of requests causes malfunction with user roles and permissions and reading surveys [#1182] -#1.9.4 - Clamorous Capybara + +# 1.9.4 - Clamorous Capybara Date: 6 January 2016 -# New and noteworthy +## New and noteworthy * We now have two new permissions, `management of cascades` and `management of assignments` to enable controlling which users are able manipulate these features on the dashboard [#1497] * Expanded the rendering of geographic shapes on CartoDB maps to support 'line' and 'points' [#1495] * Signature question - a new type of question that enables collecting of signatures of respondents to forms or to particular statements in forms [#1453] * Codes for option questions - we now support defining a code and associating it to a particular option item. These can be used in reports for data analysis and enables defining more advanced option type questions [#828] -# Resolved issues +## Resolved issues * Data cleaning tab fails to load [#1542] * Data cleaning NUMBER type can result in datastore values in scientific notation [#1534] * CartoDB maps - render cascade resources pipe separated [#1531] @@ -256,17 +274,17 @@ Date: 6 January 2016 * Maps tab does not show the entire map [#1283] -#1.9.3 - Bouncing Badger +# 1.9.3 - Bouncing Badger Date: 1 December 2015 -# New and noteworthy +## New and noteworthy * Change footer links to new Support page - we have created an all new and improved support self-help page for FLOW and we include the link to this page in the dashboard. #1493] * Add two new permissions: View data and Edit data - we now make a clear separation between read only and editing permissions when browsing collected data [#1460] * Export geographic shapes from the dashboard - it is possible to export geographic shapes as a geojson file that can be imported into existing GIS tools that support this format [#1408] * Geoshapes on dashboard - while browsing data on the dashboard, it is possible to see geoshpaes on a map under the inspect data & monitoring tab [#1370] * Add codes to cascade questions - this means it is now possible to assign codes to values in cascading questions and view these codes in an exported report to aid with data analysis [#1323] -# Resolved issues +## Resolved issues * Handle date questions correctly in raw data imports [#1486] * Export reports tab - fix the dropdown selection so it does not disappear with scrolling [#1484] * Enhance answerCreated and answerUpdated events [#1477] @@ -278,39 +296,41 @@ Date: 1 December 2015 * Date question type not appearing correctly on map questions [#571] -#1.9.2 - Anticipated Alpaca +# 1.9.2 - Anticipated Alpaca Date: 4 November 2015 -# New and noteworthy +## New and noteworthy * Add import functionality for [data cleaning repeatable question groups](https://akvoflow.supporthero.io/article/show/data-cleaning-tab) [#1421] and [#269] * [Visualisation of geoshapes](https://akvoflow.supporthero.io/article/show/maps) responses on the dashboard [#1356] * Add the ability to [associate codes to cascade question responses](https://akvoflow.supporthero.io/article/show/cascade-resources-tab) [#1323] -# Resolved issues +## Resolved issues * User tab does not render in Firefox [#1445] * `Null` values in the `QuestionAnswerStore` entities cause results to be skipped in report [#1443] * Question groups duplicated without user involvement [#1417] -#1.9.1.3 +# 1.9.1.3 Date: 7 October 2015 -# Resolved issues +## Resolved issues * Enable dependencies to option questions within a repeat question group [#1439] -#1.9.1.1 + +# 1.9.1.1 Date: 7 October 2015 -# Resolved issues +## Resolved issues * NPE when accessing the SurveyInstance Key before it's saved into the datastore [#1432] -#1.9.1 + +# 1.9.1 Date: 6 October 2015 -# New and noteworthy +## New and noteworthy * [Repeatable Question Groups](https://akvoflow.supporthero.io/article/show/creating-and-editing-a-survey) (Grid questions) - enables specification of a set of questions as repeatable i.e. an enumerator can ask these questions multiple times [#269] -# Resolved issues +## Resolved issues * Positioning of save button for Question Group name [#1419] * Folder selection drop down hidden behind calendar elements [#1409] * Datascript: Convert PG data into events (unified log) [#1392] @@ -325,29 +345,31 @@ Date: 6 October 2015 * Minor UI improvement - Add New Cascade button [#1044] * Specify that the question ID is optional [#1006] -#1.9.0 + +# 1.9.0 Date: 18 August 2015 -# New and noteworthy +## New and noteworthy * Enable the use of CartoDB as provider of maps for the dashboard [#1280] -# Resolved issues +## Resolved issues * Append s3 bucket policy in InstanceCreator process [#1361] * UX Design and CSS styling of data tab search text [#1346] * Add `mapsProvider` system property [#1297] * Wrong icon in the previous & next buttons [#1052] * Minor UI Regressions - Missing images, spacing on edit survey screen, layout on inspect data [#809] -#1.8.9 + +# 1.8.9 Date: 28 July 2015 -# New and noteworthy +## New and noteworthy * Improve text wrapping when displaying charts [#450] * Filter by instance id on data tab [#872] * Show both number of responses and percentages in charts [#1004] * Enable 'use as data point name' for cascading questions [#1011] -# Resolved issues +## Resolved issues * Replace path with object ids for roles and permissions authorisation [#1215] * Layout enhancements when editing data points [#1294] * Breadcrumb rendering issue [#1350] @@ -355,68 +377,74 @@ Date: 28 July 2015 * Skip QuestionAnswerStore entities referencing invalid questions [#1335] * Optimize fetching of survey groups [#1359] -#1.8.8 + +# 1.8.8 Date: 8 July 2015 -# New and noteworthy +## New and noteworthy * Warn the user when data is submitted for non-existing forms, e.g. forms that have been deleted [#1183] * Changing 'download app' link on dashboard from old /app to new /app2=. By default we will now offer the newer app version for the download link and the old version remains accessible via `/app` [#1149] -# Resolved issues +## Resolved issues * SurveyedLocale deletion bug [#1329] * Skip QAS referencing an invalid question [#1307] * `Manage Device Group` popup not displayed properly [#1210] * Send events to an event log [#1130] -#1.8.7.1 + +# 1.8.7.1 Date: 11 June 2015 -# Resolved issues +## Resolved issues * Add check for missing survey when recomputing clusters #1302 -#1.8.7 + +# 1.8.7 Date: 11 June 2015 -# Resolved issues +## Resolved issues * Fix geocells computation [#1295] * Multiple `SurveyedLocale` entities created for the same `surveyedLocaleIdentifier` [#1282] * `QuestionGroup` does not resolve all dependent questions correctly when copying `Survey` [#1217] * Bring back google map satelite layer [#919] -#1.8.6.1 + +# 1.8.6.1 Date: 29 May 2015 -# New and noteworthy +## New and noteworthy * Add support for Google Maps layers as well as ability to choose region bias [#919] -#1.8.6 +# 1.8.6 Date: 14 May 2015 -# New and noteworthy +## New and noteworthy * Add support for Tetum language [#1263] -# Resolved issues +## Resolved issues * Support JSON as data serialization [#1247] * Data script for getting the number of data points and submitted forms [#1261] -#1.8.5.2 + +# 1.8.5.2 Date: 8 May 2015 -# Resolved issues +## Resolved issues * The wrong form is shown as registration form [#1267] -#1.8.5.1 + +# 1.8.5.1 Date: 27 April 2015 -# New and noteworthy +## New and noteworthy * Date filtering on data cleaning tab. When downloading data via the data cleaning tab it’s now possible to select to and from dates [#1160] * Folders and surveys are now ordered alphabetically in dropdown selections [#1212] * Dependant questions are now resolved correctly when copying a survey [#1217, #1258] * The checkbox for using question id in raw data exports has moved under a new “Advanced Settings” section and the text describing the option has been clarified [#1232] * Comma characters are now disallowed as part of folder, survey and form titles [#1252] -# Resolved issues +## Resolved issues * Log data change events [#1130] * Script to add new permissions for existing users [#1221] * Improvements to application build and deployments code [#1229] @@ -425,7 +453,8 @@ Date: 27 April 2015 * Date fields are no longer pre-populated with previous selections in export reports and data cleaning tabs [#1248] * Ensure that `createdDateTime` and `lastUpdateDateTime` properties are set on copied questions [#1259] -#1.8.4 + +# 1.8.4 Date: 7 April 2015 ## New and noteworthy @@ -447,7 +476,8 @@ Date: 7 April 2015 * Show devices in alphabetical order in assignment screen [#834] * Export fails when NUMBER question contains invalid data [#337] -#1.8.3 + +# 1.8.3 Date: 12 March 2015 ## Resolved issues @@ -458,13 +488,15 @@ Date: 12 March 2015 * Update to latest clojurescript & om releases [#1117] * Refactor projectMigration to a data script [#1150] -#1.8.2.1 + +# 1.8.2.1 Date: 3 March 2015 ## Resolved issues * Fixed bug where deleting a cascadeResource deletes all the cascadeNodes [#1171] -#1.8.2 + +# 1.8.2 Date: 20 February 2015 ## New and noteworthy @@ -476,7 +508,8 @@ Date: 20 February 2015 * Trailing spaces in option questions no longer impact dependencies appearing [#1123] * Permissions are now correctly merged when more than one role is applied to the same path [#1161] -#1.8.1 + +# 1.8.1 Date: 02 February 2015 ## New and noteworthy @@ -486,7 +519,6 @@ Date: 02 February 2015 * Enable selection of number questions as display name fields [#924] ## Resolved issues - * Test uniqueness of questionID at save time [#905, #1040] * Improve deleting data through test harness [#730] * Fix dependency handling excel export of survey format [#546, #370] @@ -508,7 +540,8 @@ Date: 02 February 2015 * Wrong icon in the previous & next buttons [#1052] * Include the survey title on exported survey forms [#273] -#1.8.0 + +# 1.8.0 Date: 15 December 2014 ## New and noteworthy @@ -532,13 +565,13 @@ Date: 15 December 2014 * Enable super admin user to list all folders and forms on an instance [#934] ## Known issues - * When user has _read only_ permission and makes a change, the save action is rejected but there is no feedback in the UI [#818] * When the changes in a form/survey are _autosaved_, the path property is not properly updated [#1019] * A _RAW DATA_ report containing _cascade_ data, is rejected from import [#1038] * Question ID uniqueness is no longer respected [#1040] -#1.7.6 + +# 1.7.6 Date: 07 November 2014 ## New and noteworthy @@ -553,15 +586,14 @@ Date: 07 November 2014 * Minor UI Fix - Long survey group names overlapping arrows [#858] * Adding pagination support for the data > monitoring tab [#855] -#1.7.5 + +# 1.7.5 Date: 16 October 2014 ## New and noteworthy - * External Sources Integration - This new feature enables marking a question as having responses coming from a source of data external to the mobile application, e.g., another application [#793] ## Resolved issues - * XML surveys encoding [#861] * Survey instances are missing when generating the RAW report [#854] * Change format of location data column header in questionId [#847] @@ -577,30 +609,29 @@ Date: 16 October 2014 * Remove UploadConstants.properties from copyconfig task [#791] * Javascript code small cleanup [#788] -#1.7.4.2 + +# 1.7.4.2 Date: 07 October 2014 ## Resolved issues - * Include textual question identifier as part of QuestionAnswer responses [#831] -#1.7.4.1 + +# 1.7.4.1 Date: 25 September 2014 ## Resolved issues - * Display Name column empty in the RAW DATA report [#797] * Question id" value when copying questions [#807] -#1.7.4 + +# 1.7.4 Date: 25 September 2014 ## New and noteworthy - * Enable double entry for number questions [#759] - in survey definitions, it is now possible to also select the double entry verification option for number questions ## Resolved issues - * CreationSurveyId not set on new surveyedLocales [#798] * Screen does not scroll up [#778] * Remove hyperlink from survey title [#775] @@ -611,13 +642,15 @@ Date: 25 September 2014 * Copy functionality on Question Groups [#435] * Add survey title and question group name to survey xml so their translation can be viewed on the device [#299] -#1.7.3.1 + +# 1.7.3.1 Date: 7 September 2014 ## Resolved issues * Survey responses not processed when a question is deleted from survey definition [#771] -#1.7.3 + +# 1.7.3 Date: 5 September 2014 ## New and noteworthy @@ -636,29 +669,28 @@ Date: 5 September 2014 * Footer layout breaks using Spanish|French and low resolution [#570] * Master language tooltip incorrect [#442] -#1.7.2.2 -## Resolved issues +# 1.7.2.2 +## Resolved issues * Deployment enhancements - Instance Configurator [#724] -#1.7.2.1 -## Resolved issues +# 1.7.2.1 +## Resolved issues * Data points show up as "Unknown" on non-monitoring groups [#735] -#1.7.2 -## New and noteworthy +# 1.7.2 +## New and noteworthy * The new APK v2.0 is now available in `http://instance.akvoflow.org/app2` [#666] * Introduced more consistent counts, fixing inaccuracies between the Dashboard's chart builder and the _RAW DATA_ report. [#651] * Revamped the way of transferring data to/from _Object Store_ (Amazon S3) [#690] ## Resolved issues - * Code cleanup - Monitoring related code [#643] * Adapt _bootstrap_ files to support _Monitoring_ features [#695] * Spreadsheet importer for the RAW DATA report misidentifies the columns [#697] @@ -666,15 +698,14 @@ Date: 5 September 2014 * Invalid XML characters in survey group name breaks the survey definition [#714] * signingKey is a required system properties [#725] -#1.7.1 -## New and noteworthy +# 1.7.1 +## New and noteworthy * Added support for storing more than 500 characters in a response [#656] * Added support for exporting _RAW DATA_ report for monitoring and non-monitoring groups [#653] ## Resolved issues - * Limit the number of retries for queues [#688] * Use https connections when possible [#680] * Publish Survey fails for Copied Surveys [#664] @@ -691,34 +722,31 @@ Date: 5 September 2014 * Ensure Dashboard can be built with GAE SDK 1.9.1 [#483] -#1.7.0.3 +# 1.7.0.3 ## Resolved issues - * Submitter name missing when importing RAW DATA spreadsheet [#662] -#1.7.0.2 +# 1.7.0.2 ## Resolved issues - * Survey response values longer than 500 characters cannot be stored [#656] -#1.7.0.1 -## Resolved issues +# 1.7.0.1 +## Resolved issues * Survey response values longer than 500 characters cannot be stored [#656] -#1.7.0 -## New and noteworthy +# 1.7.0 +## New and noteworthy * Monitoring features — Monitoring features enable users to download data on existing points on their phones, and add information to these points. Regular survey forms can be used to register entities, so they can be retrieved later for further data collection. This makes it possible to see how data has changed over time, or to collect new properties of the same entity. ## Resolved issues - * Fix typo in home screen [#615] * Validate lat/long data while creating geocells [#613] * SurveyedLocale's lastModified timestamp might not be unique [#605] @@ -731,16 +759,16 @@ Date: 5 September 2014 * Enable deletion of entire surveys and question groups [#368] * Control Mononitoring UI based on config property [#607] -#1.6.17.1 -## Resolved issues +# 1.6.17.1 +## Resolved issues * Problems with automatic survey download on _WiFi only_ devices [#588] -#1.6.17 -## New and noteworthy +# 1.6.17 +## New and noteworthy * The Dashboard now has a direct link which lets users download the mobile app, you can find it in the footer __"Download FLOW app"__ [#565] * When showing the details of a _data point_ on the map, the questions @@ -748,53 +776,55 @@ Date: 5 September 2014 alphabetically) [#239] ## Resolved issues - * Survey transfer issues [#420] * Add a survey name to the survey id when copying [#399] * Removed GWT config file generation from InstanceConfigurator [#453] * Removing responses under the data tab should update the map [#523] * Adds URI to download a GPS status app [#572] -#1.6.16 -## New and noteworthy +# 1.6.16 +## New and noteworthy * WiFi only devices (e.g. Tablets with no SIM card) are now distinguished by MAC address [#320] ## Resolved issues - * Removed obsolete GWT code [#497] * When transferring surveys across instances, settings like _other_, _allow multiple_ and _dependencies_ are now copied [#504] ## Known issues - * Some survey configuration settings are still missing when copying, see [#420] -#1.6.15 + +# 1.6.15 ## Resolved issues * Fixed issue of performing the same data request 2 times on Survey preview/edit [#527] -#1.6.14.4 + +# 1.6.14.4 ## Resolved issues * Fixed wrong computation of cache value for cluster locations [#519] -#1.6.14.3 + +# 1.6.14.3 ## Resolved issues * Avoid NPE when lastSurveyalInstanceId field is null (as happens on old data) [#516] -#1.6.14.2 + +# 1.6.14.2 ## Enhancements * Show more detailed clusters at a lower zoomlevel [#363] -#1.6.14.1 + +# 1.6.14.1 ## Resolved issues * Compute lat / lon of cluster as average over all containing placemarks [#508] @@ -802,7 +832,8 @@ Date: 5 September 2014 * Avoid keyId collision between clusters and individual placemarks [#510] * Perform adapt cluster data as separate task, to deal with non-availability of memcache [#363] -#1.6.14 + +# 1.6.14 ## Enhancements * Implement server-side clustering of markers on maps [#363] @@ -831,8 +862,8 @@ Date: 5 September 2014 ## Resolved issues * A change in dashboard language now refreshes the whole page, to prevent rendering issues [#474, #163] -# 1.6.11 +# 1.6.11 Release date: 6 March 2014 ## Enhancements @@ -848,7 +879,6 @@ Release date: 6 March 2014 questions (30+) the UI locks up for a few seconds. See [#469] # 1.6.10 - Release Date: 18 February 2014 The enhancements and resolved issues described work with apk version 1.13.0. @@ -868,45 +898,42 @@ The enhancements and resolved issues described work with apk version 1.13.0. * Fixed: Path to video in raw data export should point to S3 (#462) * Fixed: When viewing the map, video links are not shown on survey points (#403) -# 1.6.9 +# 1.6.9 Release Date: 08 January 2014 ## Enhancements - * Add filter on sub-country regions to data tab and raw data report (#229) * Show statistics on questions which have a metric (#231) * Note: Both functionality is only available when the instance is configured to show the statistics tab ## Resolved issues - * Fixed: Deprecate the compilation of GWT and applet code (#448) * Fixed: Remote survey importer fails when there is a large amount of survey groups (#444) -# 1.6.8.1 +# 1.6.8.1 Release Date: 23 December 2013 ## Resolved issues * Fixed: Set the uuid and userID when importing a file (#446) -# 1.6.8 +# 1.6.8 Release Date: 11 December 2013 ## Enhancements * Increase the default number of points shown on map to 2000 (#441) * Format survey duration as hh:mm:ss (#439) -##Resolved issues +## Resolved issues * Fixed: Implement robots.txt (#437) * Fixed: Changing dashboard language removes survey map points (# 431) * Fixed: Copy survey message does not have any value under 'Survey name' (#397) # 1.6.7.1 - Release Date: 20 November 2013 ## Resolved issues @@ -914,7 +941,6 @@ Release Date: 20 November 2013 # 1.6.7 - Release Date: 08 November 2013 ## Resolved issues @@ -932,8 +958,8 @@ Release Date: 08 November 2013 * Fixed: Issue with deleting survey groups (#425) * Fixed: Unpublished copied surveys can appear in the assignment list (#426) -# 1.6.6.2 +# 1.6.6.2 Release Date: 24 October 2013 ## Enhancements @@ -943,8 +969,8 @@ Release Date: 24 October 2013 ## Resolved issues * Fixed: Importing a spreadsheet fails silently with a JS error (#416) -# 1.6.6.1 +# 1.6.6.1 Release Date: 24 October 2013 ## Enhancements @@ -954,8 +980,8 @@ Release Date: 24 October 2013 * Fixed: Chart Builder should clean the previous chart on each question (#365) * Fixed: Terms of service link broken on FLOW instances (#400) -# 1.6.6 +# 1.6.6 Release Date: 18 October 2013 ## Enhancements @@ -982,25 +1008,22 @@ Thanks to the efforts of the Water for People team, we now have a complete set o # 1.6.5 - Release Date: 30 September 2013 ## Resolved Issues - * While uploading spreadsheet, the submitter name gets altered (#367) * Surveys with same response but different UUID getting skipped as duplicate while processing (#369) * Issue with data Cleaning: Blank responses are getting added as records (#371) -# 1.6.4 +# 1.6.4 Release Date: 17 September 2013 ## New Features - * Record the duration of a survey (#356) -# 1.6.3 +# 1.6.3 Release Date: 13 September 2013 ## User interface @@ -1016,6 +1039,7 @@ Release Date: 13 September 2013 * Implement administrator tool to bulk delete data through the API * Fix a bug which caused question options not to be copied when a survey is copied. + # 1.6.2 * Added Casper.js automated dashboard tests @@ -1023,19 +1047,23 @@ Release Date: 13 September 2013 * Block moving/copying/deleting of questions while a previous request is still busy * Fix a bug which caused the question order to go wrong + # 1.6.1.3 * Small change to developers access of GAE admin pages + # 1.6.1.2 * Added Casper.js dashboard tests * Deploy _backends_ to Google App Engine, which handle long requests + # 1.6.1.1 * Allow FLOW developers to use the remote api + # 1.6.1 ## Improvements to reports and data files @@ -1097,24 +1125,24 @@ In order to take advantage of the survey translations feature, users must be run # 1.5.1 Release Date: 4 July 2013 -Improvements to data summarization and counting +### Improvements to data summarization and counting * Fix defect where data submitted over wifi and the bulk upload was double counted in data summaries (#185) * Fix a bug where the surveyInstance Count was creating new entities each time instead of checking first whether there was a matching one already existing (#235) * Fix a bug where spreadsheet import was using different summarization customs than the device, resulting in confusion in the backend for OTHER types (#250) -Improvements in Data tab and Inspect Data table +### Improvements in Data tab and Inspect Data table * Fixing filtering in Inspect Data table - Fix a bug in filtering for Device ID and Submitter in Inspect Data table (#212) * Fix a paging bug in Inspect Data table where cursor reset to zero (#251) -Improvements to Bulk Upload tool usability +### Improvements to Bulk Upload tool usability * Prevent bulk upload tool from importing data for a survey that doesn't exist on the Dashboard (#230) * Warn user if they try to close the browser page while a data bulk upload is in progress; add explanation text on the Bulk Upload page to direct the user not to navigate away during the upload (#201) -Security +### Security * Enable security on REST calls based on API servlet (#256) * Update FLOW instance configurator to create API key and enable REST security (related to #256) (#272) -Other minor enhancements +### Other minor enhancements * Entering user email addresses - Save email addresses in lowercase when adding or editing a new Dashboard user (#193) * Fix defect where surveyedLocales remained in the datastore after surveyInstances were deleted (#218) * Fix a bug where deleting a date in the Edit data window displayed filler text (NaN) in the date field (#236)