mirror of
https://github.com/datahub-project/datahub.git
synced 2025-12-25 17:08:29 +00:00
implement the list view for dataset and flow
This commit is contained in:
parent
7f8705bad6
commit
806972755c
@ -18,6 +18,7 @@ import com.fasterxml.jackson.databind.node.ArrayNode;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
import models.DatasetColumn;
|
||||
import models.DatasetDependency;
|
||||
import models.DatasetListViewNode;
|
||||
import models.ImpactDataset;
|
||||
import play.api.libs.json.JsValue;
|
||||
import play.libs.Json;
|
||||
@ -759,4 +760,14 @@ public class Dataset extends Controller
|
||||
result.put("depends", Json.toJson(depends));
|
||||
return ok(result);
|
||||
}
|
||||
|
||||
public static Result getDatasetListNodes()
|
||||
{
|
||||
ObjectNode result = Json.newObject();
|
||||
String urn = request().getQueryString("urn");
|
||||
result.put("status", "ok");
|
||||
result.put("nodes", Json.toJson(DatasetsDAO.getDatasetListViewNodes(urn)));
|
||||
return ok(result);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -214,4 +214,31 @@ public class Flow extends Controller
|
||||
result.set("data", FlowsDAO.getPagedJobsByFlow(application, project, flowId, page, size));
|
||||
return ok(result);
|
||||
}
|
||||
|
||||
public static Result getFlowListViewClusters()
|
||||
{
|
||||
ObjectNode result = Json.newObject();
|
||||
|
||||
result.put("status", "ok");
|
||||
result.set("nodes", Json.toJson(FlowsDAO.getFlowListViewClusters()));
|
||||
return ok(result);
|
||||
}
|
||||
|
||||
public static Result getFlowListViewProjects(String application)
|
||||
{
|
||||
ObjectNode result = Json.newObject();
|
||||
|
||||
result.put("status", "ok");
|
||||
result.set("nodes", Json.toJson(FlowsDAO.getFlowListViewProjects(application)));
|
||||
return ok(result);
|
||||
}
|
||||
|
||||
public static Result getFlowListViewFlows(String application, String project)
|
||||
{
|
||||
ObjectNode result = Json.newObject();
|
||||
|
||||
result.put("status", "ok");
|
||||
result.set("nodes", Json.toJson(FlowsDAO.getFlowListViewFlows(application, project)));
|
||||
return ok(result);
|
||||
}
|
||||
}
|
||||
|
||||
@ -319,6 +319,17 @@ public class DatasetsDAO extends AbstractMySQLOpenSourceDAO
|
||||
"mapped_object_type, mapped_object_sub_type, mapped_object_name " +
|
||||
"FROM cfg_object_name_map WHERE object_dataset_id = ?";
|
||||
|
||||
private final static String GET_DATASET_LISTVIEW_TOP_LEVEL_NODES = "SELECT DISTINCT " +
|
||||
"SUBSTRING_INDEX(urn, ':///', 1) as name, 0 as id, " +
|
||||
"concat(SUBSTRING_INDEX(urn, ':///', 1), ':///') as urn FROM dict_dataset order by 1";
|
||||
|
||||
private final static String GET_DATASET_LISTVIEW_NODES_BY_URN = "SELECT distinct " +
|
||||
"SUBSTRING_INDEX(SUBSTRING_INDEX(d.urn, ?, -1), '/', 1) as name, " +
|
||||
"concat(?, SUBSTRING_INDEX(SUBSTRING_INDEX(d.urn, ?, -1), '/', 1)) as urn, " +
|
||||
"s.id FROM dict_dataset d LEFT JOIN dict_dataset s " +
|
||||
"ON s.urn = concat(?, SUBSTRING_INDEX(SUBSTRING_INDEX(d.urn, ?, -1), '/', 1)) " +
|
||||
"WHERE d.urn LIKE ? ORDER BY d.name";
|
||||
|
||||
public static List<String> getDatasetOwnerTypes()
|
||||
{
|
||||
return getJdbcTemplate().queryForList(GET_DATASET_OWNER_TYPES, String.class);
|
||||
@ -1764,4 +1775,43 @@ public class DatasetsDAO extends AbstractMySQLOpenSourceDAO
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static List<DatasetListViewNode> getDatasetListViewNodes(String urn) {
|
||||
|
||||
List<DatasetListViewNode> nodes = new ArrayList<DatasetListViewNode>();
|
||||
List<Map<String, Object>> rows = null;
|
||||
|
||||
if (StringUtils.isBlank(urn)) {
|
||||
rows = getJdbcTemplate().queryForList(
|
||||
GET_DATASET_LISTVIEW_TOP_LEVEL_NODES);
|
||||
} else {
|
||||
rows = getJdbcTemplate().queryForList(
|
||||
GET_DATASET_LISTVIEW_NODES_BY_URN,
|
||||
urn,
|
||||
urn,
|
||||
urn,
|
||||
urn,
|
||||
urn,
|
||||
urn + "%");
|
||||
}
|
||||
|
||||
for (Map row : rows) {
|
||||
|
||||
DatasetListViewNode node = new DatasetListViewNode();
|
||||
node.datasetId = (Long) row.get(DatasetWithUserRowMapper.DATASET_ID_COLUMN);
|
||||
node.nodeName = (String) row.get(DatasetWithUserRowMapper.DATASET_NAME_COLUMN);
|
||||
String nodeUrn = (String) row.get(DatasetWithUserRowMapper.DATASET_URN_COLUMN);
|
||||
if (node.datasetId !=null && node.datasetId > 0)
|
||||
{
|
||||
node.nodeUrl = "#/datasets/" + node.datasetId;
|
||||
}
|
||||
else
|
||||
{
|
||||
node.nodeUrl = "#/datasets/name/" + node.nodeName + "/page/1?urn=" + nodeUrn;
|
||||
}
|
||||
nodes.add(node);
|
||||
}
|
||||
|
||||
return nodes;
|
||||
}
|
||||
}
|
||||
|
||||
@ -88,6 +88,17 @@ public class FlowsDAO extends AbstractMySQLOpenSourceDAO
|
||||
"WHERE (f.is_active is null or f.is_active = 'Y') and ca.app_code = ? " +
|
||||
"and f.flow_group is null ORDER BY f.flow_name";
|
||||
|
||||
private final static String GET_FLOW_LIST_VIEW_CLUSTER_NODES = "SELECT DISTINCT f.app_id, a.app_code " +
|
||||
"FROM flow f JOIN cfg_application a ON f.app_id = a.app_id ORDER BY a.app_code";
|
||||
|
||||
private final static String GET_FLOW_LIST_VIEW_PROJECT_NODES = "SELECT DISTINCT f.flow_group, " +
|
||||
"a.app_id, a.app_code FROM flow f JOIN cfg_application a ON f.app_id = a.app_id " +
|
||||
"WHERE a.app_code = ? ORDER BY f.flow_group";
|
||||
|
||||
private final static String GET_FLOW_LIST_VIEW_FLOW_NODES = "SELECT DISTINCT f.flow_name, f.flow_group, " +
|
||||
"f.flow_id, a.app_id, a.app_code FROM flow f JOIN cfg_application a ON f.app_id = a.app_id " +
|
||||
"WHERE a.app_code = ? and f.flow_group = ? order by f.flow_name";
|
||||
|
||||
public static Integer getApplicationIDByName(String applicationName)
|
||||
{
|
||||
Integer applicationId = 0;
|
||||
@ -567,4 +578,66 @@ public class FlowsDAO extends AbstractMySQLOpenSourceDAO
|
||||
result.set("jobs", Json.toJson(""));
|
||||
return result;
|
||||
}
|
||||
|
||||
public static List<FlowListViewNode> getFlowListViewClusters()
|
||||
{
|
||||
List<FlowListViewNode> nodes = new ArrayList<FlowListViewNode>();
|
||||
List<Map<String, Object>> rows = null;
|
||||
|
||||
rows = getJdbcTemplate().queryForList(
|
||||
GET_FLOW_LIST_VIEW_CLUSTER_NODES);
|
||||
for (Map row : rows) {
|
||||
|
||||
FlowListViewNode node = new FlowListViewNode();
|
||||
node.application = (String) row.get(FlowRowMapper.APP_CODE_COLUMN);
|
||||
node.nodeName = node.application;
|
||||
node.nodeUrl = "#/flows/" + node.nodeName + "/page/1";
|
||||
nodes.add(node);
|
||||
}
|
||||
return nodes;
|
||||
}
|
||||
|
||||
public static List<FlowListViewNode> getFlowListViewProjects(String application)
|
||||
{
|
||||
List<FlowListViewNode> nodes = new ArrayList<FlowListViewNode>();
|
||||
List<Map<String, Object>> rows = null;
|
||||
|
||||
rows = getJdbcTemplate().queryForList(
|
||||
GET_FLOW_LIST_VIEW_PROJECT_NODES,
|
||||
application);
|
||||
for (Map row : rows) {
|
||||
|
||||
FlowListViewNode node = new FlowListViewNode();
|
||||
node.application = (String) row.get(FlowRowMapper.APP_CODE_COLUMN);
|
||||
node.project = (String) row.get(FlowRowMapper.FLOW_GROUP_COLUMN);
|
||||
node.nodeName = node.project;
|
||||
node.nodeUrl = "#/flows/" + node.application + "/" + node.project + "/page/1";
|
||||
nodes.add(node);
|
||||
}
|
||||
return nodes;
|
||||
}
|
||||
|
||||
public static List<FlowListViewNode> getFlowListViewFlows(String application, String project)
|
||||
{
|
||||
List<FlowListViewNode> nodes = new ArrayList<FlowListViewNode>();
|
||||
List<Map<String, Object>> rows = null;
|
||||
|
||||
rows = getJdbcTemplate().queryForList(
|
||||
GET_FLOW_LIST_VIEW_FLOW_NODES,
|
||||
application,
|
||||
project);
|
||||
for (Map row : rows) {
|
||||
|
||||
FlowListViewNode node = new FlowListViewNode();
|
||||
node.application = (String) row.get(FlowRowMapper.APP_CODE_COLUMN);
|
||||
node.project = (String) row.get(FlowRowMapper.FLOW_GROUP_COLUMN);
|
||||
node.flow = (String) row.get(FlowRowMapper.FLOW_NAME_COLUMN);
|
||||
node.nodeName = node.flow;
|
||||
node.flowId = (Long)row.get(FlowRowMapper.FLOW_ID_COLUMN);
|
||||
node.nodeUrl = "#/flows/" + node.application + "/"
|
||||
+ node.project + "/" + Long.toString(node.flowId) + '/' + "/page/1";
|
||||
nodes.add(node);
|
||||
}
|
||||
return nodes;
|
||||
}
|
||||
}
|
||||
|
||||
21
web/app/models/DatasetListViewNode.java
Normal file
21
web/app/models/DatasetListViewNode.java
Normal file
@ -0,0 +1,21 @@
|
||||
/**
|
||||
* Copyright 2015 LinkedIn Corp. All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
*/
|
||||
package models;
|
||||
|
||||
public class DatasetListViewNode {
|
||||
|
||||
public Long datasetId;
|
||||
public String nodeName;
|
||||
public String nodeUrl;
|
||||
}
|
||||
24
web/app/models/FlowListViewNode.java
Normal file
24
web/app/models/FlowListViewNode.java
Normal file
@ -0,0 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 LinkedIn Corp. All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
*/
|
||||
package models;
|
||||
|
||||
public class FlowListViewNode {
|
||||
|
||||
public String application;
|
||||
public String nodeName;
|
||||
public String nodeUrl;
|
||||
public String project;
|
||||
public String flow;
|
||||
public Long flowId;
|
||||
}
|
||||
@ -3,20 +3,27 @@
|
||||
<div>
|
||||
<div id="mainSplitter">
|
||||
<div id="tabSplitter">
|
||||
<ul id="menutabs" class="nav nav-tabs category-header">
|
||||
<div class="btn-group" role="group" aria-label="Toggle List/Tree View">
|
||||
<button id="listviewbtn" type="button" class="btn btn-primary">List View</button>
|
||||
<button id="treeviewbtn" type="button" class="btn btn-default">Tree View</button>
|
||||
</div>
|
||||
<ul id="menutabs" style="display:none" class="nav nav-tabs category-header">
|
||||
<li>
|
||||
<a data-toggle="tab" href="#filtertab">Datasets</a>
|
||||
</li>
|
||||
<li><a data-toggle="tab" href="#flowtab">Flows</a></li>
|
||||
</ul>
|
||||
<div class="tab-content">
|
||||
<div>
|
||||
<input placeholder="Filter By" style="width:100%;display: none;">
|
||||
</div>
|
||||
<div id="filtertab" class="tab-pane">
|
||||
<div id="tree2" data-source="ajax" class="sampletree">
|
||||
</div>
|
||||
<div id="datasetlist" class="list-group"></div>
|
||||
<div id="tree2" data-source="ajax" class="sampletree" style="display: none;"></div>
|
||||
</div>
|
||||
<div id="flowtab" class="tab-pane">
|
||||
<div id="tree3" data-source="ajax" class="sampletree">
|
||||
</div>
|
||||
<div id="flowlist" class="list-group"></div>
|
||||
<div id="tree3" data-source="ajax" class="sampletree" style="display: none;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -105,6 +112,24 @@
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
{{#unless detailview}}
|
||||
<div class="well well-sm">
|
||||
<div class="row">
|
||||
<div class="col-xs-6 pull-right">
|
||||
<ul class="breadcrumbs">
|
||||
{{#each breadcrumbs as |crumb|}}
|
||||
<li>
|
||||
<a
|
||||
title="{{crumb.title}}"
|
||||
href="#/datasets/{{crumb.urn}}"
|
||||
>
|
||||
{{crumb.title}}
|
||||
</a>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="search-pagination">
|
||||
<ul class="pager">
|
||||
{{#unless first}}
|
||||
@ -140,40 +165,6 @@
|
||||
</div>
|
||||
{{/unless}}
|
||||
{{#unless detailview}}
|
||||
<div class="well well-sm">
|
||||
<div class="row">
|
||||
<div class="col-xs-10">
|
||||
<ul class="breadcrumbs">
|
||||
{{#each breadcrumbs as |crumb|}}
|
||||
<li>
|
||||
<a
|
||||
title="{{crumb.title}}"
|
||||
href="#/datasets/{{crumb.urn}}"
|
||||
>
|
||||
{{crumb.title}}
|
||||
</a>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-xs-2 text-right">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-primary btn-sm pull-right"
|
||||
{{action 'watchUrn' urn}}
|
||||
>
|
||||
<i
|
||||
{{bind-attr class=":fa urnWatched:fa-eye-slash:fa-eye"}}
|
||||
></i>
|
||||
{{#if urnWatched}}
|
||||
Unwatch
|
||||
{{else}}
|
||||
Watch
|
||||
{{/if}}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table
|
||||
class="table table-bordered search-results"
|
||||
style="word-break: break-all;">
|
||||
@ -740,6 +731,21 @@
|
||||
|
||||
<script type="text/x-handlebars" id="dataset">
|
||||
<div id="dataset" >
|
||||
<div class="well well-sm">
|
||||
<div class="row">
|
||||
<div class="col-xs-6 pull-right">
|
||||
<ul class="breadcrumbs">
|
||||
{{#each breadcrumbs as |crumb|}}
|
||||
<li>
|
||||
<a title="{{crumb.title}}" href="#/datasets/{{crumb.urn}}">
|
||||
{{crumb.title}}
|
||||
</a>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-5">
|
||||
<h3>{{ model.name }}</h3>
|
||||
@ -802,21 +808,6 @@
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="well well-sm">
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<ul class="breadcrumbs">
|
||||
{{#each breadcrumbs as |crumb|}}
|
||||
<li>
|
||||
<a title="{{crumb.title}}" href="#/datasets/{{crumb.urn}}">
|
||||
{{crumb.title}}
|
||||
</a>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{#if tabview}}
|
||||
@ -1051,7 +1042,7 @@
|
||||
{{#unless detailview}}
|
||||
<div class="well well-sm">
|
||||
<div class="row">
|
||||
<div class="col-xs-10">
|
||||
<div class="col-xs-6 pull-right">
|
||||
<ul class="breadcrumbs">
|
||||
{{#each breadcrumbs as |crumb|}}
|
||||
<li>
|
||||
@ -1062,19 +1053,6 @@
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-xs-2 text-right">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-primary btn-sm pull-right"
|
||||
{{action 'watchUrn' urn}}>
|
||||
<i {{bind-attr class=":fa urnWatched:fa-eye-slash:fa-eye"}}></i>
|
||||
{{#if urnWatched}}
|
||||
Unwatch
|
||||
{{else}}
|
||||
Watch
|
||||
{{/if}}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -1435,6 +1413,21 @@
|
||||
<div id="pagedProjects" >
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<div class="well well-sm">
|
||||
<div class="row">
|
||||
<div class="col-xs-6 pull-right">
|
||||
<ul class="breadcrumbs">
|
||||
{{#each breadcrumbs as |crumb|}}
|
||||
<li>
|
||||
<a title="{{crumb.title}}" href="#/flows/{{crumb.urn}}">
|
||||
{{crumb.title}}
|
||||
</a>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="search-pagination">
|
||||
<ul class="pager">
|
||||
{{#unless first}}
|
||||
@ -1456,34 +1449,6 @@
|
||||
{{/unless}}
|
||||
</ul>
|
||||
</div>
|
||||
<div class="well well-sm">
|
||||
<div class="row">
|
||||
<div class="col-xs-10">
|
||||
<ul class="breadcrumbs">
|
||||
{{#each breadcrumbs as |crumb|}}
|
||||
<li>
|
||||
<a title="{{crumb.title}}" href="#/flows/{{crumb.urn}}">
|
||||
{{crumb.title}}
|
||||
</a>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-xs-2 text-right">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-primary btn-sm pull-right"
|
||||
{{action 'watchUrn' urn}}>
|
||||
<i {{bind-attr class=":fa urnWatched:fa-eye-slash:fa-eye"}}></i>
|
||||
{{#if urnWatched}}
|
||||
Unwatch
|
||||
{{else}}
|
||||
Watch
|
||||
{{/if}}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table class="table table-bordered search-results">
|
||||
<thead>
|
||||
<tr class="results-header">
|
||||
@ -1515,6 +1480,21 @@
|
||||
<div id="pagedFlows" >
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<div class="well well-sm">
|
||||
<div class="row">
|
||||
<div class="col-xs-6 pull-right">
|
||||
<ul class="breadcrumbs">
|
||||
{{#each breadcrumbs as |crumb|}}
|
||||
<li>
|
||||
<a title="{{crumb.title}}" href="#/flows/{{crumb.urn}}">
|
||||
{{crumb.title}}
|
||||
</a>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="search-pagination">
|
||||
<ul class="pager">
|
||||
{{#unless first}}
|
||||
@ -1536,34 +1516,6 @@
|
||||
{{/unless}}
|
||||
</ul>
|
||||
</div>
|
||||
<div class="well well-sm">
|
||||
<div class="row">
|
||||
<div class="col-xs-10">
|
||||
<ul class="breadcrumbs">
|
||||
{{#each breadcrumbs as |crumb|}}
|
||||
<li>
|
||||
<a title="{{crumb.title}}" href="#/flows/{{crumb.urn}}">
|
||||
{{crumb.title}}
|
||||
</a>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-xs-2 text-right">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-primary btn-sm pull-right"
|
||||
{{action 'watchUrn' urn}}>
|
||||
<i {{bind-attr class=":fa urnWatched:fa-eye-slash:fa-eye"}}></i>
|
||||
{{#if urnWatched}}
|
||||
Unwatch
|
||||
{{else}}
|
||||
Watch
|
||||
{{/if}}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table class="table table-bordered search-results">
|
||||
<thead>
|
||||
<tr class="results-header">
|
||||
@ -1614,6 +1566,21 @@
|
||||
<div id="pagedJobs" class="container-fluid">
|
||||
<div class="row-fluid">
|
||||
<div class="span9">
|
||||
<div class="well well-sm">
|
||||
<div class="row">
|
||||
<div class="col-xs-6 pull-right">
|
||||
<ul class="breadcrumbs">
|
||||
{{#each breadcrumbs as |crumb|}}
|
||||
<li>
|
||||
<a title="{{crumb.title}}" href="#/flows/{{crumb.urn}}">
|
||||
{{crumb.title}}
|
||||
</a>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-7">
|
||||
<h3> {{ model.data.flow }}</h3>
|
||||
@ -1641,21 +1608,6 @@
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="well well-sm">
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<ul class="breadcrumbs">
|
||||
{{#each breadcrumbs as |crumb|}}
|
||||
<li>
|
||||
<a title="{{crumb.title}}" href="#/flows/{{crumb.urn}}">
|
||||
{{crumb.title}}
|
||||
</a>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="search-pagination">
|
||||
<ul class="pager">
|
||||
{{#unless first}}
|
||||
|
||||
@ -43,6 +43,14 @@ GET /api/v1/party/groups controllers.api.v1.User.getAllGroups
|
||||
|
||||
GET /api/v1/autocomplete/search controllers.api.v1.Search.getSearchAutoComplete()
|
||||
|
||||
GET /api/v1/list/datasets controllers.api.v1.Dataset.getDatasetListNodes()
|
||||
|
||||
GET /api/v1/list/flows controllers.api.v1.Flow.getFlowListViewClusters()
|
||||
|
||||
GET /api/v1/list/flows/:application controllers.api.v1.Flow.getFlowListViewProjects(application:String)
|
||||
|
||||
GET /api/v1/list/flows/:application/:project controllers.api.v1.Flow.getFlowListViewFlows(application:String, project:String)
|
||||
|
||||
GET /api/v1/datasets controllers.api.v1.Dataset.getPagedDatasets()
|
||||
|
||||
GET /api/v1/datasets/:id controllers.api.v1.Dataset.getDatasetByID(id:Int)
|
||||
|
||||
@ -65,6 +65,32 @@
|
||||
var splitterResize = false;
|
||||
var skipResize = false;
|
||||
|
||||
$('#listviewbtn').click(function(){
|
||||
$('#listviewbtn').removeClass('btn-primary');
|
||||
$('#listviewbtn').removeClass('btn-default');
|
||||
$('#treeviewbtn').removeClass('btn-primary');
|
||||
$('#treeviewbtn').removeClass('btn-default');
|
||||
$('#listviewbtn').addClass('btn-primary');
|
||||
$('#treeviewbtn').addClass('btn-default');
|
||||
$('#tree2').hide();
|
||||
$('#tree3').hide();
|
||||
$('#datasetlist').show();
|
||||
$('#flowlist').show();
|
||||
});
|
||||
|
||||
$('#treeviewbtn').click(function(){
|
||||
$('#listviewbtn').removeClass('btn-primary');
|
||||
$('#listviewbtn').removeClass('btn-default');
|
||||
$('#treeviewbtn').removeClass('btn-primary');
|
||||
$('#treeviewbtn').removeClass('btn-default');
|
||||
$('#listviewbtn').addClass('btn-default');
|
||||
$('#treeviewbtn').addClass('btn-primary');
|
||||
$('#datasetlist').hide();
|
||||
$('#flowlist').hide();
|
||||
$('#tree2').show();
|
||||
$('#tree3').show();
|
||||
});
|
||||
|
||||
$(window).resize(function() {
|
||||
if (skipResize)
|
||||
return;
|
||||
@ -205,3 +231,59 @@ String.prototype.toProperCase = function(){
|
||||
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase()
|
||||
})
|
||||
}
|
||||
|
||||
function renderDatasetListView(nodes, name)
|
||||
{
|
||||
var template = '<a href="$URL" class="list-group-item">$NODE_NAME</a>';
|
||||
var activeTemplate = '<a href="$URL" class="active list-group-item">$NODE_NAME</a>';
|
||||
var obj = $('#datasetlist');
|
||||
if (!obj)
|
||||
return;
|
||||
obj.empty();
|
||||
var activeObj;
|
||||
for(var i = 0; i < nodes.length; i++)
|
||||
{
|
||||
if (name && name == nodes[i].nodeName)
|
||||
{
|
||||
obj.append(activeTemplate.replace('$NODE_NAME', nodes[i].nodeName).replace("$URL", nodes[i].nodeUrl));
|
||||
}
|
||||
else
|
||||
{
|
||||
obj.append(template.replace('$NODE_NAME', nodes[i].nodeName).replace("$URL", nodes[i].nodeUrl));
|
||||
}
|
||||
}
|
||||
if (activeObj)
|
||||
{
|
||||
var scrollToActiveNode = function() {
|
||||
$("#tabSplitter").scrollTo(activeObj, 800)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function renderFlowListView(nodes, flowId)
|
||||
{
|
||||
var template = '<a href="$URL" class="list-group-item">$NODE_NAME</a>';
|
||||
var activeTemplate = '<a href="$URL" class="active list-group-item">$NODE_NAME</a>';
|
||||
var obj = $('#flowlist');
|
||||
if (!obj)
|
||||
return;
|
||||
obj.empty();
|
||||
var activeObj;
|
||||
for(var i = 0; i < nodes.length; i++)
|
||||
{
|
||||
if (flowId && flowId == nodes[i].flowId)
|
||||
{
|
||||
activeObj = obj.append(activeTemplate.replace('$NODE_NAME', nodes[i].nodeName).replace("$URL", nodes[i].nodeUrl));
|
||||
}
|
||||
else
|
||||
{
|
||||
obj.append(template.replace('$NODE_NAME', nodes[i].nodeName).replace("$URL", nodes[i].nodeUrl));
|
||||
}
|
||||
}
|
||||
if (activeObj)
|
||||
{
|
||||
var scrollToActiveNode = function() {
|
||||
$("#tabSplitter").scrollTo(activeObj, 800)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -148,6 +148,12 @@ App.DatasetsRoute = Ember.Route.extend({
|
||||
},
|
||||
actions: {
|
||||
getDatasets: function(){
|
||||
var listUrl = 'api/v1/list/datasets';
|
||||
$.get(listUrl, function(data) {
|
||||
if (data && data.status == "ok"){
|
||||
renderDatasetListView(data.nodes);
|
||||
}
|
||||
});
|
||||
var url = 'api/v1/datasets?size=10&page=' + datasetController.get('model.data.page');
|
||||
currentTab = 'Datasets';
|
||||
updateActiveTab();
|
||||
@ -171,12 +177,14 @@ App.DatasetRoute = Ember.Route.extend({
|
||||
var id = 0;
|
||||
var source = '';
|
||||
var urn = '';
|
||||
var name = '';
|
||||
controller.set("hasProperty", false);
|
||||
if(params && params.id)
|
||||
{
|
||||
id = params.id;
|
||||
source = params.source;
|
||||
urn = params.urn;
|
||||
name = params.name;
|
||||
datasetController.set("detailview", true);
|
||||
if (params.originalSchema)
|
||||
{
|
||||
@ -191,11 +199,27 @@ App.DatasetRoute = Ember.Route.extend({
|
||||
id = params.dataset.id;
|
||||
source = params.dataset.source;
|
||||
urn = params.dataset.urn;
|
||||
name = params.dataset.name;
|
||||
controller.set('model', params.dataset);
|
||||
datasetController.set("detailview", true);
|
||||
}
|
||||
}
|
||||
|
||||
if (urn)
|
||||
{
|
||||
var index = urn.lastIndexOf('/');
|
||||
if (index != -1)
|
||||
{
|
||||
var listUrl = 'api/v1/list/datasets?urn=' + urn.substring(0, index+1);
|
||||
$.get(listUrl, function(data) {
|
||||
if (data && data.status == "ok"){
|
||||
console.log(name);
|
||||
renderDatasetListView(data.nodes, name);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (datasetCommentsComponent)
|
||||
{
|
||||
datasetCommentsComponent.getComments();
|
||||
@ -217,7 +241,7 @@ App.DatasetRoute = Ember.Route.extend({
|
||||
if( i === 0) {
|
||||
breadcrumbs.push({
|
||||
title: b[i],
|
||||
urn: "name/" + b[i] + "/page/1?urn=" + b[i]
|
||||
urn: "name/" + b[i] + "/page/1?urn=" + b[i] + ':///'
|
||||
})
|
||||
}
|
||||
else if (i === (b.length -1))
|
||||
@ -532,6 +556,12 @@ App.NameRoute = Ember.Route.extend({
|
||||
},
|
||||
actions: {
|
||||
getDatasets: function(){
|
||||
var listUrl = 'api/v1/list/datasets';
|
||||
$.get(listUrl, function(data) {
|
||||
if (data && data.status == "ok"){
|
||||
renderDatasetListView(data.nodes);
|
||||
}
|
||||
});
|
||||
var url = 'api/v1/datasets?size=10&page=' + datasetController.get('model.data.page');
|
||||
currentTab = 'Datasets';
|
||||
updateActiveTab();
|
||||
@ -548,6 +578,12 @@ App.NameRoute = Ember.Route.extend({
|
||||
|
||||
App.PageRoute = Ember.Route.extend({
|
||||
setupController: function(controller, param) {
|
||||
var listUrl = 'api/v1/list/datasets';
|
||||
$.get(listUrl, function(data) {
|
||||
if (data && data.status == "ok"){
|
||||
renderDatasetListView(data.nodes);
|
||||
}
|
||||
});
|
||||
var url = 'api/v1/datasets?size=10&page=' + param.page;
|
||||
currentTab = 'Datasets';
|
||||
var breadcrumbs = [{"title":"DATASETS_ROOT", "urn":"page/1"}];
|
||||
@ -573,6 +609,12 @@ App.PageRoute = Ember.Route.extend({
|
||||
},
|
||||
actions: {
|
||||
getDatasets: function(){
|
||||
var listUrl = 'api/v1/list/datasets';
|
||||
$.get(listUrl, function(data) {
|
||||
if (data && data.status == "ok"){
|
||||
renderDatasetListView(data.nodes);
|
||||
}
|
||||
});
|
||||
var url = 'api/v1/datasets?size=10&page=' + datasetController.get('model.data.page');
|
||||
currentTab = 'Datasets';
|
||||
updateActiveTab();
|
||||
@ -591,7 +633,27 @@ App.SubpageRoute = Ember.Route.extend({
|
||||
setupController: function(controller, param) {
|
||||
if(!datasetController)
|
||||
return;
|
||||
|
||||
var listUrl = 'api/v1/list/datasets?urn=' + param.urn;
|
||||
var addSlash = false;
|
||||
if (param.urn && (param.urn[param.urn.length-1] != '/'))
|
||||
{
|
||||
addSlash = true;
|
||||
}
|
||||
if (addSlash)
|
||||
{
|
||||
listUrl += '/';
|
||||
}
|
||||
$.get(listUrl, function(data) {
|
||||
if (data && data.status == "ok"){
|
||||
renderDatasetListView(data.nodes);
|
||||
}
|
||||
});
|
||||
var url = 'api/v1/datasets?size=10&page=' + param.page + '&urn=' + param.urn;
|
||||
if (addSlash)
|
||||
{
|
||||
url += '/';
|
||||
}
|
||||
currentTab = 'Datasets';
|
||||
updateActiveTab();
|
||||
var breadcrumbs = [];
|
||||
@ -601,7 +663,7 @@ App.SubpageRoute = Ember.Route.extend({
|
||||
if( i === 0) {
|
||||
breadcrumbs.push({
|
||||
title: b[i],
|
||||
urn: "name/" + b[i] + "/page/1?urn=" + b[i]
|
||||
urn: "name/" + b[i] + "/page/1?urn=" + b[i] + ':///'
|
||||
})
|
||||
} else {
|
||||
var urn = b.slice(0, (i+1)).join('/');
|
||||
@ -612,6 +674,10 @@ App.SubpageRoute = Ember.Route.extend({
|
||||
}
|
||||
}
|
||||
var watcherEndpoint = "/api/v1/urn/watch?urn=" + param.urn;
|
||||
if (addSlash)
|
||||
{
|
||||
watcherEndpoint += '/';
|
||||
}
|
||||
$.get(watcherEndpoint, function(data){
|
||||
if(data.id && data.id !== 0) {
|
||||
datasetController.set('urnWatched', true)
|
||||
|
||||
@ -8,6 +8,12 @@ App.FlowsRoute = Ember.Route.extend({
|
||||
return;
|
||||
}
|
||||
currentTab = 'Flows';
|
||||
var listUrl = 'api/v1/list/flows';
|
||||
$.get(listUrl, function(data) {
|
||||
if (data && data.status == "ok"){
|
||||
renderFlowListView(data.nodes);
|
||||
}
|
||||
});
|
||||
updateActiveTab();
|
||||
var url = 'api/v1/flows?size=10&page=1';
|
||||
var breadcrumbs = [{"title": 'FLOWS_ROOT', "urn": "page/1"}];
|
||||
@ -55,6 +61,12 @@ App.PagedapplicationRoute = Ember.Route.extend({
|
||||
{
|
||||
flowsController.set('isAppworx', false);
|
||||
}
|
||||
var listUrl = 'api/v1/list/flows/' + application;
|
||||
$.get(listUrl, function(data) {
|
||||
if (data && data.status == "ok"){
|
||||
renderFlowListView(data.nodes);
|
||||
}
|
||||
});
|
||||
var url = 'api/v1/flows/' + application + '?size=10&page=' + params.page;
|
||||
$.get(url, function(data) {
|
||||
if (data && data.status == "ok"){
|
||||
@ -108,6 +120,12 @@ App.PagedprojectRoute = Ember.Route.extend({
|
||||
}
|
||||
var project = transition.resolvedModels.project.project;
|
||||
var url = 'api/v1/flows/' + application + '/' + project + '?size=10&page=' + params.page;
|
||||
var listUrl = 'api/v1/list/flows/' + application + '/' + project;
|
||||
$.get(listUrl, function(data) {
|
||||
if (data && data.status == "ok"){
|
||||
renderFlowListView(data.nodes);
|
||||
}
|
||||
});
|
||||
var breadcrumbs = [{"title": application, "urn": application + "/page/1"},
|
||||
{"title": project, "urn": application + "/" + project + "/page/1"}];
|
||||
$.get(url, function(data) {
|
||||
@ -155,6 +173,13 @@ App.PagedflowRoute = Ember.Route.extend({
|
||||
var flow = transition.resolvedModels.flow.flow;
|
||||
var lineageUrl = '/lineage/flow/' + application + '/' + project + '/' + flow;
|
||||
controller.set('lineageUrl', lineageUrl);
|
||||
var listUrl = 'api/v1/list/flows/' + application + '/' + project;
|
||||
console.log(flow);
|
||||
$.get(listUrl, function(data) {
|
||||
if (data && data.status == "ok"){
|
||||
renderFlowListView(data.nodes, flow);
|
||||
}
|
||||
});
|
||||
var url = 'api/v1/flows/' + application + '/' + project + '/' + flow + '?size=10&page=' + params.page;
|
||||
$.get(url, function(data) {
|
||||
if (data && data.status == "ok"){
|
||||
|
||||
@ -42,7 +42,15 @@
|
||||
{
|
||||
if (node.isFolder())
|
||||
{
|
||||
window.location = "#/datasets/name/" + node.title + "/page/1?urn=" + node.data.path;
|
||||
if (node.data.level == 1)
|
||||
{
|
||||
window.location = "#/datasets/name/" + node.title + "/page/1?urn=" + node.data.path + ':///';
|
||||
}
|
||||
else
|
||||
{
|
||||
window.location = "#/datasets/name/" + node.title + "/page/1?urn=" + node.data.path + '/';
|
||||
}
|
||||
|
||||
}
|
||||
else{
|
||||
if (node && node.data && node.data.id)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user