Quantcast
Channel: Active questions tagged svelte - Stack Overflow
Viewing all articles
Browse latest Browse all 1541

How can I animate move from one svelte-dnd-action dndzone to another using a function?

$
0
0

I have a parent component that has 2 children. Each child has a dndzone in it. With each child I am passing an array of objects. I have two arrays of objects, "pickPlateIds" and "quePlateIds". Each child takes this component and makes a list of dnd items. I have a function in each child which will remove the object from the list it is in and add it to the other. When these functions run it just removes it from the one dnd zone and adds it to the other without any animation. Is there a way I can animate this so when I run this function it will make the dnd object flip from one dnd zone to the other? It does animate properly when I drag and drop, I just want it to animate when the function runs.

Here is my parent:

<script>    // @ts-nocheck    import { onMount } from 'svelte';    import { dndzone } from 'svelte-dnd-action';    import { darkModeStore } from '$lib/store';    import { flip } from 'svelte/animate';    import PickList from '$lib/pickList.svelte';    import QueList from '$lib/queList.svelte';    $: pickPlateIds = [        { id: 1, name: '12345' },        { id: 2, name: '54321' },        { id: 3, name: '67890' },        { id: 4, name: '09876' }    ];    $: quePlateIds = [{ id: 5, name: '12345' }];    let newIndex = 0;    const flipDurationMs = 200;    function handleAdd() {        const input = document.getElementById('inputPlateId');        const plateId = input.value.trim();        if (plateId) {            pickPlateIds = [...pickPlateIds, { id: newIndex++, name: plateId }];            input.value = '';        }    }    function handleRemoveAll() {        pickPlateIds = [];        quePlateIds = []    }    function handleRemovePick(id) {        pickPlateIds = pickPlateIds.filter((item) => item.id !== id);    }    function handleRemoveQue(id) {        quePlateIds = quePlateIds.filter((item) => item.id !== id);    }    onMount(() => {        newIndex = pickPlateIds.length + quePlateIds.length + 1;    });    function handleKeyDown(event) {        if (event.key === 'Enter') {            handleAdd();        }    }    // Function to move an item from pickPlateIds to quePlateIds    function moveToQueue(id) {        const itemToMove = pickPlateIds.find((item) => item.id === id);        if (itemToMove) {            quePlateIds = [...quePlateIds, itemToMove];            pickPlateIds = pickPlateIds.filter((item) => item.id !== id);        }    }    // Function to move an item from quePlateIds to pickPlateIds    function moveToPick(id) {        const itemToMove = quePlateIds.find((item) => item.id === id);        if (itemToMove) {            pickPlateIds = [...pickPlateIds, itemToMove];            quePlateIds = quePlateIds.filter((item) => item.id !== id);        }    }</script><div class="mt-10 dark:text-white h-screen"><div class="input flex items-center justify-center"><input            class="shadow appearance-none border rounded py-2 px-3 text-gray-700 focus:outline-none focus:shadow-outline dark:text-white dark:bg-gray-700"            id="inputPlateId"            type="text"            placeholder="Enter Plate ID"            on:keydown={handleKeyDown}        /><button            class="bg-green-800 hover:bg-green-600 text-white font-bold py-1 px-3 rounded-full disabled:opacity-25 ml-1"            on:click={handleAdd}>Add</button><button            class="bg-red-800 hover:bg-red-600 text-white font-bold py-1 px-3 rounded-full disabled:opacity-25 ml-1"            on:click={handleRemoveAll}>Remove All</button></div><div class="h-screen flex justify-center"><div class="border w-1/4 h-3/4 flex flex-col text-center items-center rounded-lg mt-4 mr-4 overflow-auto"><PickList bind:items={pickPlateIds} {handleRemovePick} {flipDurationMs} {moveToQueue}/></div><div class="border w-1/4 h-3/4 flex flex-col text-center items-center rounded-lg mt-4 overflow-auto"><QueList bind:items={quePlateIds} {handleRemoveQue} {flipDurationMs} {moveToPick} /></div></div></div>

