Browse Source

Merge branch 'main' into module/stock

module/document
Stephan Richter 3 weeks ago
parent
commit
0c7463d26c
  1. 2
      frontend/src/Components/LineEditor.svelte
  2. 31
      frontend/src/Components/MarkdownEditor.svelte
  3. 2
      frontend/src/Components/MultilineEditor.svelte
  4. 1
      frontend/src/Components/TimeRecordEditor.svelte
  5. 4
      frontend/src/routes/contact/ExtraField.svelte
  6. 4
      frontend/src/routes/project/Kanban.svelte
  7. 12
      frontend/src/routes/task/View.svelte
  8. 2
      frontend/src/routes/time/Index.svelte
  9. 6
      translations/src/main/resources/de.json
  10. 8
      translations/src/main/resources/en.json
  11. 2
      web/src/main/resources/web/css/default-color.css
  12. 42
      web/src/main/resources/web/css/default.css

2
frontend/src/Components/LineEditor.svelte

@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
href = '#',
onclick = evt => { evt.preventDefault(); startEdit(); return false },
onSet = newVal => {return true;},
title = t('long_click_to_edit'),
title = t('click_to_edit'),
type = 'div',
value = $bindable(null)
} = $props();

31
frontend/src/Components/MarkdownEditor.svelte

