├── .gitignore ├── Docs ├── GDPR.md ├── build.md ├── emails.md ├── extend.md ├── extend_condition.md ├── extend_condition_advanced.md ├── extend_condition_simple.md ├── extend_field.md ├── extend_field_advanced.md ├── extend_field_simple.md ├── fields.md ├── fields_newsletter.md ├── img │ ├── condition-editor.png │ ├── data-types.png │ ├── form-layout.png │ ├── global-search.png │ ├── logo.png │ ├── max-submissions-entry.png │ ├── my.length.png │ ├── row-layouts.png │ ├── statistics.png │ ├── submission-consent.png │ └── web-service-integration.png ├── initialize.md ├── install.md ├── install_web_service.md ├── jobs.md ├── multiple.md ├── render.md ├── reuse.md ├── storage.md ├── submissions.md ├── submissions_edit.md ├── submissions_list.md └── submissions_stats.md ├── Grunt ├── Assets │ ├── Dashboard.config.install.xdt │ ├── Dashboard.config.uninstall.xdt │ ├── UmbracoPackageManifest.xml │ └── package.nuspec ├── UmbracoPackageManifest.xml ├── gruntfile.js └── package.json ├── LICENSE ├── README.md ├── Samples ├── Advanced custom field │ ├── App_Plugins │ │ └── FormEditor │ │ │ └── editor │ │ │ └── fields │ │ │ ├── my.range.html │ │ │ └── my.range.png │ ├── My.Fields.csproj │ ├── MyRangeField.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── README.md │ ├── Views │ │ ├── Partials │ │ │ └── FormEditor │ │ │ │ ├── FieldsAsync │ │ │ │ └── my.range.cshtml │ │ │ │ └── FieldsSync │ │ │ │ └── my.range.cshtml │ │ └── Web.config │ └── packages.config ├── Custom validation condition │ ├── App_Plugins │ │ └── FormEditor │ │ │ └── editor │ │ │ └── conditions │ │ │ ├── my.length.html │ │ │ └── my.length.png │ ├── JS │ │ └── FormEditor │ │ │ ├── MyLengthConditionAsync.js │ │ │ └── MyLengthConditionSync.js │ ├── My.Conditions.csproj │ ├── MyLengthCondition.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ └── packages.config ├── Elastic storage index │ ├── FormEditor.ElasticIndex.csproj │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── Storage │ │ ├── Entry.cs │ │ ├── File.cs │ │ └── Index.cs │ └── packages.config ├── Event handling │ ├── ApplicationEvents.cs │ ├── My.Events.csproj │ ├── Properties │ │ └── AssemblyInfo.cs │ └── packages.config ├── Form Editor samples.sln ├── SQL storage index │ ├── ApplicationEvents.cs │ ├── FormEditor.SqlIndex.csproj │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── README.md │ ├── Storage │ │ ├── Entry.cs │ │ ├── File.cs │ │ └── Index.cs │ └── packages.config └── Simple custom field │ ├── App_Plugins │ └── FormEditor │ │ └── editor │ │ └── fields │ │ └── my.range.png │ ├── README.md │ └── Views │ └── Partials │ └── FormEditor │ ├── FieldsAsync │ └── my.range.cshtml │ └── FieldsSync │ └── my.range.cshtml ├── Source ├── Solution │ ├── Form Editor.sln │ └── FormEditor │ │ ├── AntiForgeryHelper.cs │ │ ├── Api │ │ ├── CsvExport.cs │ │ ├── DashboardController.cs │ │ ├── DownloadController.cs │ │ ├── JobsController.cs │ │ ├── PropertyEditorController.cs │ │ └── PublicController.cs │ │ ├── ApprovalState.cs │ │ ├── Cell.cs │ │ ├── Configuration.cs │ │ ├── Data │ │ ├── Field.cs │ │ ├── FormData.cs │ │ └── Row.cs │ │ ├── EmailRenderer.cs │ │ ├── Events │ │ ├── FormEditorCancelEventArgs.cs │ │ ├── FormEditorCancelEventHandler.cs │ │ ├── FormEditorEventArgs.cs │ │ ├── FormEditorEventHandler.cs │ │ ├── FormEditorMailCancelEventArgs.cs │ │ └── FormEditorMailCancelEventHandler.cs │ │ ├── FieldHelper.cs │ │ ├── Fields │ │ ├── CampaignMonitorSubscriptionField.cs │ │ ├── CheckboxField.cs │ │ ├── CheckboxGroupField.cs │ │ ├── ConsentField.cs │ │ ├── CustomField.cs │ │ ├── CustomFieldFixedValues.cs │ │ ├── DateField.cs │ │ ├── DropdownField.cs │ │ ├── EmailField.cs │ │ ├── Field.cs │ │ ├── FieldValue.cs │ │ ├── FieldWithFieldValues.cs │ │ ├── FieldWithLabel.cs │ │ ├── FieldWithMandatoryValidation.cs │ │ ├── FieldWithPlaceholder.cs │ │ ├── FieldWithValue.cs │ │ ├── HeadingField.cs │ │ ├── IDefaultSelectableField.cs │ │ ├── IEmailField.cs │ │ ├── IFieldWithHelpText.cs │ │ ├── IFieldWithValidation.cs │ │ ├── ImageField.cs │ │ ├── InvisibleReCaptchaField.cs │ │ ├── LinkField.cs │ │ ├── MailChimpSubscriptionField.cs │ │ ├── MemberInfoField.cs │ │ ├── NewsletterSubscriptionField.cs │ │ ├── NumberField.cs │ │ ├── RadioButtonGroupField.cs │ │ ├── ReCaptchaField.cs │ │ ├── SelectBoxField.cs │ │ ├── Statistics │ │ │ ├── FieldExtensions.cs │ │ │ ├── IStatisticsField.cs │ │ │ └── IValueFrequencyStatisticsField.cs │ │ ├── SubmitButtonField.cs │ │ ├── TelephoneField.cs │ │ ├── TextAreaField.cs │ │ ├── TextBoxField.cs │ │ ├── TextParagraphField.cs │ │ ├── UploadField.cs │ │ └── UrlField.cs │ │ ├── FormEditor.csproj │ │ ├── FormModel.cs │ │ ├── FormValueConverter.cs │ │ ├── Integrations │ │ ├── WebService.cs │ │ └── WebServiceConfiguration.cs │ │ ├── Limitations │ │ ├── IMaxSubmissionsForCurrentUserHandler.cs │ │ ├── LimitationsHelper.cs │ │ └── MaxSubmissionsForCurrentUserHandler.cs │ │ ├── Log.cs │ │ ├── NewsletterSubscription │ │ ├── CampaignMonitorApi.cs │ │ └── MailChimpApi.cs │ │ ├── Page.cs │ │ ├── Properties │ │ └── AssemblyInfo.cs │ │ ├── Rendering │ │ ├── ActionData.cs │ │ ├── ConditionData.cs │ │ ├── FieldData.cs │ │ ├── RenderingExtensions.cs │ │ ├── RuleData.cs │ │ └── ValidationData.cs │ │ ├── Row.cs │ │ ├── SerializationHelper.cs │ │ ├── Storage │ │ ├── IApprovalIndex.cs │ │ ├── IAutomationIndex.cs │ │ ├── IFullTextIndex.cs │ │ ├── IIndex.cs │ │ ├── IUpdateIndex.cs │ │ ├── Index.cs │ │ ├── IndexHelper.cs │ │ ├── Result.cs │ │ ├── Row.cs │ │ └── Statistics │ │ │ ├── FieldValueFrequencies.cs │ │ │ ├── FieldValueFrequency.cs │ │ │ ├── FieldValueFrequencyStatistics.cs │ │ │ └── IStatisticsIndex.cs │ │ ├── Umbraco │ │ ├── ApplicationEvents.cs │ │ └── ContentHelper.cs │ │ ├── Validation │ │ ├── Action.cs │ │ ├── Conditions │ │ │ ├── Condition.cs │ │ │ ├── CustomCondition.cs │ │ │ ├── FieldIsEmptyCondition.cs │ │ │ ├── FieldIsNotEmptyCondition.cs │ │ │ ├── FieldValueIsCondition.cs │ │ │ ├── FieldValueIsNotCondition.cs │ │ │ ├── FieldValuesDoNotMatchCondition.cs │ │ │ └── FieldValuesMatchCondition.cs │ │ ├── Rule.cs │ │ └── Validation.cs │ │ ├── app.config │ │ └── packages.config └── Umbraco │ ├── Config │ └── FormEditor.config │ ├── JS │ └── FormEditor │ │ ├── FormEditorAsync.js │ │ └── FormEditorSync.js │ ├── Plugin │ ├── config │ │ ├── emailTemplates.html │ │ ├── fieldTypeGroups.html │ │ ├── rowLayouts.html │ │ ├── tabOrder.html │ │ └── webService.html │ ├── css │ │ └── form.less │ ├── dashboard │ │ └── dashboard.html │ ├── editor │ │ ├── conditions │ │ │ ├── core.customcondition.html │ │ │ ├── core.fieldisempty.html │ │ │ ├── core.fieldisempty.png │ │ │ ├── core.fieldisnotempty.html │ │ │ ├── core.fieldvalueis.html │ │ │ ├── core.fieldvalueis.png │ │ │ ├── core.fieldvalueisnot.html │ │ │ ├── core.fieldvaluesdonotmatch.html │ │ │ ├── core.fieldvaluesdonotmatch.png │ │ │ └── core.fieldvaluesmatch.html │ │ ├── data.html │ │ ├── directives.common.html │ │ ├── directives.field.html │ │ ├── fields │ │ │ ├── core.campaignmonitor.html │ │ │ ├── core.campaignmonitor.png │ │ │ ├── core.checkbox.html │ │ │ ├── core.checkbox.png │ │ │ ├── core.checkboxgroup.html │ │ │ ├── core.checkboxgroup.png │ │ │ ├── core.consent.html │ │ │ ├── core.consent.png │ │ │ ├── core.customfield.html │ │ │ ├── core.customfieldfixedoptions.html │ │ │ ├── core.date.html │ │ │ ├── core.date.png │ │ │ ├── core.dropdown.html │ │ │ ├── core.dropdown.png │ │ │ ├── core.email.html │ │ │ ├── core.email.png │ │ │ ├── core.heading.html │ │ │ ├── core.heading.png │ │ │ ├── core.image.html │ │ │ ├── core.image.png │ │ │ ├── core.invisiblerecaptcha.html │ │ │ ├── core.invisiblerecaptcha.png │ │ │ ├── core.link.html │ │ │ ├── core.link.png │ │ │ ├── core.mailchimp.html │ │ │ ├── core.mailchimp.png │ │ │ ├── core.memberinfo.html │ │ │ ├── core.memberinfo.png │ │ │ ├── core.number.html │ │ │ ├── core.number.png │ │ │ ├── core.radiobuttongroup.html │ │ │ ├── core.radiobuttongroup.png │ │ │ ├── core.recaptcha.html │ │ │ ├── core.recaptcha.png │ │ │ ├── core.selectbox.html │ │ │ ├── core.selectbox.png │ │ │ ├── core.submitbutton.html │ │ │ ├── core.submitbutton.png │ │ │ ├── core.telephone.html │ │ │ ├── core.telephone.png │ │ │ ├── core.textParagraph.html │ │ │ ├── core.textParagraph.png │ │ │ ├── core.textarea.html │ │ │ ├── core.textarea.png │ │ │ ├── core.textbox.html │ │ │ ├── core.textbox.png │ │ │ ├── core.upload.html │ │ │ ├── core.upload.png │ │ │ ├── core.url.html │ │ │ └── core.url.png │ │ ├── form.html │ │ └── rows │ │ │ ├── core.column-1.png │ │ │ ├── core.column-2.png │ │ │ ├── core.column-3.png │ │ │ ├── core.column-4.png │ │ │ ├── core.one-column.png │ │ │ ├── core.three-column-wide-left.png │ │ │ ├── core.three-column-wide-right.png │ │ │ ├── core.three-column.png │ │ │ ├── core.two-column-wide-left.png │ │ │ ├── core.two-column-wide-right.png │ │ │ └── core.two-column.png │ ├── js │ │ ├── controllers │ │ │ ├── config.emailTemplates.js │ │ │ ├── config.fieldTypeGroups.js │ │ │ ├── config.rowLayouts.js │ │ │ ├── config.tabOrder.js │ │ │ ├── config.webService.js │ │ │ ├── dashboard.js │ │ │ ├── editor.data.js │ │ │ ├── editor.field.js │ │ │ ├── editor.form.js │ │ │ └── editor.statistics.js │ │ ├── directives │ │ │ ├── condition.js │ │ │ ├── expandableHeader.js │ │ │ ├── fieldBasics.js │ │ │ ├── fieldErrorMessage.js │ │ │ ├── fieldFooter.js │ │ │ ├── fieldHeader.js │ │ │ ├── fieldLabel.js │ │ │ ├── fieldMandatory.js │ │ │ ├── fieldName.js │ │ │ ├── fieldOptions.js │ │ │ ├── fieldPlaceholder.js │ │ │ ├── localize.js │ │ │ ├── multiSelectValue.js │ │ │ ├── multipleEmails.js │ │ │ └── onEnter.js │ │ ├── langs │ │ │ ├── da-dk.js │ │ │ ├── de-de.js │ │ │ ├── en-gb.js │ │ │ ├── en-us.js │ │ │ ├── es-es.js │ │ │ ├── fr-fr.js │ │ │ ├── he-il.js │ │ │ ├── it-it.js │ │ │ ├── ja-jp.js │ │ │ ├── ko-kr.js │ │ │ ├── nb-no.js │ │ │ ├── nl-nl.js │ │ │ ├── pl-pl.js │ │ │ ├── pt-br.js │ │ │ ├── ru-ru.js │ │ │ ├── sv-se.js │ │ │ └── zh-cn.js │ │ ├── resources │ │ │ ├── propertyEditorFieldValidator.js │ │ │ └── propertyEditorResource.js │ │ └── services │ │ │ └── localizationService.js │ └── package.manifest │ └── Views │ ├── FormEditorAsync.cshtml │ ├── FormEditorNoScript.cshtml │ ├── FormEditorSync.cshtml │ ├── Partials │ └── FormEditor │ │ ├── Async.cshtml │ │ ├── Email │ │ └── EmailTemplateSample.cshtml │ │ ├── FieldsAsync │ │ ├── core.campaignmonitor.cshtml │ │ ├── core.checkbox.cshtml │ │ ├── core.checkboxgroup.cshtml │ │ ├── core.consent.cshtml │ │ ├── core.date.cshtml │ │ ├── core.dropdown.cshtml │ │ ├── core.email.cshtml │ │ ├── core.heading.cshtml │ │ ├── core.image.cshtml │ │ ├── core.invisiblerecaptcha.cshtml │ │ ├── core.link.cshtml │ │ ├── core.mailchimp.cshtml │ │ ├── core.memberinfo.cshtml │ │ ├── core.number.cshtml │ │ ├── core.radiobuttongroup.cshtml │ │ ├── core.recaptcha.cshtml │ │ ├── core.selectbox.cshtml │ │ ├── core.submitbutton.cshtml │ │ ├── core.telephone.cshtml │ │ ├── core.textarea.cshtml │ │ ├── core.textbox.cshtml │ │ ├── core.textparagraph.cshtml │ │ ├── core.upload.cshtml │ │ ├── core.url.cshtml │ │ ├── core.utils.helptext.cshtml │ │ └── core.utils.validationerror.cshtml │ │ ├── FieldsNoScript │ │ ├── core.campaignmonitor.cshtml │ │ ├── core.checkbox.cshtml │ │ ├── core.checkboxgroup.cshtml │ │ ├── core.consent.cshtml │ │ ├── core.date.cshtml │ │ ├── core.dropdown.cshtml │ │ ├── core.email.cshtml │ │ ├── core.heading.cshtml │ │ ├── core.image.cshtml │ │ ├── core.invisiblerecaptcha.cshtml │ │ ├── core.link.cshtml │ │ ├── core.mailchimp.cshtml │ │ ├── core.memberinfo.cshtml │ │ ├── core.number.cshtml │ │ ├── core.radiobuttongroup.cshtml │ │ ├── core.recaptcha.cshtml │ │ ├── core.selectbox.cshtml │ │ ├── core.submitbutton.cshtml │ │ ├── core.telephone.cshtml │ │ ├── core.textarea.cshtml │ │ ├── core.textbox.cshtml │ │ ├── core.textparagraph.cshtml │ │ ├── core.upload.cshtml │ │ ├── core.url.cshtml │ │ ├── core.utils.helptext.cshtml │ │ └── core.utils.validationerror.cshtml │ │ ├── FieldsSync │ │ ├── core.campaignmonitor.cshtml │ │ ├── core.checkbox.cshtml │ │ ├── core.checkboxgroup.cshtml │ │ ├── core.consent.cshtml │ │ ├── core.date.cshtml │ │ ├── core.dropdown.cshtml │ │ ├── core.email.cshtml │ │ ├── core.heading.cshtml │ │ ├── core.image.cshtml │ │ ├── core.invisiblerecaptcha.cshtml │ │ ├── core.link.cshtml │ │ ├── core.mailchimp.cshtml │ │ ├── core.memberinfo.cshtml │ │ ├── core.number.cshtml │ │ ├── core.radiobuttongroup.cshtml │ │ ├── core.recaptcha.cshtml │ │ ├── core.selectbox.cshtml │ │ ├── core.submitbutton.cshtml │ │ ├── core.telephone.cshtml │ │ ├── core.textarea.cshtml │ │ ├── core.textbox.cshtml │ │ ├── core.textparagraph.cshtml │ │ ├── core.upload.cshtml │ │ ├── core.url.cshtml │ │ ├── core.utils.helptext.cshtml │ │ └── core.utils.validationerror.cshtml │ │ ├── NoScript.cshtml │ │ └── Sync.cshtml │ └── Web.config └── Tutorials ├── Comments.md ├── ConditionalField.md ├── DefaultValues.md ├── EmailMarketing.md ├── HelloFormEditor.md ├── LogicApp.md ├── Poll.md ├── QuickStart.md ├── Ratings.md ├── RatingsPartFour.md ├── RatingsPartThree.md ├── RatingsPartTwo.md ├── Receipts.md ├── SelfService.md ├── Zapier.md └── img ├── Comments ├── approve-submissions.png ├── article-content-template-form-layout.png ├── article-content-template-form-receipt.png ├── article-document-type.png ├── article-with-comments.png ├── creating-an-article.png ├── data-type-submission-approval.png ├── data-type-tab-availability.png └── using-the-content-template.png ├── ConditionalField ├── form-action.png ├── form-layout.png ├── form-validation.png └── form.gif ├── DefaultValues └── result.png ├── EmailMarketing ├── 7zip-nuget.png ├── campaign-monitor-settings.png └── campaign-monitor-subscription.png ├── HelloFormEditor ├── contact-form.png ├── doctype.png ├── form-layout.png ├── form-receipt.png ├── form-styled.png └── form-unstyled.png ├── LogicApp ├── blank-logic-app.png ├── configuring-the-action.png ├── configuring-the-datatype.png ├── creating-the-action.png ├── creating-the-form.png ├── creating-the-lead.png ├── creating-the-trigger.png ├── logic-app-variables.png ├── sample-json-payload.png ├── submitting-the-form.png └── trigger-http-post-url.png ├── Poll ├── field-type-group.png ├── grid-editor-with-poll.png ├── poll-layout.png ├── poll-score.png ├── poll.png └── select-poll.png ├── QuickStart ├── form-property.png └── form.png ├── Ratings ├── article.png ├── review-form-property.png └── review-form.png ├── RatingsPartFour └── article-list.png ├── RatingsPartThree ├── review-form-property-statistics.png ├── review-form-property.png └── tab-order-and-availability.png ├── RatingsPartTwo ├── my.rating.advanced.png ├── my.rating.simple.png └── review-form-property.png ├── Receipts ├── add-submission-info.png ├── confirmation-email-settings.png ├── confirmation-email-template.png ├── receipt-email.png ├── receipt-page.png └── select-receipt-page.png ├── SelfService ├── confirmation-email-template.png ├── form-email.png ├── form-layout.png ├── form-rendering.png ├── receipt-email.png └── self-service-rendering.png └── Zapier ├── configure-the-action.png ├── configure-the-datatype.png ├── create-the-form.png ├── create-the-google-sheet.png ├── google-sheet-contact-information.png ├── post-sample-json.png ├── select-the-action-app.png ├── select-the-action.png ├── select-the-sheet.png ├── select-the-trigger-app.png ├── select-the-trigger.png ├── specify-the-child-key.png ├── submit-the-form.png ├── test-the-action.png ├── turn-the-zap-on.png └── webhook-url.png /.gitignore: -------------------------------------------------------------------------------- 1 | syntax: glob 2 | *.bak 3 | *.cmd 4 | *.dll 5 | *.lock 6 | *.orig 7 | *.pdb 8 | *.suo 9 | *.user 10 | *.xml 11 | .hgcheck 12 | _ReSharper* 13 | bin/ 14 | obj/ 15 | **/node_modules/ 16 | Source/Solution/packages/ 17 | Dist/ 18 | Grunt/temp/ 19 | Package/ 20 | Site/ 21 | Samples/**/packages 22 | *.db 23 | .vs/ 24 | -------------------------------------------------------------------------------- /Docs/emails.md: -------------------------------------------------------------------------------- 1 | # Email templates 2 | *Refer to the [setup guide](install.md#email-templates) for instructions on how to configure email templates for Form Editor.* 3 | 4 | An email template is just a regular razor view that renders a `FormModel`. You'll need to place your email templates in the folder */Views/Partials/FormEditor/Email/* - Form Editor ships with a [sample email template](../Source/Umbraco/Views/Partials/FormEditor/Email/EmailTemplateSample.cshtml) to help you get started. 5 | 6 | An email template is rendered in the Umbraco context. This means you'll be able to do all sorts of awesome stuff in your email template, because you have full access to your Umbraco data. In case you need the currently requested content item, Form Editor passes it (as `IPublishedContent`) to your view in `ViewData["currentContent"]`: 7 | 8 | ```xml 9 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 10 | @{ 11 | // the current content item is passed to the view as ViewData["currentContent"] 12 | // - Umbraco.AssignedContentItem doesn't work in this context 13 | var currentContent = ViewData["currentContent"] as IPublishedContent; 14 | } 15 | ``` 16 | 17 | Have a look at the sample email template for inspiration :) 18 | 19 | ## Next step 20 | Onwards to [special form fields](fields.md). 21 | -------------------------------------------------------------------------------- /Docs/extend_condition.md: -------------------------------------------------------------------------------- 1 | # Creating a custom condition 2 | Conditions are used for both actions and cross field validations: 3 | * Actions let the editors set up rules that are evaluated against the field values - e.g. to show/hide a field if another field has a certain value. 4 | * Cross field validations let the editors invalidate the form based on a set of rules that span across multiple fields. 5 | 6 | In both cases, a rule consists of: 7 | * A field. 8 | * A condition to match the field value against. 9 | 10 | You can create custom conditions in one of two ways: 11 | 12 | 1. [The simple way](extend_condition_simple.md) - by configuration. No Visual Studio required. Choose this if you're not a .NET developer, or if you don't need server side support for your condition. 13 | 2. [The advanced way](extend_condition_advanced.md) - by coding. Visual Studio required. Choose this if you need server side support - which is of course strongly recommended if you're going to use your condition for cross field validations. 14 | -------------------------------------------------------------------------------- /Docs/extend_field.md: -------------------------------------------------------------------------------- 1 | # Creating a custom field 2 | You can create custom fields in one of two ways: 3 | 4 | 1. [The simple way](extend_field_simple.md) - by configuration. No coding required. Choose this if you're not a .NET developer, or if you just don't need any custom configuration and validation of your field (mandatory validation is supported out of the box). 5 | 2. [The advanced way](extend_field_advanced.md) - by coding. Choose this if the statement above doesn't suit you :) 6 | 7 | ### Field icon 8 | No matter which of the above you choose, you'll need a field icon. It has to be a 16x16 px PNG and it should be grayscale. 9 | 10 | If you want your field icon to have the same look and feel as the ones shipped with Form Editor, head on over to http://p.yusukekamiyamane.com/, pick an icon from the Fugue Icons set and make it grayscale. 11 | 12 | ### Custom field samples 13 | The [samples section](../Samples/) contains a couple of custom field samples. Check out [creating a simple custom field](extend_field_simple.md) or [creating an advanced custom field](extend_field_advanced.md) for a run-through of these samples. 14 | -------------------------------------------------------------------------------- /Docs/img/condition-editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Docs/img/condition-editor.png -------------------------------------------------------------------------------- /Docs/img/data-types.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Docs/img/data-types.png -------------------------------------------------------------------------------- /Docs/img/form-layout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Docs/img/form-layout.png -------------------------------------------------------------------------------- /Docs/img/global-search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Docs/img/global-search.png -------------------------------------------------------------------------------- /Docs/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Docs/img/logo.png -------------------------------------------------------------------------------- /Docs/img/max-submissions-entry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Docs/img/max-submissions-entry.png -------------------------------------------------------------------------------- /Docs/img/my.length.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Docs/img/my.length.png -------------------------------------------------------------------------------- /Docs/img/row-layouts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Docs/img/row-layouts.png -------------------------------------------------------------------------------- /Docs/img/statistics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Docs/img/statistics.png -------------------------------------------------------------------------------- /Docs/img/submission-consent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Docs/img/submission-consent.png -------------------------------------------------------------------------------- /Docs/img/web-service-integration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Docs/img/web-service-integration.png -------------------------------------------------------------------------------- /Docs/submissions.md: -------------------------------------------------------------------------------- 1 | # Working with the form submissions 2 | Most of the time you'll probably just work with the form submissions in the Umbraco back office. But once in a while you might want to use the form submissions in frontend, and Form Editor offers several options for that. 3 | 4 | ## Listing form submissions 5 | You can get the form submissions if you'd like to list them - [read more](submissions_list.md). 6 | 7 | ## Form submission statistics 8 | You can access statistics for the form submissions if you've enabled it - [read more](submissions_stats.md). 9 | 10 | ## Editing a form submission 11 | You can load a form submission and edit the submitted values - [read more](submissions_edit.md). 12 | -------------------------------------------------------------------------------- /Docs/submissions_edit.md: -------------------------------------------------------------------------------- 1 | # Editing form submissions 2 | If you need to edit form submissions, you can easily do so in frontend, at least if you're using the default partial views to render your form ([read more](render.md)). All you need to do is assign the ID of the form submission to `ViewBag.FormRowId` - it could be something like this: 3 | 4 | ```cs 5 | ViewBag.FormRowId = Request.QueryString["rowId"]; 6 | ``` 7 | 8 | If the ID is valid, the partials will automatically load the currently submitted values for the form submission when displaying the form, and overwrite them when submitting the form. 9 | 10 | ## But... what ID? 11 | Each row returned by `GetSubmittedValues()` ([read more](submissions_list.md)) contains the ID of the form submission in the `Id` property. A very crude listing of IDs could look like this: 12 | 13 | ```xml 14 | @{ 15 | var form = Model.Content.GetPropertyValue("form"); 16 | var formData = form.GetSubmittedValues(); 17 | } 18 | 26 | ``` 27 | 28 | ## Next step 29 | Onwards to [extending Form Editor](extend.md). -------------------------------------------------------------------------------- /Grunt/Assets/Dashboard.config.install.xdt: -------------------------------------------------------------------------------- 1 |  2 | 3 |
4 | 5 | developer 6 | 7 | 8 | 9 | /App_Plugins/FormEditor/dashboard/dashboard.html 10 | 11 | 12 |
13 |
14 | -------------------------------------------------------------------------------- /Grunt/Assets/Dashboard.config.uninstall.xdt: -------------------------------------------------------------------------------- 1 |  2 | 3 |
4 | 5 | -------------------------------------------------------------------------------- /Grunt/Assets/UmbracoPackageManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | <%= name %> 6 | <%= version %> 7 | <%= license %> 8 | <%= url %> 9 | 10 | 0 11 | 0 12 | 0 13 | 14 | 15 | 16 | <%= author %> 17 | <%= authorUrl %> 18 | 19 | <%= readme %> 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
32 | 33 | developer 34 | 35 | 36 | 37 | /App_Plugins/FormEditor/dashboard/dashboard.html 38 | 39 | 40 |
41 |
42 |
43 | <% files.forEach(function(file) { %> 44 | 45 | <%= file.guid %> 46 | <%= file.dir %> 47 | <%= file.name %> 48 | <% }); %> 49 | 50 |
-------------------------------------------------------------------------------- /Grunt/Assets/package.nuspec: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <%= id %> 5 | <%= version %> 6 | <%= title %> 7 | Kenn Jacobsen 8 | Kenn Jacobsen 9 | http://github.com/kjac/FormEditor 10 | 11 | 12 | umbraco form builder editor package plugin 13 | https://raw.githubusercontent.com/kjac/FormEditor/master/Docs/img/logo.png 14 | https://opensource.org/licenses/MIT 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Grunt/UmbracoPackageManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | <%= name %> 6 | <%= version %> 7 | <%= license %> 8 | <%= url %> 9 | 10 | 0 11 | 0 12 | 0 13 | 14 | 15 | 16 | <%= author %> 17 | <%= authorUrl %> 18 | 19 | <%= readme %> 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
32 | 33 | developer 34 | 35 | 36 | 37 | /App_Plugins/FormEditor/dashboard/dashboard.html 38 | 39 | 40 |
41 |
42 |
43 | <% files.forEach(function(file) { %> 44 | 45 | <%= file.guid %> 46 | <%= file.dir %> 47 | <%= file.name %> 48 | <% }); %> 49 | 50 |
-------------------------------------------------------------------------------- /Grunt/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "umbracian-form-grunt", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "Umbracian Form Grunt", 6 | "devDependencies": { 7 | "grunt": "^0.4.5", 8 | "grunt-contrib-clean": "^0.7.0", 9 | "grunt-contrib-concat": "^0.5.1", 10 | "grunt-contrib-copy": "^0.8.0", 11 | "grunt-contrib-less": "^1.0.1", 12 | "grunt-contrib-watch": "^0.6.1", 13 | "grunt-msbuild": "^0.4.4", 14 | "grunt-umbraco-package": "^1.0.0", 15 | "grunt-dotnet-assembly-info": "^1.0.19", 16 | "grunt-nuget": "^0.1.5", 17 | "grunt-template": "^0.2.3" 18 | }, 19 | "meta": { 20 | "version": "1.3.2.1" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Kenn Jacobsen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Samples/Advanced custom field/App_Plugins/FormEditor/editor/fields/my.range.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Samples/Advanced custom field/App_Plugins/FormEditor/editor/fields/my.range.png -------------------------------------------------------------------------------- /Samples/Advanced custom field/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("My.Fields")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("My.Fields")] 13 | [assembly: AssemblyCopyright("Copyright © Kenn Jacobsen 2015")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("2e609250-0c82-472d-aee7-e7218330771c")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Revision and Build Numbers 33 | // by using the '*' as shown below: 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /Samples/Advanced custom field/README.md: -------------------------------------------------------------------------------- 1 | # Advanced custom field sample 2 | Check out the [documentation](../../Docs/extend_field_advanced.md) for details. 3 | -------------------------------------------------------------------------------- /Samples/Advanced custom field/Views/Partials/FormEditor/FieldsAsync/my.range.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsAsync/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsAsync/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Samples/Advanced custom field/Views/Partials/FormEditor/FieldsSync/my.range.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsSync/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsSync/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Samples/Advanced custom field/Views/Web.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Samples/Custom validation condition/App_Plugins/FormEditor/editor/conditions/my.length.html: -------------------------------------------------------------------------------- 1 | 6 |
7 | 10 | 11 | 14 |
-------------------------------------------------------------------------------- /Samples/Custom validation condition/App_Plugins/FormEditor/editor/conditions/my.length.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Samples/Custom validation condition/App_Plugins/FormEditor/editor/conditions/my.length.png -------------------------------------------------------------------------------- /Samples/Custom validation condition/JS/FormEditor/MyLengthConditionAsync.js: -------------------------------------------------------------------------------- 1 | addFormEditorCondition("my.length", function (rule, fieldValue, formData) { 2 | // rule condition is fulfilled if the field value is null or the field value length is less than the value defined for lessThan 3 | return (fieldValue == null || fieldValue.length < rule.condition.lessThan); 4 | }); 5 | -------------------------------------------------------------------------------- /Samples/Custom validation condition/JS/FormEditor/MyLengthConditionSync.js: -------------------------------------------------------------------------------- 1 | addFormEditorCondition("my.length", function (rule, fieldValue, $form) { 2 | // rule condition is fulfilled if the field value is null or the field value length is less than the value defined for lessThan 3 | return (fieldValue == null || fieldValue.length < rule.condition.lessThan); 4 | }); 5 | -------------------------------------------------------------------------------- /Samples/Elastic storage index/Storage/Entry.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace FormEditor.ElasticIndex.Storage 5 | { 6 | // type that holds the form entries 7 | public class Entry 8 | { 9 | public string Id { get; set; } 10 | 11 | public Dictionary FieldValues { get; set; } 12 | 13 | public DateTime CreatedDate { get; set; } 14 | } 15 | } -------------------------------------------------------------------------------- /Samples/Elastic storage index/Storage/File.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.ElasticIndex.Storage 2 | { 3 | // type that holds the files for the form entries 4 | public class File 5 | { 6 | public string Id { get; set; } 7 | 8 | public string Filename { get; set; } 9 | 10 | public byte[] Bytes { get; set; } 11 | 12 | public string EntryId { get; set; } 13 | } 14 | } -------------------------------------------------------------------------------- /Samples/Event handling/ApplicationEvents.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using FormEditor; 4 | using FormEditor.Events; 5 | using Umbraco.Core; 6 | 7 | namespace My.Events 8 | { 9 | public class ApplicationEvents : ApplicationEventHandler 10 | { 11 | protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) 12 | { 13 | FormModel.BeforeAddToIndex += FormModelOnBeforeAddToIndex; 14 | FormModel.AfterAddToIndex += FormModelOnAfterAddToIndex; 15 | } 16 | 17 | private void FormModelOnBeforeAddToIndex(FormModel sender, FormEditorCancelEventArgs formEditorCancelEventArgs) 18 | { 19 | if(sender.AllValueFields().Any(f => f.HasSubmittedValue && f.SubmittedValue.Equals("bad", StringComparison.InvariantCultureIgnoreCase))) 20 | { 21 | formEditorCancelEventArgs.Cancel = true; 22 | // you can supply multiple error messages by using the FormEditorCancelEventArgs.ErrorMessages array, 23 | // or if you only have one message message, you can simply use the FormEditorCancelEventArgs.ErrorMessage property 24 | //formEditorCancelEventArgs.ErrorMessage ="Bad values are not accepted."; 25 | formEditorCancelEventArgs.ErrorMessages = new[] {"Bad values are not accepted.", "Even worse ones aren't either."}; 26 | } 27 | } 28 | 29 | private void FormModelOnAfterAddToIndex(FormModel sender, FormEditorEventArgs formEditorEventArgs) 30 | { 31 | Log.Info("Something was added to the index."); 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /Samples/SQL storage index/ApplicationEvents.cs: -------------------------------------------------------------------------------- 1 | using FormEditor.SqlIndex.Storage; 2 | using Umbraco.Core; 3 | using Umbraco.Core.Persistence; 4 | 5 | namespace FormEditor.SqlIndex 6 | { 7 | public class ApplicationEvents : ApplicationEventHandler 8 | { 9 | protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) 10 | { 11 | // automatically create the tables for the index on app start 12 | Index.EnsureDatabase(applicationContext); 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /Samples/SQL storage index/README.md: -------------------------------------------------------------------------------- 1 | # SQL based custom storage index sample 2 | Check out the [documentation](../../Docs/storage.md) for details. 3 | -------------------------------------------------------------------------------- /Samples/SQL storage index/Storage/Entry.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Umbraco.Core.Persistence; 3 | using Umbraco.Core.Persistence.DatabaseAnnotations; 4 | 5 | namespace FormEditor.SqlIndex.Storage 6 | { 7 | // table that holds the form entries 8 | [TableName("FormEditorEntries")] 9 | [PrimaryKey("Id", autoIncrement = true)] 10 | public class Entry 11 | { 12 | [PrimaryKeyColumn] 13 | public int Id { get; set; } 14 | 15 | public Guid EntryId { get; set; } 16 | 17 | public int ContentId { get; set; } 18 | 19 | [Length(4000)] 20 | public string FieldValues { get; set; } 21 | 22 | public DateTime CreatedDate { get; set; } 23 | 24 | public int Approval { get; set; } 25 | } 26 | } -------------------------------------------------------------------------------- /Samples/SQL storage index/Storage/File.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Umbraco.Core.Persistence; 3 | using Umbraco.Core.Persistence.DatabaseAnnotations; 4 | 5 | namespace FormEditor.SqlIndex.Storage 6 | { 7 | // table that holds the files for the form entries 8 | [TableName("FormEditorFiles")] 9 | [PrimaryKey("Id", autoIncrement = true)] 10 | public class File 11 | { 12 | [PrimaryKeyColumn] 13 | public int Id { get; set; } 14 | 15 | public int ContentId { get; set; } 16 | 17 | public Guid EntryId { get; set; } 18 | 19 | public string Filename { get; set; } 20 | 21 | public byte[] Bytes { get; set; } 22 | } 23 | } -------------------------------------------------------------------------------- /Samples/Simple custom field/App_Plugins/FormEditor/editor/fields/my.range.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Samples/Simple custom field/App_Plugins/FormEditor/editor/fields/my.range.png -------------------------------------------------------------------------------- /Samples/Simple custom field/README.md: -------------------------------------------------------------------------------- 1 | # Simple custom field sample 2 | Check out the [documentation](../../Docs/extend_field_simple.md) for details. 3 | -------------------------------------------------------------------------------- /Samples/Simple custom field/Views/Partials/FormEditor/FieldsAsync/my.range.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsAsync/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsAsync/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Samples/Simple custom field/Views/Partials/FormEditor/FieldsSync/my.range.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsSync/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsSync/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/AntiForgeryHelper.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Helpers; 2 | 3 | namespace FormEditor 4 | { 5 | internal static class AntiForgeryHelper 6 | { 7 | public static void ValidateAntiForgery(string tokenValue) 8 | { 9 | var cookieToken = ""; 10 | var formToken = ""; 11 | if(string.IsNullOrEmpty(tokenValue) == false) 12 | { 13 | var tokens = tokenValue.Split(':'); 14 | if(tokens.Length == 2) 15 | { 16 | cookieToken = tokens[0].Trim(); 17 | formToken = tokens[1].Trim(); 18 | } 19 | } 20 | AntiForgery.Validate(cookieToken, formToken); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/ApprovalState.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor 2 | { 3 | /// 4 | /// This enum denotes the various states of approval a form submission can take. 5 | /// 6 | public enum ApprovalState 7 | { 8 | Undecided, 9 | Approved, 10 | Any 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Cell.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using FormEditor.Fields; 3 | 4 | namespace FormEditor 5 | { 6 | public class Cell 7 | { 8 | public string Alias { get; set; } 9 | 10 | public IEnumerable Fields { get; set; } 11 | } 12 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Data/Field.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Data 2 | { 3 | public class Field 4 | { 5 | public string Name { get; set; } 6 | 7 | public string FormSafeName { get; set; } 8 | 9 | public string Type { get; set; } 10 | 11 | public string Value { get; set; } 12 | } 13 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Data/FormData.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace FormEditor.Data 4 | { 5 | public class FormData 6 | { 7 | public int TotalRows { get; set; } 8 | 9 | public IEnumerable Rows { get; set; } 10 | 11 | public string SortField { get; set; } 12 | 13 | public bool SortDescending { get; set; } 14 | 15 | public IEnumerable Fields { get; set; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Data/Row.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace FormEditor.Data 5 | { 6 | public class Row 7 | { 8 | public Guid Id { get; set; } 9 | 10 | public DateTime CreatedDate { get; set; } 11 | 12 | public ApprovalState ApprovalState { get; set; } 13 | 14 | public IEnumerable Fields { get; set; } 15 | } 16 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Events/FormEditorCancelEventArgs.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | using System.Linq; 3 | using Umbraco.Core.Models; 4 | 5 | namespace FormEditor.Events 6 | { 7 | public class FormEditorCancelEventArgs : CancelEventArgs 8 | { 9 | public FormEditorCancelEventArgs(IPublishedContent content) 10 | { 11 | Content = content; 12 | } 13 | 14 | // if Cancel is set to true, use this property to describe the error to the user - or use the ErrorMessages property if you have multiple errors 15 | public string ErrorMessage 16 | { 17 | // #162: the getter is kept solely for backwards compatibility 18 | get => ErrorMessages?.FirstOrDefault(); 19 | set => ErrorMessages = new[] {value}; 20 | } 21 | 22 | public string[] ErrorMessages { get; set; } 23 | 24 | // the content that contains the form 25 | public IPublishedContent Content { get; } 26 | } 27 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Events/FormEditorCancelEventHandler.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Events 2 | { 3 | public delegate void FormEditorCancelEventHandler(FormModel sender, FormEditorCancelEventArgs e); 4 | } 5 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Events/FormEditorEventArgs.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Umbraco.Core.Models; 3 | 4 | namespace FormEditor.Events 5 | { 6 | public class FormEditorEventArgs : EventArgs 7 | { 8 | public FormEditorEventArgs(Guid rowId, IPublishedContent content) 9 | { 10 | RowId = rowId; 11 | Content = content; 12 | } 13 | 14 | // the ID of the persisted data in the storage index 15 | public Guid RowId { get; } 16 | 17 | // the content that contains the form 18 | public IPublishedContent Content { get; } 19 | } 20 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Events/FormEditorEventHandler.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Events 2 | { 3 | public delegate void FormEditorEventHandler(FormModel sender, FormEditorEventArgs e); 4 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Events/FormEditorMailCancelEventArgs.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | using System.Net.Mail; 3 | 4 | namespace FormEditor.Events 5 | { 6 | public class FormEditorMailCancelEventArgs : CancelEventArgs 7 | { 8 | public FormEditorMailCancelEventArgs(MailMessage mailMessage, string emailType) 9 | { 10 | MailMessage = mailMessage; 11 | EmailType = emailType; 12 | } 13 | 14 | // the mail that's being sent 15 | public MailMessage MailMessage { get; } 16 | 17 | // the type of mail - "confirmation" or "notification" 18 | public string EmailType { get; } 19 | } 20 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Events/FormEditorMailCancelEventHandler.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Events 2 | { 3 | public delegate void FormEditorMailCancelEventHandler(FormModel sender, FormEditorMailCancelEventArgs e); 4 | } 5 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/CampaignMonitorSubscriptionField.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Net.Mail; 5 | using FormEditor.NewsletterSubscription; 6 | using Umbraco.Core.Models; 7 | 8 | namespace FormEditor.Fields 9 | { 10 | public class CampaignMonitorSubscriptionField : NewsletterSubscriptionField 11 | { 12 | public string NameField { get; set; } 13 | 14 | public override string Type => "core.campaignmonitor"; 15 | 16 | protected override string ApiKeyAppSettingsKey => "FormEditor.CampaignMonitor.ApiKey"; 17 | 18 | protected override string ListIdAppSettingsKey => "FormEditor.CampaignMonitor.ListId"; 19 | 20 | protected override string ServiceName => "Campaign Monitor"; 21 | 22 | protected override void HandleSubscription(MailAddress mailAddress, IEnumerable allCollectedValues, IPublishedContent content) 23 | { 24 | var valueFields = allCollectedValues.OfType().ToArray(); 25 | var nameField = valueFields.FirstOrDefault(f => f.Name.Equals(NameField, StringComparison.OrdinalIgnoreCase)); 26 | 27 | var customFields = valueFields 28 | .Except(new[] {this, nameField}.Where(f => f != null)) 29 | .ToDictionary(f => f.Name, f => f.SubmittedValue); 30 | 31 | var api = new CampaignMonitorApi(); 32 | api.Subscribe(ListId, mailAddress, nameField?.SubmittedValue, customFields, ApiKey); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/CheckboxField.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using Umbraco.Core.Models; 4 | 5 | namespace FormEditor.Fields 6 | { 7 | public class CheckboxField : FieldWithMandatoryValidation, IDefaultSelectableField 8 | { 9 | public override string PrettyName => "Checkbox"; 10 | 11 | public override string Type => "core.checkbox"; 12 | 13 | // Yes... this should be called Checked, but it's called Selected to be consistent with 14 | // FieldValue.Selected (which is used in CheckboxGroupField) 15 | public bool Selected { get; set; } 16 | 17 | protected internal override string FormatValueForDataView(string value, IContent content, Guid rowId) 18 | { 19 | return $@""; 20 | } 21 | 22 | public override string SubmittedValueForEmail() 23 | { 24 | return Selected ? "☑" : "☐"; 25 | } 26 | 27 | protected internal override bool ValidateSubmittedValue(IEnumerable allCollectedValues, IPublishedContent content) 28 | { 29 | var valid = base.ValidateSubmittedValue(allCollectedValues, content); 30 | 31 | Selected = string.IsNullOrEmpty(SubmittedValue) == false; 32 | 33 | return valid; 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/CheckboxGroupField.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Fields 2 | { 3 | public class CheckboxGroupField : FieldWithFieldValues 4 | { 5 | public CheckboxGroupField() 6 | { 7 | // default values 8 | FieldValues = new[] { new FieldValue { Value = "Option 1", Selected = true }, new FieldValue { Value = "Option 2" } }; 9 | } 10 | public override string PrettyName => "Checkbox group"; 11 | 12 | public override string Type => "core.checkboxgroup"; 13 | 14 | public override bool IsMultiSelectEnabled => true; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/CustomField.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Fields 2 | { 3 | public class CustomField : FieldWithMandatoryValidation 4 | { 5 | public CustomField(string type, string prettyName) 6 | { 7 | Type = type; 8 | PrettyName = prettyName; 9 | } 10 | 11 | public override string Type { get; } 12 | 13 | public override string PrettyName { get; } 14 | 15 | public override string View => @"core.customfield.html"; 16 | } 17 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/CustomFieldFixedValues.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Fields 2 | { 3 | public class CustomFieldFixedValues : FieldWithFieldValues 4 | { 5 | public CustomFieldFixedValues(string type, string prettyName) 6 | { 7 | Type = type; 8 | PrettyName = prettyName; 9 | 10 | // default values 11 | FieldValues = new FieldValue[] {}; 12 | } 13 | 14 | public override string Type { get; } 15 | 16 | public override string PrettyName { get; } 17 | 18 | public override string View => @"core.customfieldfixedoptions.html"; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/DropdownField.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Fields 2 | { 3 | public class DropdownField : FieldWithFieldValues 4 | { 5 | public DropdownField() 6 | { 7 | // default values 8 | FieldValues = new[] { new FieldValue { Value = "Value 1" }, new FieldValue { Value = "Value 2" } }; 9 | DefaultText = "Select..."; 10 | } 11 | public override string PrettyName => "Select box (drop-down)"; 12 | 13 | public override string Type => "core.dropdown"; 14 | public string DefaultText { get; set; } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/EmailField.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Net.Mail; 3 | using Umbraco.Core.Models; 4 | 5 | namespace FormEditor.Fields 6 | { 7 | public class EmailField : FieldWithPlaceholder 8 | { 9 | public override string PrettyName => "Email address"; 10 | 11 | public override string Type => "core.email"; 12 | 13 | public bool Multiple { get; set; } 14 | 15 | protected internal override bool ValidateSubmittedValue(IEnumerable allCollectedValues, IPublishedContent content) 16 | { 17 | if (base.ValidateSubmittedValue(allCollectedValues, content) == false) 18 | { 19 | return false; 20 | } 21 | if (string.IsNullOrEmpty(SubmittedValue)) 22 | { 23 | return true; 24 | } 25 | var emails = Multiple ? SubmittedValue.Split(',') : new[] { SubmittedValue }; 26 | foreach (var email in emails) 27 | { 28 | try 29 | { 30 | var address = new MailAddress(email); 31 | } 32 | catch 33 | { 34 | return false; 35 | } 36 | } 37 | return true; 38 | } 39 | 40 | public IEnumerable GetSubmittedMailAddresses() 41 | { 42 | var mailAddresses = new List(); 43 | foreach(var email in SubmittedValue.Split(',')) 44 | { 45 | try 46 | { 47 | mailAddresses.Add(new MailAddress(email)); 48 | } 49 | catch 50 | { 51 | // silently fail for invalid email addresses 52 | } 53 | } 54 | return mailAddresses; 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/Field.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using Newtonsoft.Json; 3 | using Umbraco.Core.Models; 4 | 5 | namespace FormEditor.Fields 6 | { 7 | public abstract class Field 8 | { 9 | public abstract string Type { get; } 10 | 11 | // this is the default name for the field - used if no localized name is found 12 | public abstract string PrettyName { get; } 13 | 14 | [JsonIgnore] 15 | public virtual bool Invalid { get; set; } 16 | 17 | [JsonIgnore] 18 | public virtual bool CanBeAddedToForm => true; 19 | 20 | public virtual string View => $"{Type.ToLowerInvariant()}.html"; 21 | 22 | public virtual string Icon => $"{Type.ToLowerInvariant()}.png"; 23 | 24 | protected internal virtual bool ValidateSubmittedValue(IEnumerable allCollectedValues, IPublishedContent content) 25 | { 26 | return true; 27 | } 28 | 29 | protected internal virtual void CollectSubmittedValue(Dictionary allSubmittedValues, IPublishedContent content) 30 | { 31 | } 32 | 33 | // this is called after a form submission has successfully been added to the index 34 | protected internal virtual void AfterAddToIndex(IEnumerable allCollectedValues, IPublishedContent content) 35 | { 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/FieldValue.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Fields 2 | { 3 | public class FieldValue 4 | { 5 | public string Value { get; set; } 6 | 7 | public bool Selected { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/FieldWithLabel.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Fields 2 | { 3 | public abstract class FieldWithLabel : FieldWithValue, IFieldWithHelpText 4 | { 5 | public string Label { get; set; } 6 | 7 | public string HelpText { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/FieldWithMandatoryValidation.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using Umbraco.Core.Models; 3 | 4 | namespace FormEditor.Fields 5 | { 6 | public abstract class FieldWithMandatoryValidation : FieldWithLabel, IFieldWithValidation 7 | { 8 | public bool Mandatory { get; set; } 9 | 10 | public string ErrorMessage { get; set; } 11 | 12 | protected internal override bool ValidateSubmittedValue(IEnumerable allCollectedValues, IPublishedContent content) 13 | { 14 | if (base.ValidateSubmittedValue(allCollectedValues, content) == false) 15 | { 16 | return false; 17 | } 18 | return Mandatory == false || string.IsNullOrWhiteSpace(SubmittedValue) == false; 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/FieldWithPlaceholder.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Fields 2 | { 3 | public abstract class FieldWithPlaceholder : FieldWithMandatoryValidation 4 | { 5 | public string Placeholder { get; set; } 6 | } 7 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/HeadingField.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Fields 2 | { 3 | public class HeadingField : Field 4 | { 5 | public override string Type => "core.heading"; 6 | 7 | public override string PrettyName => "Heading"; 8 | 9 | public string Text { get; set; } 10 | } 11 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/IDefaultSelectableField.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Fields 2 | { 3 | public interface IDefaultSelectableField 4 | { 5 | bool Selected { get; } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/IEmailField.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace FormEditor.Fields 4 | { 5 | public interface IEmailField 6 | { 7 | IEnumerable EmailAddresses { get; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/IFieldWithHelpText.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Fields 2 | { 3 | public interface IFieldWithHelpText 4 | { 5 | string HelpText { get; } 6 | } 7 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/IFieldWithValidation.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Fields 2 | { 3 | public interface IFieldWithValidation 4 | { 5 | bool Invalid { get; } 6 | 7 | string ErrorMessage { get; } 8 | 9 | string Name { get; } 10 | 11 | string FormSafeName { get; } 12 | } 13 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/ImageField.cs: -------------------------------------------------------------------------------- 1 | using Umbraco.Core.Models; 2 | using Umbraco.Web; 3 | 4 | namespace FormEditor.Fields 5 | { 6 | public class ImageField : Field 7 | { 8 | public override string Type => "core.image"; 9 | 10 | public override string PrettyName => "Image"; 11 | 12 | public string Text { get; set; } 13 | 14 | public int MediaId { get; set; } 15 | 16 | public IPublishedContent Media 17 | { 18 | get 19 | { 20 | if (MediaId <= 0) 21 | { 22 | return null; 23 | } 24 | return UmbracoContext.Current.MediaCache.GetById(MediaId); 25 | } 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/InvisibleReCaptchaField.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Fields 2 | { 3 | public class InvisibleReCaptchaField : ReCaptchaField 4 | { 5 | public override string PrettyName => "Submit button (with spam protection)"; 6 | 7 | public override string Type => "core.invisiblerecaptcha"; 8 | 9 | public override string Name => "Submit button"; 10 | 11 | public override string FormSafeName => "invisible_reCAPTCHA"; 12 | 13 | public string Text { get; set; } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/LinkField.cs: -------------------------------------------------------------------------------- 1 | using Umbraco.Core.Models; 2 | using Umbraco.Web; 3 | 4 | namespace FormEditor.Fields 5 | { 6 | public class LinkField : Field 7 | { 8 | // local cache for multiple in-request access to the Page propery 9 | private IPublishedContent _page; 10 | 11 | public override string Type => "core.link"; 12 | 13 | public override string PrettyName => "Link"; 14 | 15 | public string Text { get; set; } 16 | 17 | public int PageId { get; set; } 18 | 19 | public bool OpenInNewWindow { get; set; } 20 | 21 | public IPublishedContent Page 22 | { 23 | get 24 | { 25 | if(PageId <= 0) 26 | { 27 | return null; 28 | } 29 | if (_page != null) 30 | { 31 | return _page; 32 | } 33 | _page = UmbracoContext.Current.ContentCache.GetById(PageId); 34 | return _page; 35 | } 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/MailChimpSubscriptionField.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using System.Net.Mail; 4 | using FormEditor.NewsletterSubscription; 5 | using Umbraco.Core.Models; 6 | 7 | namespace FormEditor.Fields 8 | { 9 | public class MailChimpSubscriptionField : NewsletterSubscriptionField 10 | { 11 | public override string Type => "core.mailchimp"; 12 | 13 | protected override string ApiKeyAppSettingsKey => "FormEditor.MailChimp.ApiKey"; 14 | 15 | protected override string ListIdAppSettingsKey => "FormEditor.MailChimp.ListId"; 16 | 17 | protected override string ServiceName => "MailChimp"; 18 | 19 | protected override void HandleSubscription(MailAddress mailAddress, IEnumerable allCollectedValues, IPublishedContent content) 20 | { 21 | var valueFields = allCollectedValues.OfType().ToArray(); 22 | var mergeFields = valueFields 23 | .Except(new[] { this }) 24 | .ToDictionary(f => f.Name, f => f.SubmittedValue); 25 | 26 | var api = new MailChimpApi(); 27 | api.Subscribe(ListId, mailAddress, mergeFields, ApiKey); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/NumberField.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using Umbraco.Core.Models; 3 | 4 | namespace FormEditor.Fields 5 | { 6 | public class NumberField : FieldWithPlaceholder 7 | { 8 | public NumberField() 9 | { 10 | // default values 11 | Min = 0; 12 | Max = 100; 13 | } 14 | public override string PrettyName => "Number"; 15 | 16 | public override string Type => "core.number"; 17 | 18 | public int Min { get; set; } 19 | 20 | public int Max { get; set; } 21 | 22 | protected internal override bool ValidateSubmittedValue(IEnumerable allCollectedValues, IPublishedContent content) 23 | { 24 | if (base.ValidateSubmittedValue(allCollectedValues, content) == false) 25 | { 26 | return false; 27 | } 28 | if (string.IsNullOrEmpty(SubmittedValue)) 29 | { 30 | return true; 31 | } 32 | if (int.TryParse(SubmittedValue, out var toValidate) == false) 33 | { 34 | return false; 35 | } 36 | return toValidate >= Min && toValidate <= Max; 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/RadioButtonGroupField.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Fields 2 | { 3 | public class RadioButtonGroupField : FieldWithFieldValues 4 | { 5 | public RadioButtonGroupField() 6 | { 7 | // default values 8 | FieldValues = new[] { new FieldValue { Value = "Option 1", Selected = true }, new FieldValue { Value = "Option 2" } }; 9 | } 10 | public override string PrettyName => "Radio button group"; 11 | 12 | public override string Type => "core.radiobuttongroup"; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/SelectBoxField.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Fields 2 | { 3 | public class SelectBoxField : FieldWithFieldValues 4 | { 5 | public SelectBoxField() 6 | { 7 | // default values 8 | FieldValues = new[] { new FieldValue { Value = "Value 1" }, new FieldValue { Value = "Value 2" } }; 9 | MultiSelect = true; 10 | } 11 | 12 | public override string PrettyName => "Select box (multiple)"; 13 | 14 | public override string Type => "core.selectbox"; 15 | 16 | public bool MultiSelect { get; set; } 17 | 18 | public override bool IsMultiSelectEnabled => MultiSelect; 19 | 20 | public int? Size { get; set; } 21 | 22 | // force the statistics graphs to view this field type as multivalue, as it might 23 | // have been at one time or another (it can be toggled on and off at will) 24 | public override bool MultipleValuesPerEntry => true; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/Statistics/FieldExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | 4 | namespace FormEditor.Fields.Statistics 5 | { 6 | public static class FieldExtensions 7 | { 8 | public static IEnumerable StatisticsFields(this IEnumerable fields) 9 | { 10 | return fields?.OfType().ToArray() ?? new IStatisticsField[] {}; 11 | } 12 | 13 | public static IEnumerable StatisticsFieldNames(this IEnumerable fields) 14 | { 15 | return fields?.Select(f => f.FormSafeName).ToArray() ?? new string[] {}; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/Statistics/IStatisticsField.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace FormEditor.Fields.Statistics 4 | { 5 | /// 6 | /// This is the base interface for a Form Editor field that supports statistics 7 | /// 8 | /// 9 | /// Expect this interface to change over time as the demand for statistics grow 10 | /// 11 | public interface IStatisticsField 12 | { 13 | /// 14 | /// The individual submitted values that should be put into the index for this field 15 | /// 16 | IEnumerable SubmittedValues { get; } 17 | 18 | /// 19 | /// The field form safe name (should be inherited from FieldWithValue)u 20 | /// 21 | string FormSafeName { get; } 22 | 23 | /// 24 | /// The field name (should be inherited from FieldWithValue) 25 | /// 26 | string Name { get; set; } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/Statistics/IValueFrequencyStatisticsField.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Fields.Statistics 2 | { 3 | /// 4 | /// This interface describes a Form Editor field that supports field value statistics 5 | /// 6 | /// 7 | /// Expect this interface to change over time as the demand for statistics grow 8 | /// 9 | public interface IValueFrequencyStatisticsField : IStatisticsField 10 | { 11 | /// 12 | /// Whether or not field type can contain multiple values per entry 13 | /// 14 | bool MultipleValuesPerEntry { get; } 15 | } 16 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/SubmitButtonField.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Fields 2 | { 3 | public class SubmitButtonField : Field 4 | { 5 | public override string Type => "core.submitbutton"; 6 | 7 | public override string PrettyName => "Submit button"; 8 | 9 | public string Text { get; set; } 10 | } 11 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/TelephoneField.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Fields 2 | { 3 | public class TelephoneField : FieldWithPlaceholder 4 | { 5 | public override string PrettyName => "Phone"; 6 | 7 | public override string Type => "core.telephone"; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/TextAreaField.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using Umbraco.Core.Models; 4 | 5 | namespace FormEditor.Fields 6 | { 7 | public class TextAreaField : FieldWithPlaceholder 8 | { 9 | public override string PrettyName => "Text area"; 10 | 11 | public override string Type => "core.textarea"; 12 | 13 | public int MaxLength { get; set; } 14 | 15 | protected internal override string FormatValueForDataView(string value, IContent content, Guid rowId) 16 | { 17 | return ReplaceNewLines(value); 18 | } 19 | 20 | public override string SubmittedValueForEmail() 21 | { 22 | return ReplaceNewLines(SubmittedValue); 23 | } 24 | 25 | protected internal override bool ValidateSubmittedValue(IEnumerable allCollectedValues, IPublishedContent content) 26 | { 27 | if (base.ValidateSubmittedValue(allCollectedValues, content) == false) 28 | { 29 | return false; 30 | } 31 | if (MaxLength <= 0) 32 | { 33 | return true; 34 | } 35 | return string.IsNullOrEmpty(SubmittedValue) || SubmittedValue.Length <= MaxLength; 36 | } 37 | 38 | private static string ReplaceNewLines(string value) 39 | { 40 | // replace newlines with
tags for multiline text 41 | return string.IsNullOrEmpty(value) 42 | ? value 43 | : value.Replace(Environment.NewLine, "
"); 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/TextBoxField.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using Umbraco.Core.Models; 3 | 4 | namespace FormEditor.Fields 5 | { 6 | public class TextBoxField : FieldWithPlaceholder 7 | { 8 | public override string PrettyName => "Text box"; 9 | 10 | public override string Type => "core.textbox"; 11 | 12 | public int MaxLength { get; set; } 13 | 14 | protected internal override bool ValidateSubmittedValue(IEnumerable allCollectedValues, IPublishedContent content) 15 | { 16 | if (base.ValidateSubmittedValue(allCollectedValues, content) == false) 17 | { 18 | return false; 19 | } 20 | if (MaxLength <= 0) 21 | { 22 | return true; 23 | } 24 | return string.IsNullOrEmpty(SubmittedValue) || SubmittedValue.Length <= MaxLength; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/TextParagraphField.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Fields 2 | { 3 | public class TextParagraphField : Field 4 | { 5 | public override string Type => "core.textParagraph"; 6 | 7 | public override string PrettyName => "Text paragraph"; 8 | 9 | public string Text { get; set; } 10 | } 11 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Fields/UrlField.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using Umbraco.Core.Models; 4 | 5 | namespace FormEditor.Fields 6 | { 7 | public class UrlField : FieldWithPlaceholder 8 | { 9 | public override string PrettyName => "Web address"; 10 | 11 | public override string Type => "core.url"; 12 | 13 | protected internal override string FormatValueForDataView(string value, IContent content, Guid rowId) 14 | { 15 | return FormatLink(value); 16 | } 17 | 18 | protected internal override bool ValidateSubmittedValue(IEnumerable allCollectedValues, IPublishedContent content) 19 | { 20 | if (base.ValidateSubmittedValue(allCollectedValues, content) == false) 21 | { 22 | return false; 23 | } 24 | if (string.IsNullOrEmpty(SubmittedValue)) 25 | { 26 | return true; 27 | } 28 | try 29 | { 30 | var uri = new Uri(SubmittedValue, UriKind.Absolute); 31 | return true; 32 | } 33 | catch 34 | { 35 | return false; 36 | } 37 | } 38 | 39 | private static string FormatLink(string value) 40 | { 41 | return string.IsNullOrEmpty(value) 42 | ? value 43 | : $@"{value}"; 44 | } 45 | 46 | public override string SubmittedValueForEmail() 47 | { 48 | return FormatLink(SubmittedValue); 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/FormValueConverter.cs: -------------------------------------------------------------------------------- 1 | using Umbraco.Core.Models.PublishedContent; 2 | using Umbraco.Core.PropertyEditors; 3 | 4 | namespace FormEditor 5 | { 6 | [PropertyValueType(typeof(FormModel))] 7 | [PropertyValueCache(PropertyCacheValue.All, PropertyCacheLevel.Content)] 8 | public class FormValueConverter : PropertyValueConverterBase 9 | { 10 | public override bool IsConverter(PublishedPropertyType propertyType) 11 | { 12 | return propertyType.PropertyEditorAlias.Equals(FormModel.PropertyEditorAlias); 13 | } 14 | 15 | public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) 16 | { 17 | if (string.IsNullOrWhiteSpace(source?.ToString())) 18 | { 19 | return new FormModel(); 20 | } 21 | 22 | var model = SerializationHelper.DeserializeFormModel(source.ToString()); 23 | return model; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Integrations/WebServiceConfiguration.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FormEditor.Integrations 4 | { 5 | public class WebServiceConfiguration 6 | { 7 | public Uri Url { get; set; } 8 | 9 | public string UserName { get; set; } 10 | 11 | public string Password { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Limitations/IMaxSubmissionsForCurrentUserHandler.cs: -------------------------------------------------------------------------------- 1 | using Umbraco.Core.Models; 2 | 3 | namespace FormEditor.Limitations 4 | { 5 | /// 6 | /// This interface describes the Form Editor handling for maximum submissions for the currently active user 7 | /// 8 | public interface IMaxSubmissionsForCurrentUserHandler 9 | { 10 | /// 11 | /// Whether or not the current user can submit a form 12 | /// 13 | /// The form 14 | /// The content that contains the form 15 | /// True if the current user can submit the form, false otherwise 16 | bool CanSubmit(FormModel model, IPublishedContent content); 17 | 18 | /// 19 | /// Performs any handling after the current user has submitted the form - e.g. register the user as having submitted the form 20 | /// 21 | /// The form 22 | /// The content that contains the form 23 | void HandleSubmission(FormModel model, IPublishedContent content); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Limitations/LimitationsHelper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Configuration; 3 | 4 | namespace FormEditor.Limitations 5 | { 6 | public class LimitationsHelper 7 | { 8 | public static IMaxSubmissionsForCurrentUserHandler GetMaxSubmissionsForCurrentUserHandler() 9 | { 10 | if(Configuration.Instance.MaxSubmissionsForCurrentUserHandlerType != null) 11 | { 12 | try 13 | { 14 | if(!(Activator.CreateInstance(Configuration.Instance.MaxSubmissionsForCurrentUserHandlerType) is IMaxSubmissionsForCurrentUserHandler handler)) 15 | { 16 | throw new ConfigurationErrorsException($"Activator was unable to instantiate the custom MaxSubmissionsForCurrentUserHandler type \"{Configuration.Instance.MaxSubmissionsForCurrentUserHandlerType.AssemblyQualifiedName}\""); 17 | } 18 | return handler; 19 | } 20 | catch(Exception ex) 21 | { 22 | Log.Error(ex, "Could not create an instance of the custom MaxSubmissionsForCurrentUserHandler type"); 23 | } 24 | } 25 | // revert to default handler 26 | return new MaxSubmissionsForCurrentUserHandler(); 27 | } 28 | 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Log.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Umbraco.Core.Logging; 3 | using Umbraco.Web; 4 | 5 | namespace FormEditor 6 | { 7 | public static class Log 8 | { 9 | public static void Info(string message, params object[] args) 10 | { 11 | LogHelper.Info(LogMessageWithRequestedContentId(message, args)); 12 | } 13 | 14 | public static void Warning(string message, params object[] args) 15 | { 16 | LogHelper.Warn(LogMessageWithRequestedContentId(message, args)); 17 | } 18 | 19 | public static void Error(Exception ex, string message, params object[] args) 20 | { 21 | LogHelper.Error(LogMessageWithRequestedContentId(message, args), ex); 22 | } 23 | 24 | private static string LogMessageWithRequestedContentId(string message, params object[] args) 25 | { 26 | var id = UmbracoContext.Current != null && UmbracoContext.Current.PublishedContentRequest != null 27 | ? UmbracoContext.Current.PublishedContentRequest.PublishedContent.Id.ToString() 28 | : "n/a"; 29 | return $"{(args == null || args.Length == 0 ? message : string.Format(message, args))} (requested content ID: {id})"; 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Page.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using FormEditor.Fields; 4 | 5 | namespace FormEditor 6 | { 7 | public class Page 8 | { 9 | public IEnumerable Rows { get; set; } 10 | 11 | public IEnumerable AllFields() 12 | { 13 | return Rows.SelectMany(r => r.Cells.SelectMany(c => c.Fields)); 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Rendering/ActionData.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace FormEditor.Rendering 4 | { 5 | public class ActionData 6 | { 7 | public List Rules { get; set; } 8 | 9 | public string Task { get; set; } 10 | 11 | public FieldData Field { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Rendering/ConditionData.cs: -------------------------------------------------------------------------------- 1 | using FormEditor.Validation.Conditions; 2 | 3 | namespace FormEditor.Rendering 4 | { 5 | public class ConditionData 6 | { 7 | internal ConditionData() 8 | { 9 | } 10 | 11 | public ConditionData(Condition condition) 12 | { 13 | Type = condition.Type; 14 | } 15 | 16 | public string Type { get; } 17 | } 18 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Rendering/FieldData.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Rendering 2 | { 3 | public class FieldData 4 | { 5 | public string Name { get; set; } 6 | 7 | public string FormSafeName { get; set; } 8 | 9 | public string SubmittedValue { get; set; } 10 | 11 | public bool Invalid { get; set; } 12 | } 13 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Rendering/RuleData.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Rendering 2 | { 3 | public class RuleData 4 | { 5 | public FieldData Field { get; set; } 6 | 7 | public ConditionData Condition { get; set; } 8 | } 9 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Rendering/ValidationData.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace FormEditor.Rendering 4 | { 5 | public class ValidationData 6 | { 7 | public List Rules { get; set; } 8 | 9 | public string ErrorMessage { get; set; } 10 | 11 | public bool Invalid { get; set; } 12 | } 13 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Row.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace FormEditor 4 | { 5 | public class Row 6 | { 7 | public string Alias { get; set; } 8 | 9 | public IEnumerable Cells { get; set; } 10 | } 11 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/SerializationHelper.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | using Newtonsoft.Json.Serialization; 3 | 4 | namespace FormEditor 5 | { 6 | public static class SerializationHelper 7 | { 8 | public static IContractResolver ContractResolver => new CamelCasePropertyNamesContractResolver(); 9 | 10 | public static TypeNameHandling TypeNameHandling => TypeNameHandling.Auto; 11 | 12 | public static FormModel DeserializeFormModel(string json) 13 | { 14 | // see below for an explanation :) 15 | json = json.Replace(@"""runtimeType""", @"""$type"""); 16 | 17 | return JsonConvert.DeserializeObject(json, SerializerSettings); 18 | } 19 | 20 | public static string SerializeFormModel(FormModel formModel) 21 | { 22 | return formModel == null 23 | ? null 24 | : FormatJson(JsonConvert.SerializeObject(formModel, SerializerSettings)); 25 | } 26 | 27 | public static JsonSerializerSettings SerializerSettings => new JsonSerializerSettings 28 | { 29 | TypeNameHandling = TypeNameHandling, 30 | ContractResolver = ContractResolver, 31 | NullValueHandling = NullValueHandling.Ignore 32 | }; 33 | 34 | internal static string FormatJson(string json) 35 | { 36 | // AngularJS messes with properties that start with $, so we need to swap $type with something else 37 | json = json.Replace(@"""$type""", @"""runtimeType"""); 38 | return json; 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Storage/IApprovalIndex.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FormEditor.Storage 4 | { 5 | /// 6 | /// This interface describes a Form Editor storage index that supports approval per form entry 7 | /// 8 | public interface IApprovalIndex 9 | { 10 | /// 11 | /// Gets entries from the index 12 | /// 13 | /// The entry field to sort by 14 | /// True to sort the entries descending, false otherwise 15 | /// The number of entries to return 16 | /// The number of entries to skip (for pagination) 17 | /// The approval state of the entries - if the value is ApprovalState.Any, no approval filtering is applied 18 | /// The matching entries 19 | Result Get(string sortField, bool sortDescending, int count, int skip, ApprovalState approvalState); 20 | 21 | /// 22 | /// Sets the approval state of an entry in the index 23 | /// 24 | /// The new approval state for the entry 25 | /// The ID of the entry to update 26 | /// The ID of the form entry 27 | bool SetApprovalState(ApprovalState approvalState, Guid rowId); 28 | } 29 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Storage/IAutomationIndex.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FormEditor.Storage 4 | { 5 | /// 6 | /// This interface describes a Form Editor storage index that supports automation 7 | /// 8 | /// 9 | /// Be aware that this interface will evolve continuously as the need for automation grows 10 | /// 11 | public interface IAutomationIndex 12 | { 13 | /// 14 | /// Removes entries from the index older than a specified date 15 | /// 16 | /// The max age for entries to keep (inclusive) 17 | void RemoveOlderThan(DateTime date); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Storage/IFullTextIndex.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Storage 2 | { 3 | /// 4 | /// This interface describes a Form Editor storage index that supports full text search 5 | /// 6 | public interface IFullTextIndex 7 | { 8 | /// 9 | /// Search entries in the index 10 | /// 11 | /// The search query to match 12 | /// The fields to search 13 | /// The entry field to sort by 14 | /// True to sort the entries descending, false otherwise 15 | /// The number of entries to return 16 | /// The number of entries to skip (for pagination) 17 | /// The matching entries 18 | Result Search(string searchQuery, string[] searchFields, string sortField, bool sortDescending, int count, int skip); 19 | } 20 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Storage/IUpdateIndex.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace FormEditor.Storage 5 | { 6 | /// 7 | /// This interface describes a Form Editor storage index that supports updating entries 8 | /// 9 | /// 10 | /// In an upcoming release, this interface will be merged into IIndex 11 | /// 12 | public interface IUpdateIndex 13 | { 14 | /// 15 | /// Updates an entry in the index 16 | /// 17 | /// The field names and values to update 18 | /// The ID of the entry to update 19 | /// The ID of the form entry 20 | Guid Update(Dictionary fields, Guid rowId); 21 | } 22 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Storage/IndexHelper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Configuration; 3 | 4 | namespace FormEditor.Storage 5 | { 6 | public class IndexHelper 7 | { 8 | public static IIndex GetIndex(int contentId) 9 | { 10 | if (Configuration.Instance.IndexType != null) 11 | { 12 | try 13 | { 14 | if (!(Activator.CreateInstance(Configuration.Instance.IndexType, contentId) is IIndex index)) 15 | { 16 | throw new ConfigurationErrorsException($"Activator was unable to instantiate the custom Index type \"{Configuration.Instance.IndexType.AssemblyQualifiedName}\""); 17 | } 18 | return index; 19 | } 20 | catch (Exception ex) 21 | { 22 | Log.Error(ex, "Could not create an instance of the custom Index type"); 23 | } 24 | } 25 | // revert to default index 26 | return new Index(contentId); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Storage/Result.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace FormEditor.Storage 4 | { 5 | public class Result 6 | { 7 | public Result(int totalRows, IEnumerable rows, string sortField, bool sortDescending) 8 | { 9 | SortDescending = sortDescending; 10 | SortField = sortField; 11 | TotalRows = totalRows; 12 | Rows = rows; 13 | } 14 | 15 | public static Result Empty(string sortField, bool sortDescending) 16 | { 17 | return new Result(0, new Row[]{}, sortField, sortDescending); 18 | } 19 | 20 | public int TotalRows { get; } 21 | 22 | public IEnumerable Rows { get; } 23 | 24 | public string SortField { get; } 25 | 26 | public bool SortDescending { get; } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Storage/Row.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace FormEditor.Storage 5 | { 6 | public class Row 7 | { 8 | public Row(Guid id, DateTime createdDate, Dictionary fields, ApprovalState approvalState = ApprovalState.Undecided) 9 | { 10 | Id = id; 11 | Fields = fields; 12 | CreatedDate = createdDate; 13 | ApprovalState = approvalState; 14 | } 15 | 16 | public Guid Id { get; } 17 | 18 | public DateTime CreatedDate { get; } 19 | 20 | public ApprovalState ApprovalState { get; } 21 | 22 | public Dictionary Fields { get; } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Storage/Statistics/FieldValueFrequencies.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace FormEditor.Storage.Statistics 4 | { 5 | public class FieldValueFrequencies 6 | { 7 | public FieldValueFrequencies(T field, IEnumerable frequencies) 8 | { 9 | Field = field; 10 | Frequencies = frequencies; 11 | } 12 | 13 | public T Field { get; } 14 | 15 | public IEnumerable Frequencies { get; } 16 | } 17 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Storage/Statistics/FieldValueFrequency.cs: -------------------------------------------------------------------------------- 1 | namespace FormEditor.Storage.Statistics 2 | { 3 | public class FieldValueFrequency 4 | { 5 | public FieldValueFrequency(string value, int frequency) 6 | { 7 | Value = value; 8 | Frequency = frequency; 9 | } 10 | 11 | public string Value { get; } 12 | 13 | public int Frequency { get; } 14 | } 15 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Storage/Statistics/FieldValueFrequencyStatistics.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace FormEditor.Storage.Statistics 4 | { 5 | public class FieldValueFrequencyStatistics 6 | { 7 | private readonly List> _fieldValueFrequencies; 8 | 9 | public FieldValueFrequencyStatistics(int totalRows) 10 | { 11 | TotalRows = totalRows; 12 | _fieldValueFrequencies = new List>(); 13 | } 14 | 15 | public void Add(T field, IEnumerable fieldValueFrequencies) 16 | { 17 | _fieldValueFrequencies.Add(new FieldValueFrequencies(field, fieldValueFrequencies)); 18 | } 19 | 20 | public int TotalRows { get; } 21 | 22 | public IEnumerable> FieldValueFrequencies => _fieldValueFrequencies; 23 | } 24 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Validation/Action.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using FormEditor.Fields; 3 | 4 | namespace FormEditor.Validation 5 | { 6 | public class Action 7 | { 8 | public IEnumerable Rules { get; set; } 9 | 10 | public string Task { get; set; } 11 | 12 | public FieldWithValue Field { get; set; } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Validation/Conditions/Condition.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using FormEditor.Fields; 3 | using FormEditor.Rendering; 4 | using Umbraco.Core.Models; 5 | 6 | namespace FormEditor.Validation.Conditions 7 | { 8 | public abstract class Condition 9 | { 10 | public abstract string Type { get; } 11 | 12 | public abstract string PrettyName { get; } 13 | 14 | public abstract bool IsMetBy(FieldWithValue fieldValue, IEnumerable allCollectedFieldValues, IPublishedContent content); 15 | 16 | public virtual string Icon => DefaultIcon(Type); 17 | 18 | public virtual ConditionData ForFrontEnd() 19 | { 20 | return new ConditionData(this); 21 | } 22 | 23 | protected static string DefaultIcon(string type) 24 | { 25 | return $"{type.ToLowerInvariant()}.png"; 26 | } 27 | 28 | public virtual string View => Type; 29 | } 30 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Validation/Conditions/CustomCondition.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using FormEditor.Fields; 4 | using Umbraco.Core.Models; 5 | 6 | namespace FormEditor.Validation.Conditions 7 | { 8 | public class CustomCondition : Condition 9 | { 10 | public CustomCondition(string type, string prettyName) 11 | { 12 | Type = type; 13 | PrettyName = prettyName; 14 | } 15 | 16 | public override string Type { get; } 17 | 18 | public override string PrettyName { get; } 19 | 20 | public override string View => @"core.customcondition"; 21 | 22 | public override bool IsMetBy(FieldWithValue fieldValue, IEnumerable allCollectedFieldValues, IPublishedContent content) 23 | { 24 | // custom conditions by configuration should never ever be attempted validated on the server side 25 | throw new NotImplementedException("IsMetBy() should never be called for custom conditions defined by configuration"); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Validation/Conditions/FieldIsEmptyCondition.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using FormEditor.Fields; 3 | using Umbraco.Core.Models; 4 | 5 | namespace FormEditor.Validation.Conditions 6 | { 7 | public class FieldIsEmptyCondition : Condition 8 | { 9 | public override string PrettyName => "Field is empty"; 10 | 11 | public override string Type => "core.fieldisempty"; 12 | 13 | public override bool IsMetBy(FieldWithValue fieldValue, IEnumerable allCollectedFieldValues, IPublishedContent content) 14 | { 15 | if (fieldValue == null) 16 | { 17 | // no such field - we'll say it's empty :) 18 | return true; 19 | } 20 | return fieldValue.HasSubmittedValue == false; 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Validation/Conditions/FieldIsNotEmptyCondition.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using FormEditor.Fields; 3 | using Umbraco.Core.Models; 4 | 5 | namespace FormEditor.Validation.Conditions 6 | { 7 | public class FieldIsNotEmptyCondition : FieldIsEmptyCondition 8 | { 9 | public override string PrettyName => "Field is not empty"; 10 | 11 | public override string Type => "core.fieldisnotempty"; 12 | 13 | public override bool IsMetBy(FieldWithValue fieldValue, IEnumerable allCollectedFieldValues, IPublishedContent content) 14 | { 15 | return !base.IsMetBy(fieldValue, allCollectedFieldValues, content); 16 | } 17 | 18 | public override string Icon => DefaultIcon(base.Type); 19 | } 20 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Validation/Conditions/FieldValueIsCondition.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using FormEditor.Fields; 4 | using FormEditor.Rendering; 5 | using Umbraco.Core.Models; 6 | 7 | namespace FormEditor.Validation.Conditions 8 | { 9 | public class FieldValueIsCondition : Condition 10 | { 11 | public string ExpectedFieldValue { get; set; } 12 | 13 | public override string PrettyName => "Value is"; 14 | 15 | public override string Type => "core.fieldvalueis"; 16 | 17 | public override bool IsMetBy(FieldWithValue fieldValue, IEnumerable allCollectedFieldValues, IPublishedContent content) 18 | { 19 | return ( 20 | fieldValue != null && fieldValue.HasSubmittedValue 21 | ? fieldValue.SubmittedValue 22 | : string.Empty 23 | ).Equals(ExpectedFieldValue ?? string.Empty, StringComparison.InvariantCultureIgnoreCase); 24 | } 25 | 26 | public override ConditionData ForFrontEnd() 27 | { 28 | return new FieldConditionData(this); 29 | } 30 | 31 | public class FieldConditionData : ConditionData 32 | { 33 | public FieldConditionData(FieldValueIsCondition condition) 34 | : base(condition) 35 | { 36 | ExpectedFieldValue = condition.ExpectedFieldValue; 37 | } 38 | 39 | public string ExpectedFieldValue { get; } 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Validation/Conditions/FieldValueIsNotCondition.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using FormEditor.Fields; 3 | using Umbraco.Core.Models; 4 | 5 | namespace FormEditor.Validation.Conditions 6 | { 7 | public class FieldValueIsNotCondition : FieldValueIsCondition 8 | { 9 | public override string PrettyName => "Value is not"; 10 | 11 | public override string Type => "core.fieldvalueisnot"; 12 | 13 | public override bool IsMetBy(FieldWithValue fieldValue, IEnumerable allCollectedFieldValues, IPublishedContent content) 14 | { 15 | return !base.IsMetBy(fieldValue, allCollectedFieldValues, content); 16 | } 17 | 18 | public override string Icon => DefaultIcon(base.Type); 19 | } 20 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Validation/Conditions/FieldValuesMatchCondition.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using FormEditor.Fields; 3 | using Umbraco.Core.Models; 4 | 5 | namespace FormEditor.Validation.Conditions 6 | { 7 | public class FieldValuesMatchCondition : FieldValuesDoNotMatchCondition 8 | { 9 | public override string PrettyName => "Value is equal to another field"; 10 | 11 | public override string Type => "core.fieldvaluesmatch"; 12 | 13 | public override bool IsMetBy(FieldWithValue fieldValue, IEnumerable allCollectedFieldValues, IPublishedContent content) 14 | { 15 | return !base.IsMetBy(fieldValue, allCollectedFieldValues, content); 16 | } 17 | 18 | public override string Icon => DefaultIcon(base.Type); 19 | } 20 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Validation/Rule.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using FormEditor.Fields; 3 | using FormEditor.Validation.Conditions; 4 | using Umbraco.Core.Models; 5 | 6 | namespace FormEditor.Validation 7 | { 8 | public class Rule 9 | { 10 | public FieldWithValue Field { get; set; } 11 | 12 | public Condition Condition { get; set; } 13 | 14 | // do not attempt to validate this rule server side if it's condition is by configuration 15 | public bool IsApplicable => Condition.GetType() != typeof(CustomCondition); 16 | 17 | public bool IsFulfilledBy(IEnumerable allCollectedFieldValues, IPublishedContent content) 18 | { 19 | return Condition.IsMetBy(Field, allCollectedFieldValues, content); 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /Source/Solution/FormEditor/Validation/Validation.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using FormEditor.Fields; 4 | using Newtonsoft.Json; 5 | using Umbraco.Core.Models; 6 | 7 | namespace FormEditor.Validation 8 | { 9 | public class Validation 10 | { 11 | [JsonIgnore] 12 | public virtual bool Invalid { get; set; } 13 | 14 | public IEnumerable Rules { get; set; } 15 | 16 | public string ErrorMessage { get; set; } 17 | 18 | public bool IsValidFor(IEnumerable allCollectedFieldValues, IPublishedContent content) 19 | { 20 | // swap the rule fields for the actual fields collected by the form model 21 | foreach (var rule in Rules) 22 | { 23 | if (rule.Field == null) 24 | { 25 | // should not happen! 26 | continue; 27 | } 28 | var collectedField = allCollectedFieldValues.FirstOrDefault(f => f.Name == rule.Field.Name); 29 | if (collectedField != null) 30 | { 31 | rule.Field = collectedField; 32 | } 33 | } 34 | 35 | Invalid = Rules.Any(r => r.IsApplicable == false) 36 | // it's impossible to validate the rule if we have frontend only conditions in play 37 | ? false 38 | // the validation fails if all rules are fulfilled 39 | : Rules.All(r => r.IsFulfilledBy(allCollectedFieldValues, content)); 40 | 41 | return Invalid == false; 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/config/emailTemplates.html: -------------------------------------------------------------------------------- 1 |
2 | 5 |
6 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/config/tabOrder.html: -------------------------------------------------------------------------------- 1 |
2 |
    3 |
  • 4 | 5 | {{tab.name}} 6 | 10 |
  • 11 |
