diff --git a/.travis.yml b/.travis.yml index 0861ed8..9f1d072 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,9 +4,6 @@ sudo: false language: php - # Support PHP 5.3 -dist: precise - matrix: include: - php: 5.3 diff --git a/client/src/bundles/FieldEditor.js b/client/src/bundles/FieldEditor.js index 5e9b14e..ff825aa 100644 --- a/client/src/bundles/FieldEditor.js +++ b/client/src/bundles/FieldEditor.js @@ -8,8 +8,8 @@ $(".uf-field-editor tbody").entwine({ onmatch: function() { - var i, - thisLevel, + var i, + thisLevel, depth = 0, $buttonrow = $('.uf-field-editor .ss-gridfield-buttonrow').addClass('stickyButtons'), navHeight = $('.cms-content-header.north').height() + parseInt($('.stickyButtons').css('padding-top'), 10), @@ -17,7 +17,7 @@ self = this; this._super(); - + // Loop through all rows and set necessary styles this.find('.ss-gridfield-item').each(function() { switch($(this).data('class')) { @@ -37,7 +37,7 @@ thisLevel = depth; } } - + $(this).toggleClass('inFieldGroup', thisLevel > 0); for(i = 1; i <= 5; i++) { $(this).toggleClass('inFieldGroup-level-'+i, thisLevel >= i); @@ -76,7 +76,7 @@ var self = this; this._super(); - + // When the 'Add field' button is clicked set a one time listener. // When the GridField is reloaded focus on the newly added field. this.on('addnewinline', function () { @@ -92,19 +92,11 @@ $newField.find('.col-Title input').focus(); } - // animate the row positioning (add the first class) - if (document.createElement('div').style.animationName !== void 0) { - $newField.addClass('newField'); + $newField.addClass('flashBackground'); + $(".cms-content-fields").scrollTop($(".cms-content-fields")[0].scrollHeight); + if($groupEnd) { + $groupEnd.css('visibility', 'visible'); } - - // Once the animation has completed - setTimeout(function () { - $newField.removeClass('newField').addClass('flashBackground'); - $(".cms-content-fields").scrollTop($(".cms-content-fields")[0].scrollHeight); - if($groupEnd) { - $groupEnd.css('visibility', 'visible'); - } - }, 500); }); }); }, diff --git a/client/src/bundles/Recipient.js b/client/src/bundles/Recipient.js index 0bae6bf..0e97c57 100644 --- a/client/src/bundles/Recipient.js +++ b/client/src/bundles/Recipient.js @@ -5,12 +5,11 @@ (function ($) { $(document).ready(function () { + var sendPlain = $('input[name="SendPlain"]'); var recipient = { // Some fields are only visible when HTML email are being sent. updateFormatSpecificFields: function () { - var sendPlainChecked = $('#SendPlain') - .find('input[type="checkbox"]') - .is(':checked'); + var sendPlainChecked = sendPlain.is(':checked'); $(".field.toggle-html-only")[sendPlainChecked ? 'hide' : 'show'](); $(".field.toggle-plain-only")[sendPlainChecked ? 'show' : 'hide'](); @@ -27,7 +26,7 @@ } }); - $('#SendPlain').entwine({ + sendPlain.entwine({ onchange: function () { recipient.updateFormatSpecificFields(); } diff --git a/client/src/styles/userforms-cms.scss b/client/src/styles/userforms-cms.scss index 814200c..a15abbc 100644 --- a/client/src/styles/userforms-cms.scss +++ b/client/src/styles/userforms-cms.scss @@ -2,11 +2,6 @@ * Animations */ -@keyframes rowSlide { - 0% {top: 20%;} - 100% {top: 80%;} -} - @keyframes flashBackground { 0% {background-color: white;} 10% {background-color: #dcfedd;} @@ -44,11 +39,6 @@ min-height: 46px; } - &.newField { - position: fixed; - animation: rowSlide .5s ease forwards; - } - &.flashBackground { animation: flashBackground 2s linear; } diff --git a/code/model/editableformfields/EditableCheckboxGroupField.php b/code/model/editableformfields/EditableCheckboxGroupField.php index c36f7fa..b78a66f 100755 --- a/code/model/editableformfields/EditableCheckboxGroupField.php +++ b/code/model/editableformfields/EditableCheckboxGroupField.php @@ -18,8 +18,9 @@ class EditableCheckboxGroupField extends EditableMultipleOptionField public function getFormField() { - $field = new UserFormsCheckboxSetField($this->Name, $this->EscapedTitle, $this->getOptionsMap()); - $field->setFieldHolderTemplate('UserFormsMultipleOptionField_holder'); + $field = UserFormsCheckboxSetField::create($this->Name, $this->EscapedTitle, $this->getOptionsMap()) + ->setFieldHolderTemplate('UserFormsMultipleOptionField_holder') + ->setTemplate('UserFormsCheckboxSetField'); // Set the default checked items $defaultCheckedItems = $this->getDefaultOptions(); diff --git a/code/model/editableformfields/EditableFileField.php b/code/model/editableformfields/EditableFileField.php index f272925..b81a1f2 100755 --- a/code/model/editableformfields/EditableFileField.php +++ b/code/model/editableformfields/EditableFileField.php @@ -45,10 +45,14 @@ class EditableFileField extends EditableFormField ) ); - $fields->addFieldToTab("Root.Main", new LiteralField("FileUploadWarning", - "

