diff --git a/app/Http/Requests/AnswerFormRequest.php b/app/Http/Requests/AnswerFormRequest.php
index 7cd1f3b..999586f 100644
--- a/app/Http/Requests/AnswerFormRequest.php
+++ b/app/Http/Requests/AnswerFormRequest.php
@@ -152,15 +152,25 @@ class AnswerFormRequest extends FormRequest
return ['email:filter'];
case 'date':
if (isset($property['date_range']) && $property['date_range']) {
- $this->requestRules[$property['id'].'.*'] = ['date'];
- return ['array'];
+ $this->requestRules[$property['id'].'.*'] = $this->getRulesForDate($property);
+ return ['array', 'min:2'];
}
- return ['date'];
+ return $this->getRulesForDate($property);
default:
return [];
}
}
+ private function getRulesForDate($property)
+ {
+ if (isset($property['disable_past_dates']) && $property['disable_past_dates']) {
+ return ['date', 'after_or_equal:today'];
+ }else if (isset($property['disable_future_dates']) && $property['disable_future_dates']) {
+ return ['date', 'before_or_equal:today'];
+ }
+ return ['date'];
+ }
+
private function getSelectPropertyOptions($property): array
{
$type = $property['type'];
diff --git a/app/Http/Requests/UserFormRequest.php b/app/Http/Requests/UserFormRequest.php
index e5fd267..ea9a0df 100644
--- a/app/Http/Requests/UserFormRequest.php
+++ b/app/Http/Requests/UserFormRequest.php
@@ -102,6 +102,8 @@ abstract class UserFormRequest extends \Illuminate\Foundation\Http\FormRequest
'properties.*.use_am_pm' => 'boolean|nullable',
'properties.*.date_range' => 'boolean|nullable',
'properties.*.prefill_today' => 'boolean|nullable',
+ 'properties.*.disable_past_dates' => 'boolean|nullable',
+ 'properties.*.disable_future_dates' => 'boolean|nullable',
// Select / Multi Select field
'properties.*.allow_creation' => 'boolean|nullable',
diff --git a/app/Mail/Forms/SubmissionConfirmationMail.php b/app/Mail/Forms/SubmissionConfirmationMail.php
index 5305b66..933122f 100644
--- a/app/Mail/Forms/SubmissionConfirmationMail.php
+++ b/app/Mail/Forms/SubmissionConfirmationMail.php
@@ -42,6 +42,7 @@ class SubmissionConfirmationMail extends OpenFormMail implements ShouldQueue
->markdown('mail.form.confirmation-submission-notification',[
'fields' => $formatter->getFieldsWithValue(),
'form' => $form,
+ 'noBranding' => $form->no_branding
]);
}
diff --git a/app/Rules/FormPropertyLogicRule.php b/app/Rules/FormPropertyLogicRule.php
index 8e8f84a..1c3ed40 100644
--- a/app/Rules/FormPropertyLogicRule.php
+++ b/app/Rules/FormPropertyLogicRule.php
@@ -490,7 +490,7 @@ class FormPropertyLogicRule implements Rule, DataAwareRule
if (is_array($conditions) && count($conditions) > 0) {
foreach($conditions as $val){
if (!in_array($val, static::ACTIONS_VALUES) ||
- (in_array($this->field["type"], ['nf-text', 'nf-page-break', 'nf-divider', 'nf-image']) && !in_array($val, ['hide-block'])) ||
+ (in_array($this->field["type"], ['nf-text', 'nf-code', 'nf-page-break', 'nf-divider', 'nf-image']) && !in_array($val, ['hide-block'])) ||
(isset($this->field["hidden"]) && $this->field["hidden"] && !in_array($val, ['show-block', 'require-answer'])) ||
(isset($this->field["required"]) && $this->field["required"] && !in_array($val, ['make-it-optional', 'hide-block']))
) {
diff --git a/resources/js/components/common/Button.vue b/resources/js/components/common/Button.vue
index c1fdca4..0738851 100644
--- a/resources/js/components/common/Button.vue
+++ b/resources/js/components/common/Button.vue
@@ -1,6 +1,6 @@
@@ -158,6 +158,12 @@ export default {
'p-x': 'px-4'
}
}
+ },
+
+ methods: {
+ onClick(event) {
+ this.$emit('click',event)
+ }
}
}
diff --git a/resources/js/components/forms/DateInput.vue b/resources/js/components/forms/DateInput.vue
index abddb1c..15e0ac7 100644
--- a/resources/js/components/forms/DateInput.vue
+++ b/resources/js/components/forms/DateInput.vue
@@ -13,6 +13,7 @@
:date-format="useTime?'Z':'Y-m-d'"
:user-format="useTime ? amPm ? 'F j, Y - G:i K' : 'F j, Y - H:i' : 'F j, Y'"
:amPm="amPm"
+ :disabled-dates="disabledDates"
/>
{{ help }}
@@ -32,7 +33,9 @@ export default {
props: {
withTime: { type: Boolean, default: false },
dateRange: { type: Boolean, default: false },
- amPm: { type: Boolean, default: false }
+ amPm: { type: Boolean, default: false },
+ disablePastDates: { type: Boolean, default: false },
+ disableFutureDates: { type: Boolean, default: false }
},
data: () => ({
@@ -74,6 +77,15 @@ export default {
const dateInput = this.$refs.datepicker.$el.getElementsByTagName('input')[0]
dateInput.style.setProperty('--tw-ring-color', this.color)
}
+ },
+ disabledDates (date) {
+ const today = new Date()
+ if(this.disablePastDates){
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate()) < new Date(today.getFullYear(), today.getMonth(), today.getDate())
+ } else if(this.disableFutureDates){
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate()) > new Date(today.getFullYear(), today.getMonth(), today.getDate())
+ }
+ return false;
}
}
}
diff --git a/resources/js/components/open/forms/OpenForm.vue b/resources/js/components/open/forms/OpenForm.vue
index 7cdba83..9481e92 100644
--- a/resources/js/components/open/forms/OpenForm.vue
+++ b/resources/js/components/open/forms/OpenForm.vue
@@ -12,6 +12,9 @@
+
@@ -375,6 +378,11 @@ export default {
if (field.use_am_pm) {
inputProperties.amPm = true
}
+ if (field.disable_past_dates) {
+ inputProperties.disablePastDates = true
+ }else if (field.disable_future_dates) {
+ inputProperties.disableFutureDates = true
+ }
} else if (field.type === 'files' || (field.type === 'url' && field.file_upload)) {
inputProperties.multiple = (field.multiple !== undefined && field.multiple)
inputProperties.mbLimit = 5
diff --git a/resources/js/components/open/forms/components/CopyContent.vue b/resources/js/components/open/forms/components/CopyContent.vue
new file mode 100644
index 0000000..ea6ed26
--- /dev/null
+++ b/resources/js/components/open/forms/components/CopyContent.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
diff --git a/resources/js/components/open/forms/components/EmbedFormCode.vue b/resources/js/components/open/forms/components/EmbedFormCode.vue
deleted file mode 100644
index caa55c8..0000000
--- a/resources/js/components/open/forms/components/EmbedFormCode.vue
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
-
- {{ embedCode }}
-
-
-
-
-
-
-
diff --git a/resources/js/components/open/forms/components/FormSubmissions.vue b/resources/js/components/open/forms/components/FormSubmissions.vue
index dcbeddd..7c81a02 100644
--- a/resources/js/components/open/forms/components/FormSubmissions.vue
+++ b/resources/js/components/open/forms/components/FormSubmissions.vue
@@ -1,39 +1,41 @@
-
- Form Submissions
- - Export as CSV
- Display columns
+
-
-
-
- Display columns
-
-
-
-
- Form Fields
-
- {{ field.name }}
-
-
-
-
- Removed Fields
-
- {{ field.name }}
-
-
-
-
-
- Close
-
+
+
+
+
+
+
+
+ Display columns
+
+
+
+
+ Form Fields
+
+ {{ field.name }}
+
+
+
+
+ Removed Fields
+
+ {{ field.name }}
+
+
+
@@ -87,8 +89,8 @@ export default {
this.getSubmissionsData()
},
watch: {
- form () {
- if(!this.form){
+ form() {
+ if (this.form === null) {
return
}
this.initFormStructure()
@@ -117,28 +119,38 @@ export default {
return
}
- // Add a "created at" column
- const columns = clonedeep(this.form.properties)
- columns.push({
- "name": "Created at",
- "id": "created_at",
- "type": "date",
- "width": 140,
+ // check if form properties already has a created_at column
+ let hasCreatedAt = false
+ this.form.properties.forEach((property) => {
+ if (property.id === 'created_at') {
+ hasCreatedAt = true
+ }
})
- this.$set(this.form, 'properties', columns)
+
+ if (!hasCreatedAt) {
+ // Add a "created at" column
+ const columns = clonedeep(this.form.properties)
+ columns.push({
+ "name": "Created at",
+ "id": "created_at",
+ "type": "date",
+ "width": 140,
+ })
+ this.$set(this.form, 'properties', columns)
+ }
this.formInitDone = true
this.properties = clonedeep(this.form.properties)
this.removed_properties = (this.form.removed_properties) ? clonedeep(this.form.removed_properties) : []
// Get display columns from local storage
- const tmpColumns = window.localStorage.getItem('display-columns-formid-'+this.form.id)
- if(tmpColumns !== null && tmpColumns){
+ const tmpColumns = window.localStorage.getItem('display-columns-formid-' + this.form.id)
+ if (tmpColumns !== null && tmpColumns) {
this.displayColumns = JSON.parse(tmpColumns)
this.onChangeDisplayColumns()
- }else{
- this.form.properties.forEach((field) => {
- this.displayColumns[field.id] = true
+ } else {
+ this.form.properties.forEach((field) => {
+ this.displayColumns[field.id] = true
})
}
},
@@ -148,7 +160,7 @@ export default {
}
this.isLoading = true
axios.get('/api/open/forms/' + this.form.id + '/submissions?page=' + this.currentPage).then((response) => {
- const resData = response.data;
+ const resData = response.data
this.tableData = this.tableData.concat(resData.data.map((record) => record.data))
@@ -168,8 +180,8 @@ export default {
this.$refs.shadows.toggleShadow()
this.$refs.shadows.calcDimensions()
},
- onChangeDisplayColumns(){
- window.localStorage.setItem('display-columns-formid-'+this.form.id, JSON.stringify(this.displayColumns))
+ onChangeDisplayColumns() {
+ window.localStorage.setItem('display-columns-formid-' + this.form.id, JSON.stringify(this.displayColumns))
const final_properties = this.properties.concat(this.removed_properties).filter((field) => {
return this.displayColumns[field.id] === true
})
diff --git a/resources/js/components/open/forms/components/ShareFormUrl.vue b/resources/js/components/open/forms/components/ShareFormUrl.vue
deleted file mode 100644
index 981bede..0000000
--- a/resources/js/components/open/forms/components/ShareFormUrl.vue
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
-
diff --git a/resources/js/components/open/forms/components/form-components/AddFormBlockModal.vue b/resources/js/components/open/forms/components/form-components/AddFormBlockModal.vue
index 36ac0e4..9284700 100644
--- a/resources/js/components/open/forms/components/form-components/AddFormBlockModal.vue
+++ b/resources/js/components/open/forms/components/form-components/AddFormBlockModal.vue
@@ -196,6 +196,18 @@
Image Block
+
+
@@ -242,6 +254,7 @@ export default {
'nf-page-break': 'Page Break',
'nf-divider': 'Divider',
'nf-image': 'Image',
+ 'nf-code': 'Code Block',
}
}
},
@@ -292,6 +305,8 @@ export default {
} else if (data.type === 'nf-page-break') {
data.next_btn_text = 'Next'
data.previous_btn_text = 'Previous'
+ } else if (data.type === 'nf-code') {
+ data.content = '
This is a code block.
'
}
return data
},
diff --git a/resources/js/components/open/forms/components/form-logic-components/FormBlockLogicEditor.vue b/resources/js/components/open/forms/components/form-logic-components/FormBlockLogicEditor.vue
index f792163..ac6e021 100644
--- a/resources/js/components/open/forms/components/form-logic-components/FormBlockLogicEditor.vue
+++ b/resources/js/components/open/forms/components/form-logic-components/FormBlockLogicEditor.vue
@@ -107,7 +107,7 @@ export default {
})
},
actionOptions() {
- if (['nf-text', 'nf-page-break', 'nf-divider', 'nf-image'].includes(this.field.type)) {
+ if (['nf-text', 'nf-code', 'nf-page-break', 'nf-divider', 'nf-image'].includes(this.field.type)) {
return [{name: 'Hide Block', value: 'hide-block'}]
}
diff --git a/resources/js/components/open/forms/fields/FormBlockOptionsModal.vue b/resources/js/components/open/forms/fields/FormBlockOptionsModal.vue
index a7be406..0059d88 100644
--- a/resources/js/components/open/forms/fields/FormBlockOptionsModal.vue
+++ b/resources/js/components/open/forms/fields/FormBlockOptionsModal.vue
@@ -115,6 +115,10 @@
:form="field" label="Upload Image" :required="false"
/>
+
+
+
@@ -137,10 +141,11 @@
diff --git a/resources/js/components/open/tables/OpenTable.vue b/resources/js/components/open/tables/OpenTable.vue
index 02562ba..d4f3a7e 100644
--- a/resources/js/components/open/tables/OpenTable.vue
+++ b/resources/js/components/open/tables/OpenTable.vue
@@ -172,7 +172,9 @@ export default {
beforeDestroy() {
const parent = document.getElementById('table-page')
- parent.removeEventListener('scroll', this.handleScroll)
+ if (parent) {
+ parent.removeEventListener('scroll', this.handleScroll)
+ }
window.removeEventListener('resize', this.handleScroll)
},
diff --git a/resources/js/components/pages/OpenFormFooter.vue b/resources/js/components/pages/OpenFormFooter.vue
index fe5d34d..434d122 100644
--- a/resources/js/components/pages/OpenFormFooter.vue
+++ b/resources/js/components/pages/OpenFormFooter.vue
@@ -7,7 +7,7 @@
-
+
{{ appName }}
diff --git a/resources/js/components/pages/forms/CreateTemplateModal.vue b/resources/js/components/pages/forms/CreateTemplateModal.vue
index 0181043..09a191a 100644
--- a/resources/js/components/pages/forms/CreateTemplateModal.vue
+++ b/resources/js/components/pages/forms/CreateTemplateModal.vue
@@ -1,29 +1,35 @@
-
+
+
+
+
+
+
+ Create template
+
+
+
+ New template will be create from your form {{form.title}} .
+ Template will be public for all to create form quickly.
+
+
+
+
diff --git a/resources/js/components/pages/forms/UrlFormPrefillModal.vue b/resources/js/components/pages/forms/UrlFormPrefillModal.vue
deleted file mode 100644
index dd9b157..0000000
--- a/resources/js/components/pages/forms/UrlFormPrefillModal.vue
+++ /dev/null
@@ -1,78 +0,0 @@
-
-
-
-
- Url Form Prefill
-
-
-
-
- Create dynamic links when sharing your form (whether it's embedded or not), that allows you to prefill
- your form fields. You can use this to personalize the form when sending it to multiple contacts for instance.
-
-
-
- How does it work?
-
-
-
- Complete your form below and fill only the fields you want to prefill. You can even leave the required fields empty.
-
-
-
-
-
-
- Generate Pre-filled URL
-
-
-
-
-
-
-
- Your Prefill url
-
-
-
-
-
-
- Close
-
-
-
-
-
-
-
diff --git a/resources/js/components/pages/forms/show/EmbedCode.vue b/resources/js/components/pages/forms/show/EmbedCode.vue
new file mode 100644
index 0000000..197c0e1
--- /dev/null
+++ b/resources/js/components/pages/forms/show/EmbedCode.vue
@@ -0,0 +1,53 @@
+
+
+
Embed
+
Embed your form on your website by copying the HTML code below.
+
+
+
+
+
+
+ Copy Code
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/js/components/pages/forms/show/ExtraMenu.vue b/resources/js/components/pages/forms/show/ExtraMenu.vue
new file mode 100644
index 0000000..668c7aa
--- /dev/null
+++ b/resources/js/components/pages/forms/show/ExtraMenu.vue
@@ -0,0 +1,130 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/js/components/pages/forms/show/RegenerateFormLink.vue b/resources/js/components/pages/forms/show/RegenerateFormLink.vue
new file mode 100644
index 0000000..d967a6a
--- /dev/null
+++ b/resources/js/components/pages/forms/show/RegenerateFormLink.vue
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+ Regenerate form link
+
+
+
+
+
+
+
+
+
+
+ Generate new form link
+
+
+
+ You can choose between two different URL formats for your form.
+ Be careful, changing your form URL is not a reversible operation .
+ Make sure to udpate your form URL everywhere where it's used.
+
+
+
+ Human Readable URL
+
+
If your users are going to see this url, you might want to make nice and readable. Example:
+
+ https://opnform.com/forms/contact
+
+
+
+ Generate a Human Readable URL
+
+
+
+
+
+ Random ID URL
+
+
+ If your user are not going to see your form url (if it's embedded), and if you prefer to have a random
+ non-guessable URL. Example:
+
+
+ https://opnform.com/forms/b4417f9c-34ae-4421-8006-832ee47786e7
+
+
+
+ Generate a Random ID URL
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/js/components/pages/forms/show/ShareLink.vue b/resources/js/components/pages/forms/show/ShareLink.vue
new file mode 100644
index 0000000..1bc8f98
--- /dev/null
+++ b/resources/js/components/pages/forms/show/ShareLink.vue
@@ -0,0 +1,39 @@
+
+
+
Share Link
+
Your form is now published and ready to be shared with the world! Copy this link to share your form
+ on social media, messaging apps or via email.
+
+
+
+
+
+
+ Copy Link
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/js/components/pages/forms/show/UrlFormPrefill.vue b/resources/js/components/pages/forms/show/UrlFormPrefill.vue
new file mode 100644
index 0000000..83fa316
--- /dev/null
+++ b/resources/js/components/pages/forms/show/UrlFormPrefill.vue
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+ Url form pre-fill
+
+
+
+
+
+
+
+
+
+
+ Url Form Prefill
+
+
+
+
+
+ Create dynamic links when sharing your form (whether it's embedded or not), that allows you to prefill
+ your form fields. You can use this to personalize the form when sending it to multiple contacts for instance.
+
+
+
+ How does it work?
+
+
+
+ Complete your form below and fill only the fields you want to prefill. You can even leave the required fields empty.
+
+
+
+
+
+
+ Generate Pre-filled URL
+
+
+
+
+
+
+
+ Your Prefill url
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/js/components/templates/QuestionsEditor.vue b/resources/js/components/templates/QuestionsEditor.vue
index c81702f..5b1d3b2 100644
--- a/resources/js/components/templates/QuestionsEditor.vue
+++ b/resources/js/components/templates/QuestionsEditor.vue
@@ -10,16 +10,17 @@
-
+
Add New
diff --git a/resources/js/pages/auth/ForgotPasswordModal.vue b/resources/js/pages/auth/ForgotPasswordModal.vue
new file mode 100644
index 0000000..4d48849
--- /dev/null
+++ b/resources/js/pages/auth/ForgotPasswordModal.vue
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Check your email
+ Forgot password?
+
+
+ We sent a password reset link to {{form.email}}
+
+
Didn't receive the email? Click to resend
+
+
+
+ No worries, we'll send you reset instructions.
+
+
+
+
+
+
+
diff --git a/resources/js/pages/auth/login.vue b/resources/js/pages/auth/login.vue
index 126fbdf..173da98 100644
--- a/resources/js/pages/auth/login.vue
+++ b/resources/js/pages/auth/login.vue
@@ -1,5 +1,7 @@
+
+
@@ -88,11 +90,13 @@ import Form from 'vform'
import Cookies from 'js-cookie'
import OpenFormFooter from '../../components/pages/OpenFormFooter'
import Testimonials from '../../components/pages/welcome/Testimonials'
+import ForgotPasswordModal from './ForgotPasswordModal'
export default {
components: {
OpenFormFooter,
- Testimonials
+ Testimonials,
+ ForgotPasswordModal
},
middleware: 'guest',
@@ -106,7 +110,8 @@ export default {
email: '',
password: ''
}),
- remember: false
+ remember: false,
+ showForgotModal: false
}),
methods: {
diff --git a/resources/js/pages/forms/show.vue b/resources/js/pages/forms/show.vue
deleted file mode 100644
index 7e250ea..0000000
--- a/resources/js/pages/forms/show.vue
+++ /dev/null
@@ -1,481 +0,0 @@
-
-
-
-
-
-
- {{ form.title }}
- Draft (not public)
-
-
-
- This form has been seen
- {{ form.views_count }} time{{ form.views_count > 0 ? 's' : '' }}
- and it has received
- {{ form.submissions_count }} submission{{ form.submissions_count > 0 ? 's' : '' }}.
-
-
-
- This form stopped accepting submissions on the {{ displayClosesDate }}
- This form will stop accepting submissions on the {{ displayClosesDate }}
-
-
-
- The form is now closed because it reached its limit of {{ form.max_submissions_count }} submissions.
- This form will stop accepting submissions after {{ form.max_submissions_count }} submissions.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Edit form
-
-
-
-
-
-
-
-
-
-
-
- Open form
-
-
-
-
-
-
-
-
-
-
-
-
- Share/Embed form
-
-
-
-
-
-
-
-
-
-
- Regenerate form link
-
-
-
-
-
-
-
-
-
- Url form pre-fill
-
-
-
-
-
-
-
-
-
-
- Duplicate form
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Delete form
-
-
-
-
-
-
-
-
-
-
-
-
- Create template
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Form Analytics (last 30 days)
-
-
-
-
-
-
-
-
- Share/Embed your form
-
-
-
-
- Share
-
-
Share your form using the link below:
-
-
-
-
- Embed
-
-
- Embed your form on your website by copying the html code below.
-
-
-
-
- Close
-
-
-
-
-
-
-
-
-
-
- Generate new form link
-
-
- You can choose between two different URL formats for your form. Be careful, changing your form URL
- is not a reversible operation . Make sure to udpate your form URL everywhere where it's used.
-
-
-
-
- Human Readable URL
-
-
If your users are going to see this url, you might want to make nice and readable. Example:
-
- https://opnform.com/forms/contact
-
-
-
- Generate a Human Readable URL
-
-
-
-
-
- Random ID URL
-
-
- If your user are not going to see your form url (if it's embedded), and if you prefer to have a random
- non-guessable URL. Example:
-
-
- https://opnform.com/forms/b4417f9c-34ae-4421-8006-832ee47786e7
-
-
-
- Generate a Random ID URL
-
-
-
-
-
- Close
-
-
-
-
-
-
-
-
-
-
-
-
-
- Form not found.
-
-
-
-
-
-
diff --git a/resources/js/pages/forms/show/analytics.vue b/resources/js/pages/forms/show/analytics.vue
new file mode 100644
index 0000000..b1b2f48
--- /dev/null
+++ b/resources/js/pages/forms/show/analytics.vue
@@ -0,0 +1,34 @@
+
+
+
+ Form Analytics (last 30 days)
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/js/pages/forms/show/index.vue b/resources/js/pages/forms/show/index.vue
new file mode 100644
index 0000000..1fdfd62
--- /dev/null
+++ b/resources/js/pages/forms/show/index.vue
@@ -0,0 +1,225 @@
+
+
+
+
+
+
+
+
+
+
+ Go back
+
+
+
+
+ {{ form.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Edit form
+
+
+
+
+
+ {{ form.views_count }} view{{ form.views_count > 0 ? 's' : '' }}
+ {{ form.submissions_count }}
+ submission{{ form.submissions_count > 0 ? 's' : '' }}
+
+ Draft (not public)
+ Edited {{ form.last_edited_human }}
+
+
+
+ This form stopped accepting submissions on the {{
+ displayClosesDate
+ }}
+ This form will stop accepting submissions on the {{ displayClosesDate }}
+
+
+ The form is now closed because it reached its limit of {{
+ form.max_submissions_count
+ }} submissions.
+ This form will stop accepting submissions after {{ form.max_submissions_count }} submissions.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form not found.
+
+
+
+
+
diff --git a/resources/js/pages/forms/show/share.vue b/resources/js/pages/forms/show/share.vue
new file mode 100644
index 0000000..bef283e
--- /dev/null
+++ b/resources/js/pages/forms/show/share.vue
@@ -0,0 +1,47 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/js/pages/forms/show/submissions.vue b/resources/js/pages/forms/show/submissions.vue
new file mode 100644
index 0000000..bc028f7
--- /dev/null
+++ b/resources/js/pages/forms/show/submissions.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
diff --git a/resources/js/pages/settings/account.vue b/resources/js/pages/settings/account.vue
index 83cdf65..34c0e9b 100644
--- a/resources/js/pages/settings/account.vue
+++ b/resources/js/pages/settings/account.vue
@@ -1,18 +1,18 @@
-
-
- Your Account
-
-
-
- You can delete your account. All your data will be removed. This cannot be undone.
+
+
Danger zone
+
+ This will permanently delete your entire account. All your forms, submissions and workspaces will be deleted.
+
+ This cannot be undone.
+
- Delete my account
+ Delete account
-
+
diff --git a/resources/js/pages/settings/password.vue b/resources/js/pages/settings/password.vue
index b703935..88362e6 100644
--- a/resources/js/pages/settings/password.vue
+++ b/resources/js/pages/settings/password.vue
@@ -1,24 +1,25 @@
-
-