diff --git a/carl_util/db/table_admin.php b/carl_util/db/table_admin.php index be45e7562..4037061c8 100644 --- a/carl_util/db/table_admin.php +++ b/carl_util/db/table_admin.php @@ -1529,10 +1529,18 @@ function run_action() function run_row_action() { + // A group of checkboxes in disco are grouped under the same id. For example checkboxgroup with id 15 will have 15[0], 15[1], etc for individual checkboxes + // Here, each checkbox has its own id (e.g. 14 and 16). So the challenge is to map between the two. if ($this->table_row_action == 'view' || $this->table_row_action == 'edit' || $this->table_row_action == 'delete' || $this->table_row_action == 'new' || $this->table_row_action == "download_file") { + var_dump($this->admin_form->table_action_id); $form =& $this->get_admin_form(); + $children = $form->_thor_core->_xml->document->tagChildren; + var_dump($children); + $data = $this->_build_data(); + var_dump($data[$this->admin_form->table_action_id]); $form->run(); + var_dump($this->admin_form->get_element_group_names()); } } diff --git a/disco/disco.php b/disco/disco.php index 516bd6a73..a5f79f5ba 100644 --- a/disco/disco.php +++ b/disco/disco.php @@ -592,7 +592,7 @@ function _prepopulate() { // Make sure we enable userland_changeable for prepopulatable elements $ele = $this->get_element($element_name); - if (property_exists($ele, 'userland_changeable')) { + if (is_object($ele) && property_exists($ele, 'userland_changeable')) { $ele->userland_changeable = true; } @@ -1627,8 +1627,9 @@ function get_element_names() // {{{ { $element_names[] = $member_name; } - } + } } + var_dump($this->get_order()); return $element_names; } // }}} diff --git a/reason_4.0/lib/core/classes/admin/modules/thor_data.php b/reason_4.0/lib/core/classes/admin/modules/thor_data.php index 5fa6f46d1..9f11195c5 100644 --- a/reason_4.0/lib/core/classes/admin/modules/thor_data.php +++ b/reason_4.0/lib/core/classes/admin/modules/thor_data.php @@ -78,6 +78,8 @@ function &get_thor_admin() $this->_thor_admin = new ThorAdmin(); $this->_thor_admin->set_thor_core($tc); $this->_thor_admin->set_admin_form($af); + $this->_thor_admin->set_form($form); + $this->_thor_admin->set_user_id($this->admin_page->user_id); } else $this->_thor_admin = false; } diff --git a/reason_4.0/lib/core/content_managers/thor.php3 b/reason_4.0/lib/core/content_managers/thor.php3 index 0eec883a8..e093eed8f 100644 --- a/reason_4.0/lib/core/content_managers/thor.php3 +++ b/reason_4.0/lib/core/content_managers/thor.php3 @@ -37,7 +37,7 @@ { $this->head_items->add_javascript(JQUERY_UI_URL, true); $this->head_items->add_javascript(JQUERY_URL, true); - $this->head_items->add_stylesheet(JQUERY_UI_CSS_URL); + $this->head_items->add_stylesheet(JQUERY_UI_CSS_URL); $this->head_items->add_javascript(REASON_PACKAGE_HTTP_BASE_PATH . 'formbuilder/js/formbuilder_translation.js'); $this->head_items->add_javascript(REASON_PACKAGE_HTTP_BASE_PATH . 'formbuilder/js/jquery.formbuilder.js'); $this->head_items->add_stylesheet(REASON_PACKAGE_HTTP_BASE_PATH . 'formbuilder/css/jquery.formbuilder.css'); @@ -126,7 +126,7 @@ $this->set_element_properties('submission_limit', array('size'=>'4')); // echo "
This form has stored data. Manage stored data
If you remove a field, the field\'s data will remain available until you delete the stored data for this form. You cannot change the type of existing fields.
This form has stored data. Manage stored data
'; - $data_comment.='To edit this form, you will first need to delete the stored data.
This form has stored data, and has custom form logic installed. Manage stored data
'; + $data_comment .= 'To edit this form, you will first need to delete the stored data.
No tickets are available for this event.
"; + $custom_message = $model->event_tickets_get_request()['thor_info']['sold_out_message']; + if (!empty($custom_message)) + { + $message .= $custom_message; + } + else + { + $message .= "No tickets are available for this event.
"; + } return $message; } @@ -317,6 +325,7 @@ function get_event_closed_html() } $closedMessage = "Registration closed at {$dt->format("g:i a")} on {$dt->format("F jS")}."; + $closedMessage .= " " . $remainingSeatsForCurrentEvent['thor_info']['cutoff_passed_message']; return $closedMessage; } diff --git a/reason_4.0/lib/core/minisite_templates/modules/form/models/thor.php b/reason_4.0/lib/core/minisite_templates/modules/form/models/thor.php index 69a01c155..ad2801513 100644 --- a/reason_4.0/lib/core/minisite_templates/modules/form/models/thor.php +++ b/reason_4.0/lib/core/minisite_templates/modules/form/models/thor.php @@ -780,6 +780,10 @@ function &get_admin_object() $this->_admin_obj = new ThorAdmin(); $this->_admin_obj->set_thor_core($thor_core); $this->_admin_obj->set_admin_form($disco_admin_obj); + $netid = $this->get_user_netid(); + $user_id = ($netid) ? get_user_id($netid) : false; + $this->_admin_obj->set_user_id($user_id); + $this->_admin_obj->set_form($form); // if the user has editing access to the site lets give the same privileges that we give there. if ($this->_user_has_site_editing_access()) diff --git a/sources/formbuilder-rsn/.gitignore b/sources/formbuilder-rsn/.gitignore new file mode 100644 index 000000000..fbe05fc93 --- /dev/null +++ b/sources/formbuilder-rsn/.gitignore @@ -0,0 +1 @@ +bower_components/ diff --git a/sources/formbuilder-rsn/dist/formbuilder.css b/sources/formbuilder-rsn/dist/formbuilder.css index bea99e567..7a7d25656 100644 --- a/sources/formbuilder-rsn/dist/formbuilder.css +++ b/sources/formbuilder-rsn/dist/formbuilder.css @@ -1,4 +1,87 @@ -.fb-wrap,.fb-wrap *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.fb-button{display:inline-block;margin:0;padding:.563rem .844rem;border:0 none;background:#16a085;color:#fff;text-align:center;text-decoration:none;font-size:12px;line-height:1.5;cursor:pointer;border-radius:.125rem;border:thin solid #19b394;border-bottom:2px solid #16a085}.fb-button[disabled]{background:#ddd !important;border:thin solid #ccc;color:#777 !important;text-shadow:none !important;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=65)";opacity:.65;cursor:default}.fb-clear{clear:both}.fb-main{max-width:1000px;margin:0 auto;padding:0 20px 0 0;position:relative;font-family:'Source Sans Pro','Open Sans',Tahoma}.fb-op-buttons-wrapper{width:100%;text-align:right}.fb-left{width:320px;float:left;padding-top:30px}.fb-right{padding-top:70px;margin-left:320px;border-left:1px solid #ddd;padding-left:20px;min-height:100%;overflow:hidden}.fb-op-buttons-wrapper+.fb-left,.fb-op-buttons-wrapper+.fb-left+.fb-right{padding-top:10px}.fb-no-response-fields{color:#999}.fb-tabs{list-style:none;margin:0;padding:0 0 0 20px;border-bottom:1px solid #ccc}.fb-tabs li{display:inline-block}.fb-tabs li a{display:block;padding:10px;border-radius:5px 5px 0 0;font-size:13px;cursor:pointer;border-left:1px solid transparent;border-right:1px solid transparent}.fb-tabs li.active a{border:1px solid #ccc;margin-bottom:-1px;border-bottom-color:#fff}.fb-tabs li.active a[data-target="#editField"]{background-color:#fff9c9;border-bottom-color:#fff9c9}.fb-tab-content .fb-tab-pane{padding:20px;display:none}.fb-tab-content .fb-tab-pane.active{display:block}.fb-add-field-types .section{padding-bottom:5px;margin-bottom:20px}.fb-add-field-types{font-size:0;}.fb-add-field-types a{font-size:13px;display:inline-block;width:48.5%;background-color:#1abc9c;margin-bottom:9px;box-sizing:border-box;}.fb-add-field-types a:nth-child(odd){margin-right:3%}.fb-add-field-types a .symbol{opacity:.75;margin:0 .25em 0 -1em;font-size:16px;vertical-align:-2px}.fb-field-instructions{opacity:.75;font-size:.9em}#editField{background-color:#fff9c9}.fb-response-fields{min-height:100px;position:relative}.fb-response-fields a.sortable-placeholder{display:block;border:1px dashed #90aeb5;min-height:80px;height:80px;width:100%;margin-bottom:23px}.fb-field-wrapper{cursor:pointer;position:relative;margin-bottom:20px;background-color:#f0f4f5;}.fb-field-wrapper input{border-radius:3px;border:thin solid #ddd}.fb-field-wrapper input,.fb-field-wrapper textarea,.fb-field-wrapper select{background:#fff}.fb-response-fields .fb-field-wrapper,.fb-button.ui-draggable{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.fb-field-wrapper:hover .actions-wrapper,.fb-field-wrapper.editing .actions-wrapper{display:block}.fb-field-wrapper:hover .subtemplate-wrapper{border-color:#90aeb5;border-radius:3px}.fb-field-wrapper.editing{background-color:#fff9c9;border-radius:3px}.fb-field-wrapper.editing .subtemplate-wrapper{border-color:#f6eb8e;border-style:solid;margin:0;border-radius:3px}.fb-field-wrapper .actions-wrapper{display:none;position:absolute;bottom:-7px;right:5px;z-index:3}.fb-field-wrapper .actions-wrapper a{display:inline-block;background-color:#ccc;padding:2px 8px}.edit-response-field input,.edit-response-field textarea,.edit-response-field select{border:thin solid #ddd;border-radius:.25em;padding:.5em;display:inline-block;height:auto;vertical-align:middle;}.edit-response-field input:focus,.edit-response-field textarea:focus,.edit-response-field select:focus{outline:none;border:thin solid #1abc9c}.edit-response-field select{font-size:14px}.fb-field-wrapper .actions-wrapper a.js-duplicate{background-color:#9a9c9c;border:none}.fb-edit-field-wrapper .js-add-option{background-color:#2ecc71;border:none}.fb-edit-field-wrapper .js-drag-handle{background-color:#9a9c9c;border:none;padding:3px 9px}.fb-field-wrapper .actions-wrapper a.js-clear,.fb-edit-field-wrapper .js-remove-option{background-color:#e74c3c;border:none}.fb-field-wrapper .subtemplate-wrapper{border:1px dashed transparent;margin-bottom:10px;padding:10px;position:relative}.fb-field-wrapper .subtemplate-wrapper .cover{position:absolute;top:0;left:0;height:100%;width:100%;z-index:2}.fb-field-wrapper .subtemplate-wrapper > label{display:block;border-bottom:thin solid #dce5e7;padding-bottom:3px;margin-bottom:7px}.fb-field-wrapper.editing .subtemplate-wrapper > label{border-color:#f6eb8e}.fb-field-wrapper .subtemplate-wrapper label.preview-only{color:#bbb}.fb-field-wrapper .subtemplate-wrapper abbr{color:#f00}.fb-field-wrapper .input-line{clear:both;margin-bottom:10px}.fb-field-wrapper .input-line .above-line{margin-top:7px}.fb-field-wrapper .input-line > span{display:inline-block;vertical-align:top}.fb-field-wrapper .input-line > span input{width:100%}.fb-field-wrapper .input-line > span > label{display:block;font-size:13px;margin-left:3px}.fb-field-wrapper .help-block{display:block;font-size:12px;margin-top:5px}.fb-edit-field-wrapper{font-size:13px}.fb-edit-field-wrapper .fb-field-label{font-weight:normal;background:#eee;padding:.75em;color:#666;font-size:1.25em;}.fb-edit-field-wrapper .fb-field-label .field-type{margin-top:.5em;display:block;font-family:'Source Sans Pro',sans-serif;font-size:1em;}.fb-edit-field-wrapper .fb-field-label .field-type:before{content:'Type: ';color:#999}.fb-edit-field-wrapper .fb-field-label .fa.fa-arrow-right{display:none}.fb-edit-field-wrapper .fb-edit-section-header{border-bottom:1px solid #ddd;margin-top:25px;margin-bottom:10px;padding-bottom:5px;clear:both;font-weight:700}.fb-edit-field-wrapper .js-add-option,.fb-edit-field-wrapper .js-remove-option{padding:3px 6px}.fb-edit-field-wrapper .fb-bottom-add{margin-top:8px}.fb-common-wrapper .fb-label-description,.fb-common-wrapper .fb-default_value-description{margin-bottom:10px}.fb-edit-field-wrapper .fb-label-description input,.fb-edit-field-wrapper .fb-default_value-description input,.fb-edit-field-wrapper .fb-label-description textarea{width:100%;max-width:100%}.fb-edit-field-wrapper .fb-label-description textarea{min-height:5em}.response-field-draggable-helper{border:1px dashed #90aeb5;background:#eee}.response-field-text input.rf-size-small{width:130px}.response-field-text input.rf-size-medium{width:300px}.response-field-text input.rf-size-large{width:100%}.response-field-paragraph textarea.rf-size-small{width:200px;min-height:60px}.response-field-paragraph textarea.rf-size-medium{width:400px;min-height:100px}.response-field-paragraph textarea.rf-size-large{width:100%;min-height:200px}.response-field-address .street{width:400px}.response-field-address .city,.response-field-address .state,.response-field-address .zip,.response-field-address .country{width:198px}.response-field-date .month,.response-field-date .day,.response-field-date .year{width:50px}.response-field-time .hours,.response-field-time .minutes,.response-field-time .seconds{width:50px}.response-field-checkboxes .fb-option,.response-field-radio .fb-option{margin-bottom:5px;display:inline-block}.fb-error{color:#f00;font-style:italic}.fb-edit-finished{margin-top:25px}.instructionExample{margin-top:10px;font-style:italic}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa;background:#fff}body .ui-tooltip{border-width:2px} +.fb-wrap,.fb-wrap *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box} +.fb-button{display:inline-block;margin:0;padding:.563rem .844rem;border:0 none;background:#16a085;color:#fff;text-align:center;text-decoration:none;font-size:12px;line-height:1.5;cursor:pointer;border-radius:.125rem;border:thin solid #19b394;border-bottom:2px solid #16a085} +.fb-button[disabled]{background:#ddd !important;border:thin solid #ccc;color:#777 !important;text-shadow:none !important;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=65)";opacity:.65;cursor:default} +.fb-clear{clear:both} +.fb-main{max-width:1000px;margin:0 auto;padding:0 20px 0 0;position:relative;font-family:'Source Sans Pro','Open Sans',Tahoma} +.fb-op-buttons-wrapper{width:100%;text-align:right} +.fb-left{width:320px;float:left;padding-top:30px} +.fb-right{padding-top:70px;margin-left:320px;border-left:1px solid #ddd;padding-left:20px;min-height:100%;overflow:hidden} +.fb-op-buttons-wrapper+.fb-left,.fb-op-buttons-wrapper+.fb-left+.fb-right{padding-top:10px} +.fb-no-response-fields{color:#999} +.fb-tabs{list-style:none;margin:0;padding:0 0 0 20px;border-bottom:1px solid #ccc} +.fb-tabs li{display:inline-block} +.fb-tabs li a{display:block;padding:10px;border-radius:5px 5px 0 0;font-size:13px;cursor:pointer;border-left:1px solid transparent;border-right:1px solid transparent} +.fb-tabs li.active a{border:1px solid #ccc;margin-bottom:-1px;border-bottom-color:#fff} +.fb-tabs li.active a[data-target="#editField"]{background-color:#fff9c9;border-bottom-color:#fff9c9} +.fb-tab-content .fb-tab-pane{padding:20px;display:none} +.fb-tab-content .fb-tab-pane.active{display:block} +.fb-add-field-types .section{padding-bottom:5px;margin-bottom:20px} +.fb-add-field-types{font-size:0;} +.fb-add-field-types a{font-size:13px;display:inline-block;width:48.5%;background-color:#1abc9c;margin-bottom:9px;box-sizing:border-box;} +.fb-add-field-types a:nth-child(odd){margin-right:3%} +.fb-add-field-types a .symbol{opacity:.75;margin:0 .25em 0 -1em;font-size:16px;vertical-align:-2px} +.fb-field-instructions{opacity:.75;font-size:.9em} +#editField{background-color:#fff9c9} +.fb-response-fields{min-height:100px;position:relative} +.fb-response-fields a.sortable-placeholder{display:block;border:1px dashed #90aeb5;min-height:80px;height:80px;width:100%;margin-bottom:23px} +.fb-field-wrapper{cursor:pointer;position:relative;margin-bottom:20px;background-color:#f0f4f5;} +.fb-field-wrapper input{border-radius:3px;border:thin solid #ddd} +.fb-field-wrapper input,.fb-field-wrapper textarea,.fb-field-wrapper select{background:#fff} +.fb-response-fields .fb-field-wrapper,.fb-button.ui-draggable{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab} +.fb-field-wrapper:hover .actions-wrapper,.fb-field-wrapper.editing .actions-wrapper{display:block} +.fb-field-wrapper:hover .subtemplate-wrapper{border-color:#90aeb5;border-radius:3px} +.fb-field-wrapper.editing{background-color:#fff9c9;border-radius:3px} +.fb-field-wrapper.editing .subtemplate-wrapper{border-color:#f6eb8e;border-style:solid;margin:0;border-radius:3px} +.fb-field-wrapper .actions-wrapper{display:none;position:absolute;bottom:-7px;right:5px;z-index:3} +.fb-field-wrapper .actions-wrapper a{display:inline-block;background-color:#ccc;padding:2px 8px} +.edit-response-field input,.edit-response-field textarea,.edit-response-field select{border:thin solid #ddd;border-radius:.25em;padding:.5em;display:inline-block;height:auto;vertical-align:middle;} +.edit-response-field input:focus,.edit-response-field textarea:focus,.edit-response-field select:focus{outline:none;border:thin solid #1abc9c} +.edit-response-field select{font-size:14px} +.fb-field-wrapper .actions-wrapper a.js-duplicate{background-color:#9a9c9c;border:none} +.fb-edit-field-wrapper .js-add-option{background-color:#2ecc71;border:none} +.fb-edit-field-wrapper .js-drag-handle{background-color:#9a9c9c;border:none;padding:3px 9px} +.fb-field-wrapper .actions-wrapper a.js-clear,.fb-edit-field-wrapper .js-remove-option{background-color:#e74c3c;border:none} +.fb-field-wrapper .subtemplate-wrapper{border:1px dashed transparent;margin-bottom:10px;padding:10px;position:relative} +.fb-field-wrapper .subtemplate-wrapper .cover{position:absolute;top:0;left:0;height:100%;width:100%;z-index:2} +.fb-field-wrapper .subtemplate-wrapper > label{display:block;border-bottom:thin solid #dce5e7;padding-bottom:3px;margin-bottom:7px} +.fb-field-wrapper.editing .subtemplate-wrapper > label{border-color:#f6eb8e} +.fb-field-wrapper .subtemplate-wrapper label.preview-only{color:#bbb} +.fb-field-wrapper .subtemplate-wrapper abbr{color:#f00} +.fb-field-wrapper .input-line{clear:both;margin-bottom:10px} +.fb-field-wrapper .input-line .above-line{margin-top:7px} +.fb-field-wrapper .input-line > span{display:inline-block;vertical-align:top} +.fb-field-wrapper .input-line > span input{width:100%} +.fb-field-wrapper .input-line > span > label{display:block;font-size:13px;margin-left:3px} +.fb-field-wrapper .help-block{display:block;font-size:12px;margin-top:5px} +.fb-edit-field-wrapper{font-size:13px} +.fb-edit-field-wrapper .fb-field-label{font-weight:normal;background:#eee;padding:.75em;color:#666;font-size:1.25em;} +.fb-edit-field-wrapper .fb-field-label .field-type{margin-top:.5em;display:block;font-family:'Source Sans Pro',sans-serif;font-size:1em;} +.fb-edit-field-wrapper .fb-field-label .field-type:before{content:'Type: ';color:#999} +.fb-edit-field-wrapper .fb-field-label .fa.fa-arrow-right{display:none} +.fb-edit-field-wrapper .fb-edit-section-header{border-bottom:1px solid #ddd;margin-top:25px;margin-bottom:10px;padding-bottom:5px;clear:both;font-weight:700} +.fb-edit-field-wrapper .js-add-option,.fb-edit-field-wrapper .js-remove-option{padding:3px 6px} +.fb-edit-field-wrapper .fb-bottom-add{margin-top:8px} +.fb-common-wrapper .fb-label-description,.fb-common-wrapper .fb-default_value-description{margin-bottom:10px} +.fb-edit-field-wrapper .fb-label-description input,.fb-edit-field-wrapper .fb-default_value-description input,.fb-edit-field-wrapper .fb-label-description textarea{width:100%;max-width:100%} +.fb-edit-field-wrapper .fb-label-description textarea{min-height:5em} +.response-field-draggable-helper{border:1px dashed #90aeb5;background:#eee} +.response-field-text input.rf-size-small{width:130px} +.response-field-text input.rf-size-medium{width:300px} +.response-field-text input.rf-size-large{width:100%} +.response-field-paragraph textarea.rf-size-small{width:200px;min-height:60px} +.response-field-paragraph textarea.rf-size-medium{width:400px;min-height:100px} +.response-field-paragraph textarea.rf-size-large{width:100%;min-height:200px} +.response-field-address .street{width:400px} +.response-field-address .city,.response-field-address .state,.response-field-address .zip,.response-field-address .country{width:198px} +.response-field-date .month,.response-field-date .day,.response-field-date .year{width:50px} +.response-field-time .hours,.response-field-time .minutes,.response-field-time .seconds{width:50px} +.response-field-checkboxes .fb-option,.response-field-radio .fb-option{margin-bottom:5px;display:inline-block} +.fb-error{color:#f00;font-style:italic} +.fb-edit-finished{margin-top:25px} +.instructionExample{margin-top:10px;font-style:italic} +.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa;background:#fff} +body .ui-tooltip{border-width:2px} + @font-face { font-family: 'form-elements'; src: url('fonts/form-elements.eot'); diff --git a/sources/formbuilder-rsn/dist/formbuilder.js b/sources/formbuilder-rsn/dist/formbuilder.js index 9b9fd8312..5941eef22 100644 --- a/sources/formbuilder-rsn/dist/formbuilder.js +++ b/sources/formbuilder-rsn/dist/formbuilder.js @@ -44,7 +44,7 @@ }).call(this); - + (function() { rivets.binders.input = { publishes: true, @@ -86,13 +86,13 @@ }); }).call(this); - + (function() { - var BuilderView, DELETE_KEYCODE, DeletedFieldCollection, DeletedFieldModel, ENTER_KEYCODE, EditFieldView, Formbuilder, FormbuilderCollection, FormbuilderModel, ViewFieldView, emptyOrWhitespaceRegex, - extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - hasProp = {}.hasOwnProperty, - indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, - bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + var BuilderView, DELETE_KEYCODE, DeletedFieldCollection, DeletedFieldModel, ENTER_KEYCODE, EditFieldView, Formbuilder, FormbuilderCollection, FormbuilderModel, ViewFieldView, emptyOrWhitespaceRegex, _ref, _ref1, _ref2, _ref3, _ref4, _ref5, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, + __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; emptyOrWhitespaceRegex = RegExp(/^\s*$/); @@ -100,18 +100,17 @@ ENTER_KEYCODE = 13; - FormbuilderModel = (function(superClass) { - extend(FormbuilderModel, superClass); + FormbuilderModel = (function(_super) { + __extends(FormbuilderModel, _super); FormbuilderModel.prototype.sync = function() {}; FormbuilderModel.prototype.indexInDOM = function() { - var $wrapper; - $wrapper = $(".fb-field-wrapper").filter(((function(_this) { - return function(_, el) { - return $(el).data('cid') === _this.cid; - }; - })(this))); + var $wrapper, + _this = this; + $wrapper = $(".fb-field-wrapper").filter((function(_, el) { + return $(el).data('cid') === _this.cid; + })); return $(".fb-field-wrapper").index($wrapper); }; @@ -136,11 +135,12 @@ })(Backbone.DeepModel); - FormbuilderCollection = (function(superClass) { - extend(FormbuilderCollection, superClass); + FormbuilderCollection = (function(_super) { + __extends(FormbuilderCollection, _super); function FormbuilderCollection() { - return FormbuilderCollection.__super__.constructor.apply(this, arguments); + _ref = FormbuilderCollection.__super__.constructor.apply(this, arguments); + return _ref; } FormbuilderCollection.prototype.initialize = function() { @@ -161,11 +161,12 @@ })(Backbone.Collection); - DeletedFieldModel = (function(superClass) { - extend(DeletedFieldModel, superClass); + DeletedFieldModel = (function(_super) { + __extends(DeletedFieldModel, _super); function DeletedFieldModel() { - return DeletedFieldModel.__super__.constructor.apply(this, arguments); + _ref1 = DeletedFieldModel.__super__.constructor.apply(this, arguments); + return _ref1; } DeletedFieldModel.prototype.sync = function() {}; @@ -174,11 +175,12 @@ })(Backbone.DeepModel); - DeletedFieldCollection = (function(superClass) { - extend(DeletedFieldCollection, superClass); + DeletedFieldCollection = (function(_super) { + __extends(DeletedFieldCollection, _super); function DeletedFieldCollection() { - return DeletedFieldCollection.__super__.constructor.apply(this, arguments); + _ref2 = DeletedFieldCollection.__super__.constructor.apply(this, arguments); + return _ref2; } DeletedFieldCollection.prototype.model = DeletedFieldModel; @@ -187,11 +189,12 @@ })(Backbone.Collection); - ViewFieldView = (function(superClass) { - extend(ViewFieldView, superClass); + ViewFieldView = (function(_super) { + __extends(ViewFieldView, _super); function ViewFieldView() { - return ViewFieldView.__super__.constructor.apply(this, arguments); + _ref3 = ViewFieldView.__super__.constructor.apply(this, arguments); + return _ref3; } ViewFieldView.prototype.className = "fb-field-wrapper"; @@ -239,11 +242,12 @@ })(Backbone.View); - EditFieldView = (function(superClass) { - extend(EditFieldView, superClass); + EditFieldView = (function(_super) { + __extends(EditFieldView, _super); function EditFieldView() { - return EditFieldView.__super__.constructor.apply(this, arguments); + _ref4 = EditFieldView.__super__.constructor.apply(this, arguments); + return _ref4; } EditFieldView.prototype.className = "edit-response-field"; @@ -284,7 +288,8 @@ }; EditFieldView.prototype.render = function() { - var allowTypeChange, dvalIsEmpty, ref, userIsReasonAdmin; + var allowTypeChange, dvalIsEmpty, userIsReasonAdmin, _ref5, + _this = this; dvalIsEmpty = Formbuilder.helpers.fieldIsEmptyOrNull(this.model.get(Formbuilder.options.mappings.DEFAULT_VALUE)); this.model.attributes.displayDefaultValueUI = !dvalIsEmpty; this.$el.html(Formbuilder.templates["edit/base" + (!this.model.is_input() ? '_non_input' : '')]({ @@ -293,59 +298,51 @@ rivets.bind(this.$el, { model: this.model }); - if (((ref = this.model.attributes.field_type) === "radio" || ref === "dropdown" || ref === "checkboxes")) { - setTimeout(((function(_this) { - return function() { - return $(".sortableParentContainer").sortable({ - axis: "y", - start: (function(evt, ui) { - return ui.item.preservedStartPos = ui.item.index(); - }), - stop: (function(evt, ui) { - return _this.completedOptionDrag(evt, ui); - }), - handle: ".js-drag-handle" - }); - }; - })(this)), 10); + if (((_ref5 = this.model.attributes.field_type) === "radio" || _ref5 === "dropdown" || _ref5 === "checkboxes")) { + setTimeout((function() { + return $(".sortableParentContainer").sortable({ + axis: "y", + start: (function(evt, ui) { + return ui.item.preservedStartPos = ui.item.index(); + }), + stop: (function(evt, ui) { + return _this.completedOptionDrag(evt, ui); + }), + handle: ".js-drag-handle" + }); + }), 10); } allowTypeChange = Formbuilder.options.ALLOW_TYPE_CHANGE; - if (this.model.attributes.field_type === "submit_button") { + if (window.dbTableExists || this.model.attributes.field_type === "submit_button") { allowTypeChange = false; } - setTimeout(((function(_this) { - return function() { - if (allowTypeChange) { - $("#fieldDisplayEditable").css("display", "block"); - $("#fieldTypeSelector").val(_this.model.attributes.field_type); - $("#fieldTypeSelector").change((function() { - var fromType, toType; - fromType = _this.model.attributes.field_type; - toType = $("#fieldTypeSelector").val(); - return _this.changeEditingFieldTypeWithDataLossWarning(fromType, toType); - })); - return $("#fieldDisplayNonEditable").remove(); - } else { - $("#fieldDisplayNonEditable").css("display", "block"); - return $("#fieldDisplayEditable").remove(); - } - }; - })(this)), 10); + setTimeout((function() { + if (allowTypeChange) { + $("#fieldDisplayEditable").css("display", "block"); + $("#fieldTypeSelector").val(_this.model.attributes.field_type); + $("#fieldTypeSelector").change((function() { + var fromType, toType; + fromType = _this.model.attributes.field_type; + toType = $("#fieldTypeSelector").val(); + return _this.changeEditingFieldTypeWithDataLossWarning(fromType, toType); + })); + return $("#fieldDisplayNonEditable").remove(); + } else { + $("#fieldDisplayNonEditable").css("display", "block"); + return $("#fieldDisplayEditable").remove(); + } + }), 10); userIsReasonAdmin = Formbuilder.options.IS_REASON_ADMIN; - setTimeout(((function(_this) { - return function() { - if (userIsReasonAdmin) { - return $(".fb-reason-admin-only").css("display", "block"); - } - }; - })(this)), 10); - setTimeout(((function(_this) { - return function() { - if (Formbuilder.helpers.fieldIsEmptyOrNull(_this.model.get(Formbuilder.options.mappings.LABEL))) { - return $(".fb-label-description input[data-rv-input='model.label']").focus(); - } - }; - })(this)), 10); + setTimeout((function() { + if (userIsReasonAdmin) { + return $(".fb-reason-admin-only").css("display", "block"); + } + }), 10); + setTimeout((function() { + if (Formbuilder.helpers.fieldIsEmptyOrNull(_this.model.get(Formbuilder.options.mappings.LABEL))) { + return $(".fb-label-description input[data-rv-input='model.label']").focus(); + } + }), 10); return this; }; @@ -359,7 +356,7 @@ }; EditFieldView.prototype.changeEditingFieldTypeWithDataLossWarning = function(fromType, toType) { - var inputData, j, len, multiFields, numCheckedOptions, numOptions, o, prettyFrom, prettyTo, ref, warning; + var inputData, multiFields, numCheckedOptions, numOptions, o, prettyFrom, prettyTo, warning, _i, _len, _ref5; if (fromType === toType) { return; } @@ -379,20 +376,20 @@ if (this.dataWasEntered(inputData)) { warning = "you will lose the data text \"" + inputData + "\""; } - } else if ((indexOf.call(multiFields, fromType) >= 0)) { + } else if ((__indexOf.call(multiFields, fromType) >= 0)) { numOptions = 0; numCheckedOptions = 0; if (this.model.get(Formbuilder.options.mappings.OPTIONS)) { - ref = this.model.get(Formbuilder.options.mappings.OPTIONS); - for (j = 0, len = ref.length; j < len; j++) { - o = ref[j]; + _ref5 = this.model.get(Formbuilder.options.mappings.OPTIONS); + for (_i = 0, _len = _ref5.length; _i < _len; _i++) { + o = _ref5[_i]; numOptions++; if (o.checked) { numCheckedOptions++; } } } - if ((indexOf.call(multiFields, toType) >= 0)) { + if ((__indexOf.call(multiFields, toType) >= 0)) { if (fromType === "checkboxes" && numCheckedOptions > 1) { warning = "only one option can be checked by default"; } @@ -421,7 +418,6 @@ }; EditFieldView.prototype.changeEditingFieldType = function(fromType, toType) { - /* other possibility - in fields/[input_type].coffee, fields that require custom behavior can define functions like: getDataForTranslation: ((model) -> @@ -435,7 +431,7 @@ and then this function could hook into it thusly: if (Formbuilder.fields[fromType].getDataForTranslation) - * some fields store their data in non-standard ways. Grab it from them if possible + # some fields store their data in non-standard ways. Grab it from them if possible translationData = Formbuilder.fields[fromType].getDataForTranslation(@model) problem is since those individual coffee files for the field types aren't really classes, we lose a lot of @@ -444,8 +440,9 @@ At some point might be nice to rethink how those fields register themselves, but for now we can contain the logic to this one function at least, so it's manageable. - */ - var checksSeen, idx, j, len, o, onlyAllowOneCheck, ref, translationData; + */ + + var checksSeen, idx, o, onlyAllowOneCheck, translationData, _i, _len, _ref5; translationData = { pseudoLabel: null, options: null, @@ -465,9 +462,9 @@ if (onlyAllowOneCheck) { checksSeen = 0; if (this.model.get(Formbuilder.options.mappings.OPTIONS)) { - ref = this.model.get(Formbuilder.options.mappings.OPTIONS); - for (idx = j = 0, len = ref.length; j < len; idx = ++j) { - o = ref[idx]; + _ref5 = this.model.get(Formbuilder.options.mappings.OPTIONS); + for (idx = _i = 0, _len = _ref5.length; _i < _len; idx = ++_i) { + o = _ref5[idx]; if (o.checked) { if (checksSeen > 0) { o.checked = false; @@ -503,10 +500,10 @@ }; EditFieldView.prototype.debugOptions = function(opts) { - var j, len, o, rv; + var o, rv, _i, _len; rv = ""; - for (j = 0, len = opts.length; j < len; j++) { - o = opts[j]; + for (_i = 0, _len = opts.length; _i < _len; _i++) { + o = opts[_i]; if (rv !== "") { rv += ","; } @@ -517,9 +514,8 @@ }; EditFieldView.prototype.completedOptionDrag = function(evt, ui) { - var mover, newIdx, oldIdx, options, ref; - ref = [ui.item.preservedStartPos, ui.item.index()], oldIdx = ref[0], newIdx = ref[1]; - + var mover, newIdx, oldIdx, options, _ref5; + _ref5 = [ui.item.preservedStartPos, ui.item.index()], oldIdx = _ref5[0], newIdx = _ref5[1]; /* this is the funky part. I think the options template (which is a combination of Backbone and Rivets tech) and the JQuery DOM manipulation are stomping on each other. Below I am going to update the OPTIONS model and trigger the appropriate events, @@ -529,7 +525,8 @@ Maybe there is some way to keep JQuery/Rivets/Backbone in sync with one another but with basically zero knowledge of how the latter two of those three pieces of software function that is a slog of a debugging process and this works just fine. - */ + */ + $(".sortableParentContainer").sortable('cancel'); options = this.model.get(Formbuilder.options.mappings.OPTIONS); if (oldIdx !== newIdx) { @@ -598,11 +595,12 @@ })(Backbone.View); - BuilderView = (function(superClass) { - extend(BuilderView, superClass); + BuilderView = (function(_super) { + __extends(BuilderView, _super); function BuilderView() { - return BuilderView.__super__.constructor.apply(this, arguments); + _ref5 = BuilderView.__super__.constructor.apply(this, arguments); + return _ref5; } BuilderView.prototype.SUBVIEWS = []; @@ -632,7 +630,7 @@ }; BuilderView.prototype.initialize = function(options) { - var newSubmit, ref, ref1, selector, setter; + var newSubmit, selector, setter, _ref6, _ref7; $(document).keydown(this.captureDeleteAndEnter); $(document).tooltip({ track: true, @@ -661,7 +659,7 @@ this.undoStack.bind('add remove', this.setUndoButton, this); this.render(); this.collection.reset(this.bootstrapData); - if (_.pathGet((ref = this.bootstrapData) != null ? ref[((ref1 = this.bootstrapData) != null ? ref1.length : void 0) - 1] : void 0, Formbuilder.options.mappings.FIELD_TYPE) !== 'submit_button' && Formbuilder.options.FORCE_BOTTOM_SUBMIT) { + if (_.pathGet((_ref6 = this.bootstrapData) != null ? _ref6[((_ref7 = this.bootstrapData) != null ? _ref7.length : void 0) - 1] : void 0, Formbuilder.options.mappings.FIELD_TYPE) !== 'submit_button' && Formbuilder.options.FORCE_BOTTOM_SUBMIT) { newSubmit = new FormbuilderModel; setter = {}; setter[Formbuilder.options.mappings.LABEL] = 'Submit'; @@ -674,24 +672,21 @@ }; BuilderView.prototype.initAutosave = function() { + var _this = this; this.formSaved = true; this.saveFormButton = this.$el.find(".js-save-form"); this.saveFormButton.attr('disabled', true).text(Formbuilder.options.dict.ALL_CHANGES_SAVED); - setInterval((function(_this) { - return function() { - return _this.saveForm.call(_this); - }; - })(this), 5000); + setInterval(function() { + return _this.saveForm.call(_this); + }, 5000); if (Formbuilder.options.WARN_IF_UNSAVED) { - return $(window).bind('beforeunload', (function(_this) { - return function() { - if (_this.formSaved) { - return void 0; - } else { - return Formbuilder.options.dict.UNSAVED_CHANGES; - } - }; - })(this)); + return $(window).bind('beforeunload', function() { + if (_this.formSaved) { + return void 0; + } else { + return Formbuilder.options.dict.UNSAVED_CHANGES; + } + }); } }; @@ -716,15 +711,15 @@ }; BuilderView.prototype.render = function() { - var j, len, ref, subview; + var subview, _i, _len, _ref6; this.$el.html(Formbuilder.templates['page']()); this.$fbLeft = this.$el.find('.fb-left'); this.$responseFields = this.$el.find('.fb-response-fields'); this.bindWindowScrollEvent(); this.hideShowNoResponseFields(); - ref = this.SUBVIEWS; - for (j = 0, len = ref.length; j < len; j++) { - subview = ref[j]; + _ref6 = this.SUBVIEWS; + for (_i = 0, _len = _ref6.length; _i < _len; _i++) { + subview = _ref6[_i]; new subview({ parentView: this }).render(); @@ -739,19 +734,18 @@ }; BuilderView.prototype.bindWindowScrollEvent = function() { - return $(window).on('scroll', (function(_this) { - return function() { - return _this.positionLeftHandUI(); - }; - })(this)); + var _this = this; + return $(window).on('scroll', function() { + return _this.positionLeftHandUI(); + }); }; - /* vanilla formbuilder just scrolls the left hand ui based on the window scroll position, with a lower and a (rather inaccurate) upper bound. This reworked version keeps the ui "pinned" to the top of the screen more or less. figures out where the fb-left div should be so that it stays onscreen, follows user interactions, etc. snaps or animates. - */ + */ + BuilderView.prototype.positionLeftHandUI = function(doAnimate) { var fbRight, fbRightHeight, fbTopRelativeToDocument, maxAllowableScroll, minAllowableScroll, proposedMargin, scrollerHeight, windowScrollPos; @@ -831,6 +825,7 @@ }; BuilderView.prototype.setSortable = function() { + var _this = this; if (this.$responseFields.hasClass('ui-sortable')) { this.$responseFields.sortable('destroy'); } @@ -840,32 +835,29 @@ containment: this.$responseFields.parent().parent(), placeholder: 'sortable-placeholder', handle: '.cover', - stop: (function(_this) { - return function(e, ui) { - var rf; - if (ui.item.data('field-type')) { - rf = _this.collection.create(Formbuilder.helpers.defaultFieldAttrs(ui.item.data('field-type')), { - $replaceEl: ui.item - }); - _this.createAndShowEditView(rf); - } - _this.handleFormUpdate(); - return true; - }; - })(this), - update: (function(_this) { - return function(e, ui) { - if (!ui.item.data('field-type')) { - return _this.ensureEditViewScrolled(); - } - }; - })(this) + stop: function(e, ui) { + var rf; + if (ui.item.data('field-type')) { + rf = _this.collection.create(Formbuilder.helpers.defaultFieldAttrs(ui.item.data('field-type')), { + $replaceEl: ui.item + }); + _this.createAndShowEditView(rf); + } + _this.handleFormUpdate(); + return true; + }, + update: function(e, ui) { + if (!ui.item.data('field-type')) { + return _this.ensureEditViewScrolled(); + } + } }); return this.setDraggable(); }; BuilderView.prototype.setDraggable = function() { - var $addFieldButtons; + var $addFieldButtons, + _this = this; $addFieldButtons = this.$el.find("[data-field-type]"); return $addFieldButtons.draggable({ connectToSortable: this.$responseFields, @@ -875,27 +867,23 @@ }, distance: 15, helper: "clone", - start: (function(_this) { - return function(e, ui) { - var draggedElement; - draggedElement = $(ui.helper[0]); - return draggedElement.css({ - "height": "80px", - "width": _this.$responseFields.width() - }); - }; - })(this), - old_helper: (function(_this) { - return function() { - var $helper; - $helper = $(""); - $helper.css({ - width: _this.$responseFields.width(), - height: '80px' - }); - return $helper; - }; - })(this) + start: function(e, ui) { + var draggedElement; + draggedElement = $(ui.helper[0]); + return draggedElement.css({ + "height": "80px", + "width": _this.$responseFields.width() + }); + }, + old_helper: function() { + var $helper; + $helper = $(""); + $helper.css({ + width: _this.$responseFields.width(), + height: '80px' + }); + return $helper; + } }); }; @@ -905,8 +893,8 @@ }; BuilderView.prototype.hideShowNoResponseFields = function() { - var ref; - return this.$el.find(".fb-no-response-fields")[(this.collection.length === 1 && Formbuilder.options.FORCE_BOTTOM_SUBMIT && ((ref = this.collection.models[0]) != null ? ref.is_last_submit() : void 0)) || this.collection.length === 0 ? 'show' : 'hide'](); + var _ref6; + return this.$el.find(".fb-no-response-fields")[(this.collection.length === 1 && Formbuilder.options.FORCE_BOTTOM_SUBMIT && ((_ref6 = this.collection.models[0]) != null ? _ref6.is_last_submit() : void 0)) || this.collection.length === 0 ? 'show' : 'hide'](); }; BuilderView.prototype.addField = function(e) { @@ -965,30 +953,30 @@ return this.scrollLeftWrapper($(".fb-field-wrapper.editing")); }; - /* scrollLeftWrapper: ($responseFieldEl) -> @unlockLeftWrapper() return unless $responseFieldEl[0] - * console.log "scrolling to [" + ($responseFieldEl.offset().top - @$responseFields.offset().top) + "] (" + $responseFieldEl.offset().top + ")/(" + @$responseFields.offset().top + ")..." + # console.log "scrolling to [" + ($responseFieldEl.offset().top - @$responseFields.offset().top) + "] (" + $responseFieldEl.offset().top + ")/(" + @$responseFields.offset().top + ")..." $.scrollWindowTo ($responseFieldEl.offset().top - @$responseFields.offset().top), 200, => @lockLeftWrapper() - */ + */ /* - * scroll version 2 - the element you're editing will scroll to about 1/4 of the way down the screen + # scroll version 2 - the element you're editing will scroll to about 1/4 of the way down the screen scrollLeftWrapper: ($responseFieldEl) -> @unlockLeftWrapper() return unless $responseFieldEl[0] - * console.log "scrolling to [" + ($responseFieldEl.offset().top - @$responseFields.offset().top) + "] (" + $responseFieldEl.offset().top + ")/(" + @$responseFields.offset().top + ")..." + # console.log "scrolling to [" + ($responseFieldEl.offset().top - @$responseFields.offset().top) + "] (" + $responseFieldEl.offset().top + ")/(" + @$responseFields.offset().top + ")..." destination = $responseFieldEl.offset().top - ($(window).height() / 4) - * scroll window to some position over some number of milliseconds... + # scroll window to some position over some number of milliseconds... $.scrollWindowTo destination, 200, => @lockLeftWrapper() - */ + */ + BuilderView.prototype.scrollLeftWrapper = function($responseFieldEl) { var destination, fbRight, fbRightHeight, maxAllowableScroll, scrollerHeight; @@ -1040,27 +1028,26 @@ }; BuilderView.prototype.doAjaxSave = function(payload) { + var _this = this; return $.ajax({ url: Formbuilder.options.HTTP_ENDPOINT, type: Formbuilder.options.HTTP_METHOD, data: payload, contentType: "application/json", - success: (function(_this) { - return function(data) { - var datum, j, len, ref; - _this.updatingBatch = true; - for (j = 0, len = data.length; j < len; j++) { - datum = data[j]; - if ((ref = _this.collection.get(datum.cid)) != null) { - ref.set({ - id: datum.id - }); - } - _this.collection.trigger('sync'); + success: function(data) { + var datum, _i, _len, _ref6; + _this.updatingBatch = true; + for (_i = 0, _len = data.length; _i < _len; _i++) { + datum = data[_i]; + if ((_ref6 = _this.collection.get(datum.cid)) != null) { + _ref6.set({ + id: datum.id + }); } - return _this.updatingBatch = void 0; - }; - })(this) + _this.collection.trigger('sync'); + } + return _this.updatingBatch = void 0; + } }); }; @@ -1135,12 +1122,12 @@ Formbuilder.helpers = { defaultFieldAttrs: function(field_type) { - var attrs, base; + var attrs, _base; attrs = {}; _.pathAssign(attrs, Formbuilder.options.mappings.LABEL, ''); _.pathAssign(attrs, Formbuilder.options.mappings.FIELD_TYPE, field_type); _.pathAssign(attrs, Formbuilder.options.mappings.REQUIRED, Formbuilder.options.REQUIRED_DEFAULT); - return (typeof (base = Formbuilder.fields[field_type]).defaultAttributes === "function" ? base.defaultAttributes(attrs) : void 0) || attrs; + return (typeof (_base = Formbuilder.fields[field_type]).defaultAttributes === "function" ? _base.defaultAttributes(attrs) : void 0) || attrs; }, simple_format: function(x) { return x != null ? x.replace(/\n/g, '