" . _t("UserDefinedForm.FileUploadWarning", - "Files uploaded through this field could be publicly accessible if the exact URL is known") - . "

"), "Type"); + $fields->addFieldToTab("Root.Main", new LiteralField( + "FileUploadWarning", + "

" + . _t( + "UserDefinedForm.FileUploadWarning", + "Files uploaded through this field could be publicly accessible if the exact URL is known" + ) . "

" + ), "Type"); $fields->addFieldToTab( 'Root.Main', @@ -57,6 +61,8 @@ class EditableFileField extends EditableFormField ->setDescription("Note: Maximum php allowed size is {$this->getPHPMaxFileSizeMB()} MB") ); + $fields->removeByName('Default'); + return $fields; } diff --git a/code/model/editableformfields/EditableRadioField.php b/code/model/editableformfields/EditableRadioField.php index 2129bb4..d58262b 100755 --- a/code/model/editableformfields/EditableRadioField.php +++ b/code/model/editableformfields/EditableRadioField.php @@ -28,8 +28,9 @@ class EditableRadioField extends EditableMultipleOptionField public function getFormField() { - $field = OptionsetField::create($this->Name, $this->EscapedTitle, $this->getOptionsMap()); - $field->setFieldHolderTemplate('UserFormsMultipleOptionField_holder'); + $field = OptionsetField::create($this->Name, $this->EscapedTitle, $this->getOptionsMap()) + ->setFieldHolderTemplate('UserFormsMultipleOptionField_holder') + ->setTemplate('UserFormsOptionSetField'); // Set default item $defaultOption = $this->getDefaultOptions()->first(); diff --git a/code/model/recipients/UserDefinedForm_EmailRecipient.php b/code/model/recipients/UserDefinedForm_EmailRecipient.php index 52ad3fd..a92deef 100644 --- a/code/model/recipients/UserDefinedForm_EmailRecipient.php +++ b/code/model/recipients/UserDefinedForm_EmailRecipient.php @@ -261,12 +261,9 @@ class UserDefinedForm_EmailRecipient extends DataObject ->addExtraClass('toggle-html-only'), TextareaField::create('EmailBody', _t('UserDefinedForm.EMAILBODY', 'Body')) ->addExtraClass('toggle-plain-only'), - LiteralField::create( - 'EmailPreview', - '
' . $preview . '
' - ) + LiteralField::create('EmailPreview', $preview) )); - + $fields->fieldByName('Root.EmailContent')->setTitle(_t('UserDefinedForm_EmailRecipient.EMAILCONTENTTAB', 'Email Content')); // Custom rules for sending this field @@ -291,7 +288,7 @@ class UserDefinedForm_EmailRecipient extends DataObject ), $grid )); - + $fields->fieldByName('Root.CustomRules')->setTitle(_t('UserDefinedForm_EmailRecipient.CUSTOMRULESTAB', 'Custom Rules')); $this->extend('updateCMSFields', $fields); @@ -421,7 +418,10 @@ class UserDefinedForm_EmailRecipient extends DataObject */ public function getEmailBodyContent() { - return $this->SendPlain ? $this->EmailBody : $this->EmailBodyHtml; + if ($this->SendPlain) { + return DBField::create_field('HTMLText', $this->EmailBody)->NoHTML(); + } + return DBField::create_field('HTMLText', $this->EmailBodyHtml)->RAW(); } /** diff --git a/code/model/submissions/SubmittedFileField.php b/code/model/submissions/SubmittedFileField.php index 557235a..44f8df8 100755 --- a/code/model/submissions/SubmittedFileField.php +++ b/code/model/submissions/SubmittedFileField.php @@ -55,7 +55,7 @@ class SubmittedFileField extends SubmittedFormField { if ($file = $this->UploadedFile()) { if (trim($file->getFilename(), '/') != trim(ASSETS_DIR, '/')) { - return $this->UploadedFile()->URL; + return $this->UploadedFile()->AbsoluteLink(); } } } diff --git a/code/model/submissions/SubmittedForm.php b/code/model/submissions/SubmittedForm.php index 7e8ec61..6378680 100755 --- a/code/model/submissions/SubmittedForm.php +++ b/code/model/submissions/SubmittedForm.php @@ -75,15 +75,20 @@ class SubmittedForm extends DataObject ) ); - $values = new GridField( + $values = GridField::create( 'Values', 'SubmittedFormField', $self->Values()->sort('Created', 'ASC') ); + $exportColumns = array( + 'Title' => 'Title', + 'ExportValue' => 'Value' + ); + $config = new GridFieldConfig(); $config->addComponent(new GridFieldDataColumns()); - $config->addComponent(new GridFieldExportButton()); + $config->addComponent(new GridFieldExportButton('after', $exportColumns)); $config->addComponent(new GridFieldPrintButton()); $values->setConfig($config); diff --git a/templates/Includes/UserForm.ss b/templates/Includes/UserForm.ss index 852e967..77fe039 100644 --- a/templates/Includes/UserForm.ss +++ b/templates/Includes/UserForm.ss @@ -1,5 +1,5 @@
- + <% include UserFormProgress %> <% include UserFormStepErrors %> @@ -9,13 +9,16 @@ <% end_if %> -
- <% if $Legend %>$Legend<% end_if %> - <% loop $Fields %> - $FieldHolder - <% end_loop %> -
-
+<% if $Legend %> +
+ $Legend + <% include UserFormFields %> +
+<% else %> +
+ <% include UserFormFields %> +
+<% end_if %> <% if $Steps.Count > 1 %> <% include UserFormStepNav %> diff --git a/templates/Includes/UserFormFields.ss b/templates/Includes/UserFormFields.ss new file mode 100644 index 0000000..9c45c17 --- /dev/null +++ b/templates/Includes/UserFormFields.ss @@ -0,0 +1,5 @@ +<% loop $Fields %> + $FieldHolder +<% end_loop %> +
+ diff --git a/templates/Includes/UserFormStepErrors.ss b/templates/Includes/UserFormStepErrors.ss index 8e97344..9ccd4f2 100644 --- a/templates/Includes/UserFormStepErrors.ss +++ b/templates/Includes/UserFormStepErrors.ss @@ -1,8 +1,6 @@ <% if $Steps.Count > 1 %> - + <% end_if %> diff --git a/templates/UserFormsOptionSetField.ss b/templates/UserFormsOptionSetField.ss new file mode 100644 index 0000000..836ba5b --- /dev/null +++ b/templates/UserFormsOptionSetField.ss @@ -0,0 +1,7 @@ +<% loop $Options %> +
+ + checked<% end_if %><% if $isDisabled %> disabled<% end_if %> <% if $Up.Required %>required<% end_if %> /> + +
+<% end_loop %> diff --git a/templates/forms/UserFormsCheckboxSetField.ss b/templates/forms/UserFormsCheckboxSetField.ss new file mode 100644 index 0000000..290fd78 --- /dev/null +++ b/templates/forms/UserFormsCheckboxSetField.ss @@ -0,0 +1,11 @@ +<% if $Options.Count %> + <% loop $Options %> +
+ + checked="checked"<% end_if %><% if $isDisabled %> disabled="disabled"<% end_if %> /> + +
+ <% end_loop %> +<% else %> +

