Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/lib/components/batch-operations/header.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,11 @@
import { autoRefresh } from '$lib/stores/batch-operations';
import type { BatchOperation, BatchOperationState } from '$lib/types/batch';

export let operation: BatchOperation;
interface Props {
operation: BatchOperation;
}

let { operation }: Props = $props();

const dispatch = createEventDispatcher<{
toggleAutoRefresh: { checked: boolean };
Expand Down
10 changes: 3 additions & 7 deletions src/lib/components/data-encoder-status.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,9 @@
}
};

let variant: 'primary' | 'ghost' = 'ghost';

const updateVariant = (open: boolean) => {
variant = open ? 'primary' : 'ghost';
};

$: updateVariant($viewDataEncoderSettings);
const variant = $derived<'primary' | 'ghost'>(
$viewDataEncoderSettings ? 'primary' : 'ghost',
);
</script>

<div class="mx-1 flex items-center">
Expand Down
7 changes: 4 additions & 3 deletions src/lib/components/import/event-history-file-import.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@
import { parseWithBigInt } from '$lib/utilities/parse-with-big-int';
import { routeForEventHistoryImport } from '$lib/utilities/route-for';

let rawEvents: HistoryEvent[] | { events: HistoryEvent[] };
let fileLoaded = false;
let rawEvents: HistoryEvent[] | { events: HistoryEvent[] } | undefined =
$state(undefined);
let fileLoaded = $state(false);

const onFileSelect = async (e: Event) => {
const target = e.target as HTMLInputElement;
Expand Down Expand Up @@ -70,7 +71,7 @@
class="import-input block border border-slate-200 p-2"
type="file"
accept=".json"
on:change={onFileSelect}
onchange={onFileSelect}
/>
<Button leadingIcon="file-upload" on:click={onConfirm} disabled={!fileLoaded}
>{translate('common.import')}</Button
Expand Down
26 changes: 16 additions & 10 deletions src/lib/components/lines-and-dots/event-sort-filter.svelte
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<script context="module">
<script module>
export const dateParameter = 'time-format';
</script>

<script lang="ts">
import { page } from '$app/stores';
import { page } from '$app/state';

import Icon from '$lib/holocene/icon/icon.svelte';
import {
Expand All @@ -22,9 +22,13 @@
import { getDateFilterValue } from '$lib/utilities/event-formatting';
import { updateQueryParameters } from '$lib/utilities/update-query-parameters';

export let compact: boolean;
interface Props {
compact: boolean;
}

let sortOptions: EventSortOrderOptions = [
let { compact }: Props = $props();

const sortOptions: EventSortOrderOptions = [
{ label: translate('events.sort-ascending'), option: 'ascending' },
{ label: translate('events.sort-descending'), option: 'descending' },
];
Expand All @@ -34,7 +38,7 @@
updateQueryParameters({
parameter: 'sort',
value: option,
url: $page.url,
url: page.url,
});
};

Expand All @@ -46,11 +50,13 @@
}
};

$: value = getDateFilterValue({
compact,
sortOrder: $eventFilterSort,
showElapsed: $eventShowElapsed,
});
const value = $derived(
getDateFilterValue({
compact,
sortOrder: $eventFilterSort,
showElapsed: $eventShowElapsed,
}),
);
</script>

<MenuContainer>
Expand Down
76 changes: 51 additions & 25 deletions src/lib/components/lines-and-dots/svg/timeline-graph.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -17,38 +17,64 @@
import TimelineGraphRow from './timeline-graph-row.svelte';
import WorkflowRow from './workflow-row.svelte';

export let x = 0;
export let y = 0;
export let workflow: WorkflowExecution;
export let groups: EventGroups;
export let viewportHeight: number | undefined;
export let readOnly = false;
export let error: boolean = false;
interface Props {
x?: number;
y?: number;
workflow: WorkflowExecution;
groups: EventGroups;
viewportHeight: number | undefined;
readOnly?: boolean;
error?: boolean;
}

let {
x = 0,
y = 0,
workflow,
groups,
viewportHeight,
readOnly = false,
error = false,
}: Props = $props();

const { height, gutter, radius } = TimelineConfig;