12 |
13 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/config/webService.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 6 | 7 | 8 | Form data will be sent to this URL as a POST request upon a successful form submission. 9 | 10 |
11 |
12 | 15 | 16 |
17 |
18 | 21 | 22 | 23 | The web service will be called using basic authentication. Leave the user name and password blank if you don't want to use authentication. 24 | 25 |
26 |
27 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/conditions/core.customcondition.html: -------------------------------------------------------------------------------- 1 |
2 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/conditions/core.fieldisempty.html: -------------------------------------------------------------------------------- 1 |
2 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/conditions/core.fieldisempty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/conditions/core.fieldisempty.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/conditions/core.fieldisnotempty.html: -------------------------------------------------------------------------------- 1 |
2 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/conditions/core.fieldvalueis.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/conditions/core.fieldvalueis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/conditions/core.fieldvalueis.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/conditions/core.fieldvalueisnot.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/conditions/core.fieldvaluesdonotmatch.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/conditions/core.fieldvaluesdonotmatch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/conditions/core.fieldvaluesdonotmatch.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/conditions/core.fieldvaluesmatch.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/directives.common.html: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.campaignmonitor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.campaignmonitor.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.checkbox.html: -------------------------------------------------------------------------------- 1 |
2 | 22 | 23 | 24 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.checkbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.checkbox.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.checkboxgroup.html: -------------------------------------------------------------------------------- 1 |
2 | 18 | 19 | 20 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.checkboxgroup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.checkboxgroup.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.consent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.consent.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.customfield.html: -------------------------------------------------------------------------------- 1 |
2 | 15 | 16 | 17 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.customfieldfixedoptions.html: -------------------------------------------------------------------------------- 1 |
2 | 18 | 19 | 20 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.date.html: -------------------------------------------------------------------------------- 1 |
2 | 15 | 16 | 17 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.date.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.date.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.dropdown.html: -------------------------------------------------------------------------------- 1 |
2 | 24 | 25 | 26 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.dropdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.dropdown.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.email.html: -------------------------------------------------------------------------------- 1 |
2 | 23 | 24 | 25 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.email.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.heading.html: -------------------------------------------------------------------------------- 1 |
2 | 17 | 18 | 19 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.heading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.heading.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.image.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.invisiblerecaptcha.html: -------------------------------------------------------------------------------- 1 |
2 | 19 | 20 | 21 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.invisiblerecaptcha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.invisiblerecaptcha.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.link.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.mailchimp.html: -------------------------------------------------------------------------------- 1 |
2 | 20 | 21 | 22 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.mailchimp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.mailchimp.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.memberinfo.html: -------------------------------------------------------------------------------- 1 |
2 | 19 | 20 | 21 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.memberinfo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.memberinfo.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.number.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.number.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.radiobuttongroup.html: -------------------------------------------------------------------------------- 1 |
2 | 18 | 19 | 20 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.radiobuttongroup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.radiobuttongroup.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.recaptcha.html: -------------------------------------------------------------------------------- 1 |
2 | 13 | 14 | 15 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.recaptcha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.recaptcha.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.selectbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.selectbox.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.submitbutton.html: -------------------------------------------------------------------------------- 1 |
2 | 17 | 18 | 19 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.submitbutton.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.submitbutton.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.telephone.html: -------------------------------------------------------------------------------- 1 |
2 | 16 | 17 | 18 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.telephone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.telephone.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.textParagraph.html: -------------------------------------------------------------------------------- 1 |
2 | 17 | 18 | 19 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.textParagraph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.textParagraph.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.textarea.html: -------------------------------------------------------------------------------- 1 |
2 | 23 | 24 | 25 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.textarea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.textarea.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.textbox.html: -------------------------------------------------------------------------------- 1 |
2 | 23 | 24 | 25 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.textbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.textbox.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.upload.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.url.html: -------------------------------------------------------------------------------- 1 |
2 | 16 | 17 | 18 |
-------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/fields/core.url.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/fields/core.url.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/rows/core.column-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/rows/core.column-1.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/rows/core.column-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/rows/core.column-2.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/rows/core.column-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/rows/core.column-3.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/rows/core.column-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/rows/core.column-4.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/rows/core.one-column.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/rows/core.one-column.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/rows/core.three-column-wide-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/rows/core.three-column-wide-left.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/rows/core.three-column-wide-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/rows/core.three-column-wide-right.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/rows/core.three-column.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/rows/core.three-column.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/rows/core.two-column-wide-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/rows/core.two-column-wide-left.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/rows/core.two-column-wide-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/rows/core.two-column-wide-right.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/editor/rows/core.two-column.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Source/Umbraco/Plugin/editor/rows/core.two-column.png -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/controllers/config.emailTemplates.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco").controller("FormEditor.Config.EmailTemplatesController", ["$scope", "assetsService", "formEditorPropertyEditorResource", 2 | function ($scope, assetsService, formEditorPropertyEditorResource) { 3 | assetsService.loadCss("/App_Plugins/FormEditor/css/form.css"); 4 | 5 | $scope.model.value = $scope.model.value || null; 6 | $scope.model.templates = []; 7 | 8 | formEditorPropertyEditorResource.getEmailTemplates().then(function (data) { 9 | $scope.model.templates = data; 10 | }); 11 | } 12 | ]); 13 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/controllers/config.webService.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco").controller("FormEditor.Config.WebServiceController", ["$scope", "$filter", "assetsService", "angularHelper", 2 | function ($scope, $filter, assetsService, angularHelper) { 3 | assetsService.loadCss("/App_Plugins/FormEditor/css/form.css"); 4 | 5 | $scope.model.value = $scope.model.value || defaultValue(); 6 | 7 | function defaultValue() { 8 | return { 9 | url: "", 10 | userName: "", 11 | password: "" 12 | } 13 | } 14 | 15 | // helper to force the current form into the dirty state 16 | $scope.setDirty = function () { 17 | angularHelper.getCurrentForm($scope).$setDirty(); 18 | } 19 | } 20 | ]); 21 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/directives/condition.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco.directives").directive("formEditorCondition", ["$http", "$compile", "formEditorPropertyEditorResource", 2 | function ($http, $compile, formEditorPropertyEditorResource) { 3 | var linker = function (scope, element, attrs) { 4 | attrs.$observe("type", function () { 5 | $http.get(formEditorPropertyEditorResource.pathToConditionFile(scope.rule.condition.view + ".html")).then(function (result) { 6 | element.html(result.data); 7 | $compile(element.contents())(scope); 8 | }); 9 | }); 10 | } 11 | 12 | return { 13 | restrict: "E", 14 | link: linker 15 | } 16 | } 17 | ]); 18 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/directives/expandableHeader.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco.directives").directive("formEditorExpandableHeader", [ 2 | function () { 3 | return { 4 | scope: { 5 | expandable: "=" 6 | }, 7 | restrict: "E", 8 | templateUrl: "formEditor.expandableHeader.html", 9 | link: function (scope, element, attributes) { 10 | scope.headerTextKey = attributes["headerTextKey"] || "missing.headerTextKey"; 11 | scope.headerTextDefault = attributes["headerTextDefault"] || "Missing headerTextDefault"; 12 | } 13 | } 14 | } 15 | ]); 16 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/directives/fieldBasics.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco.directives").directive("formEditorFieldBasics", [ 2 | function () { 3 | return { 4 | restrict: "E", 5 | templateUrl: "formEditor.fieldBasics.html" 6 | } 7 | } 8 | ]); 9 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/directives/fieldErrorMessage.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco.directives").directive("formEditorFieldErrorMessage", [ 2 | function () { 3 | return { 4 | restrict: "E", 5 | templateUrl: "formEditor.fieldErrorMessage.html" 6 | } 7 | } 8 | ]); 9 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/directives/fieldFooter.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco.directives").directive("formEditorFieldFooter", [ 2 | function () { 3 | return { 4 | restrict: "E", 5 | templateUrl: "formEditor.fieldFooter.html" 6 | } 7 | } 8 | ]); 9 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/directives/fieldHeader.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco.directives").directive("formEditorFieldHeader", [ 2 | function () { 3 | return { 4 | restrict: "E", 5 | templateUrl: "formEditor.fieldHeader.html" 6 | } 7 | } 8 | ]); 9 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/directives/fieldLabel.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco.directives").directive("formEditorFieldLabel", [ 2 | function () { 3 | return { 4 | restrict: "E", 5 | templateUrl: "formEditor.fieldLabel.html" 6 | } 7 | } 8 | ]); 9 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/directives/fieldMandatory.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco.directives").directive("formEditorFieldMandatory", [ 2 | function () { 3 | return { 4 | restrict: "E", 5 | templateUrl: "formEditor.fieldMandatory.html" 6 | } 7 | } 8 | ]); 9 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/directives/fieldName.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco.directives").directive("formEditorFieldName", [ 2 | function () { 3 | return { 4 | restrict: "E", 5 | templateUrl: "formEditor.fieldName.html" 6 | } 7 | } 8 | ]); 9 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/directives/fieldOptions.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco.directives").directive("formEditorFieldOptions", [ 2 | function () { 3 | return { 4 | restrict: "E", 5 | templateUrl: "formEditor.fieldOptions.html", 6 | link: function (scope, element, attributes) { 7 | scope.optionSelectedTextKey = attributes["optionSelectedTextKey"] || "edit.options.selected"; 8 | scope.optionSelectedTextDefault = attributes["optionSelectedTextDefault"] || "Selected"; 9 | scope.multiValueField = attributes["multiValueField"] ? true : false; 10 | } 11 | } 12 | } 13 | ]); 14 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/directives/fieldPlaceholder.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco.directives").directive("formEditorFieldPlaceholder", [ 2 | function () { 3 | return { 4 | restrict: "E", 5 | templateUrl: "formEditor.fieldPlaceholder.html" 6 | } 7 | } 8 | ]); 9 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/directives/localize.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco.directives").directive("formEditorLocalize", ["formEditorLocalizationService", 2 | function (formEditorLocalizationService) { 3 | var linker = function (scope, element, attrs) { 4 | 5 | attrs.$observe("key", function () { 6 | var key = attrs.key; 7 | var defaultValue = attrs.defaultValue; 8 | formEditorLocalizationService.localize(key, defaultValue).then(function (value) { 9 | if (value) { 10 | element.html(value); 11 | } 12 | }); 13 | }); 14 | } 15 | 16 | return { 17 | restrict: "EA", 18 | replace: true, 19 | link: linker 20 | } 21 | } 22 | ]); 23 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/directives/multiSelectValue.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco.directives").directive("formEditorMultiSelectValue", [ 2 | function () { 3 | return { 4 | restrict: "A", 5 | require: "ngModel", 6 | link: function (scope, element, attr, ngModel) { 7 | 8 | ngModel.$formatters.push(function (viewValue) { 9 | return validValue(viewValue); 10 | }); 11 | 12 | function validValue(viewValue) { 13 | if (!viewValue) { 14 | return viewValue; 15 | } 16 | // #133 - multi value fields cannot have comma in their values 17 | return viewValue.replace(/,/g, ""); 18 | } 19 | } 20 | } 21 | } 22 | ]); 23 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/directives/multipleEmails.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco.directives").directive("formEditorMultipleEmails", [ 2 | function () { 3 | var EMAIL_REGEXP = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 4 | return { 5 | require: "ngModel", 6 | restrict: "A", 7 | link: function (scope, element, attrs, ctrl) { 8 | ctrl.$parsers.unshift(function (viewValue) { 9 | if (!viewValue) { 10 | ctrl.$setValidity("formEditorMultipleEmails", true); 11 | return viewValue; 12 | } 13 | 14 | var valid = _.every(viewValue.split(','), function (email) { 15 | return EMAIL_REGEXP.test(email.trim()); 16 | }); 17 | 18 | if (valid) { 19 | ctrl.$setValidity("formEditorMultipleEmails", true); 20 | return viewValue; 21 | } else { 22 | ctrl.$setValidity("formEditorMultipleEmails", false); 23 | return undefined; 24 | } 25 | }); 26 | } 27 | }; 28 | } 29 | ]); -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/directives/onEnter.js: -------------------------------------------------------------------------------- 1 | angular.module("umbraco.directives").directive("formEditorOnEnter", [ 2 | function (formEditorLocalizationService) { 3 | var linker = function (scope, element, attrs) { 4 | element.bind("keypress", function (event) { 5 | if (event.which === 13) { 6 | scope.$apply(function () { 7 | scope.$eval(attrs.formEditorOnEnter); 8 | }); 9 | event.preventDefault(); 10 | } 11 | }); 12 | }; 13 | 14 | return { 15 | restrict: "A", 16 | link: linker 17 | } 18 | } 19 | ]); 20 | -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/langs/de-de.js: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/langs/en-gb.js: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/langs/en-us.js: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/langs/es-es.js: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/langs/fr-fr.js: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/langs/he-il.js: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/langs/it-it.js: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/langs/ja-jp.js: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/langs/ko-kr.js: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/langs/nb-no.js: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/langs/pl-pl.js: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/langs/pt-br.js: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/langs/ru-ru.js: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/langs/sv-se.js: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /Source/Umbraco/Plugin/js/langs/zh-cn.js: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /Source/Umbraco/Views/FormEditorNoScript.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoTemplatePage 2 | @{ 3 | Layout = null; 4 | 5 | @* if the content being rendered does not contain the form property, pass the applicable content like this *@ 6 | // ViewBag.FormContent = myInstanceOfIPublishedContent; 7 | 8 | @* if your form property is not called "form" on the content type, pass the property name like this *@ 9 | // ViewBag.FormName = "myForm"; 10 | 11 | @* if you want to load submission data for an existing form submission, specify the row ID (GUID) like this *@ 12 | // ViewBag.FormRowId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; 13 | } 14 | 15 | 16 | 17 | @Model.Content.Name 18 | 19 | @* add some styles for Form Editor *@ 20 | 27 | 28 | 29 | 30 | @* render the form with the NoScript partial *@ 31 | @Html.Partial("FormEditor/NoScript", Umbraco.AssignedContentItem) 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.campaignmonitor.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 7 | 8 | @Html.Partial("FormEditor/FieldsAsync/core.utils.helptext") 9 |
-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.checkbox.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 7 | 8 | @Html.Partial("FormEditor/FieldsAsync/core.utils.helptext") 9 | @Html.Partial("FormEditor/FieldsAsync/core.utils.validationerror") 10 |
-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.checkboxgroup.cshtml: -------------------------------------------------------------------------------- 1 | @using FormEditor.Rendering 2 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 3 |
4 | 5 | @foreach(var fieldValue in Model.FieldValues) 6 | { 7 |
8 | 12 |
13 | } 14 | 15 | @Html.Partial("FormEditor/FieldsAsync/core.utils.helptext") 16 | @Html.Partial("FormEditor/FieldsAsync/core.utils.validationerror") 17 | 18 |
19 | 20 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.consent.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 |
5 | @Html.Raw(Umbraco.ReplaceLineBreaksForHtml(string.IsNullOrWhiteSpace(Model.ConsentText) ? string.Empty : Model.ConsentText)) 6 |
7 | 8 | @if (string.IsNullOrWhiteSpace(Model.LinkText) == false && Model.Page != null) 9 | { 10 | 13 | } 14 | 15 | 19 | 20 | @Html.Partial("FormEditor/FieldsAsync/core.utils.validationerror") 21 |
-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.date.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsAsync/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsAsync/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.dropdown.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 14 | 15 | @Html.Partial("FormEditor/FieldsAsync/core.utils.helptext") 16 | @Html.Partial("FormEditor/FieldsAsync/core.utils.validationerror") 17 |
18 | 19 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.email.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsAsync/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsAsync/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.heading.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |

@Model.Text

-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.image.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | @if (Model.Media != null) 3 | { 4 |
5 | 6 | @if (string.IsNullOrEmpty(Model.Text) == false) 7 | { 8 |

9 | @Model.Text 10 |

11 | } 12 |
13 | } 14 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.link.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | @if (string.IsNullOrWhiteSpace(Model.Text) == false && Model.Page != null) 3 | { 4 |
5 | @Model.Text 6 |
7 | } 8 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.mailchimp.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 7 | 8 | @Html.Partial("FormEditor/FieldsAsync/core.utils.helptext") 9 |
-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.memberinfo.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | @* 3 | render a hidden field to indicate whether or not a member is logged in, so we can use client side validations based on member login status 4 | *@ 5 | 6 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.number.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsAsync/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsAsync/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.radiobuttongroup.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | @foreach(var fieldValue in Model.FieldValues) 5 | { 6 |
7 | 11 |
12 | } 13 | 14 | @Html.Partial("FormEditor/FieldsAsync/core.utils.helptext") 15 | @Html.Partial("FormEditor/FieldsAsync/core.utils.validationerror") 16 |
-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.selectbox.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 12 | 13 | 14 | @Html.Partial("FormEditor/FieldsAsync/core.utils.helptext") 15 | @Html.Partial("FormEditor/FieldsAsync/core.utils.validationerror") 16 |
17 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.submitbutton.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 6 |
7 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.telephone.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsAsync/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsAsync/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.textarea.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsAsync/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsAsync/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.textbox.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsAsync/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsAsync/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.textparagraph.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |

3 | @Html.Raw(Umbraco.ReplaceLineBreaksForHtml(string.IsNullOrWhiteSpace(Model.Text) ? string.Empty : Model.Text)) 4 |

-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.upload.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 0 ? Html.Raw(string.Format(@"max-file-size=""{0}""", Model.MaxSize*1024)) : null) accept="@Model.GetValidExtensions()" file-upload ng-model="formData.@Model.FormSafeName" /> 5 | 6 | @Html.Partial("FormEditor/FieldsAsync/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsAsync/core.utils.validationerror") 8 |
9 | 10 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.url.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsAsync/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsAsync/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.utils.helptext.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | @if (string.IsNullOrEmpty(Model.HelpText) == false) 3 | { 4 | @Model.HelpText 5 | } 6 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsAsync/core.utils.validationerror.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | @Model.ErrorMessage 4 |
5 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.campaignmonitor.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 7 | 8 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.helptext") 9 |
-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.checkbox.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 7 | 8 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.helptext") 9 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.validationerror") 10 |
-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.checkboxgroup.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | @foreach (var fieldValue in Model.FieldValues) 5 | { 6 |
7 | 11 |
12 | } 13 | 14 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.helptext") 15 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.validationerror") 16 |
17 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.consent.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 |
5 | @Html.Raw(Umbraco.ReplaceLineBreaksForHtml(string.IsNullOrWhiteSpace(Model.ConsentText) ? string.Empty : Model.ConsentText)) 6 |
7 | 8 | @if (string.IsNullOrWhiteSpace(Model.LinkText) == false && Model.Page != null) 9 | { 10 | 13 | } 14 | 15 | 19 | 20 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.validationerror") 21 |
-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.date.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.dropdown.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 14 | 15 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.helptext") 16 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.validationerror") 17 |
18 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.email.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.heading.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |

@Model.Text

-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.image.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | @if (Model.Media != null) 3 | { 4 |
5 | 6 | @if (string.IsNullOrEmpty(Model.Text) == false) 7 | { 8 |

9 | @Model.Text 10 |

11 | } 12 |
13 | } 14 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.link.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | @if (string.IsNullOrWhiteSpace(Model.Text) == false && Model.Page != null) 3 | { 4 |
5 | @Model.Text 6 |
7 | } 8 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.mailchimp.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 7 | 8 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.helptext") 9 |
-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.memberinfo.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | @* 3 | render a hidden field to indicate whether or not a member is logged in, so we can use client side validations based on member login status 4 | *@ 5 | 6 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.number.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.radiobuttongroup.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | @foreach (var fieldValue in Model.FieldValues) 5 | { 6 |
7 | 11 |
12 | } 13 | 14 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.helptext") 15 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.validationerror") 16 |
-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.selectbox.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 10 | 11 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.helptext") 12 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.validationerror") 13 |
14 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.submitbutton.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 |
5 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.telephone.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.textarea.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.textbox.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.textparagraph.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |

3 | @Html.Raw(Umbraco.ReplaceLineBreaksForHtml(string.IsNullOrWhiteSpace(Model.Text) ? string.Empty : Model.Text)) 4 |