No options available

+<% end_if %> diff --git a/templates/forms/UserFormsLiteralField_holder.ss b/templates/forms/UserFormsLiteralField_holder.ss index 910e0fe..a7736de 100644 --- a/templates/forms/UserFormsLiteralField_holder.ss +++ b/templates/forms/UserFormsLiteralField_holder.ss @@ -1,5 +1,5 @@
- <% if $Title %><% end_if %> + <% if $Title %>

$Title

<% end_if %>
<% loop $FieldList %> $Field diff --git a/templates/forms/UserFormsStepField.ss b/templates/forms/UserFormsStepField.ss index 957599b..2d98657 100644 --- a/templates/forms/UserFormsStepField.ss +++ b/templates/forms/UserFormsStepField.ss @@ -1,15 +1,15 @@ -
+
<% if $Form.DisplayErrorMessagesAtTop %> - +
<% end_if %> <% loop $Children %> $FieldHolder <% end_loop %> -
+
diff --git a/tests/EditableCheckboxGroupFieldTest.php b/tests/EditableCheckboxGroupFieldTest.php new file mode 100644 index 0000000..47f2b0f --- /dev/null +++ b/tests/EditableCheckboxGroupFieldTest.php @@ -0,0 +1,15 @@ +objFromFixture('EditableCheckboxGroupField', 'checkbox-group'); + $this->assertEquals('UserFormsCheckboxSetField', $checkboxGroup->getFormField()->getTemplate()); + } +} diff --git a/tests/EditableRadioFieldTest.php b/tests/EditableRadioFieldTest.php new file mode 100644 index 0000000..825785a --- /dev/null +++ b/tests/EditableRadioFieldTest.php @@ -0,0 +1,15 @@ +objFromFixture('EditableRadioField', 'radio-field'); + $this->assertEquals('UserFormsOptionSetField', $radio->getFormField()->getTemplate()); + } +} diff --git a/tests/model/recipients/UserDefinedForm_EmailRecipientTest.php b/tests/model/recipients/UserDefinedForm_EmailRecipientTest.php new file mode 100644 index 0000000..237560a --- /dev/null +++ b/tests/model/recipients/UserDefinedForm_EmailRecipientTest.php @@ -0,0 +1,24 @@ +objFromFixture('SiteTree', 'about_us'); + + $recipient = UserDefinedForm_EmailRecipient::create(); + $recipient->SendPlain = false; + $recipient->EmailBodyHtml = '

Some email content. About us: [sitetree_link,id=' . $page->ID . '].

'; + + $result = $recipient->getEmailBodyContent(); + $this->assertContains('/about-us/', $result); + + $recipient->SendPlain = true; + $recipient->EmailBody = 'Some email content. About us: [sitetree_link,id=' . $page->ID . '].'; + + $result = $recipient->getEmailBodyContent(); + $this->assertContains('/about-us/', $result); + } +} diff --git a/tests/model/recipients/UserDefinedForm_EmailRecipientTest.yml b/tests/model/recipients/UserDefinedForm_EmailRecipientTest.yml new file mode 100644 index 0000000..7ff28c7 --- /dev/null +++ b/tests/model/recipients/UserDefinedForm_EmailRecipientTest.yml @@ -0,0 +1,4 @@ +SiteTree: + about_us: + Title: About Us + URLSegment: about-us