@ -104,29 +104,18 @@ @@ -104,29 +104,18 @@
if (simple) startEdit();
</script>
<style>
textarea{
width: 100%;
min-height: 100px;
}
div{
min-width: 40px;
min-height: 20px;
}
div.editable:hover{
border: 1px dotted;
}
</style>
<div class="markdown {editing?'editing':''}">
{#if editing}
<div class="boundary">
<textarea bind:value={editValue.source} onkeyup={typed} autofocus={!simple}></textarea>
<span class="buttons">
<button class="cancel" onclick={e => editing = false}>{t('cancel')}</button>
<button class="save" onclick={doSave}>{t('save')}</button>
</span>
<span class="hint">{@html t('markdown_supported')}</span>
<textarea bind:value={editValue.source} onkeyup={typed} autofocus={!simple}></textarea>
<div class="preview">{@html target(editValue.rendered)}</div>
{#if !simple}
<div class="buttons">
<button class="cancel" onclick={e => editing = false}>{t('cancel')}</button>
<button class="save" onclick={doSave}>{t('save')}</button>
</div>
{/if}
{:else}
<svelte:element this={type} {onclick} {oncontextmenu} class={{editable}} title={t('right_click_to_edit')} >{@html target(editValue.rendered)}</svelte:element>
{/if}
<svelte:element this={type} {onclick} {oncontextmenu} class={{editable}} title={t('long_click_to_edit')} >{@html target(editValue.rendered)}</svelte:element>
</div>

2
frontend/src/Components/MultilineEditor.svelte

@ -85,7 +85,7 @@ @@ -85,7 +85,7 @@
<textarea bind:value={editValue} onkeyup={typed} autofocus></textarea>
{:else}
{#if value}
<svelte:element this={type} {onmousedown} {onmouseup} {ontouchstart} {ontouchend} class={{editable}} title={t('long_click_to_edit')} >
<svelte:element this={type} {onmousedown} {onmouseup} {ontouchstart} {ontouchend} class={{editable}} title={t('right_click_to_edit')} >
{#each value.split("\n") as line}
{line}<br/>
{/each}

1
frontend/src/Components/TimeRecordEditor.svelte

@ -49,5 +49,4 @@ @@ -49,5 +49,4 @@
</fieldset>
</form>
<Notes module="time" entity_id={record.id} />
{record.description.source}
{/if}

4
frontend/src/routes/contact/ExtraField.svelte

@ -17,9 +17,9 @@ @@ -17,9 +17,9 @@
{#if field}
<div class={field.name}>
{#if field.value.includes('\\n')}
<MultiLineEditor type="div" editable={true} value={field.value.replaceAll('\\n','\n')} {onSet} title={t(field.name)+' – '+t('long_click_to_edit')} />
<MultiLineEditor type="div" editable={true} value={field.value.replaceAll('\\n','\n')} {onSet} title={t(field.name)+' – '+t('right_click_to_edit')} />
{:else}
<LineEditor type="div" editable={true} value={field.value} {onSet} title={t(field.name)+' – '+t('long_click_to_edit')} />
<LineEditor type="div" editable={true} value={field.value} {onSet} title={t(field.name)+' – '+t('click_to_edit')} />
{/if}
</div>
{/if}

4
frontend/src/routes/project/Kanban.svelte

@ -23,7 +23,6 @@ @@ -23,7 +23,6 @@
let tasks = $state({});
let users = {};
let columns = $derived(project.allowed_states?Object.keys(project.allowed_states).length+1:1);
const controller = new AbortController();
$effect(() => updateUrl(filter_input));
@ -175,8 +174,7 @@ @@ -175,8 +174,7 @@
}
function openTask(task_id){
controller.abort();
router.navigate(`/task/${task_id}/view`)
window.open(`/task/${task_id}/view`, '_blank').focus();
}
async function save_bookmark(){

12
frontend/src/routes/task/View.svelte

@ -210,9 +210,7 @@ @@ -210,9 +210,7 @@
</div>
{#if task.description}
<div>{t('description')}</div>
<div class="description">
<MarkdownEditor bind:value={task.description} editable={true} onSet={val => update({description:val})} />
</div>
<MarkdownEditor bind:value={task.description} editable={true} onSet={val => update({description:val})} />
{/if}
{#if !showSettings && task.start_date}
<div>{t('start_date')}</div>
@ -277,6 +275,10 @@ @@ -277,6 +275,10 @@
</ul>
</div>
{/if}
<div>{t('tags')}</div>
<div class="tags">
<TagList module="task" {id} user_list={Object.keys(task.members).map(id => +id)} />
</div>
<div>
{t('subtasks')}
@ -288,10 +290,6 @@ @@ -288,10 +290,6 @@
{/if}
</div>
<div>{t('tags')}</div>
<div class="tags">
<TagList module="task" {id} user_list={Object.keys(task.members).map(id => +id)} />
</div>
<h3>{t('notes')}</h3>
<div>
<Notes module="task" entity_id={id} />

2
frontend/src/routes/time/Index.svelte

@ -244,7 +244,7 @@ @@ -244,7 +244,7 @@
{time.duration.toFixed(3)}&nbsp;h
{/if}
</td>
<td class="user">
<td class="user" onclick={e => {detail = time.id}}>
{users[time.user_id].name}
</td>
<td class="subject" onclick={e => {detail = time.id}}>

6
translations/src/main/resources/de.json

@ -18,6 +18,7 @@ @@ -18,6 +18,7 @@
"cancel": "abbrechen",
"choose_type": "Typ wählen",
"click_to_edit": "Anklicken zum Bearbeiten",
"client_id": "Client-ID",
"client_secret": "Client-Geheimnis",
"close_settings": "Einstellungen schließen",
@ -137,15 +138,16 @@ @@ -137,15 +138,16 @@
"login_services": "Login-Services",
"logout": "Abmelden",
"logout_user": "{user} abmelden",
"long_click_to_edit": "lang klicken zum Bearbeiten",
"markdown_code": "Markdown-Code",
"markdown_supported": "Markdown & <a href=\"https://plantuml.com\">Plantuml</a> nutzbar!",
"MANAGE_LOGIN_SERVICES": "Login-Services verwalten",
"member": "Mitarbeiter",
"members": "Mitarbeiter",
"message": "Nachricht",
"messages": "Benachrichtigungen",
"miscellaneous_settings": "sonstige Einstellungen",
"mismatch": "ungleich",
"model": "Modell",
"models": "Modelle",
"module": {
@ -166,7 +168,6 @@ @@ -166,7 +168,6 @@
"user": "Benutzer",
"wiki": "Wiki"
},
"mismatch": "ungleich",
"month": "Monat",
"must_not_be_empty": "darf nicht leer sein",
@ -215,6 +216,7 @@ @@ -215,6 +216,7 @@
"region": "Bundesland",
"repeat_new_password": "Wiederholung",
"results": "Ergebnisse",
"right_click_to_edit": "Rechts-Klick zum Bearbeiten",
"save": "speichern",
"saved": "gespeichert",

8
translations/src/main/resources/en.json

@ -18,6 +18,7 @@ @@ -18,6 +18,7 @@
"cancel": "cancel",
"choose_type": "choose type",
"click_to_edit": "click to edit",
"client_id": "client ID",
"client_secret": "client secret",
"close_settings": "close settings",
@ -38,7 +39,7 @@ @@ -38,7 +39,7 @@
"contained_tax": "contained tax",
"content": "content",
"context": "context",
"count_of_occurrences": "{count} occurences",
"count_of_occurrences": "{count} occurrences",
"country": "country",
"COURT": "local court",
"CUSTOMER-NUMBER": "customer number",
@ -137,15 +138,16 @@ @@ -137,15 +138,16 @@
"login_services": "login service",
"logout": "logout",
"logout_user": "logout {user}",
"long_click_to_edit": "click long to edit",
"markdown_code": "Markdown-Code",
"markdown_supported": "Markdown & <a href=\"https://plantuml.com\">Plantuml</a> supported!",
"MANAGE_LOGIN_SERVICES": "manage login services",
"member": "member",
"members": "members",
"message": "message",
"messages": "messages",
"miscellaneous_settings": "miscellaneous settings",
"mismatch": "mismatch",
"model": "model",
"models": "models",
"module": {
@ -166,7 +168,6 @@ @@ -166,7 +168,6 @@
"user": "Users",
"wiki": "wiki"
},
"mismatch": "mismatch",
"month": "month",
"must_not_be_empty": "must not be empty",
@ -215,6 +216,7 @@ @@ -215,6 +216,7 @@
"region": "region",
"repeat_new_password": "repeat new password",
"results": "results",
"right_click_to_edit": "right click to edit",
"save": "save",
"saved": "saved",

2
web/src/main/resources/web/css/default-color.css

@ -87,7 +87,7 @@ textarea{ @@ -87,7 +87,7 @@ textarea{
.kanban .state_10 .box,
.kanban .state_100 .box{
background: linear-gradient(rgba(0,0,0,0.8));
background: linear-gradient(rgba(0,0,0,0.6));
}
.kanban .state_10 .box,

42
web/src/main/resources/web/css/default.css

@ -290,6 +290,19 @@ span.timetracking { @@ -290,6 +290,19 @@ span.timetracking {
display: inline-block;
}
.markdown.editing{
display: grid;
grid-template-columns: 1fr 1fr;
column-gap: 10px;
}
.markdown .buttons,
.markdown .hint{
grid-column-end: span 2;
}
.editable:hover{
border: 1px dotted;
}
.timetracks .year, .timetracks .month{
border: 1px solid;
@ -307,23 +320,6 @@ span.timetracking { @@ -307,23 +320,6 @@ span.timetracking {
float: right;
}
.markdown.editing{
position: relative;
}
.markdown.editing > *{
width: 49%;
}
.markdown.editing > *:nth-child(2){
position: absolute;
right: 0;
top: 0;
}
.markdown img{
max-width: 75%;
}
table{
min-width: 30vw;
@ -370,6 +366,7 @@ a.wikilink{ @@ -370,6 +366,7 @@ a.wikilink{
.grid2{
display: grid;
grid-template-columns: 230px auto;
margin: 0 5px;
}
.grid2 > :nth-child(2n-1){
@ -399,6 +396,17 @@ a.wikilink{ @@ -399,6 +396,17 @@ a.wikilink{
text-align: initial;
padding-top: 8px;
}
.markdown.editing{
display: block;
grid-template-columns: 1fr 1fr;
column-gap: 10px;
}
.markdown textarea{
width: calc(100% - 10px);
min-height: 50px;
}
}
fieldset.vcard{

Loading…
Cancel
Save