Commit 66b7b5b2 authored by James Long's avatar James Long Committed by Commit Bot

[Lorenz] Update UI of selected node details panel

Instead of displaying below the "general details" section, the class and
package-specific node details have now been moved up and placed in the
same list layout as the general details, making the panel more uniform.
Icons have also been added beside all links, the same as the favicon for
the page, to indicate that the links take you to a different graph.

Bug: 1102546
Change-Id: Ib05b35b7108685dad3cb5f0a87841302fa061e73
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2349983
Commit-Queue: James Long <yjlong@google.com>
Reviewed-by: default avatarMohamed Heikal <mheikal@chromium.org>
Reviewed-by: default avatarSamuel Huang <huangs@chromium.org>
Cr-Commit-Position: refs/heads/master@{#797399}
parent bd020ae1
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
"eslint": "^7.2.0", "eslint": "^7.2.0",
"eslint-config-google": "^0.14.0", "eslint-config-google": "^0.14.0",
"eslint-plugin-vue": "^7.0.0-alpha.9", "eslint-plugin-vue": "^7.0.0-alpha.9",
"file-loader": "^6.0.0",
"html-webpack-plugin": "^4.3.0", "html-webpack-plugin": "^4.3.0",
"http-server": "^0.12.3", "http-server": "^0.12.3",
"style-loader": "^1.2.1", "style-loader": "^1.2.1",
......
...@@ -3,24 +3,36 @@ ...@@ -3,24 +3,36 @@
found in the LICENSE file. --> found in the LICENSE file. -->
<template> <template>
<div <MdList class="md-double-line details-list">
v-if="selectedClass !== null" <MdListItem>
class="class-details-panel"> <div class="list-item-entry">
<LinkToGraph <!-- Ideally this is the first element under .md-list-item-text for a
:filter="[selectedClass.packageName]" double-line layout, but vue-material doesn't recognize this
:graph-type="PagePathName.PACKAGE" component. Therefore it's pulled outside, and a placeholder <span/>
:text="'View ' + selectedClass.packageName"/> is added so the second line would be properly styled. -->
<div v-if="selectedClass.buildTargets.length > 0"> <LinkToGraph
<div>Class buildtarget(s):</div> :filter="[selectedClass.packageName]"
<ul> :graph-type="PagePathName.PACKAGE"
<li :text="selectedClass.packageName"/>
v-for="buildTarget in selectedClass.buildTargets" <div class="md-list-item-text">
:key="buildTarget"> <span/>
{{ buildTarget }} <span>Package Graph URL</span>
</li> </div>
</ul> </div>
</div> </MdListItem>
</div> <MdListItem v-if="selectedClass.buildTargets.length > 0">
<div class="md-list-item-text">
<ul class="buildtarget-list">
<li
v-for="buildTarget in selectedClass.buildTargets"
:key="buildTarget">
{{ buildTarget }}
</li>
</ul>
<span>Build Targets</span>
</div>
</MdListItem>
</MdList>
</template> </template>
<script> <script>
...@@ -43,3 +55,17 @@ const ClassDetailsPanel = { ...@@ -43,3 +55,17 @@ const ClassDetailsPanel = {
export default ClassDetailsPanel; export default ClassDetailsPanel;
</script> </script>
<style scoped>
.buildtarget-list {
padding-left: 0;
}
.details-list {
padding: 0;
}
.list-item-entry {
width: 100%;
}
</style>
...@@ -73,9 +73,10 @@ ...@@ -73,9 +73,10 @@
<GraphSelectedNodeDetails <GraphSelectedNodeDetails
:selected-node-details-data="pageModel.selectedNodeDetailsData" :selected-node-details-data="pageModel.selectedNodeDetailsData"
@[CUSTOM_EVENTS.DETAILS_CHECK_NODE]="filterAddOrCheckNode" @[CUSTOM_EVENTS.DETAILS_CHECK_NODE]="filterAddOrCheckNode"
@[CUSTOM_EVENTS.DETAILS_UNCHECK_NODE]="filterUncheckNode"/> @[CUSTOM_EVENTS.DETAILS_UNCHECK_NODE]="filterUncheckNode">
<ClassDetailsPanel <ClassDetailsPanel
:selected-class="pageModel.selectedNodeDetailsData.selectedNode"/> :selected-class="pageModel.selectedNodeDetailsData.selectedNode"/>
</GraphSelectedNodeDetails>
</div> </div>
</div> </div>
</template> </template>
...@@ -270,13 +271,6 @@ const ClassGraphPage = { ...@@ -270,13 +271,6 @@ const ClassGraphPage = {
export default ClassGraphPage; export default ClassGraphPage;
</script> </script>
<style>
.user-input-group {
display: flex;
flex-direction: column;
}
</style>
<style scoped> <style scoped>
#title { #title {
padding: 10px; padding: 10px;
...@@ -300,7 +294,7 @@ export default ClassGraphPage; ...@@ -300,7 +294,7 @@ export default ClassGraphPage;
flex-direction: column; flex-direction: column;
flex-grow: 0; flex-grow: 0;
overflow-y: scroll; overflow-y: scroll;
padding: 0 20px; padding: 0 20px 20px 20px;
width: 30vw; width: 30vw;
} }
......
...@@ -94,13 +94,6 @@ const GraphFilterItems = { ...@@ -94,13 +94,6 @@ const GraphFilterItems = {
export default GraphFilterItems; export default GraphFilterItems;
</script> </script>
<style>
#filter-list .md-list-item-content {
min-height: 0;
padding: 0;
}
</style>
<style scoped> <style scoped>
ul { ul {
list-style-type: none; list-style-type: none;
...@@ -126,6 +119,11 @@ ul { ...@@ -126,6 +119,11 @@ ul {
overflow-y: scroll; overflow-y: scroll;
} }
#filter-list >>> .md-list-item-content {
min-height: 0;
padding: 0;
}
#controls { #controls {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
......
...@@ -5,24 +5,9 @@ ...@@ -5,24 +5,9 @@
<template> <template>
<div class="selected-node-details"> <div class="selected-node-details">
<template v-if="selectedNode !== null"> <template v-if="selectedNode !== null">
<MdList class="md-double-line"> <div class="md-title selected-node-title">
<MdListItem> {{ selectedNode.displayName }}
<div class="md-list-item-text"> </div>
<span class="selected-node-details-text">
{{ selectedNode.id }}
</span>
<span>Name</span>
</div>
</MdListItem>
<MdListItem>
<div class="md-list-item-text">
<span class="selected-node-details-text">
{{ selectedNode.displayName }}
</span>
<span>Display Name</span>
</div>
</MdListItem>
</MdList>
<MdButton <MdButton
v-if="selectedNode.visualizationState.selectedByFilter" v-if="selectedNode.visualizationState.selectedByFilter"
class="md-primary md-raised md-dense" class="md-primary md-raised md-dense"
...@@ -35,6 +20,17 @@ ...@@ -35,6 +20,17 @@
@click="checkNodeInFilter"> @click="checkNodeInFilter">
Add/check in filter Add/check in filter
</MdButton> </MdButton>
<MdList class="md-double-line details-list">
<MdListItem>
<div class="md-list-item-text">
<span class="selected-node-details-text">
{{ selectedNode.id }}
</span>
<span>Full Name</span>
</div>
</MdListItem>
</MdList>
<slot/>
</template> </template>
<div v-else> <div v-else>
(Click a node for more details.) (Click a node for more details.)
...@@ -72,8 +68,15 @@ export default GraphSelectedNodeDetails; ...@@ -72,8 +68,15 @@ export default GraphSelectedNodeDetails;
flex-direction: column; flex-direction: column;
} }
.selected-node-details-text{ .details-list {
display: inline-block; padding: 0;
}
.selected-node-title {
word-wrap: break-word;
}
.selected-node-details-text {
white-space: normal; white-space: normal;
width: 100%; width: 100%;
word-wrap: break-word; word-wrap: break-word;
......
...@@ -3,12 +3,23 @@ ...@@ -3,12 +3,23 @@
found in the LICENSE file. --> found in the LICENSE file. -->
<template> <template>
<a :href="url">{{ text }}</a> <a
class="link-to-graph-container"
:href="url">
<img
class="link-to-graph-icon"
:src="GraphIcon">
<div class="link-to-graph-text">
{{ text }}
</div>
</a>
</template> </template>
<script> <script>
import {UrlProcessor, URL_PARAM_KEYS} from '../url_processor.js'; import {UrlProcessor, URL_PARAM_KEYS} from '../url_processor.js';
import GraphIcon from '../assets/graph_icon.png';
// @vue/component // @vue/component
const LinkToGraph = { const LinkToGraph = {
props: { props: {
...@@ -17,6 +28,7 @@ const LinkToGraph = { ...@@ -17,6 +28,7 @@ const LinkToGraph = {
text: String, text: String,
}, },
computed: { computed: {
GraphIcon: () => GraphIcon,
url: function() { url: function() {
const urlProcessor = UrlProcessor.createForOutput(); const urlProcessor = UrlProcessor.createForOutput();
urlProcessor.appendArray(URL_PARAM_KEYS.FILTER_NAMES, this.filter); urlProcessor.appendArray(URL_PARAM_KEYS.FILTER_NAMES, this.filter);
...@@ -27,3 +39,23 @@ const LinkToGraph = { ...@@ -27,3 +39,23 @@ const LinkToGraph = {
export default LinkToGraph; export default LinkToGraph;
</script> </script>
<style scoped>
.link-to-graph-container {
align-items: center;
display: flex;
flex-direction: row;
}
.link-to-graph-icon {
height: 24px;
margin-right: 10px;
width: 24px;
}
.link-to-graph-text {
min-width: 0;
white-space: normal;
word-wrap: break-word;
}
</style>
...@@ -3,24 +3,49 @@ ...@@ -3,24 +3,49 @@
found in the LICENSE file. --> found in the LICENSE file. -->
<template> <template>
<div <MdList class="md-double-line details-list">
v-if="selectedPackage !== null" <MdListItem>
class="package-details-panel"> <div class="list-item-entry">
<LinkToGraph <!-- Ideally this is the first element under .md-list-item-text for a
:filter="packageClassNames" double-line layout, but vue-material doesn't recognize this
:graph-type="PagePathName.CLASS" component. Therefore it's pulled outside, and a placeholder <span/>
text="Class graph with all classes in this package"/> is added so the second line would be properly styled. -->
<ul>
<li
v-for="classObj in packageClassObjects"
:key="classObj.name">
<LinkToGraph <LinkToGraph
:filter="[classObj.name]" :filter="packageClassNames"
:graph-type="PagePathName.CLASS" :graph-type="PagePathName.CLASS"
:text="classObj.shortName"/> :text="selectedPackage.displayName"/>
</li> <div class="md-list-item-text">
</ul> <span/>
</div> <span>Full Class Graph URL</span>
</div>
</div>
</MdListItem>
<MdListItem>
<div class="list-item-entry">
<!-- Ideally this is the first element under .md-list-item-text for a
double-line layout, but vue-material doesn't recognize this
component. Therefore it's pulled outside, and a placeholder <span/>
is added so the second line would be properly styled. -->
<MdList
id="class-list"
class="md-scrollbar">
<MdListItem
v-for="classObj in packageClassObjects"
:key="classObj.name">
<LinkToGraph
class="class-list-entry"
:filter="[classObj.name]"
:graph-type="PagePathName.CLASS"
:text="classObj.shortName"/>
</MdListItem>
</MdList>
<div class="md-list-item-text">
<span/>
<span>Individual Class Graph URLs</span>
</div>
</div>
</MdListItem>
</MdList>
</template> </template>
<script> <script>
...@@ -57,10 +82,27 @@ export default PackageDetailsPanel; ...@@ -57,10 +82,27 @@ export default PackageDetailsPanel;
</script> </script>
<style scoped> <style scoped>
.package-details-panel { #class-list {
max-height: 400px; max-height: 300px;
min-height: 200px;
overflow-y: scroll; overflow-y: scroll;
overflow-x: hidden; }
#class-list >>> .md-list-item-content {
min-height: 0;
padding: 0;
}
.class-list-entry {
width: 100%;
}
.details-list {
padding: 0;
}
.list-item-entry {
display: flex;
flex-direction: column;
width: 100%;
} }
</style> </style>
...@@ -68,9 +68,10 @@ ...@@ -68,9 +68,10 @@
<GraphSelectedNodeDetails <GraphSelectedNodeDetails
:selected-node-details-data="pageModel.selectedNodeDetailsData" :selected-node-details-data="pageModel.selectedNodeDetailsData"
@[CUSTOM_EVENTS.DETAILS_CHECK_NODE]="filterAddOrCheckNode" @[CUSTOM_EVENTS.DETAILS_CHECK_NODE]="filterAddOrCheckNode"
@[CUSTOM_EVENTS.DETAILS_UNCHECK_NODE]="filterUncheckNode"/> @[CUSTOM_EVENTS.DETAILS_UNCHECK_NODE]="filterUncheckNode">
<PackageDetailsPanel <PackageDetailsPanel
:selected-package="pageModel.selectedNodeDetailsData.selectedNode"/> :selected-package="pageModel.selectedNodeDetailsData.selectedNode"/>
</GraphSelectedNodeDetails>
</div> </div>
</div> </div>
</template> </template>
...@@ -270,7 +271,7 @@ export default PackageGraphPage; ...@@ -270,7 +271,7 @@ export default PackageGraphPage;
flex-direction: column; flex-direction: column;
flex-grow: 0; flex-grow: 0;
overflow-y: scroll; overflow-y: scroll;
padding: 0 20px; padding: 0 20px 20px 20px;
width: 30vw; width: 30vw;
} }
......
...@@ -61,6 +61,10 @@ module.exports = { ...@@ -61,6 +61,10 @@ module.exports = {
test: /\.css$/, test: /\.css$/,
use: ['vue-style-loader', 'style-loader', 'css-loader'], use: ['vue-style-loader', 'style-loader', 'css-loader'],
}, },
{
test: /\.(png|svg|jpg|gif)$/,
use: 'file-loader',
},
], ],
}, },
plugins: [ plugins: [
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment