| <!-- |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| --> |
| |
| <div class="query-content" ng-controller="QueryResultCtrl" ng-if="curQuery"> |
| <div> |
| |
| <div class="pull-right"> |
| <span style="color: #808080"> |
| <span>Start Time: {{curQuery.startTime | utcToConfigTimeZone}}</span> |
| <span ng-if="curQuery.result.results">Duration: {{curQuery.result.duration/1000 | number: 2}}s</span> |
| </span> |
| <button class="btn btn-success btn-xs" ng-click="rerun()"> |
| <i class="fa fa-refresh"></i> Rerun |
| </button> |
| <button class="btn btn-grey btn-xs" ng-click="showSavePanel()"> |
| <i class="fa fa-floppy-o"></i> Save |
| </button> |
| </div> |
| |
| <div class="form-group"> |
| <label>Query String</label> |
| <label ng-click="curQuery.result.show=!curQuery.result.show" style="padding:5px"> |
| <i ng-if="!curQuery.result.show" class="fa fa-angle-double-down"></i> |
| <i ng-if="curQuery.result.show" class="fa fa-angle-double-right"></i> |
| </label> |
| <section style="padding-bottom: 20px" ng-if="curQuery.result.show"> |
| <div ui-ace="{ |
| useWrapMode : true, |
| showGutter: true, |
| theme:'chrome', |
| mode: 'sql', |
| onLoad: aceLoaded, |
| onChange: aceChanged |
| }" ng-model="curQuery.sql"></div> |
| </section> |
| </div> |
| |
| <div class="form-group"> |
| <ul class="row"> |
| <li class="col-md-2" style="display: inline"> |
| <label>Status: </label> |
| <span class="label label-lg label-danger arrowed" ng-if="curQuery.status=='failed'">Failed</span> |
| <span class="label label-lg label-success arrowed" ng-if="curQuery.status=='success'">Success</span> |
| <span class="label label-lg label-info" ng-if="curQuery.status=='executing'"> |
| <i class="fa fa-cog fa-spin"></i> Executing...</span> |
| </li> |
| <li class="col-md-2 " style="display: inline"> |
| <label>Project: </label> |
| <span>{{curQuery.project}}</span> |
| </li> |
| <li class="col-md-4 " style="display: inline"> |
| <label>Cubes: </label> |
| <span>{{curQuery.result.cube | limitTo:30}}<span ng-if="curQuery.result.cube.length > 30">... <i class="fa fa-list text-aqua" style="cursor: pointer;" popover-placement="left" popover="{{curQuery.result.cube | formatCubeName}}" popover-title="Cube Info Details"></i></span></span> |
| </li> |
| <li class="col-md-4 " style="display: inline"> |
| <label>Miss: </label> |
| <span>{{getMissInfo(curQuery) | limitTo:30}}<span ng-if="getMissInfo(curQuery).length > 0">... <i class="fa fa-list text-aqua" style="cursor: pointer;" popover-placement="left" popover="{{getMissInfo(curQuery)}}" popover-title="Miss Info Details"></i></span></span> |
| </li> |
| </ul> |
| </div> |
| |
| <div ng-if="curQuery.status!='executing'" ng-class="{true: 'fullscreen-result', false: ''}[ui.fullScreen]" |
| style="{{ui.fullScreen ? 'padding: 40px 40px 0px 40px':''}}"> |
| <label>Results <span style="vertical-align:middle;color: grey;font-size: 15px" |
| ng-if="curQuery.status=='success'">(<strong>{{curQuery.result.results.length}})</strong></span></label> |
| <span ng-if="curQuery.result.partial" class="text-warning"> |
| !Note: Current results are partial, please click 'Show All' button to get all results. |
| <button class="btn btn-success btn-xs" ng-click="reset(curQuery);curQuery.acceptPartial=false;query(curQuery)"> |
| <i class="fa fa-download"></i> |
| Show All |
| </button> |
| </span> |
| <div class="pull-right" ng-if="curQuery.status=='success'"> |
| <button class="btn btn-default btn-xs" ng-click="curQuery.graph.show=!curQuery.graph.show;buildGraphMetadata(curQuery);resetGraph(curQuery)"> |
| <span ng-if="!curQuery.graph.show"><i class="fa fa-bar-chart-o"></i> Visualization</span> |
| <span ng-if="curQuery.graph.show"><i class="fa fa-list-ul"></i> Grid</span> |
| </button> |
| <a class="btn btn-default btn-xs" ng-if="(userService.hasRole('ROLE_ADMIN')&&isAdminExportAllowed)||(!userService.hasRole('ROLE_ADMIN')&&isNonAdminExportAllowed)" href="{{config.service.url}}query/format/csv?sql={{exportSql}}&project={{curQuery.project}}" target="_blank"> |
| <i class="fa fa-cloud-download"></i> Export</a> |
| <a class="btn btn-default btn-xs" ng-click="refreshUi();"> |
| <i ng-class="{true: 'fa fa-compress', false: 'fa fa-expand'}[ui.fullScreen]"></i> |
| </a> |
| </div> |
| |
| <div ng-if="!curQuery.graph.show"> |
| <div class="query-results"> |
| <div ng-if="curQuery.status=='success'"> |
| <div class="gridStyle" ui-grid="curQuery.result.gridOptions" ui-grid-resize-columns ui-grid-grouping |
| ng-if="curQuery.result.results.length > 0" id="data_grid" |
| style="{{ui.fullScreen?'height: 600px;width:auto':'height: 300px'}}"></div> |
| <div ng-if="!curQuery.result.results || curQuery.result.results.length == 0" |
| style="padding-top: 10%"> |
| <div no-result></div> |
| </div> |
| </div> |
| |
| <div ng-if="curQuery.status=='failed'"> |
| <div class="text-danger" style="display: block;white-space: normal"> |
| {{curQuery.result.data.exception}} |
| </div> |
| </div> |
| |
| <div style="width: 100%;padding-top: 5px" ng-if="curQuery.result.hasMore"> |
| <div> |
| <div> |
| <button class="btn btn-default btn-sm" style="float: none;width: 100%" |
| ng-click="loadMore(curQuery)" ng-disabled="curQuery.result.loading"> |
| <i class="icon-plus icon-white"></i> <span>{{ curQuery.result.loading ? 'Loading...' : 'More' }}</span> |
| </button> |
| </div> |
| <div class="clearfix" style="margin: 5px"></div> |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| <div ng-if="curQuery.graph.show" class="row"> |
| <div class="col-xs-4"> |
| <div class="graph_content"> |
| <label>Graph Type</label> |
| <div> |
| <select chosen style="width: 100%;" |
| ng-model="curQuery.graph.type" |
| ng-change="resetGraph(curQuery)" |
| ng-options="type as type.name for type in chartTypes"></select> |
| </div> |
| </div> |
| </div> |
| <div class="col-xs-4"> |
| <div class="graph_content"> |
| <label>Dimensions</label> |
| <div> |
| <select chosen style="width: 100%;" |
| ng-model="curQuery.graph.state.dimensions" ng-change="refreshGraphData(curQuery)" |
| ng-options="dimension as dimension.column.label for dimension in curQuery.graph.meta.dimensions | filter: mappingToChartype"> |
| <option value="">-- choose dimension --</option> |
| </select> |
| </div> |
| </div> |
| </div> |
| <div class="col-xs-4"> |
| <div class="graph_content"> |
| <label>Metrics</label> |
| <div> |
| <select chosen style="width: 100%;" |
| data-placeholder="Select Metrics.." |
| ng-model="curQuery.graph.state.metrics" |
| ng-options="metrics as metrics.column.label for metrics in curQuery.graph.meta.metrics" |
| ng-change="refreshGraphData(curQuery)"> |
| <option value="">-- choose metrics --</option> |
| </select> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div ng-if="curQuery.graph.show" class="row"> |
| <div class="col-xs-12"> |
| <div ng-if="chart"> |
| <nvd3 options="chart.options" data="chart.data"></nvd3> |
| </div> |
| <div ng-if="!chart" style="padding-top: 10%"> |
| <div no-result text="No Graph Generated."></div> |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| <div id="query_content_results" style="padding-top: 10px"></div> |
| </div> |
| </div> |
| |
| <script type="text/ng-template" id="saveQueryModal.html"> |
| <div class="modal-header"> |
| <h4>Save Query</h4> |
| </div> |
| <div class="modal-body"> |
| <form class="form-horizontal" role="form" name="save_query_form"> |
| <div class="form-group"> |
| <label class="col-sm-2 control-label">Project</label> |
| |
| <div class="col-sm-10"> |
| <p class="form-control-static">{{curQuery.project}}</p> |
| </div> |
| </div> |
| <div class="form-group"> |
| <label class="col-sm-2 control-label">Name</label> |
| |
| <div class="col-sm-10"> |
| <input type="text" class="form-control" placeholder="Name.." ng-model="curQuery.name" required> |
| </div> |
| </div> |
| <div class="form-group"> |
| <label class="col-sm-2 control-label">Description</label> |
| |
| <div class="col-sm-10"> |
| <textarea class="form-control" placeholder="Description.." |
| ng-model="curQuery.description"></textarea> |
| </div> |
| </div> |
| </form> |
| </div> |
| <div class="modal-footer"> |
| <button class="btn btn-primary" ng-click="cancel()">Close</button> |
| <button class="btn btn-success" ng-click="saveQuery(curQuery)" ng-disabled="save_query_form.$invalid">Save |
| </button> |
| </div> |
| </script> |