DSS-5869 Adds search and advanced search feature routes, templates

This commit is contained in:
Seyi Adebajo 2017-02-13 14:11:41 -08:00 committed by Mars Lan
parent 5d8b00b3cd
commit 1de7833d89
5 changed files with 779 additions and 0 deletions

View File

@ -0,0 +1,5 @@
import Ember from 'ember';
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
export default Ember.Route.extend(AuthenticatedRouteMixin, {
})

View File

@ -0,0 +1,64 @@
import Ember from 'ember';
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
export default Ember.Route.extend(AuthenticatedRouteMixin, {
queryParams: {
category: {
refreshModel: true
},
keywords: {
refreshModel: true
},
source: {
refreshModel: true
},
page: {
refreshModel: true
}
},
model: function (params) {
this.controller.set('loading', true);
var q;
if (params) {
q = params;
}
else {
q = convertQueryStringToObject();
}
var keyword = atob(q.keywords);
var url = 'api/v1/search' + '?page=' + params.page + "&keyword=" + keyword;
if (q.category) {
url += ("&category=" + q.category.toLowerCase());
currentTab = q.category.toProperCase();
updateActiveTab();
}
if (q.source) {
url += '&source=' + q.source;
}
$.get(url, data => {
if (data && data.status == "ok") {
var result = data.result;
var keywords = result.keywords;
window.g_currentCategory = result.category;
updateSearchCategories(result.category);
for (var index = 0; index < result.data.length; index++) {
var schema = result.data[index].schema;
if (schema) {
result.data[index].originalSchema = schema;
highlightResults(result.data, index, keyword);
}
}
this.controller.set('model', result);
this.controller.set('keyword', keyword);
this.controller.set('isMetric', false);
if (result.data.length > 0) {
this.controller.set('showNoResult', false);
} else {
this.controller.set('showNoResult', true);
}
this.controller.set('loading', false)
}
});
}
});

View File

