public render()

in src/UXClient/Components/ColorPicker/ColorPicker.ts [28:101]


    public render (options: ColorPickerOptions = {}) {
        this.chartOptions.setOptions(options);
        this.selectedColor = this.chartOptions.defaultColor;
        if (this.chartOptions.colors.indexOf(this.selectedColor) === -1) {
            this.chartOptions.colors.push(this.selectedColor);
        }

        this.colorPickerElem = d3.select(this.renderTarget).classed("tsi-colorPicker", true);
        this.colorPickerElem.text(''); 
        super.themify( this.colorPickerElem, this.chartOptions.theme);

        // color selection button
        let colorPickerButton = this.colorPickerElem.append('button').classed("tsi-colorPickerButton", true)
            .attr("title", this.getString('Select color'))
            .attr("aria-label", (this.selectedColor ? this.selectedColor : this.getString('No color')) + ' ' + this.getString('Select color'))
            .attr("aria-controls", `tsi-colorGrid_${this.componentId}`)
            .on('click', () => {
                if (this.isColorGridVisible) {
                    this.hideColorGrid(true);
                } else {
                    this.chartOptions.onClick(d3.event); this.showColorGrid();
                }
            });
        if (this.selectedColor) {
            colorPickerButton.append('div').classed("tsi-selectedColor", true).style("background-color", this.selectedColor);
        } else {
            colorPickerButton.append('div').classed("tsi-selectedColor", true).classed("tsi-noColor", true);
        }

        colorPickerButton.append('span').classed("tsi-selectedColorValue", true).classed("hidden", this.chartOptions.isColorValueHidden)
            .attr("id", `tsi-selectedColorValue_${this.componentId}`)
            .text(this.selectedColor ? this.selectedColor : this.getString('No color'));

        // color grid
        let colorGridElem =  this.colorPickerElem.append('div').classed("tsi-colorGrid", true).attr("id", `tsi-colorGrid_${this.componentId}`).attr("role", "grid");
        let colorGridRowElem = colorGridElem.append('div').classed("tsi-colorGridRow", true).attr("role", "row");
        this.chartOptions.colors.forEach((c, idx) => {
            let gridItem = colorGridRowElem.append('div').classed("tsi-colorItem", true).classed("tsi-selected", c === this.selectedColor)
                .attr("tabindex", 0)
                .attr("role", "gridcell")
                .attr("aria-label", c)
                .attr("aria-selected", c === this.selectedColor)
                .style("background-color", c)
                .on('click', () => {
                    d3.event.preventDefault();
                    d3.event.stopPropagation();
                    this.chartOptions.onSelect(c); this.hideColorGrid(true); this.setSelectedColor(c, gridItem);
                })
                .on('keydown', () => {
                    if (d3.event.keyCode === KeyCodes.Tab && !d3.event.shiftKey && idx === this.chartOptions.colors.length - 1) { // tab
                        d3.event.preventDefault();
                        this.colorPickerElem.selectAll(".tsi-colorItem").nodes()[0].focus();
                    } else if (d3.event.keyCode === KeyCodes.Enter) {
                        d3.event.preventDefault();
                        d3.event.stopPropagation();
                        this.chartOptions.onSelect(c); 
                        this.hideColorGrid(true); 
                        this.setSelectedColor(c, gridItem);
                    } else if (d3.event.keyCode === KeyCodes.Esc) {
                        d3.event.preventDefault();
                        d3.event.stopPropagation();
                        this.hideColorGrid(true);
                    }
                });
        });

        d3.select("html").on("click." + this.componentId, () => {
            if (this.colorPickerElem.select(".tsi-colorPickerButton").filter(Utils.equalToEventTarget).empty() && 
                this.colorPickerElem.select(".tsi-colorPickerButton").selectAll("*").filter(Utils.equalToEventTarget).empty() &&
                this.colorPickerElem.selectAll(".tsi-colorGrid").filter(Utils.equalToEventTarget).empty()) {
                    this.hideColorGrid();
            }
        });
    }