You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
8.8 KiB
219 lines
8.8 KiB
/**
|
|
* Created by Jacky.Gao on 2017-02-04.
|
|
*/
|
|
import uuid from 'node-uuid';
|
|
import {alert,confirm,dialog} from '../MsgBox.js';
|
|
import BeanMethodDialog from '../dialog/BeanMethodDialog.js';
|
|
import BaseTree from './BaseTree.js';
|
|
|
|
export default class DatabaseTree extends BaseTree{
|
|
constructor(container,datasources,ds,springDialog,context){
|
|
super();
|
|
this.type='spring';
|
|
this.datasources=datasources;
|
|
this.datasets=ds.datasets || [];
|
|
this.springDialog=springDialog;
|
|
this.context=context;
|
|
this.id=uuid.v1();
|
|
this.name=ds.name;
|
|
this.beanId=ds.beanId;
|
|
this.init(container);
|
|
}
|
|
init(container){
|
|
this.treeContainer=$(`<div class="tree" style="margin-left: 10px"></div>`);
|
|
container.append(this.treeContainer);
|
|
this.ul=$(`<ul style="padding-left: 20px;"></ul>`);
|
|
this.treeContainer.append(this.ul);
|
|
this._buildDatasource();
|
|
for(let dataset of this.datasets){
|
|
const fieldsUL=this.addDataset(dataset);
|
|
this.buildFileds(dataset,fieldsUL);
|
|
}
|
|
}
|
|
_buildDatasource(){
|
|
this.datasourceLi=$(`<li></li>`);
|
|
const rootSpan=$(`
|
|
<span id="${this.id}">
|
|
<i class='ureport ureport-minus' style='margin-right:2px'></i>
|
|
<i class="ureport ureport-leaf"></i> <a href='###' class="ds_name">${this.name}</a>
|
|
</span>`);
|
|
this.datasourceLi.append(rootSpan);
|
|
this.ul.append(this.datasourceLi);
|
|
this.attachEvent(rootSpan,this.datasourceLi);
|
|
this.datasetUL=$(`<ul style="margin-left: -16px;"></ul>`);
|
|
this.datasourceLi.append(this.datasetUL);
|
|
const _this=this;
|
|
const beanMethodDialog=new BeanMethodDialog(this.datasources,this.beanId);
|
|
$.contextMenu({
|
|
selector:'#'+this.id,
|
|
callback:function(key,options){
|
|
if(key==='add'){
|
|
const span=$(options.selector);
|
|
beanMethodDialog.show(function(name,method,clazz){
|
|
const dataset={name,method,clazz,fields:[]};
|
|
_this.datasets.push(dataset);
|
|
const fieldsUL=_this.addDataset(dataset);
|
|
if(clazz && clazz!==''){
|
|
_this.buildFileds(dataset,fieldsUL);
|
|
}
|
|
});
|
|
}else if(key==='delete'){
|
|
confirm(`${window.i18n.tree.delConfirm}[${_this.name}]?`,function(){
|
|
const datasources=_this.datasources;
|
|
const index=datasources.indexOf(_this);
|
|
datasources.splice(index,1);
|
|
_this.treeContainer.remove();
|
|
});
|
|
}else if(key==='edit'){
|
|
_this.springDialog.show(function(name,beanId){
|
|
_this.name=name;
|
|
_this.beanId=beanId;
|
|
rootSpan.find(".ds_name").html(name);
|
|
}, {
|
|
name: _this.name,
|
|
beanId: _this.beanId
|
|
});
|
|
}
|
|
},
|
|
items:{
|
|
"add": {name: `${window.i18n.tree.addDataset}`, icon: "add"},
|
|
"edit": {name: `${window.i18n.tree.edit}`, icon: "edit"},
|
|
"delete": {name: `${window.i18n.tree.del}`, icon: "delete"}
|
|
}
|
|
});
|
|
}
|
|
|
|
addDataset(dataset){
|
|
const li=$(`<li></li>`);
|
|
const spanId=uuid.v1();
|
|
const span=$(`<span id="${spanId}"><i class='ureport ureport-minus' style='margin-right:2px'></i> <i class="ureport ureport-sqlds"></i> <a href='###' class="dataset_name">${dataset.name}</a></span>`);
|
|
li.append(span);
|
|
this.datasetUL.append(li);
|
|
this.attachEvent(span,li);
|
|
const fieldsUL=$(`<ul style="padding-left: 22px;"></ul>`);
|
|
li.append(fieldsUL);
|
|
const _this=this;
|
|
const beanMethodDialog=new BeanMethodDialog(this.datasources,this.beanId);
|
|
|
|
const newFiledGroup=$(`<div>${window.i18n.tree.inputTip}</div>`);
|
|
const newFieldEditor=$(`<input type="text" class="form-control">`);
|
|
newFiledGroup.append(newFieldEditor);
|
|
|
|
$.contextMenu({
|
|
selector:'#'+spanId,
|
|
callback:function(key,options){
|
|
if(key==='add'){
|
|
const span=$(options.selector);
|
|
dialog(`${window.i18n.tree.addField}`,newFiledGroup,function(){
|
|
const newFieldName=newFieldEditor.val();
|
|
for(let field of dataset.fields){
|
|
if(field.name===newFieldName){
|
|
alert(`${window.i18n.tree.addField}`);
|
|
return;
|
|
}
|
|
}
|
|
let field={name:newFieldName};
|
|
dataset.fields.push(field);
|
|
_this.addField(dataset,dataset.fields,field,fieldsUL);
|
|
});
|
|
}else if(key==='delete'){
|
|
confirm(`${window.i18n.tree.delDatasetConfirm}[${dataset.name}]?`,function(){
|
|
const index=_this.datasets.indexOf(dataset);
|
|
_this.datasets.splice(index,1);
|
|
li.remove();
|
|
});
|
|
}else if(key === 'edit'){
|
|
beanMethodDialog.show(function(name,method,clazz){
|
|
dataset.name=name;
|
|
dataset.method=method;
|
|
dataset.clazz=clazz;
|
|
span.find(".dataset_name").html(name);
|
|
if(clazz && clazz!==''){
|
|
_this.buildFileds(dataset,fieldsUL);
|
|
}
|
|
},dataset);
|
|
}else if(key==='refresh'){
|
|
_this.buildFileds(dataset,fieldsUL,true);
|
|
}
|
|
},
|
|
items:{
|
|
"add": {name:`${window.i18n.tree.addField}`, icon: "add"},
|
|
"edit": {name: `${window.i18n.tree.edit}`, icon: "edit"},
|
|
"delete": {name: `${window.i18n.tree.del}`, icon: "delete"},
|
|
"refresh": {name: `${window.i18n.tree.refresh}`,icon:'loading'}
|
|
}
|
|
});
|
|
return fieldsUL;
|
|
}
|
|
|
|
buildFileds(dataset,ul,refresh){
|
|
const defaultFields=dataset.fields,_this=this;
|
|
if(!refresh && defaultFields){
|
|
for(let field of defaultFields){
|
|
_this.addField(dataset,defaultFields,field,ul);
|
|
}
|
|
return;
|
|
}
|
|
$.ajax({
|
|
url:window._server+"/datasource/buildClass",
|
|
data: {
|
|
clazz:dataset.clazz
|
|
},
|
|
success:function(fields){
|
|
dataset.fields=fields;
|
|
ul.empty();
|
|
for(let field of fields){
|
|
_this.addField(dataset,fields,field,ul);
|
|
}
|
|
},
|
|
error:function(response){
|
|
if(response && response.responseText){
|
|
alert("服务端错误:"+response.responseText+"");
|
|
}else{
|
|
alert(`${window.i18n.tree.loadFieldFail}`);
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
addField(dataset,fields,field,ul){
|
|
const _this=this;
|
|
const li=$(`<li></li>`);
|
|
const spanId=uuid.v1();
|
|
const span=$(`<span id="${spanId}" title="${window.i18n.tree.doubleClick}"><i class="ureport ureport-property"></i> <a href='###'>${field.name}</a></span>`);
|
|
li.append(span);
|
|
span.dblclick(function(){
|
|
_this._buildClickEvent(dataset,field,_this.context)
|
|
});
|
|
ul.append(li);
|
|
$.contextMenu({
|
|
selector:'#'+spanId,
|
|
callback:function(key,options){
|
|
if(key==='delete'){
|
|
confirm(`${window.i18n.tree.delFieldConfirm}[${field.name}]?`,function(){
|
|
const index=fields.indexOf(field);
|
|
fields.splice(index,1);
|
|
li.remove();
|
|
});
|
|
}
|
|
},
|
|
items:{
|
|
"delete": {name: `${window.i18n.tree.del}`, icon: "delete"}
|
|
}
|
|
});
|
|
}
|
|
|
|
attachEvent(span,li){
|
|
span.click(function (e) {
|
|
let $liChildren = li.find(' > ul > li');
|
|
if ($liChildren.is(":visible")) {
|
|
$liChildren.hide('fast');
|
|
span.children('i:first').addClass('ureport-plus').removeClass('ureport-minus');
|
|
} else {
|
|
$liChildren.show('fast');
|
|
span.children('i:first').addClass('ureport-minus').removeClass('ureport-plus');
|
|
}
|
|
e.stopPropagation();
|
|
});
|
|
}
|
|
}
|