diff --git a/src/Exceptionless.Web/ClientApp/src/app.css b/src/Exceptionless.Web/ClientApp/src/app.css index 49c5cf7d8f..db2060803e 100644 --- a/src/Exceptionless.Web/ClientApp/src/app.css +++ b/src/Exceptionless.Web/ClientApp/src/app.css @@ -152,11 +152,7 @@ } html { - overflow-y: scroll; - } - - html:has([data-slot='sheet-content']) { - overflow-y: hidden; + overflow: hidden; } body { diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/events/components/event-detail-sheet.svelte b/src/Exceptionless.Web/ClientApp/src/lib/features/events/components/event-detail-sheet.svelte index d19ca71401..788705dab2 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/features/events/components/event-detail-sheet.svelte +++ b/src/Exceptionless.Web/ClientApp/src/lib/features/events/components/event-detail-sheet.svelte @@ -38,16 +38,17 @@ - - + + Event Details -
+
{#if eventId} {/if} diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/components/column-management-dialog.svelte b/src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/components/column-management-dialog.svelte new file mode 100644 index 0000000000..2ca3904b1e --- /dev/null +++ b/src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/components/column-management-dialog.svelte @@ -0,0 +1,196 @@ + + + + + + + + Manage Columns + + Add columns from the available list and reorder selected columns. + + + +
+ +
+

Available

+
+
+ {#if availableColumns.length === 0} +

All columns are visible

+ {:else} + {#each availableColumns as column (column.id)} +
+ {getColumnLabel(column)} + +
+ {/each} + {/if} +
+
+
+ + +
+

Selected

+
+
+ {#each visibleColumns as column, index (column.id)} +
handleDragStart(event, column.id)} + ondragover={(event) => handleDragOver(event, column.id)} + ondragend={handleDragEnd} + role="listitem" + > + + {getColumnLabel(column)} +
+ + + {#if canRemoveColumn(column)} + + {/if} +
+
+ {/each} +
+
+
+
+
+
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/components/saved-view-picker.svelte b/src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/components/saved-view-picker.svelte index 43ceebd333..1b775a7c13 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/components/saved-view-picker.svelte +++ b/src/Exceptionless.Web/ClientApp/src/lib/features/saved-views/components/saved-view-picker.svelte @@ -15,7 +15,7 @@ import { serializeFilters } from '$features/events/components/filters/helpers.svelte'; import { organization } from '$features/organizations/context.svelte'; import { getMeQuery } from '$features/users/api.svelte'; - import GripVertical from '@lucide/svelte/icons/grip-vertical'; + import Columns3 from '@lucide/svelte/icons/columns-3'; import Pencil from '@lucide/svelte/icons/pencil'; import Plus from '@lucide/svelte/icons/plus'; import Save from '@lucide/svelte/icons/save'; @@ -37,6 +37,7 @@ postSavedView, restoreDeletedSavedView } from '../api.svelte'; + import ColumnManagementDialog from './column-management-dialog.svelte'; import DeleteViewDialog from './delete-view-dialog.svelte'; import RenameViewDialog from './rename-view-dialog.svelte'; import SaveViewDialog from './save-view-dialog.svelte'; @@ -94,7 +95,7 @@ let isSaveDialogOpen = $state(false); let isRenameDialogOpen = $state(false); let isDeleteDialogOpen = $state(false); - let draggedColumnId = $state(null); + let isColumnDialogOpen = $state(false); let viewToDelete = $state(null); const organizationId = $derived(organization.current); @@ -180,9 +181,8 @@ const activeView = $derived(activeSavedView); const predefinedViewTarget = $derived(activeView ?? duplicateView); - const hideableColumns = $derived(table.getAllLeafColumns().filter((column) => column.getCanHide())); + const reorderableColumns = $derived(table.getAllLeafColumns().filter((column) => column.id !== 'select')); - const visibleHideableColumnCount = $derived(hideableColumns.filter((column) => column.getIsVisible()).length); async function openSaveDialog() { await tick(); @@ -194,24 +194,6 @@ isRenameDialogOpen = true; } - function canToggleColumn(column: (typeof hideableColumns)[number]): boolean { - return !column.getIsVisible() || visibleHideableColumnCount > 1; - } - - function toggleColumn(column: (typeof hideableColumns)[number]): void { - if (canToggleColumn(column)) { - column.toggleVisibility(); - } - } - - function getColumnLabel(column: (typeof reorderableColumns)[number]): string { - if (typeof column.columnDef.header === 'string') { - return column.columnDef.header; - } - - return column.id.replace(/[_-]/g, ' ').replace(/\w\S*/g, (word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()); - } - function getSavedColumnOrder(): string[] | undefined { const currentColumnIds = new Set(table.getAllLeafColumns().map((column) => column.id)); const savedColumnOrder = (columnOrder ?? []).filter((columnId) => columnId !== 'select' && currentColumnIds.has(columnId)); @@ -219,49 +201,6 @@ return savedColumnOrder.length > 0 ? savedColumnOrder : undefined; } - function handleColumnDragEnd(): void { - draggedColumnId = null; - } - - function handleColumnDragOver(event: DragEvent, targetColumnId: string): void { - event.preventDefault(); - if (event.dataTransfer) { - event.dataTransfer.dropEffect = 'move'; - } - - if (draggedColumnId && draggedColumnId !== targetColumnId) { - moveColumn(draggedColumnId, targetColumnId); - } - } - - function handleColumnDragStart(event: DragEvent, columnId: string): void { - draggedColumnId = columnId; - if (event.dataTransfer) { - event.dataTransfer.effectAllowed = 'move'; - event.dataTransfer.setData('text/plain', columnId); - } - } - - function moveColumn(columnId: string, targetColumnId: string): void { - const columnIds = reorderableColumns.map((column) => column.id); - const columnIndex = columnIds.indexOf(columnId); - const targetIndex = columnIds.indexOf(targetColumnId); - if (columnIndex === -1 || targetIndex < 0 || targetIndex >= columnIds.length) { - return; - } - - const [movedColumnId] = columnIds.splice(columnIndex, 1); - if (!movedColumnId) { - return; - } - - columnIds.splice(targetIndex, 0, movedColumnId); - - const allColumnIds = table.getAllLeafColumns().map((column) => column.id); - const extraColumnIds = allColumnIds.filter((id) => id !== 'select' && !columnIds.includes(id)); - table.setColumnOrder(['select', ...columnIds, ...extraColumnIds]); - } - async function openDeleteDialog(savedView: SavedView) { viewToDelete = savedView; await tick(); @@ -485,46 +424,10 @@ {#if reorderableColumns.length > 0} - Columns -
- {#each reorderableColumns as column (column.id)} -
handleColumnDragOver(event, column.id)} - ondragstart={(event) => handleColumnDragStart(event, column.id)} - role="listitem" - > - {#if column.getCanHide()} - { - event.preventDefault(); - toggleColumn(column); - }} - onSelect={(event) => event.preventDefault()} - > - {getColumnLabel(column)} - - {:else} - - - {getColumnLabel(column)} - - {/if} -
- {/each} -
+ (isColumnDialogOpen = true)}> +
{/if} @@ -558,3 +461,7 @@ {#if isDeleteDialogOpen} {/if} + +{#if isColumnDialogOpen} + +{/if} diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/faceted-filter/faceted-filter-actions.svelte b/src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/faceted-filter/faceted-filter-actions.svelte index ca328a662d..6ab6c1d13e 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/faceted-filter/faceted-filter-actions.svelte +++ b/src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/faceted-filter/faceted-filter-actions.svelte @@ -16,10 +16,10 @@
{#if showClear} - + {/if} {#if toggleHidden} - + {/if} - +
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/faceted-filter/faceted-filter-builder.svelte b/src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/faceted-filter/faceted-filter-builder.svelte index 365e3ce714..ec2bf1766e 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/faceted-filter/faceted-filter-builder.svelte +++ b/src/Exceptionless.Web/ClientApp/src/lib/features/shared/components/faceted-filter/faceted-filter-builder.svelte @@ -231,14 +231,13 @@
{#if hiddenFilterCount > 0} - {/if} {#if filters.some((f) => f.type !== 'date')} - + {/if} -
diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/issue-detail-sheet.svelte b/src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/issue-detail-sheet.svelte index 438b73106a..1c6939b377 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/issue-detail-sheet.svelte +++ b/src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/issue-detail-sheet.svelte @@ -37,16 +37,17 @@ - - + + Issue Details -
+
{#if stackId} {/if} diff --git a/src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/stack-card.svelte b/src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/stack-card.svelte index 84f770d87e..b6af7d032c 100644 --- a/src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/stack-card.svelte +++ b/src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/stack-card.svelte @@ -113,7 +113,9 @@ {#if stackQuery.isSuccess} - +
diff --git a/src/Exceptionless.Web/ClientApp/src/routes/(app)/(components)/layouts/navbar.svelte b/src/Exceptionless.Web/ClientApp/src/routes/(app)/(components)/layouts/navbar.svelte index ca2625356f..058f6ceadf 100644 --- a/src/Exceptionless.Web/ClientApp/src/routes/(app)/(components)/layouts/navbar.svelte +++ b/src/Exceptionless.Web/ClientApp/src/routes/(app)/(components)/layouts/navbar.svelte @@ -20,7 +20,7 @@