let canvasWidth = 0;
let scrollY = 0;
let canvasWidth = $state(0);
let scrollY = $state(0);

const expandedGroupHeight = $derived(readOnly ? 0 : $activeGroupHeight);
const filteredGroups = $derived(
getFailedOrPendingGroups(groups, $eventStatusFilter),
);
const firstStartTime = $derived.by(() => {
const firstEventTime = $fullEventHistory[0]?.eventTime;

$: expandedGroupHeight = readOnly ? 0 : $activeGroupHeight;
$: filteredGroups = getFailedOrPendingGroups(groups, $eventStatusFilter);
$: firstStartTime =
$fullEventHistory[0]?.eventTime < workflow.executionTime
? $fullEventHistory[0]?.eventTime
if (!firstEventTime) {
return workflow.executionTime;
}

return firstEventTime < workflow.executionTime
? firstEventTime
: workflow.executionTime;
$: startTime =
(!isWorkflowDelayed(workflow) && firstStartTime) || workflow.startTime;
$: timelineHeight =
Math.max(height * (filteredGroups.length + 2), 120) + expandedGroupHeight;
$: canvasHeight = timelineHeight + 120;
});

const startTime = $derived(
(!isWorkflowDelayed(workflow) && firstStartTime) || workflow.startTime,
);
const timelineHeight = $derived(
Math.max(height * (filteredGroups.length + 2), 120) + expandedGroupHeight,
);
const canvasHeight = $derived(timelineHeight + 120);

