Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
-布谷鸟-
nosqlclient
提交
d0847e40
N
nosqlclient
项目概览
-布谷鸟-
/
nosqlclient
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
N
nosqlclient
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d0847e40
编写于
5月 12, 2017
作者:
R
rsercano
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
resolves #361
上级
63f491b4
变更
10
显示空白变更内容
内联
并排
Showing
10 changed file
with
459 addition
and
261 deletion
+459
-261
client/imports/helper.js
client/imports/helper.js
+2
-0
client/imports/views/pages/aggregate_pipeline/aggregate_histories/aggregate_histories.html
...ate_pipeline/aggregate_histories/aggregate_histories.html
+44
-0
client/imports/views/pages/aggregate_pipeline/aggregate_histories/aggregate_histories.js
...egate_pipeline/aggregate_histories/aggregate_histories.js
+84
-0
client/imports/views/pages/aggregate_pipeline/aggregate_pipeline.html
...ts/views/pages/aggregate_pipeline/aggregate_pipeline.html
+8
-3
client/imports/views/pages/aggregate_pipeline/aggregate_pipeline.js
...orts/views/pages/aggregate_pipeline/aggregate_pipeline.js
+154
-46
client/imports/views/pages/aggregate_pipeline/aggregate_result_modal/aggregate_result_modal.html
...peline/aggregate_result_modal/aggregate_result_modal.html
+0
-25
client/imports/views/pages/aggregate_pipeline/aggregate_result_modal/aggregate_result_modal.js
...pipeline/aggregate_result_modal/aggregate_result_modal.js
+0
-21
client/imports/views/pages/browse_collection/browse_collection.js
...mports/views/pages/browse_collection/browse_collection.js
+165
-165
client/stylesheets/main.css
client/stylesheets/main.css
+1
-1
lib/imports/enums.js
lib/imports/enums.js
+1
-0
未找到文件。
client/imports/helper.js
浏览文件 @
d0847e40
...
...
@@ -84,12 +84,14 @@ let Helper = function () {
this
.
strSessionServerStatus
=
"
serverStatus
"
;
this
.
strSessionDBStats
=
"
dbStats
"
;
this
.
strSessionUsedTabIDs
=
"
usedTabIDs
"
;
this
.
strSessionUsedTabIDsAggregate
=
"
usedTabIDsAggregate
"
;
this
.
strSessionSelectedDump
=
"
selectedDump
"
;
this
.
strSessionSelectedFile
=
"
selectedFile
"
;
this
.
strSessionSelectedStoredFunction
=
"
selectedStoredFunction
"
;
this
.
strSessionDistinctFields
=
"
distinctFields
"
;
this
.
strSessionSelectedQueryHistory
=
"
selectedQueryHistory
"
;
this
.
strSessionSelectedShellHistory
=
"
selectedShellHistory
"
;
this
.
strSessionSelectedAggregateHistory
=
"
selectedAggregateHistory
"
;
this
.
strSessionSelectorValue
=
"
selectorValue
"
;
this
.
strSessionSelectionUserManagement
=
"
userManagementValue
"
;
this
.
strSessionUsermanagementInfo
=
"
userManagementInfo
"
;
...
...
client/imports/views/pages/aggregate_pipeline/aggregate_histories/aggregate_histories.html
0 → 100644
浏览文件 @
d0847e40
<template
name=
"aggregateHistories"
>
<!-- MODAL QueryHistories-->
<div
class=
"modal inmodal"
id=
"aggregateHistoriesModal"
tabindex=
"-1"
role=
"dialog"
aria-hidden=
"true"
style=
"display: none;"
>
<div
class=
"modal-dialog modal-lg"
>
<div
class=
"modal-content animated bounceInRight"
>
<div
class=
"modal-header"
>
<button
type=
"button"
class=
"close"
data-dismiss=
"modal"
><span
aria-hidden=
"true"
>
×
</span><span
class=
"sr-only"
>
Close
</span></button>
<h4
class=
"modal-title"
>
Aggregation Histories
</h4>
<small
class=
"font-bold"
>
Last 20 Pipelines
</small>
</div>
<div
class=
"modal-body"
>
<div
class=
"dataTables_wrapper form-inline dt-bootstrap"
>
<table
id=
"tblAggregateHistories"
class=
"table table-striped table-bordered table-hover dataTables-example dataTable"
width=
"100%"
>
<thead>
<tr>
<th>
Collection
</th>
<th>
Pipeline
</th>
<th>
Date
</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
<div
class=
"modal-footer"
>
<div
class=
"pull-left"
>
<button
type=
"button"
class=
"btn btn-white"
data-dismiss=
"modal"
>
Close
</button>
</div>
<button
id=
"btnUseHistoricalPipeline"
disabled=
"true"
type=
"button"
class=
"btn btn-primary ladda-button"
data-style=
"contract"
data-dismiss=
"modal"
>
I want to use this
</button>
</div>
</div>
</div>
</div>
</template>
\ No newline at end of file
client/imports/views/pages/aggregate_pipeline/aggregate_histories/aggregate_histories.js
0 → 100644
浏览文件 @
d0847e40
import
{
Template
}
from
"
meteor/templating
"
;
import
{
Session
}
from
"
meteor/session
"
;
import
{
FlowRouter
}
from
"
meteor/kadira:flow-router
"
;
import
{
renderQuery
}
from
"
../aggregate_pipeline
"
;
import
Helper
from
"
/client/imports/helper
"
;
import
Enums
from
"
/lib/imports/enums
"
;
import
"
./aggregate_histories.html
"
;
const
Ladda
=
require
(
'
ladda
'
);
/**
* Created by RSercan on 24.2.2016.
*/
/*global moment*/
Template
.
aggregateHistories
.
onRendered
(
function
()
{
if
(
Session
.
get
(
Helper
.
strSessionCollectionNames
)
==
undefined
)
{
FlowRouter
.
go
(
'
/databaseStats
'
);
return
;
}
const
selector
=
$
(
'
#tblAggregateHistories
'
);
selector
.
find
(
'
tbody
'
).
on
(
'
click
'
,
'
tr
'
,
function
()
{
const
table
=
selector
.
DataTable
();
Helper
.
doTableRowSelectable
(
table
,
$
(
this
));
if
(
table
.
row
(
this
).
data
())
{
Session
.
set
(
Helper
.
strSessionSelectedAggregateHistory
,
table
.
row
(
this
).
data
());
$
(
'
#btnUseHistoricalPipeline
'
).
prop
(
'
disabled
'
,
false
);
}
});
});
Template
.
aggregateHistories
.
events
({
'
click #btnUseHistoricalPipeline
'
(
e
)
{
e
.
preventDefault
();
const
history
=
Session
.
get
(
Helper
.
strSessionSelectedAggregateHistory
);
if
(
history
)
renderQuery
({
queryInfo
:
history
.
collection
,
queryParams
:
history
.
pipeline
});
}
});
export
const
initAggregateHistories
=
function
()
{
Ladda
.
create
(
document
.
querySelector
(
'
#btnUseHistoricalPipeline
'
)).
start
();
const
tbl
=
$
(
'
#tblAggregateHistories
'
);
// destroy jquery datatable to prevent reinitialization (https://datatables.net/manual/tech-notes/3)
if
(
$
.
fn
.
dataTable
.
isDataTable
(
'
#tblAggregateHistories
'
))
{
tbl
.
DataTable
().
destroy
();
}
const
history
=
JSON
.
parse
(
localStorage
.
getItem
(
Enums
.
LOCAL_STORAGE_KEYS
.
AGGREGATE_COMMAND_HISTORY
)
||
"
[]
"
);
tbl
.
DataTable
({
responsive
:
true
,
lengthMenu
:
[
5
,
10
,
20
],
data
:
history
,
autoWidth
:
false
,
columns
:
[
{
data
:
"
collection
"
,
width
:
"
20%
"
},
{
data
:
"
pipeline
"
,
width
:
"
60%
"
,
render
:
function
(
cellData
)
{
let
str
=
""
;
for
(
let
stage
of
cellData
)
{
str
+=
Object
.
keys
(
stage
)[
0
]
+
"
<br/>
"
;
}
return
str
;
}
},
{
data
:
"
date
"
,
width
:
"
20%
"
,
render
:
function
(
cellData
)
{
return
moment
(
cellData
).
format
(
'
YYYY-MM-DD HH:mm:ss
'
);
}
}
]
});
Ladda
.
stopAll
();
};
\ No newline at end of file
client/imports/views/pages/aggregate_pipeline/aggregate_pipeline.html
浏览文件 @
d0847e40
...
...
@@ -9,6 +9,11 @@
<h5>
Drag stages between list to re-order
</h5>
<div
class=
"ibox-tools"
>
<button
id=
"btnAggregateHistory"
type=
"button"
style=
"margin-right: 5px;"
class=
"btn btn-sm btn-primary ladda-button"
data-style=
"contract"
>
History
</button>
<button
id=
"btnExecuteAggregatePipeline"
type=
"button"
class=
"btn btn-sm btn-primary ladda-button"
data-style=
"contract"
>
Execute
...
...
@@ -69,9 +74,9 @@
</ul>
</div>
<ul
id=
"
aggregateR
esultTabs"
class=
"nav nav-tabs"
>
<ul
id=
"
r
esultTabs"
class=
"nav nav-tabs"
>
</ul>
<div
id=
"
aggregateR
esultTabContents"
class=
"tab-content"
>
<div
id=
"
r
esultTabContents"
class=
"tab-content"
>
</div>
</form>
</div>
...
...
@@ -80,6 +85,6 @@
</div>
</div>
{{> aggregate
ResultModal
}}
{{> aggregate
Histories
}}
{{/if}}
</template>
\ No newline at end of file
client/imports/views/pages/aggregate_pipeline/aggregate_pipeline.js
浏览文件 @
d0847e40
...
...
@@ -2,6 +2,14 @@ import {Template} from "meteor/templating";
import
{
Meteor
}
from
"
meteor/meteor
"
;
import
{
Session
}
from
"
meteor/session
"
;
import
{
FlowRouter
}
from
"
meteor/kadira:flow-router
"
;
import
{
initAggregateHistories
}
from
"
./aggregate_histories/aggregate_histories
"
;
import
Enums
from
"
/lib/imports/enums
"
;
import
{
clarifyTabID
,
getResultTabContent
,
setAllTabsInactive
,
setResultToEditors
}
from
"
/client/imports/views/pages/browse_collection/browse_collection
"
;
import
Helper
from
"
/client/imports/helper
"
;
import
"
./aggregate_pipeline.html
"
;
...
...
@@ -13,12 +21,67 @@ const Ladda = require('ladda');
*/
let
stageNumbers
=
0
;
export
const
renderQuery
=
function
(
query
)
{
if
(
!
query
||
!
query
.
queryInfo
||
!
query
.
queryParams
)
return
;
$
(
"
#stages
"
).
empty
();
stageNumbers
=
0
;
$
(
"
#cmbCollections
"
).
val
(
query
.
queryInfo
).
trigger
(
'
chosen:updated
'
);
for
(
let
stage
of
query
.
queryParams
)
{
addStageElement
(
Object
.
keys
(
stage
)[
0
],
stage
[
Object
.
keys
(
stage
)[
0
]]);
}
};
const
setAggregateResult
=
function
(
result
,
selectedCollection
,
pipeline
)
{
const
jsonEditor
=
$
(
'
#divActiveJsonEditor
'
);
if
(
jsonEditor
.
css
(
'
display
'
)
==
'
none
'
)
{
// there's only one tab, set results
jsonEditor
.
show
(
'
slow
'
);
setResultToEditors
(
1
,
result
,
pipeline
,
selectedCollection
);
}
else
{
const
resultTabs
=
$
(
'
#resultTabs
'
);
// open a new tab
const
tabID
=
clarifyTabID
(
Helper
.
strSessionUsedTabIDsAggregate
);
const
tabContent
=
getResultTabContent
(
tabID
,
'
Jsoneditor
'
);
const
tabTitle
=
selectedCollection
+
'
-
'
+
pipeline
.
length
+
'
stages
'
;
setAllTabsInactive
();
// set tab href
resultTabs
.
append
(
$
(
'
<li><a href="#tab-
'
+
tabID
+
'
" data-toggle="tab"><i class="fa fa-book"></i>
'
+
tabTitle
+
'
<button class="close" type="button" title="Close">×</button></a></li>
'
));
// set tab content
$
(
'
#resultTabContents
'
).
append
(
tabContent
);
// show last tab
const
lastTab
=
resultTabs
.
find
(
'
a:last
'
);
lastTab
.
tab
(
'
show
'
);
setResultToEditors
(
tabID
,
result
,
pipeline
,
selectedCollection
);
}
addPipelineToHistory
(
selectedCollection
,
pipeline
);
};
const
addPipelineToHistory
=
function
(
collection
,
pipeline
)
{
let
oldOnes
=
localStorage
.
getItem
(
Enums
.
LOCAL_STORAGE_KEYS
.
AGGREGATE_COMMAND_HISTORY
)
||
"
[]
"
;
if
(
oldOnes
)
oldOnes
=
JSON
.
parse
(
oldOnes
);
if
(
oldOnes
.
length
>=
20
)
oldOnes
.
splice
(
0
,
oldOnes
.
length
-
19
);
oldOnes
.
push
({
pipeline
:
pipeline
,
collection
:
collection
,
date
:
new
Date
()});
localStorage
.
setItem
(
Enums
.
LOCAL_STORAGE_KEYS
.
AGGREGATE_COMMAND_HISTORY
,
JSON
.
stringify
(
oldOnes
));
};
const
init
=
function
()
{
const
resultTabs
=
$
(
'
#
aggregateR
esultTabs
'
);
const
resultTabs
=
$
(
'
#
r
esultTabs
'
);
resultTabs
.
on
(
'
show.bs.tab
'
,
function
(
e
)
{
const
query
=
$
(
$
(
e
.
target
).
attr
(
'
href
'
)).
data
(
'
query
'
);
if
(
query
)
{
//
renderQuery(query);
renderQuery
(
query
);
}
});
...
...
@@ -27,12 +90,95 @@ const init = function () {
$
(
this
).
parents
(
'
li
'
).
remove
();
$
(
$
(
this
).
parents
(
'
a
'
).
attr
(
'
href
'
)).
remove
();
});
$
(
'
#aggregateHistoriesModal
'
).
on
(
'
shown.bs.modal
'
,
function
()
{
initAggregateHistories
();
});
$
.
contextMenu
({
selector
:
"
#resultTabs li
"
,
items
:
{
close_others
:
{
name
:
"
Close Others
"
,
icon
:
"
fa-times-circle
"
,
callback
:
function
()
{
let
tabId
=
$
(
this
).
children
(
'
a
'
).
attr
(
'
href
'
);
let
resultTabsLi
=
$
(
'
#resultTabs
'
).
find
(
'
li
'
);
resultTabsLi
.
each
(
function
(
idx
,
li
)
{
let
select
=
$
(
li
);
if
(
select
.
children
(
'
a
'
).
attr
(
'
href
'
)
!==
tabId
)
{
$
(
select
.
children
(
'
a
'
).
attr
(
'
href
'
)).
remove
();
select
.
remove
();
}
});
}
},
close_all
:
{
name
:
"
Close All Tabs
"
,
icon
:
"
fa-times
"
,
callback
:
function
()
{
let
resultTabs
=
$
(
'
#resultTabs
'
).
find
(
'
li
'
);
resultTabs
.
each
(
function
(
idx
,
li
)
{
let
select
=
$
(
li
);
$
(
select
.
children
(
'
a
'
).
attr
(
'
href
'
)).
remove
();
select
.
remove
();
});
}
}
}
});
};
const
initCodeMirrorStage
=
function
()
{
Helper
.
initializeCodeMirror
(
$
(
'
#wrapper
'
+
stageNumbers
),
'
txtObjectStage
'
+
stageNumbers
,
false
,
50
);
};
const
addStageElement
=
function
(
query
,
val
)
{
const
cmb
=
$
(
"
#cmbStageQueries
"
);
query
=
query
||
cmb
.
chosen
().
val
();
if
(
query
)
{
query
=
(
query
.
indexOf
(
'
$
'
)
!==
-
1
?
query
:
'
$
'
+
query
);
let
liElement
=
'
<li class="success-element
'
+
query
+
'
" id="stage
'
+
stageNumbers
+
'
">
'
+
query
+
'
<a id="remove-stage-element" href="#" data-number="
'
+
stageNumbers
+
'
" class="pull-right btn btn-xs btn-white"><i class="fa fa-remove"></i> Remove</a><div id="wrapper
'
+
stageNumbers
+
'
" class="agile-detail">
'
;
let
stringInput
=
'
<input type="text" class="form-control" id="txtStringStage
'
+
stageNumbers
+
'
"/>
'
;
let
numberInput
=
'
<input id="inputNumberStage
'
+
stageNumbers
+
'
" min="0" type="number" class="form-control">
'
;
let
initCodeMirror
,
isNumber
;
switch
(
query
)
{
case
'
$limit
'
:
liElement
+=
numberInput
;
isNumber
=
true
;
break
;
case
'
$skip
'
:
liElement
+=
numberInput
;
isNumber
=
true
;
break
;
case
'
$out
'
:
liElement
+=
stringInput
;
break
;
case
'
$sortByCount
'
:
liElement
+=
stringInput
;
break
;
case
'
$count
'
:
liElement
+=
stringInput
;
break
;
default
:
initCodeMirror
=
true
;
liElement
+=
'
<textarea id="txtObjectStage
'
+
stageNumbers
+
'
" class="form-control"></textarea>
'
;
break
;
}
liElement
+=
'
</div> </li>
'
;
$
(
'
#stages
'
).
append
(
liElement
);
if
(
initCodeMirror
)
initCodeMirrorStage
();
cmb
.
val
(
''
).
trigger
(
'
chosen:updated
'
);
if
(
val
)
{
if
(
initCodeMirror
)
Helper
.
setCodeMirrorValue
(
$
(
'
#wrapper
'
+
stageNumbers
),
JSON
.
stringify
(
val
).
replace
(
/^"
(
.*
)
"$/
,
'
$1
'
),
$
(
'
#txtObjectStage
'
+
stageNumbers
));
else
if
(
isNumber
)
$
(
'
#inputNumberStage
'
+
stageNumbers
).
val
(
val
);
else
$
(
'
#txtStringStage
'
+
stageNumbers
).
val
(
val
.
replace
(
/^"
(
.*
)
"$/
,
'
$1
'
));
}
stageNumbers
++
;
}
};
const
createPipeline
=
function
(
stageListElements
)
{
const
pipeline
=
[];
stageListElements
.
each
(
function
()
{
...
...
@@ -61,7 +207,6 @@ const createPipeline = function (stageListElements) {
else
{
throw
queryName
;
}
pipeline
.
push
(
stage
);
});
...
...
@@ -92,6 +237,10 @@ Template.aggregatePipeline.onRendered(function () {
});
Template
.
aggregatePipeline
.
events
({
'
click #btnAggregateHistory
'
(){
$
(
'
#aggregateHistoriesModal
'
).
modal
(
'
show
'
);
},
'
click #btnExecuteAggregatePipeline
'
(
e
)
{
e
.
preventDefault
();
...
...
@@ -125,8 +274,7 @@ Template.aggregatePipeline.events({
Helper
.
showMeteorFuncError
(
err
,
result
,
"
Couldn't execute
"
);
}
else
{
setAggregateResult
(
result
.
result
,
selectedCollection
,
pipeline
);
//setResult(result.result);
//$('#aggregateResultModal').modal('show');
}
...
...
@@ -138,47 +286,7 @@ Template.aggregatePipeline.events({
},
'
change #cmbStageQueries
'
()
{
const
cmb
=
$
(
"
#cmbStageQueries
"
);
let
query
=
cmb
.
chosen
().
val
();
if
(
query
)
{
query
=
'
$
'
+
query
;
let
liElement
=
'
<li class="success-element
'
+
query
+
'
" id="stage
'
+
stageNumbers
+
'
">
'
+
query
+
'
<a id="remove-stage-element" href="#" data-number="
'
+
stageNumbers
+
'
" class="pull-right btn btn-xs btn-white"><i class="fa fa-remove"></i> Remove</a><div id="wrapper
'
+
stageNumbers
+
'
" class="agile-detail">
'
;
let
stringInput
=
'
<input type="text" class="form-control" id="txtStringStage
'
+
stageNumbers
+
'
"/>
'
;
let
numberInput
=
'
<input id="inputNumberStage
'
+
stageNumbers
+
'
" min="0" type="number" class="form-control">
'
;
let
initCodeMirror
;
switch
(
query
)
{
case
'
$limit
'
:
liElement
+=
numberInput
;
break
;
case
'
$skip
'
:
liElement
+=
numberInput
;
break
;
case
'
$out
'
:
liElement
+=
stringInput
;
break
;
case
'
$sortByCount
'
:
liElement
+=
stringInput
;
break
;
case
'
$count
'
:
liElement
+=
stringInput
;
break
;
default
:
initCodeMirror
=
true
;
liElement
+=
'
<textarea id="txtObjectStage
'
+
stageNumbers
+
'
" class="form-control"></textarea>
'
;
break
;
}
liElement
+=
'
</div> </li>
'
;
$
(
'
#stages
'
).
append
(
liElement
);
if
(
initCodeMirror
)
{
initCodeMirrorStage
();
}
cmb
.
val
(
''
).
trigger
(
'
chosen:updated
'
);
stageNumbers
++
;
}
addStageElement
();
},
'
click #remove-stage-element
'
(
e
)
{
...
...
client/imports/views/pages/aggregate_pipeline/aggregate_result_modal/aggregate_result_modal.html
已删除
100644 → 0
浏览文件 @
63f491b4
<template
name=
"aggregateResultModal"
>
<div
class=
"modal inmodal"
id=
"aggregateResultModal"
tabindex=
"-1"
role=
"dialog"
aria-hidden=
"true"
style=
"display: none;"
>
<div
class=
"modal-dialog modal-lg"
>
<div
class=
"modal-content animated bounceInRight"
>
<div
class=
"modal-header"
>
<button
type=
"button"
class=
"close"
data-dismiss=
"modal"
><span
aria-hidden=
"true"
>
×
</span><span
class=
"sr-only"
>
Close
</span></button>
<h4
class=
"modal-title"
>
Aggregation Result
</h4>
</div>
<div
class=
"modal-body"
>
<form
class=
"form-horizontal"
>
<div
id=
"divJsonEditorWrapper"
class=
"form-group"
>
<div
id=
"divJsonEditor"
style=
"width: 100%;height:500px"
class=
"col-lg-12"
>
</div>
</div>
</form>
</div>
<div
class=
"modal-footer"
>
<button
type=
"button"
class=
"btn btn-white btn-block"
data-dismiss=
"modal"
>
Close
</button>
</div>
</div>
</div>
</div>
</template>
\ No newline at end of file
client/imports/views/pages/aggregate_pipeline/aggregate_result_modal/aggregate_result_modal.js
已删除
100644 → 0
浏览文件 @
63f491b4
import
{
Template
}
from
'
meteor/templating
'
;
import
'
./aggregate_result_modal.html
'
;
const
JSONEditor
=
require
(
'
jsoneditor
'
);
/**
* Created by RSercan on 19.5.2016.
*/
Template
.
aggregateResultModal
.
onRendered
(
function
()
{
const
jsonEditor
=
new
JSONEditor
(
document
.
getElementById
(
'
divJsonEditor
'
),
{
mode
:
'
tree
'
,
modes
:
[
'
code
'
,
'
form
'
,
'
text
'
,
'
tree
'
,
'
view
'
],
search
:
true
});
$
(
'
#divJsonEditorWrapper
'
).
data
(
'
jsoneditor
'
,
jsonEditor
);
});
export
const
setResult
=
function
(
value
)
{
$
(
'
#divJsonEditorWrapper
'
).
data
(
'
jsoneditor
'
).
set
(
value
);
};
\ No newline at end of file
client/imports/views/pages/browse_collection/browse_collection.js
浏览文件 @
d0847e40
...
...
@@ -39,12 +39,175 @@ import "/client/imports/views/query_templates/collection/update_one/update_one";
import
"
/client/imports/views/query_templates/collection/group/group
"
;
import
"
../../query_templates/collection/find/query_wizard/query_wizard
"
;
import
"
./browse_collection.html
"
;
const
JSONEditor
=
require
(
'
jsoneditor
'
);
const
toastr
=
require
(
'
toastr
'
);
const
Ladda
=
require
(
'
ladda
'
);
require
(
'
jquery-contextmenu
'
);
export
const
initExecuteQuery
=
function
()
{
// loading button
Ladda
.
create
(
document
.
querySelector
(
'
#btnExecuteQuery
'
)).
start
();
};
export
const
setQueryResult
=
function
(
result
,
queryInfo
,
queryParams
,
saveHistory
)
{
const
jsonEditor
=
$
(
'
#divActiveJsonEditor
'
);
const
aceEditor
=
$
(
'
#divActiveAceEditor
'
);
const
settings
=
Settings
.
findOne
();
if
(
jsonEditor
.
css
(
'
display
'
)
==
'
none
'
&&
aceEditor
.
css
(
'
display
'
)
==
'
none
'
)
{
// there's only one tab, set results
if
(
settings
.
defaultResultView
==
'
Jsoneditor
'
)
{
jsonEditor
.
show
(
'
slow
'
);
}
else
{
aceEditor
.
show
(
'
slow
'
);
}
setResultToEditors
(
1
,
result
,
queryParams
,
queryInfo
);
}
else
{
// close all if setting for single tab is enabled
const
resultTabs
=
$
(
'
#resultTabs
'
);
if
(
settings
.
singleTabResultSets
)
{
resultTabs
.
find
(
'
li
'
).
each
(
function
(
idx
,
li
)
{
let
select
=
$
(
li
);
$
(
select
.
children
(
'
a
'
).
attr
(
'
href
'
)).
remove
();
select
.
remove
();
});
$
(
'
#divBrowseCollectionFooter
'
).
hide
();
$
(
'
#divBrowseCollectionFindFooter
'
).
hide
();
}
// open a new tab
const
tabID
=
clarifyTabID
();
const
tabContent
=
getResultTabContent
(
tabID
,
settings
.
defaultResultView
);
const
tabTitle
=
queryInfo
+
"
-
"
+
Session
.
get
(
Helper
.
strSessionSelectedCollection
);
setAllTabsInactive
();
// set tab href
resultTabs
.
append
(
$
(
'
<li><a href="#tab-
'
+
tabID
+
'
" data-toggle="tab"><i class="fa fa-book"></i>
'
+
tabTitle
+
'
<button class="close" type="button" title="Close">×</button></a></li>
'
));
// set tab content
$
(
'
#resultTabContents
'
).
append
(
tabContent
);
// show last tab
const
lastTab
=
resultTabs
.
find
(
'
a:last
'
);
lastTab
.
tab
(
'
show
'
);
setResultToEditors
(
tabID
,
result
,
queryParams
,
queryInfo
);
}
if
(
saveHistory
)
saveQueryHistory
(
queryInfo
,
queryParams
);
};
export
const
clarifyTabID
=
function
(
sessionKey
=
Helper
.
strSessionUsedTabIDs
)
{
let
result
=
1
;
let
tabIDArray
=
Session
.
get
(
sessionKey
);
if
(
tabIDArray
==
undefined
||
tabIDArray
.
length
==
0
)
{
tabIDArray
=
[
result
];
Session
.
set
(
sessionKey
,
tabIDArray
);
return
result
;
}
result
=
tabIDArray
[
tabIDArray
.
length
-
1
]
+
1
;
tabIDArray
.
push
(
result
);
Session
.
set
(
sessionKey
,
tabIDArray
);
return
result
;
};
export
const
setAllTabsInactive
=
function
()
{
$
(
'
#resultTabContents
'
).
each
(
function
()
{
const
otherTab
=
$
(
this
);
otherTab
.
removeClass
(
'
active
'
);
if
(
otherTab
.
find
(
'
#divActiveJsonEditor
'
).
length
!=
0
)
{
// set all tabs different IDs to prevent setting result to existing editor.
const
uniqueID
=
new
Date
().
getTime
();
otherTab
.
find
(
'
#divActiveJsonEditor
'
).
attr
(
'
id
'
,
'
divActiveJsonEditor-
'
+
uniqueID
);
otherTab
.
find
(
'
#activeJsonEditor
'
).
attr
(
'
id
'
,
'
activeJsonEditor-
'
+
uniqueID
);
otherTab
.
find
(
'
#divActiveAceEditor
'
).
attr
(
'
id
'
,
'
divActiveAceEditor-
'
+
uniqueID
);
otherTab
.
find
(
'
#activeAceEditor
'
).
attr
(
'
id
'
,
'
activeAceEditor-
'
+
uniqueID
);
}
});
};
export
const
setResultToEditors
=
function
(
tabID
,
result
,
queryParams
,
queryInfo
)
{
// set json editor
getEditor
(
tabID
).
set
(
result
);
// set ace
AceEditor
.
instance
(
'
activeAceEditor
'
,
{
mode
:
'
javascript
'
,
theme
:
'
dawn
'
},
function
(
editor
)
{
editor
.
$blockScrolling
=
Infinity
;
editor
.
setOptions
({
fontSize
:
'
12pt
'
,
showPrintMargin
:
false
});
editor
.
setValue
(
JSON
.
stringify
(
result
,
null
,
'
\t
'
),
-
1
);
});
const
activeTab
=
$
(
'
#tab-
'
+
tabID
);
// cache query data
activeTab
.
data
(
'
query
'
,
{
queryInfo
:
queryInfo
,
queryParams
:
queryParams
});
// cache find data for save button
if
(
queryInfo
===
'
find
'
)
{
activeTab
.
data
(
'
findData
'
,
result
);
}
};
export
const
getResultTabContent
=
function
(
tabID
,
defaultView
)
{
const
jsonEditorHtml
=
'
<div class="tab-pane fade in active" id="tab-
'
+
tabID
+
'
">
'
+
'
<div id="divActiveJsonEditor" class="form-group">
'
+
'
<div id="activeJsonEditor" style="width: 100%;height:500px" class="col-lg-12">
'
+
'
</div> </div>
'
+
'
<div id="divActiveAceEditor" class="form-group" style="display: none">
'
+
'
<div class="col-lg-12">
'
+
'
<pre id="activeAceEditor" style="height: 500px"></pre>
'
+
'
</div> </div> </div>
'
;
const
aceEditorHtml
=
'
<div class="tab-pane fade in active" id="tab-
'
+
tabID
+
'
">
'
+
'
<div id="divActiveJsonEditor" class="form-group" style="display:none;">
'
+
'
<div id="activeJsonEditor" style="width: 100%;height:500px" class="col-lg-12">
'
+
'
</div> </div>
'
+
'
<div id="divActiveAceEditor" class="form-group">
'
+
'
<div class="col-lg-12">
'
+
'
<pre id="activeAceEditor" style="height: 500px"></pre>
'
+
'
</div> </div> </div>
'
;
const
whichIsDisplayed
=
getWhichResultViewShowing
();
let
result
;
if
(
whichIsDisplayed
===
'
none
'
)
{
let
defaultIsAce
=
(
defaultView
!==
'
Jsoneditor
'
);
if
(
!
defaultIsAce
)
{
result
=
jsonEditorHtml
;
}
else
{
result
=
aceEditorHtml
;
}
}
else
{
if
(
whichIsDisplayed
===
'
jsonEditor
'
)
{
result
=
jsonEditorHtml
;
}
else
{
result
=
aceEditorHtml
;
}
}
return
result
;
};
const
init
=
function
()
{
let
cmb
=
$
(
'
#cmbQueries
'
);
cmb
.
append
(
$
(
"
<optgroup id='optGroupCollectionQueries' label='Collection Queries'></optgroup>
"
));
...
...
@@ -148,6 +311,7 @@ const init = function () {
clearQueryIfAdmin
();
};
const
clearQueryIfAdmin
=
function
()
{
$
.
each
(
Enums
.
ADMIN_QUERY_TYPES
,
function
(
key
,
value
)
{
if
(
value
===
Session
.
get
(
Helper
.
strSessionSelectedQuery
))
{
...
...
@@ -157,65 +321,6 @@ const clearQueryIfAdmin = function () {
});
};
export
const
initExecuteQuery
=
function
()
{
// loading button
Ladda
.
create
(
document
.
querySelector
(
'
#btnExecuteQuery
'
)).
start
();
};
export
const
setQueryResult
=
function
(
result
,
queryInfo
,
queryParams
,
saveHistory
)
{
const
jsonEditor
=
$
(
'
#divActiveJsonEditor
'
);
const
aceEditor
=
$
(
'
#divActiveAceEditor
'
);
const
settings
=
Settings
.
findOne
();
if
(
jsonEditor
.
css
(
'
display
'
)
==
'
none
'
&&
aceEditor
.
css
(
'
display
'
)
==
'
none
'
)
{
// there's only one tab, set results
if
(
settings
.
defaultResultView
==
'
Jsoneditor
'
)
{
jsonEditor
.
show
(
'
slow
'
);
}
else
{
aceEditor
.
show
(
'
slow
'
);
}
setResultToEditors
(
1
,
result
,
queryParams
,
queryInfo
);
}
else
{
// close all if setting for single tab is enabled
const
resultTabs
=
$
(
'
#resultTabs
'
);
if
(
settings
.
singleTabResultSets
)
{
resultTabs
.
find
(
'
li
'
).
each
(
function
(
idx
,
li
)
{
let
select
=
$
(
li
);
$
(
select
.
children
(
'
a
'
).
attr
(
'
href
'
)).
remove
();
select
.
remove
();
});
$
(
'
#divBrowseCollectionFooter
'
).
hide
();
$
(
'
#divBrowseCollectionFindFooter
'
).
hide
();
}
// open a new tab
const
tabID
=
clarifyTabID
();
const
tabContent
=
getResultTabContent
(
tabID
,
settings
.
defaultResultView
,
queryInfo
);
const
tabTitle
=
queryInfo
+
"
-
"
+
Session
.
get
(
Helper
.
strSessionSelectedCollection
);
setAllTabsInactive
();
// set tab href
resultTabs
.
append
(
$
(
'
<li><a href="#tab-
'
+
tabID
+
'
" data-toggle="tab"><i class="fa fa-book"></i>
'
+
tabTitle
+
'
<button class="close" type="button" title="Close">×</button></a></li>
'
));
// set tab content
$
(
'
#resultTabContents
'
).
append
(
tabContent
);
// show last tab
const
lastTab
=
resultTabs
.
find
(
'
a:last
'
);
lastTab
.
tab
(
'
show
'
);
setResultToEditors
(
tabID
,
result
,
queryParams
,
queryInfo
);
}
if
(
saveHistory
)
saveQueryHistory
(
queryInfo
,
queryParams
);
};
const
getWhichResultViewShowing
=
function
()
{
const
jsonViews
=
$
(
'
div[id^="divActiveJsonEditor"]
'
);
const
aceViews
=
$
(
'
div[id^="divActiveAceEditor"]
'
);
...
...
@@ -250,111 +355,6 @@ const saveQueryHistory = function (queryInfo, queryParams) {
});
};
const
setResultToEditors
=
function
(
tabID
,
result
,
queryParams
,
queryInfo
)
{
// set json editor
getEditor
(
tabID
).
set
(
result
);
// set ace
AceEditor
.
instance
(
'
activeAceEditor
'
,
{
mode
:
'
javascript
'
,
theme
:
'
dawn
'
},
function
(
editor
)
{
editor
.
$blockScrolling
=
Infinity
;
editor
.
setOptions
({
fontSize
:
'
12pt
'
,
showPrintMargin
:
false
});
editor
.
setValue
(
JSON
.
stringify
(
result
,
null
,
'
\t
'
),
-
1
);
});
const
activeTab
=
$
(
'
#tab-
'
+
tabID
);
// cache query data
activeTab
.
data
(
'
query
'
,
{
queryInfo
:
queryInfo
,
queryParams
:
queryParams
});
// cache find data for save button
if
(
queryInfo
===
'
find
'
)
{
activeTab
.
data
(
'
findData
'
,
result
);
}
};
const
clarifyTabID
=
function
()
{
let
result
=
1
;
let
tabIDArray
=
Session
.
get
(
Helper
.
strSessionUsedTabIDs
);
if
(
tabIDArray
==
undefined
||
tabIDArray
.
length
==
0
)
{
tabIDArray
=
[
result
];
Session
.
set
(
Helper
.
strSessionUsedTabIDs
,
tabIDArray
);
return
result
;
}
result
=
tabIDArray
[
tabIDArray
.
length
-
1
]
+
1
;
tabIDArray
.
push
(
result
);
Session
.
set
(
Helper
.
strSessionUsedTabIDs
,
tabIDArray
);
return
result
;
};
const
setAllTabsInactive
=
function
()
{
$
(
'
#resultTabContents
'
).
each
(
function
()
{
const
otherTab
=
$
(
this
);
otherTab
.
removeClass
(
'
active
'
);
if
(
otherTab
.
find
(
'
#divActiveJsonEditor
'
).
length
!=
0
)
{
// set all tabs different IDs to prevent setting result to existing editor.
const
uniqueID
=
new
Date
().
getTime
();
otherTab
.
find
(
'
#divActiveJsonEditor
'
).
attr
(
'
id
'
,
'
divActiveJsonEditor-
'
+
uniqueID
);
otherTab
.
find
(
'
#activeJsonEditor
'
).
attr
(
'
id
'
,
'
activeJsonEditor-
'
+
uniqueID
);
otherTab
.
find
(
'
#divActiveAceEditor
'
).
attr
(
'
id
'
,
'
divActiveAceEditor-
'
+
uniqueID
);
otherTab
.
find
(
'
#activeAceEditor
'
).
attr
(
'
id
'
,
'
activeAceEditor-
'
+
uniqueID
);
}
});
};
const
getResultTabContent
=
function
(
tabID
,
defaultView
)
{
const
jsonEditorHtml
=
'
<div class="tab-pane fade in active" id="tab-
'
+
tabID
+
'
">
'
+
'
<div id="divActiveJsonEditor" class="form-group">
'
+
'
<div id="activeJsonEditor" style="width: 100%;height:500px" class="col-lg-12">
'
+
'
</div> </div>
'
+
'
<div id="divActiveAceEditor" class="form-group" style="display: none">
'
+
'
<div class="col-lg-12">
'
+
'
<pre id="activeAceEditor" style="height: 500px"></pre>
'
+
'
</div> </div> </div>
'
;
const
aceEditorHtml
=
'
<div class="tab-pane fade in active" id="tab-
'
+
tabID
+
'
">
'
+
'
<div id="divActiveJsonEditor" class="form-group" style="display:none;">
'
+
'
<div id="activeJsonEditor" style="width: 100%;height:500px" class="col-lg-12">
'
+
'
</div> </div>
'
+
'
<div id="divActiveAceEditor" class="form-group">
'
+
'
<div class="col-lg-12">
'
+
'
<pre id="activeAceEditor" style="height: 500px"></pre>
'
+
'
</div> </div> </div>
'
;
const
whichIsDisplayed
=
getWhichResultViewShowing
();
let
result
;
if
(
whichIsDisplayed
===
'
none
'
)
{
let
defaultIsAce
=
(
defaultView
!==
'
Jsoneditor
'
);
if
(
!
defaultIsAce
)
{
result
=
jsonEditorHtml
;
}
else
{
result
=
aceEditorHtml
;
}
}
else
{
if
(
whichIsDisplayed
===
'
jsonEditor
'
)
{
result
=
jsonEditorHtml
;
}
else
{
result
=
aceEditorHtml
;
}
}
return
result
;
};
const
getEditor
=
function
(
tabID
)
{
const
tabView
=
$
(
'
#tab-
'
+
tabID
);
if
(
!
tabView
.
data
(
'
jsoneditor
'
))
{
...
...
client/stylesheets/main.css
浏览文件 @
d0847e40
...
...
@@ -20,7 +20,7 @@ tr.selected {
top
:
0
;
}
#btnManageRoles
,
#btnEditUser
,
#btnManageUsers
,
#btnExecuteAggregatePipeline
,
#btnExportQueryResult
,
#btnClearShell
,
#btnRefreshStoredFunctions
,
#btnShowShellHistories
{
#btnManageRoles
,
#btnEditUser
,
#btnManageUsers
,
#btnExecuteAggregatePipeline
,
#btnExportQueryResult
,
#btnClearShell
,
#btnRefreshStoredFunctions
,
#btnShowShellHistories
,
#btnAggregateHistory
{
margin-bottom
:
0
!important
;
}
...
...
lib/imports/enums.js
浏览文件 @
d0847e40
...
...
@@ -5,6 +5,7 @@ let Enums = function () {
this
.
LOCAL_STORAGE_KEYS
=
{
MONGO_BINARY_INFO
:
'
mongoclient-mongo-binary-warn
'
,
SHELL_COMMAND_HISTORY
:
'
mongoclient-shell-history
'
,
AGGREGATE_COMMAND_HISTORY
:
'
mongoclient-aggregate-history
'
,
MONGOCLIENT_SKIN
:
'
mongoclient-skin
'
};
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录