// (C) 2007-2019 GoodData Corporation import { get, partial } from "lodash"; import { ISchemaAnalyticalDashboard } from "../model/SchemaAnalyticalDashboard"; import { IAnalyticalDashboard } from "../../model/AnalyticalDashboard"; import { IProject, getProjectId } from "../../model/Project"; import { Widget, getWidgetId, getWidgetUri } from "../../model/Widget"; import { objectUri } from "../../route/routes"; import { webalize } from "../../utils/string"; import { ensureIdentifier } from "../helpers/objects"; import { createWidgets } from "./WidgetBuilder"; import { ISchema } from "../model/Schema"; import { LayoutSchema } from "../model/layout/LayoutSchema"; import { createProject } from "./ProjectBuilder"; import { createLayout } from "./LayoutBuilder"; import { SchemaWidget } from "../model/SchemaWidget"; import { IDashboardDateFilterConfigSchema } from "../model/DateFilterConfigSchema"; import { createDateFilterDashboardConfig } from "./DateFilterConfigBuilder"; const createDashboardIdentifier = (dashboard: ISchemaAnalyticalDashboard) => `dash.${webalize(dashboard.title)}`; interface IUriHash { [id: string]: string; } function getWidgetUriMapper(widgets: Widget[]) { const uriHash: IUriHash = widgets.reduce( (hash, widget) => ({ ...hash, [getWidgetId(widget)]: getWidgetUri(widget) }), {}, ); return (widget: SchemaWidget): string => uriHash[ensureIdentifier(widget, webalize(widget.title))]; } export function createAnalyticalDashboard( project: IProject, widgets: Widget[], analyticalDashboard: ISchemaAnalyticalDashboard, ): IAnalyticalDashboard { const { widgets: dashboardWidgets = [], title } = analyticalDashboard; const identifier = ensureIdentifier(analyticalDashboard, createDashboardIdentifier(analyticalDashboard)); const uri = objectUri(getProjectId(project), identifier); const filterContextTitle: string = get(analyticalDashboard, "filterContext.title"); const layout: LayoutSchema = get(analyticalDashboard, "layout"); const layoutProp = layout ? { layout: createLayout(layout, project) } : {}; const extendedDateFilters: IDashboardDateFilterConfigSchema = get( analyticalDashboard, "dateFilterConfig", ); const edfProp = extendedDateFilters ? { dateFilterConfig: createDateFilterDashboardConfig(extendedDateFilters) } : {}; return { meta: { category: "analyticalDashboard", identifier, title, uri, }, content: { filterContext: filterContextTitle ? objectUri(getProjectId(project), webalize(filterContextTitle)) : "", widgets: dashboardWidgets.map(getWidgetUriMapper(widgets)), ...layoutProp, ...edfProp, }, }; } export function createAnalyticalDashboards(schema: ISchema): IAnalyticalDashboard[] { const project = createProject(schema); const widgets = createWidgets(schema); return (schema.analyticalDashboards || []).map(partial(createAnalyticalDashboard, project, widgets)); }