const handleScroll = (e) => {
scrollY = e?.target?.scrollTop;
const handleScroll = (e: Event) => {
scrollY = (e?.target as HTMLElement)?.scrollTop;
};

$: groupIndexMap = new Map(filteredGroups.map((g, i) => [g.id, i]));
const groupIndexMap = $derived(
new Map(filteredGroups.map((g, i) => [g.id, i])),
);

$: activeGroupsHeightAboveGroup = (groupIndex: number) => {
const activeGroupsHeightAboveGroup = (groupIndex: number) => {
const hasActiveAbove = $activeGroups?.some((id) => {
const activeIndex = groupIndexMap.get(id);
return activeIndex !== undefined && activeIndex < groupIndex;
Expand All @@ -62,7 +88,7 @@
class="relative h-auto overflow-auto border border-t-0 border-subtle bg-primary"
bind:clientWidth={canvasWidth}
style={viewportHeight ? `max-height: ${viewportHeight}px;` : ''}
on:scroll={handleScroll}
onscroll={handleScroll}
>
<EndTimeInterval
{workflow}
Expand Down Expand Up @@ -108,7 +134,7 @@
x2={canvasWidth - gutter + radius / 4}
{timelineHeight}
{startTime}
{duration}
duration={duration ?? 0}
/>
<WorkflowRow {workflow} y={height} length={canvasWidth} />
{#each filteredGroups as group, index (group.id)}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
<svelte:options runes />

<script lang="ts">
import { getContext } from 'svelte';
Expand Down
16 changes: 10 additions & 6 deletions src/lib/components/search-attribute-filter/filter-list.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

import { getContext } from 'svelte';

import { page } from '$app/stores';
import { page } from '$app/state';

import Timestamp from '$lib/components/timestamp.svelte';
import WorkflowStatus from '$lib/components/workflow-status.svelte';
Expand All @@ -24,15 +24,19 @@

import { FILTER_CONTEXT, type FilterContext } from './index.svelte';

export let filters: SearchAttributeFilter[];
interface Props {
filters: SearchAttributeFilter[];
}

let { filters = $bindable() }: Props = $props();

const { filter, activeQueryIndex } =
getContext<FilterContext>(FILTER_CONTEXT);

const removeQuery = (index: number) => {
filters.splice(index, 1);
filters = filters;
updateQueryParamsFromFilter($page.url, filters);
updateQueryParamsFromFilter(page.url, filters);

if (index === filters.length) {
const previousQuery = filters[filters.length - 1];
Expand All @@ -49,10 +53,10 @@
}
};

let totalFiltersInView = 5;
let totalFiltersInView = $state(5);

$: visibleFilters = filters.slice(0, totalFiltersInView);
$: hasMoreFilters = totalFiltersInView < filters.length;
const visibleFilters = $derived(filters.slice(0, totalFiltersInView));
const hasMoreFilters = $derived(totalFiltersInView < filters.length);

const viewMoreFilters = () => {
if (hasMoreFilters) {
Expand Down
16 changes: 11 additions & 5 deletions src/lib/components/search-attribute-filter/status-filter.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

import { getContext } from 'svelte';

import { page } from '$app/stores';
import { page } from '$app/state';

import WorkflowStatus from '$lib/components/workflow-status.svelte';
import Checkbox from '$lib/holocene/checkbox.svelte';
Expand All @@ -22,16 +22,22 @@

import { FILTER_CONTEXT, type FilterContext } from './index.svelte';

export let filters: SearchAttributeFilter[];
interface Props {
filters: SearchAttributeFilter[];
}

let { filters = $bindable() }: Props = $props();

const { filter, resetFilter } = getContext<FilterContext>(FILTER_CONTEXT);
const open = writable(true);
$: _filters = [...filters];
$: statusFilters = _filters.filter((filter) => isStatusFilter(filter));
let _filters: SearchAttributeFilter[] = $derived([...filters]);
const statusFilters = $derived(
_filters.filter((filter) => isStatusFilter(filter)),
);

function apply() {
filters = _filters;
updateQueryParamsFromFilter($page.url, filters);
updateQueryParamsFromFilter(page.url, filters);
}

function mapStatusToFilter(value: string) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
<svelte:options runes />

<script lang="ts">
import FilterBar from '$lib/components/shared-search-attribute-filter/filter-bar.svelte';
import { activitiesQuery, activityRefresh } from '$lib/stores/activities';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,21 @@

import OrderableList from './orderable-list.svelte';

export let availableColumns: Readable<ConfigurableTableHeader[]>;
export let open: boolean;
export let table: ConfigurableTableType = TABLE_TYPE.WORKFLOWS;
export let type: string;
export let title: string;
interface Props {
availableColumns: Readable<ConfigurableTableHeader[]>;
open: boolean;
table?: ConfigurableTableType;
type: string;
title: string;
}

let {
availableColumns,
open = $bindable(),
table = TABLE_TYPE.WORKFLOWS,
type,
title,
}: Props = $props();

const closeCustomizationDrawer = () => {
open = false;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<script lang="ts">
import type { Readable } from 'svelte/store';

import { page } from '$app/stores';
import { page } from '$app/state';

import OrderableListItem from '$lib/holocene/orderable-list/orderable-list-item.svelte';
import OrderableList from '$lib/holocene/orderable-list/orderable-list.svelte';
Expand All @@ -16,15 +16,21 @@
removeColumn,
} from '$lib/stores/configurable-table-columns';

export let table: ConfigurableTableType;
export let availableColumns: Readable<ConfigurableTableHeader[]>;
export let type: string;
interface Props {
table: ConfigurableTableType;
availableColumns: Readable<ConfigurableTableHeader[]>;
type: string;
}

$: namespace = $page.params.namespace;
$: columnsInUse = $configurableTableColumns?.[namespace]?.[table] ?? [];
$: availableCustomColumns = availableCustomSearchAttributeColumns(
namespace,
table,
let { table, availableColumns, type }: Props = $props();

const namespace = $derived(page.params.namespace);
const columnsInUse = $derived(
$configurableTableColumns?.[namespace]?.[table] ?? [],
);

const availableCustomColumns = $derived(
availableCustomSearchAttributeColumns(namespace, table),
);
</script>

Expand Down Expand Up @@ -65,7 +71,7 @@
<svelte:fragment slot="heading">
Available Columns <span class="font-normal">(not in view)</span>
</svelte:fragment>
{#each $availableColumns as { label }}
{#each $availableColumns as { label } (label)}
<OrderableListItem
static
on:addItem={() => addColumn(label, namespace, table)}
Expand All @@ -86,7 +92,7 @@
{translate('events.custom-search-attributes')}
<span class="font-normal">(not in view)</span>
</svelte:fragment>
{#each $availableCustomColumns as { label }}
{#each $availableCustomColumns as { label } (label)}
<OrderableListItem
static
on:addItem={() => addColumn(label, namespace, table)}
Expand Down
Loading
Loading