Child one

<script>    /**     * @type {any}     */    export let items;    export let handleRemovePick;    export let flipDurationMs;    export let moveToQueue;    import { flip } from 'svelte/animate';    import { darkModeStore } from './store';    import { dndzone } from 'svelte-dnd-action';    // drag and drop functions    /**     * @param {{ detail: { items: any; }; }} e     */    function handleItemMove(e) {        items = e.detail.items;    }    /**     * @param {{ detail: { items: any; }; }} e     */    function handleMoveComplete(e) {        items = e.detail.items;        // need to save list to redis after completed        console.log(items);    }</script><div class="sticky top-0 bg-gray-600 w-full p-2">    Pick List <button        class="bg-red-800 hover:bg-red-600 text-white font-bold py-1 px-3 rounded-full disabled:opacity-25 text-sm absolute right-12"        on:click={() => (items = [])}>Clear</button></div><div    class="w-96 mt-4 h-screen"    use:dndzone={{ items, flipDurationMs, dropTargetStyle: {} }}    on:consider={handleItemMove}    on:finalize={handleMoveComplete}>    {#each items as item (item.id)}<div            class="{$darkModeStore                ? 'bg-gray-500'                : 'border-gray-300'} border rounded-md py-2 px-3 m-2 flex justify-between"            draggable="true"            id={item.id}            animate:flip={{ duration: flipDurationMs }}><span>{item.name}</span><div><button                    class="bg-green-800 hover:bg-green-600 text-white font-bold py-1 px-3 rounded-full disabled:opacity-25"                    on:click={() => moveToQueue(item.id)}>Move</button><button                    class="bg-red-800 hover:bg-red-600 text-white font-bold py-1 px-3 rounded-full disabled:opacity-25"                    on:click={() => handleRemovePick(item.id)}>Remove</button></div></div>    {/each}</div>

Child 2

<script>    /**     * @type {any}     */    export let items;    export let handleRemoveQue;    export let flipDurationMs;    export let moveToPick;    import { flip } from 'svelte/animate';    import { darkModeStore } from './store';    import { dndzone } from 'svelte-dnd-action';    // drag and drop functions    /**     * @param {{ detail: { items: any; }; }} e     */    function handleItemMove(e) {        items = e.detail.items;    }    /**     * @param {{ detail: { items: any; }; }} e     */    function handleMoveComplete(e) {        items = e.detail.items;        // need to save list to redis after completed        console.log(items);    }</script><div class="sticky top-0 bg-gray-600 w-full p-2">    Que List <button        class="bg-red-800 hover:bg-red-600 text-white font-bold py-1 px-3 rounded-full disabled:opacity-25 text-sm absolute right-12"        on:click={() => (items = [])}>Clear</button></div><div    class="w-96 mt-4 h-screen"    use:dndzone={{ items, flipDurationMs, dropTargetStyle: {} }}    on:consider={handleItemMove}    on:finalize={handleMoveComplete}>    {#each items as item (item.id)}<div            class="{$darkModeStore                ? 'bg-gray-500'                : 'border-gray-300'} border rounded-md py-2 px-3 m-2 flex justify-between"            draggable="true"            id={item.id}            animate:flip={{ duration: flipDurationMs }}><span>{item.name}</span><div><button                    class="bg-green-800 hover:bg-green-600 text-white font-bold py-1 px-3 rounded-full disabled:opacity-25"                    on:click={() => moveToPick(item.id)}>Move</button><button                    class="bg-red-800 hover:bg-red-600 text-white font-bold py-1 px-3 rounded-full disabled:opacity-25"                    on:click={() => handleRemoveQue(item.id)}>Remove</button></div></div>    {/each}</div>

Viewing all articles
Browse latest Browse all 1541

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>