add builder i18n

pull/217/head
Pete Matsyburka 2 years ago
parent 6f1e104067
commit 2124965996

@ -149,7 +149,7 @@ export default {
FieldSubmitter,
IconX
},
inject: ['template', 'selectedAreaRef', 'save'],
inject: ['template', 'selectedAreaRef', 'save', 't'],
props: {
area: {
type: Object,

@ -43,7 +43,7 @@
class="inline"
/>
<span class="hidden md:inline">
Sign Yourself
{{ t('sign_yourself') }}
</span>
</a>
<a
@ -57,7 +57,7 @@
class="inline"
/>
<span class="hidden md:inline">
Send
{{ t('send') }}
</span>
</a>
<button
@ -76,7 +76,7 @@
width="22"
/>
<span class="hidden md:inline">
Save
{{ t('save') }}
</span>
</button>
</template>
@ -214,14 +214,14 @@
>
<div class="bg-base-300 rounded-lg p-5 text-center space-y-4">
<p>
Draw {{ drawField.name }} field on the document
{{ t('draw_field_on_the_document').replace('{field}', drawField.name) }}
</p>
<p>
<button
class="base-button"
@click="[drawField = null, drawOption = null]"
>
Cancel
{{ t('cancel') }}
</button>
</p>
</div>
@ -232,6 +232,7 @@
:fields="template.fields"
:submitters="template.submitters"
:selected-submitter="selectedSubmitter"
:with-help="withHelp"
:default-submitters="defaultSubmitters"
:default-fields="defaultFields"
:with-sticky-submitters="withStickySubmitters"
@ -262,6 +263,7 @@ import MobileFields from './mobile_fields'
import { IconUsersPlus, IconDeviceFloppy, IconWritingSign, IconInnerShadowTop } from '@tabler/icons-vue'
import { v4 } from 'uuid'
import { ref, computed } from 'vue'
import { en as i18nEn } from './i18n'
export default {
name: 'TemplateBuilder',
@ -285,6 +287,7 @@ export default {
return {
template: this.template,
save: this.save,
t: this.t,
baseFetch: this.baseFetch,
backgroundColor: this.backgroundColor,
withPhone: this.withPhone,
@ -302,6 +305,11 @@ export default {
required: false,
default: false
},
i18n: {
type: Object,
required: false,
default: () => ({})
},
backgroundColor: {
type: String,
required: false,
@ -312,6 +320,11 @@ export default {
required: false,
default: true
},
withHelp: {
type: Boolean,
required: false,
default: true
},
autosave: {
type: Boolean,
required: false,
@ -475,6 +488,9 @@ export default {
this.documentRefs = []
},
methods: {
t (key) {
return this.i18n[key] || i18nEn[key] || key
},
startFieldDraw ({ name, type }) {
const existingField = this.template.fields?.find((f) => f.submitter_uuid === this.selectedSubmitter.uuid && name && name === f.name)

@ -29,7 +29,7 @@
{{ message }}
</div>
<div class="text-sm">
<span class="font-medium">Click to upload</span> or drag and drop files
<span class="font-medium">{{ t('click_to_upload') }}</span> {{ t('or_drag_and_drop_files') }}
</div>
</div>
</div>
@ -61,7 +61,7 @@ export default {
IconCloudUpload,
IconInnerShadowTop
},
inject: ['baseFetch'],
inject: ['baseFetch', 't'],
props: {
templateId: {
type: [Number, String],
@ -91,13 +91,13 @@ export default {
},
message () {
if (this.isLoading) {
return 'Uploading...'
return this.t('uploading')
} else if (this.isProcessing) {
return 'Processing...'
return this.t('processing_')
} else if (this.acceptFileTypes === 'image/*, application/pdf') {
return 'Add PDF documents or images'
return this.t('add_pdf_documents_or_images')
} else {
return 'Add documents or images'
return this.t('add_documents_or_images')
}
}
},

@ -47,7 +47,7 @@
class="label text-xs"
@click.prevent="field.required = !field.required"
@mousedown.prevent
>Required</label>
>{{ t('required') }}</label>
</template>
</div>
<div
@ -101,7 +101,7 @@
<input
v-model="field.default_value"
type="text"
placeholder="Default value"
:placeholder="t('default_value')"
class="input input-bordered input-xs w-full max-w-xs h-7 !outline-0"
@blur="save"
>
@ -111,7 +111,7 @@
class="absolute -top-1 left-2.5 px-1 h-4"
style="font-size: 8px"
>
Default value
{{ t('default_value') }}
</label>
</div>
<div
@ -121,7 +121,7 @@
>
<select
v-model="field.preferences.format"
placeholder="Format"
:placeholder="t('format')"
class="select select-bordered select-xs font-normal w-full max-w-xs !h-7 !outline-0"
@change="save"
>
@ -138,7 +138,7 @@
class="absolute -top-1 left-2.5 px-1 h-4"
style="font-size: 8px"
>
Format
{{ t('format') }}
</label>
</div>
<li
@ -152,7 +152,7 @@
class="toggle toggle-xs"
@update:model-value="save"
>
<span class="label-text">Required</span>
<span class="label-text">{{ t('required') }}</span>
</label>
</li>
<li
@ -166,7 +166,7 @@
class="toggle toggle-xs"
@update:model-value="save"
>
<span class="label-text">Read-only</span>
<span class="label-text">{{ t('read_only') }}</span>
</label>
</li>
<hr class="pb-0.5 mt-0.5">
@ -183,7 +183,7 @@
:width="20"
:stroke-width="1.6"
/>
Page {{ area.page + 1 }}
{{ t('page') }} {{ area.page + 1 }}
</a>
</li>
<li v-if="!field.areas?.length || !['radio', 'multiple'].includes(field.type)">
@ -196,7 +196,7 @@
:width="20"
:stroke-width="1.6"
/>
Draw New Area
{{ t('draw_new_area') }}
</a>
</li>
<li v-if="field.areas?.length === 1 && ['date', 'signature', 'initials', 'text', 'cells'].includes(field.type)">
@ -209,7 +209,7 @@
:width="20"
:stroke-width="1.6"
/>
Copy to All Pages
{{ t('copy_to_all_pages') }}
</a>
</li>
</ul>
@ -250,7 +250,7 @@
class="w-full input input-primary input-xs text-sm bg-transparent !pr-7 -mr-6"
type="text"
required
:placeholder="`Option ${index + 1}`"
:placeholder="`${t('option')} ${index + 1}`"
@blur="save"
>
<button
@ -268,7 +268,7 @@
v-else
v-model="option.value"
class="w-full input input-primary input-xs text-sm bg-transparent"
:placeholder="`Option ${index + 1}`"
:placeholder="`${t('option')} ${index + 1}`"
type="text"
required
@focus="maybeFocusOnOptionArea(option)"
@ -287,7 +287,7 @@
class="text-center text-sm w-full pb-1"
@click="addOption"
>
+ Add option
+ {{ t('add_option') }}
</button>
</div>
</div>
@ -313,7 +313,7 @@ export default {
IconCopy,
FieldType
},
inject: ['template', 'save', 'backgroundColor', 'selectedAreaRef'],
inject: ['template', 'save', 'backgroundColor', 'selectedAreaRef', 't'],
props: {
field: {
type: Object,
@ -366,7 +366,7 @@ export default {
} else {
const typeIndex = this.template.fields.filter((f) => f.type === this.field.type).indexOf(this.field)
const suffix = { multiple: 'Select', radio: 'Group' }[this.field.type] || 'Field'
const suffix = { multiple: this.t('select'), radio: this.t('group') }[this.field.type] || this.t('field')
return `${this.fieldNames[this.field.type]} ${suffix} ${typeIndex + 1}`
}

@ -78,7 +78,7 @@
:stroke-width="1.6"
/>
<span class="py-1">
Add {{ names[submitters.length] }}
{{ t('add') }} {{ names[submitters.length] }}
</span>
</a>
</li>
@ -175,7 +175,7 @@
:stroke-width="1.6"
/>
<span class="py-1">
Add {{ names[submitters.length] }}
{{ t('add') }} {{ names[submitters.length] }}
</span>
</a>
</li>
@ -197,6 +197,7 @@ export default {
IconTrashX,
IconChevronUp
},
inject: ['t'],
props: {
submitters: {
type: Array,
@ -250,16 +251,16 @@ export default {
},
names () {
return [
'First Party',
'Second Party',
'Third Party',
'Fourth Party',
'Fifth Party',
'Sixth Party',
'Seventh Party',
'Eighth Party',
'Ninth Party',
'Tenth Party'
this.t('first_party'),
this.t('second_party'),
this.t('third_party'),
this.t('fourth_party'),
this.t('fifth_party'),
this.t('sixth_party'),
this.t('seventh_party'),
this.t('eighth_party'),
this.t('ninth_party'),
this.t('tenth_party')
]
},
selectedSubmitter () {

@ -54,7 +54,7 @@ import { IconTextSize, IconWritingSign, IconCalendarEvent, IconPhoto, IconCheckb
export default {
name: 'FiledTypeDropdown',
inject: ['withPhone', 'withPayment'],
inject: ['withPhone', 'withPayment', 't'],
props: {
modelValue: {
type: String,
@ -90,20 +90,20 @@ export default {
computed: {
fieldNames () {
return {
text: 'Text',
signature: 'Signature',
initials: 'Initials',
date: 'Date',
image: 'Image',
file: 'File',
select: 'Select',
checkbox: 'Checkbox',
multiple: 'Multiple',
radio: 'Radio',
cells: 'Cells',
stamp: 'Stamp',
payment: 'Payment',
phone: 'Phone'
text: this.t('text'),
signature: this.t('signature'),
initials: this.t('initials'),
date: this.t('date'),
image: this.t('image'),
file: this.t('file'),
select: this.t('select'),
checkbox: this.t('checkbox'),
multiple: this.t('multiple'),
radio: this.t('radio'),
cells: this.t('cells'),
stamp: this.t('stamp'),
payment: this.t('payment'),
phone: this.t('phone')
}
},
fieldIcons () {

@ -120,7 +120,7 @@
</template>
</div>
<div
v-if="fields.length < 4 && editable"
v-if="fields.length < 4 && editable && withHelp"
class="text-xs p-2 border border-base-200 rounded"
>
<ul class="list-disc list-outside ml-3">
@ -154,12 +154,17 @@ export default {
IconDrag,
IconLock
},
inject: ['save', 'backgroundColor', 'withPhone', 'withPayment'],
inject: ['save', 'backgroundColor', 'withPhone', 'withPayment', 't'],
props: {
fields: {
type: Array,
required: true
},
withHelp: {
type: Boolean,
required: false,
default: true
},
editable: {
type: Boolean,
required: false,

@ -0,0 +1,56 @@
const en = {
sign_yourself: 'Sign Yourself',
send: 'Send',
save: 'Save',
cancel: 'Cancel',
draw_field_on_the_document: 'Draw {field} field on the document',
click_to_upload: 'Click to upload',
or_drag_and_drop_files: 'or drag and drop files',
uploading: 'Uploading',
processing_: 'Processing...',
add_pdf_documents_or_images: 'Add PDF documents or images',
add_documents_or_images: 'Add documents or images',
required: 'Required',
default_value: 'Default value',
format: 'Format',
read_only: 'Read-only',
page: 'Page',
draw_new_area: 'Draw New Area',
copy_to_all_pages: 'Copy to All Pages',
add_option: 'Add option',
option: 'Option',
first_party: 'First Party',
second_party: 'Second Party',
third_party: 'Third Party',
fourth_party: 'Fourth Party',
fifth_party: 'Fifth Party',
sixth_party: 'Sixth Party',
seventh_party: 'Seventh Party',
eighth_party: 'Eighth Party',
ninth_party: 'Ninth Party',
tenth_party: 'Tenth Party',
add: 'Add',
text: 'Text',
signature: 'Signature',
initials: 'Initials',
date: 'Date',
image: 'Image',
file: 'File',
select: 'Select',
checkbox: 'Checkbox',
multiple: 'Multiple',
radio: 'Radio',
cells: 'Cells',
stamp: 'Stamp',
payment: 'Payment',
phone: 'Phone',
field: 'Field',
group: 'Group',
draw_a_text_field_on_the_page_with_a_mouse: 'Draw a text field on the page with a mouse',
draw_field: 'Draw {field} Field',
replace: 'Replace',
uploading_: 'Uploading...',
add_document: 'Add Document'
}
export { en }

@ -9,14 +9,14 @@
class="inline"
:stroke-width="1.6"
/>
<span> Draw {{ fieldNames[drawField.type] }} Field </span>
<span>{{ t('draw_field').replace('{field}', fieldNames[drawField.type]) }}</span>
</div>
<a
href="#"
class="link block text-center"
@click.prevent="$emit('cancel')"
>
Cancel
{{ t('cancel') }}
</a>
</span>
<FieldSubmitter
@ -43,7 +43,7 @@ export default {
Field,
FieldSubmitter
},
inject: ['save'],
inject: ['save', 't'],
props: {
drawField: {
type: Object,

@ -78,7 +78,7 @@ export default {
IconPlus,
IconX
},
inject: ['withPhone', 'withPayment', 'backgroundColor'],
inject: ['withPhone', 'withPayment', 'backgroundColor', 't'],
props: {
modelValue: {
type: String,

@ -26,7 +26,7 @@ import Upload from './upload'
export default {
name: 'ReplaceDocument',
inject: ['baseFetch'],
inject: ['baseFetch', 't'],
props: {
templateId: {
type: [Number, String],
@ -56,11 +56,11 @@ export default {
},
message () {
if (this.isLoading) {
return 'Uploading...'
return this.t('uploading_')
} else if (this.isProcessing) {
return 'Processing...'
return this.t('processing_')
} else {
return 'Replace'
return this.t('replace')
}
}
},

@ -15,13 +15,13 @@
width="20"
/>
<span v-if="isLoading">
Uploading...
{{ t('uploading_') }}
</span>
<span v-else-if="isProcessing">
Processing...
{{ t('processing_') }}
</span>
<span v-else>
Add Document
{{ t('add_document') }}
</span>
</label>
<form
@ -50,7 +50,7 @@ export default {
IconUpload,
IconInnerShadowTop
},
inject: ['baseFetch'],
inject: ['baseFetch', 't'],
props: {
templateId: {
type: [Number, String],

Loading…
Cancel
Save