Merge branch 'master' of https://gitlab.com/mohit.panjvani/crater-web into fix-view-status-action

This commit is contained in:
satyaprakash10
2019-11-14 19:57:14 +05:30
51 changed files with 447 additions and 181127 deletions

View File

@ -98,7 +98,7 @@ export default {
},
password: {
required,
minLength: minLength(8)
minLength: minLength(5)
}
}
},

View File

@ -168,7 +168,7 @@
>
<table-column :label="$t('dashboard.recent_invoices_card.due_on')" show="formattedDueDate" />
<table-column :label="$t('dashboard.recent_invoices_card.customer')" show="user.name" />
<table-column :label="$t('dashboard.recent_invoices_card.amount_due')" sort-as="due_amount">
<table-column :label="$t('dashboard.recent_invoices_card.amount_due')" show="due_amount" sort-as="due_amount">
<template slot-scope="row">
<span>{{ $t('dashboard.recent_invoices_card.amount_due') }}</span>
<div v-html="$utils.formatMoney(row.due_amount, row.user.currency)"/>
@ -242,7 +242,7 @@
>
<table-column :label="$t('dashboard.recent_estimate_card.date')" show="formattedExpiryDate" />
<table-column :label="$t('dashboard.recent_estimate_card.customer')" show="user.name" />
<table-column :label="$t('dashboard.recent_estimate_card.amount_due')" sort-as="total">
<table-column :label="$t('dashboard.recent_estimate_card.amount_due')" show="total" sort-as="total">
<template slot-scope="row">
<span>{{ $t('dashboard.recent_estimate_card.amount_due') }}</span>
<div v-html="$utils.formatMoney(row.total, row.user.currency)"/>

View File

