From c10fbbfd4f75b72a5280ef6885994ea3fea3be1c Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Wed, 5 Aug 2015 22:52:59 -0700 Subject: [PATCH] added responsiveness --- app/controllers/forms.server.controller.js | 4 +- app/models/form.server.model.js | 4 + app/models/form_field.server.model.js | 3 +- app/views/layout.server.view.html | 17 +- public/dist/application.js | 357 ++++++++++-------- public/dist/application.min.css | 2 +- public/dist/application.min.js | 4 +- public/modules/core/css/core.css | 23 +- .../core/views/header.client.view.html | 3 +- .../modules/core/views/home.client.view.html | 19 +- .../submit-form.client.controller.js | 14 +- .../view-form.client.controller.js | 27 +- public/modules/forms/css/form.css | 116 ++++-- .../directives/auto-save.client.directive.js | 2 - .../directives/edit-form.client.directive.js | 8 +- .../directives/field-icon.client.directive.js | 3 +- .../directives/field.client.directive.js | 7 +- .../submit-form.client.directive.js | 80 ++-- .../services/form-fields.client.service.js | 12 +- .../views/directiveViews/field/checkbox.html | 6 +- .../views/directiveViews/field/date.html | 4 +- .../views/directiveViews/field/dropdown.html | 2 +- .../views/directiveViews/field/email.html | 4 +- .../views/directiveViews/field/hidden.html | 2 +- .../views/directiveViews/field/legal.html | 6 +- .../views/directiveViews/field/link.html | 4 +- .../views/directiveViews/field/natural.html | 4 +- .../views/directiveViews/field/number.html | 6 + .../views/directiveViews/field/password.html | 4 +- .../views/directiveViews/field/radio.html | 10 +- .../views/directiveViews/field/rating.html | 9 +- .../views/directiveViews/field/statement.html | 2 +- .../views/directiveViews/field/textarea.html | 2 +- .../views/directiveViews/field/textfield.html | 4 +- .../views/directiveViews/field/yes_no.html | 6 +- .../directiveViews/form/configure-form.html | 46 ++- .../views/directiveViews/form/edit-form.html | 69 ++-- .../directiveViews/form/submit-form.html | 37 +- .../forms/views/list-forms.client.view.html | 15 +- .../forms/views/view-form.client.view.html | 156 ++++---- .../views/view-public-form.client.view.html | 12 +- .../users/config/users.client.config.js | 19 +- 42 files changed, 699 insertions(+), 435 deletions(-) create mode 100644 public/modules/forms/views/directiveViews/field/number.html diff --git a/app/controllers/forms.server.controller.js b/app/controllers/forms.server.controller.js index 95afa91a..915dc02d 100644 --- a/app/controllers/forms.server.controller.js +++ b/app/controllers/forms.server.controller.js @@ -97,11 +97,13 @@ exports.createSubmission = function(req, res) { fdfData, fdfTemplate, that = this; + console.log(req.body.percentageComplete); submission = new FormSubmission({ admin: req.user, form_fields: req.body.form_fields, - timeElapsed: req.body.timeElapsed + timeElapsed: req.body.timeElapsed, + percentageComplete: req.body.percentageComplete }); submission.form = form; diff --git a/app/models/form.server.model.js b/app/models/form.server.model.js index 1b6017a1..98b4e247 100644 --- a/app/models/form.server.model.js +++ b/app/models/form.server.model.js @@ -68,6 +68,10 @@ var FormSchema = new Schema({ type: Schema.Types.Mixed }, + showStart: { + type: Boolean, + default: false, + }, hideFooter: { type: Boolean, default: false, diff --git a/app/models/form_field.server.model.js b/app/models/form_field.server.model.js index d9dbbe33..0f537be3 100644 --- a/app/models/form_field.server.model.js +++ b/app/models/form_field.server.model.js @@ -28,7 +28,8 @@ function validateFormFieldType(value) { 'checkbox', 'hidden', 'yes_no', - 'natural' + 'natural', + 'number' ]; if (validTypes.indexOf(value) > -1) { diff --git a/app/views/layout.server.view.html b/app/views/layout.server.view.html index e978e512..1d4b1c14 100755 --- a/app/views/layout.server.view.html +++ b/app/views/layout.server.view.html @@ -64,6 +64,7 @@ +
-

+

Craft beautiful forms in seconds.

-

+

+

Medforms is an opensource form builder that can create stunning forms from PDFs or from scratch - +

@@ -34,7 +30,6 @@ sign me up!
-
diff --git a/public/modules/forms/controllers/submit-form.client.controller.js b/public/modules/forms/controllers/submit-form.client.controller.js index 42420bd4..92b0b5b6 100644 --- a/public/modules/forms/controllers/submit-form.client.controller.js +++ b/public/modules/forms/controllers/submit-form.client.controller.js @@ -3,24 +3,23 @@ // Forms controller angular.module('forms').controller('SubmitFormController', ['$scope', '$rootScope', '$stateParams', '$state', 'Forms', 'CurrentForm', function($scope, $rootScope, $stateParams, $state, Forms, CurrentForm) { + Forms.get({ formId: $stateParams.formId }).$promise.then( //success function(form){ - $scope.form = form; + $scope.myform = form; - //Show navbar if form is not public AND user is loggedin - if(!$scope.form.isLive && $rootScope.authentication.isAuthenticated()){ + // Show navbar if form is not public AND user is loggedin + if(!$scope.myform.isLive && $rootScope.authentication.isAuthenticated()){ $rootScope.hideNav = false; - }else if(!$scope.form.isLive){ + }else if(!$scope.myform.isLive){ $state.go('access_denied'); - }else { - CurrentForm.setForm($scope.form); } console.log('$rootScope.hideNav: '+$rootScope.hideNav); - console.log('$scope.form.isLive: '+$scope.form.isLive); + console.log('$scope.form.isLive: '+$scope.myform.isLive); }, //error function( error ){ @@ -28,5 +27,6 @@ angular.module('forms').controller('SubmitFormController', ['$scope', '$rootScop console.log('ERROR: '+error.message); $state.go('access_denied'); }); + } ]); \ No newline at end of file diff --git a/public/modules/forms/controllers/view-form.client.controller.js b/public/modules/forms/controllers/view-form.client.controller.js index 989bcab5..92d60a98 100644 --- a/public/modules/forms/controllers/view-form.client.controller.js +++ b/public/modules/forms/controllers/view-form.client.controller.js @@ -51,8 +51,8 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' $scope.toggleObjSelection = function($event, description) { $event.stopPropagation(); }; - $scope.rowClicked = function(obj) { - obj.selected = !obj.selected; + $scope.rowClicked = function(row_index) { + $scope.table.rows[row_index].selected = !$scope.table.rows[row_index].selected; }; /* @@ -64,7 +64,6 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' var delete_ids = _.chain($scope.table.rows).filter(function(row){ return !!row.selected; }).pluck('_id').value(); - console.log(delete_ids); $http({ url: '/forms/'+$scope.myform._id+'/submissions', method: 'DELETE', @@ -72,11 +71,14 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' headers: {"Content-Type": "application/json;charset=utf-8"} }).success(function(data, status, headers){ //Remove deleted ids from table + var tmpArray = []; for(var i=0; i<$scope.table.rows.length; i++){ - if($scope.table.rows[i].selected){ - $scope.table.rows.splice(i, 1); + if(!$scope.table.rows[i].selected){ + tmpArray.push($scope.table.rows[i]); } } + console.log(tmpArray); + $scope.table.rows = tmpArray; }) .error(function(err){ console.log('Could not delete form submissions.\nError: '); @@ -84,6 +86,21 @@ angular.module('forms').controller('ViewFormController', ['$rootScope', '$scope' console.error = err; }); }; + + //Export selected submissions of Form + $scope.exportSubmissions = function(){ + // console.log('exportSelectedSubmissions'); + // var export_ids = _.chain($scope.table.rows).filter(function(row){ + // return !!row.selected; + // }).pluck('_id').value(); + + var blob = new Blob([document.getElementById('table-submission-data').innerHTM], { + type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8" + }); + saveAs(blob, $scope.myform.title+'_export_'+Date.now()+".xls"); + }; + + //Fetch and display submissions of Form $scope.showSubmissions = function(){ $scope.viewSubmissions = true; diff --git a/public/modules/forms/css/form.css b/public/modules/forms/css/form.css index 08cf226f..a7f8cccc 100644 --- a/public/modules/forms/css/form.css +++ b/public/modules/forms/css/form.css @@ -56,6 +56,11 @@ form .accordion-edit { width: inherit; } +/*Styles for ui-datepicker*/ +.ui-datepicker.ui-widget { + z-index: 99!important; +} + /* Styles for form submission view (/forms/:formID) */ form .row.field { padding: 1em 0 3em 0; @@ -80,6 +85,15 @@ form .row.field { form.submission-form .select.radio > .field-input input, form.submission-form .select > .field-input input { width:20%; } + + form.submission-form .field.row.radio .btn.activeBtn { + background-color: rgba(0,0,0,0.7)!important; + color: white; + } + form.submission-form .field.row.radio .btn { + margin-right:1.2em; + } + form.submission-form .select > .field-input .btn { text-align: left; margin-bottom:0.7em; @@ -88,11 +102,11 @@ form .row.field { font-size: 1.10em; } - /*form.submission-form .row.field > .field-input > input:focus { + /*form.submission-form .field-input > input:focus { font-size:1em; }*/ - form .row.field > .field-input > textarea{ + form .field-input > textarea{ padding: 0.45em 0.9em; width: 100%; line-height: 160%; @@ -100,13 +114,13 @@ form .row.field { } - form .row.field > .field-input > input.text-field-input{ + form .field-input > input.text-field-input{ padding: 0.45em 0.9em; width: 100%; line-height: 160%; border: 2px dashed #ddd; } - form .row.field > .field-input > input.text-field-input:focus{ + form .field-input > input.text-field-input:focus{ border: 0; } form .required-error{ @@ -126,8 +140,11 @@ form .row.field { border: 1px solid #ccc; height: 34px; } +.config-form { + max-width: 100%; +} -div.config-form > .row { +.config-form > .row { padding: 19px; margin-bottom: 20px; background-color: #f5f5f5; @@ -135,7 +152,6 @@ div.config-form > .row { border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); - width: 90%; } div.config-form > .row > .container:nth-of-type(odd){ @@ -190,6 +206,15 @@ div.config-form > .row { text-decoration: none; } +.current-fields .panel-body .row.question input[type='text'], .current-fields .panel-body .row.description textarea{ + width: 100%; +} +.current-fields .panel-body .row.options input[type='text'] { + width: 80%; +} + + + .current-fields .tool-panel > .panel-default:hover { border-color: #9d9d9d; cursor: pointer; @@ -211,6 +236,26 @@ div.config-form > .row { text-decoration: none; } +/*Styles for submission table*/ +.submissions-table .table-outer.row { + margin-top: 1.5em; + margin-bottom: 2em; + margin-left: 0px!important; + margin-right: 0px!important; +} +.submissions-table .table-outer .col-xs-12 { + padding-left: 0px!important; + border:1px solid #ddd; + overflow-x: scroll; + border-radius:3px; +} +.submissions-table .table > thead > tr > th { + min-width:8em; +} +.submissions-table .table > tbody > tr.selected { + background-color:#efefef; +} + /*Styles for add fields tab*/ .admin-form .add-field { @@ -228,8 +273,8 @@ div.config-form > .row { border-radius: 4px; } -.status-light { - padding-left:0.6em; +.view-form-btn.span { + padding-right:0.6em; } .status-light.status-light-off { color: #BE0000; @@ -243,26 +288,32 @@ section > section.public-form { padding: 0 6em 7em 6em; } -.form-item.row { +.form-item { text-align: center; border-bottom: 6px inset #ccc; background-color: #eee; - width: 180px; - height: 215px; + /*width: 180px;*/ + /*width:100%;*/ + position: relative; + height: 0;/*215px;*/ + padding-bottom: 25%; margin-bottom: 45px; } +.form-item.create-new input[type='text']{ + width: inherit; +} -.form-item.row.create-new { +.form-item.create-new { background-color: rgb(131,131,131); color: white; } /*MODAL CSS */ -.form-item.row.create-new.new-form { +.form-item.create-new.new-form { background-color: rgb(300,131,131); z-index: 11; } -.form-item.row.create-new.new-form:hover { +.form-item.create-new.new-form:hover { background-color: rgb(300,100,100); } @@ -272,51 +323,66 @@ section > section.public-form { /*Modal overlay (for lightbox effect)*/ .overlay { - position: absolute; + position: fixed; top: 0; left: 0; - height: 193%; + height: 100%; width: 100%; background-color: rgba(0,0,0,0.5); z-index: 10; } +.field-directive { + z-index: 9; + padding:25px; + border: 25px transparent solid; + position: relative; +} +.activeField { + z-index: 11; + position: relative; + display: inline-block; + background-color: white; + border-radius: 7px; + width:100%; + border: 25px white solid; +} -.form-item.row:hover, .form-item.row.create-new:hover { +.form-item:hover, .form-item.create-new:hover { border-bottom: 8px inset #ccc; background-color: #d9d9d9; } -.form-item.row.create-new:hover { +.form-item.create-new:hover { /*color: #eee;*/ background-color: rgb(81,81,81); } -.form-item.row > .title-row{ +.form-item > .title-row{ position: relative; top: 15px; padding-top:3em; padding-bottom:3.65em; } - .form-item.row > .title-row h4 { + .form-item > .title-row h4 { font-size: 1.3em; } -.form-item.row.create-new > .title-row{ +.form-item.create-new > .title-row{ padding: 0; /*margin-top:1em; */ } - .form-item.row.create-new > .title-row h4 { + .form-item.create-new > .title-row h4 { font-size: 7em; } -.form-item.row > .details-row{ +.form-item > .details-row{ margin-top: 3.2em; } - .form-item.row > .details-row small { + .form-item > .details-row small { font-size: 0.6em; } - .form-item.row.create-new > .details-row small { + .form-item.create-new > .details-row small { font-size: 0.95em; } \ No newline at end of file diff --git a/public/modules/forms/directives/auto-save.client.directive.js b/public/modules/forms/directives/auto-save.client.directive.js index 95ac17a4..e565201e 100644 --- a/public/modules/forms/directives/auto-save.client.directive.js +++ b/public/modules/forms/directives/auto-save.client.directive.js @@ -54,8 +54,6 @@ angular.module('forms').directive('autoSaveForm', ['$rootScope', '$timeout', fun $scope.$watch(function(newValue, oldValue) { if($scope.anyDirtyAndTouched($scope.editForm) && !$rootScope.saveInProgress){ - console.log('ready to save text input'); - console.log('Saving Form'); updateFields(); } }); diff --git a/public/modules/forms/directives/edit-form.client.directive.js b/public/modules/forms/directives/edit-form.client.directive.js index 996ee80a..6669187b 100644 --- a/public/modules/forms/directives/edit-form.client.directive.js +++ b/public/modules/forms/directives/edit-form.client.directive.js @@ -114,7 +114,9 @@ angular.module('forms') 'required' : true, 'disabled' : false, }; - + console.log('\n\n---------\nAdded field CLIENT'); + console.log(newField); + // put newField into fields array if(addOrReturn){ $scope.myform.form_fields.push(newField); @@ -122,7 +124,7 @@ angular.module('forms') return newField; } - console.log('\n\n---------\nAdded field CLIENT'); + // console.log(Date.now()); // console.log($scope.myform.form_fields.length); }; @@ -193,7 +195,7 @@ angular.module('forms') // decides whether field options block will be shown (true for dropdown and radio fields) $scope.showAddOptions = function (field){ - if(field.fieldType === 'dropdown' || field.fieldType === 'checkbox' || field.fieldType === 'scale' || field.fieldType === 'rating' || field.fieldType === 'radio'){ + if(field.fieldType === 'dropdown' || field.fieldType === 'checkbox' || field.fieldType === 'radio'){ return true; } else { return false; diff --git a/public/modules/forms/directives/field-icon.client.directive.js b/public/modules/forms/directives/field-icon.client.directive.js index cd82af1b..aaff2042 100644 --- a/public/modules/forms/directives/field-icon.client.directive.js +++ b/public/modules/forms/directives/field-icon.client.directive.js @@ -24,7 +24,8 @@ angular.module('forms').directive('fieldIconDirective', function($http, $compile 'scale': 'fa fa-sliders', 'stripe': 'fa fa-credit-card', 'statement': 'fa fa-quote-left', - 'yes_no': 'fa fa-toggle-on' + 'yes_no': 'fa fa-toggle-on', + 'number': 'fa fa-slack' } $scope.typeIcon = iconTypeMap[$scope.typeName]; }, diff --git a/public/modules/forms/directives/field.client.directive.js b/public/modules/forms/directives/field.client.directive.js index 270fc85f..3d7df7a2 100644 --- a/public/modules/forms/directives/field.client.directive.js +++ b/public/modules/forms/directives/field.client.directive.js @@ -8,7 +8,8 @@ var __indexOf = [].indexOf || function(item) { return -1; }; -angular.module('forms').directive('fieldDirective', function($http, $compile) { +angular.module('forms').directive('fieldDirective', ['$http', '$compile', '$rootScope', + function($http, $compile, $rootScope) { var getTemplateUrl = function(field) { @@ -29,6 +30,7 @@ angular.module('forms').directive('fieldDirective', function($http, $compile) { 'statement', 'rating', 'yes_no', + 'number', 'natural' ]; if (__indexOf.call(supported_fields, type) >= 0) { @@ -38,6 +40,7 @@ angular.module('forms').directive('fieldDirective', function($http, $compile) { var linker = function(scope, element) { + scope.setActiveField = $rootScope.setActiveField; //Set format only if field is a date if(scope.field.fieldType === 'date'){ scope.dateOptions = { @@ -75,4 +78,4 @@ angular.module('forms').directive('fieldDirective', function($http, $compile) { }, link: linker }; -}); \ No newline at end of file +}]); \ No newline at end of file diff --git a/public/modules/forms/directives/submit-form.client.directive.js b/public/modules/forms/directives/submit-form.client.directive.js index 3bb6ef02..e1a0aaea 100644 --- a/public/modules/forms/directives/submit-form.client.directive.js +++ b/public/modules/forms/directives/submit-form.client.directive.js @@ -1,7 +1,7 @@ 'use strict'; -angular.module('forms').directive('formDirective', ['$http', '$timeout', 'timeCounter', 'Auth', '$filter', - function ($http, $timeout, timeCounter, Auth, $filter) { +angular.module('forms').directive('formDirective', ['$http', '$timeout', 'timeCounter', 'Auth', '$filter', '$rootScope', + function ($http, $timeout, timeCounter, Auth, $filter, $rootScope) { return { templateUrl: './modules/forms/views/directiveViews/form/submit-form.html', restrict: 'E', @@ -9,39 +9,59 @@ angular.module('forms').directive('formDirective', ['$http', '$timeout', 'timeCo form:'=' }, controller: function($scope){ - console.log('rendering submitFormDirective'); - timeCounter.startClock(); + angular.element(document).ready(function() { - $scope.submit = function(){ - var _timeElapsed = timeCounter.stopClock(); - $scope.form.timeElapsed = _timeElapsed; + $scope.selected = null; + $scope.startPage = true; - $scope.form.percentageComplete = $filter('formValidity')($scope.form.visible_form_fields)/$scope.visible_form_fields.length; - delete $scope.form.visible_form_fields; + $rootScope.setActiveField = function (field_id) { + console.log('form field clicked: '+field_id); + $scope.selected = field_id; + console.log($scope.selected); + } + $scope.hideOverlay = function (){ + $scope.selected = null; + console.log($scope.myForm); + } - $scope.authentication = Auth; + $scope.submit = function(){ + var _timeElapsed = timeCounter.stopClock(); + $scope.form.timeElapsed = _timeElapsed; - $scope.submitPromise = $http.post('/forms/'+$scope.form._id,$scope.form) - .success(function(data, status, headers){ - console.log('form submitted successfully'); - // alert('Form submitted..'); - $scope.form.submitted = true; - }) - .error(function(error){ - console.log(error); - $scope.error = error.message; - }); - }; + // console.log('percentageComplete: '+$filter('formValidity')($scope.form)/$scope.form.visible_form_fields.length*100+'%'); + $scope.form.percentageComplete = $filter('formValidity')($scope.form)/$scope.form.visible_form_fields.length*100; + console.log($scope.form.percentageComplete); + // delete $scope.form.visible_form_fields; - $scope.reloadForm = function(){ - timeCounter.stopClock(); - timeCounter.startClock(); - $scope.form.submitted = false; - $scope.form.form_fields = _.chain($scope.form.form_fields).map(function(field){ - field.fieldValue = ''; - return field; - }).value(); - }; + $scope.authentication = Auth; + + $scope.submitPromise = $http.post('/forms/'+$scope.form._id,$scope.form) + .success(function(data, status, headers){ + console.log('form submitted successfully'); + // alert('Form submitted..'); + $scope.form.submitted = true; + }) + .error(function(error){ + console.log(error); + $scope.error = error.message; + }); + }; + + + $scope.exitStartPage = function () { + $scope.startPage = false; + } + + $scope.reloadForm = function(){ + timeCounter.stopClock(); + timeCounter.startClock(); + $scope.form.submitted = false; + $scope.form.form_fields = _.chain($scope.form.form_fields).map(function(field){ + field.fieldValue = ''; + return field; + }).value(); + }; + }); } }; diff --git a/public/modules/forms/services/form-fields.client.service.js b/public/modules/forms/services/form-fields.client.service.js index 4defa088..2012c95c 100644 --- a/public/modules/forms/services/form-fields.client.service.js +++ b/public/modules/forms/services/form-fields.client.service.js @@ -55,6 +55,10 @@ angular.module('forms').service('FormFields', [ name : 'link', value : 'Link' }, + { + name : 'number', + value : 'Numbers' + }, // { // name : 'scale', // value : 'Opinion Scale' @@ -67,10 +71,10 @@ angular.module('forms').service('FormFields', [ name : 'statement', value : 'Statement' }, - { - name : 'natural', - value : 'Natural Language Input' - }, + // { + // name : 'natural', + // value : 'Natural Language Input' + // }, ]; } diff --git a/public/modules/forms/views/directiveViews/field/checkbox.html b/public/modules/forms/views/directiveViews/field/checkbox.html index 29fbe24d..b87fa331 100755 --- a/public/modules/forms/views/directiveViews/field/checkbox.html +++ b/public/modules/forms/views/directiveViews/field/checkbox.html @@ -1,13 +1,13 @@ -
+
{{field.title}}
(* required)
-
+
diff --git a/public/modules/forms/views/directiveViews/field/date.html b/public/modules/forms/views/directiveViews/field/date.html index 4383ea8c..bfb28adb 100755 --- a/public/modules/forms/views/directiveViews/field/date.html +++ b/public/modules/forms/views/directiveViews/field/date.html @@ -1,4 +1,4 @@ -
+

@@ -8,7 +8,7 @@

- +
diff --git a/public/modules/forms/views/directiveViews/field/dropdown.html b/public/modules/forms/views/directiveViews/field/dropdown.html index f83894d5..e30cd83d 100755 --- a/public/modules/forms/views/directiveViews/field/dropdown.html +++ b/public/modules/forms/views/directiveViews/field/dropdown.html @@ -1,4 +1,4 @@ -