diff --git a/src/UI/Base/Title.ts b/src/UI/Base/Title.ts index c30ca144c9..ba4c8d41fd 100644 --- a/src/UI/Base/Title.ts +++ b/src/UI/Base/Title.ts @@ -17,7 +17,8 @@ export default class Title extends BaseUIElement { constructor(embedded: string | BaseUIElement, level: number = 3) { super() if (embedded === undefined) { - throw "A title should have some content. Undefined is not allowed" + console.warn("A title should have some content. Undefined is not allowed") + embedded = "" } if (typeof embedded === "string") { this.title = new FixedUiElement(embedded) diff --git a/src/UI/BigComponents/StatisticsPanel.ts b/src/UI/BigComponents/StatisticsPanel.ts index 2bb479b7bd..6b138060f3 100644 --- a/src/UI/BigComponents/StatisticsPanel.ts +++ b/src/UI/BigComponents/StatisticsPanel.ts @@ -17,14 +17,17 @@ export default class StatisticsForLayerPanel extends VariableUiElement { return new Loading("Loading data") } if (features.length === 0) { - return "No elements in view" + return new Combine([ + "No elements in view for layer ", + layer.id + ]).SetClass("block") } const els: BaseUIElement[] = [] const featuresForLayer = features if (featuresForLayer.length === 0) { return } - els.push(new Title(layer.name.Clone(), 1).SetClass("mt-8")) + els.push(new Title(layer.name, 1).SetClass("mt-8")) const layerStats = [] for (const tagRendering of layer?.tagRenderings ?? []) { diff --git a/src/UI/BigComponents/TagRenderingChart.ts b/src/UI/BigComponents/TagRenderingChart.ts index c187fb80e2..f529de8280 100644 --- a/src/UI/BigComponents/TagRenderingChart.ts +++ b/src/UI/BigComponents/TagRenderingChart.ts @@ -8,7 +8,9 @@ import { OsmFeature } from "../../Models/OsmFeature" export interface TagRenderingChartOptions { groupToOtherCutoff?: 3 | number - sort?: boolean + sort?: boolean, + hideUnkown?: boolean, + hideNotApplicable?: boolean } export class StackedRenderingChart extends ChartJs { @@ -19,12 +21,16 @@ export class StackedRenderingChart extends ChartJs { period: "day" | "month" groupToOtherCutoff?: 3 | number // If given, take the sum of these fields to get the feature weight - sumFields?: string[] + sumFields?: string[], + hideUnknown?: boolean, + hideNotApplicable?: boolean } ) { const { labels, data } = TagRenderingChart.extractDataAndLabels(tr, features, { sort: true, groupToOtherCutoff: options?.groupToOtherCutoff, + hideNotApplicable: options?.hideNotApplicable, + hideUnkown: options?.hideUnknown }) if (labels === undefined || data === undefined) { console.error( @@ -36,7 +42,6 @@ export class StackedRenderingChart extends ChartJs { ) throw "No labels or data given..." } - // labels: ["cyclofix", "buurtnatuur", ...]; data : [ ["cyclofix-changeset", "cyclofix-changeset", ...], ["buurtnatuur-cs", "buurtnatuur-cs"], ... ] for (let i = labels.length; i >= 0; i--) { if (data[i]?.length != 0) { @@ -116,13 +121,13 @@ export class StackedRenderingChart extends ChartJs { datasets.push({ data: countsPerDay, backgroundColor, - label, + label }) } const perDayData = { labels: trimmedDays, - datasets, + datasets } const config = { @@ -131,17 +136,17 @@ export class StackedRenderingChart extends ChartJs { options: { responsive: true, legend: { - display: false, + display: false }, scales: { x: { - stacked: true, + stacked: true }, y: { - stacked: true, - }, - }, - }, + stacked: true + } + } + } } super(config) } @@ -194,7 +199,7 @@ export default class TagRenderingChart extends Combine { "rgba(255, 206, 86, 0.2)", "rgba(75, 192, 192, 0.2)", "rgba(153, 102, 255, 0.2)", - "rgba(255, 159, 64, 0.2)", + "rgba(255, 159, 64, 0.2)" ] public static readonly borderColors = [ @@ -203,7 +208,7 @@ export default class TagRenderingChart extends Combine { "rgba(255, 206, 86, 1)", "rgba(75, 192, 192, 1)", "rgba(153, 102, 255, 1)", - "rgba(255, 159, 64, 1)", + "rgba(255, 159, 64, 1)" ] /** @@ -239,12 +244,12 @@ export default class TagRenderingChart extends Combine { const borderColor = [ TagRenderingChart.unkownBorderColor, TagRenderingChart.otherBorderColor, - TagRenderingChart.notApplicableBorderColor, + TagRenderingChart.notApplicableBorderColor ] const backgroundColor = [ TagRenderingChart.unkownColor, TagRenderingChart.otherColor, - TagRenderingChart.notApplicableColor, + TagRenderingChart.notApplicableColor ] while (borderColor.length < data.length) { @@ -276,17 +281,17 @@ export default class TagRenderingChart extends Combine { backgroundColor, borderColor, borderWidth: 1, - label: undefined, - }, - ], + label: undefined + } + ] }, options: { plugins: { legend: { - display: !barchartMode, - }, - }, - }, + display: !barchartMode + } + } + } } const chart = new ChartJs(config).SetClass(options?.chartclasses ?? "w-32 h-32") @@ -297,7 +302,7 @@ export default class TagRenderingChart extends Combine { super([ options?.includeTitle ? tagRendering.question.Clone() ?? tagRendering.id : undefined, - chart, + chart ]) this.SetClass("block") @@ -386,20 +391,26 @@ export default class TagRenderingChart extends Combine { } } - const labels = [ - "Unknown", - "Other", - "Not applicable", + const labels = [] + const data: T[][] = [] + + if (!options.hideUnkown) { + data.push(unknownCount) + labels.push("Unknown") + } + data.push(otherGrouped) + labels.push("Other") + if (!options.hideNotApplicable) { + data.push(notApplicable) + labels.push( + "Not applicable" + ) + } + data.push(...categoryCounts, + ...otherData) + labels.push( ...(mappings?.map((m) => m.then.txt) ?? []), - ...otherLabels, - ] - const data: T[][] = [ - unknownCount, - otherGrouped, - notApplicable, - ...categoryCounts, - ...otherData, - ] + ...otherLabels) return { labels, data } } diff --git a/src/UI/SpecialVisualizations.ts b/src/UI/SpecialVisualizations.ts index c96f5c62dd..c7ee4d3aa8 100644 --- a/src/UI/SpecialVisualizations.ts +++ b/src/UI/SpecialVisualizations.ts @@ -1153,10 +1153,11 @@ export default class SpecialVisualizations { constr: (state) => { return new Combine( state.layout.layers - .filter((l) => l.name !== null) + .filter((l) => l.name !== null && l.title && state.perLayer.get(l.id) !== undefined ) .map( (l) => { const fs = state.perLayer.get(l.id) + console.log(">>>", l.id, fs) const bbox = state.mapProperties.bounds const fsBboxed = new BBoxFeatureSourceForLayer(fs, bbox) return new StatisticsPanel(fsBboxed)