Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
2025-10-24 10:57:07 +02:00
9 changed files with 163 additions and 26 deletions

View File

@@ -4,16 +4,19 @@
import { error, yikes } from '../../warn.svelte';
import { t } from '../../translations.svelte';
import Locations from './Locations.svelte';
import ItemList from './ItemList.svelte';
import ItemProps from './ItemProps.svelte';
import LineEditor from '../../Components/LineEditor.svelte';
import Locations from './Locations.svelte';
import MarkdownEditor from '../../Components/MarkdownEditor.svelte';
import Notes from '../notes/RelatedNotes.svelte';
import Tags from '../tags/TagList.svelte';
let loc_data = $derived.by(loadLocation);
let item = $state(null);
let location = $state(null);
let draggedItem = $state(null)
let loc_data = $derived.by(loadLocation);
let item = $state(null);
let location = $state(null);
let draggedItem = $state(null)
let draggedLocation = $state(null)
$effect(() => {
// This effect runs whenever `location` changes
@@ -37,6 +40,16 @@
} else error(res);
}
function drag_item(item){
draggedLocation = null;
draggedItem = item;
}
function drag_location(loc){
draggedItem = null;
draggedLocation = loc;
}
function dropNestedLocation(locations,loc){
for (let [idx,entry] of locations.entries()){
if (entry.id == loc.id){
@@ -49,8 +62,8 @@
}
async function move_dragged_to(new_loc){
const data = { item : draggedItem.id, target: new_loc.id };
const url = api('stock/move_item');
const data = draggedItem ? { item : draggedItem.id, target: new_loc.id } : { parent_location_id: new_loc.id }
const url = api(draggedItem ? 'stock/move_item' : `stock/location/${draggedLocation.id}`);
const res = await fetch(url,{
credentials : 'include',
method : 'PATCH',
@@ -58,7 +71,14 @@
});
if (res.ok){
yikes();
location = new_loc;
location = new_loc;
if (!draggedItem){
for (var owner of top_level){
if (owner.locations && dropNestedLocation(owner.locations,draggedLocation)) break;
}
}
draggedItem = null;
draggedLocation = null;
} else {
error(res);
}
@@ -104,13 +124,28 @@
loadProperties();
}
async function patchLocation(location,field,newValue){
const data = {};
data[field] = newValue;
console.log(data);
const url = api(`stock/location/${location.id}`);
const res = await fetch(url,{
credentials: 'include',
method:'PATCH',
body:JSON.stringify(data)
});
if (res.ok){
yikes();
return true;
} else {
error(res);
return false;
}
}
onMount(load);
</script>
<style>
</style>
<h2>{t('Stock')}</h2>
<div class="grid3">
<div class="locations">
@@ -118,7 +153,12 @@
{#each top_level as realm,idx}
<h3>{realm.name}</h3>
{#if realm.locations}
<Locations locations={realm.locations} parent={realm.parent} bind:selected={location} {move_dragged_to} />
<Locations
locations={realm.locations}
parent={realm.parent}
bind:selected={location}
{move_dragged_to}
drag_start={drag_location} />
{/if}
{/each}
{/if}
@@ -128,9 +168,16 @@
{:then data}
<div class="items">
{#if location}
<h3>{location.name} <button class="symbol" title={t('delete_object',{object:t('location')})} onclick={e => deleteLocation(location)}></button></h3>
<h3>
<LineEditor editable={true} bind:value={location.name} type="span" onSet={newName => patchLocation(location,'name',newName)} />
<button class="symbol" title={t('delete_object',{object:t('location')})} onclick={e => deleteLocation(location)}></button>
{#if location.parent_location_id}
<button class="symbol" title={t('move_to_top')} onclick={e => patchLocation(location,'parent_location_id',0)}></button>
{/if}
</h3>
<MarkdownEditor editable={true} value={location.description} type="div" onSet={newDesc => patchLocation(location,'description',newDesc)} />
{/if}
<ItemList items={data?.items.sort((a,b) => a.code.localeCompare(b.code))} bind:selected={item} drag_start={item => draggedItem = item} />
<ItemList items={data?.items.sort((a,b) => a.code.localeCompare(b.code))} bind:selected={item} drag_start={drag_item} />
</div>
<div class="properties">
<ItemProps {item} {properties} />
@@ -146,4 +193,4 @@
</div>
{/if}
{/await}
</div>
</div>

View File

@@ -5,7 +5,13 @@
import LineEditor from '../../Components/LineEditor.svelte';
let { locations, move_dragged_to = new_loc => {}, parent = null, selected = $bindable(null) } = $props();
let {
drag_start = loc => console.log({dragging:loc}),
locations,
move_dragged_to = new_loc => {},
parent = null,
selected = $bindable(null)
} = $props();
let show_location_form = $state(false);
let new_location_name = $state(null);
@@ -102,12 +108,14 @@
{#each locations as location}
<li onclick={e => toggleChildren(e, location)}
class="{location.locations?'expanded':'collapsed'} {location.highlight?'highlight':null}"
draggable={true}
ondragover={e => drag_over(e,location)}
ondrop={e => onDrop(e,location)}
ondragleave={e => delete location.highlight}>
ondragleave={e => delete location.highlight}
ondragstart={e => drag_start(location)} >
<span class="name">{location.name}</span>
{#if location.locations}
<svelte:self locations={location.locations} {move_dragged_to} parent={{location:location.id}} bind:selected />
<svelte:self locations={location.locations} {drag_start} {move_dragged_to} parent={{location:location.id}} bind:selected />
{/if}
</li>
{/each}