/**
* Конструкторы табличных документов печатных форм и отчетов<br/>
* © Evgeniy Malyarov http://www.oknosoft.ru 2014-2016<br/>
* Created 17.04.2016
*
* @module reporting
*/
/**
* Объект для построения печатных форм и отчетов
*
* @param [attr] {Object} - размер листа, ориентация, поля и т.д.
* @constructor
*/
function SpreadsheetDocument(attr) {
this._attr = {
orientation: "portrait",
title: "",
content: document.createElement("DIV")
};
if(attr && typeof attr == "string"){
this.content = attr;
} else if(typeof attr == "object"){
this._mixin(attr);
}
attr = null;
}
SpreadsheetDocument.prototype.__define({
clear: {
value: function () {
while (this._attr.content.firstChild) {
this._attr.content.removeChild(this._attr.content.firstChild);
}
}
},
/**
* Выводит область ячеек в табличный документ
*/
put: {
value: function (range, attr) {
var elm;
if(range instanceof HTMLElement){
elm = document.createElement(range.tagName);
elm.innerHTML = range.innerHTML;
if(!attr)
attr = range.attributes;
}else{
elm = document.createElement("DIV");
elm.innerHTML = range;
}
if(attr){
Object.keys(attr).forEach(function (key) {
if(key == "id" || attr[key].name == "id")
return;
elm.setAttribute(attr[key].name || key, attr[key].value || attr[key]);
});
}
this._attr.content.appendChild(elm);
}
},
content: {
get: function () {
return this._attr.content
},
set: function (v) {
this.clear();
if(typeof v == "string")
this._attr.content.innerHTML = v;
else if(v instanceof HTMLElement)
this._attr.content.innerHTML = v.innerHTML;
}
},
title: {
get: function () {
return this._attr.title
},
set: function (v) {
this._attr.title = v;
}
}
});
/**
* Экспортируем конструктор SpreadsheetDocument, чтобы экземпляры печатного документа можно было создать снаружи
* @property SpreadsheetDocument
* @for MetaEngine
* @type {function}
*/
$p.SpreadsheetDocument = SpreadsheetDocument;
/**
* Табличный документ для экранных отчетов
* @param container {HTMLElement|dhtmlXCellObject} - элемент DOM, в котором будет размещена таблица
* @param [attr] {Object} - атрибуты инициплизации
* @constructor
*/
function HandsontableDocument(container, attr) {
var init = function () {
if(this._then)
this._then(this);
}.bind(this);
this._online = (attr && attr.allow_offline) || (navigator.onLine && $p.wsql.pouch.authorized);
if(container instanceof dhtmlXCellObject){
this._cont = document.createElement('div');
container.detachObject(true);
container.attachObject(this._cont);
}else{
this._cont = container;
}
this._cont.classList.add("handsontable_wrapper");
if(!this._online){
this._cont.innerHTML = $p.msg.report_need_online;
}else{
this._cont.innerHTML = attr.autorun ? $p.msg.report_prepare : $p.msg.report_need_prepare;
}
this.then = function (callback) {
this._then = callback;
return this;
};
this.requery = function (opt) {
if(this.hot)
this.hot.destroy();
if(opt instanceof Error){
this._cont.innerHTML = $p.msg.report_error + (opt.name ? " <b>" + opt.name + "</b>" : "") + (opt.message ? " " + opt.message : "");
}else{
this._cont.innerHTML = "";
this.hot = new Handsontable(this._cont, opt);
}
};
// отложенная загрузка handsontable и зависимостей
if(typeof Handsontable != "function" && this._online){
$p.load_script("https://cdnjs.cloudflare.com/ajax/libs/pikaday/1.4.0/pikaday.min.js","script")
.then(function () {
return $p.load_script("https://cdnjs.cloudflare.com/ajax/libs/numbro/1.9.2/numbro.min.js","script")
})
.then(function () {
return $p.load_script("https://cdn.jsdelivr.net/g/zeroclipboard,handsontable@0.26(handsontable.min.js)","script")
})
.then(function () {
return Promise.all([
$p.load_script("https://cdn.jsdelivr.net/handsontable/0.26/handsontable.min.css","link"),
$p.load_script("https://cdnjs.cloudflare.com/ajax/libs/numbro/1.9.2/languages/ru-RU.min.js","script")
]);
})
.then(init);
}else{
setTimeout(init);
}
}
/**
* Экспортируем конструктор HandsontableDocument, чтобы экземпляры табличного документа можно было создать снаружи
* @property HandsontableDocument
* @for MetaEngine
* @type {function}
*/
$p.HandsontableDocument = HandsontableDocument;