-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.upload.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.validationerror") 8 |
9 | 10 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.url.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsNoScript/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.utils.helptext.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | @if (string.IsNullOrEmpty(Model.HelpText) == false) 3 | { 4 | @Model.HelpText 5 | } 6 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsNoScript/core.utils.validationerror.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | @* for the NoScript rendering, this is solely rendered server side *@ 3 | @if (Model.Invalid) 4 | { 5 |
6 | @Model.ErrorMessage 7 |
8 | } 9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.campaignmonitor.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 7 | 8 | @Html.Partial("FormEditor/FieldsSync/core.utils.helptext") 9 |
-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.checkbox.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 7 | 8 | @Html.Partial("FormEditor/FieldsSync/core.utils.helptext") 9 | @Html.Partial("FormEditor/FieldsSync/core.utils.validationerror") 10 |
-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.checkboxgroup.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | @foreach (var fieldValue in Model.FieldValues) 5 | { 6 |
7 | 11 |
12 | } 13 | 14 | @Html.Partial("FormEditor/FieldsSync/core.utils.helptext") 15 | @Html.Partial("FormEditor/FieldsSync/core.utils.validationerror") 16 |
17 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.consent.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 |
5 | @Html.Raw(Umbraco.ReplaceLineBreaksForHtml(string.IsNullOrWhiteSpace(Model.ConsentText) ? string.Empty : Model.ConsentText)) 6 |
7 | 8 | @if (string.IsNullOrWhiteSpace(Model.LinkText) == false && Model.Page != null) 9 | { 10 | 13 | } 14 | 15 | 19 | 20 | @Html.Partial("FormEditor/FieldsSync/core.utils.validationerror") 21 |
-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.date.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsSync/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsSync/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.dropdown.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 14 | 15 | @Html.Partial("FormEditor/FieldsSync/core.utils.helptext") 16 | @Html.Partial("FormEditor/FieldsSync/core.utils.validationerror") 17 |
18 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.email.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsSync/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsSync/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.heading.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |

@Model.Text

-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.image.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | @if (Model.Media != null) 3 | { 4 |
5 | 6 | @if (string.IsNullOrEmpty(Model.Text) == false) 7 | { 8 |

9 | @Model.Text 10 |

11 | } 12 |
13 | } 14 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.link.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | @if (string.IsNullOrWhiteSpace(Model.Text) == false && Model.Page != null) 3 | { 4 |
5 | @Model.Text 6 |
7 | } 8 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.mailchimp.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 7 | 8 | @Html.Partial("FormEditor/FieldsSync/core.utils.helptext") 9 |
-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.memberinfo.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | @* 3 | render a hidden field to indicate whether or not a member is logged in, so we can use client side validations based on member login status 4 | *@ 5 | 6 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.number.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsSync/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsSync/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.radiobuttongroup.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | @foreach (var fieldValue in Model.FieldValues) 5 | { 6 |
7 | 11 |
12 | } 13 | 14 | @Html.Partial("FormEditor/FieldsSync/core.utils.helptext") 15 | @Html.Partial("FormEditor/FieldsSync/core.utils.validationerror") 16 |
-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.selectbox.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 10 | 11 | @Html.Partial("FormEditor/FieldsSync/core.utils.helptext") 12 | @Html.Partial("FormEditor/FieldsSync/core.utils.validationerror") 13 |
14 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.submitbutton.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 |
5 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.telephone.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsSync/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsSync/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.textarea.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsSync/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsSync/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.textbox.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsSync/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsSync/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.textparagraph.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |

3 | @Html.Raw(Umbraco.ReplaceLineBreaksForHtml(string.IsNullOrWhiteSpace(Model.Text) ? string.Empty : Model.Text)) 4 |

-------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.upload.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsSync/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsSync/core.utils.validationerror") 8 |
9 | 10 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.url.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | 4 | 5 | 6 | @Html.Partial("FormEditor/FieldsSync/core.utils.helptext") 7 | @Html.Partial("FormEditor/FieldsSync/core.utils.validationerror") 8 |
9 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.utils.helptext.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 | @if (string.IsNullOrEmpty(Model.HelpText) == false) 3 | { 4 | @Model.HelpText 5 | } 6 | -------------------------------------------------------------------------------- /Source/Umbraco/Views/Partials/FormEditor/FieldsSync/core.utils.validationerror.cshtml: -------------------------------------------------------------------------------- 1 | @inherits Umbraco.Web.Mvc.UmbracoViewPage 2 |
3 | @Model.ErrorMessage 4 |
-------------------------------------------------------------------------------- /Source/Umbraco/Views/Web.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Tutorials/img/Comments/approve-submissions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Comments/approve-submissions.png -------------------------------------------------------------------------------- /Tutorials/img/Comments/article-content-template-form-layout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Comments/article-content-template-form-layout.png -------------------------------------------------------------------------------- /Tutorials/img/Comments/article-content-template-form-receipt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Comments/article-content-template-form-receipt.png -------------------------------------------------------------------------------- /Tutorials/img/Comments/article-document-type.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Comments/article-document-type.png -------------------------------------------------------------------------------- /Tutorials/img/Comments/article-with-comments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Comments/article-with-comments.png -------------------------------------------------------------------------------- /Tutorials/img/Comments/creating-an-article.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Comments/creating-an-article.png -------------------------------------------------------------------------------- /Tutorials/img/Comments/data-type-submission-approval.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Comments/data-type-submission-approval.png -------------------------------------------------------------------------------- /Tutorials/img/Comments/data-type-tab-availability.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Comments/data-type-tab-availability.png -------------------------------------------------------------------------------- /Tutorials/img/Comments/using-the-content-template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Comments/using-the-content-template.png -------------------------------------------------------------------------------- /Tutorials/img/ConditionalField/form-action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/ConditionalField/form-action.png -------------------------------------------------------------------------------- /Tutorials/img/ConditionalField/form-layout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/ConditionalField/form-layout.png -------------------------------------------------------------------------------- /Tutorials/img/ConditionalField/form-validation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/ConditionalField/form-validation.png -------------------------------------------------------------------------------- /Tutorials/img/ConditionalField/form.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/ConditionalField/form.gif -------------------------------------------------------------------------------- /Tutorials/img/DefaultValues/result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/DefaultValues/result.png -------------------------------------------------------------------------------- /Tutorials/img/EmailMarketing/7zip-nuget.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/EmailMarketing/7zip-nuget.png -------------------------------------------------------------------------------- /Tutorials/img/EmailMarketing/campaign-monitor-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/EmailMarketing/campaign-monitor-settings.png -------------------------------------------------------------------------------- /Tutorials/img/EmailMarketing/campaign-monitor-subscription.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/EmailMarketing/campaign-monitor-subscription.png -------------------------------------------------------------------------------- /Tutorials/img/HelloFormEditor/contact-form.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/HelloFormEditor/contact-form.png -------------------------------------------------------------------------------- /Tutorials/img/HelloFormEditor/doctype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/HelloFormEditor/doctype.png -------------------------------------------------------------------------------- /Tutorials/img/HelloFormEditor/form-layout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/HelloFormEditor/form-layout.png -------------------------------------------------------------------------------- /Tutorials/img/HelloFormEditor/form-receipt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/HelloFormEditor/form-receipt.png -------------------------------------------------------------------------------- /Tutorials/img/HelloFormEditor/form-styled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/HelloFormEditor/form-styled.png -------------------------------------------------------------------------------- /Tutorials/img/HelloFormEditor/form-unstyled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/HelloFormEditor/form-unstyled.png -------------------------------------------------------------------------------- /Tutorials/img/LogicApp/blank-logic-app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/LogicApp/blank-logic-app.png -------------------------------------------------------------------------------- /Tutorials/img/LogicApp/configuring-the-action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/LogicApp/configuring-the-action.png -------------------------------------------------------------------------------- /Tutorials/img/LogicApp/configuring-the-datatype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/LogicApp/configuring-the-datatype.png -------------------------------------------------------------------------------- /Tutorials/img/LogicApp/creating-the-action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/LogicApp/creating-the-action.png -------------------------------------------------------------------------------- /Tutorials/img/LogicApp/creating-the-form.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/LogicApp/creating-the-form.png -------------------------------------------------------------------------------- /Tutorials/img/LogicApp/creating-the-lead.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/LogicApp/creating-the-lead.png -------------------------------------------------------------------------------- /Tutorials/img/LogicApp/creating-the-trigger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/LogicApp/creating-the-trigger.png -------------------------------------------------------------------------------- /Tutorials/img/LogicApp/logic-app-variables.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/LogicApp/logic-app-variables.png -------------------------------------------------------------------------------- /Tutorials/img/LogicApp/sample-json-payload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/LogicApp/sample-json-payload.png -------------------------------------------------------------------------------- /Tutorials/img/LogicApp/submitting-the-form.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/LogicApp/submitting-the-form.png -------------------------------------------------------------------------------- /Tutorials/img/LogicApp/trigger-http-post-url.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/LogicApp/trigger-http-post-url.png -------------------------------------------------------------------------------- /Tutorials/img/Poll/field-type-group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Poll/field-type-group.png -------------------------------------------------------------------------------- /Tutorials/img/Poll/grid-editor-with-poll.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Poll/grid-editor-with-poll.png -------------------------------------------------------------------------------- /Tutorials/img/Poll/poll-layout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Poll/poll-layout.png -------------------------------------------------------------------------------- /Tutorials/img/Poll/poll-score.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Poll/poll-score.png -------------------------------------------------------------------------------- /Tutorials/img/Poll/poll.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Poll/poll.png -------------------------------------------------------------------------------- /Tutorials/img/Poll/select-poll.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Poll/select-poll.png -------------------------------------------------------------------------------- /Tutorials/img/QuickStart/form-property.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/QuickStart/form-property.png -------------------------------------------------------------------------------- /Tutorials/img/QuickStart/form.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/QuickStart/form.png -------------------------------------------------------------------------------- /Tutorials/img/Ratings/article.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Ratings/article.png -------------------------------------------------------------------------------- /Tutorials/img/Ratings/review-form-property.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Ratings/review-form-property.png -------------------------------------------------------------------------------- /Tutorials/img/Ratings/review-form.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Ratings/review-form.png -------------------------------------------------------------------------------- /Tutorials/img/RatingsPartFour/article-list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/RatingsPartFour/article-list.png -------------------------------------------------------------------------------- /Tutorials/img/RatingsPartThree/review-form-property-statistics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/RatingsPartThree/review-form-property-statistics.png -------------------------------------------------------------------------------- /Tutorials/img/RatingsPartThree/review-form-property.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/RatingsPartThree/review-form-property.png -------------------------------------------------------------------------------- /Tutorials/img/RatingsPartThree/tab-order-and-availability.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/RatingsPartThree/tab-order-and-availability.png -------------------------------------------------------------------------------- /Tutorials/img/RatingsPartTwo/my.rating.advanced.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/RatingsPartTwo/my.rating.advanced.png -------------------------------------------------------------------------------- /Tutorials/img/RatingsPartTwo/my.rating.simple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/RatingsPartTwo/my.rating.simple.png -------------------------------------------------------------------------------- /Tutorials/img/RatingsPartTwo/review-form-property.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/RatingsPartTwo/review-form-property.png -------------------------------------------------------------------------------- /Tutorials/img/Receipts/add-submission-info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Receipts/add-submission-info.png -------------------------------------------------------------------------------- /Tutorials/img/Receipts/confirmation-email-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Receipts/confirmation-email-settings.png -------------------------------------------------------------------------------- /Tutorials/img/Receipts/confirmation-email-template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Receipts/confirmation-email-template.png -------------------------------------------------------------------------------- /Tutorials/img/Receipts/receipt-email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Receipts/receipt-email.png -------------------------------------------------------------------------------- /Tutorials/img/Receipts/receipt-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Receipts/receipt-page.png -------------------------------------------------------------------------------- /Tutorials/img/Receipts/select-receipt-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Receipts/select-receipt-page.png -------------------------------------------------------------------------------- /Tutorials/img/SelfService/confirmation-email-template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/SelfService/confirmation-email-template.png -------------------------------------------------------------------------------- /Tutorials/img/SelfService/form-email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/SelfService/form-email.png -------------------------------------------------------------------------------- /Tutorials/img/SelfService/form-layout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/SelfService/form-layout.png -------------------------------------------------------------------------------- /Tutorials/img/SelfService/form-rendering.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/SelfService/form-rendering.png -------------------------------------------------------------------------------- /Tutorials/img/SelfService/receipt-email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/SelfService/receipt-email.png -------------------------------------------------------------------------------- /Tutorials/img/SelfService/self-service-rendering.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/SelfService/self-service-rendering.png -------------------------------------------------------------------------------- /Tutorials/img/Zapier/configure-the-action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Zapier/configure-the-action.png -------------------------------------------------------------------------------- /Tutorials/img/Zapier/configure-the-datatype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Zapier/configure-the-datatype.png -------------------------------------------------------------------------------- /Tutorials/img/Zapier/create-the-form.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Zapier/create-the-form.png -------------------------------------------------------------------------------- /Tutorials/img/Zapier/create-the-google-sheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Zapier/create-the-google-sheet.png -------------------------------------------------------------------------------- /Tutorials/img/Zapier/google-sheet-contact-information.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Zapier/google-sheet-contact-information.png -------------------------------------------------------------------------------- /Tutorials/img/Zapier/post-sample-json.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Zapier/post-sample-json.png -------------------------------------------------------------------------------- /Tutorials/img/Zapier/select-the-action-app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Zapier/select-the-action-app.png -------------------------------------------------------------------------------- /Tutorials/img/Zapier/select-the-action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Zapier/select-the-action.png -------------------------------------------------------------------------------- /Tutorials/img/Zapier/select-the-sheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Zapier/select-the-sheet.png -------------------------------------------------------------------------------- /Tutorials/img/Zapier/select-the-trigger-app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Zapier/select-the-trigger-app.png -------------------------------------------------------------------------------- /Tutorials/img/Zapier/select-the-trigger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Zapier/select-the-trigger.png -------------------------------------------------------------------------------- /Tutorials/img/Zapier/specify-the-child-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Zapier/specify-the-child-key.png -------------------------------------------------------------------------------- /Tutorials/img/Zapier/submit-the-form.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Zapier/submit-the-form.png -------------------------------------------------------------------------------- /Tutorials/img/Zapier/test-the-action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Zapier/test-the-action.png -------------------------------------------------------------------------------- /Tutorials/img/Zapier/turn-the-zap-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Zapier/turn-the-zap-on.png -------------------------------------------------------------------------------- /Tutorials/img/Zapier/webhook-url.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kjac/FormEditor/c1d57eb4e36f530b7ef2cd2023ff4f0f67943159/Tutorials/img/Zapier/webhook-url.png --------------------------------------------------------------------------------