Compare commits

..

7 Commits

Author SHA1 Message Date
462d0bb66e increased padding of bottom on tiny screens
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2025-12-04 22:30:08 +01:00
56b79e1ecf minor CSS improvement
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2025-12-04 21:48:13 +01:00
72cb91f865 bugfix
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2025-12-04 21:05:36 +01:00
3833f2f978 css improvement, coping to other themes
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2025-12-04 20:54:01 +01:00
5e0b59bacf CSS improvement
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2025-12-04 20:44:54 +01:00
55f5a663fe improving main menu for mobile devices
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2025-12-04 20:18:21 +01:00
8197a0796c implemented live price update in document view
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2025-12-03 21:50:57 +01:00
8 changed files with 203 additions and 6 deletions

View File

@@ -10,6 +10,7 @@ import TimeRecorder from './TimeRecorder.svelte';
let key = $state(null); let key = $state(null);
const router = useTinyRouter(); const router = useTinyRouter();
const modules = $state([]); const modules = $state([]);
let expand = $state(false);
async function fetchModules(){ async function fetchModules(){
const url = `${location.protocol}//${location.host.replace('5173','8080')}/legacy/user/modules`; const url = `${location.protocol}//${location.host.replace('5173','8080')}/legacy/user/modules`;
@@ -27,6 +28,7 @@ async function fetchModules(){
function onclick(e){ function onclick(e){
e.preventDefault(); e.preventDefault();
expand = false;
let href = e.target.getAttribute('href'); let href = e.target.getAttribute('href');
if (href) router.navigate(href); if (href) router.navigate(href);
return false; return false;
@@ -34,6 +36,7 @@ function onclick(e){
async function search(e){ async function search(e){
e.preventDefault(); e.preventDefault();
expand = false;
router.navigate(`/search?key=${key}`); router.navigate(`/search?key=${key}`);
return false; return false;
} }
@@ -47,11 +50,12 @@ onMount(fetchModules);
} }
</style> </style>
<nav> <nav class={expand?"":"collapsed"}>
<form onsubmit={search}> <form onsubmit={search}>
<input type="text" bind:value={key} /> <input type="text" bind:value={key} />
<button type="submit">{t('search')}</button> <button type="submit">{t('search')}</button>
</form> </form>
<button class="symbol" onclick={e => expand = !expand}></button>
<a href="/user" {onclick} class="user">{t('users')}</a> <a href="/user" {onclick} class="user">{t('users')}</a>
<a href="/company" {onclick} class="company">{t('companies')}</a> <a href="/company" {onclick} class="company">{t('companies')}</a>
<a href="/project" {onclick} class="project">{t('projects')}</a> <a href="/project" {onclick} class="project">{t('projects')}</a>
@@ -72,7 +76,7 @@ onMount(fetchModules);
{#if module.name.trim()}<a href={module.url}>{module.name}</a>{/if} {#if module.name.trim()}<a href={module.url}>{module.name}</a>{/if}
{/each} {/each}
{#if user.name } {#if user.name }
<a onclick={logout}>{t('logout_user',{user:user.name})}</a> <a class="logout" onclick={logout}>{t('logout_user',{user:user.name})}</a>
{/if} {/if}
<TimeRecorder /> <TimeRecorder />
</nav> </nav>

View File

@@ -14,6 +14,23 @@
} = $props(); } = $props();
let editable = $derived(document.state == 1); let editable = $derived(document.state == 1);
let sums = $derived.by(calcSums);
function calcSums(){
let data = {}
let net = 0;
let gross = 0;
for (let pos of Object.values(document.positions)){
let net_price = pos.unit_price * pos.amount;
let tax = +pos.tax;
data[tax] = net_price + (data[tax] ? data[tax] : 0);
net += net_price;
}
for (let [tax, price] of Object.entries(data)) gross += price * (+tax+100)/100;
data['net'] = net/100;
data['gross'] = (gross/100).toFixed(2);
return data;
}
async function updatePositions(resp){ async function updatePositions(resp){
let json = await resp.json(); let json = await resp.json();
@@ -73,9 +90,9 @@
<tr class="sums"> <tr class="sums">
<td colspan="2"></td> <td colspan="2"></td>
<td>{t('net_sum')}</td> <td>{t('net_sum')}</td>
<td>{document.net_sum/100}&nbsp;{document.currency}</td> <td>{sums['net']}&nbsp;{document.currency}</td>
<td colspan="2">{t('gross_sum')}</td> <td colspan="2">{t('gross_sum')}</td>
<td>{document.gross_sum/100}&nbsp;{document.currency}</td> <td>{sums['gross']}&nbsp;{document.currency}</td>
<td></td> <td></td>
</tr> </tr>
</tbody> </tbody>

View File

@@ -308,3 +308,10 @@ tr:hover .taglist .tag button {
.easylist .filter{ .easylist .filter{
background: black; background: black;
} }
@media screen and (max-width: 900px) {
#app nav a{
background: black;
color: red;
}
}

View File

@@ -426,6 +426,48 @@ a.wikilink{
float: right; float: right;
} }
@media screen and (min-width: 900px) {
#app nav button.symbol{
display: none;
}
}
@media screen and (max-width: 900px) {
body{
padding-top: 13px;
}
#app nav{
grid-template-columns: 33% 34% 33%;
display: grid;
padding: 0 10px;
position: absolute;
left: 0;
right: 0;
}
#app nav form{
grid-column-end: span 2;
}
#app nav .logout{
grid-column-end: 4;
}
#app nav.collapsed a{
display: none;
}
#app nav a {
font-size: 19px !important;
display: grid;
text-align: center;
border: 1px solid;
margin: 5px;
padding: 15px 0;
border-radius: 7px;
}
}
@media screen and (max-width: 600px) { @media screen and (max-width: 600px) {
.grid2{ .grid2{
display: grid; display: grid;
@@ -455,6 +497,15 @@ a.wikilink{
.easylist input{ .easylist input{
font-size: 20px; font-size: 20px;
} }
#app nav{
grid-template-columns: auto auto;
}
#app nav form{
grid-column-end: span 1;
}
#app nav .logout{
grid-column-end: 3;
}
} }
fieldset.vcard{ fieldset.vcard{

View File

@@ -298,3 +298,10 @@ tr:hover .taglist .tag button {
.easylist .filter{ .easylist .filter{
background: black; background: black;
} }
@media screen and (max-width: 900px) {
#app nav a{
background: black;
color: orange;
}
}

View File

@@ -504,6 +504,50 @@ a.wikilink{
float: right; float: right;
} }
@media screen and (min-width: 900px) {
#app nav button.symbol{
display: none;
}
}
@media screen and (max-width: 900px) {
body{
padding-top: 30px;
}
#app nav{
grid-template-columns: 33% 34% 33%;
display: grid;
padding: 0 10px;
position: absolute;
left: 0;
right: 0;
}
#app nav form{
grid-column-end: span 2;
}
#app nav .logout{
grid-column-end: 4;
}
#app nav.collapsed a{
display: none;
}
#app nav a {
font-size: 19px !important;
display: grid;
text-align: center;
border: 1px solid;
margin: 5px;
border-radius: 7px;
}
#app nav a::before {
font-size: 30px;
}
}
@media screen and (max-width: 600px) { @media screen and (max-width: 600px) {
.grid2{ .grid2{
display: grid; display: grid;
@@ -533,6 +577,15 @@ a.wikilink{
.easylist input{ .easylist input{
font-size: 20px; font-size: 20px;
} }
#app nav{
grid-template-columns: auto auto;
}
#app nav form{
grid-column-end: span 1;
}
#app nav .logout{
grid-column-end: 3;
}
} }
fieldset.vcard{ fieldset.vcard{

View File

@@ -283,3 +283,10 @@ tr:hover .taglist .tag button {
border-color: blue; border-color: blue;
color: blue; color: blue;
} }
@media screen and (max-width: 900px) {
#app nav a{
background: white;
color: blue;
}
}

View File

@@ -426,6 +426,48 @@ a.wikilink{
float: right; float: right;
} }
@media screen and (min-width: 900px) {
#app nav button.symbol{
display: none;
}
}
@media screen and (max-width: 900px) {
body{
padding-top: 13px;
}
#app nav{
grid-template-columns: 33% 34% 33%;
display: grid;
padding: 0 10px;
position: absolute;
left: 0;
right: 0;
}
#app nav form{
grid-column-end: span 2;
}
#app nav .logout{
grid-column-end: 4;
}
#app nav.collapsed a{
display: none;
}
#app nav a {
font-size: 19px !important;
display: grid;
text-align: center;
border: 1px solid;
margin: 5px;
padding: 15px 0;
border-radius: 7px;
}
}
@media screen and (max-width: 600px) { @media screen and (max-width: 600px) {
.grid2{ .grid2{
display: grid; display: grid;
@@ -455,6 +497,15 @@ a.wikilink{
.easylist input{ .easylist input{
font-size: 20px; font-size: 20px;
} }
#app nav{
grid-template-columns: auto auto;
}
#app nav form{
grid-column-end: span 1;
}
#app nav .logout{
grid-column-end: 3;
}
} }
fieldset.vcard{ fieldset.vcard{