@amcharts/amcharts5
Version:
amCharts 5
88 lines • 3.23 kB
JavaScript
import { HierarchyDefaultTheme } from "./HierarchyDefaultTheme";
import { Container } from "../../core/render/Container";
import { Label } from "../../core/render/Label";
import { RoundedRectangle } from "../../core/render/RoundedRectangle";
import { Template } from "../../core/util/Template";
import { ListTemplate } from "../../core/util/List";
import * as $utils from "../../core/util/Utils";
/**
* Creates a breadcrumb navigation control.
*
* @see {@link https://www.amcharts.com/docs/v5/charts/hierarchy/breadcrumbs/} for more info
* @important
*/
export class BreadcrumbBar extends Container {
constructor() {
super(...arguments);
/**
* A list of labels in the bar.
*
* `labels.template` can be used to configure label apperance and behavior.
*
* @default new ListTemplate<Label>
*/
this.labels = this.addDisposer(new ListTemplate(Template.new({}), () => Label._new(this._root, {
themeTags: $utils.mergeTags(this.labels.template.get("themeTags", []), ["label"]),
background: RoundedRectangle.new(this._root, {
themeTags: ["background"]
})
}, [this.labels.template])));
}
/**
* @ignore
*/
makeLabel(dataItem) {
const label = this.labels.make();
label._setDataItem(dataItem);
label.states.create("hover", {});
label.states.create("down", {});
label.events.on("click", () => {
const series = this.get("series");
if (series) {
series.selectDataItem(dataItem);
}
});
this.labels.push(label);
return label;
}
_afterNew() {
this._defaultThemes.push(HierarchyDefaultTheme.new(this._root));
this._settings.themeTags = $utils.mergeTags(this._settings.themeTags, ["breadcrumb"]);
super._afterNew();
}
_changed() {
super._changed();
if (this.isDirty("series")) {
if (this._disposer) {
this._disposer.dispose();
this._disposer = undefined;
}
const series = this.get("series");
if (series) {
this._disposer = series.events.on("dataitemselected", (event) => {
this._handleDataItem(event.dataItem);
});
this._handleDataItem(series.get("selectedDataItem"));
}
}
}
_handleDataItem(dataItem) {
this._setC("minHeight", this.height());
this.children.clear();
this.labels.clear();
if (dataItem) {
let parent = dataItem;
while (parent) {
let label = this.makeLabel(parent);
if (parent == dataItem) {
label.addTag("last");
}
this.children.moveValue(label, 0);
parent = parent.get("parent");
}
}
}
}
BreadcrumbBar.className = "BreadcrumbBar";
BreadcrumbBar.classNames = Container.classNames.concat([BreadcrumbBar.className]);
//# sourceMappingURL=BreadcrumbBar.js.map