Compare commits

...

5 Commits

Author SHA1 Message Date
0d606c1afa feat: make late fee optional + don't include logo placeholder and empty client in the PDF (#31)
* fix: don't include the placeholder logo in PDF

* feat: make late fee optional

* fix: don't include the empty Client text in PDF
2025-09-27 02:47:47 +02:00
03eb7adece Update README.md 2024-12-02 11:54:38 +02:00
c9f54971f2 Merge remote-tracking branch 'origin/main' into main 2024-12-02 10:41:04 +02:00
2b5f3fc6b7 Fix urls. 2024-12-02 10:40:45 +02:00
32e982baea Fix urls. 2024-12-02 10:38:03 +02:00
7 changed files with 15 additions and 16 deletions

View File

@ -9,7 +9,7 @@ It is open-source and easily extendable. You can use it as a starter kit for mor
Run it locally or host it yourself. Run it locally or host it yourself.
You can always use the latest free version at [invoices.mokuapp.io](https://invoices.mokuapp.io) You can always use the latest free version at [invoices.elevate.ee](https://invoices.elevate.ee)
Built with [Vue.js](https://vuejs.org/) and [Bootstrap](https://getbootstrap.com/) Built with [Vue.js](https://vuejs.org/) and [Bootstrap](https://getbootstrap.com/)
@ -35,7 +35,7 @@ Built with [Vue.js](https://vuejs.org/) and [Bootstrap](https://getbootstrap.com
- Multilingual - Multilingual
- PWA support - PWA support
- Ready-to-go backend adapters - Ready-to-go backend adapters
- [Browser Storage](https://invoices.mokuapp.io) - [Browser Storage](https://invoices.elevate.ee)
- [Wordpress](https://wordpress.org/plugins/beautiful-custom-invoices/) - [Wordpress](https://wordpress.org/plugins/beautiful-custom-invoices/)
- Woocommerce (coming soon) - Woocommerce (coming soon)
- Google Drive (coming soon) - Google Drive (coming soon)

View File

@ -5,7 +5,7 @@
ref="button" ref="button"
:tabindex="tabindex" :tabindex="tabindex"
@click="toggleOpen"> @click="toggleOpen">
<span v-if="!value">{{ $t('client') }}</span> <span v-if="!value" class="d-print-none">{{ $t('client') }}</span>
<span v-else>{{ value }}</span> <span v-else>{{ value }}</span>
</div> </div>
<div class="search-popover__overlay" v-if="isOpen" @click="toggleOpen"></div> <div class="search-popover__overlay" v-if="isOpen" @click="toggleOpen"></div>

View File

@ -37,13 +37,15 @@
:inline="true" :inline="true"
field="due_at"/> field="due_at"/>
</BModal> </BModal>
<br>{{ $t('late_fee') }} <span :class="{'d-print-none': !invoice.late_fee}">
<AppEditable :value="invoice.late_fee | currency" <br>{{ $t('late_fee') }}
:errors="errors" <AppEditable :value="invoice.late_fee | currency"
suffix="%" :errors="errors"
field="late_fee" suffix="%"
:placeholder="$t('add_late_fee')" field="late_fee"
@change="updateProp({ late_fee: $event })"/> :placeholder="$t('add_late_fee')"
@change="updateProp({ late_fee: $event })"/>
</span>
</div> </div>
</template> </template>
<script> <script>

View File

@ -4,7 +4,7 @@
class="pointer" class="pointer"
@click="openModal" @click="openModal"
:src="team.logo_url" style="width:100%; max-width:200px;"> :src="team.logo_url" style="width:100%; max-width:200px;">
<button class="btn btn-sm" @click="openModal" v-else> <button class="btn btn-sm d-print-none" @click="openModal" v-else>
<i class="material-icons material-icons-round md-36">file_upload</i> <i class="material-icons material-icons-round md-36">file_upload</i>
</button> </button>
<AppError :errors="errors" field="logo_url"/> <AppError :errors="errors" field="logo_url"/>

View File

@ -3,7 +3,7 @@
export default { export default {
storageType: 'local', storageType: 'local',
// base_url: wordpress.front_url, // base_url: wordpress.front_url,
// base_url: `${window.location.origin}${process.env.BASE_URL}` // base_url: process.env.BASE_URL
// api_url: wordpress.api_url, // api_url: wordpress.api_url,
// api_nonce: wordpress.nonce, // api_nonce: wordpress.nonce,
}; };

View File

@ -4,7 +4,6 @@ import VueI18Next from '@panter/vue-i18next';
import Backend from 'i18next-http-backend'; import Backend from 'i18next-http-backend';
import LanguageDetector from 'i18next-browser-languagedetector'; import LanguageDetector from 'i18next-browser-languagedetector';
import app from '@/main'; import app from '@/main';
import config from '@/config/app.config';
Vue.use(VueI18Next); Vue.use(VueI18Next);
@ -16,7 +15,7 @@ const initialized = i18next.init({
fallbackLng: 'en', fallbackLng: 'en',
whitelist: ['en', 'de', 'fr', 'et', 'fa', 'bn', 'es', 'pt_br', 'it', 'id', 'kr'], whitelist: ['en', 'de', 'fr', 'et', 'fa', 'bn', 'es', 'pt_br', 'it', 'id', 'kr'],
backend: { backend: {
loadPath: `${config.base_url || ''}/locales/{{lng}}/{{ns}}.json`, loadPath: `${window.location.origin}/locales/{{lng}}/{{ns}}.json`,
}, },
detection: { detection: {
order: ['querystring', 'path', 'localStorage', 'navigator'], order: ['querystring', 'path', 'localStorage', 'navigator'],

View File

@ -19,7 +19,6 @@ class InvoiceService {
async updateInvoice(invoice) { async updateInvoice(invoice) {
const requiredFields = { const requiredFields = {
currency: 'Currency', currency: 'Currency',
late_fee: 'Late Fee',
issued_at: 'Issued At', issued_at: 'Issued At',
due_at: 'Due At', due_at: 'Due At',
number: 'Number', number: 'Number',
@ -40,7 +39,6 @@ class InvoiceService {
async bookInvoice(invoice) { async bookInvoice(invoice) {
const requiredFields = { const requiredFields = {
currency: 'Currency', currency: 'Currency',
late_fee: 'Late fee',
issued_at: 'Issued at', issued_at: 'Issued at',
due_at: 'Due at', due_at: 'Due at',
number: 'Number', number: 'Number',