dashboard/new-dashboard/src/configurators/BuildConfigurator.ts (67 lines of code) (raw):
import { of, switchMap } from "rxjs"
import { PersistentStateManager } from "../components/common/PersistentStateManager"
import { DataQuery, DataQueryExecutorConfiguration } from "../components/common/dataQuery"
import { DimensionConfigurator } from "./DimensionConfigurator"
import { ServerWithCompressConfigurator } from "./ServerWithCompressConfigurator"
import { ComponentState, updateComponentState } from "./componentState"
import { configureQueryFilters, createFilterObservable, FilterConfigurator } from "./filter"
import { fromFetchWithRetryAndErrorHandling } from "./rxjs"
export class BuildConfigurator extends DimensionConfigurator {
constructor(name: string) {
super(name, false)
}
configureQuery(_: DataQuery, _2: DataQueryExecutorConfiguration): boolean {
return true
}
}
function loadBuilds(serverConfigurator: ServerWithCompressConfigurator, filters: FilterConfigurator[], state: ComponentState) {
const query = new DataQuery()
query.addField({ n: "build", sql: "distinct concat(toString(build_c1),'.',toString(build_c2),'.',toString(build_c3))" })
query.order = "build"
query.flat = true
const configuration = new DataQueryExecutorConfiguration()
if (!serverConfigurator.configureQuery(query, configuration) || !configureQueryFilters(query, filters)) {
return of(null)
}
state.loading = true
return fromFetchWithRetryAndErrorHandling<string[]>(serverConfigurator.computeQueryUrl(query))
}
export function buildConfigurator(
name: string,
serverConfigurator: ServerWithCompressConfigurator,
persistentStateManager: PersistentStateManager | null,
filters: FilterConfigurator[] = []
): DimensionConfigurator {
const configurator = new BuildConfigurator(name)
persistentStateManager?.add(name, configurator.selected)
createFilterObservable(serverConfigurator, filters)
.pipe(
switchMap(() => loadBuilds(serverConfigurator, filters, configurator.state)),
updateComponentState(configurator.state)
)
.subscribe((data) => {
if (data == null) {
return
}
configurator.values.value = data
.filter((value) => value != "")
.filter((value) => value.split(".").length == 3)
.map((value) => {
const buildParts = value.split(".")
return buildParts[2] == "0" ? buildParts[0] + "." + buildParts[1] : value
})
.sort(compareBuilds)
})
return configurator
}
function compareBuilds(a: string, b: string) {
const [branch1, build1] = a.split(".").map((value) => Number.parseInt(value))
const [branch2, build2] = b.split(".").map((value) => Number.parseInt(value))
if (branch1 < branch2) {
return 1
} else if (branch1 > branch2) {
return -1
} else {
return build1 < build2 ? 1 : -1
}
}