/**
* Процедуры импорта и экспорта данных
*
* © Evgeniy Malyarov http://www.oknosoft.ru 2014-2016
*
* @module metadata
* @submodule import_export
* @requires common
*/
/**
* ### Экспортирует данные в файл или в строковую переменную или на сервер
* - Выгружаться может как единичный объект, так и коллекция объектов
* - В параметрах метода либо интерактивно могут задаваться правила экспорта, такие как:
* - Формат формируемого файла (json, xlsx, sql)
* - Дополнять ли формируемый файл информацией о метаданных (типы и связи полей)
* - Включать ли в формируемый файл данные связанных объектов<br />(например, выгружать вместе с заказом объекты номенклатуры и характеристик)
*
* @method export
* @for DataManager
* @param attr {Object} - параметры экспорта
* @param [attr.pwnd] {dhtmlXWindows} - указатель на родительскую форму
*
* @example
*
* // обработчик нажатия кнопок командной панели формы списка
* function toolbar_click(btn_id){
* if(btn_id=="btn_import"){
* // открываем диалог импорта объектов текущего менеджера
* _mgr.import();
* }else if(btn_id=="btn_export"){
* // открываем диалог экспорта объектов текущего менеджера и передаём ссылку текущей строки
* // если ссылка не пустая, будет предложено экспортировать единственный объект
* // при необходимости, в диалоге можно указать экспорт всех объектов текущего менеджера
* _mgr.export(wnd.elmnts.grid.getSelectedRowId());
* }
* }
*/
DataManager.prototype.export = function(attr){
if(attr && "string" === typeof attr)
attr = {items: attr.split(",")};
else if(!attr)
attr = {items: []};
var _mgr = this, wnd,
options = {
name: 'export',
wnd: {
top: 130,
left: 200,
width: 480,
height: 350
}
};
// читаем объект из локального SQL или из 1С
frm_create();
/**
* ПриСозданииНаСервере()
*/
function frm_create(){
$p.wsql.restore_options("data_manager", options);
options.wnd.caption = "Экспорт " + _mgr.family_name + " '" + (_mgr.metadata().synonym || _mgr.metadata().name) + "'";
wnd = $p.iface.dat_blank(null, options.wnd);
wnd.bottom_toolbar({
buttons: [
{name: 'btn_cancel', text: '<i class="fa fa-times fa-lg"></i> Отмена', title: 'Отмена', width:'80px', float: 'right'},
{name: 'btn_ok', b: '<i class="fa fa-floppy-o"></i> Ок', title: 'Выполнить экспорт', width:'50px', float: 'right'}],
onclick: function (name) {
if(name == 'btn_ok')
do_export();
else
wnd.close();
return false;
}
});
wnd.button('close').show();
wnd.button('park').hide();
wnd.attachEvent("onClose", frm_close);
var str = [
{ type:"fieldset" , name:"form_range", label:"Выгрузить", list:[
{ type:"settings" , labelWidth:320, labelAlign:"left", position:"label-right" },
{ type:"radio" , name:"range", label:"Выделенные строки", value:"selected" },
{ type:"radio" , name:"range", label:"Весь справочник", value:"all" }
]},
{ type:"fieldset" , name:"form_fieldset_2", label:"Дополнительно выгрузить", list:[
{ type:"settings" , labelWidth:160, position:"label-right" },
{ type:"checkbox" , name:"meta", label:"Описание метаданных", labelAlign:"left", position:"label-right", checked: options.meta },
{ type:"newcolumn" },
{ type:"checkbox" , name:"relation", label:"Связанные объекты", position:"label-right", checked: options.relation, tooltip: "Связанные объекты по ссылкам (пока не реализовано)" }
] },
{ type:"fieldset" , name:"fieldset_format", label:"Формат файла", list:[
{ type:"settings" , labelWidth:60, labelAlign:"left", position:"label-right" },
{ type:"radio" , name:"format", label:"json", value:"json", tooltip: "Выгрузить в формате JSON" },
{ type:"newcolumn" },
{ type:"radio" , name:"format", label:"xlsx", value:"xlsx", tooltip: "Выгрузить в офисном формате XLSX" },
{ type:"newcolumn" },
{ type:"radio" , name:"format", label:"atom", value:"atom", tooltip: "Выгрузить в формате XML Atom" }
] }
];
wnd.elmnts.frm = wnd.attachForm(str);
wnd.elmnts.frm.setItemValue("range", options.range || "all");
if(attr.items && attr.items.length == 1){
if(attr.obj)
wnd.elmnts.frm.setItemLabel("range", "selected", "Тек. объект: " + attr.items[0].presentation);
else
_mgr.get(attr.items[0], true).then(function (Obj) {
wnd.elmnts.frm.setItemLabel("range", "selected", "Тек. объект: " + Obj.presentation);
});
wnd.elmnts.frm.setItemValue("range", "selected");
}else if(attr.items && attr.items.length)
wnd.elmnts.frm.setItemLabel("range", "selected", "Выделенные строки (" + attr.items.length + " элем.)");
if(_mgr instanceof DocManager)
wnd.elmnts.frm.setItemLabel("range", "all", "Все документы из кеша (0 элем.)");
wnd.elmnts.frm.setItemValue("format", options.format || "json");
wnd.elmnts.frm.attachEvent("onChange", set_availability);
set_availability();
if(attr.pwnd && attr.pwnd.isModal && attr.pwnd.isModal()){
attr.set_pwnd_modal = true;
attr.pwnd.setModal(false);
}
wnd.setModal(true);
}
function set_availability(){
wnd.elmnts.frm.setItemValue("relation", false);
wnd.elmnts.frm.disableItem("relation");
if(wnd.elmnts.frm.getItemValue("range") == "all"){
wnd.elmnts.frm.disableItem("format", "atom");
if(wnd.elmnts.frm.getItemValue("format") == "atom")
wnd.elmnts.frm.setItemValue("format", "json");
}else
wnd.elmnts.frm.enableItem("format", "atom");
if(wnd.elmnts.frm.getItemValue("format") == "json"){
wnd.elmnts.frm.enableItem("meta");
}else if(wnd.elmnts.frm.getItemValue("format") == "sql"){
wnd.elmnts.frm.setItemValue("meta", false);
wnd.elmnts.frm.disableItem("meta");
}else{
wnd.elmnts.frm.setItemValue("meta", false);
wnd.elmnts.frm.disableItem("meta");
}
}
function refresh_options(){
options.format = wnd.elmnts.frm.getItemValue("format");
options.range = wnd.elmnts.frm.getItemValue("range");
options.meta = wnd.elmnts.frm.getItemValue("meta");
options.relation = wnd.elmnts.frm.getItemValue("relation");
return options;
}
function do_export(){
refresh_options();
function export_xlsx(){
if(attr.obj)
$p.wsql.alasql("SELECT * INTO XLSX('"+_mgr.table_name+".xlsx',{headers:true}) FROM ?", [attr.items[0]._obj]);
else
$p.wsql.alasql("SELECT * INTO XLSX('"+_mgr.table_name+".xlsx',{headers:true}) FROM " + _mgr.table_name);
}
var res = {meta: {}, items: {}},
items = res.items[_mgr.class_name] = [];
//$p.wsql.aladb.tables.refs.data.push({ref: "dd274d11-833b-11e1-92c2-8b79e9a2b61c"})
//$p.wsql.alasql('select * from cat_cashboxes where ref in (select ref from refs)')
if(options.meta)
res.meta[_mgr.class_name] = _mgr.metadata();
if(options.format == "json"){
if(attr.obj)
items.push(attr.items[0]._obj);
else
_mgr.each(function (o) {
if(options.range == "all" || attr.items.indexOf(o.ref) != -1)
items.push(o._obj);
});
if(attr.items.length && !items.length)
_mgr.get(attr.items[0], true).then(function (Obj) {
items.push(Obj._obj);
alasql.utils.saveFile(_mgr.table_name+".json", JSON.stringify(res, null, 4));
});
else
alasql.utils.saveFile(_mgr.table_name+".json", JSON.stringify(res, null, 4));
}else if(options.format == "xlsx"){
if(!window.xlsx)
$p.load_script("//cdn.jsdelivr.net/js-xlsx/latest/xlsx.core.min.js", "script", export_xlsx);
else
export_xlsx();
}else if(options.format == "atom" && attr.items.length){
var po = attr.obj ? Promise.resolve(attr.items[0]) : _mgr.get(attr.items[0], true);
po.then(function (o) {
alasql.utils.saveFile(_mgr.table_name+".xml", o.to_atom());
});
}else{
//$p.wsql.alasql("SELECT * INTO SQL('"+_mgr.table_name+".sql') FROM " + _mgr.table_name);
$p.msg.show_not_implemented();
}
}
function frm_close(win){
$p.iface.popup.hide();
wnd.wnd_options(options.wnd);
$p.wsql.save_options("data_manager", refresh_options());
wnd.setModal(false);
if(attr.set_pwnd_modal && attr.pwnd.setModal)
attr.pwnd.setModal(true);
return true;
}
};
/**
* Осуществляет загрузку данных из json-файла
* @param [file] {String|Blob|undefined}
* @param [obj] {DataObj} - если указано, загрузка осуществляется только в этот объект. остальные данные файла - игнорируются
*/
DataManager.prototype.import = function(file, obj){
var input_file, imported;
function import_file(event){
function do_with_collection(cl_name, items){
var _mgr = _md.mgr_by_class_name(cl_name);
if(items.length){
if(!obj){
imported = true;
_mgr.load_array(items, true);
} else if(obj._manager == _mgr){
for(var i in items){
if($p.utils.fix_guid(items[i]) == obj.ref){
imported = true;
_mgr.load_array([items[i]], true);
}
}
}
}
}
wnd.close();
if(input_file.files.length){
var reader = new FileReader();
reader.onload = function(e) {
try{
var res = JSON.parse(reader.result);
if(res.items){
for(var cl_name in res.items)
do_with_collection(cl_name, res.items[cl_name]);
}else{
["cat", "doc", "ireg", "areg", "cch", "cacc"].forEach(function (cl) {
if(res[cl]) {
for (var cl_name in res[cl])
do_with_collection(cl + "." + cl_name, res.cat[cl_name]);
}
});
}
if(!imported)
$p.msg.show_msg($p.msg.sync_no_data);
}catch(err){
$p.msg.show_msg(err.message);
}
};
reader.readAsText(input_file.files[0]);
}
}
if(!file && typeof window != undefined){
var options = {
name: 'import',
wnd: {
width: 300,
height: 100,
caption: $p.msg.select_file_import
}
},
wnd = $p.iface.dat_blank(null, options.wnd);
input_file = document.createElement("input");
input_file.setAttribute("id", "json_file");
input_file.setAttribute("type", "file");
input_file.setAttribute("accept", ".json");
input_file.setAttribute("value", "*.json");
input_file.onchange = import_file;
wnd.button('close').show();
wnd.button('park').hide();
wnd.attachObject(input_file);
wnd.centerOnScreen();
wnd.setModal(true);
setTimeout(function () {
input_file.click();
}, 100);
}
};