Update ReadME

This commit is contained in:
David Bomba 2022-11-16 18:19:39 +11:00
parent 72481481fe
commit 9b1ad2794e
2 changed files with 66 additions and 63 deletions

View File

@ -18,18 +18,34 @@ Just make sure to add the `invoice-ninja` tag to your question.
Version 5 of Invoice Ninja is here! We've taken the best parts of version 4 and bolted on all of the most requested features to produce a invoicing application like no other.
The new interface has a lot more functionality so it isn't a carbon copy of v4, but once you get used to the new layout and functionality we are sure you will love it!
All Pro and Enterprise features from the hosted app are included in the open-code. We offer a $30 per year white-label license to remove the Invoice Ninja branding from client facing parts of the app.
## Referral Program
* Earn 50% of Pro & Enterprise Plans up to 4 years - [Learn more](https://www.invoiceninja.com/referral-program/)
* [Videos](https://www.youtube.com/@appinvoiceninja)
* [API Documentation](https://app.swaggerhub.com/apis/invoiceninja/invoiceninja)
* [APP Documentation](https://invoiceninja.github.io/)
* [Support Forum](https://forum.invoiceninja.com)
* [StackOverflow](https://stackoverflow.com/tags/invoice-ninja/)
## Mobile App
* [iPhone](https://apps.apple.com/us/app/invoice-ninja-v5/id1503970375#?platform=iphone)
* [Android](https://play.google.com/store/apps/details?id=com.invoiceninja.app)
* [Linux](https://github.com/invoiceninja/flutter-mobile)
## Desktop App
* [MacOS](https://apps.apple.com/app/id1503970375)
* [Windows](https://microsoft.com/en-us/p/invoice-ninja/9n3f2bbcfdr6)
* [MacOS Desktop](https://snapcraft.io/invoiceninja)
## Installation Options
* [Docker File](https://hub.docker.com/r/invoiceninja/invoiceninja/)
* [Cloudron](https://cloudron.io/store/com.invoiceninja.cloudronapp.html)
* [Softaculous](https://www.softaculous.com/apps/ecommerce/Invoice_Ninja)
## Recommended Providers
* [Stripe](https://stripe.com/)
* [Postmark](https://postmarkapp.com/)
## Development
* [API Documentation](https://app.swaggerhub.com/apis/invoiceninja/invoiceninja)
* [APP Documentation](https://invoiceninja.github.io/)
## Quick Start
@ -67,30 +83,6 @@ user: user@example.com
pass: password
```
## Contribution guide.
Code Style to follow [PSR-2](https://www.php-fig.org/psr/psr-2/) standards.
All methods names to be in CamelCase
All variables names to be in snake_case
Where practical code should be strongly typed, ie your methods must return a type ie
`public function doThis() : void`
PHP >= 7.3 allows the return type Nullable so there should be no circumstance a type cannot be return by using the following:
`public function doThat() ?:string`
To improve chances of PRs being merged please include tests to ensure your code works well and integrates with the rest of the project.
## Documentation
API documentation is hosted using Swagger and can be found [HERE](https://app.swaggerhub.com/apis/invoiceninja/invoiceninja)
Installation, Configuration and Troubleshooting documentation can be found [HERE] (https://invoiceninja.github.io)
## Credits
* [Hillel Coren](https://hillelcoren.com/)
* [David Bomba](https://github.com/turbo124)

View File

@ -15,7 +15,7 @@
zoom: 80%;
}
html {
html {
margin: 0;
padding-top: 1rem;
padding-left: 4rem;
@ -167,13 +167,13 @@
#entity-details {
text-align: left;
width: 100%;
text-align: left;
width: 100%;
}
#entity-details th {
font-weight:normal;
line-height: 1.5rem;
font-weight:normal;
line-height: 1.5rem;
}
#table-totals
@ -224,37 +224,36 @@
white-space: nowrap;
}
/** .repeating-header,
.repeating-header-space, **/
.repeating-footer,
.repeating-footer-space {
height: 150px;
}
.repeating-header {
position: fixed;
top: 0;
}
.repeating-footer {
position: fixed;
bottom: 0;
}
#header {
position: fixed;
top: 0;
}
#header {
position: fixed;
top: 0;
}
#footer {
position: fixed;
bottom: 0;
border-top: 1px solid #000;
width: 82%;
min-height:100px;
padding-top: 0.5rem;
margin-top: 40px;
}
#footer {
position: fixed;
bottom: 0;
border-top: 1px solid #000;
width: 82%;
min-height:100px;
padding-top: 0.5rem;
margin-top: 40px;
}
[data-element='product_table-product.description-td'], td {
min-width:100%;
@ -262,6 +261,8 @@
overflow-wrap: break-word;
}
[data-ref="total_table-public_notes"] { font-weight: normal; }
/** Useful snippets, uncomment to enable. **/
/** Hide company logo **/
@ -273,9 +274,6 @@
/* Hide company address */
/* #company-address > * { display: none } */
/* Hide public notes */
[data-ref="total_table-public_notes"] { font-weight: normal; }
/* Hide terms label */
/* [data-ref="total_table-terms-label"] { display: none } */
@ -318,7 +316,7 @@
<div id="vendor-details"></div>
<div>
<p class="entity-label" style="font-size:32px; color:#0096FF;">$entity_label</p>
<p class="entity-label" style="font-size:32px; color:$primary_color;">$entity_label</p>
<table id="entity-details" cellspacing="0" dir="ltr"></table>
</div>
</div>
@ -372,12 +370,25 @@
</script>
</div>
</div>
<script>
document.querySelectorAll('#statement-invoice-table > thead > tr > th, #statement-payment-table > thead > tr > th, #statement-aging-table > thead > tr > th').forEach(t => {
t.hidden = false;
});
</script>
<script>
document.addEventListener("DOMContentLoaded",function(){document.querySelectorAll("#product-table > tbody > tr > td, #task-table > tbody > tr > td, #delivery-note-table > tbody > tr > td").forEach(t=>{if(""!==t.innerText){let e=t.getAttribute("data-ref").slice(0,-3);document.querySelector(`th[data-ref="${e}-th"]`).removeAttribute("hidden")}}),document.querySelectorAll("#product-table > tbody > tr > td, #task-table > tbody > tr > td, #delivery-note-table > tbody > tr > td").forEach(t=>{let e=t.getAttribute("data-ref").slice(0,-3);(e=document.querySelector(`th[data-ref="${e}-th"]`)).hasAttribute("hidden")&&""==t.innerText&&t.setAttribute("hidden","true")})},!1);</script><script>document.addEventListener("DOMContentLoaded",function(){document.querySelectorAll(`[data-state="encoded-html"]`).forEach(e=>e.innerHTML=e.innerText)},!1);
</script>
<script>
// Clear up space a bit, if [product-table, tasks-table, delivery-note-table] isn't present.
document.addEventListener('DOMContentLoaded', () => {
let tables = [
'product-table', 'task-table', 'delivery-note-table',
'statement-invoice-table', 'statement-payment-table', 'statement-aging-table-totals',
'statement-invoice-table-totals', 'statement-payment-table-totals', 'statement-aging-table',
'client-details','vendor-details', 'swiss-qr'
];
tables.forEach((tableIdentifier) => {
console.log(document.getElementById(tableIdentifier));
document.getElementById(tableIdentifier)?.childElementCount === 0
? document.getElementById(tableIdentifier).style.setProperty('display', 'none', 'important')
: '';
});
});
</script>
</div>