Update Cards

This commit is contained in:
@s.roertgen 2025-04-23 11:35:54 +02:00
parent cd23a61b90
commit ec9d8bdb1e
5 changed files with 81 additions and 44 deletions

View file

@ -1,17 +1,26 @@
<script> <script>
import { addCard } from '$lib/ndk'; import { addCard, eventTitle } from '$lib/ndk';
import { ndkStore, replaceTagArray, deleteCard } from '$lib/db';
import { NDKEvent } from '@nostr-dev-kit/ndk';
import MarkdownEditor from '$lib/components/MarkdownEditor.svelte'; import MarkdownEditor from '$lib/components/MarkdownEditor.svelte';
export let modalRef; export let modalRef;
export let card = new NDKEvent($ndkStore, {
kind: 30045,
content: 'Write something awesome here 🌱',
tags: [['title', 'Titel']]
});
/** @type {NDKEvent} */
export let column;
let title = eventTitle(card);
let title = '';
let content = 'Write something awesome here 🌱';
function handleAddCard() { function handleAddCard() {
const card = { console.log('adding card', card, column);
title, const newTags = replaceTagArray(card.tags, 'title', ['title', title]);
content card.tags = newTags;
}; addCard(card, column);
addCard(card);
} }
</script> </script>
@ -22,11 +31,22 @@
>Titel >Titel
<input type="text" bind:value={title} /> <input type="text" bind:value={title} />
</label> </label>
<MarkdownEditor bind:value={content} /> <MarkdownEditor bind:value={card.content} />
<div class="modal-action"> <div class="modal-action">
<form method="dialog"> <form method="dialog">
{#if card?.id !== ''}
<button class="btn btn-warning m-1" on:click={() => deleteCard(card, column)}
>Delete</button
>
{/if}
<button class="btn btn-warning">Close</button> <button class="btn btn-warning">Close</button>
<button class="btn btn-success" on:click={handleAddCard}>Add card</button> <button class="btn btn-success" on:click={handleAddCard}>
{#if card?.id !== ''}
Update Card
{:else}
Add card
{/if}
</button>
</form> </form>
</div> </div>
</div> </div>

View file

@ -1,17 +1,23 @@
<script> <script>
import { eventTitle } from '$lib/ndk'; import { eventTitle } from '$lib/ndk';
import { user, selectedColumn } from '$lib/db';
import { marked } from 'marked'; import { marked } from 'marked';
import AddCardModal from './AddCardModal.svelte';
export let card; export let card;
export let column;
function deleteCard(column, itemId) { let addCardModal;
const updatedColumnItems = column.items.filter((e) => e.id !== itemId);
publishCards({ ...column, items: updatedColumnItems }); function handleClick(e) {
$selectedColumn = column.dTag;
$user?.pubkey && addCardModal.showModal();
} }
</script> </script>
<div class="flex flex-col gap-1 rounded-xl border border-none bg-orange-300"> <div on:click={handleClick} class="flex flex-col gap-1 rounded-xl border border-none bg-orange-300">
<h1 class="p-1 text-xl font-bold">{eventTitle(card)}</h1> <h1 class="p-1 text-xl font-bold">{eventTitle(card)}</h1>
<p class="p-1">{@html marked.parse(card.content)}</p> <p class="p-1">{@html marked.parse(card.content)}</p>
<button class="btn btn-warning m-1" on:click={() => deleteCard(column, item.id)}>Delete</button>
</div> </div>
<AddCardModal bind:modalRef={addCardModal} {card} {column} />

View file

@ -1,5 +1,6 @@
<script> <script>
import { dndzone } from 'svelte-dnd-action'; import { dndzone } from 'svelte-dnd-action';
import { flip } from 'svelte/animate';
import Card from './Card.svelte'; import Card from './Card.svelte';
import PlusCircleFill from '$lib/icons/PlusCircleFill.svelte'; import PlusCircleFill from '$lib/icons/PlusCircleFill.svelte';
@ -66,11 +67,11 @@
> >
{#each column.items as item (item?.id ?? item)} {#each column.items as item (item?.id ?? item)}
<div class="my-1 p-1" animate:flip={{ duration: flipDurationMs }}> <div class="my-1 p-1" animate:flip={{ duration: flipDurationMs }}>
<Card card={item} /> <Card card={item} {column} />
</div> </div>
{/each} {/each}
</div> </div>
{/if} {/if}
{/if} {/if}
<AddCardModal bind:modalRef={addCardModal} /> <AddCardModal bind:modalRef={addCardModal} {column} />

View file

@ -1,6 +1,7 @@
import { writable, derived, get } from 'svelte/store'; import { writable, derived, get } from 'svelte/store';
import NDK, { NDKUser } from '@nostr-dev-kit/ndk'; import NDK, { NDKEvent, NDKUser } from '@nostr-dev-kit/ndk';
import { columnAddressesFromBoard } from './ndk'; import { columnAddressesFromBoard } from './ndk';
import { publishCards } from './ndk';
export const events = writable([]); export const events = writable([]);
@ -13,9 +14,7 @@ export const currentBoardAddress = writable('');
export const currentBoard = derived( export const currentBoard = derived(
[currentBoardAddress, events], [currentBoardAddress, events],
([$currentBoardAddress, $events]) => { ([$currentBoardAddress, $events]) => {
console.log('looking for current board');
const board = get(events).find((e) => e.tagAddress() === $currentBoardAddress); const board = get(events).find((e) => e.tagAddress() === $currentBoardAddress);
console.log(board);
return board; return board;
} }
); );
@ -42,6 +41,7 @@ export const columnsForBoard = derived(
return cols; return cols;
} }
); );
// FIXME dTag of selected column
export const selectedColumn = writable(''); export const selectedColumn = writable('');
export const cards = derived(events, ($events) => { export const cards = derived(events, ($events) => {
const allCards = $events.filter((e) => e.kind === 30045); const allCards = $events.filter((e) => e.kind === 30045);
@ -182,3 +182,25 @@ export function deleteColumn(columnId) {
const updatedBoardItems = items.filter((e) => e.id !== columnId); const updatedBoardItems = items.filter((e) => e.id !== columnId);
publishBoard({ ...$currentBoard, items: updatedBoardItems }); publishBoard({ ...$currentBoard, items: updatedBoardItems });
} }
export function replaceTagArray(tags, key, newArray) {
const index = tags.findIndex((tag) => tag[0] === key);
if (index !== -1) {
tags[index] = newArray;
} else {
tags.push(newArray);
}
return tags;
}
/**
* @param {NDKEvent} card
* @param {NDKEvent} column
*/
export function deleteCard(card, column) {
const updatedColumnTags = column.tags.filter((e) => e[1] !== card.tagAddress());
column.tags = updatedColumnTags;
publishCards(column);
}

View file

@ -64,20 +64,19 @@ export async function addColumn(column) {
existingBoard.publishReplaceable(); existingBoard.publishReplaceable();
} }
export async function addCard(card) { /**
* @param {NDKEvent} card
* @param {NDKEvent} column
*/
export async function addCard(card, column) {
const ndk = getNdk(); const ndk = getNdk();
const cardEvent = new NDKEvent(ndk, { kind: 30045, content: card.content }); const cardEvent = new NDKEvent(ndk, card);
cardEvent.tags.push(['title', card.title]); console.log('add card event', cardEvent);
console.log('card event', cardEvent); await cardEvent.publishReplaceable();
await cardEvent.publish();
const columnEvent = await ndk.fetchEvent({ console.log('column event', column);
kinds: [30044], column.tags.push(['a', `${cardEvent.kind}:${cardEvent.pubkey}:${cardEvent.dTag}`]);
// authors: [cardEvent.pubkey], column.publishReplaceable();
'#d': [get(selectedColumn)]
});
columnEvent.tags.push(['a', `${cardEvent.kind}:${cardEvent.pubkey}:${cardEvent.dTag}`]);
columnEvent?.publishReplaceable();
} }
async function eventTagToCard(eventTag) { async function eventTagToCard(eventTag) {
@ -200,18 +199,7 @@ export async function publishBoard(board) {
export async function publishCards(column) { export async function publishCards(column) {
const ndk = getNdk(); const ndk = getNdk();
const existingColumn = await ndk.fetchEvent({ column.publishReplaceable();
kinds: [30044],
// authors: [column.pubkey],
ids: [column.id]
});
const cardIds = column.items.map((e) => e.dTag);
let tags = existingColumn.tags.filter((t) => t[0] !== 'a');
cardIds.forEach((dTag) => {
tags.push(['a', `30045:${column.pubkey}:${dTag}`]);
});
existingColumn.tags = tags;
existingColumn.publishReplaceable();
} }
/** takes existing tags and replaces the pubkey in the Tag Addresses /** takes existing tags and replaces the pubkey in the Tag Addresses