Skip to content

Commit d6d23b0

Browse files
🎉 (admin) edit focused entities/columns
1 parent b8ae802 commit d6d23b0

File tree

3 files changed

+98
-1
lines changed

3 files changed

+98
-1
lines changed

adminSiteClient/EditorDataTab.tsx

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
import React from "react"
2-
import { moveArrayItemToIndex, omit } from "@ourworldindata/utils"
2+
import {
3+
differenceOfSets,
4+
moveArrayItemToIndex,
5+
omit,
6+
} from "@ourworldindata/utils"
37
import { computed, action, observable } from "mobx"
48
import { observer } from "mobx-react"
59
import {
610
EntitySelectionMode,
711
MissingDataStrategy,
812
EntityName,
13+
SeriesName,
914
} from "@ourworldindata/types"
1015
import { Grapher } from "@ourworldindata/grapher"
1116
import { ColorBox, SelectField, Section, FieldsRow } from "./Forms.js"
@@ -30,6 +35,11 @@ interface EntityItemProps extends React.HTMLProps<HTMLDivElement> {
3035
onRemove?: () => void
3136
}
3237

38+
interface SeriesItemProps extends React.HTMLProps<HTMLDivElement> {
39+
seriesName: SeriesName
40+
onRemove?: () => void
41+
}
42+
3343
@observer
3444
class EntityItem extends React.Component<EntityItemProps> {
3545
@observable.ref isChoosingColor: boolean = false
@@ -88,6 +98,32 @@ class EntityItem extends React.Component<EntityItemProps> {
8898
}
8999
}
90100

101+
@observer
102+
class SeriesItem extends React.Component<SeriesItemProps> {
103+
@action.bound onRemove() {
104+
this.props.onRemove?.()
105+
}
106+
107+
render() {
108+
const { props } = this
109+
const { seriesName } = props
110+
const rest = omit(props, ["seriesName", "onRemove"])
111+
112+
return (
113+
<div
114+
className="list-group-item EditableListItem"
115+
key={seriesName}
116+
{...rest}
117+
>
118+
<div>{seriesName}</div>
119+
<div className="clickable" onClick={this.onRemove}>
120+
<FontAwesomeIcon icon={faTimes} />
121+
</div>
122+
</div>
123+
)
124+
}
125+
}
126+
91127
@observer
92128
export class KeysSection extends React.Component<{
93129
editor: AbstractChartEditor
@@ -216,6 +252,58 @@ export class KeysSection extends React.Component<{
216252
}
217253
}
218254

255+
@observer
256+
export class FocusSection extends React.Component<{
257+
editor: AbstractChartEditor
258+
}> {
259+
@computed get editor() {
260+
return this.props.editor
261+
}
262+
263+
@action.bound onFocusSeries(seriesName: SeriesName) {
264+
this.editor.grapher.focusArray.activate(seriesName)
265+
}
266+
267+
render() {
268+
const { editor } = this
269+
const { grapher } = editor
270+
271+
const seriesNameSet = new Set(grapher.chartSeriesNames)
272+
const focusedSeriesNameSet = grapher.focusArray.activeSeriesNameSet
273+
const availableSeriesNameSet = differenceOfSets<string>([
274+
seriesNameSet,
275+
focusedSeriesNameSet,
276+
])
277+
278+
const availableSeriesNames: SeriesName[] = Array.from(
279+
availableSeriesNameSet
280+
)
281+
const focusedSeriesNames: SeriesName[] =
282+
Array.from(focusedSeriesNameSet)
283+
284+
return (
285+
<Section name="Data to highlight">
286+
<FieldsRow>
287+
<SelectField
288+
onValue={this.onFocusSeries}
289+
value="Select data"
290+
options={["Select data"]
291+
.concat(availableSeriesNames)
292+
.map((key) => ({ value: key }))}
293+
/>
294+
</FieldsRow>
295+
{focusedSeriesNames.map((seriesName) => (
296+
<SeriesItem
297+
key={seriesName}
298+
seriesName={seriesName}
299+
onRemove={() => grapher.focusArray.toggle(seriesName)}
300+
/>
301+
))}
302+
</Section>
303+
)
304+
}
305+
}
306+
219307
@observer
220308
class MissingDataSection<
221309
Editor extends AbstractChartEditor,
@@ -332,6 +420,7 @@ export class EditorDataTab<
332420
</div>
333421
</Section>
334422
<KeysSection editor={editor} />
423+
<FocusSection editor={editor} />
335424
{features.canSpecifyMissingDataStrategy && (
336425
<MissingDataSection editor={this.props.editor} />
337426
)}

packages/@ourworldindata/grapher/src/core/Grapher.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -875,6 +875,10 @@ export class Grapher
875875
return new ChartClass({ manager: this })
876876
}
877877

878+
@computed get chartSeriesNames(): SeriesName[] {
879+
return this.chartInstance.series.map((series) => series.seriesName)
880+
}
881+
878882
@computed get table(): OwidTable {
879883
return this.tableAfterAuthorTimelineFilter
880884
}

packages/@ourworldindata/grapher/src/selection/InteractionArray.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ export class InteractionArray {
1212

1313
@observable private activeSet: Set<SeriesName>
1414

15+
@computed get activeSeriesNameSet(): Set<SeriesName> {
16+
return this.activeSet
17+
}
18+
1519
@computed get activeSeriesNames(): SeriesName[] {
1620
return Array.from(this.activeSet)
1721
}

0 commit comments

Comments
 (0)