store multiple submitter results

This commit is contained in:
Alex Turchyn
2023-06-13 00:29:07 +03:00
parent 279409ad41
commit 28429c1167
36 changed files with 391 additions and 241 deletions
+1 -1
View File
@@ -62,7 +62,7 @@ export default actionable(targetable(class extends HTMLElement {
body: JSON.stringify({
name: this.dataset.name,
blob_signed_id: blob.signed_id,
submission_slug: this.dataset.submissionSlug
submitter_slug: this.dataset.submitterSlug
}),
headers: { 'Content-Type': 'application/json' }
}).then(resp => resp.json()).then((data) => {
+2 -1
View File
@@ -7,7 +7,8 @@ window.customElements.define('submission-form', class extends HTMLElement {
this.appElem = document.createElement('div')
this.app = createApp(Form, {
submissionSlug: this.dataset.submissionSlug,
submitterSlug: this.dataset.submitterSlug,
submitterUuid: this.dataset.submitterUuid,
authenticityToken: this.dataset.authenticityToken,
values: reactive(JSON.parse(this.dataset.values)),
attachments: reactive(JSON.parse(this.dataset.attachments)),
@@ -33,7 +33,7 @@
</template>
<FileDropzone
:message="'Attachments'"
:submission-slug="submissionSlug"
:submitter-slug="submitterSlug"
@upload="onUpload"
/>
</div>
@@ -52,7 +52,7 @@ export default {
type: Object,
required: true
},
submissionSlug: {
submitterSlug: {
type: String,
required: true
},
+3 -3
View File
@@ -26,7 +26,7 @@
export default {
name: 'FormCompleted',
props: {
submissionSlug: {
submitterSlug: {
type: String,
required: true
}
@@ -41,7 +41,7 @@ export default {
sendCopyToEmail () {
this.isSendingCopy = true
fetch(`/send_submission_email.json?submission_slug=${this.submissionSlug}`, {
fetch(`/send_submission_email.json?submitter_slug=${this.submitterSlug}`, {
method: 'POST'
}).finally(() => {
this.isSendingCopy = false
@@ -50,7 +50,7 @@ export default {
download () {
this.isDownloading = true
fetch(`/submissions/${this.submissionSlug}/download`).then(async (response) => {
fetch(`/submitters/${this.submitterSlug}/download`).then(async (response) => {
const blob = new Blob([await response.text()], { type: `${response.headers.get('content-type')};charset=utf-8;` })
const url = URL.createObjectURL(blob)
const link = document.createElement('a')
+2 -2
View File
@@ -33,7 +33,7 @@ export default {
type: String,
required: true
},
submissionSlug: {
submitterSlug: {
type: String,
required: true
},
@@ -97,7 +97,7 @@ export default {
body: JSON.stringify({
name: 'attachments',
blob_signed_id: blob.signed_id,
submission_slug: this.submissionSlug
submitter_slug: this.submitterSlug
}),
headers: { 'Content-Type': 'application/json' }
}).then(resp => resp.json()).then((data) => {
+22 -15
View File
@@ -1,14 +1,14 @@
<template>
<FieldAreas
ref="areas"
:fields="fields"
:fields="submitterFields"
:values="values"
:attachments-index="attachmentsIndex"
@focus-field="goToField"
/>
<button
v-if="currentStep !== 0"
@click="goToField(fields[currentStep - 1], true)"
@click="goToField(submitterFields[currentStep - 1], true)"
>
Back
</button>
@@ -26,7 +26,7 @@
:value="authenticityToken"
>
<input
v-if="currentStep === fields.length - 1"
v-if="currentStep === submitterFields.length - 1"
type="hidden"
name="completed"
value="true"
@@ -117,7 +117,7 @@
v-model="values[currentField.uuid]"
:field="currentField"
:attachments-index="attachmentsIndex"
:submission-slug="submissionSlug"
:submitter-slug="submitterSlug"
@attached="attachments.push($event)"
/>
<SignatureStep
@@ -126,7 +126,7 @@
v-model="values[currentField.uuid]"
:field="currentField"
:attachments-index="attachmentsIndex"
:submission-slug="submissionSlug"
:submitter-slug="submitterSlug"
@attached="attachments.push($event)"
/>
<AttachmentStep
@@ -134,7 +134,7 @@
v-model="values[currentField.uuid]"
:field="currentField"
:attachments-index="attachmentsIndex"
:submission-slug="submissionSlug"
:submitter-slug="submitterSlug"
@attached="attachments.push($event)"
/>
</div>
@@ -151,7 +151,7 @@
</form>
<FormCompleted
v-else
:submission-slug="submissionSlug"
:submitter-slug="submitterSlug"
/>
</template>
@@ -174,7 +174,11 @@ export default {
FormCompleted
},
props: {
submissionSlug: {
submitterSlug: {
type: String,
required: true
},
submitterUuid: {
type: String,
required: true
},
@@ -207,7 +211,10 @@ export default {
},
computed: {
currentField () {
return this.fields[this.currentStep]
return this.submitterFields[this.currentStep]
},
submitterFields () {
return this.fields.filter((f) => f.submitter_uuid === this.submitterUuid)
},
attachmentsIndex () {
return this.attachments.reduce((acc, a) => {
@@ -217,18 +224,18 @@ export default {
}, {})
},
submitPath () {
return `/l/${this.submissionSlug}`
return `/s/${this.submitterSlug}`
}
},
mounted () {
this.currentStep = Math.min(
this.fields.indexOf([...this.fields].reverse().find((field) => !!this.values[field.uuid])) + 1,
this.fields.length - 1
this.submitterFields.indexOf([...this.submitterFields].reverse().find((field) => !!this.values[field.uuid])) + 1,
this.submitterFields.length - 1
)
},
methods: {
goToField (field, scrollToArea = false) {
this.currentStep = this.fields.indexOf(field)
this.currentStep = this.submitterFields.indexOf(field)
this.$nextTick(() => {
if (scrollToArea) {
@@ -251,10 +258,10 @@ export default {
method: 'POST',
body: new FormData(this.$refs.form)
}).then(response => {
const nextField = this.fields[this.currentStep + 1]
const nextField = this.submitterFields[this.currentStep + 1]
if (nextField) {
this.goToField(this.fields[this.currentStep + 1], true)
this.goToField(this.submitterFields[this.currentStep + 1], true)
} else {
this.isCompleted = true
}
@@ -18,7 +18,7 @@
>
<FileDropzone
:message="'Image'"
:submission-slug="submissionSlug"
:submitter-slug="submitterSlug"
:accept="'image/*'"
@upload="onImageUpload"
/>
@@ -37,7 +37,7 @@ export default {
type: Object,
required: true
},
submissionSlug: {
submitterSlug: {
type: String,
required: true
},
@@ -39,7 +39,7 @@ export default {
type: Object,
required: true
},
submissionSlug: {
submitterSlug: {
type: String,
required: true
},
@@ -81,7 +81,7 @@ export default {
fetch('/api/attachments', {
method: 'POST',
body: JSON.stringify({
submission_slug: this.submissionSlug,
submitter_slug: this.submitterSlug,
blob_signed_id: data.signed_id,
name: 'attachments'
}),