@ -553,6 +553,8 @@ export default {
if (response.data) {
this.selectCustomer(response.data.estimate.user_id)
this.newEstimate = response.data.estimate
this.newEstimate.estimate_date = moment(response.data.estimate.estimate_date, 'YYYY-MM-DD').toString()
this.newEstimate.expiry_date = moment(response.data.estimate.expiry_date, 'YYYY-MM-DD').toString()
this.discountPerItem = response.data.discount_per_item
this.taxPerItem = response.data.tax_per_item
this.selectedCurrency = this.defaultCurrency

View File

@ -261,13 +261,13 @@
{{ $t('estimates.send_estimate') }}
</a>
</v-dropdown-item>
<v-dropdown-item v-if="row.status === 'DRAFT' || row.status === 'REJECTED'">
<v-dropdown-item v-if="row.status !== 'ACCEPTED'">
<a class="dropdown-item" href="#" @click.self="onMarkAsAccepted(row.id)">
<font-awesome-icon icon="check-circle" class="dropdown-item-icon" />
{{ $t('estimates.mark_as_accepted') }}
</a>
</v-dropdown-item>
<v-dropdown-item v-if="row.status === 'ACCEPTED' || row.status === 'DRAFT'">
<v-dropdown-item v-if="row.status !== 'REJECTED'">
<a class="dropdown-item" href="#" @click.self="onMarkAsRejected(row.id)">
<font-awesome-icon icon="times-circle" class="dropdown-item-icon" />
{{ $t('estimates.mark_as_rejected') }}
@ -514,8 +514,8 @@ export default {
icon: '/assets/icon/envelope-solid.svg',
buttons: true,
dangerMode: true
}).then(async (willDelete) => {
if (willDelete) {
}).then(async (willConvertInToinvoice) => {
if (willConvertInToinvoice) {
let res = await this.convertToInvoice(id)
if (res.data) {
window.toastr['success'](this.$t('estimates.conversion_message'))
@ -562,8 +562,8 @@ export default {
icon: '/assets/icon/check-circle-solid.svg',
buttons: true,
dangerMode: true
}).then(async (willDelete) => {
if (willDelete) {
}).then(async (willMarkAsSent) => {
if (willMarkAsSent) {
const data = {
id: id
}
@ -582,8 +582,8 @@ export default {
icon: '/assets/icon/paper-plane-solid.svg',
buttons: true,
dangerMode: true
}).then(async (sendEstimate) => {
if (sendEstimate) {
}).then(async (willSendEstimate) => {
if (willSendEstimate) {
const data = {
id: id
}

View File

@ -222,12 +222,22 @@ export default {
return true
},
async onMarkAsSent () {
this.isRequestOnGoing = true
let response = await this.markAsSent({id: this.estimate.id})
this.isRequestOnGoing = false
if (response.data) {
window.toastr['success'](this.$tc('estimates.mark_as_sent'))
}
swal({
title: this.$t('general.are_you_sure'),
text: this.$t('estimates.confirm_mark_as_sent'),
icon: '/assets/icon/check-circle-solid.svg',
buttons: true,
dangerMode: true
}).then(async (willMarkAsSent) => {
if (willMarkAsSent) {
this.isRequestOnGoing = true
let response = await this.markAsSent({id: this.estimate.id})
this.isRequestOnGoing = false
if (response.data) {
window.toastr['success'](this.$tc('estimates.mark_as_sent'))
}
}
})
},
async removeEstimate (id) {
this.selectEstimate([parseInt(id)])
@ -235,7 +245,7 @@ export default {
swal({
title: 'Deleted',
text: 'you will not be able to recover this estimate!',
icon: 'error',
icon: '/assets/icon/trash-solid.svg',
buttons: true,
dangerMode: true
}).then(async (willDelete) => {

View File

@ -554,6 +554,8 @@ export default {
if (response.data) {
this.selectCustomer(response.data.invoice.user_id)
this.newInvoice = response.data.invoice
this.newInvoice.invoice_date = moment(response.data.invoice.invoice_date, 'YYYY-MM-DD').toString()
this.newInvoice.due_date = moment(response.data.invoice.due_date, 'YYYY-MM-DD').toString()
this.discountPerItem = response.data.discount_per_item
this.taxPerItem = response.data.tax_per_item
this.selectedCurrency = this.defaultCurrency

View File

@ -286,7 +286,7 @@ export default {
swal({
title: 'Deleted',
text: 'you will not be able to recover this invoice!',
icon: 'error',
icon: '/assets/icon/trash-solid.svg',
buttons: true,
dangerMode: true
}).then(async (willDelete) => {

View File

@ -112,7 +112,8 @@ export default {
{ name: 'kg', value: 'kg' },
{ name: 'km', value: 'km' },
{ name: 'lb', value: 'lb' },
{ name: 'mg', value: 'mg' }
{ name: 'mg', value: 'mg' },
{ name: 'pc', value: 'pc' }
],
formData: {
name: '',

View File

@ -245,7 +245,8 @@ export default {
{ name: 'kg', value: 'kg' },
{ name: 'km', value: 'km' },
{ name: 'lb', value: 'lb' },
{ name: 'mg', value: 'mg' }
{ name: 'mg', value: 'mg' },
{ name: 'pc', value: 'pc' }
],
isRequestOngoing: true,
filtersApplied: false,

View File

@ -196,7 +196,14 @@ export default {
return true
},
downloadReport () {
this.url += '&download=true'
if (!this.getReports()) {
return false
}
if (navigator.appVersion.indexOf('Mac') !== -1) {
this.url += '&download=true'
} else {
window.open(this.getReportUrl + '&download=true')
}
setTimeout(() => {
this.url = `${this.siteURL}?from_date=${moment(this.formData.from_date).format('DD/MM/YYYY')}&to_date=${moment(this.formData.to_date).format('DD/MM/YYYY')}`
}, 200)

View File

@ -200,7 +200,14 @@ export default {
return true
},
downloadReport () {
this.url += '&download=true'
if (!this.getReports()) {
return false
}
if (navigator.appVersion.indexOf('Mac') !== -1) {
this.url += '&download=true'
} else {
window.open(this.getReportUrl + '&download=true')
}
setTimeout(() => {
this.url = `${this.siteURL}?from_date=${moment(this.formData.from_date).format('DD/MM/YYYY')}&to_date=${moment(this.formData.to_date).format('DD/MM/YYYY')}`
}, 200)

View File

@ -238,7 +238,14 @@ export default {
return true
},
downloadReport () {
this.url += '&download=true'
if (!this.getReports()) {
return false
}
if (navigator.appVersion.indexOf('Mac') !== -1) {
this.url += '&download=true'
} else {
window.open(this.getReportUrl + '&download=true')
}
setTimeout(() => {
if (this.selectedType === 'By Customer') {
this.url = `${this.customerSiteURL}?from_date=${moment(this.formData.from_date).format('DD/MM/YYYY')}&to_date=${moment(this.formData.to_date).format('DD/MM/YYYY')}`

View File

@ -189,14 +189,21 @@ export default {
this.$v.formData.$touch()
if (this.$v.$invalid) {
return true
return false
}
this.url = `${this.siteURL}?from_date=${moment(this.formData.from_date).format('DD/MM/YYYY')}&to_date=${moment(this.formData.to_date).format('DD/MM/YYYY')}`
return true
},
downloadReport () {
this.url += '&download=true'
if (!this.getReports()) {
return false
}
if (navigator.appVersion.indexOf('Mac') !== -1) {
this.url += '&download=true'
} else {
window.open(this.url + '&download=true')
}
setTimeout(() => {
this.url = `${this.siteURL}?from_date=${moment(this.formData.from_date).format('DD/MM/YYYY')}&to_date=${moment(this.formData.to_date).format('DD/MM/YYYY')}`
}, 200)

View File

@ -66,8 +66,9 @@
<base-input
:invalid="$v.mailConfigData.mail_password.$error"
v-model.trim="mailConfigData.mail_password"
type="mail_password"
type="password"
name="name"
show-password
@input="$v.mailConfigData.mail_password.$touch()"
/>
<div v-if="$v.mailConfigData.mail_password.$error">
@ -141,12 +142,12 @@ export default {
data () {
return {
mailConfigData: {
mail_driver: 'smtp',
mail_host: 'mailtrap.io',
mail_port: 2525,
mail_username: 'cc3c64516febd4',
mail_password: 'e6a0176301f587',
mail_encryption: 'tls'
mail_driver: '',
mail_host: '',
mail_port: null,
mail_username: '',
mail_password: '',
mail_encryption: ''
},
loading: false,
mail_drivers: []
@ -176,18 +177,22 @@ export default {
}
},
mounted () {
// this.getMailDrivers()
this.loadData()
},
methods: {
async getMailDrivers () {
async loadData () {
this.loading = true
let response = await window.axios.get('/api/admin/onboarding/environment/mail')
let mailDrivers = await window.axios.get('/api/settings/environment/mail')
let mailData = await window.axios.get('/api/settings/environment/mail-env')
if (response.data) {
this.mail_drivers = response.data
this.loading = false
if (mailDrivers.data) {
this.mail_drivers = mailDrivers.data
}
if (mailData.data) {
this.mailConfigData = mailData.data
}
this.loading = false
},
async saveEmailConfig () {
this.$v.mailConfigData.$touch()
@ -196,7 +201,7 @@ export default {
}
this.loading = true
try {
let response = await window.axios.post('/api/admin/onboarding/environment/mail', this.mailConfigData)
let response = await window.axios.post('/api/settings/environment/mail', this.mailConfigData)
if (response.data.success) {
window.toastr['success'](this.$t('wizard.success.' + response.data.success))
} else {

View File

@ -29,16 +29,9 @@
>
<table-column
:sortable="true"
:filterable="true"
:label="$t('settings.tax_types.tax_name')"
>
<template slot-scope="row">
<span>{{ $t('settings.tax_types.tax_name') }}</span>
<span class="tax-name mt-3">
{{ row.name }}
</span>
</template>
</table-column>
show="name"
/>
<table-column
:sortable="true"
:filterable="true"

View File

@ -0,0 +1,55 @@
<template>
<div class="setting-main-container">
<div class="card setting-card">
<div class="page-header">
<h3 class="page-title">{{ $t('settings.update_app.title') }}</h3>
<p class="page-sub-title">
{{ $t('settings.update_app.description') }}
</p>
<base-button size="large" icon="sync-alt" color="theme" @click="onUpdateApp">
{{ $t('settings.update_app.update') }}
</base-button>
<div v-if="isShowProgressBar" class="progress mt-4">
<div
:style="[{'width': progress+'%'}]"
class="progress-bar progress-bar-striped progress-bar-animated"
role="progressbar"
aria-valuenow="0"
aria-valuemin="0"
aria-valuemax="100"
/>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
data () {
return {
isShowProgressBar: false,
progress: 10,
interval: null
}
},
watch: {
},
mounted () {
},
methods: {
onUpdateApp () {
this.isShowProgressBar = true
this.interval = setInterval(() => {
if (this.progress >= 100) {
clearInterval(this.interval)
setTimeout(() => {
this.isShowProgressBar = false
}, 1000)
}
this.progress += 10
}, 250)
}
}
}
</script>

View File

@ -106,7 +106,7 @@ export default {
email
},
password: {
minLength: minLength(8)
minLength: minLength(5)
},
confirm_password: {
required: requiredIf('isRequired'),

View File

@ -74,6 +74,12 @@ export default {
title: 'settings.menu_title.notifications',
icon: 'bell',
iconType: 'far'
},
{
link: '/admin/settings/update-app',
title: 'settings.menu_title.update_app',
icon: 'sync-alt',
iconType: 'fas'
}
]
}

View File

@ -94,17 +94,27 @@
<div class="col-md-6">
<label class="form-label">{{ $t('wizard.address') }}</label>
<base-text-area
:invalid="$v.companyData.address_street_1.$error"
v-model.trim="companyData.address_street_1"
:placeholder="$t('general.street_1')"
name="billing_street1"
rows="2"
@input="$v.companyData.address_street_1.$touch()"
/>
<div v-if="$v.companyData.address_street_1.$error">
<span v-if="!$v.companyData.address_street_1.maxLength" class="text-danger">{{ $t('validation.description_maxlength') }}</span>
</div>
<base-text-area
:invalid="$v.companyData.address_street_2.$error"
v-model="companyData.address_street_2"
:placeholder="$t('general.street_2')"
name="billing_street2"
rows="2"
@input="$v.companyData.address_street_2.$touch()"
/>
<div v-if="$v.companyData.address_street_2.$error">
<span v-if="!$v.companyData.address_street_2.maxLength" class="text-danger">{{ $t('validation.description_maxlength') }}</span>
</div>
</div>
<div class="col-md-6">
<div class="row">
@ -146,7 +156,7 @@ import MultiSelect from 'vue-multiselect'
import AvatarCropper from 'vue-avatar-cropper'
import { validationMixin } from 'vuelidate'
import Ls from '../../services/ls'
const { required, minLength, email } = require('vuelidate/lib/validators')
const { required, minLength, email, maxLength } = require('vuelidate/lib/validators')
export default {
components: {
@ -197,6 +207,12 @@ export default {
},
country_id: {
required
},
address_street_1: {
maxLength: maxLength(255)
},
address_street_2: {
maxLength: maxLength(255)
}
}
},

View File

@ -97,7 +97,6 @@
</div>
<div class="col-md-6">
<label class="form-label">{{ $t('wizard.database.password') }}</label>
<span class="text-danger"> *</span>
<base-input
v-model.trim="databaseData.database_password"
type="password"
@ -154,7 +153,7 @@ export default {
database_name: null,
database_username: null,
database_password: null,
app_url: null
app_url: window.location.origin
},
loading: false,
connections: [
@ -207,8 +206,8 @@ export default {
}
this.loading = false
} catch (e) {
console.log(e)
window.toastr['error']('Something went wrong')
console.log(e.response)
window.toastr['error'](e.response.data.message)
}
}
}

View File

@ -61,7 +61,8 @@
<base-input
:invalid="$v.mailConfigData.mail_password.$error"
v-model.trim="mailConfigData.mail_password"
type="mail_password"
type="password"
show-password
name="name"
@input="$v.mailConfigData.mail_password.$touch()"
/>

View File

@ -67,8 +67,8 @@ export default {
data () {
return {
loading: false,
tab: 'step_1',
step: 1
tab: 'step_3',
step: 3
}
},
created () {

View File

@ -35,7 +35,7 @@
</div>
</div>
<base-button
v-if="requirements"
v-if="hasNext"
:loading="loading"
class="pull-right mt-4"
icon="arrow-right"
@ -46,7 +46,7 @@
{{ $t('wizard.continue') }}
</base-button>
<base-button
v-else
v-if="!requirements"
:loading="loading"
class="pull-right mt-4"
color="theme"
@ -74,6 +74,20 @@ export default {
isShow: true
}
},
computed: {
hasNext () {
if (this.requirements) {
let isRequired = true
for (const key in this.requirements) {
if (!this.requirements[key]) {
isRequired = false
}
}
return this.requirements && this.phpSupportInfo.supported && isRequired
}
return false
}
},
methods: {
listToggle () {
this.isShow = !this.isShow

View File

@ -108,7 +108,7 @@ export default {
},
password: {
required,
minLength: minLength(8)
minLength: minLength(5)
},
confirm_password: {
required: requiredIf('isRequired'),