apexcharts/apexcharts.js

Supporting TypeScript #24

taheri24 posted onGitHub

apex-charts is really great , but I unable found to declaration file to easier development.


I'm waiting for @types/apexcharts to come out, but here is a temporary solution

export interface ApexOptions {
  chart: {
    width?: string | number;
    height?: string | number;
    type: string;
    foreColor?: string;
  };
  plotOptions?: {
    radialBar?: {
      offsetY?: number;
      startAngle?: number;
      endAngle?: number;
      hollow?: {
        margin: number;
        size: string;
        background: string;
        image: string | undefined,
      },
      track?: {
        show: boolean
      },
      dataLabels?: {
        showOn?: string;
        name?: {
          show: boolean,

        },
        value?: {
          show: boolean,
        }
      }
    };
    circle?: {
      track?: {
        show: boolean
      },
      dataLabels: {
        showOn?: string;
        name?: {
          show: boolean,
        },
        value?: {
          show: boolean,
        }
      }
    };
    pie?: {
      size?: undefined,
      donut?: {
        size?: string;
        background?: string;
      },
      customScale?: number;
      offsetX?: number;
      offsetY?: number;
      dataLabels?: {
        offset?: number;
      }
    }
  };
  colors?: string[];
  series: number[];
  labels?: string[];
  legend?: {
    show?: boolean;
    floating?: boolean;
    fontSize?: string;
    position?: string;
    verticalAlign?: string;
    textAnchor?: string;
    labels?: {
      useSeriesColors: boolean
    };
    markers?: {
      size: number
    };
    formatter?: Function;
    itemMargin?: {
      vertical: number;
    };
    containerMargin?: {
      left: number;
      top: number;
    }
  };
}
posted by jimfilippou over 6 years ago

@junedchhipa I could help with this. We definitely need typescript support to be able to create angular bindings.

posted by sandangel over 6 years ago

Hey guys, I've extended a bit the interface kindly posted by @jimfilippou , however I am still unsure about which are the required fields. Hope it helps!

export enum ChartHorizontalAlign {
  left = 'left',
  center = 'center',
  right = 'right'
}

export enum ChartVerticalAlign {
  top = 'top',
  middle = 'middle',
  bottom = 'bottom'
}

export enum ChartTypes {
  line = 'line',
  area = 'area',
  bar = 'bar',
  histogram = 'histogram',
  pie = 'pie',
  donut = 'donut',
  radialBar = 'radialBar',
  scatter = 'scatter',
  bubble = 'bubble',
  heatmap = 'heatmap'
}

export enum ChartShape {
  circle = 'circle',
  square = 'square'
}

export enum ChartPosition {
  top = 'top',
  right = 'right',
  bottom = 'bottom',
  left = 'left'
}

export enum ChartCurve {
  smooth = 'smooth',
  straight = 'straight'
}

export interface ChartLegend {
  show?: true;
  position?: ChartPosition;
  horizontalAlign?: ChartHorizontalAlign;
  verticalAlign?: ChartVerticalAlign;
  floating?: boolean;
  fontSize?: string;
  offsetX?: number;
  offsetY?: number;
  formatter?: any;
  textAnchor?: string;
  labels?: {
      foreColor?: string;
      useSeriesColors?: boolean;
  };
  markers?: {
      size?: number;
      strokeColor?: string;
      strokeWidth?: number;
      offsetX?: number;
      offsetY?: number;
      radius?: number;
      shape?: ChartShape;
  };
  itemMargin?: {
      horizontal?: number;
      vertical?: number
  };
  containerMargin?: {
      left?: number;
      top?: number;
  };
  onItemClick?: {
      toggleDataSeries?: boolean;
  };
  onItemHover?: {
      highlightDataSeries?: boolean;
  };
}

export interface ChartConfig {
  height?: number;
  type?: ChartTypes;
  shadow?: {
      enabled?: boolean;
      color?: string;
      top?: number;
      left?: number;
      blur?: number;
      opacity?: number
  };
  zoom?: {
      enabled?: boolean
  };
}

export interface ChartSerie {
  name?: string;
  data?: number[];
}

export interface ChartRow {
  colors?: string[];
  opacity?: number;
}

export interface Chart {
  chart?: ChartConfig;
  colors?: string[];
  stroke?: {
      curve?: ChartCurve;
  };
  series?: ChartSerie[];
  title?: {
      text?: string;
      align?: ChartHorizontalAlign;
  };
  grid?: {
      borderColor?: string;
      row?: ChartRow;
  };
  markers?: {
    size?: number;
    colors?: string[];
    strokeColor?: string;
    strokeWidth?: number;
    strokeOpacity?: number;
    fillOpacity?: number;
    shape?: ChartShape;
    radius?: number;
    offsetX?: number;
    offsetY?: number;
    hover?: {
      size?: number
    }
  };
  xaxis?: {
      categories?: string[];
      title?: {
          text?: string;
      }
  };
  yaxis?: {
      title?: {
          text?: string;
      };
      min?: number;
      max?: number;
  };
  legend?: ChartLegend;
}
posted by e4r over 6 years ago

thanks everyone, I'm gathering all of these and hopefully could send a draft PR to @types repo today or tomorrow.

posted by sandangel over 6 years ago

Hi everyone finally I have a few hours working on this. Options are copied from the options refs on docs page, then converted to json when pasting the js object to a json file and run prettier. then I used json to ts vscode extension to convert json to ts typings.

quick note: I used type instead of interface so when you hover the type in vscode, it will show the literal typings instead of the type name.

Still a WIP, hope I could find sometimes work on it tomorrow or next week.

https://github.com/DefinitelyTyped/DefinitelyTyped/pull/28733

posted by sandangel over 6 years ago

@boostio funded this issue with $30. Visit this issue on Issuehunt

posted by IssueHuntBot over 6 years ago

@sandangel has started working. Visit this issue on Issuehunt

posted by IssueHuntBot over 6 years ago

I think it is simpler to embed types directly in the repository instead of publishing them to the @types organisation. See: https://www.typescriptlang.org/docs/handbook/declaration-files/publishing.html . As an example, Vue.js does it like this, with an entry in the package.json file and a types directory. Doing it this way allow types to always track the source code.

posted by cstlaurent over 6 years ago

@cstlaurent brilliant, thanks!

posted by jimfilippou over 6 years ago

@cstlaurent Good to know. I was worried about how the types will be synced with the core options.

If anyone finishes the first version of the types, I'm happy to accept a PR

posted by junedchhipa over 6 years ago

@junedchhipa the only way i see is to (slowly and carefully) port the whole project to Typescript.

The first and simplest thing you can do is to rename *.js to *.ts, then configure the build settings in webpack.config.js . After that every compilation error was fixed (...i'm sure you will have to), you can try to implement that interface from @e4r and only when everything is working, again, we will get the typings implicitly (using just compilation options).

In my opinion, you should not accept any PR with just the typings...because the risk to unsync the options is too high.

You should consider the Typescript porting a big improvement, not only for typings, but for every future implementation.

posted by Micene09 over 6 years ago

@Micene09 I agree that Typescript comes with a lot of advantages, but porting the whole project from JS to TS will be extremely tedious if not challenging looking at the size of the current codebase.

I have got some more contributions in the typings and I will publish soon directly in the repository. Thanks for the suggestion.

posted by junedchhipa over 6 years ago

amazing thanks @junedchhipa! anything else we can do to help this?

posted by katiesandford over 6 years ago

@katiesandford Sure, maybe you can validate the typescript declarations to make sure they work correctly?

posted by junedchhipa over 6 years ago

I have added the initial typescript declarations which cover most of the options. If anyone finds anything missing or not in sync with the options listed here - https://apexcharts.com/docs/options/ feel free to add them

posted by junedchhipa over 6 years ago

Hi All, Thanks for great work here. react-apexcharts is an amazing library and hope it will support typescript soon.

posted by baoduy about 6 years ago

@rororofff has funded $2.00 to this issue.


posted by IssueHuntBot almost 6 years ago

react-apexcharts, as well as vue-apexcharts, also has their own types. Thanks to all the people who contributed to the typescript support for ApexCharts.

posted by junedchhipa almost 6 years ago

Fund this Issue

$32.00
Funded
Only logged in users can fund an issue

Pull requests

Recent activities

rororofff funded 2.00 for apexcharts/apexcharts.js# 24
almost 6 years ago
boostio funded 30.00 for apexcharts/apexcharts.js# 24
over 6 years ago