data-suggestions 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Escritorio - Acceso directo.lnk +0 -0
- package/README.md +241 -0
- package/assets/img/ejemploVariables.jpeg +0 -0
- package/assets/recomendaciones/count-times-a-certain-value-is-exceeded.json +56 -0
- package/assets/recomendaciones/count-times-does-not-exceed-a-certain-value.json +62 -0
- package/assets/recomendaciones/count-times-that-a-certain-value-is-repeated.json +158 -0
- package/assets/recomendaciones/highlight-a-value.json +92 -0
- package/assets/recomendaciones/highlight-higher-values.json +122 -0
- package/assets/recomendaciones/highlight-lower-values.json +122 -0
- package/assets/recomendaciones/highlight-the-highest-value.json +194 -0
- package/assets/recomendaciones/highlight-the-lowest-value.json +110 -0
- package/assets/recomendaciones/highlight-the-second-highest-value.json +62 -0
- package/assets/recomendaciones/highlight-the-second-lowest-value.json +92 -0
- package/assets/recomendaciones/highlight-the-third-highest-value.json +80 -0
- package/assets/recomendaciones/highlight-the-third-lowest-value.json +152 -0
- package/fesm2022/data-suggestions.mjs +1185 -0
- package/fesm2022/data-suggestions.mjs.map +1 -0
- package/index.d.ts +275 -0
- package/package.json +24 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-suggestions.mjs","sources":["../../../projects/data-suggestions/src/lib/config/visual-variable-index-map.ts","../../../projects/data-suggestions/src/lib/config/communication-goals.config.ts","../../../projects/data-suggestions/src/lib/model/chartsModels.ts","../../../projects/data-suggestions/src/lib/services/communicationRule/CommunicationRulesService.ts","../../../projects/data-suggestions/src/lib/services/data-suggestions-service/data-suggestions.ts","../../../projects/data-suggestions/src/lib/services/communication-goals/communication-goals.service.ts","../../../projects/data-suggestions/src/lib/bar-chart/bar-chart.ts","../../../projects/data-suggestions/src/lib/bar-chart/bar-chart.html","../../../projects/data-suggestions/src/lib/data-suggestions-table/data-suggestions-table.ts","../../../projects/data-suggestions/src/lib/data-suggestions-table/data-suggestions-table.html","../../../projects/data-suggestions/src/public-api.ts","../../../projects/data-suggestions/src/data-suggestions.ts"],"sourcesContent":["/**\n * Exact `visualVariable` names as in JSON → display order in the table.\n * Edit this object to change ordering; keys must match the JSON strings.\n */\nexport const VISUAL_VARIABLE_INDEX_BY_NAME: Readonly<Record<string, number>> = {\n 'Bar direction': 1,\n 'Order': 2,\n 'Labels': 3,\n 'Grid lines': 4,\n 'Axis maximum': 5,\n 'Number of steps': 6,\n 'Opacity': 7,\n 'Spacing between bars': 8,\n 'Color palette': 9,\n 'Border color': 10,\n 'Hover behavior': 11,\n};\n\n/** Returns configured index after trim, or undefined if not listed. */\nexport function getConfiguredVisualVariableIndex(visualVariable: string): number | undefined {\n const key = visualVariable.trim();\n const v = VISUAL_VARIABLE_INDEX_BY_NAME[key];\n return v !== undefined ? v : undefined;\n}\n","import { CommunicationGoalOption } from '../types';\n\nexport interface CommunicationGoalDefinition {\n index: number;\n label: string;\n /** Must match `assets/recomendaciones/<jsonSlug>.json`. */\n jsonSlug: string;\n}\n\n/**\n * Single catalog of communication goals and their rules JSON.\n * Host apps should use `CommunicationGoalsService` instead of duplicating this list.\n */\nexport const COMMUNICATION_GOAL_DEFINITIONS: readonly CommunicationGoalDefinition[] = [\n {\n index: 1,\n label: 'Count how many times a given value is repeated',\n jsonSlug: 'count-times-that-a-certain-value-is-repeated',\n },\n {\n index: 2,\n label: 'Count how many times a threshold is exceeded',\n jsonSlug: 'count-times-a-certain-value-is-exceeded',\n },\n {\n index: 3,\n label: 'Count how many times values stay below a threshold',\n jsonSlug: 'count-times-does-not-exceed-a-certain-value',\n },\n {\n index: 4,\n label: 'Highlight a specific value',\n jsonSlug: 'highlight-a-value',\n },\n {\n index: 5,\n label: 'Highlight the highest value',\n jsonSlug: 'highlight-the-highest-value',\n },\n {\n index: 6,\n label: 'Highlight the lowest value',\n jsonSlug: 'highlight-the-lowest-value',\n },\n {\n index: 7,\n label: 'Highlight higher values',\n jsonSlug: 'highlight-higher-values',\n },\n {\n index: 8,\n label: 'Highlight lower values',\n jsonSlug: 'highlight-lower-values',\n },\n] as const;\n\nexport function definitionsToBaseOptions(): CommunicationGoalOption[] {\n return COMMUNICATION_GOAL_DEFINITIONS.map((g) => ({\n index: g.index,\n value: g.label,\n json: g.jsonSlug,\n }));\n}\n","import { Injectable } from '@angular/core';\nimport { ReglaVisual } from '../services/communicationRule/CommunicationRulesService';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class chartsModel {\n data: any;\n dataSize: string = '';\n dataVariability: string = '';\n suggestedGraph: string = '';\n communicationGoal: number = 0;\n communicationGoalsOptions = [\n { index: 1, value: 'Count occurrences of a specific value' },\n { index: 2, value: 'Count occurrences of the maximum value' },\n { index: 3, value: 'Count occurrences of the minimum value' },\n { index: 4, value: 'Identify a specific value' },\n { index: 5, value: 'Identify the maximum value' },\n { index: 6, value: 'Identify the second highest value' },\n { index: 7, value: 'Identify the third highest value' },\n { index: 8, value: 'Identify the minimum value' },\n { index: 9, value: 'Identify the second lowest value' },\n { index: 10, value: 'Identify the third lowest value' },\n ];\n\n/** filesOptions = [\n { label: 'Gasolina en ciudades', fileName: 'gasolinaCiudades' }, //muy pequeño con poca variabilidad\n {\n label: 'Temperatura en oficinas',\n fileName: 'temperaturaMediaEnOficinas',\n }, //muy pequeño con poca variabilidad\n {\n label: 'Ventas diarias de limonada',\n fileName: 'ventasDiariasDeLimonada',\n }, //muy pequeño con variabilidad media\n {\n label: 'Duración llamadas en call center',\n fileName: 'duracionLlamadasCallCenter',\n }, //muy pequeño con variabilidad alta\n {\n label: 'Nivel de ruido en bibliotecas',\n fileName: 'nivelRuidoEnBibliotecas',\n }, //pequeño con variabilidad baja\n {\n label: 'Consumo de agua por hogar (L/día)',\n fileName: 'consumoAgua',\n }, //pequeño con variabilidad media\n {\n label: 'Horas dedicadas al gaming semanalmente',\n fileName: 'horasGaming',\n }, //pequeño con variabilidad alta\n {\n label: 'Tiempo de carga de una app (ms)',\n fileName: 'tiemposCarga',\n }, //medio con variabilidad baja\n {\n label: 'Distancia diaria Recorrida (km)',\n fileName: 'distanciaDiaria',\n }, //medio con variabilidad medial\n {\n label: 'Ingresos semanales de freelancers',\n fileName: 'ingresosSemanales',\n }, //medio con variabilidad alta\n {\n label: 'Nivel de batería de sensores IoT',\n fileName: 'nivelBateria',\n }, //grande con variabilidad baja\n {\n label: 'Tiempo de ejercicio diario (minutos)',\n fileName: 'tiempoEjercicio',\n }, //grande con variabilidad medial\n {\n label: 'Tiempo de carga de vehículos eléctricos (min)',\n fileName: 'tiempoCarga',\n }, //grande con variabilidad alta\n ];*/\n\n // selectedFile: any;\n\n rules: ReglaVisual[] = [];\n\n generatedRules: boolean = false;\n // recommendations: string[] = [];\n\n chartLabels: string[] = [];\n chartValues: number[] = [];\n\n orientation: 'Vertical' | 'Horizontal' = 'Vertical';\n\n //HABRIA QUE EDCIR QUE PASA CON LOS DE QUE SON a 0 B yo voy a ahcer de momento que sea el intermedio\n incrementoMaximo: number = 0; //voy a guardar por lo que hay multiplicar el valor mas alto para obtener el máximo\n numeroPasos: number = 10;\n auxiliarLines: boolean = false;\n opacity: number | undefined;\n ordered:boolean = false;\n labels: boolean = false\n separation:'none' | 'close' | 'medium' | 'wide' = 'medium';\n colorPalette:'single' | 'sequential' | 'categorical' = 'single'\n borderColor: \"Light border\" | \"Dark border\" | \"Same color as the bar\" | \"No border\" | \"Indifferent\" | \"Dark border or no border\" = \"Indifferent\"\n hoverRec:'none' | 'default' | 'intensify' | 'different' = 'default'\n showingInDialog:'data' | 'variables' | 'readme' | 'suggestions' |'communicationGoals' = 'suggestions';\n\n constructor() {}\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { catchError, forkJoin, map, Observable, of, tap } from 'rxjs';\nimport { chartsModel } from '../../model/chartsModels';\n\n/** Normalizes en/em dashes in sample-size labels so JSON matches computed stats. */\nexport function normalizeSampleSizeLabel(s: string | null | undefined): string {\n if (s == null) return '';\n return String(s)\n .replace(/\\u2013/g, '-')\n .replace(/\\u2014/g, '-')\n .trim();\n}\n\nexport interface ReglaVisual {\n index?: number | null;\n order?: number | null;\n visualVariable: string | null;\n sampleSize: string | null;\n variability: string | null;\n recommendation: string | null;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class CommunicationRulesService {\n private basePath = 'assets/recomendaciones/';\n\n constructor(\n private http: HttpClient,\n private readonly chartsModel: chartsModel,\n ) {}\n\n private loadJsonForGoal(goal: string): Observable<ReglaVisual[]> {\n const file = `${this.basePath}${goal}.json`;\n return this.http.get<ReglaVisual[]>(file);\n }\n\n /** All rules from `assets/recomendaciones/<goal>.json` (unfiltered). */\n getRulesForGoal(goal: string): Observable<ReglaVisual[]> {\n return this.loadJsonForGoal(goal).pipe(\n tap(() => {\n this.chartsModel.generatedRules = true;\n }),\n );\n }\n\n /**\n * Rules that match communication goal, sample size, and variability\n * (sample size labels are normalized, e.g. `10–19` vs `10-19`).\n */\n getRecomendaciones(\n goal: string,\n sampleSize: string,\n variability: string,\n ): Observable<ReglaVisual[]> {\n const wantSize = normalizeSampleSizeLabel(sampleSize);\n return this.getRulesForGoal(goal).pipe(\n map((reglas) =>\n reglas.filter(\n (r) =>\n normalizeSampleSizeLabel(r.sampleSize) === wantSize &&\n r.variability === variability &&\n !!r.recommendation,\n ),\n ),\n );\n }\n\n getRecommendationsCount(goal: string): Observable<number> {\n return this.http.get<unknown[]>(`${this.basePath}${goal}.json`).pipe(\n map((arr) => arr?.length ?? 0),\n catchError(() => of(0)),\n );\n }\n\n getCountsForGoals(goals: string[]): Observable<Record<string, number>> {\n const unique = [...new Set(goals)];\n const requests = unique.map((goal) =>\n this.getRecommendationsCount(goal).pipe(map((count) => ({ goal, count }))),\n );\n\n return forkJoin(requests).pipe(\n map((pairs) =>\n pairs.reduce(\n (acc, { goal, count }) => {\n acc[goal] = count;\n return acc;\n },\n {} as Record<string, number>,\n ),\n ),\n );\n }\n}\n","// projects/data-suggestions/src/lib/data-suggestions.service.ts\nimport { Injectable } from '@angular/core';\nimport { Observable, map } from 'rxjs';\n\nimport { DataPoint, SuggestionRow, SuggestionsResult } from '../../types';\nimport { VISUAL_VARIABLE_INDEX_BY_NAME } from '../../config/visual-variable-index-map';\nimport {\n CommunicationRulesService,\n normalizeSampleSizeLabel,\n ReglaVisual,\n} from '../communicationRule/CommunicationRulesService';\n\nfunction parseRuleIndex(raw: unknown, fallback: number): number {\n if (typeof raw === 'number' && Number.isFinite(raw)) return raw;\n if (typeof raw === 'string' && raw.trim() !== '') {\n const n = Number(raw);\n if (Number.isFinite(n)) return n;\n }\n return fallback;\n}\n\nfunction isExplicitIndex(raw: unknown): boolean {\n if (raw === null || raw === undefined) return false;\n if (typeof raw === 'number' && Number.isFinite(raw)) return true;\n if (typeof raw === 'string' && raw.trim() !== '') {\n const n = Number(raw);\n return Number.isFinite(n);\n }\n return false;\n}\n\nfunction firstFreeIndex(used: Set<number>): number {\n let n = 1;\n while (used.has(n)) n++;\n return n;\n}\n\n/**\n * Per-variable index (priority):\n * 1. `VISUAL_VARIABLE_INDEX_BY_NAME` in `visual-variable-index-map.ts`\n * 2. `index` / `order` / `orden` in JSON (minimum if several rows)\n * 3. Auto: first free integer by first appearance order in the file\n */\nfunction buildVisualVariableIndexMap(\n all: ReglaVisual[],\n canonical: Readonly<Record<string, number>> = VISUAL_VARIABLE_INDEX_BY_NAME,\n): Map<string, number> {\n const explicitByVar = new Map<string, number>();\n for (const r of all) {\n const v = r.visualVariable?.trim();\n if (!v) continue;\n const raw = r.index ?? r.order ?? r.order;\n if (!isExplicitIndex(raw)) continue;\n const n = parseRuleIndex(raw, NaN);\n if (!Number.isFinite(n)) continue;\n const prev = explicitByVar.get(v);\n if (prev === undefined || n < prev) explicitByVar.set(v, n);\n }\n\n const firstAppearance: string[] = [];\n const seen = new Set<string>();\n for (const r of all) {\n const v = r.visualVariable?.trim();\n if (!v || seen.has(v)) continue;\n seen.add(v);\n firstAppearance.push(v);\n }\n\n const map = new Map<string, number>();\n const used = new Set<number>();\n\n for (const v of firstAppearance) {\n let idx: number;\n if (Object.prototype.hasOwnProperty.call(canonical, v)) {\n idx = canonical[v]!;\n } else if (explicitByVar.has(v)) {\n idx = explicitByVar.get(v)!;\n } else {\n idx = firstFreeIndex(used);\n }\n map.set(v, idx);\n used.add(idx);\n }\n return map;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class DataSuggestionsService {\n constructor(private readonly rulesService: CommunicationRulesService) {}\n\n analyze(dataset: DataPoint[], goal: string): Observable<SuggestionsResult> {\n const suggestedGraph = this.analyzBestGraph(dataset, goal);\n\n const { dataVariability, dataSize } = this.computeStats(dataset);\n\n return this.rulesService.getRulesForGoal(goal).pipe(\n map((allRules) => {\n const indexByVariable = buildVisualVariableIndexMap(allRules);\n const wantSize = normalizeSampleSizeLabel(dataSize);\n const reglas = allRules.filter(\n (r) =>\n normalizeSampleSizeLabel(r.sampleSize) === wantSize &&\n r.variability === dataVariability &&\n !!r.recommendation,\n );\n\n const rules: SuggestionRow[] = reglas.map((r) => {\n const name = r.visualVariable ?? '';\n return {\n visualVariable: name,\n recommendation: r.recommendation ?? '',\n index: indexByVariable.get(name.trim()) ?? 0,\n };\n });\n\n rules.sort(\n (a, b) =>\n a.index - b.index ||\n a.visualVariable.localeCompare(b.visualVariable, 'en', { sensitivity: 'base' }),\n );\n\n return {\n dataSize,\n dataVariability,\n suggestedGraph,\n rules,\n };\n }),\n );\n }\n\n private analyzBestGraph(_dataset: DataPoint[], _goal: string): 'bars' {\n return 'bars';\n }\n\n private computeStats(dataset: DataPoint[]): {\n dataSize: '≤5' | '6-9' | '10-19' | '>20';\n dataVariability: 'Low' | 'Moderate' | 'High';\n } {\n const values = dataset.map((d) => d.value);\n const n = values.length;\n if (!n) {\n return { dataSize: '≤5', dataVariability: 'Low' };\n }\n\n const mean = values.reduce((a, b) => a + b, 0) / n;\n const variance = values.reduce((a, b) => a + Math.pow(b - mean, 2), 0) / n;\n const stdDev = Math.sqrt(variance);\n const coefVar = mean === 0 ? 0 : stdDev / mean;\n\n let vari: 'Low' | 'Moderate' | 'High';\n if (coefVar < 0.1) vari = 'Low';\n else if (coefVar <= 0.5) vari = 'Moderate';\n else vari = 'High';\n\n let sc: '≤5' | '6-9' | '10-19' | '>20';\n if (n <= 5) sc = '≤5';\n else if (n <= 9) sc = '6-9';\n else if (n <= 20) sc = '10-19';\n else sc = '>20';\n\n return { dataSize: sc, dataVariability: vari };\n }\n}\n","import { Injectable } from '@angular/core';\nimport { map, Observable } from 'rxjs';\nimport {\n COMMUNICATION_GOAL_DEFINITIONS,\n definitionsToBaseOptions,\n} from '../../config/communication-goals.config';\nimport { CommunicationGoalOption, CommunicationGoalSlug, DataPoint, SuggestionsResult } from '../../types';\nimport { CommunicationRulesService, ReglaVisual } from '../communicationRule/CommunicationRulesService';\nimport { DataSuggestionsService } from '../data-suggestions-service/data-suggestions';\n\n/**\n * Facade for host apps: goal catalog, rule counts, raw/filtered rules, and full suggestions\n * (same pipeline as `data-suggestions-table`).\n */\n@Injectable({ providedIn: 'root' })\nexport class CommunicationGoalsService {\n constructor(\n private readonly rulesService: CommunicationRulesService,\n private readonly suggestionsService: DataSuggestionsService,\n ) {}\n\n /** Goal definitions (index, label, JSON slug). */\n getDefinitions() {\n return COMMUNICATION_GOAL_DEFINITIONS;\n }\n\n /** Dropdown options without HTTP (label in `value`, slug in `json`). */\n getBaseOptions(): CommunicationGoalOption[] {\n return definitionsToBaseOptions();\n }\n\n /** Same options with `(n)` rule count per JSON file. */\n loadOptionsWithRuleCounts(): Observable<CommunicationGoalOption[]> {\n const defs = COMMUNICATION_GOAL_DEFINITIONS;\n const slugs = defs.map((d) => d.jsonSlug);\n return this.rulesService.getCountsForGoals(slugs).pipe(\n map((counts) =>\n defs.map((g) => ({\n index: g.index,\n value: `${g.label} (${counts[g.jsonSlug] ?? 0})`,\n json: g.jsonSlug,\n })),\n ),\n );\n }\n\n /** Full rules array from `assets/recomendaciones/<goalSlug>.json`. */\n getRulesForGoal(goalSlug: CommunicationGoalSlug): Observable<ReglaVisual[]> {\n return this.rulesService.getRulesForGoal(goalSlug);\n }\n\n /** Rules filtered by sample size and variability (for custom UIs). */\n getRecommendations(\n goalSlug: CommunicationGoalSlug,\n sampleSize: string,\n variability: string,\n ): Observable<ReglaVisual[]> {\n return this.rulesService.getRecomendaciones(goalSlug, sampleSize, variability);\n }\n\n /** Dataset stats + ordered suggestion rows (table / chart binding). */\n getSuggestionsResult(\n dataset: DataPoint[],\n goalSlug: CommunicationGoalSlug,\n ): Observable<SuggestionsResult> {\n return this.suggestionsService.analyze(dataset, goalSlug);\n }\n}\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n Input,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Chart, ChartConfiguration, registerables } from 'chart.js';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { ButtonModule } from 'primeng/button';\nimport { DialogModule } from 'primeng/dialog';\nimport { chartsModel } from '../model/chartsModels';\n\nChart.register(...registerables, ChartDataLabels);\n\n@Component({\n selector: 'lib-data-suggestions-bar-chart',\n standalone: true,\n imports: [CommonModule, ButtonModule, DialogModule],\n templateUrl: './bar-chart.html',\n styleUrl: './bar-chart.css',\n})\nexport class DataSuggestionsBarChartComponent implements AfterViewInit, OnChanges, OnDestroy {\n\n @ViewChild('canvas', { static: true })\n canvas!: ElementRef<HTMLCanvasElement>;\n\n @Input() title: string = 'Summary';\n @Input() labels: string[] = [];\n @Input() values: number[] = [];\n @Input() orientation: 'Vertical' | 'Horizontal' = 'Vertical';\n @Input() maxValue: number = 0;\n @Input() stepNumber: number = 10;\n @Input() auxiliarLines: boolean = true;\n @Input() opacity: number | undefined = undefined;\n @Input() sortAscending: boolean = false;\n @Input() showLabels: boolean = false;\n @Input() colorPalette:'single' | 'sequential' | 'categorical' = 'single'\n @Input() barDistance:'none' | 'close' | 'medium' | 'wide' = 'medium'\n @Input() barBorderRecommendation:string =\"\"\n @Input() hover: 'none' | 'default' | 'intensify' | 'different' = 'default'\n\n @Input() heightPx: number = 200;\n\n\n @Input() minHeightPx: number = 180;\n @Input() maxHeightPx: number = 360;\n \n @Input() minWidthPx: number = 320;\n @Input() maxWidthPx: number = 900;\n \n @Input() barSizePx: number = 55;\n \n chartHeightPx: number = 220;\n chartWidthPx: number = 500; \n\n private chart?: Chart;\n\n\n\n constructor() {}\n ngAfterViewInit(): void {\n this.render();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!this.canvas) return;\n\n if (\n changes['labels'] ||\n changes['values'] ||\n changes['title'] ||\n changes['orientation'] ||\n changes['maxValue'] ||\n changes['stepNumber'] ||\n changes['auxiliarLines'] ||\n changes['opacity'] ||\n changes['sortAscending'] ||\n changes[\"showLabels\"] ||\n changes[\"colorPalette\"] ||\n changes[\"barBorderRecommendation\"] ||\n changes[\"barDistance\"] ||\n changes[\"hover\"] ||\n changes['heightPx']\n ) {\n this.render();\n }\n }\n\n ngOnDestroy(): void {\n this.chart?.destroy();\n }\n\n private render(): void {\n \n const safeLen = Math.min(this.labels.length, this.values.length);\n\n let labels = this.labels.slice(0, safeLen);\n let values = this.values.slice(0, safeLen);\n \n this.updateChartSize(safeLen);\n\n\n if (this.sortAscending) {\n const combined = labels.map((label, index) => ({\n label,\n value: values[index],\n }));\n\n combined.sort((a, b) => a.value - b.value);\n\n labels = combined.map((item) => item.label);\n values = combined.map((item) => item.value);\n }\n\n const indexAxis: 'x' | 'y' = this.orientation === 'Horizontal' ? 'y' : 'x';\n\n this.chart?.destroy();\n\n const spacingConfig = this.getBarSpacingConfig();\n\n const colors = this.getBarColors(values);\n const borderColor = this.getBorderColors(colors);\n const borderWidth = 1;\n\n const hoverBackgroundColor = this.getHoverBackgroundColor(colors);\n const hoverBorderColor = this.getHoverBorderColor(borderColor);\n const hoverBorderWidth =1;\n\n console.log(\"borderColor\", borderColor)\n\n\n const config: ChartConfiguration<'bar'> = {\n type: 'bar',\n data: {\n labels,\n datasets: [\n {\n label: this.title,\n data: values,\n backgroundColor: colors,\n borderColor,\n borderWidth,\n hoverBackgroundColor,\n hoverBorderColor,\n hoverBorderWidth,\n categoryPercentage: spacingConfig.categoryPercentage,\n barPercentage: spacingConfig.barPercentage,\n },\n ],\n },\n options: {\n indexAxis,\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: { display: false },\n title: { display: !!this.title, text: this.title },\n datalabels: {\n display: this.showLabels,\n anchor: 'end',\n align: this.orientation === 'Horizontal' ? 'right' : 'top',\n formatter: (value: number) => value,\n color: '#333',\n font: {\n weight: 'bold',\n },\n },\n },\n scales: {\n x: {\n beginAtZero: true,\n max: this.orientation === 'Horizontal' ? this.maxValue : undefined,\n ticks: {\n stepSize: this.orientation === 'Horizontal' ? this.stepNumber : undefined,\n },\n grid: {\n display: this.orientation === 'Horizontal' ? this.auxiliarLines : false,\n },\n },\n y: {\n beginAtZero: true,\n max: this.orientation === 'Vertical' ? this.maxValue : undefined,\n ticks: {\n stepSize: this.orientation === 'Vertical' ? this.stepNumber : undefined,\n },\n grid: {\n display: this.orientation === 'Vertical' ? this.auxiliarLines : false,\n },\n },\n },\n },\n };\n\n this.chart = new Chart(this.canvas.nativeElement, config);\n }\n\n private getBarSpacingConfig(): { categoryPercentage: number; barPercentage: number } {\n switch (this.barDistance) {\n case 'none':\n return {\n categoryPercentage: 1.0,\n barPercentage: 1.0,\n };\n \n case 'close':\n return {\n categoryPercentage: 0.85,\n barPercentage: 0.85,\n };\n \n case 'medium':\n return {\n categoryPercentage: 0.65,\n barPercentage: 0.7,\n };\n \n case 'wide':\n return {\n categoryPercentage: 0.45,\n barPercentage: 0.5,\n };\n \n default:\n return {\n categoryPercentage: 0.7,\n barPercentage: 0.75,\n };\n }\n }\n\n \n private getBarColors(values: number[]): string[] | string {\n \n switch (this.colorPalette) {\n case 'single':\n return this.getSingleColor();\n \n case 'sequential':\n return this.getSequentialColors(values);\n \n case 'categorical':\n return this.getRandomColors(values.length);\n \n default:\n return this.getSingleColor();\n }\n }\n\n private getRandomColors(n: number): string[] {\n return Array.from({ length: n }, () => {\n const r = Math.floor(Math.random() * 200);\n const g = Math.floor(Math.random() * 200);\n const b = Math.floor(Math.random() * 200);\n const a = this.opacity ?? 0.8;\n \n return `rgba(${r}, ${g}, ${b}, ${a})`;\n });\n }\n\n private getSequentialColors(values: number[]): string[] {\n const max = Math.max(...values);\n const opacity = this.opacity ?? 0.8;\n \n return values.map((v) => {\n const intensity = v / max;\n const alpha = 0.3 + intensity * 0.7;\n \n return `rgba(54, 162, 235, ${alpha * opacity})`;\n });\n }\n\n private getSingleColor(): string {\n return `rgba(54, 162, 235, ${this.opacity ?? 0.7})`;\n }\n\n\n private getBorderColors(backgroundColor: string | string[]): string | string[] {\n const text = (this.barBorderRecommendation ?? '').trim().toLowerCase();\n \n const getColor = () => {\n switch (text) {\n case 'dark border':\n case 'dark border or no border':\n return 'rgba(0, 0, 0, 0.7)'; // negro con la misma opacidad\n \n case 'light border':\n return 'rgba(220, 220, 220, 0.7)'; // gris claro\n \n case 'same color as the bar':\n case 'no border':\n case 'indifferent':\n default:\n return null; // usar color de la barra\n }\n };\n \n const border = getColor();\n \n if (!border) {\n return backgroundColor;\n }\n \n return Array.isArray(backgroundColor)\n ? backgroundColor.map(() => border)\n : border;\n }\n\n private intensifyRgbaColor(color: string): string {\n const match = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([\\d.]+))?\\)/i);\n \n if (!match) return color;\n \n let r = Number(match[1]);\n let g = Number(match[2]);\n let b = Number(match[3]);\n const a = match[4] !== undefined ? Number(match[4]) : (this.opacity ?? 0.7);\n \n\n const darkFactor = 0.8;\n r *= darkFactor;\n g *= darkFactor;\n b *= darkFactor;\n\n const avg = (r + g + b) / 3;\n \n const saturationFactor = 1.25;\n \n r = avg + (r - avg) * saturationFactor;\n g = avg + (g - avg) * saturationFactor;\n b = avg + (b - avg) * saturationFactor;\n \n // clamp\n r = Math.min(255, Math.max(0, Math.round(r)));\n g = Math.min(255, Math.max(0, Math.round(g)));\n b = Math.min(255, Math.max(0, Math.round(b)));\n \n return `rgba(${r}, ${g}, ${b}, ${a})`;\n }\n private getDifferentHoverColor(): string {\n return `rgba(255, 159, 64, ${this.opacity ?? 0.7})`;\n }\n\nprivate getHoverBackgroundColor(backgroundColor: string | string[]): string | string[] | undefined {\n\n\n switch (this.hover) {\n case 'default':\n return undefined;\n\n case 'none':\n return backgroundColor;\n\n case 'intensify':\n return Array.isArray(backgroundColor)\n ? backgroundColor.map((color) => this.intensifyRgbaColor(color))\n : this.intensifyRgbaColor(backgroundColor);\n\n case 'different': {\n const hoverColor = this.getDifferentHoverColor();\n return Array.isArray(backgroundColor)\n ? backgroundColor.map(() => hoverColor)\n : hoverColor;\n }\n\n default:\n return undefined;\n }\n}\n\nprivate getHoverBorderColor(borderColor: string | string[]): string | string[] | undefined {\n\n\n switch (this.hover) {\n case 'default':\n return undefined;\n\n case 'none':\n return borderColor;\n\n case 'intensify':\n return Array.isArray(borderColor)\n ? borderColor.map(() => `rgba(0, 0, 0, ${this.opacity ?? 0.7})`)\n : `rgba(0, 0, 0, ${this.opacity ?? 0.7})`;\n\n case 'different':\n return Array.isArray(borderColor)\n ? borderColor.map(() => `rgba(120, 60, 0, ${this.opacity ?? 0.7})`)\n : `rgba(120, 60, 0, ${this.opacity ?? 0.7})`;\n\n default:\n return undefined;\n }\n}\nprivate updateChartSize(numberOfBars: number): void {\n const safeBars = Math.max(numberOfBars, 1);\n\n if (this.orientation === 'Vertical') {\n this.chartWidthPx = this.clamp(\n safeBars * this.barSizePx,\n this.minWidthPx,\n this.maxWidthPx\n );\n\n this.chartHeightPx = this.clamp(\n this.heightPx,\n this.minHeightPx,\n this.maxHeightPx\n );\n } else {\n this.chartWidthPx = this.clamp(\n this.maxWidthPx,\n this.minWidthPx,\n this.maxWidthPx\n );\n\n this.chartHeightPx = this.clamp(\n safeBars * 40,\n this.minHeightPx,\n this.maxHeightPx\n );\n }\n}\n\nprivate clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n}","<div class=\"chart-wrap\" [style.height.px]=\"chartHeightPx\"\n[style.width.px]=\"chartWidthPx\">\n <canvas #canvas></canvas>\n</div>\n","// projects/data-suggestions/src/lib/data-suggestions-table.component.ts\r\nimport { CommonModule } from '@angular/common';\r\nimport { Component, Input, OnChanges } from '@angular/core';\r\nimport { Observable, of, Subject, takeUntil, tap } from 'rxjs';\r\nimport { DataPoint, SuggestionRow, SuggestionsResult } from '../types';\r\nimport { DataSuggestionsService } from '../services/data-suggestions-service/data-suggestions';\r\nimport { DataSuggestionsBarChartComponent } from '../bar-chart/bar-chart';\r\nimport { chartsModel } from '../model/chartsModels';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { DialogModule } from 'primeng/dialog';\r\n\r\nfunction findRule(rules: SuggestionRow[], ...names: string[]): SuggestionRow | undefined {\r\n for (const n of names) {\r\n const hit = rules.find((r) => r.visualVariable === n);\r\n if (hit) return hit;\r\n }\r\n return undefined;\r\n}\r\n\r\n@Component({\r\n selector: 'data-suggestions-table',\r\n standalone: true,\r\n imports: [CommonModule, DataSuggestionsBarChartComponent, ButtonModule, DialogModule ],\r\n templateUrl: './data-suggestions-table.html',\r\n styleUrl: './data-suggestions-table.scss',\r\n})\r\nexport class DataSuggestionsTableComponent implements OnChanges {\r\n @Input({ required: true }) dataset: DataPoint[] = [];\r\n @Input({ required: true }) goal!: string;\r\n\r\n result$: Observable<SuggestionsResult | null> = of(null);\r\n private readonly destroy$ = new Subject<void>();\r\n showGraph: boolean = false;\r\n showJsonInfoDialog: boolean = false;\r\n jsonExample = `{\r\n \"data\": [\r\n { \"key\": \"Monday\", \"value\": 30 },\r\n { \"key\": \"Tuesday\", \"value\": 42 },\r\n { \"key\": \"Wednesday\", \"value\": 35 },\r\n { \"key\": \"Thursday\", \"value\": 50 },\r\n { \"key\": \"Friday\", \"value\": 38 }\r\n ]\r\n }`;\r\n jsonExample1 = `[\r\n { \"key\": \"Monday\", \"value\": 30 },\r\n { \"key\": \"Tuesday\", \"value\": 42 },\r\n { \"key\": \"Wednesday\", \"value\": 35 }\r\n ]`;\r\n \r\n jsonExample2 = `{\r\n \"Monday\": 30,\r\n \"Tuesday\": 42,\r\n \"Wednesday\": 35\r\n }`;\r\n \r\n jsonExample3 = `{\r\n \"days\": [\"Monday\", \"Tuesday\", \"Wednesday\"],\r\n \"values\": [30, 42, 35]\r\n }`;\r\n \r\n jsonExample4 = `[\r\n [\"Monday\", 30],\r\n [\"Tuesday\", 42],\r\n [\"Wednesday\", 35]\r\n ]`;\r\n resultsLength: number = 0;\r\n\r\ncommunicationGoalsServiceExample = `\r\nconstructor(\r\n private communicationGoalsService: CommunicationGoalsService\r\n) {}\r\n\r\nngOnInit(): void {\r\n this.communicationGoalsService\r\n .loadOptionsWithRuleCounts()\r\n .subscribe(goals => {\r\n console.log(goals);\r\n });\r\n}\r\n`;\r\n\r\ncommunicationGoalsResponseExample = `\r\n[\r\n {\r\n \"index\": 5,\r\n \"value\": \"Highlight the highest value (24)\",\r\n \"json\": \"highlight-the-highest-value\"\r\n }\r\n]\r\n`;\r\n\r\ncommunicationGoalUsageExample = `\r\n{\r\n \"communicationGoal\": \"highlight-the-highest-value\"\r\n}\r\n`;\r\n constructor(\r\n private readonly svc: DataSuggestionsService,\r\n public readonly chartModel: chartsModel,\r\n ) {}\r\n ngOnChanges(): void {\r\n const normalizedData = this.normalizeDataset(this.dataset);\r\n \r\n if (normalizedData.length && this.goal) {\r\n console.log('cambios en', this.dataset, this.goal);\r\n \r\n this.chartModel.chartLabels = normalizedData.map(item => item.key);\r\n this.chartModel.chartValues = normalizedData.map(item => item.value);\r\n \r\n this.result$ = this.svc.analyze(normalizedData, this.goal).pipe(\r\n tap((result) => {\r\n if (result) {\r\n this.setChartOptions(result);\r\n }\r\n }),\r\n takeUntil(this.destroy$),\r\n );\r\n }\r\n }\r\n obtainKeysAndValues() {\r\n\r\n const normalizedData = this.normalizeDataset(this.dataset);\r\n\r\n this.chartModel.chartLabels =\r\n normalizedData.map(item => item.key);\r\n \r\n this.chartModel.chartValues =\r\n normalizedData.map(item => item.value); \r\n }\r\n\r\n private normalizeDataset(dataset: any): { key: string; value: number }[] {\r\n\r\n if (!dataset) {\r\n return [];\r\n }\r\n \r\n // ==========================================\r\n // FORMATO 1: Array de objetos\r\n // ==========================================\r\n if (\r\n Array.isArray(dataset) &&\r\n dataset.every(\r\n item =>\r\n item &&\r\n typeof item === 'object' &&\r\n 'key' in item &&\r\n 'value' in item\r\n )\r\n ) {\r\n return dataset.map(item => ({\r\n key: String(item.key),\r\n value: Number(item.value)\r\n }));\r\n }\r\n \r\n // ==========================================\r\n // FORMATO 2: Array de tuplas\r\n // ==========================================\r\n if (\r\n Array.isArray(dataset) &&\r\n dataset.every(\r\n item =>\r\n Array.isArray(item) &&\r\n item.length >= 2\r\n )\r\n ) {\r\n return dataset.map(item => ({\r\n key: String(item[0]),\r\n value: Number(item[1])\r\n }));\r\n }\r\n \r\n // ==========================================\r\n // FORMATO 3: Diccionario clave-valor\r\n // ==========================================\r\n if (\r\n typeof dataset === 'object' &&\r\n !Array.isArray(dataset) &&\r\n Object.values(dataset).every(v => typeof v === 'number')\r\n ) {\r\n return Object.entries(dataset).map(([key, value]) => ({\r\n key,\r\n value: Number(value)\r\n }));\r\n }\r\n \r\n // ==========================================\r\n // FORMATO 4: Estructura columnar\r\n // ==========================================\r\n if (\r\n typeof dataset === 'object' &&\r\n !Array.isArray(dataset)\r\n ) {\r\n \r\n const arrayProperties = Object.keys(dataset)\r\n .filter(key => Array.isArray(dataset[key]));\r\n \r\n if (arrayProperties.length >= 2) {\r\n \r\n const labelsArray = dataset[arrayProperties[0]];\r\n const valuesArray = dataset[arrayProperties[1]];\r\n \r\n if (\r\n labelsArray.length === valuesArray.length &&\r\n valuesArray.every((v: any) => typeof v === 'number')\r\n ) {\r\n \r\n return labelsArray.map(\r\n (label: any, index: number) => ({\r\n key: String(label),\r\n value: Number(valuesArray[index])\r\n })\r\n );\r\n }\r\n }\r\n }\r\n \r\n console.warn('Unsupported dataset format', dataset);\r\n \r\n return [];\r\n }\r\n private setChartOptions(result: SuggestionsResult): void {\r\n this.showGraph = false;\r\n //'Bar direction'\r\n this.resultsLength = result.rules.length;\r\n const orientationRule = findRule(result.rules, 'Bar direction');\r\n const orientationRecommendation = orientationRule?.recommendation;\r\n if (orientationRecommendation === 'Horizontal' || orientationRecommendation === 'Horizontal orientation') {\r\n this.chartModel.orientation = 'Horizontal';\r\n } else if (orientationRecommendation === 'Vertical') {\r\n this.chartModel.orientation = 'Vertical';\r\n } else {\r\n this.chartModel.orientation = 'Vertical';\r\n }\r\n // 'Order'\r\n //Ordered , indiferent, Unordered\r\n const orderRule = findRule(result.rules, 'Order')\r\n const orderRecommendation = orderRule?.recommendation;\r\n if(orderRecommendation==='Ordered'){\r\n this.chartModel.ordered = true;\r\n }else{\r\n this.chartModel.ordered = false;\r\n }\r\n // 'Labels'\r\n //Do not label, do not use, indifferent, use labels, with labels, without lables\r\n const labelsRule = findRule(result.rules, 'Labels')\r\n const labelRecommendation = labelsRule?.recommendation;\r\n if(labelRecommendation==='Use labels' ||labelRecommendation ==='With labels' ){\r\n this.chartModel.labels = true;\r\n }else{\r\n this.chartModel.labels = false;\r\n }\r\n\r\n\r\n // 'Grid lines'\r\n const auxiliarLinesRec = findRule(result.rules, 'Grid lines');\r\n const gridRec = auxiliarLinesRec?.recommendation ?? '';\r\n if (gridRec === 'Without grid lines') {\r\n this.chartModel.auxiliarLines = false;\r\n } else {\r\n this.chartModel.auxiliarLines = true;\r\n }\r\n\r\n // 'Axis maximum'\r\n const maxAxisRule = findRule(result.rules, 'Axis maximum');\r\n const max = getMaxValue(this.chartModel.chartValues);\r\n switch (maxAxisRule?.recommendation) {\r\n case 'Real maximum':\r\n this.chartModel.incrementoMaximo = max;\r\n break;\r\n case '30% of the maximum':\r\n case '30% above the maximum':\r\n this.chartModel.incrementoMaximo = max + max * 0.3;\r\n break;\r\n case 'Maximum +20%':\r\n this.chartModel.incrementoMaximo = max + max * 0.2;\r\n break;\r\n case '10% above the highest value':\r\n this.chartModel.incrementoMaximo = max + max * 0.1;\r\n break;\r\n case '10% or 20% above the maximum':\r\n this.chartModel.incrementoMaximo = max + max * 0.15;\r\n break;\r\n case '20% or 30% above the maximum':\r\n this.chartModel.incrementoMaximo = max + max * 0.25;\r\n break;\r\n case 'Indifferent':\r\n default:\r\n this.chartModel.incrementoMaximo = max;\r\n break;\r\n }\r\n // 'Number of steps'\r\n \r\n const stepRec = findRule(result.rules, 'Number of steps');\r\n const stepNumber = this.calculateAxisStepByPercentage(\r\n max,\r\n stepRec ? stepRec.recommendation : 'Indifferent',\r\n );\r\n this.chartModel.numeroPasos = stepNumber;\r\n\r\n // 'Opacity'\r\n \r\n const opacityRule = findRule(result.rules, 'Opacity');\r\n const opacityRecommendation = opacityRule?.recommendation ?? 'Indifferent';\r\n\r\n switch (opacityRecommendation) {\r\n case 'Opaque':\r\n this.chartModel.opacity = 1;\r\n break;\r\n case 'Transparent':\r\n case 'More transparent':\r\n case 'Transparency':\r\n this.chartModel.opacity = 0.4;\r\n break;\r\n case 'Indifferent':\r\n default:\r\n this.chartModel.opacity = undefined;\r\n }\r\n // 'Spacing between bars'\r\n // Close bars, \"Very close or very separated\", \"Separated or widely spaced\", \"Close or separated\", \"Separated or widely spaced\", \"No spacing\",\r\n // \"Widely spaced\", \"Close\", \"Close or widely spaced\", \"Close or slightly separated\", \"Indifferent\", \" \"Close or widely spaced\"\", \r\n const spaceRule = findRule(result.rules, 'Spacing between bars');\r\n const spaceRecommendation = spaceRule?.recommendation ?? 'Indifferent';\r\n this.chartModel.separation = this.normalizeSpacingRecommendation(spaceRecommendation)\r\n // 'Bar color'\r\n //\"Random or ordered\", \"Indifferent\", \"Ordered or fully distinct\", \"Random color palette\", \r\n const barColorRule = findRule(result.rules, 'Color palette');\r\n const barColorRec = barColorRule?.recommendation ?? 'Indifferent';\r\n this.chartModel.colorPalette = this.normalizeColorMode(barColorRec)\r\n // 'Border color':\r\n //·Indifferent·, \"Light border\", \"Dark border\", \"\"Dark border or no border\", \"No border\", \"Same color as the bar\", \"Dark border\", \"Moderate\", \"Light border\"\r\n const borderColorRule = findRule(result.rules, 'Border color');\r\n const borderColorRec:any = borderColorRule?.recommendation ?? 'Indifferent';\r\n this.chartModel.borderColor = borderColorRec;\r\n\r\n //'Hover behavior'\r\n //Indifferent, \"Different color or highlighted tone\", \"Highlight color\", \"Highlight bar color\", \"Highlight\", \"Do nothing\",\"Do nothing or highlight color\",\"\"\r\n const hoverRule = findRule(result.rules, 'Hover behavior');\r\n const hoverRec:any = hoverRule?.recommendation ?? 'Indifferent';\r\n\r\n const text = (hoverRec ?? '').trim().toLowerCase();\r\n switch (text) {\r\n case 'do nothing':\r\n\r\n case '':\r\n this.chartModel.hoverRec = 'none';\r\n break;\r\n \r\n case 'indifferent':\r\n this.chartModel.hoverRec = 'default';\r\n break;\r\n \r\n case 'highlight':\r\n case 'highlight color':\r\n case 'highlight bar color':\r\n case 'do nothing or highlight color':\r\n\r\n this.chartModel.hoverRec = 'intensify';\r\n break;\r\n\r\n case 'different color or highlighted tone':\r\n this.chartModel.hoverRec = 'different';\r\n break;\r\n \r\n default:\r\n this.chartModel.hoverRec = 'default';\r\n break;\r\n }\r\n\r\n\r\n this.showGraph = true;\r\n }\r\n\r\n private calculateAxisStepByPercentage(maxAxisValue: number, recommendation: string): number {\r\n if (maxAxisValue <= 0) return 1;\r\n\r\n let percentage: number;\r\n\r\n switch (recommendation) {\r\n case 'Few steps':\r\n percentage = 0.5;\r\n break;\r\n case 'Medium steps':\r\n case 'Medium number of steps':\r\n percentage = 0.25;\r\n break;\r\n case 'Few or medium steps':\r\n percentage = 0.3;\r\n break;\r\n case 'Indifferent':\r\n default:\r\n percentage = 0.25;\r\n break;\r\n }\r\n\r\n return maxAxisValue * percentage;\r\n }\r\n\r\n private normalizeSpacingRecommendation(\r\n recommendation: string | null | undefined\r\n ): 'none' | 'close' | 'medium' | 'wide' {\r\n const text = (recommendation ?? '').trim().toLowerCase();\r\n \r\n if (!text || text === 'indifferent') return 'medium';\r\n \r\n if (text === 'no spacing') return 'none';\r\n \r\n if (text === 'close bars' || text === 'close') return 'close';\r\n \r\n if (text === 'widely spaced') return 'wide';\r\n \r\n if (text.includes('or')) return 'medium';\r\n \r\n if (text.includes('very close')) return 'none';\r\n if (text.includes('slightly separated')) return 'close';\r\n if (text.includes('separated')) return 'medium';\r\n \r\n return 'medium';\r\n }\r\n \r\n private normalizeColorMode( recommendation: string | null | undefined\r\n ): 'single' | 'sequential' | 'categorical' {\r\n console.log(\"normalizeColorMode\", recommendation)\r\n console.log(\"RECOMENDACION\", recommendation)\r\n const text = (recommendation ?? '').toLowerCase().trim();\r\n \r\n console.log(\"text\")\r\n if (!text || text === 'indifferent') {\r\n return 'single';\r\n }\r\n \r\n if (text.includes('random color palette')) {\r\n return 'categorical';\r\n }\r\n \r\n if (text.includes('ordered or fully distinct')) {\r\n return 'sequential';\r\n }\r\n \r\n if (text.includes('random or ordered')) {\r\n return 'sequential';\r\n }\r\n \r\n return 'single';\r\n }\r\n\r\n \r\n}\r\n\r\nfunction getMaxValue(values: number[]): number {\r\n if (!values.length) return 0;\r\n return Math.max(...values);\r\n}\r\n\r\n\r\n\r\n","<section class=\"panel\">\r\n <header class=\"header\">\r\n <span>Applied suggestions: {{ resultsLength }}</span>\r\n <!-- <button type=\"button\" (click)=\"generate()\" [disabled]=\"!dataset?.length || !goal\">\r\n Analyze\r\n </button> -->\r\n <p-button\r\n icon=\"pi pi-info-circle\"\r\n title=\"Info\"\r\n (click)=\"showJsonInfoDialog = true\"\r\n styleClass=\"p-button-text\"\r\n ></p-button>\r\n </header>\r\n\r\n \r\n @if (showGraph) {\r\n <lib-data-suggestions-bar-chart\r\n [title]=\"'Recommendations'\"\r\n [labels]=\"this.chartModel.chartLabels\"\r\n [values]=\"this.chartModel.chartValues\"\r\n [orientation]=\"this.chartModel.orientation\"\r\n [maxValue]=\"this.chartModel.incrementoMaximo\"\r\n [stepNumber]=\"this.chartModel.numeroPasos\"\r\n [auxiliarLines]=\"this.chartModel.auxiliarLines\"\r\n [heightPx]=\"320\"\r\n [opacity]=\"this.chartModel.opacity\"\r\n [sortAscending]=\"this.chartModel.ordered\"\r\n [showLabels]=\"this.chartModel.labels\"\r\n [barDistance] = \"this.chartModel.separation\"\r\n [colorPalette]=\"this.chartModel.colorPalette\"\r\n [barBorderRecommendation]=\"this.chartModel.borderColor\"\r\n [hover]=\"this.chartModel.hoverRec\"\r\n >\r\n </lib-data-suggestions-bar-chart>\r\n \r\n }\r\n \r\n</section>\r\n\r\n<p-dialog\r\nheader=\"Info\"\r\n[(visible)]=\"showJsonInfoDialog\"\r\n[modal]=\"true\"\r\n[dismissableMask]=\"true\"\r\n[style]=\"{ width: '52rem' }\"\r\n>\r\n\r\n<div class=\"dialog-tabs\">\r\n <button\r\ntype=\"button\"\r\nclass=\"dialog-tab\"\r\n[class.active]=\"chartModel.showingInDialog === 'suggestions'\"\r\n(click)=\"chartModel.showingInDialog = 'suggestions'\"\r\n>\r\nSuggestions\r\n</button>\r\n<button\r\ntype=\"button\"\r\nclass=\"dialog-tab\"\r\n[class.active]=\"chartModel.showingInDialog === 'data'\"\r\n(click)=\"chartModel.showingInDialog = 'data'\"\r\n>\r\nExpected data format\r\n</button>\r\n\r\n<button\r\ntype=\"button\"\r\nclass=\"dialog-tab\"\r\n[class.active]=\"chartModel.showingInDialog === 'variables'\"\r\n(click)=\"chartModel.showingInDialog = 'variables'\"\r\n>\r\nVariables overview\r\n</button>\r\n\r\n<button\r\ntype=\"button\"\r\nclass=\"dialog-tab\"\r\n[class.active]=\"chartModel.showingInDialog === 'readme'\"\r\n(click)=\"chartModel.showingInDialog = 'readme'\"\r\n>\r\nHow to use the library\r\n</button>\r\n<button\r\n type=\"button\"\r\n class=\"dialog-tab\"\r\n [class.active]=\"chartModel.showingInDialog === 'communicationGoals'\"\r\n (click)=\"chartModel.showingInDialog = 'communicationGoals'\"\r\n>\r\nCommunication Goals\r\n</button>\r\n</div>\r\n<div class=\"grid body\">\r\n @if(chartModel.showingInDialog === 'suggestions'){\r\n <ng-container *ngIf=\"result$ | async as result\">\r\n <div class=\"suggestions-content\">\r\n \r\n <div class=\"meta\">\r\n <span><strong>Size:</strong> {{ result.dataSize }}</span>\r\n <span><strong>Variability:</strong> {{ result.dataVariability }}</span>\r\n <span><strong>Suggested chart:</strong> {{ result.suggestedGraph }}</span>\r\n </div>\r\n \r\n @if(result.rules?.length){\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th>Index</th>\r\n <th>Visual variable</th>\r\n <th>Recommendation</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let r of result.rules\">\r\n <td>{{ r.index }}</td>\r\n <td>{{ r.visualVariable }}</td>\r\n <td>{{ r.recommendation }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n } @else {\r\n <p class=\"empty\">\r\n There are no suggestions for this combination.\r\n </p>\r\n }\r\n \r\n </div>\r\n </ng-container>\r\n }\r\n@if(chartModel.showingInDialog === 'data'){\r\n<p>\r\n The library accepts multiple JSON structures and automatically converts them \r\n into the internal format required to generate the chart.\r\n</p>\r\n\r\n\r\n <div class=\"json-section\">\r\n <h4>Option 1: Array of objects</h4>\r\n <pre class=\"json-example\">{{ jsonExample1 }}</pre>\r\n </div>\r\n\r\n <div class=\"json-section\">\r\n <h4>Option 2: Key-value dictionary</h4>\r\n <pre class=\"json-example\">{{ jsonExample2 }}</pre>\r\n </div>\r\n\r\n <div class=\"json-section\">\r\n <h4>Option 3: Column-oriented structure</h4>\r\n <pre class=\"json-example\">{{ jsonExample3 }}</pre>\r\n </div>\r\n\r\n <div class=\"json-section\">\r\n <h4>Option 4: Array of tuples</h4>\r\n <pre class=\"json-example\">{{ jsonExample4 }}</pre>\r\n </div>\r\n\r\n\r\n}\r\n@if(chartModel.showingInDialog === 'variables'){\r\n<img\r\nsrc=\"assets/img/ejemploVariables.jpeg\"\r\nalt=\"Summary of recommended configurations\"\r\nstyle=\"width: 400px; margin-left: 120px;\"\r\n/>\r\n\r\n}\r\n@if(chartModel.showingInDialog === 'readme'){\r\n <div class=\"info-section\" style=\"margin-left: 10px;\">\r\n <h3>Quick Start</h3>\r\n \r\n <p>\r\n Install the library from the NPM registry:\r\n </p>\r\n \r\n <pre><code>npm install data-suggestions</code></pre>\r\n \r\n <p>\r\n Import the component into your Angular application and provide a dataset\r\n together with a communication goal. The library will automatically analyze\r\n the data and generate visualization recommendations.\r\n </p>\r\n \r\n <p>\r\n For detailed installation instructions, supported data formats,\r\n configuration options, examples, and API documentation, please refer to\r\n the project's README file.\r\n </p>\r\n </div>\r\n \r\n}\r\n@if(chartModel.showingInDialog === 'communicationGoals'){\r\n <div class=\"communication-goals-content\" style=\"margin-left: 10px;\">\r\n\r\n\r\n <p>\r\n Communication goals define the analytical objective that the library\r\n should apply when generating visualization recommendations.\r\n </p>\r\n\r\n <p>\r\n The available communication goals can be retrieved directly through the\r\n <code>CommunicationGoalsService</code>.\r\n </p>\r\n\r\n <div class=\"json-section\">\r\n <h4>Get communication goals with recommendation counts</h4>\r\n <pre class=\"json-example\" [textContent]=\"communicationGoalsServiceExample\"></pre>\r\n </div>\r\n\r\n <div class=\"json-section\">\r\n <h4>Example response</h4>\r\n <pre class=\"json-example\" [textContent]=\"communicationGoalsResponseExample\"></pre>\r\n </div>\r\n\r\n <p>\r\n The <code>json</code> property contains the value that must be passed to\r\n the <code>communicationGoal</code> parameter.\r\n </p>\r\n\r\n <div class=\"json-section\">\r\n <h4>Usage example</h4>\r\n <pre class=\"json-example\" [textContent]=\"communicationGoalUsageExample\"></pre>\r\n </div>\r\n\r\n </div>\r\n}\r\n</div>\r\n<!-- <p>\r\nEl archivo debe ser un JSON con una propiedad <strong>data</strong> que sea\r\nun array de objetos con <strong>key</strong> y <strong>value</strong>.\r\n</p>\r\n\r\n<pre class=\"json-example\">{{ jsonExample }}</pre>\r\n-->\r\n<ng-template pTemplate=\"footer\">\r\n<p-button\r\n label=\"Cerrar\"\r\n icon=\"pi pi-check\"\r\n (click)=\"showJsonInfoDialog = false\"\r\n></p-button>\r\n</ng-template>\r\n</p-dialog>","/*\n * Public API Surface of data-suggestions\n */\n\nexport * from './lib/types';\nexport * from './lib/config/visual-variable-index-map';\nexport * from './lib/config/communication-goals.config';\nexport * from './lib/services/communicationRule/CommunicationRulesService';\nexport * from './lib/services/communication-goals/communication-goals.service';\nexport * from './lib/services/data-suggestions-service/data-suggestions';\nexport * from './lib/data-suggestions-table/data-suggestions-table';\nexport * from './lib/bar-chart/bar-chart';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.chartsModel","i1.CommunicationRulesService","i2.DataSuggestionsService","i1.DataSuggestionsService"],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { HttpClient } from '@angular/common/http';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import * as i0 from '@angular/core';
|
|
4
|
+
import { OnChanges, AfterViewInit, OnDestroy, ElementRef, SimpleChanges } from '@angular/core';
|
|
5
|
+
import * as data_suggestions from 'data-suggestions';
|
|
6
|
+
|
|
7
|
+
type CommunicationGoalSlug = string;
|
|
8
|
+
/** Entrada del desplegable de objetivo (compatible con PrimeNG optionLabel/value). */
|
|
9
|
+
interface CommunicationGoalOption {
|
|
10
|
+
index: number;
|
|
11
|
+
value: string;
|
|
12
|
+
/** Slug del JSON en `assets/recomendaciones/<json>.json`. */
|
|
13
|
+
json: string;
|
|
14
|
+
}
|
|
15
|
+
interface DataPoint {
|
|
16
|
+
key: string;
|
|
17
|
+
value: number;
|
|
18
|
+
}
|
|
19
|
+
interface SuggestionRow {
|
|
20
|
+
/** Order: `index` / `order` / `orden` in JSON; otherwise auto gap fill. */
|
|
21
|
+
index: number;
|
|
22
|
+
visualVariable: string;
|
|
23
|
+
recommendation: string;
|
|
24
|
+
}
|
|
25
|
+
interface SuggestionsResult {
|
|
26
|
+
dataSize: '≤5' | '6-9' | '10-19' | '>20';
|
|
27
|
+
dataVariability: 'Low' | 'Moderate' | 'High';
|
|
28
|
+
suggestedGraph: 'bars' | string;
|
|
29
|
+
rules: SuggestionRow[];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Exact `visualVariable` names as in JSON → display order in the table.
|
|
34
|
+
* Edit this object to change ordering; keys must match the JSON strings.
|
|
35
|
+
*/
|
|
36
|
+
declare const VISUAL_VARIABLE_INDEX_BY_NAME: Readonly<Record<string, number>>;
|
|
37
|
+
/** Returns configured index after trim, or undefined if not listed. */
|
|
38
|
+
declare function getConfiguredVisualVariableIndex(visualVariable: string): number | undefined;
|
|
39
|
+
|
|
40
|
+
interface CommunicationGoalDefinition {
|
|
41
|
+
index: number;
|
|
42
|
+
label: string;
|
|
43
|
+
/** Must match `assets/recomendaciones/<jsonSlug>.json`. */
|
|
44
|
+
jsonSlug: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Single catalog of communication goals and their rules JSON.
|
|
48
|
+
* Host apps should use `CommunicationGoalsService` instead of duplicating this list.
|
|
49
|
+
*/
|
|
50
|
+
declare const COMMUNICATION_GOAL_DEFINITIONS: readonly CommunicationGoalDefinition[];
|
|
51
|
+
declare function definitionsToBaseOptions(): CommunicationGoalOption[];
|
|
52
|
+
|
|
53
|
+
declare class chartsModel {
|
|
54
|
+
data: any;
|
|
55
|
+
dataSize: string;
|
|
56
|
+
dataVariability: string;
|
|
57
|
+
suggestedGraph: string;
|
|
58
|
+
communicationGoal: number;
|
|
59
|
+
communicationGoalsOptions: {
|
|
60
|
+
index: number;
|
|
61
|
+
value: string;
|
|
62
|
+
}[];
|
|
63
|
+
/** filesOptions = [
|
|
64
|
+
{ label: 'Gasolina en ciudades', fileName: 'gasolinaCiudades' }, //muy pequeño con poca variabilidad
|
|
65
|
+
{
|
|
66
|
+
label: 'Temperatura en oficinas',
|
|
67
|
+
fileName: 'temperaturaMediaEnOficinas',
|
|
68
|
+
}, //muy pequeño con poca variabilidad
|
|
69
|
+
{
|
|
70
|
+
label: 'Ventas diarias de limonada',
|
|
71
|
+
fileName: 'ventasDiariasDeLimonada',
|
|
72
|
+
}, //muy pequeño con variabilidad media
|
|
73
|
+
{
|
|
74
|
+
label: 'Duración llamadas en call center',
|
|
75
|
+
fileName: 'duracionLlamadasCallCenter',
|
|
76
|
+
}, //muy pequeño con variabilidad alta
|
|
77
|
+
{
|
|
78
|
+
label: 'Nivel de ruido en bibliotecas',
|
|
79
|
+
fileName: 'nivelRuidoEnBibliotecas',
|
|
80
|
+
}, //pequeño con variabilidad baja
|
|
81
|
+
{
|
|
82
|
+
label: 'Consumo de agua por hogar (L/día)',
|
|
83
|
+
fileName: 'consumoAgua',
|
|
84
|
+
}, //pequeño con variabilidad media
|
|
85
|
+
{
|
|
86
|
+
label: 'Horas dedicadas al gaming semanalmente',
|
|
87
|
+
fileName: 'horasGaming',
|
|
88
|
+
}, //pequeño con variabilidad alta
|
|
89
|
+
{
|
|
90
|
+
label: 'Tiempo de carga de una app (ms)',
|
|
91
|
+
fileName: 'tiemposCarga',
|
|
92
|
+
}, //medio con variabilidad baja
|
|
93
|
+
{
|
|
94
|
+
label: 'Distancia diaria Recorrida (km)',
|
|
95
|
+
fileName: 'distanciaDiaria',
|
|
96
|
+
}, //medio con variabilidad medial
|
|
97
|
+
{
|
|
98
|
+
label: 'Ingresos semanales de freelancers',
|
|
99
|
+
fileName: 'ingresosSemanales',
|
|
100
|
+
}, //medio con variabilidad alta
|
|
101
|
+
{
|
|
102
|
+
label: 'Nivel de batería de sensores IoT',
|
|
103
|
+
fileName: 'nivelBateria',
|
|
104
|
+
}, //grande con variabilidad baja
|
|
105
|
+
{
|
|
106
|
+
label: 'Tiempo de ejercicio diario (minutos)',
|
|
107
|
+
fileName: 'tiempoEjercicio',
|
|
108
|
+
}, //grande con variabilidad medial
|
|
109
|
+
{
|
|
110
|
+
label: 'Tiempo de carga de vehículos eléctricos (min)',
|
|
111
|
+
fileName: 'tiempoCarga',
|
|
112
|
+
}, //grande con variabilidad alta
|
|
113
|
+
];*/
|
|
114
|
+
rules: ReglaVisual[];
|
|
115
|
+
generatedRules: boolean;
|
|
116
|
+
chartLabels: string[];
|
|
117
|
+
chartValues: number[];
|
|
118
|
+
orientation: 'Vertical' | 'Horizontal';
|
|
119
|
+
incrementoMaximo: number;
|
|
120
|
+
numeroPasos: number;
|
|
121
|
+
auxiliarLines: boolean;
|
|
122
|
+
opacity: number | undefined;
|
|
123
|
+
ordered: boolean;
|
|
124
|
+
labels: boolean;
|
|
125
|
+
separation: 'none' | 'close' | 'medium' | 'wide';
|
|
126
|
+
colorPalette: 'single' | 'sequential' | 'categorical';
|
|
127
|
+
borderColor: "Light border" | "Dark border" | "Same color as the bar" | "No border" | "Indifferent" | "Dark border or no border";
|
|
128
|
+
hoverRec: 'none' | 'default' | 'intensify' | 'different';
|
|
129
|
+
showingInDialog: 'data' | 'variables' | 'readme' | 'suggestions' | 'communicationGoals';
|
|
130
|
+
constructor();
|
|
131
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<chartsModel, never>;
|
|
132
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<chartsModel>;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** Normalizes en/em dashes in sample-size labels so JSON matches computed stats. */
|
|
136
|
+
declare function normalizeSampleSizeLabel(s: string | null | undefined): string;
|
|
137
|
+
interface ReglaVisual {
|
|
138
|
+
index?: number | null;
|
|
139
|
+
order?: number | null;
|
|
140
|
+
visualVariable: string | null;
|
|
141
|
+
sampleSize: string | null;
|
|
142
|
+
variability: string | null;
|
|
143
|
+
recommendation: string | null;
|
|
144
|
+
}
|
|
145
|
+
declare class CommunicationRulesService {
|
|
146
|
+
private http;
|
|
147
|
+
private readonly chartsModel;
|
|
148
|
+
private basePath;
|
|
149
|
+
constructor(http: HttpClient, chartsModel: chartsModel);
|
|
150
|
+
private loadJsonForGoal;
|
|
151
|
+
/** All rules from `assets/recomendaciones/<goal>.json` (unfiltered). */
|
|
152
|
+
getRulesForGoal(goal: string): Observable<ReglaVisual[]>;
|
|
153
|
+
/**
|
|
154
|
+
* Rules that match communication goal, sample size, and variability
|
|
155
|
+
* (sample size labels are normalized, e.g. `10–19` vs `10-19`).
|
|
156
|
+
*/
|
|
157
|
+
getRecomendaciones(goal: string, sampleSize: string, variability: string): Observable<ReglaVisual[]>;
|
|
158
|
+
getRecommendationsCount(goal: string): Observable<number>;
|
|
159
|
+
getCountsForGoals(goals: string[]): Observable<Record<string, number>>;
|
|
160
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CommunicationRulesService, never>;
|
|
161
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<CommunicationRulesService>;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
declare class DataSuggestionsService {
|
|
165
|
+
private readonly rulesService;
|
|
166
|
+
constructor(rulesService: CommunicationRulesService);
|
|
167
|
+
analyze(dataset: DataPoint[], goal: string): Observable<SuggestionsResult>;
|
|
168
|
+
private analyzBestGraph;
|
|
169
|
+
private computeStats;
|
|
170
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DataSuggestionsService, never>;
|
|
171
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<DataSuggestionsService>;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Facade for host apps: goal catalog, rule counts, raw/filtered rules, and full suggestions
|
|
176
|
+
* (same pipeline as `data-suggestions-table`).
|
|
177
|
+
*/
|
|
178
|
+
declare class CommunicationGoalsService {
|
|
179
|
+
private readonly rulesService;
|
|
180
|
+
private readonly suggestionsService;
|
|
181
|
+
constructor(rulesService: CommunicationRulesService, suggestionsService: DataSuggestionsService);
|
|
182
|
+
/** Goal definitions (index, label, JSON slug). */
|
|
183
|
+
getDefinitions(): readonly data_suggestions.CommunicationGoalDefinition[];
|
|
184
|
+
/** Dropdown options without HTTP (label in `value`, slug in `json`). */
|
|
185
|
+
getBaseOptions(): CommunicationGoalOption[];
|
|
186
|
+
/** Same options with `(n)` rule count per JSON file. */
|
|
187
|
+
loadOptionsWithRuleCounts(): Observable<CommunicationGoalOption[]>;
|
|
188
|
+
/** Full rules array from `assets/recomendaciones/<goalSlug>.json`. */
|
|
189
|
+
getRulesForGoal(goalSlug: CommunicationGoalSlug): Observable<ReglaVisual[]>;
|
|
190
|
+
/** Rules filtered by sample size and variability (for custom UIs). */
|
|
191
|
+
getRecommendations(goalSlug: CommunicationGoalSlug, sampleSize: string, variability: string): Observable<ReglaVisual[]>;
|
|
192
|
+
/** Dataset stats + ordered suggestion rows (table / chart binding). */
|
|
193
|
+
getSuggestionsResult(dataset: DataPoint[], goalSlug: CommunicationGoalSlug): Observable<SuggestionsResult>;
|
|
194
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CommunicationGoalsService, never>;
|
|
195
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<CommunicationGoalsService>;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
declare class DataSuggestionsTableComponent implements OnChanges {
|
|
199
|
+
private readonly svc;
|
|
200
|
+
readonly chartModel: chartsModel;
|
|
201
|
+
dataset: DataPoint[];
|
|
202
|
+
goal: string;
|
|
203
|
+
result$: Observable<SuggestionsResult | null>;
|
|
204
|
+
private readonly destroy$;
|
|
205
|
+
showGraph: boolean;
|
|
206
|
+
showJsonInfoDialog: boolean;
|
|
207
|
+
jsonExample: string;
|
|
208
|
+
jsonExample1: string;
|
|
209
|
+
jsonExample2: string;
|
|
210
|
+
jsonExample3: string;
|
|
211
|
+
jsonExample4: string;
|
|
212
|
+
resultsLength: number;
|
|
213
|
+
communicationGoalsServiceExample: string;
|
|
214
|
+
communicationGoalsResponseExample: string;
|
|
215
|
+
communicationGoalUsageExample: string;
|
|
216
|
+
constructor(svc: DataSuggestionsService, chartModel: chartsModel);
|
|
217
|
+
ngOnChanges(): void;
|
|
218
|
+
obtainKeysAndValues(): void;
|
|
219
|
+
private normalizeDataset;
|
|
220
|
+
private setChartOptions;
|
|
221
|
+
private calculateAxisStepByPercentage;
|
|
222
|
+
private normalizeSpacingRecommendation;
|
|
223
|
+
private normalizeColorMode;
|
|
224
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DataSuggestionsTableComponent, never>;
|
|
225
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<DataSuggestionsTableComponent, "data-suggestions-table", never, { "dataset": { "alias": "dataset"; "required": true; }; "goal": { "alias": "goal"; "required": true; }; }, {}, never, never, true, never>;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
declare class DataSuggestionsBarChartComponent implements AfterViewInit, OnChanges, OnDestroy {
|
|
229
|
+
canvas: ElementRef<HTMLCanvasElement>;
|
|
230
|
+
title: string;
|
|
231
|
+
labels: string[];
|
|
232
|
+
values: number[];
|
|
233
|
+
orientation: 'Vertical' | 'Horizontal';
|
|
234
|
+
maxValue: number;
|
|
235
|
+
stepNumber: number;
|
|
236
|
+
auxiliarLines: boolean;
|
|
237
|
+
opacity: number | undefined;
|
|
238
|
+
sortAscending: boolean;
|
|
239
|
+
showLabels: boolean;
|
|
240
|
+
colorPalette: 'single' | 'sequential' | 'categorical';
|
|
241
|
+
barDistance: 'none' | 'close' | 'medium' | 'wide';
|
|
242
|
+
barBorderRecommendation: string;
|
|
243
|
+
hover: 'none' | 'default' | 'intensify' | 'different';
|
|
244
|
+
heightPx: number;
|
|
245
|
+
minHeightPx: number;
|
|
246
|
+
maxHeightPx: number;
|
|
247
|
+
minWidthPx: number;
|
|
248
|
+
maxWidthPx: number;
|
|
249
|
+
barSizePx: number;
|
|
250
|
+
chartHeightPx: number;
|
|
251
|
+
chartWidthPx: number;
|
|
252
|
+
private chart?;
|
|
253
|
+
constructor();
|
|
254
|
+
ngAfterViewInit(): void;
|
|
255
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
256
|
+
ngOnDestroy(): void;
|
|
257
|
+
private render;
|
|
258
|
+
private getBarSpacingConfig;
|
|
259
|
+
private getBarColors;
|
|
260
|
+
private getRandomColors;
|
|
261
|
+
private getSequentialColors;
|
|
262
|
+
private getSingleColor;
|
|
263
|
+
private getBorderColors;
|
|
264
|
+
private intensifyRgbaColor;
|
|
265
|
+
private getDifferentHoverColor;
|
|
266
|
+
private getHoverBackgroundColor;
|
|
267
|
+
private getHoverBorderColor;
|
|
268
|
+
private updateChartSize;
|
|
269
|
+
private clamp;
|
|
270
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DataSuggestionsBarChartComponent, never>;
|
|
271
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<DataSuggestionsBarChartComponent, "lib-data-suggestions-bar-chart", never, { "title": { "alias": "title"; "required": false; }; "labels": { "alias": "labels"; "required": false; }; "values": { "alias": "values"; "required": false; }; "orientation": { "alias": "orientation"; "required": false; }; "maxValue": { "alias": "maxValue"; "required": false; }; "stepNumber": { "alias": "stepNumber"; "required": false; }; "auxiliarLines": { "alias": "auxiliarLines"; "required": false; }; "opacity": { "alias": "opacity"; "required": false; }; "sortAscending": { "alias": "sortAscending"; "required": false; }; "showLabels": { "alias": "showLabels"; "required": false; }; "colorPalette": { "alias": "colorPalette"; "required": false; }; "barDistance": { "alias": "barDistance"; "required": false; }; "barBorderRecommendation": { "alias": "barBorderRecommendation"; "required": false; }; "hover": { "alias": "hover"; "required": false; }; "heightPx": { "alias": "heightPx"; "required": false; }; "minHeightPx": { "alias": "minHeightPx"; "required": false; }; "maxHeightPx": { "alias": "maxHeightPx"; "required": false; }; "minWidthPx": { "alias": "minWidthPx"; "required": false; }; "maxWidthPx": { "alias": "maxWidthPx"; "required": false; }; "barSizePx": { "alias": "barSizePx"; "required": false; }; }, {}, never, never, true, never>;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
export { COMMUNICATION_GOAL_DEFINITIONS, CommunicationGoalsService, CommunicationRulesService, DataSuggestionsBarChartComponent, DataSuggestionsService, DataSuggestionsTableComponent, VISUAL_VARIABLE_INDEX_BY_NAME, definitionsToBaseOptions, getConfiguredVisualVariableIndex, normalizeSampleSizeLabel };
|
|
275
|
+
export type { CommunicationGoalDefinition, CommunicationGoalOption, CommunicationGoalSlug, DataPoint, ReglaVisual, SuggestionRow, SuggestionsResult };
|
package/package.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "data-suggestions",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@angular/common": "^20.3.0",
|
|
6
|
+
"@angular/core": "^20.3.0",
|
|
7
|
+
"rxjs": "^7.8.0"
|
|
8
|
+
},
|
|
9
|
+
"dependencies": {
|
|
10
|
+
"tslib": "^2.3.0"
|
|
11
|
+
},
|
|
12
|
+
"sideEffects": false,
|
|
13
|
+
"module": "fesm2022/data-suggestions.mjs",
|
|
14
|
+
"typings": "index.d.ts",
|
|
15
|
+
"exports": {
|
|
16
|
+
"./package.json": {
|
|
17
|
+
"default": "./package.json"
|
|
18
|
+
},
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./index.d.ts",
|
|
21
|
+
"default": "./fesm2022/data-suggestions.mjs"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|