@ -0,0 +1,109 @@
<div id="pagedSearchResults">
<div class="row">
<div class="col-xs-12">
{{#if model.count}}
<div class="search-pagination">
<ul class="pager">
{{#unless first}}
<li class="previous">
{{#link-to 'advsearch' (query-params page=previousPage)}}
&larr; Prev
{{/link-to}}
</li>
{{/unless}}
<li>
{{ model.count }} results - page {{ model.page }} of {{ model.totalPages }}
</li>
{{#unless last}}
<li class="next">
{{#link-to 'advsearch' (query-params page=nextPage)}}
Next &rarr;
{{/link-to}}
</li>
{{/unless}}
</ul>
</div>
{{/if}}
{{#if loading}}
<div class="row">
<div class="col-xs-12 text-center">
<i
class="fa fa-spinner spinning fa-4x"
></i>
</div>
</div>
{{/if}}
{{#if model.count}}
{{#if model.isFlowJob}}
<table id="searchresults" class="search-results searchtable">
<tbody>
{{#each model.data as |flowJob|}}
<tr class="result">
<td class="col-xs-12">
<div class="dataset-info">
<i class="fa fa-random"></i>
<a href="{{flowJob.link}}">
{{flowJob.displayName}}
</a>
</div>
<p>
{{{ flowJob.path }}}
</p>
<p>source: {{{ flowJob.appCode }}}</p>
<div class="schematext" style="margin-top:5px;margin-bottom: 10px;">
{{{ flowJob.schema }}}
</div>
</td>
</tr>
{{/each}}
</tbody>
</table>
{{else}}
<table id="searchresults" class="search-results searchtable">
<tbody>
{{#each model.data as |dataset|}}
<tr class="result">
<td class="col-xs-12">
<div class="dataset-info">
{{#if model.isMetrics}}
<i class="fa fa-plus-square-o"></i>
{{#link-to 'metric' dataset.id}}
{{{dataset.name}}}
{{/link-to}}
{{else}}
<i class="fa fa-database"></i>
{{#link-to 'dataset' dataset.id}}
{{{dataset.name}}}
{{/link-to}}
{{/if}}
</div>
<p>{{{ dataset.urn }}}</p>
{{#if model.isMetrics}}
{{#if dataset.source}}
<p>source: {{{ dataset.source }}}</p>
{{else}}
<p>source: Metric</p>
{{/if}}
{{else}}
<p>source: {{{ dataset.source }}}</p>
{{/if}}
<div class="schematext" style="margin-top:5px;margin-bottom: 10px;">
{{{ dataset.schema }}}
</div>
</td>
</tr>
{{/each}}
</tbody>
</table>
{{/if}}
{{else}}
{{#if showNoResult}}
<h4>No items found</h4>
{{/if}}
{{/if}}
</div>
<div class="col-xs-12">
{{outlet}}
</div>
</div>
</div>

View File

@ -0,0 +1,413 @@
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<h3 class="modal-title" id="myModalLabel">Advanced Search</h3>
</div>
<div class="modal-body advSearch">
<ul id="advsearchtabs" class="nav nav-tabs">
<li id="datasetAdvSearchLink"><a data-toggle="tab" href="#datasetAdvTab">Datasets</a></li>
<li><a data-toggle="tab" href="#metricAdvtab">Metrics</a></li>
<li><a data-toggle="tab" href="#flowAdvtab">Flows</a></li>
</ul>
<div class="tab-content">
<div id="datasetAdvTab" class="tab-pane">
<div class="row">
<div class="col-md-10 rightPartialBorder">
<div class="row">
<div class="col-md-12">
<div class="control-group col-md-12">
<label class="control-label">Scope</label>
<div class="controls">
<div class="row">
<div class="col-xs-3 text-right">
In
</div>
<div class="col-xs-9">
<input
id="scopeInInput"
class="scopeInput"
placeholder="<db_name>, <top_level_dir>"
title="Scope can be database schema name or top level HDFS directory which is used to narrow down the search range"
style="width: 100%;">
</div>
</div>
<div class="row">
<div class="col-xs-3 text-right">
Not In
</div>
<div class="col-xs-9">
<input
id="scopeNotInInput"
class="scopeInput"
placeholder="<db_name_to_exclude>"
title="Scope can be database schema name or top level HDFS directory which is used to narrow down the search range"
style="width: 100%;">
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12">
<div class="control-group col-md-12">
<label class="control-label">Table</label>
<div class="controls">
<div class="row">
<div class="col-xs-3 text-right">
In
</div>
<div class="col-xs-9">
<input
id="tableInInput"
class="tableInput"
placeholder="<table_name>, <view_name>"
style="width: 100%;">
</div>
</div>
<div class="row">
<div class="col-xs-3 text-right">
Not In
</div>
<div class="col-xs-9">
<input
id="tableNotInInput"
class="tableInput"
placeholder="<table_name_to_exclude>"
style="width: 100%;">
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="form-group col-md-12">
<label class="control-label">Fields</label>
<div class="controls">
<div class="row">
<div class="col-xs-3 text-right">
Contains Any
</div>
<div class="col-xs-9">
<input
id="fieldAnyInput"
class="fieldInput"
placeholder="<partial_field_name>"
style="width: 100%;">
</div>
</div>
<div class="row">
<div class="col-xs-3 text-right">
Contains All
</div>
<div class="col-xs-9">
<input
id="fieldAllInput"
class="fieldInput"
placeholder="<field_name_1>, <field_name_2>"
style="width: 100%;">
</div>
</div>
<div class="row">
<div class="col-xs-3 text-right">
Doesn't Contain
</div>
<div class="col-xs-9">
<input
id="fieldNotInInput"
class="fieldInput"
placeholder="<field_name_to_exclude>"
style="width: 100%;">
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12">
<div class="form-group col-md-12">
<label class="control-label">Comments</label>
<div class="controls">
<div class="row">
<div class="col-xs-3 text-right">
Contains
</div>
<div class="col-xs-9">
<input
id="commentsInput"
type="text"
placeholder="<phrase_in_comment>"
class="col-md-4 form-control"/>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="advSearchSource" class="col-md-2">
<h4>Sources</h4>
</div>
</div>
</div>
<div id="metricAdvtab" class="tab-pane">
<div class="row">
<div class="col-md-12 rightPartialBorder">
<div class="row">
<div class="col-md-12">
<div class="control-group col-md-12">
<label class="control-label">Dashboard Name</label>
<div class="controls">
<div class="row">
<div class="col-xs-3 text-right">
In
</div>
<div class="col-xs-9">
<input
id="dashInInput"
class="dashInput"
placeholder="<dashboard1>, <dashboard2>"
title="Dashboard Name"
style="width: 100%;">
</div>
</div>
<div class="row">
<div class="col-xs-3 text-right">
Not In
</div>
<div class="col-xs-9">
<input
id="dashNotInInput"
class="dashInput"
placeholder="<dashboard_to_exclude>"
title="Dashboard Name"
style="width: 100%;">
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12">
<div class="control-group col-md-12">
<label class="control-label">Metric Group</label>
<div class="controls">
<div class="row">
<div class="col-xs-3 text-right">
In
</div>
<div class="col-xs-9">
<input
id="groupInInput"
class="groupInput"
placeholder="<group1>, <group2>"
title="Metric Group"
style="width: 100%;">
</div>
</div>
<div class="row">
<div class="col-xs-3 text-right">
Not In
</div>
<div class="col-xs-9">
<input
id="groupNotInInput"
class="groupInput"
placeholder="<group_to_exclude>"
title="Metric Group"
style="width: 100%;">
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12">
<div class="control-group col-md-12">
<label class="control-label">Metric Category</label>
<div class="controls">
<div class="row">
<div class="col-xs-3 text-right">
In
</div>
<div class="col-xs-9">
<input
id="categoryInInput"
class="categoryInput"
placeholder="<category1>, <category2>"
title="Metric Category"
style="width: 100%;">
</div>
</div>
<div class="row">
<div class="col-xs-3 text-right">
Not In
</div>
<div class="col-xs-9">
<input
id="categoryNotInInput"
class="categoryInput"
placeholder="<category_to_exclude>"
title="Metric Category"
style="width: 100%;">
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12">
<div class="control-group col-md-12">
<label class="control-label">Metric Name</label>
<div class="controls">
<div class="row">
<div class="col-xs-3 text-right">
In
</div>
<div class="col-xs-9">
<input
id="metricnameInInput"
class="metricnameInput"
placeholder="<metric1>, <metric2>"
title="Metric"
style="width: 100%;">
</div>
</div>
<div class="row">
<div class="col-xs-3 text-right">
Not In
</div>
<div class="col-xs-9">
<input
id="metricnameNotInInput"
class="metricnameInput"
placeholder="<metric_to_exclude>"
title="Metric"
style="width: 100%;">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="flowAdvtab" class="tab-pane">
<div class="row">
<div class="col-md-12 rightPartialBorder">
<div class="row">
<div class="col-md-12">
<div class="control-group col-md-12">
<label class="control-label">Cluster</label>
<div class="controls">
<div class="row">
<div class="col-xs-3 text-right">
In
</div>
<div class="col-xs-9">
<input
id="appcodeInInput"
class="appcodeInput"
placeholder="<cluster1>, <cluster2>"
title="Cluster"
style="width: 100%;">
</div>
</div>
<div class="row">
<div class="col-xs-3 text-right">
Not In
</div>
<div class="col-xs-9">
<input
id="appcodeNotInInput"
class="appcodeInput"
placeholder="<cluster_to_exclude>"
title="Cluster"
style="width: 100%;">
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12">
<div class="control-group col-md-12">
<label class="control-label">Flow Name</label>
<div class="controls">
<div class="row">
<div class="col-xs-3 text-right">
In
</div>
<div class="col-xs-9">
<input
id="flowInInput"
class="flowInput"
placeholder="<flow_name1>, <flow_name2>"
style="width: 100%;">
</div>
</div>
<div class="row">
<div class="col-xs-3 text-right">
Not In
</div>
<div class="col-xs-9">
<input
id="flowNotInInput"
class="flowInput"
placeholder="<flow_name_to_exclude>"
style="width: 100%;">
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12">
<div class="control-group col-md-12">
<label class="control-label">Job Name</label>
<div class="controls">
<div class="row">
<div class="col-xs-3 text-right">
In
</div>
<div class="col-xs-9">
<input
id="jobInInput"
class="jobInput"
placeholder="<job_name1>, <job_name2>"
style="width: 100%;">
</div>
</div>
<div class="row">
<div class="col-xs-3 text-right">
Not In
</div>
<div class="col-xs-9">
<input
id="jobNotInInput"
class="jobInput"
placeholder="<job_name_to_exclude>"
style="width: 100%;">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button"
id="advSearchBtn"
data-dismiss="modal"
class="btn btn-primary">
Search
</button>
<button type="button" id="advSearchResetBtn" class="btn btn-default">Reset</button>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,188 @@
<div class="btn-group" role="group">
<p style="display:inline;float:left;margin-right:5px;margin-top:6px;"><b>Filter By:</b></p>
<div class="btn-group" role="group">
<button type="button"
class="btn dropdown-toggle {{if isDatasets 'btn-primary'}} {{unless isDatasets 'btn-default'}}"
data-toggle="dropdown"
aria-expanded="false">
{{datasetTitle}}
<span class="caret"></span>
</button>
<ul class="dropdown-menu" role="menu">
<li>
{{#link-to 'search' (query-params category="Datasets" source="all" page=1)}}
All
{{/link-to}}
</li>
<li>
{{#link-to 'search' (query-params category="Datasets" source="HDFS" page=1)}}
HDFS
{{/link-to}}
</li>
<li>
{{#link-to 'search' (query-params category="Datasets" source="Oracle" page=1)}}
Oracle
{{/link-to}}
</li>
<li>
{{#link-to 'search' (query-params category="Datasets" source="Teradata" page=1)}}
Teradata
{{/link-to}}
</li>
<li>
{{#link-to 'search' (query-params category="Datasets" source="Espresso" page=1)}}
Espresso
{{/link-to}}
</li>
<li>
{{#link-to 'search' (query-params category="Datasets" source="Salesforce" page=1)}}
Salesforce
{{/link-to}}
</li>
<li>
{{#link-to 'search' (query-params category="Datasets" source="Kafka" page=1)}}
Kafka
{{/link-to}}
</li>
<li>
{{#link-to 'search' (query-params category="Datasets" source="Pinot" page=1)}}
Pinot
{{/link-to}}
</li>
<li>
{{#link-to 'search' (query-params category="Datasets" source="Hive" page=1)}}
Hive
{{/link-to}}
</li>
<li>
{{#link-to 'search' (query-params category="Datasets" source="External" page=1)}}
External
{{/link-to}}
</li>
</ul>
</div>
<button type="button"
class="btn {{if isComments 'btn-primary'}} {{unless isComments 'btn-default'}}"
{{action 'switchSearchToComments' keyword}}>
Comments
</button>
<button type="button"
class="btn {{if isMetrics 'btn-primary'}} {{unless isMetrics 'btn-default'}}"
{{action 'switchSearchToMetric' keyword}}>
Metrics
</button>
<button type="button"
class="btn {{if isFlows 'btn-primary'}} {{unless isFlows 'btn-default'}}"
{{action 'switchSearchToFlow' keyword}}>
Flows
</button>
<button type="button"
class="btn {{if isJobs 'btn-primary'}} {{unless isJobs 'btn-default'}}"
{{action 'switchSearchToJob' keyword}}>
Jobs
</button>
</div>
<div id="pagedSearchResults">
<div class="row">
<div class="col-xs-12">
{{#if model.count}}
<div class="search-pagination">
<ul class="pager">
{{#unless first}}
<li class="previous">
{{#link-to 'search' (query-params categroy=category source=source page=previousPage)}}
&larr; Prev
{{/link-to}}
</li>
{{/unless}}
<li>
{{ model.count }} results - page {{ model.page }} of {{ model.totalPages }}
</li>
{{#unless last}}
<li class="next">
{{#link-to 'search' (query-params categroy=category source=source page=nextPage)}}
Next &rarr;
{{/link-to}}
</li>
{{/unless}}
</ul>
</div>
{{/if}}
{{#if loading}}
<div class="row">
<div class="col-xs-12 text-center">
<i class="fa fa-spinner spinning fa-4x"></i>
</div>
</div>
{{/if}}
{{#if model.count}}
{{#if model.isFlowJob}}
<table id="searchresults" class="search-results searchtable">
<tbody>
{{#each model.data as |flowJob|}}
<tr class="result">
<td class="col-xs-12">
<div class="dataset-info">
<i class="fa fa-random"></i>
<a href="{{flowJob.link}}">
{{flowJob.displayName}}
</a>
</div>
<p>{{ flowJob.path }}</p>
<p>source: {{ flowJob.appCode }}</p>
<div class="schematext" style="margin-top:5px;margin-bottom: 10px;">
{{ flowJob.schema }}
</div>
</td>
</tr>
{{/each}}
</tbody>
</table>
{{else}}
<table id="searchresults" class="search-results searchtable">
<tbody>
{{#each model.data as |dataset|}}
<tr class="result">
<td class="col-xs-12">
<div class="dataset-info">
{{#if model.isMetrics}}
<i class="fa fa-plus-square-o"></i>
{{#link-to 'metrics.metric' dataset.id}}
{{{dataset.name}}}
{{/link-to}}
{{else}}
<i class="fa fa-database"></i>
{{#link-to 'dataset' dataset.id}}
{{{dataset.name}}}
{{/link-to}}
{{/if}}
</div>
<p>
{{{ dataset.urn }}}
</p>
{{#if dataset.source}}
<p>source: {{{ dataset.source }}}</p>
{{else}}
<p>source: Metric</p>
{{/if}}
<div class="schematext" style="margin-top:5px;margin-bottom: 10px;">
{{{ dataset.schema }}}
</div>
</td>
</tr>
{{/each}}
</tbody>
</table>
{{/if}}
{{else}}
{{#if showNoResult}}
<h4>No items found</h4>
{{/if}}
{{/if}}
</div>
<div class="col-xs-12">
{{outlet}}
</div>
</div>
</div>