/// namespace RegionSelection { function foreach(data, callback: (value: any, key?: number | string, array?: Array) => void) { Array.prototype.forEach.call(data, callback); } class RegionSelectionBox { private selector: JQuery; private regions: Region[] = []; private box: JQuery; constructor(selector: JQuery) { this.selector = selector; if (this.selector.data('regions') !== undefined) { this.fillRegions(this.selector.data('regions')); } this.selector.on('click', this.showBox.bind(this)); } private fillRegions(data) { foreach(eval(data), (value: RegionInterface) => { this.regions.push(new Region(value)); }); } private showBox(e: JQueryEventObject) { e.preventDefault(); e.stopPropagation(); if (this.box === undefined) { this.renderBox(); } let box = this.box; let hide = function () { box.hide(0, () => { $('body').off('click', hide); }); }.bind(this); if (box.is(':visible')) { hide(); } else { $('body').on('click', hide); box.show(0); } } private renderBox() { if (!$('.region__selection-box').length) { this.box = $('
'); let itemTemplate = '{icon} {name}'; let iconTemplate = ''; foreach(this.regions, (region: Region) => { let item = $(itemTemplate .replace('{link}', region.link) .replace('{name}', region.caption) .replace('{icon}', iconTemplate.replace('{icon}', region.icon)) ); this.box.append(item); }); this.box.css('display', 'none'); this.selector.parent().append(this.box); } } } interface RegionInterface { id: number; caption: string; link: string; icon: string; } class Region { constructor(data: RegionInterface) { this._id = data.id; this._caption = data.caption; this._link = data.link; this._icon = data.icon; } private _id: number; get id() { return this._id; } private _caption: string; get caption() { return this._caption; } private _link: string; get link(): string { return this._link; } private _icon: string; get icon(): string { return this._icon; } } export function createSelectionBox($object: JQuery) { return new RegionSelectionBox($object); } }