sortable object list controls #922

This commit is contained in:
SPRINX0\prochazka
2024-10-22 16:09:48 +02:00
parent 24408dd7c2
commit 3dfa23a30c
5 changed files with 48 additions and 8 deletions

View File

@@ -26,28 +26,32 @@
fieldName: 'baseColumns', fieldName: 'baseColumns',
header: 'Base columns', header: 'Base columns',
slot: 0, slot: 0,
sortable: true,
}, },
{ {
fieldName: 'refTableName', fieldName: 'refTableName',
header: 'Referenced table', header: 'Referenced table',
sortable: true,
}, },
{ {
fieldName: 'refColumns', fieldName: 'refColumns',
header: 'Referenced columns', header: 'Referenced columns',
slot: 1, slot: 1,
sortable: true,
}, },
{ {
fieldName: 'updateAction', fieldName: 'updateAction',
header: 'ON UPDATE', header: 'ON UPDATE',
sortable: true,
}, },
{ {
fieldName: 'deleteAction', fieldName: 'deleteAction',
header: 'ON DELETE', header: 'ON DELETE',
sortable: true,
}, },
onRemove onRemove
? { ? {
fieldName: 'actions', fieldName: 'actions',
sortable: true,
slot: 2, slot: 2,
} }
: null, : null,

View File

@@ -46,6 +46,7 @@
fieldName: 'displayName', fieldName: 'displayName',
header: 'Name', header: 'Name',
slot: -1, slot: -1,
sortable: true,
}, },
...columns, ...columns,
])} ])}

View File

@@ -8,6 +8,7 @@
formatter?: any; formatter?: any;
slot?: number; slot?: number;
isHighlighted?: Function; isHighlighted?: Function;
sortable?: boolean;
} }
</script> </script>
@@ -17,6 +18,7 @@
import { onMount } from 'svelte'; import { onMount } from 'svelte';
import keycodes from '../utility/keycodes'; import keycodes from '../utility/keycodes';
import { createEventDispatcher } from 'svelte'; import { createEventDispatcher } from 'svelte';
import FontIcon from '../icons/FontIcon.svelte';
export let columns: TableControlColumn[]; export let columns: TableControlColumn[];
export let rows; export let rows;
@@ -40,12 +42,18 @@
const handleKeyDown = event => { const handleKeyDown = event => {
if (event.keyCode == keycodes.downArrow) { if (event.keyCode == keycodes.downArrow) {
selectedIndex = Math.min(selectedIndex + 1, rows.length - 1); selectedIndex = Math.min(selectedIndex + 1, sortedRows.length - 1);
} }
if (event.keyCode == keycodes.upArrow) { if (event.keyCode == keycodes.upArrow) {
selectedIndex = Math.max(0, selectedIndex - 1); selectedIndex = Math.max(0, selectedIndex - 1);
} }
}; };
let sortedByField = null;
let sortOrderIsDesc = false;
$: sortedRowsTmp = sortedByField ? _.sortBy(rows || [], sortedByField) : rows;
$: sortedRows = sortOrderIsDesc ? [...sortedRowsTmp].reverse() : sortedRowsTmp;
</script> </script>
<table <table
@@ -59,12 +67,34 @@
<thead> <thead>
<tr> <tr>
{#each columnList as col} {#each columnList as col}
<td>{col.header || ''}</td> <td
class:clickable={col.sortable}
on:click={() => {
if (col.sortable) {
if (sortedByField == col.fieldName) {
if (sortOrderIsDesc) {
sortOrderIsDesc = false;
sortedByField = null;
} else {
sortOrderIsDesc = true;
}
} else {
sortOrderIsDesc = false;
sortedByField = col.fieldName;
}
}
}}
>
{col.header || ''}
{#if sortedByField == col.fieldName}
<FontIcon icon={sortOrderIsDesc ? 'img sort-desc' : 'img sort-asc'} padLeft />
{/if}
</td>
{/each} {/each}
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{#each rows as row, index} {#each sortedRows as row, index}
<tr <tr
class:selected={selectable && selectedIndex == index} class:selected={selectable && selectedIndex == index}
class:clickable class:clickable
@@ -105,7 +135,7 @@
{/each} {/each}
</tr> </tr>
{/each} {/each}
{#if emptyMessage && rows.length == 0} {#if emptyMessage && sortedRows.length == 0}
<tr> <tr>
<td colspan={columnList.length}>{emptyMessage}</td> <td colspan={columnList.length}>{emptyMessage}</td>
</tr> </tr>
@@ -150,4 +180,8 @@
td.isHighlighted { td.isHighlighted {
background-color: var(--theme-bg-1); background-color: var(--theme-bg-1);
} }
td.clickable {
cursor: pointer;
}
</style> </style>

View File

@@ -53,11 +53,11 @@
fieldName: 'columns', fieldName: 'columns',
header: 'Columns', header: 'Columns',
slot: 0, slot: 0,
sortable: true,
}, },
isWritable isWritable
? { ? {
fieldName: 'actions', fieldName: 'actions',
sortable: true,
slot: 1, slot: 1,
} }
: null, : null,

View File

@@ -245,7 +245,6 @@
isWritable isWritable
? { ? {
fieldName: 'actions', fieldName: 'actions',
sortable: true,
slot: 3, slot: 3,
} }
: null, : null,
@@ -293,16 +292,17 @@
fieldName: 'columns', fieldName: 'columns',
header: 'Columns', header: 'Columns',
slot: 0, slot: 0,
sortable: true,
}, },
{ {
fieldName: 'unique', fieldName: 'unique',
header: 'Unique', header: 'Unique',
slot: 1, slot: 1,
sortable: true,
}, },
isWritable isWritable
? { ? {
fieldName: 'actions', fieldName: 'actions',
sortable: true,
slot: 2, slot: 2,
} }
: null, : null,
@@ -335,6 +335,7 @@
fieldName: 'columns', fieldName: 'columns',
header: 'Columns', header: 'Columns',
slot: 0, slot: 0,
sortable: true,
}, },
isWritable isWritable
? { ? {