///
///
namespace FancyCheckboxes {
export class FancyCheckbox {
public events: { [name: string]: { (responseText: string): void } [] } = {
'error': [],
'success': []
};
private $selector: JQuery;
private checkboxData: any[];
private selected: {} = {};
public constructor($selector: JQuery) {
this.$selector = $selector;
this.checkboxData = [];
this.populateCheckboxData(JSON.parse($selector.data('items') ? $selector.data('items').replace(/'/g, '"') : "[]"));
this.$selector.click(this.onSelectorClick.bind(this));
this.$selector.prev().append('
');
this.loadSelected();
}
private loadSelected() {
let context = this;
let first = true;
let $selected = context.$selector.prev().find('.selected-items');
this.selected = {};
$selected.html('');
console.dir($(this.$selector.data('field')).find(':selected'));
$(this.$selector.data('field')).find(':selected').each(function () {
context.selected[$(this).attr('value')] = $(this).html();
if (!first) {
$selected.append(', ')
}
if (first) {
first = false;
}
$selected.append('' + $(this).html() + '');
});
console.dir(this.selected);
}
private onSelectorClick(event) {
let context = this;
let content = $('');
content.append('');
content.append('' + this.render().html() + '
');
content.append('');
content.find('.modal-footer').append('');
let options = {
content: '' + content.html() + '
',
type: 'html',
modal: true,
height: window.innerHeight,
width: $('.mainBlock').outerWidth(),
autoSize: false,
afterClose: function () {
context.loadSelected();
},
afterShow: function () {
context.bindEvents();
}
};
$.fancybox(options);
}
private bindEvents() {
let context = this;
let $fancy = $('.fancycheckboxes');
$fancy.find('.more').each(function () {
let $link = $(this);
$link.on('click', function () {
$link.parent().animate({height: $link.parent()[0].scrollHeight}, 200, function () {
$link.parent().height('auto');
$link.remove();
});
});
});
$fancy.find('.btn-primary').click(function () {
$(context.$selector.data('field')).find('option').removeAttr('selected');
$fancy.find('input:checked').each(function () {
console.dir($(context.$selector.data('field'))
.find('[value=' + $(this).attr('value') + ']'));
$(context.$selector.data('field'))
.find('[value=' + $(this).attr('value') + ']')
.prop('selected', 'selected');
});
$.fancybox.close();
});
}
public checkChecked(id) {
return this.selected.hasOwnProperty(id);
}
public on(eventName: string, callback: (responseText: string) => void) {
this.events[eventName].push(callback);
return this;
}
public trigger(eventName: string, ...args: any[]) {
let context = this;
for (let i in this.events[eventName]) {
if (this.events[eventName].hasOwnProperty(i)) {
setTimeout(this.events[eventName][i].apply(context, args), 1);
}
}
}
private populateCheckboxData(checkboxData: ItemInterface[]) {
checkboxData.sort(function (item1: ItemInterface, item2: ItemInterface) {
return item1.value.localeCompare(item2.value);
});
for (let i in checkboxData) {
if (checkboxData.hasOwnProperty(i)) {
if (checkboxData[i].items.length) {
let group = new CheckboxGroup(checkboxData[i], this);
this.checkboxData.push(group);
} else {
let item = new CheckboxItem(checkboxData[i], this);
this.checkboxData.push(item);
}
}
}
}
public render() {
let items = $('');
this.checkboxData.forEach(function (item) {
if (item instanceof CheckboxItem) {
let group = $('');
group.append(item.render());
items.append(group);
} else {
items.append(item.render());
}
});
items.find('.fancycheckboxes-group').each(function () {
if ($(this).find('.fancycheckboxes-item').length > 5) {
$(this).append($('Все »'));
$(this).height(150);
}
});
return items;
}
}
interface ItemInterface {
id: number;
value: string;
items: ItemInterface[];
}
class CheckboxGroup {
public items: any[];
public name: string;
private widget: FancyCheckbox;
public constructor(item: ItemInterface, widget: FancyCheckbox) {
this.widget = widget;
this.name = item.value;
this.items = [];
this.populateCheckboxData(item.items);
}
private populateCheckboxData(checkboxData: ItemInterface[]) {
checkboxData.sort(function (item1: ItemInterface, item2: ItemInterface) {
return item1.value.localeCompare(item2.value);
});
for (let i in checkboxData) {
if (checkboxData.hasOwnProperty(i)) {
if (checkboxData[i].items.length) {
let group = new CheckboxGroup(checkboxData[i], this.widget);
this.items.push(group);
} else {
let item = new CheckboxItem(checkboxData[i], this.widget);
this.items.push(item);
}
}
}
}
public render() {
let group = $('');
group.append($('' + this.name + '
'));
this.items.forEach(function (item) {
group.append(item.render());
});
return group;
}
}
class CheckboxItem {
public id: number;
public name: string;
private widget: FancyCheckbox;
public constructor(item: ItemInterface, widget: FancyCheckbox) {
this.id = item.id;
this.name = item.value;
this.widget = widget;
}
public render() {
let item = $('');
item.append($(' '));
if (this.widget.checkChecked(this.id)) {
item.find('input').attr('checked', 'checked');
}
return item;
}
}
}