Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Apply className to the RadarChart component. #4333

Closed
1 task done
108yen opened this issue Mar 22, 2024 · 2 comments
Closed
1 task done

Apply className to the RadarChart component. #4333

108yen opened this issue Mar 22, 2024 · 2 comments

Comments

@108yen
Copy link
Contributor

108yen commented Mar 22, 2024

  • I have searched the issues of this repository and believe that this is not a duplicate.

What problem does this feature solve?

It would be possible to style each component with className.

What does the proposed API look like?

I want to apply a className to a RadarChart component, as in the following example

  • grid-concentric
  • PolarAngleAxis and tick
  • PolarRadiusAxis and tick
  • dot
      <RadarChart width={600} height={300} data={data} margin={{ top: 5, right: 30, left: 20, bottom: 5 }}>
        <PolarGrid className="polar-grid-custom-className" />
        <PolarRadiusAxis
          angle={90}
          type="number"
          className="polar-radius-axis-custom-className"
          tick={{ className: 'polar-radius-axis-tick-custom-className' }}
        />
        <PolarAngleAxis
          dataKey="angle"
          type="number"
          domain={[0, 360]}
          tickCount={9}
          className="polar-angle-axis-custom-className"
          tick={{ className: 'polar-angle-axis-tick-custom-className' }}
        />
        <Radar dataKey="value" fillOpacity={0} stroke="#000" dot={{ className: 'radar-custom-className' }} />
      </RadarChart>

If it is acceptable to modify it, I will fix it.
PolarGrid.tsx

const ConcentricCircle: React.FC<ConcentricProps> = props => {
...
  return (
    <circle
      {...concentricCircleProps}
-      className="recharts-polar-grid-concentric-circle"
+      className={clsx('recharts-polar-grid-concentric-circle', props.className)}
      key={`circle-${index}`}
      cx={cx}
      cy={cy}
      r={radius}
    />
  );
};

// Draw concentric polygons
const ConcentricPolygon: React.FC<ConcentricProps> = props => {
...
  return (
    <path
      {...concentricPolygonProps}
-      className="recharts-polar-grid-concentric-polygon"
+      className={clsx('recharts-polar-grid-concentric-polygon', props.className)}
      key={`path-${index}`}
      d={getPolygonPath(radius, props.cx, props.cy, props.polarAngles)}
    />
  );
};

PolarRadiusAxis.tsx

  renderTicks() {
...
      return (
        <Layer
-          className="recharts-polar-radius-axis-tick"
+          className={clsx('recharts-polar-radius-axis-tick', get(tick, 'className'))}
          key={`tick-${entry.coordinate}`}
          {...adaptEventsOfChild(this.props, entry, i)}
        >
          {PolarRadiusAxis.renderTickItem(tick, tickProps, tickFormatter ? tickFormatter(entry.value, i) : entry.value)}
        </Layer>
      );
    });

    return <Layer className="recharts-polar-radius-axis-ticks">{items}</Layer>;
  }
...
  render() {
    const { ticks, axisLine, tick } = this.props;

    if (!ticks || !ticks.length) {
      return null;
    }

    return (
-      <Layer className="recharts-polar-radius-axis">
+      <Layer className={clsx('recharts-polar-radius-axis', this.props.className)}>
        {axisLine && this.renderAxisLine()}
        {tick && this.renderTicks()}
        {Label.renderCallByParent(this.props, this.getViewBox())}
      </Layer>
    );
  }

PolarAngleAxis.tsx

  renderTicks() {
...
      return (
        <Layer
-          className="recharts-polar-angle-axis-tick"
+          className={clsx('recharts-polar-angle-axis-tick', get(tick, 'className'))}
          key={`tick-${entry.coordinate}`}
          {...adaptEventsOfChild(this.props, entry, i)}
        >
          {tickLine && <line className="recharts-polar-angle-axis-tick-line" {...tickLineProps} {...lineCoord} />}
          {tick &&
            PolarAngleAxis.renderTickItem(tick, tickProps, tickFormatter ? tickFormatter(entry.value, i) : entry.value)}
        </Layer>
      );
    });

    return <Layer className="recharts-polar-angle-axis-ticks">{items}</Layer>;
  }
...
  render() {
    const { ticks, radius, axisLine } = this.props;

    if (radius <= 0 || !ticks || !ticks.length) {
      return null;
    }

    return (
-      <Layer className="recharts-polar-angle-axis"
+      <Layer className={clsx('recharts-polar-angle-axis', this.props.className)}>
        {axisLine && this.renderAxisLine()}
        {this.renderTicks()}
      </Layer>
    );
  }

generateCategoricalChart.tsx

    renderPolarAxis = (element: any, displayName: string, index: number) => {
      const axisType = get(element, 'type.axisType');
      const axisMap = get(this.state, `${axisType}Map`);
      const axisOption: BaseAxisProps | undefined = axisMap && axisMap[element.props[`${axisType}Id`]];

      return cloneElement(element, {
        ...axisOption,
-        className: axisType,
+        className: clsx(axisType, axisOption.className),
        key: element.key || `${displayName}-${index}`,
        ticks: getTicksOfAxis(axisOption, true),
      });
    };

Radar.tsx

  static renderDotItem(option: RadarDot, props: any) {
    let dotItem;

    if (React.isValidElement(option)) {
      dotItem = React.cloneElement(option, props);
    } else if (isFunction(option)) {
      dotItem = option(props);
    } else {
-      dotItem = <Dot {...props} className="recharts-radar-dot" />;
+      dotItem = (
+        <Dot {...props} className={clsx('recharts-radar-dot', typeof option !== 'boolean' ? option.className : '')} />
+      );
    }

    return dotItem;
  }
@ckifer
Copy link
Member

ckifer commented Mar 22, 2024

Feel free to PR! Thank you

ckifer pushed a commit that referenced this issue Mar 24, 2024
…4335)

<!--- Provide a general summary of your changes in the Title above -->

## Description

<!--- Describe your changes in detail -->
apply `className` to the `RadarChart` component

## Related Issue

<!--- This project only accepts pull requests related to open issues -->
<!--- If suggesting a new feature or change, please discuss it in an
issue first -->
<!--- If fixing a bug, there should be an issue describing it with steps
to reproduce -->
<!--- Please link to the issue here: -->
#4333 

## Motivation and Context

<!--- Why is this change required? What problem does it solve? -->
Required if you want to assign `className` to the `RadarChart`
component.

## How Has This Been Tested?

<!--- Please describe in detail how you tested your changes. -->
<!--- Include details of your testing environment, and the tests you ran
to -->
<!--- see how your change affects other areas of the code, etc. -->
Checked in storybook and passed existing tests.

## Screenshots (if appropriate):

## Types of changes

<!--- What types of changes does your code introduce? Put an `x` in all
the boxes that apply: -->

- [ ] Bug fix (non-breaking change which fixes an issue)
- [x] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to change)

## Checklist:

<!--- Go over all the following points, and put an `x` in all the boxes
that apply. -->
<!--- If you're unsure about any of these, don't hesitate to ask. We're
here to help! -->

- [ ] My change requires a change to the documentation.
- [ ] I have updated the documentation accordingly.
- [ ] I have added tests to cover my changes.
- [ ] I have added a storybook story or extended an existing story to
show my changes
@ckifer
Copy link
Member

ckifer commented Mar 25, 2024

resolved in linked PRs

@ckifer ckifer closed this as completed Mar 25, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants