All files / owid-grapher/grapher/spreadsheet Spreadsheet.stories.tsx

94.69% Statements 107/113
100% Branches 6/6
66.67% Functions 6/9
94.69% Lines 107/113

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 841x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x     1x 1x 1x 1x 1x 1x     1x 1x 1x 1x 1x 1x 1x 1x     1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x
import * as React from "react"
import {
    SampleColumnSlugs,
    SynthesizeGDPTable,
} from "../../coreTable/OwidTableSynthesizers"
import { Spreadsheet } from "./Spreadsheet"
import { action, computed, observable } from "mobx"
import { observer } from "mobx-react"
import { Bounds } from "../../clientUtils/Bounds"
import { ChartTypeName } from "../core/GrapherConstants"
import {
    ChartComponentClassMap,
    DefaultChartClass,
} from "../chart/ChartTypeMap"
import { OwidTableSlugs } from "../../coreTable/OwidTableConstants"
import { ChartTypeSwitcher } from "../chart/ChartTypeSwitcher"
import { OwidTable } from "../../coreTable/OwidTable"
 
export default {
    title: "Spreadsheet",
    component: Spreadsheet,
}
 
const getRandomTable = (): OwidTable =>
    SynthesizeGDPTable({
        entityCount: 2,
        timeRange: [2020, 2024],
    })
        .dropColumns([
            SampleColumnSlugs.GDP,
            SampleColumnSlugs.Population,
            OwidTableSlugs.entityCode,
            OwidTableSlugs.entityId,
        ])
        .sortColumns([OwidTableSlugs.entityName, OwidTableSlugs.year])
 
@observer
class Editor extends React.Component {
    @observable.ref table = getRandomTable()
 
    @action.bound private shuffleTable(): void {
        this.table = getRandomTable()
    }
 
    @computed get yColumnSlugs(): string[] {
        return this.table.suggestedYColumnSlugs
    }
 
    @computed get xColumnSlug(): string {
        return this.table.timeColumn?.slug
    }
 
    @observable chartTypeName = ChartTypeName.LineChart
 
    @computed get selection(): any[] {
        return this.table.availableEntityNames
    }
 
    @action.bound private changeChartType(type: ChartTypeName): void {
        this.chartTypeName = type
    }
 
    render(): JSX.Element {
        const ChartClass =
            ChartComponentClassMap.get(this.chartTypeName) ?? DefaultChartClass
 
        return (
            <div>
                <Spreadsheet manager={this} />
                <svg width={400} height={300}>
                    <ChartClass
                        manager={this}
                        bounds={new Bounds(0, 0, 400, 300)}
                    />
                </svg>
                <button onClick={this.shuffleTable}>Shuffle</button>
                <ChartTypeSwitcher onChange={this.changeChartType} />
            </div>
        )
    }
}
 
export const Default = (): JSX.Element => <Editor />