diff --git a/src/components/cards/CardRunner.svelte b/src/components/cards/CardRunner.svelte new file mode 100644 index 00000000..4b87829e --- /dev/null +++ b/src/components/cards/CardRunner.svelte @@ -0,0 +1,16 @@ + + +{#if !runner} + {$_("non-blanko")} +{:else} + + {#if runner.middlename} + {runner.firstname} {runner.middlename} {runner.lastname} + {:else} + {runner.firstname} {runner.lastname} + {/if} + +{/if} diff --git a/src/components/cards/CardStatus.svelte b/src/components/cards/CardStatus.svelte new file mode 100644 index 00000000..6e90f495 --- /dev/null +++ b/src/components/cards/CardStatus.svelte @@ -0,0 +1,16 @@ + + +{#if enabled} + {$_("enabled")} +{:else} + {$_("disabled")} +{/if} diff --git a/src/components/cards/CardsOverview.svelte b/src/components/cards/CardsOverview.svelte index 04dad4c6..8eea5f76 100644 --- a/src/components/cards/CardsOverview.svelte +++ b/src/components/cards/CardsOverview.svelte @@ -6,22 +6,45 @@ import CardsEmptyState from "./CardsEmptyState.svelte"; import CardDetailModal from "./CardDetailModal.svelte"; import GenerateRunnerCards from "../pdf_generation/GenerateRunnerCards.svelte"; - import ThFilterStatus from "./ThFilterStatus.svelte"; - import ThFilterRunner from "./ThFilterRunner.svelte"; + import InputElement from "../shared/InputElement.svelte"; + import { groupFilter } from "../shared/tablefilters"; + import { + createSvelteTable, + flexRender, + getCoreRowModel, + getFilteredRowModel, + getPaginationRowModel, + getSortedRowModel, + renderComponent, + } from "@tanstack/svelte-table"; + import { writable } from "svelte/store"; + import TableBottom from "../shared/TableBottom.svelte"; + import TableActions from "../shared/TableActions.svelte"; + import TableHeader from "../shared/TableHeader.svelte"; + import CardStatus from "./CardStatus.svelte"; + import CardRunner from "./CardRunner.svelte"; + export let edit_modal_open = false; export let runner = {}; export let editable = {}; export let original_data = {}; export let current_cards = []; - const handler = new DataHandler(current_cards, { rowsPerPage: 50 }); - const rows = handler.getRows(); - $: active_deletes = []; + + $: selected = + $table?.getSelectedRowModel().rows.map((row) => row.index) || []; + $: selectedCards = + $table?.getSelectedRowModel().rows.map((row) => row.original) || []; + $: active_delete = undefined; $: cards_show = generate_cards.length > 0; $: generate_cards = []; + const cards_promise = RunnerCardService.runnerCardControllerGetAll().then( (val) => { current_cards = val; - handler.setRows(val); + options.update((options) => ({ + ...options, + data: current_cards, + })); } ); const getRunnerLabel = (option) => @@ -30,6 +53,68 @@ (option?.middlename || "") + " " + (option?.lastname || "{$_('non-blanko')}"); + + const columns = [ + { + accessorKey: "id", + header: () => "id", + filterFn: `equalsString`, + }, + { + accessorKey: "runner", + header: () => $_("name"), + cell: (info) => { + return renderComponent(CardRunner, { runner: info.getValue() }); + }, + filterFn: `includesString`, + }, + { + accessorKey: "enabled", + cell: (info) => { + return renderComponent(CardStatus, { enabled: info.getValue() }); + }, + header: () => $_("status"), + filterFn: `includesString`, + }, + { + accessorKey: "actions", + header: () => $_("action"), + cell: (info) => { + return renderComponent(TableActions, { + detailsLink: `./${info.row.original.id}`, + deleteAction: () => { + active_delete = + current_cards[ + current_cards.findIndex((r) => r.id == info.row.original.id) + ]; + }, + deleteEnabled: + store.state.jwtinfo.userdetails.permissions.includes("CARD:DELETE"), + }); + }, + enableColumnFilter: false, + enableSorting: false, + }, + ]; + const options = writable({ + data: [], + columns: columns, + filterFns: { + group: groupFilter, + }, + initialState: { + pagination: { + pageSize: 50, + }, + }, + enableRowSelection: true, + getCoreRowModel: getCoreRowModel(), + getFilteredRowModel: getFilteredRowModel(), + getPaginationRowModel: getPaginationRowModel(), + getSortedRowModel: getSortedRowModel(), + }); + const table = createSvelteTable(options); + function open_edit_modal(card) { if (card.runner?.id) { runner = Object.assign( @@ -54,7 +139,9 @@ bind:runner bind:editable bind:original_data - on:dataUpdated={handler.setRows(current_cards)} + on:dataUpdated={() => { + //TODO: + }} /> {/if} @@ -112,131 +199,49 @@ {/if} - +
- - - - - - - - - + {#each $table.getHeaderGroups() as headerGroup} + + + {#each headerGroup.headers as header} + + {/each} + + {/each} - {#each $rows as row} + {#each $table.getRowModel().rows as row} - - - - - + {#each row.getVisibleCells() as cell} + + {/each} {/each}
- { - if (generate_cards.length != current_cards.length) { - generate_cards = current_cards; - } else { - generate_cards = []; - } - }} - /> - {$_("code")}{$_("runner")}{$_("status")}{$_("action")}
- - - - -
+ $table.toggleAllRowsSelected()} + /> +
- + i.id == row.id).length > - 0} - on:click={() => { - if (generate_cards.findIndex((i) => i.id == row.id) == -1) { - generate_cards.push(row); - generate_cards = generate_cards; - } else { - generate_cards = generate_cards.filter( - (r) => r.id != row.id - ); - } - console.log(generate_cards); - }} + checked={row.getIsSelected()} + on:change={() => row.toggleSelected()} /> {row.code} - {#if row.runner} - {row.runner.firstname} - {row.runner.middlename || ""} - {row.runner.lastname} - {:else}{$_("non-blanko")}{/if} - - {#if row.enabled} - {$_("enabled")} - {:else} - {$_("disabled")} - {/if} - - {#if active_deletes[row.id] === true} - - - {:else} - - {#if store.state.jwtinfo.userdetails.permissions.includes("CARD:DELETE")} - - {/if} - {/if} - + +
+ {/if} {:catch error}