From ed0c2e62ab96cceedaa27d4ac59ea0326c75db29 Mon Sep 17 00:00:00 2001 From: Alex Tideman Date: Fri, 21 Feb 2025 10:34:23 -0600 Subject: [PATCH 001/172] Update version.go to v2.35.1 (#2573) --- server/server/version/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/server/version/version.go b/server/server/version/version.go index 07874ef19..4bf5e38d7 100644 --- a/server/server/version/version.go +++ b/server/server/version/version.go @@ -28,5 +28,5 @@ const ( clientNameHeaderName = "client-name" clientNameHeaderValue = "temporal-ui" clientVersionHeaderName = "client-version" - UIVersion = "2.35.0" + UIVersion = "2.35.1" ) From 6506abf6b388d16e840e28ca3dc9fd638f72e3fa Mon Sep 17 00:00:00 2001 From: Alex Tideman Date: Mon, 24 Feb 2025 10:14:35 -0600 Subject: [PATCH 002/172] Show multiple callbacks and WorkflowExecutionUpdateOptions attributes (#2574) * Add multiple callbacks, how UpdateOptions attributes * Add multiple callbacks and options attributes * Format * Remove unused isCheck * Warn on ts-ignore * Update snapshots * Fix type and remove warn --- .../workflow-callback.svelte | 13 ++++++-- .../workflow/workflow-callbacks.svelte | 33 +++++++++++++++++++ .../holocene/accordion/accordion-light.svelte | 2 +- src/lib/i18n/locales/en/nexus.ts | 1 + .../layouts/workflow-history-layout.svelte | 4 +-- .../get-event-categorization.test.ts | 1 + .../event-history/get-event-categorization.ts | 1 + src/lib/utilities/is-event-type.ts | 2 ++ 8 files changed, 51 insertions(+), 6 deletions(-) rename src/lib/components/{lines-and-dots => workflow}/workflow-callback.svelte (90%) create mode 100644 src/lib/components/workflow/workflow-callbacks.svelte diff --git a/src/lib/components/lines-and-dots/workflow-callback.svelte b/src/lib/components/workflow/workflow-callback.svelte similarity index 90% rename from src/lib/components/lines-and-dots/workflow-callback.svelte rename to src/lib/components/workflow/workflow-callback.svelte index 4ae16dceb..2f5e37716 100644 --- a/src/lib/components/lines-and-dots/workflow-callback.svelte +++ b/src/lib/components/workflow/workflow-callback.svelte @@ -3,9 +3,9 @@ import Badge from '$lib/holocene/badge.svelte'; import CodeBlock from '$lib/holocene/code-block.svelte'; import { translate } from '$lib/i18n/translate'; - import { fullEventHistory } from '$lib/stores/events'; import { timeFormat } from '$lib/stores/time-format'; import type { CallbackState } from '$lib/types'; + import type { EventLink as Link } from '$lib/types/events'; import type { Callback } from '$lib/types/nexus'; import { formatDate } from '$lib/utilities/format-date'; import { routeForNamespace } from '$lib/utilities/route-for'; @@ -13,11 +13,13 @@ import EventLink from '../event/event-link.svelte'; export let callback: Callback; + export let link: Link | undefined = undefined; $: completedTime = formatDate(callback.lastAttemptCompleteTime, $timeFormat); $: nextTime = formatDate(callback.nextAttemptScheduleTime, $timeFormat); $: failure = callback?.lastAttemptFailure?.message; $: blockedReason = callback?.blockedReason; + $: callbackUrl = callback?.callback?.nexus?.url; const titles = { Standby: translate('nexus.callback.standby'), @@ -26,8 +28,6 @@ Failed: translate('nexus.callback.failed'), Succeeded: translate('nexus.callback.succeeded'), }; - $: initialEvent = $fullEventHistory[0]; - $: link = initialEvent?.links[0]; const failedState = 'Failed' as unknown as CallbackState; $: failed = callback.state === failedState; @@ -68,6 +68,12 @@

{/if} + {#if !link} +

+ {translate('nexus.callback-url')} + {callbackUrl} +

+ {/if} {#if blockedReason}

{translate('nexus.blocked-reason')} @@ -86,4 +92,5 @@ {/if} + diff --git a/src/lib/components/workflow/workflow-callbacks.svelte b/src/lib/components/workflow/workflow-callbacks.svelte new file mode 100644 index 000000000..b2dbdbb76 --- /dev/null +++ b/src/lib/components/workflow/workflow-callbacks.svelte @@ -0,0 +1,33 @@ + + + + {#if callbacks.length > 1} +

+ +

+ View {callbacks.length - 1} other Callbacks +

+ {#if open} +
+ {#each callbacks.slice(1) as callback} + + {/each} +
+ {/if} +
+
+ {/if} + diff --git a/src/lib/holocene/accordion/accordion-light.svelte b/src/lib/holocene/accordion/accordion-light.svelte index eab7f05ce..b110db1e0 100644 --- a/src/lib/holocene/accordion/accordion-light.svelte +++ b/src/lib/holocene/accordion/accordion-light.svelte @@ -31,7 +31,7 @@ }; -
+
+
+
+ +
+ translate('common.go-to-page', { page })} + items={deployment.workerDeploymentInfo.versionSummaries} + let:visibleItems + > + + {translate('deployments.deployments')} + + + + {#each columns as { label }, index} + {label} + {/each} + + + {#each visibleItems as version} + + {/each} + +
+{/await} diff --git a/src/lib/pages/deployments.svelte b/src/lib/pages/deployments.svelte new file mode 100644 index 000000000..fbb33c111 --- /dev/null +++ b/src/lib/pages/deployments.svelte @@ -0,0 +1,96 @@ + + +
+ {#key [namespace]} + + {translate('deployments.deployments')} +
+
+

+ {translate('deployments.worker-deployments')} +

+ Pre-Release +
+
+ + + {#each columns as { label }, index} + {label} + {/each} + + {#each visibleItems as deployment} + + {/each} + + + +

+ Enable Worker Deployments to manage your workers more effectively. Learn more. +

+ {#if error} + + {error} + + {/if} +
+
+
+ {/key} +
diff --git a/src/lib/services/deployments-service.ts b/src/lib/services/deployments-service.ts new file mode 100644 index 000000000..240de1aad --- /dev/null +++ b/src/lib/services/deployments-service.ts @@ -0,0 +1,57 @@ +import type { + DeploymentParameters, + DeploymentVersionParameters, + ListWorkerDeploymentsResponse, + WorkerDeploymentResponse, + WorkerDeploymentSummary, + WorkerDeploymentVersionResponse, +} from '$lib/types/deployments'; +import type { ErrorCallback } from '$lib/utilities/request-from-api'; +import { requestFromAPI } from '$lib/utilities/request-from-api'; +import { routeForApi } from '$lib/utilities/route-for-api'; + +type PaginatedDeploymentsPromise = ( + pageSize: number, + token: string, +) => Promise<{ items: WorkerDeploymentSummary[]; nextPageToken: string }>; + +export const fetchPaginatedDeployments = async ( + namespace: string, + query: string, + onError: ErrorCallback, + request = fetch, +): Promise => { + return (pageSize = 100, token = '') => { + const route = routeForApi('worker-deployments', { namespace }); + return requestFromAPI(route, { + params: { + maximumPageSize: String(pageSize), + nextPageToken: token, + ...(query ? { query } : {}), + }, + request, + onError, + }).then(({ workerDeployments, nextPageToken }) => { + return { + items: workerDeployments, + nextPageToken: nextPageToken ? String(nextPageToken) : '', + }; + }); + }; +}; + +export const fetchDeployment = async ( + parameters: DeploymentParameters, + request = fetch, +): Promise => { + const route = routeForApi('worker-deployment', parameters); + return requestFromAPI(route, { request }); +}; + +export const fetchDeploymentVersion = async ( + parameters: DeploymentVersionParameters, + request = fetch, +): Promise => { + const route = routeForApi('worker-deployment-version', parameters); + return requestFromAPI(route, { request }); +}; diff --git a/src/lib/stores/configurable-table-columns.ts b/src/lib/stores/configurable-table-columns.ts index ab87d18ce..2f91c26ba 100644 --- a/src/lib/stores/configurable-table-columns.ts +++ b/src/lib/stores/configurable-table-columns.ts @@ -113,6 +113,9 @@ const DEFAULT_AVAILABLE_WORKFLOWS_COLUMNS: ConfigurableTableHeader[] = [ { label: 'Task Queue', pinned: false }, { label: 'Scheduled By ID', pinned: false }, { label: 'Scheduled Start Time', pinned: false }, + { label: 'Deployment', pinned: false }, + { label: 'Deployment Version', pinned: false }, + { label: 'Versioning Behavior', pinned: false }, ]; const DEFAULT_SCHEDULES_COLUMNS: ConfigurableTableHeader[] = [ diff --git a/src/lib/types/api.ts b/src/lib/types/api.ts index c91f90f4a..9ce76ab03 100644 --- a/src/lib/types/api.ts +++ b/src/lib/types/api.ts @@ -46,6 +46,9 @@ export type ScheduleAPIRoutePath = | 'schedule.edit'; export type SearchAttributesRoutePath = 'search-attributes'; export type NexusAPIRoutePath = 'nexus-endpoint' | 'nexus-endpoint.update'; +export type WorkerDeploymentsAPIRoutePath = 'worker-deployments'; +export type WorkerDeploymentAPIRoutePath = 'worker-deployment'; +export type WorkerDeploymentVersionAPIRoutePath = 'worker-deployment-version'; export type APIRoutePath = | ParameterlessAPIRoutePath @@ -62,7 +65,10 @@ export type APIRoutePath = | WorkflowsAPIRoutePath | NamespaceAPIRoutePath | BatchAPIRoutePath - | NexusAPIRoutePath; + | NexusAPIRoutePath + | WorkerDeploymentsAPIRoutePath + | WorkerDeploymentAPIRoutePath + | WorkerDeploymentVersionAPIRoutePath; export type APIRouteParameters = { namespace: string; @@ -75,6 +81,8 @@ export type APIRouteParameters = { updateName: string; activityId: string; endpointId: string; + deploymentName: string; + version: string; }; export type WorkflowListRouteParameters = Pick; @@ -132,3 +140,17 @@ export type ScheduleRouteParameters = Pick< >; export type NexusRouteParameters = Pick; + +export type WorkerDeploymentListRouteParameters = Pick< + APIRouteParameters, + 'namespace' +>; +export type WorkerDeploymentRouteParameters = Pick< + APIRouteParameters, + 'namespace' | 'deploymentName' +>; + +export type WorkerDeploymentVersionRouteParameters = Pick< + APIRouteParameters, + 'namespace' | 'version' +>; diff --git a/src/lib/types/deployments.ts b/src/lib/types/deployments.ts new file mode 100644 index 000000000..f3630fe8c --- /dev/null +++ b/src/lib/types/deployments.ts @@ -0,0 +1,86 @@ +import type { Timestamp } from '@temporalio/common'; + +export interface DeploymentParameters { + namespace: string; + deploymentName: string; +} + +export interface DeploymentVersionParameters { + namespace: string; + version: string; +} + +export interface RoutingConfig { + currentVersion: string; + rampingVersion: string; + rampingVersionPercentage: number; + currentVersionChangedTime: Timestamp; + rampingVersionChangedTime: Timestamp; + rampingVersionPercentageChangedTime: Timestamp; +} + +export interface WorkerDeploymentSummary { + name: string; + createTime: Timestamp; + routingConfig: RoutingConfig; +} + +export interface ListWorkerDeploymentsResponse { + nextPageToken: string; + workerDeployments: WorkerDeploymentSummary[]; +} + +export interface VersionSummary { + version: string; + createTime: Timestamp; + drainageStatus: string; +} +export interface WorkerDeploymentInfo extends WorkerDeploymentSummary { + lastModifierIdentity: string; + versionSummaries: VersionSummary[]; +} + +export interface WorkerDeploymentResponse { + conflictToken: string; + workerDeploymentInfo: WorkerDeploymentInfo; +} + +export interface TaskQueueInfo { + name: string; + type: string; +} + +export interface VersioningInfo { + behavior: string; + version: string; +} + +export interface WorkerDeploymentVersionInfo { + version: string; + deploymentName: string; + createTime: Timestamp; + routingChangedTime: Timestamp; + currentSinceTime: Timestamp; + rampingSinceTime: Timestamp; + rampPercentage: number; + taskQueueInfos: TaskQueueInfo[]; + drainageInfo: { + status: string; + lastChangedTime: Timestamp; + lastCheckedTime: Timestamp; + }; + metadata: { + entries: Record; + }; +} + +export interface WorkerDeploymentVersionResponse { + workerDeploymentVersionInfo: WorkerDeploymentVersionInfo; +} + +export type DeploymentStatus = + | 'Ramping' + | 'Current' + | 'Draining' + | 'Drained' + | 'Inactive'; diff --git a/src/lib/types/workflows.ts b/src/lib/types/workflows.ts index aec65d6c5..4162fff8e 100644 --- a/src/lib/types/workflows.ts +++ b/src/lib/types/workflows.ts @@ -6,6 +6,7 @@ import type { WorkflowVersionTimpstamp, } from '$lib/types'; +import type { VersioningInfo } from './deployments'; import type { Callbacks, Payload, @@ -21,7 +22,10 @@ import type { Optional, Replace } from './global'; */ type WorkflowExeuctionWithAssignedBuildId = - import('$lib/types').WorkflowExecutionInfo & { assignedBuildId: string }; + import('$lib/types').WorkflowExecutionInfo & { + assignedBuildId: string; + versioningInfo?: VersioningInfo; + }; export type WorkflowExecutionInfo = Replace< WorkflowExeuctionWithAssignedBuildId, @@ -142,6 +146,10 @@ export type WorkflowSearchAttributes = { indexedFields?: Record; }; +export type DecodedWorkflowSearchAttributes = { + indexedFields?: Record; +}; + export interface MostRecentWOrkflowVersionStamp extends WorkflowVersionTimpstamp { useVersioning?: boolean; @@ -160,7 +168,7 @@ export type WorkflowExecution = { historySizeBytes: string; mostRecentWorkerVersionStamp?: MostRecentWOrkflowVersionStamp; assignedBuildId?: string; - searchAttributes?: WorkflowSearchAttributes; + searchAttributes?: DecodedWorkflowSearchAttributes; memo: Memo; rootExecution?: WorkflowIdentifier; pendingChildren: PendingChildren[]; @@ -175,6 +183,7 @@ export type WorkflowExecution = { defaultWorkflowTaskTimeout: Duration; canBeTerminated: boolean; callbacks: Callbacks; + versioningInfo?: VersioningInfo; summary?: Payload; details?: Payload; }; diff --git a/src/lib/utilities/route-for-api.ts b/src/lib/utilities/route-for-api.ts index bc8780402..5f67cf23d 100644 --- a/src/lib/utilities/route-for-api.ts +++ b/src/lib/utilities/route-for-api.ts @@ -22,6 +22,12 @@ import type { TaskQueueAPIRoutePath, TaskQueueRouteParameters, WorkerAPIRoutePath, + WorkerDeploymentAPIRoutePath, + WorkerDeploymentListRouteParameters, + WorkerDeploymentRouteParameters, + WorkerDeploymentsAPIRoutePath, + WorkerDeploymentVersionAPIRoutePath, + WorkerDeploymentVersionRouteParameters, WorkflowActivitiesAPIRoutePath, WorkflowActivitiesRouteParameters, WorkflowAPIRoutePath, @@ -105,6 +111,8 @@ const encode = ( batchJobId: '', activityId: '', endpointId: '', + deploymentName: '', + version: '', }, ); }; @@ -151,6 +159,9 @@ export function pathForApi( 'nexus-endpoints': '/nexus/endpoints', 'nexus-endpoint': `/nexus/endpoints/${parameters.endpointId}`, 'nexus-endpoint.update': `/nexus/endpoints/${parameters.endpointId}/update`, + 'worker-deployments': `/namespaces/${parameters.namespace}/worker-deployments`, + 'worker-deployment': `/namespaces/${parameters.namespace}/worker-deployments/${parameters.deploymentName}`, + 'worker-deployment-version': `/namespaces/${parameters.namespace}/worker-deployment-versions/${parameters.version}`, }; return getPath(routes[route]); @@ -224,6 +235,21 @@ export function routeForApi( parameters: NexusRouteParameters, shouldEncode?: boolean, ): string; +export function routeForApi( + route: WorkerDeploymentsAPIRoutePath, + parameters: WorkerDeploymentListRouteParameters, + shouldEncode?: boolean, +): string; +export function routeForApi( + route: WorkerDeploymentAPIRoutePath, + parameters: WorkerDeploymentRouteParameters, + shouldEncode?: boolean, +): string; +export function routeForApi( + route: WorkerDeploymentVersionAPIRoutePath, + parameters: WorkerDeploymentVersionRouteParameters, + shouldEncode?: boolean, +): string; export function routeForApi(route: ParameterlessAPIRoutePath): string; export function routeForApi( route: APIRoutePath, diff --git a/src/lib/utilities/route-for.ts b/src/lib/utilities/route-for.ts index 7e0b2a061..de3099056 100644 --- a/src/lib/utilities/route-for.ts +++ b/src/lib/utilities/route-for.ts @@ -185,6 +185,39 @@ export const routeForWorkers = (parameters: WorkflowParameters): string => { return `${routeForWorkflow(parameters)}/workers`; }; +export const routeForWorkerDeployments = ({ + namespace, +}: { + namespace: string; +}) => { + return `${base}/namespaces/${namespace}/worker-deployments`; +}; + +export const routeForWorkerDeployment = ({ + namespace, + deployment, +}: { + namespace: string; + deployment: string; +}) => { + return `${base}/namespaces/${namespace}/worker-deployments/${deployment}`; +}; + +export const routeForWorkerDeploymentVersion = ({ + namespace, + deployment, + version, +}: { + namespace: string; + deployment: string; + version: string; +}) => { + return `${routeForWorkerDeployment({ + namespace, + deployment, + })}/version/${version}`; +}; + export const routeForRelationships = ( parameters: WorkflowParameters, ): string => { diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte index f0fb51ae1..f2c0ffc6f 100644 --- a/src/routes/(app)/+layout.svelte +++ b/src/routes/(app)/+layout.svelte @@ -30,6 +30,7 @@ routeForNamespaces, routeForNexus, routeForSchedules, + routeForWorkerDeployments, routeForWorkflows, } from '$lib/utilities/route-for'; @@ -62,6 +63,7 @@ workflowsRoute: routeForWorkflows({ namespace }), schedulesRoute: routeForSchedules({ namespace }), batchOperationsRoute: routeForBatchOperations({ namespace }), + workerDeploymentsRoute: routeForWorkerDeployments({ namespace }), archivalRoute: routeForArchivalWorkfows({ namespace }), namespacesRoute: routeForNamespaces(), nexusRoute: routeForNexus(), @@ -69,11 +71,17 @@ }; }; - $: ({ workflowsRoute, schedulesRoute, batchOperationsRoute, archivalRoute } = - routes); + $: ({ + workflowsRoute, + schedulesRoute, + batchOperationsRoute, + workerDeploymentsRoute, + archivalRoute, + } = routes); $: showNamespacePicker = [ workflowsRoute, schedulesRoute, + workerDeploymentsRoute, batchOperationsRoute, archivalRoute, ].some((route) => $page.url.href.includes(route)); @@ -83,6 +91,7 @@ workflowsRoute, schedulesRoute, batchOperationsRoute, + workerDeploymentsRoute, archivalRoute, namespacesRoute, nexusRoute, @@ -91,6 +100,7 @@ workflowsRoute: string; schedulesRoute: string; batchOperationsRoute: string; + workerDeploymentsRoute: string; archivalRoute: string; namespacesRoute: string; nexusRoute: string; @@ -119,6 +129,13 @@ animate: inProgressBatch, isActive: (path) => path.includes(batchOperationsRoute), }, + { + href: workerDeploymentsRoute, + icon: 'merge', + label: translate('deployments.deployments'), + tooltip: translate('deployments.worker-deployments'), + isActive: (path) => path.includes(workerDeploymentsRoute), + }, { href: archivalRoute, icon: 'archives', @@ -135,6 +152,7 @@ !path.includes(workflowsRoute) && !path.includes(schedulesRoute) && !path.includes(batchOperationsRoute) && + !path.includes(workerDeploymentsRoute) && !path.includes(archivalRoute), }, { @@ -177,6 +195,10 @@ subPath: 'batch-operations', fullRoute: routeForBatchOperations({ namespace }), }, + { + subPath: 'worker-deployments', + fullRoute: routeForWorkerDeployments({ namespace }), + }, ]; for (const { subPath, fullRoute } of namespacePages) { diff --git a/src/routes/(app)/namespaces/[namespace]/worker-deployments/+page.svelte b/src/routes/(app)/namespaces/[namespace]/worker-deployments/+page.svelte new file mode 100644 index 000000000..da3d7ee38 --- /dev/null +++ b/src/routes/(app)/namespaces/[namespace]/worker-deployments/+page.svelte @@ -0,0 +1,9 @@ + + + + diff --git a/src/routes/(app)/namespaces/[namespace]/worker-deployments/[deployment]/+layout.svelte b/src/routes/(app)/namespaces/[namespace]/worker-deployments/[deployment]/+layout.svelte new file mode 100644 index 000000000..cab3bdcc4 --- /dev/null +++ b/src/routes/(app)/namespaces/[namespace]/worker-deployments/[deployment]/+layout.svelte @@ -0,0 +1,12 @@ + + +
+ +
diff --git a/src/routes/(app)/namespaces/[namespace]/worker-deployments/[deployment]/+page.svelte b/src/routes/(app)/namespaces/[namespace]/worker-deployments/[deployment]/+page.svelte new file mode 100644 index 000000000..afc428d7e --- /dev/null +++ b/src/routes/(app)/namespaces/[namespace]/worker-deployments/[deployment]/+page.svelte @@ -0,0 +1,11 @@ + + + + From 51420e3b32f7751c39152ea1239cc8b58dd7d2a6 Mon Sep 17 00:00:00 2001 From: "temporal-cicd[bot]" <138905749+temporal-cicd[bot]@users.noreply.github.com> Date: Tue, 25 Feb 2025 14:32:48 -0600 Subject: [PATCH 006/172] 2.36.0 (#2579) Co-authored-by: Temporal Data (cicd) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 80b107509..5b2d0da9f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@temporalio/ui", - "version": "2.35.4", + "version": "2.36.0", "engines": { "pnpm": ">=8.6.0", "node": ">=18.15.0" From a48a8b1f789dccf4b2e31f968e9568cece470f6d Mon Sep 17 00:00:00 2001 From: Alex Tideman Date: Tue, 25 Feb 2025 14:35:23 -0600 Subject: [PATCH 007/172] Update version.go to v2.36.0 (#2580) --- server/server/version/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/server/version/version.go b/server/server/version/version.go index 4bf5e38d7..20620ab99 100644 --- a/server/server/version/version.go +++ b/server/server/version/version.go @@ -28,5 +28,5 @@ const ( clientNameHeaderName = "client-name" clientNameHeaderValue = "temporal-ui" clientVersionHeaderName = "client-version" - UIVersion = "2.35.1" + UIVersion = "2.36.0" ) From 58d05020b82430f8bd528a91b3a3b715f9fa0352 Mon Sep 17 00:00:00 2001 From: Alex Tideman Date: Fri, 28 Feb 2025 08:45:28 -0600 Subject: [PATCH 008/172] Remove nexus public preview tag and fix padding on deployments (#2582) --- src/lib/pages/deployments.svelte | 2 +- src/lib/pages/nexus-empty-state.svelte | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/lib/pages/deployments.svelte b/src/lib/pages/deployments.svelte index fbb33c111..e9e5a7aee 100644 --- a/src/lib/pages/deployments.svelte +++ b/src/lib/pages/deployments.svelte @@ -39,7 +39,7 @@ ]; -
+
{#key [namespace]} - import Badge from '$lib/holocene/badge.svelte'; import Button from '$lib/holocene/button.svelte'; import Link from '$lib/holocene/link.svelte'; import { translate } from '$lib/i18n/translate'; @@ -20,7 +19,6 @@ > {translate('nexus.endpoints')} - Public Preview

Get Started

From 77dc7031b66c971757fcdbc3bb442df75a82d16a Mon Sep 17 00:00:00 2001 From: "temporal-cicd[bot]" <138905749+temporal-cicd[bot]@users.noreply.github.com> Date: Fri, 28 Feb 2025 08:52:06 -0600 Subject: [PATCH 009/172] 2.36.1 (#2583) Co-authored-by: Temporal Data (cicd) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5b2d0da9f..885c8ee4a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@temporalio/ui", - "version": "2.36.0", + "version": "2.36.1", "engines": { "pnpm": ">=8.6.0", "node": ">=18.15.0" From 952e4ddd4979e40e86b2bdad8c283963029aa498 Mon Sep 17 00:00:00 2001 From: Laura Whitaker Date: Mon, 10 Mar 2025 12:34:39 -0600 Subject: [PATCH 010/172] Code-freeze 02.26.25 (#2590) * Support messageType metadata on protobuf encoded Payloads (#2581) * WIP: add messageType metadata field for json/protobuf payloads. Need to add messageType to schedules/signals * Set existing messageType and encoding on start workflow if it exists, add to signal * Add gap * Url encode deployment name (#2585) * Don't query metadata if no pollers available (#2586) * Include Local Activity failure in filter for Pending and Failed Events (#2588) * Add local activity failure to filter * Add unit tests, refactor logic, standarized and clean up pending rows --------- Co-authored-by: Alex Tideman --- .../components/event/event-summary-row.svelte | 7 +- .../event/pending-activity-summary-row.svelte | 5 +- .../event/pending-nexus-summary-row.svelte | 5 +- .../payload-input-with-encoding.svelte | 51 ++++--- .../schedule/schedule-form-view.svelte | 3 + .../schedule/schedule-input-payload.svelte | 12 ++ .../signal-confirmation-modal.svelte | 7 +- src/lib/i18n/locales/en/workflows.ts | 1 + src/lib/layouts/workflow-run-layout.svelte | 2 +- src/lib/pages/schedule-edit.svelte | 2 + src/lib/pages/schedules-create.svelte | 2 + src/lib/pages/start-workflow.svelte | 6 +- src/lib/pages/workflow-query.svelte | 6 +- src/lib/services/workflow-service.ts | 46 ++++++- src/lib/stores/schedules.ts | 14 +- src/lib/types/schedule.ts | 1 + src/lib/utilities/decode-payload.test.ts | 63 ++++++++- src/lib/utilities/decode-payload.ts | 24 +++- src/lib/utilities/encode-payload.ts | 30 +++- .../utilities/get-failed-or-pending.test.ts | 129 ++++++++++++++++++ src/lib/utilities/get-failed-or-pending.ts | 61 +++++++-- src/lib/utilities/route-for.ts | 3 +- src/routes/(app)/nexus/[id]/edit/+page.svelte | 8 +- src/routes/(app)/nexus/create/+page.svelte | 8 +- 24 files changed, 415 insertions(+), 81 deletions(-) create mode 100644 src/lib/utilities/get-failed-or-pending.test.ts diff --git a/src/lib/components/event/event-summary-row.svelte b/src/lib/components/event/event-summary-row.svelte index 2d79bbfd3..7b6f155ff 100644 --- a/src/lib/components/event/event-summary-row.svelte +++ b/src/lib/components/event/event-summary-row.svelte @@ -109,6 +109,11 @@ isEventGroup(event) && !event.isPending && event.eventList.find(isActivityTaskStartedEvent)?.attributes?.attempt; + $: showSecondaryAttribute = + compact && + secondaryAttribute?.key && + secondaryAttribute?.key !== primaryAttribute?.key && + !currentEvent?.userMetadata?.summary; {/if} - {#if compact && secondaryAttribute?.key && !currentEvent?.userMetadata?.summary} + {#if showSecondaryAttribute} {/if} diff --git a/src/lib/components/event/pending-activity-summary-row.svelte b/src/lib/components/event/pending-activity-summary-row.svelte index 9d76e1d33..cbb86dff7 100644 --- a/src/lib/components/event/pending-activity-summary-row.svelte +++ b/src/lib/components/event/pending-activity-summary-row.svelte @@ -42,14 +42,13 @@ data-testid="pending-activity-summary-row" on:click|stopPropagation={onLinkClick} > - + {event.activityId}
-

Pending Activity

@@ -88,7 +87,7 @@ diff --git a/src/lib/holocene/tab-buttons/tab-buttons.svelte b/src/lib/holocene/tab-buttons/tab-buttons.svelte new file mode 100644 index 000000000..08e1d9ce5 --- /dev/null +++ b/src/lib/holocene/tab-buttons/tab-buttons.svelte @@ -0,0 +1,8 @@ + + +
+ +
diff --git a/src/lib/i18n/locales/en/common.ts b/src/lib/i18n/locales/en/common.ts index 968d34292..ff90a69e2 100644 --- a/src/lib/i18n/locales/en/common.ts +++ b/src/lib/i18n/locales/en/common.ts @@ -3,6 +3,7 @@ export const Namespace = 'common' as const; export const Strings = { loading: 'Loading...', filtering: 'filtering', + filter: 'Filter', 'unknown-error': 'An unknown error occurred.', search: 'Search', apply: 'Apply', @@ -147,6 +148,7 @@ export const Strings = { 'time-range': 'Time Range', 'based-on-time-preface': 'Based on', 'download-json': 'Download JSON', + 'download-event-history-json': 'Download Event History JSON', 'skip-nav': 'Skip to Main Content', timeline: 'Timeline', graph: 'Graph', @@ -176,6 +178,9 @@ export const Strings = { value: 'Value', table: 'Table', failure: 'Failure', + 'pending-and-failed': 'Pending and Failed', + 'pending-and-failed-description': + 'View only Pending, Failed, and Timed Out events', 'stack-trace': 'Stack Trace', source: 'Source', url: 'URL', diff --git a/src/lib/layouts/workflow-history-layout.svelte b/src/lib/layouts/workflow-history-layout.svelte index 9cf30427d..3dc5774c9 100644 --- a/src/lib/layouts/workflow-history-layout.svelte +++ b/src/lib/layouts/workflow-history-layout.svelte @@ -1,16 +1,25 @@
@@ -71,18 +88,76 @@ {#if workflow?.callbacks?.length} {/if} -
-

- {translate('workflows.event-history')} -

-
-
-
- - +
+
+

+ {translate('workflows.event-history')} +

+
+ + {#if $eventViewType !== 'json'} + {reverseSort ? 'Descending' : 'Ascending'} + {/if} + ($minimizeEventView = !$minimizeEventView)} + >{$minimizeEventView ? 'Minimized' : 'Expanded'} + + ($pauseLiveUpdates = !$pauseLiveUpdates)} + > + {$pauseLiveUpdates ? 'Resume' : 'Pause'} + + (showDownloadPrompt = true)} + > + {translate('common.download')} + + +
+
+
+ +
+ + + diff --git a/src/lib/layouts/workflow-run-layout.svelte b/src/lib/layouts/workflow-run-layout.svelte index c95784baf..12374d20c 100644 --- a/src/lib/layouts/workflow-run-layout.svelte +++ b/src/lib/layouts/workflow-run-layout.svelte @@ -129,8 +129,11 @@ }); }; - const getOnlyWorkflowWithPendingActivities = async (refresh: number) => { - if (refresh && $workflowRun?.workflow?.isRunning) { + const getOnlyWorkflowWithPendingActivities = async ( + refresh: number, + pause: boolean, + ) => { + if (refresh && !pause && $workflowRun?.workflow?.isRunning) { const { workflow, error } = await fetchWorkflow({ namespace, workflowId, @@ -165,7 +168,7 @@ $: runId, clearWorkflowData(); $: getWorkflowAndEventHistory(namespace, workflowId, runId); - $: getOnlyWorkflowWithPendingActivities($refresh); + $: getOnlyWorkflowWithPendingActivities($refresh, $pauseLiveUpdates); const setCurrentEvents = (fullHistory, pause) => { if (!pause) { diff --git a/src/lib/pages/workflow-history-event-group.svelte b/src/lib/pages/workflow-history-event-group.svelte index 90d3f517f..cca027796 100644 --- a/src/lib/pages/workflow-history-event-group.svelte +++ b/src/lib/pages/workflow-history-event-group.svelte @@ -77,6 +77,6 @@ {/if}
- +
diff --git a/src/lib/pages/workflow-history-event.svelte b/src/lib/pages/workflow-history-event.svelte index 8ad70103d..fcba428fb 100644 --- a/src/lib/pages/workflow-history-event.svelte +++ b/src/lib/pages/workflow-history-event.svelte @@ -52,5 +52,5 @@
- +
diff --git a/src/lib/stores/event-view.ts b/src/lib/stores/event-view.ts index 8cc17f961..4552ecf35 100644 --- a/src/lib/stores/event-view.ts +++ b/src/lib/stores/event-view.ts @@ -15,13 +15,12 @@ export const autoRefreshWorkflow = persistStore<'on' | 'off'>( export const eventViewType = persistStore('eventView', 'feed', true); -export const expandAllEvents = persistStore('expandAllEvents', 'false'); +export const minimizeEventView = persistStore('minimizeEventView', true, true); export const eventFilterSort = persistStore( 'eventFilterSort', 'descending', ); - export const eventShowElapsed = persistStore( 'eventShowElapsed', 'false', diff --git a/src/routes/(app)/import/events/[namespace]/[workflow]/[run]/history/compact/+page.svelte b/src/routes/(app)/import/events/[namespace]/[workflow]/[run]/history/compact/+page.svelte index cf8edb1b3..00ea80039 100644 --- a/src/routes/(app)/import/events/[namespace]/[workflow]/[run]/history/compact/+page.svelte +++ b/src/routes/(app)/import/events/[namespace]/[workflow]/[run]/history/compact/+page.svelte @@ -1,7 +1,7 @@ - + diff --git a/src/routes/(app)/import/events/[namespace]/[workflow]/[run]/history/feed/+page.svelte b/src/routes/(app)/import/events/[namespace]/[workflow]/[run]/history/feed/+page.svelte index a579fc67e..84bb97687 100644 --- a/src/routes/(app)/import/events/[namespace]/[workflow]/[run]/history/feed/+page.svelte +++ b/src/routes/(app)/import/events/[namespace]/[workflow]/[run]/history/feed/+page.svelte @@ -1,6 +1,6 @@ - + From afcc7b08c6a4f4d65c75b0daf39f587a946a2b31 Mon Sep 17 00:00:00 2001 From: Ross Edfort Date: Mon, 17 Mar 2025 14:35:20 -0600 Subject: [PATCH 018/172] add icons and fix some dark styles for quickstart guide (#2599) --- src/lib/holocene/icon/paths.ts | 10 +++++++ src/lib/holocene/icon/svg/apple.svelte | 10 +++++++ src/lib/holocene/icon/svg/circle-check.svelte | 10 +++++++ .../holocene/icon/svg/circle-question.svelte | 10 +++++++ src/lib/holocene/icon/svg/linux.svelte | 10 +++++++ src/lib/holocene/icon/svg/microsoft.svelte | 30 +++++++++++++++++++ .../holocene/radio-input/radio-input.svelte | 7 +++-- src/lib/holocene/radio-input/types.ts | 1 + src/lib/holocene/select/select.svelte | 5 ++-- src/lib/holocene/select/simple-select.svelte | 2 +- src/lib/holocene/textarea.svelte | 4 --- src/lib/theme/plugin.ts | 6 ++-- src/lib/types/global.ts | 2 +- 13 files changed, 95 insertions(+), 12 deletions(-) create mode 100644 src/lib/holocene/icon/svg/apple.svelte create mode 100644 src/lib/holocene/icon/svg/circle-check.svelte create mode 100644 src/lib/holocene/icon/svg/circle-question.svelte create mode 100644 src/lib/holocene/icon/svg/linux.svelte create mode 100644 src/lib/holocene/icon/svg/microsoft.svelte diff --git a/src/lib/holocene/icon/paths.ts b/src/lib/holocene/icon/paths.ts index a857f3cc1..dfca6b06f 100644 --- a/src/lib/holocene/icon/paths.ts +++ b/src/lib/holocene/icon/paths.ts @@ -1,5 +1,6 @@ import activity from './svg/activity.svelte'; import add from './svg/add.svelte'; +import apple from './svg/apple.svelte'; import archives from './svg/archives.svelte'; import arrowDown from './svg/arrow-down.svelte'; import arrowLeft from './svg/arrow-left.svelte'; @@ -23,6 +24,8 @@ import chevronRight from './svg/chevron-right.svelte'; import chevronSelectorVertical from './svg/chevron-selector-vertical.svelte'; import chevronUp from './svg/chevron-up.svelte'; import circleCheckFilled from './svg/circle-check-filled.svelte'; +import circleCheck from './svg/circle-check.svelte'; +import cirlceQuestion from './svg/circle-question.svelte'; import clock from './svg/clock.svelte'; import close from './svg/close.svelte'; import cometSolid from './svg/comet-solid.svelte'; @@ -65,10 +68,12 @@ import keyboard from './svg/keyboard.svelte'; import labs from './svg/labs.svelte'; import lightningBolt from './svg/lightning-bolt.svelte'; import link from './svg/link.svelte'; +import linux from './svg/linux.svelte'; import lock from './svg/lock.svelte'; import logout from './svg/logout.svelte'; import marker from './svg/marker.svelte'; import merge from './svg/merge.svelte'; +import microsoft from './svg/microsoft.svelte'; import minimize from './svg/minimize.svelte'; import moon from './svg/moon.svelte'; import namespaceSwitcher from './svg/namespace-switcher.svelte'; @@ -121,6 +126,7 @@ import xmarkFilled from './svg/xmark-filled.svelte'; export const icons = { activity, add, + apple, archives, 'arrow-down': arrowDown, 'arrow-left': arrowLeft, @@ -142,7 +148,9 @@ export const icons = { 'chevron-right': chevronRight, 'chevron-up': chevronUp, 'chevron-selector-vertical': chevronSelectorVertical, + 'circle-check': circleCheck, 'circle-check-filled': circleCheckFilled, + 'circle-question': cirlceQuestion, clock, close, 'comet-solid': cometSolid, @@ -185,10 +193,12 @@ export const icons = { labs, 'lightning-bolt': lightningBolt, link, + linux, lock, logout, marker, merge, + microsoft, minimize, moon, 'namespace-switcher': namespaceSwitcher, diff --git a/src/lib/holocene/icon/svg/apple.svelte b/src/lib/holocene/icon/svg/apple.svelte new file mode 100644 index 000000000..6051822d9 --- /dev/null +++ b/src/lib/holocene/icon/svg/apple.svelte @@ -0,0 +1,10 @@ + + + + + diff --git a/src/lib/holocene/icon/svg/circle-check.svelte b/src/lib/holocene/icon/svg/circle-check.svelte new file mode 100644 index 000000000..ae16697b7 --- /dev/null +++ b/src/lib/holocene/icon/svg/circle-check.svelte @@ -0,0 +1,10 @@ + + + + + diff --git a/src/lib/holocene/icon/svg/circle-question.svelte b/src/lib/holocene/icon/svg/circle-question.svelte new file mode 100644 index 000000000..b8a1e6523 --- /dev/null +++ b/src/lib/holocene/icon/svg/circle-question.svelte @@ -0,0 +1,10 @@ + + + + + diff --git a/src/lib/holocene/icon/svg/linux.svelte b/src/lib/holocene/icon/svg/linux.svelte new file mode 100644 index 000000000..323d2a435 --- /dev/null +++ b/src/lib/holocene/icon/svg/linux.svelte @@ -0,0 +1,10 @@ + + + + + diff --git a/src/lib/holocene/icon/svg/microsoft.svelte b/src/lib/holocene/icon/svg/microsoft.svelte new file mode 100644 index 000000000..834ae81d2 --- /dev/null +++ b/src/lib/holocene/icon/svg/microsoft.svelte @@ -0,0 +1,30 @@ + + + + + + + + diff --git a/src/lib/holocene/radio-input/radio-input.svelte b/src/lib/holocene/radio-input/radio-input.svelte index 9c520ba01..bead7ca99 100644 --- a/src/lib/holocene/radio-input/radio-input.svelte +++ b/src/lib/holocene/radio-input/radio-input.svelte @@ -4,6 +4,7 @@ import { getContext } from 'svelte'; import Label from '$lib/holocene/label.svelte'; + import { omit } from '$lib/utilities/omit'; import type { RadioGroupContext, RadioInputProps } from './types'; @@ -21,9 +22,11 @@ let internalGroup: Writable = writable(value); let internalName: string = ''; + let className: string | undefined = undefined; export { internalGroup as group }; export { internalName as name }; + export { className as class }; const ctx = getContext>(RADIO_GROUP_CONTEXT) ?? { name: internalName, @@ -34,7 +37,7 @@
-
{:else if isBooleanFilter($filter)} diff --git a/src/lib/utilities/query/search-attribute-filter.ts b/src/lib/utilities/query/search-attribute-filter.ts index d899bad61..6936771f0 100644 --- a/src/lib/utilities/query/search-attribute-filter.ts +++ b/src/lib/utilities/query/search-attribute-filter.ts @@ -77,12 +77,11 @@ export function getFocusedElementId(filter: SearchAttributeFilter) { if ( isTextFilter(filter) || isNumberFilter(filter) || - isDateTimeFilter(filter) + isDateTimeFilter(filter) || + isListFilter(filter) ) return 'conditional-menu-button'; - if (isListFilter(filter)) return 'list-filter'; - if (isBooleanFilter(filter)) return 'boolean-filter'; return ''; From cfc45e6cf11077263e9494350e1381d471309b6b Mon Sep 17 00:00:00 2001 From: "temporal-cicd[bot]" <138905749+temporal-cicd[bot]@users.noreply.github.com> Date: Wed, 19 Mar 2025 09:28:47 -0600 Subject: [PATCH 021/172] 2.36.4 (#2605) Co-authored-by: Temporal Data (cicd) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e74e2dad4..8e6a2a496 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@temporalio/ui", - "version": "2.36.3", + "version": "2.36.4", "engines": { "pnpm": ">=8.6.0", "node": ">=18.15.0" From 23539b43153a8b94484c7efe618a519fda4c4976 Mon Sep 17 00:00:00 2001 From: Ross Edfort Date: Wed, 19 Mar 2025 10:36:01 -0600 Subject: [PATCH 022/172] DT-2821 - add invalid/error state to Select (#2606) * add valid/error state to Select * fix a11y * add story * fix story --- src/lib/holocene/select/select.stories.svelte | 5 +++++ src/lib/holocene/select/select.svelte | 11 ++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/lib/holocene/select/select.stories.svelte b/src/lib/holocene/select/select.stories.svelte index 4b8d34e55..cda6c9112 100644 --- a/src/lib/holocene/select/select.stories.svelte +++ b/src/lib/holocene/select/select.stories.svelte @@ -61,3 +61,8 @@ + + diff --git a/src/lib/holocene/select/select.svelte b/src/lib/holocene/select/select.svelte index ccd7113a3..1c3cb7fa8 100644 --- a/src/lib/holocene/select/select.svelte +++ b/src/lib/holocene/select/select.svelte @@ -24,6 +24,7 @@ import { writable, type Writable } from 'svelte/store'; import { onMount, setContext } from 'svelte'; + import { twMerge } from 'tailwind-merge'; import type { ButtonStyles } from '$lib/holocene/button.svelte'; import type { IconName } from '$lib/holocene/icon'; @@ -46,6 +47,8 @@ menuClass?: string; variant?: ButtonStyles['variant']; required?: boolean; + valid?: boolean; + error?: string; }; export let label: string; @@ -59,6 +62,8 @@ export let menuClass: string | undefined = undefined; export let variant: ButtonStyles['variant'] = 'secondary'; export let required = false; + export let error = ''; + export let valid = true; // We get the "true" value of this further down but before the mount happens we should have some kind of value const valueCtx = writable(value); @@ -106,7 +111,7 @@