heatmapViewModels: getPerPanelMap()

in packages/charts/src/chart_types/heatmap/layout/viewmodel/viewmodel.ts [495:598]


    heatmapViewModels: getPerPanelMap(smScales, (anchor, h, v) => {
      const primaryColumn = smScales.vertical.domain[0] === v;
      const primaryRow = smScales.horizontal.domain[0] === h;
      const lastColumn = smScales.vertical.domain.at(-1) === v;

      const titles: HeatmapTitleConfig[] = [];
      // TODO this should be filtered by the pageSize AND the pageNumber
      const cells = [...(panelCellMap.get(getPanelKey(h, v))?.values() ?? [])];

      if (primaryColumn && primaryRow) {
        if (spec.xAxisTitle) {
          const axisPanelTitleHeight =
            groupBySpec.horizontal && axisPanelTitle.visible
              ? axisPanelTitle.fontSize + innerPad(axisPanelTitle.padding) / 2
              : 0;

          titles.push({
            origin: {
              x: chartDimensions.width / 2,
              y:
                chartDimensions.top +
                chartDimensions.height +
                elementSizes.xAxis.height +
                axisPanelTitleHeight +
                innerPad(axisTitle.padding) / 2 +
                axisTitle.fontSize / 2 -
                chartPaddings.top +
                chartPaddings.bottom -
                chartMargins.top,
            },
            ...axisTitleFont,
            text: spec.xAxisTitle,
            rotation: 0,
          });
        }

        if (spec.yAxisTitle) {
          titles.push({
            origin: {
              x: -chartDimensions.left + axisTitle.fontSize / 2 + chartMargins.left,
              y: chartDimensions.top + chartDimensions.height / 2 - chartMargins.top - chartPaddings.top,
            },
            ...axisTitleFont,
            text: spec.yAxisTitle,
            rotation: -90,
          });
        }
      }

      if (primaryColumn && groupBySpec.horizontal) {
        titles.push({
          origin: {
            x: panelSize.width / 2,
            y:
              chartDimensions.top +
              chartDimensions.height +
              elementSizes.xAxis.height +
              innerPad(axisPanelTitle.padding) +
              axisPanelTitle.fontSize / 2 -
              chartPaddings.top +
              chartPaddings.bottom -
              chartMargins.top,
          },
          ...axisPanelTitleFont,
          text: getPanelTitle(false, v, h, groupBySpec),
          rotation: 0,
        });
      }

      if (primaryRow && groupBySpec.vertical) {
        const axisTitleWidth = axisTitle.visible ? axisTitle.fontSize + innerPad(axisTitle.padding) : 0;
        titles.push({
          origin: {
            x: -chartDimensions.left + axisTitleWidth + axisPanelTitle.fontSize / 2 + chartMargins.left,
            y: chartDimensions.top + panelSize.height / 2 - chartMargins.top - chartPaddings.top,
          },
          ...axisPanelTitleFont,
          text: getPanelTitle(true, v, h, groupBySpec),
          rotation: -90,
        });
      }

      return {
        anchor,
        panelSize,
        gridOrigin: {
          x: anchor.x + chartDimensions.left,
          y: anchor.y + chartDimensions.top,
        },
        gridLines: {
          x: xLines,
          y: yLines,
          stroke: {
            color: colorToRgba(heatmapTheme.grid.stroke.color),
            width: gridStrokeWidth,
          },
        },
        cells,
        cellFontSize: (cell: Cell) => (heatmapTheme.cell.label.useGlobalMinFontSize ? tableMinFontSize : cell.fontSize),
        xValues: lastColumn ? textXValues : [],
        yValues: primaryRow ? textYValues : [],
        titles,
      };
    }),