mirror of https://github.com/buster-so/buster.git
Update assetParamsToRoute.ts
This commit is contained in:
parent
cf36ad7be3
commit
0550df9b94
|
@ -13,6 +13,9 @@ type ChatParamsToRoute = {
|
||||||
metricId?: string;
|
metricId?: string;
|
||||||
dashboardId?: string;
|
dashboardId?: string;
|
||||||
reportId?: string;
|
reportId?: string;
|
||||||
|
dashboardVersionNumber?: number;
|
||||||
|
metricVersionNumber?: number;
|
||||||
|
reportVersionNumber?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
type MetricParamsToRoute = {
|
type MetricParamsToRoute = {
|
||||||
|
@ -31,6 +34,7 @@ type DashboardParamsToRoute = {
|
||||||
reportId?: string;
|
reportId?: string;
|
||||||
chatId?: string;
|
chatId?: string;
|
||||||
versionNumber?: number;
|
versionNumber?: number;
|
||||||
|
metricVersionNumber?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
type ReportParamsToRoute = {
|
type ReportParamsToRoute = {
|
||||||
|
@ -39,6 +43,7 @@ type ReportParamsToRoute = {
|
||||||
metricId?: string;
|
metricId?: string;
|
||||||
chatId?: string;
|
chatId?: string;
|
||||||
versionNumber?: number;
|
versionNumber?: number;
|
||||||
|
metricVersionNumber?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
type CollectionParamsToRoute = {
|
type CollectionParamsToRoute = {
|
||||||
|
@ -47,7 +52,8 @@ type CollectionParamsToRoute = {
|
||||||
chatId?: string;
|
chatId?: string;
|
||||||
metricId?: string;
|
metricId?: string;
|
||||||
dashboardId?: string;
|
dashboardId?: string;
|
||||||
versionNumber?: number;
|
metricVersionNumber?: number;
|
||||||
|
dashboardVersionNumber?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type AssetParamsToRoute =
|
export type AssetParamsToRoute =
|
||||||
|
@ -66,6 +72,11 @@ type RouteBuilderState = {
|
||||||
metricId?: string;
|
metricId?: string;
|
||||||
dashboardId?: string;
|
dashboardId?: string;
|
||||||
reportId?: string;
|
reportId?: string;
|
||||||
|
// Version numbers for search parameters
|
||||||
|
versionNumber?: number;
|
||||||
|
metricVersionNumber?: number;
|
||||||
|
dashboardVersionNumber?: number;
|
||||||
|
reportVersionNumber?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -191,6 +202,44 @@ class RouteBuilder<T extends RouteBuilderState = NonNullable<unknown>> {
|
||||||
return new RouteBuilder({ ...this.state, reportId });
|
return new RouteBuilder({ ...this.state, reportId });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add version number to the route (for the primary asset)
|
||||||
|
* The search parameter name will be determined based on the primary asset type:
|
||||||
|
* - metric_version_number for metrics
|
||||||
|
* - dashboard_version_number for dashboards
|
||||||
|
* - report_version_number for reports
|
||||||
|
*/
|
||||||
|
withVersion<U extends number>(versionNumber: U): RouteBuilder<T & { versionNumber: U }> {
|
||||||
|
return new RouteBuilder({ ...this.state, versionNumber });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add metric version number to the route
|
||||||
|
*/
|
||||||
|
withMetricVersion<U extends number>(
|
||||||
|
metricVersionNumber: U
|
||||||
|
): RouteBuilder<T & { metricVersionNumber: U }> {
|
||||||
|
return new RouteBuilder({ ...this.state, metricVersionNumber });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add dashboard version number to the route
|
||||||
|
*/
|
||||||
|
withDashboardVersion<U extends number>(
|
||||||
|
dashboardVersionNumber: U
|
||||||
|
): RouteBuilder<T & { dashboardVersionNumber: U }> {
|
||||||
|
return new RouteBuilder({ ...this.state, dashboardVersionNumber });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add report version number to the route
|
||||||
|
*/
|
||||||
|
withReportVersion<U extends number>(
|
||||||
|
reportVersionNumber: U
|
||||||
|
): RouteBuilder<T & { reportVersionNumber: U }> {
|
||||||
|
return new RouteBuilder({ ...this.state, reportVersionNumber });
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build the route path with type safety
|
* Build the route path with type safety
|
||||||
*/
|
*/
|
||||||
|
@ -215,14 +264,48 @@ class RouteBuilder<T extends RouteBuilderState = NonNullable<unknown>> {
|
||||||
buildNavigationOptions(): OptionsTo {
|
buildNavigationOptions(): OptionsTo {
|
||||||
const route = this.build();
|
const route = this.build();
|
||||||
const params = this.getParams();
|
const params = this.getParams();
|
||||||
|
const search = this.getSearchParams();
|
||||||
|
|
||||||
// Type assertion through unknown for complex generic type
|
// Type assertion through unknown for complex generic type
|
||||||
return {
|
return {
|
||||||
to: route,
|
to: route,
|
||||||
params,
|
params,
|
||||||
|
search,
|
||||||
} as OptionsTo;
|
} as OptionsTo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get search parameters for version numbers
|
||||||
|
*/
|
||||||
|
private getSearchParams(): Record<string, number> {
|
||||||
|
const search: Record<string, number> = {};
|
||||||
|
const { versionNumber, metricVersionNumber, dashboardVersionNumber, reportVersionNumber } =
|
||||||
|
this.state;
|
||||||
|
|
||||||
|
// Map internal version numbers to TanStack Router search parameter names
|
||||||
|
if (versionNumber !== undefined) {
|
||||||
|
// For primary asset version, determine the correct search param name based on asset type
|
||||||
|
const { metricId, dashboardId, reportId } = this.state;
|
||||||
|
if (metricId) search.metric_version_number = versionNumber;
|
||||||
|
else if (dashboardId) search.dashboard_version_number = versionNumber;
|
||||||
|
else if (reportId) search.report_version_number = versionNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (metricVersionNumber !== undefined) {
|
||||||
|
search.metric_version_number = metricVersionNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dashboardVersionNumber !== undefined) {
|
||||||
|
search.dashboard_version_number = dashboardVersionNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reportVersionNumber !== undefined) {
|
||||||
|
search.report_version_number = reportVersionNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
return search;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine the route key based on current state
|
* Determine the route key based on current state
|
||||||
*/
|
*/
|
||||||
|
@ -260,6 +343,26 @@ class RouteBuilder<T extends RouteBuilderState = NonNullable<unknown>> {
|
||||||
/**
|
/**
|
||||||
* Main function to convert asset params to route navigation options
|
* Main function to convert asset params to route navigation options
|
||||||
* Returns type-safe navigation options that can be passed to Link or navigate
|
* Returns type-safe navigation options that can be passed to Link or navigate
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* // Navigate to a metric with version
|
||||||
|
* const options = assetParamsToRoute({
|
||||||
|
* assetType: 'metric',
|
||||||
|
* assetId: 'metric-123',
|
||||||
|
* versionNumber: 5
|
||||||
|
* });
|
||||||
|
* // Result: { to: '/app/metrics/metric-123', params: { metricId: 'metric-123' }, search: { metric_version_number: 5 } }
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* // Navigate to dashboard with metric and both versions
|
||||||
|
* const options = assetParamsToRoute({
|
||||||
|
* assetType: 'dashboard',
|
||||||
|
* assetId: 'dashboard-456',
|
||||||
|
* metricId: 'metric-789',
|
||||||
|
* versionNumber: 3,
|
||||||
|
* metricVersionNumber: 2
|
||||||
|
* });
|
||||||
|
* // Result: { to: '/app/dashboards/dashboard-456', params: { dashboardId: 'dashboard-456', metricId: 'metric-789' }, search: { dashboard_version_number: 3, metric_version_number: 2 } }
|
||||||
*/
|
*/
|
||||||
export const assetParamsToRoute = (params: AssetParamsToRoute): OptionsTo => {
|
export const assetParamsToRoute = (params: AssetParamsToRoute): OptionsTo => {
|
||||||
const builder = new RouteBuilder();
|
const builder = new RouteBuilder();
|
||||||
|
@ -281,6 +384,10 @@ export const assetParamsToRoute = (params: AssetParamsToRoute): OptionsTo => {
|
||||||
if (params.dashboardId) route = route.withDashboard(params.dashboardId);
|
if (params.dashboardId) route = route.withDashboard(params.dashboardId);
|
||||||
if (params.reportId) route = route.withReport(params.reportId);
|
if (params.reportId) route = route.withReport(params.reportId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add version number for the metric
|
||||||
|
if (params.versionNumber !== undefined) route = route.withVersion(params.versionNumber);
|
||||||
|
|
||||||
return route.buildNavigationOptions();
|
return route.buildNavigationOptions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -290,6 +397,12 @@ export const assetParamsToRoute = (params: AssetParamsToRoute): OptionsTo => {
|
||||||
route = route.withChat(params.chatId);
|
route = route.withChat(params.chatId);
|
||||||
if (params.metricId) route = route.withMetric(params.metricId);
|
if (params.metricId) route = route.withMetric(params.metricId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add version numbers
|
||||||
|
if (params.versionNumber !== undefined) route = route.withVersion(params.versionNumber);
|
||||||
|
if (params.metricVersionNumber !== undefined)
|
||||||
|
route = route.withMetricVersion(params.metricVersionNumber);
|
||||||
|
|
||||||
return route.buildNavigationOptions();
|
return route.buildNavigationOptions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -299,6 +412,12 @@ export const assetParamsToRoute = (params: AssetParamsToRoute): OptionsTo => {
|
||||||
route = route.withChat(params.chatId);
|
route = route.withChat(params.chatId);
|
||||||
if (params.metricId) route = route.withMetric(params.metricId);
|
if (params.metricId) route = route.withMetric(params.metricId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add version numbers
|
||||||
|
if (params.versionNumber !== undefined) route = route.withVersion(params.versionNumber);
|
||||||
|
if (params.metricVersionNumber !== undefined)
|
||||||
|
route = route.withMetricVersion(params.metricVersionNumber);
|
||||||
|
|
||||||
return route.buildNavigationOptions();
|
return route.buildNavigationOptions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -307,6 +426,13 @@ export const assetParamsToRoute = (params: AssetParamsToRoute): OptionsTo => {
|
||||||
if (params.chatId) route = route.withChat(params.chatId);
|
if (params.chatId) route = route.withChat(params.chatId);
|
||||||
if (params.dashboardId) route = route.withDashboard(params.dashboardId);
|
if (params.dashboardId) route = route.withDashboard(params.dashboardId);
|
||||||
if (params.metricId) route = route.withMetric(params.metricId);
|
if (params.metricId) route = route.withMetric(params.metricId);
|
||||||
|
|
||||||
|
// Add version numbers
|
||||||
|
if (params.metricVersionNumber !== undefined)
|
||||||
|
route = route.withMetricVersion(params.metricVersionNumber);
|
||||||
|
if (params.dashboardVersionNumber !== undefined)
|
||||||
|
route = route.withDashboardVersion(params.dashboardVersionNumber);
|
||||||
|
|
||||||
return route.buildNavigationOptions();
|
return route.buildNavigationOptions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue