mirror of
				https://github.com/crater-invoice/crater.git
				synced 2025-10-31 05:31:10 -04:00 
			
		
		
		
	fix conflicts
This commit is contained in:
		| @ -228,6 +228,10 @@ export default { | ||||
|     save_estimate: 'Save Estimate', | ||||
|     confirm_conversion: 'You want to convert this Estimate into Invoice?', | ||||
|     conversion_message: 'Conversion successful', | ||||
|     confirm_send_estimate: 'This estimate will be sent via email to the customer', | ||||
|     confirm_mark_as_sent: 'This estimate will be marked as sent', | ||||
|     confirm_mark_as_accepted: 'This estimate will be marked as Accepted', | ||||
|     confirm_mark_as_rejected: 'This estimate will be marked as Rejected', | ||||
|     no_matching_estimates: 'There are no matching estimates!', | ||||
|     errors: { | ||||
|       required: 'Field is required' | ||||
| @ -303,7 +307,9 @@ export default { | ||||
|     send_invoice: 'Send Invoice', | ||||
|     invoice_template: 'Invoice Template', | ||||
|     template: 'Template', | ||||
|     mark_as_sent: 'Mark as Sent', | ||||
|     mark_as_sent: 'Mark as sent', | ||||
|     invoice_mark_as_sent: 'This invoice will be marked as sent', | ||||
|     confirm_send: 'This invoice will be sent via email to the customer', | ||||
|     invoice_date: 'Invoice Date', | ||||
|     record_payment: 'Record Payment', | ||||
|     add_new_invoice: 'Add New Invoice', | ||||
| @ -522,7 +528,8 @@ export default { | ||||
|       preferences: 'Preferences', | ||||
|       notifications: 'Notifications', | ||||
|       tax_types: 'Tax Types', | ||||
|       expense_category: 'Expense Categories' | ||||
|       expense_category: 'Expense Categories', | ||||
|       update_app: 'Update App' | ||||
|     }, | ||||
|     title: 'Settings', | ||||
|     setting: 'Settings | Settings', | ||||
| @ -624,6 +631,7 @@ export default { | ||||
|       created_message: 'Sales tax created successfully', | ||||
|       updated_message: 'Sales tax updated successfully', | ||||
|       deleted_message: 'Sales tax deleted successfully', | ||||
|       confirm_delete: 'You will not be able to recover this Tax Type', | ||||
|       already_in_use: 'Tax is already in use' | ||||
|     }, | ||||
|     expense_category: { | ||||
| @ -636,6 +644,7 @@ export default { | ||||
|       created_message: 'Category created successfully', | ||||
|       deleted_message: 'Expense category deleted successfully', | ||||
|       updated_message: 'Expense category updated successfully', | ||||
|       confirm_delete: 'You will not be able to recover this Expense Category', | ||||
|       already_in_use: 'Category is already in use' | ||||
|     }, | ||||
|     preferences: { | ||||
| @ -656,6 +665,11 @@ export default { | ||||
|       select_time_zone: 'select Time Zone', | ||||
|       select_date_formate: 'select Date Formate', | ||||
|       select_financial_year: 'select financial year' | ||||
|     }, | ||||
|     update_app: { | ||||
|       title: 'Update App', | ||||
|       description: 'update app description', | ||||
|       update: 'Update' | ||||
|     } | ||||
|   }, | ||||
|   wizard: { | ||||
| @ -745,6 +759,7 @@ export default { | ||||
|     invalid_url: 'Invalid url (ex: http://www.crater.com)', | ||||
|     required: 'Field is required', | ||||
|     email_incorrect: 'Incorrect Email.', | ||||
|     email_already_taken: 'The email has already been taken.', | ||||
|     email_does_not_exist: "User with given email doesn't exist", | ||||
|     send_reset_link: 'Send Reset Link', | ||||
|     not_yet: 'Not yet? Send it again', | ||||
| @ -761,9 +776,9 @@ export default { | ||||
|     payment_greater_than_due_amount: 'Entered Payment is more than due amount of this invoice.', | ||||
|     quantity_maxlength: 'Quantity should not be greater than 10 digits.', | ||||
|     price_maxlength: 'Price should not be greater than 10 digits.', | ||||
|     price_minvalue: 'Price should be greater than 0 digits', | ||||
|     price_minvalue: 'Price should be greater than 0.', | ||||
|     amount_maxlength: 'Amount should not be greater than 10 digits.', | ||||
|     amount_minvalue: 'Amount should be greater than 0 digits', | ||||
|     amount_minvalue: 'Amount should be greater than 0.', | ||||
|     description_maxlength: 'Description should not be greater than 255 characters.', | ||||
|     maximum_options_error: 'Maximum  of {max} options selected. First remove a selected option to select another.', | ||||
|     notes_maxlength: 'Notes should not be greater than 255 characters.', | ||||
|  | ||||
| @ -228,12 +228,15 @@ export default { | ||||
|     estimate_template: 'Plantilla de estimación', | ||||
|     convert_to_invoice: 'Convertir a factura', | ||||
|     mark_as_sent: 'Marcar como enviado', | ||||
|     send_estimate: 'Enviar presupuesto', | ||||
|     record_payment: 'Registro de pago', | ||||
|     add_estimate: 'Agregar presupuesto', | ||||
|     save_estimate: 'Guardar estimación', | ||||
|     confirm_conversion: '¿Quiere convertir esta estimación en factura?', | ||||
|     conversion_message: 'Conversión exitosa', | ||||
|     confirm_send_estimate: 'Esta estimación se enviará por correo electrónico al cliente', | ||||
|     confirm_mark_as_sent: 'Esta estimación se marcará como enviada', | ||||
|     confirm_mark_as_accepted: 'Esta estimación se marcará como Aceptada', | ||||
|     confirm_mark_as_rejected: 'Esta estimación se marcará como Rechazada', | ||||
|     errors: { | ||||
|       required: 'Se requiere campo' | ||||
|     }, | ||||
| @ -309,6 +312,8 @@ export default { | ||||
|     invoice_template: 'Plantilla de factura', | ||||
|     template: 'Modelo', | ||||
|     mark_as_sent: 'Marcar como enviado', | ||||
|     invoice_mark_as_sent: 'Esta factura se marcará como enviada', | ||||
|     confirm_send: 'Estas facturas se enviarán por correo electrónico al cliente.', | ||||
|     invoice_date: 'Fecha de la factura', | ||||
|     record_payment: 'Registro de pago', | ||||
|     add_new_invoice: 'Añadir nueva factura', | ||||
| @ -551,6 +556,16 @@ export default { | ||||
|       action: 'Acción', | ||||
|       add_currency: 'Agregar moneda' | ||||
|     }, | ||||
|     mail: { | ||||
|       host: 'Host de correo', | ||||
|       port: 'Puerto de correo', | ||||
|       driver: 'Conductor de correo', | ||||
|       password: 'Contraseña de correo', | ||||
|       username: 'Nombre de usuario de correo', | ||||
|       mail_config: 'Configuración de correo', | ||||
|       encryption: 'Cifrado de correo', | ||||
|       mail_config_desc: 'Los detalles a continuación se utilizarán para actualizar el entorno de correo. También puede cambiar los detalles en cualquier momento después de iniciar sesión.' | ||||
|     }, | ||||
|     pdf: { | ||||
|       title: 'Configuración de PDF', | ||||
|       footer_text: 'Texto de pie de página', | ||||
| @ -613,6 +628,7 @@ export default { | ||||
|       created_message: 'Impuesto sobre las ventas creado con éxito', | ||||
|       updated_message: 'Impuesto sobre ventas actualizado con éxito', | ||||
|       deleted_message: 'Impuesto sobre las ventas eliminado con éxito', | ||||
|       confirm_delete: 'No podrá recuperar este tipo de impuesto', | ||||
|       already_in_use: 'El impuesto ya está en uso.' | ||||
|     }, | ||||
|     expense_category: { | ||||
| @ -625,6 +641,7 @@ export default { | ||||
|       created_message: 'Categoría creada con éxito', | ||||
|       deleted_message: 'Categoría de gastos eliminada correctamente', | ||||
|       updated_message: 'Categoría de gastos actualizada con éxito', | ||||
|       confirm_delete: 'No podrá recuperar esta categoría de gastos', | ||||
|       already_in_use: 'La categoría ya está en uso.' | ||||
|     }, | ||||
|     preferences: { | ||||
| @ -742,7 +759,7 @@ export default { | ||||
|     numbers_only: 'Solo numeros.', | ||||
|     characters_only: 'Solo personajes.', | ||||
|     password_incorrect: 'Las contraseñas deben ser idénticas', | ||||
|     password_length: 'La contraseña debe tener 6 caracteres de longitud.', | ||||
|     password_length: 'La contraseña debe tener 5 caracteres de longitud.', | ||||
|     qty_must_greater_than_zero: 'La cantidad debe ser mayor que cero.', | ||||
|     price_greater_than_zero: 'El precio debe ser mayor que cero.', | ||||
|     payment_greater_than_zero: 'El pago debe ser mayor que cero.', | ||||
|  | ||||
| @ -233,6 +233,10 @@ export default { | ||||
|     save_estimate: 'Sauvegarder lestimation', | ||||
|     confirm_conversion: 'Vous souhaitez convertir cette estimation en facture?', | ||||
|     conversion_message: 'Conversion réussie', | ||||
|     confirm_send_estimate: 'Cette estimation sera envoyée par courrier électronique au client.', | ||||
|     confirm_mark_as_sent: 'Cette estimation sera marquée comme envoyé', | ||||
|     confirm_mark_as_accepted: 'Cette estimation sera marquée comme acceptée', | ||||
|     confirm_mark_as_rejected: 'Cette estimation sera marquée comme Rejetée', | ||||
|     errors: { | ||||
|       required: 'Champ requis' | ||||
|     }, | ||||
| @ -308,6 +312,8 @@ export default { | ||||
|     invoice_template: 'Modèle de facture', | ||||
|     template: 'Modèle', | ||||
|     mark_as_sent: 'Marquer comme envoyé', | ||||
|     invoice_mark_as_sent: 'Cette facture sera marquée comme envoyé', | ||||
|     confirm_send: 'Cette facture sera envoyée par courrier électronique au client.', | ||||
|     invoice_date: 'Date de facturation', | ||||
|     record_payment: 'Record de paiement', | ||||
|     add_new_invoice: 'Ajouter une nouvelle facture', | ||||
| @ -548,7 +554,17 @@ export default { | ||||
|       right: 'Droite', | ||||
|       left: 'La gauche', | ||||
|       action: 'action', | ||||
|       add_currency: 'Ajouter une devise', | ||||
|       add_currency: 'Ajouter une devise' | ||||
|     }, | ||||
|     mail: { | ||||
|       host: 'Mail Host', | ||||
|       port: 'Port mail', | ||||
|       driver: 'Pilote de courrier', | ||||
|       password: 'Mot de passe mail', | ||||
|       username: "Mail Nom d'utilisateur", | ||||
|       mail_config: 'Configuration du courrier', | ||||
|       encryption: 'Chiffrement du courrier', | ||||
|       mail_config_desc: "Les détails ci-dessous seront utilisés pour mettre à jour l'environnement de messagerie. Aussi, vous pouvez modifier les détails à tout moment après la connexion." | ||||
|     }, | ||||
|     pdf: { | ||||
|       title: 'Paramètre PDF', | ||||
| @ -614,6 +630,7 @@ export default { | ||||
|       created_message: 'La taxe de vente créée avec succès', | ||||
|       updated_message: 'La taxe de vente a été mise à jour avec succès', | ||||
|       deleted_message: 'La taxe de vente a été supprimée avec succès', | ||||
|       confirm_delete: 'Vous ne pourrez pas récupérer ce type de taxe', | ||||
|       already_in_use: 'La taxe est déjà utilisée' | ||||
|     }, | ||||
|     expense_category: { | ||||
| @ -626,6 +643,7 @@ export default { | ||||
|       created_message: 'Catégorie créée avec succès', | ||||
|       deleted_message: 'La catégorie de dépenses a été supprimée avec succès', | ||||
|       updated_message: 'Catégorie de dépenses mise à jour avec succès', | ||||
|       confirm_delete: 'Vous ne pourrez pas récupérer cette catégorie de dépenses', | ||||
|       already_in_use: 'La catégorie est déjà utilisée' | ||||
|     }, | ||||
|     preferences: { | ||||
| @ -744,7 +762,7 @@ export default { | ||||
|     numbers_only: 'Chiffres uniquement.', | ||||
|     characters_only: 'Caractères seulement.', | ||||
|     password_incorrect: 'Les mots de passe doivent être identiques', | ||||
|     password_length: 'Le mot de passe doit comporter 6 caractères.', | ||||
|     password_length: 'Le mot de passe doit comporter 5 caractères.', | ||||
|     qty_must_greater_than_zero: 'La quantité doit être supérieure à zéro.', | ||||
|     price_greater_than_zero: 'Le prix doit être supérieur à zéro.', | ||||
|     payment_greater_than_zero: 'Le paiement doit être supérieur à zéro.', | ||||
|  | ||||
| @ -72,6 +72,7 @@ import UserProfile from './views/settings/UserProfile.vue' | ||||
| import TaxTypes from './views/settings/TaxTypes.vue' | ||||
| import ExpenseCategory from './views/settings/ExpenseCategory.vue' | ||||
| import MailConfig from './views/settings/MailConfig.vue' | ||||
| import UpdateApp from './views/settings/UpdateApp.vue' | ||||
|  | ||||
| import Wizard from './views/wizard/Index.vue' | ||||
|  | ||||
| @ -337,6 +338,11 @@ const routes = [ | ||||
|             path: 'notifications', | ||||
|             name: 'notifications', | ||||
|             component: Notifications | ||||
|           }, | ||||
|           { | ||||
|             path: 'update-app', | ||||
|             name: 'updateapp', | ||||
|             component: UpdateApp | ||||
|           } | ||||
|         ] | ||||
|       } | ||||
|  | ||||
| @ -12,10 +12,15 @@ | ||||
|         focus | ||||
|         type="email" | ||||
|         name="email" | ||||
|         @input="$v.loginData.email.$touch()" | ||||
|       /> | ||||
|       <div v-if="$v.loginData.email.$error"> | ||||
|         <span v-if="!$v.loginData.email.required" class="text-danger">{{ $tc('validation.required') }}</span> | ||||
|         <span v-if="!$v.loginData.email.email" class="text-danger"> {{ $tc('validation.email_incorrect') }} </span> | ||||
|         <span v-if="!$v.loginData.email.required" class="text-danger"> | ||||
|           {{ $tc('validation.required') }} | ||||
|         </span> | ||||
|         <span v-if="!$v.loginData.email.email" class="text-danger"> | ||||
|           {{ $tc('validation.email_incorrect') }} | ||||
|         </span> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="form-group"> | ||||
| @ -25,8 +30,10 @@ | ||||
|         :invalid="$v.loginData.password.$error" | ||||
|         type="password" | ||||
|         name="password" | ||||
|         show-password | ||||
|         @input="$v.loginData.password.$touch()" | ||||
|       /> | ||||
|       <div v-if="$v.loginData.email.$error"> | ||||
|       <div v-if="$v.loginData.password.$error"> | ||||
|         <span v-if="!$v.loginData.password.required" class="text-danger">{{ $tc('validation.required') }}</span> | ||||
|         <span v-if="!$v.loginData.password.minLength" class="text-danger"> {{ $tc('validation.password_min_length', $v.loginData.password.$params.minLength.min, {count: $v.loginData.password.$params.minLength.min}) }} </span> | ||||
|       </div> | ||||
| @ -91,7 +98,7 @@ export default { | ||||
|       }, | ||||
|       password: { | ||||
|         required, | ||||
|         minLength: minLength(8) | ||||
|         minLength: minLength(5) | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|  | ||||
| @ -219,7 +219,7 @@ | ||||
|             </div> | ||||
|           </div> | ||||
|           <hr> <!-- second row complete  --> | ||||
|           <div class="row same-address-checkbox-container"> | ||||
|           <div class="same-address-checkbox-container"> | ||||
|             <div class="p-1"> | ||||
|               <base-button ref="sameAddress" icon="copy" color="theme" class="btn-sm" @click="copyAddress(true)"> | ||||
|                 {{ $t('customers.copy_billing_address') }} | ||||
| @ -624,17 +624,20 @@ export default { | ||||
|           this.isLoading = true | ||||
|           this.formData.currency_id = this.currency.id | ||||
|         } | ||||
|  | ||||
|         let response = await this.addCustomer(this.formData) | ||||
|  | ||||
|         if (response.data.success) { | ||||
|           window.toastr['success'](this.$t('customers.created_message')) | ||||
|           this.$router.push('/admin/customers') | ||||
|           this.isLoading = false | ||||
|           return true | ||||
|         try { | ||||
|           let response = await this.addCustomer(this.formData) | ||||
|           if (response.data.success) { | ||||
|             window.toastr['success'](this.$t('customers.created_message')) | ||||
|             this.$router.push('/admin/customers') | ||||
|             this.isLoading = false | ||||
|             return true | ||||
|           } | ||||
|         } catch (err) { | ||||
|           if (err.response.data.errors.email) { | ||||
|             this.isLoading = false | ||||
|             window.toastr['error'](this.$t('validation.email_already_taken')) | ||||
|           } | ||||
|         } | ||||
|  | ||||
|         window.toastr['error'](response.data.error) | ||||
|       } | ||||
|     }, | ||||
|     async fetchBillingState () { | ||||
|  | ||||
| @ -343,7 +343,7 @@ export default { | ||||
|       swal({ | ||||
|         title: this.$t('general.are_you_sure'), | ||||
|         text: this.$tc('customers.confirm_delete'), | ||||
|         icon: 'error', | ||||
|         icon: '/assets/icon/trash-solid.svg', | ||||
|         buttons: true, | ||||
|         dangerMode: true | ||||
|       }).then(async (willDelete) => { | ||||
| @ -363,7 +363,7 @@ export default { | ||||
|       swal({ | ||||
|         title: this.$t('general.are_you_sure'), | ||||
|         text: this.$tc('customers.confirm_delete', 2), | ||||
|         icon: 'error', | ||||
|         icon: '/assets/icon/trash-solid.svg', | ||||
|         buttons: true, | ||||
|         dangerMode: true | ||||
|       }).then(async (willDelete) => { | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| <template> | ||||
|   <div id="app" class="main-content"> | ||||
|   <div id="app" class="main-content dashboard"> | ||||
|     <div class="row"> | ||||
|       <div class="dash-item col-sm-6"> | ||||
|         <router-link slot="item-title" to="/admin/invoices"> | ||||
| @ -177,7 +177,7 @@ | ||||
|             <table-column | ||||
|               :sortable="false" | ||||
|               :filterable="false" | ||||
|               cell-class="action-dropdown no-click" | ||||
|               cell-class="action-dropdown dashboard-recent-invoice-options no-click" | ||||
|             > | ||||
|               <template slot-scope="row"> | ||||
|                 <v-dropdown> | ||||
|  | ||||
| @ -249,25 +249,25 @@ | ||||
|                   {{ $t('estimates.convert_to_invoice') }} | ||||
|                 </a> | ||||
|               </v-dropdown-item> | ||||
|               <v-dropdown-item> | ||||
|               <v-dropdown-item v-if="row.status !== 'SENT'"> | ||||
|                 <a class="dropdown-item" href="#" @click.self="onMarkAsSent(row.id)"> | ||||
|                   <font-awesome-icon icon="check-circle" class="dropdown-item-icon" /> | ||||
|                   {{ $t('estimates.mark_as_sent') }} | ||||
|                 </a> | ||||
|               </v-dropdown-item> | ||||
|               <v-dropdown-item> | ||||
|               <v-dropdown-item v-if="row.status !== 'SENT'"> | ||||
|                 <a class="dropdown-item" href="#" @click.self="sendEstimate(row.id)"> | ||||
|                   <font-awesome-icon icon="paper-plane" class="dropdown-item-icon" /> | ||||
|                   {{ $t('estimates.send_estimate') }} | ||||
|                 </a> | ||||
|               </v-dropdown-item> | ||||
|               <v-dropdown-item v-if="row.status === 'DRAFT'"> | ||||
|               <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 === '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') }} | ||||
| @ -409,28 +409,48 @@ export default { | ||||
|       } | ||||
|     }, | ||||
|     async onMarkAsAccepted (id) { | ||||
|       const data = { | ||||
|         id: id | ||||
|       } | ||||
|       let response = await this.markAsAccepted(data) | ||||
|       this.refreshTable() | ||||
|       if (response.data) { | ||||
|         this.filters.status = 'ACCEPTED' | ||||
|         this.$refs.table.refresh() | ||||
|         window.toastr['success'](this.$tc('estimates.marked_as_rejected_message')) | ||||
|       } | ||||
|       swal({ | ||||
|         title: this.$t('general.are_you_sure'), | ||||
|         text: this.$t('estimates.confirm_mark_as_accepted'), | ||||
|         icon: '/assets/icon/check-circle-solid.svg', | ||||
|         buttons: true, | ||||
|         dangerMode: true | ||||
|       }).then(async (markedAsRejected) => { | ||||
|         if (markedAsRejected) { | ||||
|           const data = { | ||||
|             id: id | ||||
|           } | ||||
|           let response = await this.markAsAccepted(data) | ||||
|           this.refreshTable() | ||||
|           if (response.data) { | ||||
|             this.filters.status = 'ACCEPTED' | ||||
|             this.$refs.table.refresh() | ||||
|             window.toastr['success'](this.$tc('estimates.marked_as_rejected_message')) | ||||
|           } | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     async onMarkAsRejected (id) { | ||||
|       const data = { | ||||
|         id: id | ||||
|       } | ||||
|       let response = await this.markAsRejected(data) | ||||
|       this.refreshTable() | ||||
|       if (response.data) { | ||||
|         this.filters.status = 'REJECTED' | ||||
|         this.$refs.table.refresh() | ||||
|         window.toastr['success'](this.$tc('estimates.marked_as_rejected_message')) | ||||
|       } | ||||
|       swal({ | ||||
|         title: this.$t('general.are_you_sure'), | ||||
|         text: this.$t('estimates.confirm_mark_as_rejected'), | ||||
|         icon: '/assets/icon/times-circle-solid.svg', | ||||
|         buttons: true, | ||||
|         dangerMode: true | ||||
|       }).then(async (markedAsRejected) => { | ||||
|         if (markedAsRejected) { | ||||
|           const data = { | ||||
|             id: id | ||||
|           } | ||||
|           let response = await this.markAsRejected(data) | ||||
|           this.refreshTable() | ||||
|           if (response.data) { | ||||
|             this.filters.status = 'REJECTED' | ||||
|             this.$refs.table.refresh() | ||||
|             window.toastr['success'](this.$tc('estimates.marked_as_rejected_message')) | ||||
|           } | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     setFilters () { | ||||
|       this.filtersApplied = true | ||||
| @ -470,7 +490,7 @@ export default { | ||||
|       swal({ | ||||
|         title: this.$t('general.are_you_sure'), | ||||
|         text: this.$tc('estimates.confirm_delete', 1), | ||||
|         icon: 'error', | ||||
|         icon: '/assets/icon/trash-solid.svg', | ||||
|         buttons: true, | ||||
|         dangerMode: true | ||||
|       }).then(async (willDelete) => { | ||||
| @ -491,11 +511,11 @@ export default { | ||||
|       swal({ | ||||
|         title: this.$t('general.are_you_sure'), | ||||
|         text: this.$t('estimates.confirm_conversion'), | ||||
|         icon: 'error', | ||||
|         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')) | ||||
| @ -510,7 +530,7 @@ export default { | ||||
|       swal({ | ||||
|         title: this.$t('general.are_you_sure'), | ||||
|         text: this.$tc('estimates.confirm_delete', 2), | ||||
|         icon: 'error', | ||||
|         icon: '/assets/icon/trash-solid.svg', | ||||
|         buttons: true, | ||||
|         dangerMode: true | ||||
|       }).then(async (willDelete) => { | ||||
| @ -536,24 +556,44 @@ export default { | ||||
|       this.refreshTable() | ||||
|     }, | ||||
|     async onMarkAsSent (id) { | ||||
|       const data = { | ||||
|         id: id | ||||
|       } | ||||
|       let response = await this.markAsSent(data) | ||||
|       this.refreshTable() | ||||
|       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) { | ||||
|           const data = { | ||||
|             id: id | ||||
|           } | ||||
|           let response = await this.markAsSent(data) | ||||
|           this.refreshTable() | ||||
|           if (response.data) { | ||||
|             window.toastr['success'](this.$tc('estimates.mark_as_sent')) | ||||
|           } | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     async sendEstimate (id) { | ||||
|       const data = { | ||||
|         id: id | ||||
|       } | ||||
|       let response = await this.sendEmail(data) | ||||
|       this.refreshTable() | ||||
|       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_send_estimate'), | ||||
|         icon: '/assets/icon/paper-plane-solid.svg', | ||||
|         buttons: true, | ||||
|         dangerMode: true | ||||
|       }).then(async (willSendEstimate) => { | ||||
|         if (willSendEstimate) { | ||||
|           const data = { | ||||
|             id: id | ||||
|           } | ||||
|           let response = await this.sendEmail(data) | ||||
|           this.refreshTable() | ||||
|           if (response.data) { | ||||
|             window.toastr['success'](this.$tc('estimates.mark_as_sent')) | ||||
|           } | ||||
|         } | ||||
|       }) | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -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) => { | ||||
|  | ||||
| @ -358,7 +358,7 @@ export default { | ||||
|       swal({ | ||||
|         title: this.$t('general.are_you_sure'), | ||||
|         text: this.$tc('expenses.confirm_delete'), | ||||
|         icon: 'error', | ||||
|         icon: '/assets/icon/trash-solid.svg', | ||||
|         buttons: true, | ||||
|         dangerMode: true | ||||
|       }).then(async (willDelete) => { | ||||
| @ -378,7 +378,7 @@ export default { | ||||
|       swal({ | ||||
|         title: this.$t('general.are_you_sure'), | ||||
|         text: this.$tc('expenses.confirm_delete', 2), | ||||
|         icon: 'error', | ||||
|         icon: '/assets/icon/trash-solid.svg', | ||||
|         buttons: true, | ||||
|         dangerMode: true | ||||
|       }).then(async (willDelete) => { | ||||
|  | ||||
| @ -247,13 +247,13 @@ | ||||
|                   {{ $t('invoices.view') }} | ||||
|                 </router-link> | ||||
|               </v-dropdown-item> | ||||
|               <v-dropdown-item> | ||||
|               <v-dropdown-item v-if="row.status == 'DRAFT'"> | ||||
|                 <a class="dropdown-item" href="#" @click="sendInvoice(row.id)" > | ||||
|                   <font-awesome-icon icon="paper-plane" class="dropdown-item-icon" /> | ||||
|                   {{ $t('invoices.send_invoice') }} | ||||
|                 </a> | ||||
|               </v-dropdown-item> | ||||
|               <v-dropdown-item v-if="row.status === 'DRAFT'"> | ||||
|               <v-dropdown-item v-if="row.status == 'DRAFT'"> | ||||
|                 <a class="dropdown-item" href="#" @click="sentInvoice(row.id)"> | ||||
|                   <font-awesome-icon icon="check-circle" class="dropdown-item-icon" /> | ||||
|                   {{ $t('invoices.mark_as_sent') }} | ||||
| @ -384,24 +384,44 @@ export default { | ||||
|       'fetchCustomers' | ||||
|     ]), | ||||
|     async sendInvoice (id) { | ||||
|       const data = { | ||||
|         id: id | ||||
|       } | ||||
|       let response = await this.sendEmail(data) | ||||
|       this.refreshTable() | ||||
|       if (response.data) { | ||||
|         window.toastr['success'](this.$tc('invoices.send_invoice')) | ||||
|       } | ||||
|       swal({ | ||||
|         title: this.$t('general.are_you_sure'), | ||||
|         text: this.$t('invoices.confirm_send'), | ||||
|         icon: '/assets/icon/paper-plane-solid.svg', | ||||
|         buttons: true, | ||||
|         dangerMode: true | ||||
|       }).then(async (Send_Invoice) => { | ||||
|         if (Send_Invoice) { | ||||
|           const data = { | ||||
|             id: id | ||||
|           } | ||||
|           let response = await this.sendEmail(data) | ||||
|           this.refreshTable() | ||||
|           if (response.data) { | ||||
|             window.toastr['success'](this.$tc('invoices.send_invoice')) | ||||
|           } | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     async sentInvoice (id) { | ||||
|       const data = { | ||||
|         id: id | ||||
|       } | ||||
|       let response = await this.markAsSent(data) | ||||
|       this.refreshTable() | ||||
|       if (response.data) { | ||||
|         window.toastr['success'](this.$tc('invoices.mark_as_sent')) | ||||
|       } | ||||
|       swal({ | ||||
|         title: this.$t('general.are_you_sure'), | ||||
|         text: this.$t('invoices.invoice_mark_as_sent'), | ||||
|         icon: '/assets/icon/check-circle-solid.svg', | ||||
|         buttons: true, | ||||
|         dangerMode: true | ||||
|       }).then(async (MarkAsSend_Invoice) => { | ||||
|         if (MarkAsSend_Invoice) { | ||||
|           const data = { | ||||
|             id: id | ||||
|           } | ||||
|           let response = await this.markAsSent(data) | ||||
|           this.refreshTable() | ||||
|           if (response.data) { | ||||
|             window.toastr['success'](this.$tc('invoices.mark_as_sent')) | ||||
|           } | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     getStatus (val) { | ||||
|       this.filters.status = { | ||||
| @ -476,7 +496,7 @@ export default { | ||||
|       swal({ | ||||
|         title: this.$t('general.are_you_sure'), | ||||
|         text: this.$tc('invoices.confirm_delete'), | ||||
|         icon: 'error', | ||||
|         icon: '/assets/icon/trash-solid.svg', | ||||
|         buttons: true, | ||||
|         dangerMode: true | ||||
|       }).then(async (willDelete) => { | ||||
| @ -506,7 +526,7 @@ export default { | ||||
|       swal({ | ||||
|         title: this.$t('general.are_you_sure'), | ||||
|         text: this.$tc('invoices.confirm_delete', 2), | ||||
|         icon: 'error', | ||||
|         icon: '/assets/icon/trash-solid.svg', | ||||
|         buttons: true, | ||||
|         dangerMode: true | ||||
|       }).then(async (willDelete) => { | ||||
|  | ||||
| @ -229,12 +229,22 @@ export default { | ||||
|       return true | ||||
|     }, | ||||
|     async onMarkAsSent () { | ||||
|       this.isRequestOnGoing = true | ||||
|       let response = await this.markAsSent({id: this.invoice.id}) | ||||
|       this.isRequestOnGoing = false | ||||
|       if (response.data) { | ||||
|         window.toastr['success'](this.$tc('invoices.marked_as_sent_message')) | ||||
|       } | ||||
|        swal({ | ||||
|         title: this.$t('general.are_you_sure'), | ||||
|         text: this.$t('invoices.invoice_mark_as_sent'), | ||||
|         icon: '/assets/icon/check-circle-solid.svg', | ||||
|         buttons: true, | ||||
|         dangerMode: true | ||||
|       }).then(async (MarkAsSend_Invoice) => { | ||||
|         if (MarkAsSend_Invoice) { | ||||
|           this.isRequestOnGoing = true | ||||
|           let response = await this.markAsSent({id: this.invoice.id}) | ||||
|           this.isRequestOnGoing = false | ||||
|           if (response.data) { | ||||
|             window.toastr['success'](this.$tc('invoices.marked_as_sent_message')) | ||||
|           } | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     async removeInvoice (id) { | ||||
|       this.selectInvoice([parseInt(id)]) | ||||
| @ -242,7 +252,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) => { | ||||
|  | ||||
| @ -362,7 +362,7 @@ export default { | ||||
|       swal({ | ||||
|         title: this.$t('general.are_you_sure'), | ||||
|         text: this.$tc('items.confirm_delete'), | ||||
|         icon: 'error', | ||||
|         icon: '/assets/icon/trash-solid.svg', | ||||
|         buttons: true, | ||||
|         dangerMode: true | ||||
|       }).then(async (willDelete) => { | ||||
| @ -388,7 +388,7 @@ export default { | ||||
|       swal({ | ||||
|         title: this.$t('general.are_you_sure'), | ||||
|         text: this.$tc('items.confirm_delete', 2), | ||||
|         icon: 'error', | ||||
|         icon: '/assets/icon/trash-solid.svg', | ||||
|         buttons: true, | ||||
|         dangerMode: true | ||||
|       }).then(async (willDelete) => { | ||||
|  | ||||
| @ -101,7 +101,6 @@ | ||||
|                 </div> | ||||
|                 <div v-if="$v.formData.amount.$error"> | ||||
|                   <span v-if="!$v.formData.amount.required" class="text-danger">{{ $t('validation.required') }}</span> | ||||
|                   <span v-if="!$v.formData.amount.numeric" class="text-danger">{{ $t('validation.numbers_only') }}</span> | ||||
|                   <span v-if="!$v.formData.amount.between && $v.formData.amount.numeric && amount <= 0" class="text-danger">{{ $t('validation.payment_greater_than_zero') }}</span> | ||||
|                   <span v-if="!$v.formData.amount.between && amount > 0" class="text-danger">{{ $t('validation.payment_greater_than_due_amount') }}</span> | ||||
|                 </div> | ||||
| @ -156,7 +155,7 @@ import { mapActions, mapGetters } from 'vuex' | ||||
| import MultiSelect from 'vue-multiselect' | ||||
| import { validationMixin } from 'vuelidate' | ||||
| import moment from 'moment' | ||||
| const { required, numeric, between, maxLength } = require('vuelidate/lib/validators') | ||||
| const { required, between, maxLength } = require('vuelidate/lib/validators') | ||||
|  | ||||
| export default { | ||||
|   components: { MultiSelect }, | ||||
| @ -201,7 +200,6 @@ export default { | ||||
|         }, | ||||
|         amount: { | ||||
|           required, | ||||
|           numeric, | ||||
|           between: between(1, this.maxPayableAmount + 1) | ||||
|         }, | ||||
|         notes: { | ||||
|  | ||||
| @ -368,7 +368,7 @@ export default { | ||||
|       swal({ | ||||
|         title: this.$t('general.are_you_sure'), | ||||
|         text: this.$tc('payments.confirm_delete'), | ||||
|         icon: 'error', | ||||
|         icon: '/assets/icon/trash-solid.svg', | ||||
|         buttons: true, | ||||
|         dangerMode: true | ||||
|       }).then(async (willDelete) => { | ||||
| @ -388,7 +388,7 @@ export default { | ||||
|       swal({ | ||||
|         title: this.$t('general.are_you_sure'), | ||||
|         text: this.$tc('payments.confirm_delete', 2), | ||||
|         icon: 'error', | ||||
|         icon: '/assets/icon/trash-solid.svg', | ||||
|         buttons: true, | ||||
|         dangerMode: true | ||||
|       }).then(async (willDelete) => { | ||||
|  | ||||
| @ -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) | ||||
|  | ||||
| @ -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) | ||||
|  | ||||
| @ -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')}` | ||||
|  | ||||
| @ -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) | ||||
|  | ||||
| @ -101,13 +101,23 @@ export default { | ||||
|       'deleteCategory' | ||||
|     ]), | ||||
|     async removeExpenseCategory (id, index) { | ||||
|       let response = await this.deleteCategory(id) | ||||
|       if (response.data.success) { | ||||
|         window.toastr['success'](this.$tc('settings.expense_category.deleted_message')) | ||||
|         this.id = null | ||||
|         this.$refs.table.refresh() | ||||
|         return true | ||||
|       } window.toastr['success'](this.$t('settings.expense_category.already_in_use')) | ||||
|       swal({ | ||||
|         title: this.$t('general.are_you_sure'), | ||||
|         text: this.$t('settings.expense_category.confirm_delete'), | ||||
|         icon: '/assets/icon/trash-solid.svg', | ||||
|         buttons: true, | ||||
|         dangerMode: true | ||||
|       }).then(async (willDelete) => { | ||||
|         if (willDelete) { | ||||
|           let response = await this.deleteCategory(id) | ||||
|           if (response.data.success) { | ||||
|             window.toastr['success'](this.$tc('settings.expense_category.deleted_message')) | ||||
|             this.id = null | ||||
|             this.$refs.table.refresh() | ||||
|             return true | ||||
|           } window.toastr['error'](this.$t('settings.expense_category.already_in_use')) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     openCategoryModal () { | ||||
|       this.openModal({ | ||||
|  | ||||
| @ -8,7 +8,7 @@ | ||||
|         </p> | ||||
|       </div> | ||||
|       <form action="" @submit.prevent="saveEmailConfig()"> | ||||
|         <div class="row my-2 mt-5"> | ||||
|         <div class="row"> | ||||
|           <div class="col-md-6 my-2"> | ||||
|             <label class="form-label">{{ $t('settings.mail.driver') }}</label> | ||||
|             <span class="text-danger"> *</span> | ||||
| @ -117,7 +117,7 @@ | ||||
|         </div> | ||||
|         <base-button | ||||
|           :loading="loading" | ||||
|           class="pull-right mt-5" | ||||
|           class="pull-right mt-4" | ||||
|           icon="save" | ||||
|           color="theme" | ||||
|           type="submit" | ||||
|  | ||||
| @ -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"> | ||||
|               {{ row.name }} | ||||
|             </span> | ||||
|           </template> | ||||
|         </table-column> | ||||
|           show="name" | ||||
|         /> | ||||
|         <table-column | ||||
|           :sortable="true" | ||||
|           :filterable="true" | ||||
| @ -159,13 +152,23 @@ export default { | ||||
|       } | ||||
|     }, | ||||
|     async removeTax (id, index) { | ||||
|       let response = await this.deleteTaxType(id) | ||||
|       if (response.data.success) { | ||||
|         window.toastr['success'](this.$t('settings.tax_types.deleted_message')) | ||||
|         this.id = null | ||||
|         this.$refs.table.refresh() | ||||
|         return true | ||||
|       }window.toastr['success'](this.$t('settings.tax_types.already_in_use')) | ||||
|       swal({ | ||||
|         title: this.$t('general.are_you_sure'), | ||||
|         text: this.$t('settings.tax_types.confirm_delete'), | ||||
|         icon: '/assets/icon/trash-solid.svg', | ||||
|         buttons: true, | ||||
|         dangerMode: true | ||||
|       }).then(async (willDelete) => { | ||||
|         if (willDelete) { | ||||
|           let response = await this.deleteTaxType(id) | ||||
|           if (response.data.success) { | ||||
|             window.toastr['success'](this.$t('settings.tax_types.deleted_message')) | ||||
|             this.id = null | ||||
|             this.$refs.table.refresh() | ||||
|             return true | ||||
|           }window.toastr['error'](this.$t('settings.tax_types.already_in_use')) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     openTaxModal () { | ||||
|       this.openModal({ | ||||
|  | ||||
							
								
								
									
										55
									
								
								resources/assets/js/views/settings/UpdateApp.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								resources/assets/js/views/settings/UpdateApp.vue
									
									
									
									
									
										Normal 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> | ||||
| @ -43,6 +43,9 @@ | ||||
|               type="password" | ||||
|               @input="$v.formData.password.$touch()" | ||||
|             /> | ||||
|             <div v-if="$v.formData.password.$error"> | ||||
|               <span v-if="!$v.formData.password.minLength" class="text-danger"> {{ $tc('validation.password_min_length', $v.formData.password.$params.minLength.min, {count: $v.formData.password.$params.minLength.min}) }} </span> | ||||
|             </div> | ||||
|           </div> | ||||
|           <div class="col-md-6 mb-4 form-group"> | ||||
|             <label class="input-label">{{ $tc('settings.account_settings.confirm_password') }}</label> | ||||
| @ -78,7 +81,7 @@ | ||||
| <script> | ||||
| import { validationMixin } from 'vuelidate' | ||||
| import { mapActions } from 'vuex' | ||||
| const { required, requiredIf, sameAs, email } = require('vuelidate/lib/validators') | ||||
| const { required, requiredIf, sameAs, email, minLength } = require('vuelidate/lib/validators') | ||||
|  | ||||
| export default { | ||||
|   mixins: [validationMixin], | ||||
| @ -103,6 +106,7 @@ export default { | ||||
|         email | ||||
|       }, | ||||
|       password: { | ||||
|         minLength: minLength(5) | ||||
|       }, | ||||
|       confirm_password: { | ||||
|         required: requiredIf('isRequired'), | ||||
|  | ||||
| @ -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' | ||||
|         } | ||||
|       ] | ||||
|     } | ||||
|  | ||||
| @ -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) | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|  | ||||
| @ -45,6 +45,7 @@ | ||||
|           /> | ||||
|           <div v-if="$v.profileData.password.$error"> | ||||
|             <span v-if="!$v.profileData.password.required" class="text-danger">{{ $tc('validation.required') }}</span> | ||||
|             <span v-if="!$v.profileData.password.minLength" class="text-danger"> {{ $tc('validation.password_min_length', $v.profileData.password.$params.minLength.min, {count: $v.profileData.password.$params.minLength.min}) }} </span> | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="col-md-6"> | ||||
| @ -106,7 +107,8 @@ export default { | ||||
|         required | ||||
|       }, | ||||
|       password: { | ||||
|         required | ||||
|         required, | ||||
|         minLength: minLength(5) | ||||
|       }, | ||||
|       confirm_password: { | ||||
|         required: requiredIf('isRequired'), | ||||
|  | ||||
| @ -52,6 +52,7 @@ import { | ||||
|   faCopy, | ||||
|   faPaperPlane, | ||||
|   faEyeSlash | ||||
|   faSyncAlt | ||||
| } from '@fortawesome/free-solid-svg-icons' | ||||
| import { far } from '@fortawesome/free-regular-svg-icons' | ||||
| import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome' | ||||
| @ -113,7 +114,8 @@ library.add( | ||||
|   faShare, | ||||
|   faEllipsisH, | ||||
|   faCopy, | ||||
|   faPaperPlane | ||||
|   faPaperPlane, | ||||
|   faSyncAlt | ||||
| ) | ||||
|  | ||||
| Vue.component('font-awesome-icon', FontAwesomeIcon) | ||||
|  | ||||
							
								
								
									
										4
									
								
								resources/assets/sass/base.scss
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								resources/assets/sass/base.scss
									
									
									
									
										vendored
									
									
								
							| @ -111,3 +111,7 @@ code, .code { | ||||
|     justify-content: center; | ||||
|     align-items: center; | ||||
| } | ||||
|  | ||||
| .swal-icon--custom { | ||||
|     height: 70px !important; | ||||
| } | ||||
|  | ||||
| @ -1,6 +1,7 @@ | ||||
| fieldset[disabled] .multiselect { | ||||
|     pointer-events: none; | ||||
| } | ||||
|  | ||||
| .in-valid { | ||||
|     border: 1px solid $ls-color-red !important; | ||||
| } | ||||
| @ -18,6 +19,7 @@ fieldset[disabled] .multiselect { | ||||
|     background: #fff; | ||||
|     display: block; | ||||
| } | ||||
|  | ||||
| .multiselect__spinner:before, | ||||
| .multiselect__spinner:after { | ||||
|     position: absolute; | ||||
| @ -33,23 +35,28 @@ fieldset[disabled] .multiselect { | ||||
|     border-width: 2px; | ||||
|     box-shadow: 0 0 0 1px transparent; | ||||
| } | ||||
|  | ||||
| .multiselect__spinner:before { | ||||
|     animation: spinning 2.4s cubic-bezier(0.41, 0.26, 0.2, 0.62); | ||||
|     animation-iteration-count: infinite; | ||||
| } | ||||
|  | ||||
| .multiselect__spinner:after { | ||||
|     animation: spinning 2.4s cubic-bezier(0.51, 0.09, 0.21, 0.8); | ||||
|     animation-iteration-count: infinite; | ||||
| } | ||||
|  | ||||
| .multiselect__loading-enter-active, | ||||
| .multiselect__loading-leave-active { | ||||
|     transition: opacity 0.4s ease-in-out; | ||||
|     opacity: 1; | ||||
| } | ||||
|  | ||||
| .multiselect__loading-enter, | ||||
| .multiselect__loading-leave-active { | ||||
|     opacity: 0; | ||||
| } | ||||
|  | ||||
| .multiselect, | ||||
| .multiselect__input, | ||||
| .multiselect__single { | ||||
| @ -57,34 +64,41 @@ fieldset[disabled] .multiselect { | ||||
|     font-size: 14px; | ||||
|     touch-action: manipulation; | ||||
| } | ||||
|  | ||||
| .multiselect { | ||||
|     box-sizing: content-box; | ||||
|     display: block; | ||||
|     position: relative; | ||||
|     width: 100%; | ||||
|     min-height: 45px; | ||||
|     min-height: 40px; | ||||
|     text-align: left; | ||||
|     color: #35495e; | ||||
| } | ||||
|  | ||||
| .multiselect * { | ||||
|     box-sizing: border-box; | ||||
| } | ||||
|  | ||||
| .multiselect:focus { | ||||
|     border: 1px solid #817ae3 !important; | ||||
| } | ||||
|  | ||||
| .multiselect--disabled { | ||||
|     pointer-events: none; | ||||
|     opacity: 0.6; | ||||
| } | ||||
|  | ||||
| .multiselect--active { | ||||
|     z-index: 50; | ||||
| } | ||||
|  | ||||
| .multiselect--active:not(.multiselect--above) .multiselect__current, | ||||
| .multiselect--active:not(.multiselect--above) .multiselect__input, | ||||
| .multiselect--active:not(.multiselect--above) .multiselect__tags { | ||||
|     border-bottom-left-radius: 0; | ||||
|     border-bottom-right-radius: 0; | ||||
| } | ||||
|  | ||||
| .multiselect--active .multiselect__select { | ||||
|     transform: rotateZ(180deg); | ||||
| } | ||||
| @ -94,6 +108,7 @@ fieldset[disabled] .multiselect { | ||||
|     border-top-left-radius: 0; | ||||
|     border-top-right-radius: 0; | ||||
| } | ||||
|  | ||||
| .multiselect__input, | ||||
| .multiselect__single { | ||||
|     position: relative; | ||||
| @ -110,9 +125,11 @@ fieldset[disabled] .multiselect { | ||||
|     // margin-bottom: 8px; | ||||
|     vertical-align: top; | ||||
| } | ||||
|  | ||||
| .multiselect__input::placeholder { | ||||
|     color: $ls-color-gray; | ||||
| } | ||||
|  | ||||
| .multiselect__tag ~ .multiselect__input, | ||||
| .multiselect__tag ~ .multiselect__single { | ||||
|     width: auto; | ||||
| @ -345,68 +362,85 @@ fieldset[disabled] .multiselect { | ||||
|     cursor: text; | ||||
|     pointer-events: none; | ||||
| } | ||||
|  | ||||
| .multiselect__option--group { | ||||
|     background: #ededed; | ||||
|     color: #35495e; | ||||
| } | ||||
|  | ||||
| .multiselect__option--group.multiselect__option--highlight { | ||||
|     background: #35495e; | ||||
|     color: #fff; | ||||
| } | ||||
|  | ||||
| .multiselect__option--group.multiselect__option--highlight:after { | ||||
|     background: #35495e; | ||||
| } | ||||
|  | ||||
| .multiselect__option--disabled.multiselect__option--highlight { | ||||
|     background: #dedede; | ||||
| } | ||||
|  | ||||
| .multiselect__option--group-selected.multiselect__option--highlight { | ||||
|     background: #ff6a6a; | ||||
|     color: #fff; | ||||
| } | ||||
|  | ||||
| .multiselect__option--group-selected.multiselect__option--highlight:after { | ||||
|     background: #ff6a6a; | ||||
|     content: attr(data-deselect); | ||||
|     color: #fff; | ||||
| } | ||||
|  | ||||
| .multiselect-enter-active, | ||||
| .multiselect-leave-active { | ||||
|     transition: all 0.15s ease; | ||||
| } | ||||
|  | ||||
| .multiselect-enter, | ||||
| .multiselect-leave-active { | ||||
|     opacity: 0; | ||||
| } | ||||
|  | ||||
| .multiselect__strong { | ||||
|     margin-bottom: 8px; | ||||
|     line-height: 20px; | ||||
|     display: inline-block; | ||||
|     vertical-align: top; | ||||
| } | ||||
|  | ||||
| *[dir="rtl"] .multiselect { | ||||
|     text-align: right; | ||||
| } | ||||
|  | ||||
| *[dir="rtl"] .multiselect__select { | ||||
|     right: auto; | ||||
|     left: 1px; | ||||
| } | ||||
|  | ||||
| *[dir="rtl"] .multiselect__tags { | ||||
|     padding: 8px 8px 0px 40px; | ||||
| } | ||||
|  | ||||
| *[dir="rtl"] .multiselect__content { | ||||
|     text-align: right; | ||||
| } | ||||
|  | ||||
| *[dir="rtl"] .multiselect__option:after { | ||||
|     right: auto; | ||||
|     left: 0; | ||||
| } | ||||
|  | ||||
| *[dir="rtl"] .multiselect__clear { | ||||
|     right: auto; | ||||
|     left: 12px; | ||||
| } | ||||
|  | ||||
| *[dir="rtl"] .multiselect__spinner { | ||||
|     right: auto; | ||||
|     left: 1px; | ||||
| } | ||||
|  | ||||
| @keyframes spinning { | ||||
|     from { | ||||
|         transform: rotate(0); | ||||
| @ -417,6 +451,7 @@ fieldset[disabled] .multiselect { | ||||
| } | ||||
|  | ||||
| .multiselect { | ||||
|  | ||||
|     .multiselect__option--highlight { | ||||
|         background: $ls-color-primary; | ||||
|         color: $ls-color-black; | ||||
| @ -459,6 +494,7 @@ fieldset[disabled] .multiselect { | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     &.error { | ||||
|         border: 1px solid $ls-color-red; | ||||
|         border-radius: 5px; | ||||
|  | ||||
							
								
								
									
										3
									
								
								resources/assets/sass/pages/customers.scss
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								resources/assets/sass/pages/customers.scss
									
									
									
									
										vendored
									
									
								
							| @ -27,8 +27,6 @@ | ||||
|  | ||||
|     .same-address-checkbox-container { | ||||
|         display: flex; | ||||
|         justify-content: flex-end; | ||||
|         padding-left: 12px; | ||||
|         margin-bottom: 1.5rem; | ||||
|         align-items: center; | ||||
|         justify-content: flex-end; | ||||
| @ -97,7 +95,6 @@ | ||||
|         .same-address-checkbox-container { | ||||
|             display: flex; | ||||
|             justify-content: flex-start; | ||||
|             padding-left: 15px; | ||||
|             margin-bottom: 0rem; | ||||
|         } | ||||
|  | ||||
|  | ||||
							
								
								
									
										19
									
								
								resources/assets/sass/pages/dashboard.scss
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								resources/assets/sass/pages/dashboard.scss
									
									
									
									
										vendored
									
									
								
							| @ -1,6 +1,23 @@ | ||||
| // Dashboard | ||||
| // ------------------------- | ||||
|  | ||||
| .dashboard { | ||||
|  | ||||
|     .dashboard-table | ||||
|     .table-component { | ||||
|  | ||||
|         .dashboard-recent-invoice-options { | ||||
|  | ||||
|             .dropdown-container { | ||||
|                 margin: 10px 5px 0 -75px; | ||||
|             } | ||||
|  | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| .dashbox { | ||||
|     background-color: $white; | ||||
|     box-shadow: $shadow; | ||||
| @ -364,5 +381,7 @@ | ||||
|                 justify-content: center; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| @ -38,7 +38,7 @@ | ||||
|     } | ||||
|  | ||||
|     .filter-date { | ||||
|         flex: 1; | ||||
|         flex: 2; | ||||
|         display: flex; | ||||
|         margin-right: 40px; | ||||
|         align-items: center; | ||||
| @ -60,7 +60,7 @@ | ||||
|         margin-top: 28px; | ||||
|     } | ||||
|  | ||||
|     @media(max-width: $medium-breakpoint ) { | ||||
|     @media(max-width: $large-breakpoint ) { | ||||
|         .filter-container { | ||||
|             flex-direction: column; | ||||
|         } | ||||
|  | ||||
| @ -490,7 +490,7 @@ | ||||
|             font-weight: 300; | ||||
|             font-size: 12px; | ||||
|             padding-top: 2px; | ||||
|             padding-left: 10px; | ||||
|             // padding-left: 10px; | ||||
|  | ||||
|             textarea { | ||||
|  | ||||
| @ -504,6 +504,7 @@ | ||||
|                 border: none; | ||||
|                 resize: none; | ||||
|                 width: 100%; | ||||
|                 padding-left: 11px; | ||||
|                 color: $ls-color-gray--very-dark; | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @ -33,7 +33,7 @@ | ||||
|     } | ||||
|  | ||||
|     .filter-date { | ||||
|         flex: 1; | ||||
|         flex: 2; | ||||
|         display: flex; | ||||
|         margin-right: 40px; | ||||
|         align-items: center; | ||||
| @ -55,7 +55,7 @@ | ||||
|         margin-top: 28px; | ||||
|     } | ||||
|  | ||||
|     @media(max-width: $medium-breakpoint ) { | ||||
|     @media(max-width: $large-breakpoint ) { | ||||
|         .filter-container { | ||||
|             flex-direction: column; | ||||
|         } | ||||
|  | ||||
							
								
								
									
										3
									
								
								resources/assets/sass/pages/wizard.scss
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								resources/assets/sass/pages/wizard.scss
									
									
									
									
										vendored
									
									
								
							| @ -98,6 +98,9 @@ | ||||
|                 border-radius: 50%; | ||||
|                 height: 21px; | ||||
|                 width: 21px; | ||||
|                 display: flex; | ||||
|                 align-items: center; | ||||
|                 justify-content: center; | ||||
|  | ||||
|                 .icon-check { | ||||
|                     font-style: normal; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user