Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Reposition help info button #1823

Closed
wants to merge 36 commits into from
Closed
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
9d9893d
remove explain help from
leiyre Nov 3, 2022
3944977
include styles
leiyre Nov 3, 2022
30b0e2a
include "view-info" button in sidebar
leiyre Nov 3, 2022
a85651a
update test
leiyre Nov 3, 2022
456b3c9
test
leiyre Nov 4, 2022
ff50061
rename prop
leiyre Nov 7, 2022
c383096
refactor duplicated operation
leiyre Nov 7, 2022
c319c07
move template logic to computed
leiyre Nov 7, 2022
dbe92ce
restructure and refactor styles
leiyre Nov 7, 2022
47ad604
use template literals
leiyre Nov 7, 2022
0256a05
replace visibleViewInfo === true by visibleViewInfo
leiyre Nov 7, 2022
f846630
include default value
leiyre Nov 7, 2022
870cdfd
rename computed property
leiyre Nov 7, 2022
ae289ac
include text in modal
leiyre Nov 8, 2022
b248794
lint and update test
leiyre Nov 8, 2022
b98cc1d
prevent undefined component
leiyre Nov 10, 2022
01cedca
refactor modal
leiyre Nov 10, 2022
e9e0e81
include title as prop
leiyre Nov 10, 2022
b7e8b9b
include link class
leiyre Nov 10, 2022
c21bf87
update test
leiyre Nov 10, 2022
9aa0c47
lint
leiyre Nov 10, 2022
e32daf6
update test
leiyre Nov 10, 2022
cfe4e04
add position and remove unused code
leiyre Nov 11, 2022
357cd32
update test
leiyre Nov 11, 2022
4fadc7e
fix position
leiyre Nov 11, 2022
3a2ee71
fix position
leiyre Nov 11, 2022
5861307
remove record-counter and include records word in the pagination
leiyre Nov 15, 2022
d57eb5e
include dataset options component
leiyre Nov 15, 2022
7cbf78d
include help info component
leiyre Nov 15, 2022
e21ffbd
remove old logic
leiyre Nov 15, 2022
1efa26a
refactor button styles
leiyre Nov 15, 2022
470928e
add styles and refactor modal
leiyre Nov 15, 2022
ef2440f
update test
leiyre Nov 15, 2022
60ccbdc
update test
leiyre Nov 15, 2022
bbed224
lint
leiyre Nov 15, 2022
e74e2cb
update test
leiyre Nov 15, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions frontend/assets/scss/abstract/variables/_variables.scss
Expand Up @@ -157,6 +157,9 @@ $swift-linear-duration: 0.15s !default;
$swift-linear-timing-function: linear !default;
$swift-linear: all $swift-linear-duration $swift-linear-timing-function !default;

// topbar
$topbarHeight: 56px;

// sidebar
$sidebarPanelWidth: 280px;
$sidebarMenuWidth: 70px;
Expand Down
2 changes: 1 addition & 1 deletion frontend/components/base/BaseTopbarBrand.vue
Expand Up @@ -33,7 +33,7 @@ export default {
width: 100%;
display: flex;
align-items: center;
min-height: 56px;
min-height: $topbarHeight;
position: relative;
background: palette(grey, 100);
color: palette(white);
Expand Down
23 changes: 16 additions & 7 deletions frontend/components/commons/sidebar/SidebarButton.vue
@@ -1,9 +1,9 @@
<template>
<a
class="sidebar-button"
:class="[type.toLowerCase(), activeView.includes(id) ? 'active' : '']"
:class="sidebarButtonClass"
href="#"
:data-title="!activeView.includes(id) ? tooltip : null"
:data-title="sidebarButtonTooltipText"
@click="$emit('button-action', id)"
>
<svgicon :name="icon"></svgicon>
Expand All @@ -24,8 +24,7 @@ export default {
default: () => [],
},
tooltip: {
type: String,
required: true,
type: [String, null],
},
id: {
type: String,
Expand All @@ -36,13 +35,23 @@ export default {
required: true,
},
type: {
leiyre marked this conversation as resolved.
Show resolved Hide resolved
type: String,
required: true,
type: [String, null],
validator: (value) => {
return ["Mode", "Metrics", "Refresh"].includes(value);
return ["Mode", "Metrics", "Refresh", "View-info", null].includes(value);
},
},
},
computed: {
sidebarButtonClass() {
return [
this.type?.toLowerCase(),
this.activeView.includes(this.id) ? "active" : "",
];
},
sidebarButtonTooltipText() {
return !this.activeView.includes(this.id) ? this.tooltip : null;
},
leiyre marked this conversation as resolved.
Show resolved Hide resolved
},
};
</script>

Expand Down
46 changes: 27 additions & 19 deletions frontend/components/commons/sidebar/SidebarMenu.vue
Expand Up @@ -17,23 +17,25 @@

<template>
<div class="sidebar">
<span v-for="group in sidebarGroups" :key="group">
<div class="sidebar__info">
<p>{{ group }}</p>
<sidebar-button
v-for="button in filteredSidebarItems.filter(
(button) => button.group === group
)"
:id="button.id"
:key="button.id"
:active-view="[viewMode, currentMetric]"
:icon="button.icon"
:tooltip="button.tooltip"
:type="group"
@button-action="action(button.action, button.id)"
/>
</div>
</span>
<div
v-for="group in sidebarGroups"
:key="group"
:class="`sidebar__info --${!group ? 'ungruped' : 'group'}`"
leiyre marked this conversation as resolved.
Show resolved Hide resolved
>
<p>{{ group }}</p>
<sidebar-button
v-for="button in filteredSidebarItems.filter(
(button) => button.group === group
)"
:id="button.id"
:key="button.id"
:active-view="[viewMode, currentMetric]"
:icon="button.icon"
:tooltip="button.tooltip"
:type="group"
@button-action="action(button.action, button.id)"
/>
</div>
<slot />
</div>
</template>
Expand Down Expand Up @@ -95,12 +97,14 @@ $sidebar-button-size: 45px;
top: 0;
width: $sidebar-button-size;
min-width: $sidebar-button-size;
min-height: 100vh;
min-height: calc(100vh - $topbarHeight);
min-width: $sidebarMenuWidth;
background: palette(grey, 700);
box-shadow: none;
pointer-events: all;
transition: box-shadow 0.2s ease-in-out 0.4s;
display: flex;
flex-direction: column;
leiyre marked this conversation as resolved.
Show resolved Hide resolved
.--metrics & {
box-shadow: inset 1px 1px 5px -2px #c7c7c7;
transition: box-shadow 0.2s ease-in-out;
Expand All @@ -118,7 +122,11 @@ $sidebar-button-size: 45px;
}
&__info {
position: relative;
margin-bottom: 2em;
margin-bottom: 1em;
&.--ungruped {
margin-top: auto;
margin-bottom: 0em;
}
}
leiyre marked this conversation as resolved.
Show resolved Hide resolved
}
a[data-title]:not(.active) {
Expand Down
4 changes: 4 additions & 0 deletions frontend/components/commons/sidebar/TaskSidebar.vue
@@ -1,5 +1,6 @@
<template>
<div class="sidebar__container" v-if="dataset">
<component :is="currentTaskHelp" :dataset="dataset" />
<sidebar-panel
:class="[currentTask, currentMetric ? 'visible' : '']"
:dataset="dataset"
Expand Down Expand Up @@ -52,6 +53,9 @@ export default {
currentTask() {
return this.dataset.task;
},
currentTaskHelp() {
return this.currentTask + "ViewInfo";
leiyre marked this conversation as resolved.
Show resolved Hide resolved
},
metricsByViewMode() {
return this.sidebarItems.find(
(item) => item.id === this.dataset.viewSettings.viewMode
Expand Down
Expand Up @@ -23,7 +23,6 @@
>
<records-counter :total="dataset.results.total"></records-counter>
</filters-area>
<explain-help-info v-if="isExplainedRecord" :dataset="dataset" />
<global-actions :dataset="dataset">
<validate-discard-action
:dataset="dataset"
Expand Down Expand Up @@ -53,9 +52,6 @@ export default {
},
},
computed: {
isExplainedRecord() {
return this.dataset.results.records.some((record) => record.explanation);
},
isMultiLabel() {
return this.dataset.isMultiLabel;
},
Expand Down
Expand Up @@ -19,9 +19,10 @@
<sidebar-menu
:current-metric="currentMetric"
:dataset="dataset"
:sidebar-items="sidebarItems"
:sidebar-items="filteredSidebarItems"
@refresh="$emit('refresh')"
@show-metrics="onShowMetrics"
@show-view-info="onShowViewInfo"
@change-view-mode="onChangeViewMode"
/>
</template>
Expand Down Expand Up @@ -92,16 +93,36 @@ export default {
group: "Refresh",
action: "refresh",
},
{
id: "view-info",
tooltip: null,
icon: "info",
group: null,
action: "show-view-info",
},
],
};
},
computed: {
recordHasExplanation() {
return this.dataset.results.records.some((record) => record.explanation);
},
filteredSidebarItems() {
return this.recordHasExplanation
? this.sidebarItems
: this.sidebarItems.filter((i) => i.id !== "view-info");
},
},
methods: {
onChangeViewMode(value) {
this.$emit("change-view-mode", value);
},
onShowMetrics(info) {
this.$emit("show-metrics", info);
},
async onShowViewInfo() {
await this.dataset.viewSettings.openViewInfo(true);
},
},
};
</script>
Expand Up @@ -17,22 +17,15 @@

<template>
<div class="help">
<base-button
class="help__button secondary light small"
@click="showHelpPanel = true"
>
<svgicon name="support" width="22" height="22"></svgicon>
Help
</base-button>
<lazy-base-modal
modal-class="modal-secondary"
modal-position="modal-center"
:modal-custom="true"
:prevent-body-scroll="true"
:modal-visible="showHelpPanel"
:modal-visible="visibleViewInfo === true"
leiyre marked this conversation as resolved.
Show resolved Hide resolved
@close-modal="closeModal"
>
<div v-if="showHelpPanel" class="help__panel">
<div class="help__panel">
<p class="help__panel__title">
This dataset contains token attributions. What do highlight colors
mean?
Expand Down Expand Up @@ -62,12 +55,20 @@
<script>
import "assets/icons/support";
export default {
data: () => ({
showHelpPanel: false,
}),
props: {
dataset: {
type: Object,
required: true,
},
},
computed: {
visibleViewInfo() {
return this.dataset?.viewSettings.visibleViewInfo;
},
leiyre marked this conversation as resolved.
Show resolved Hide resolved
},
methods: {
closeModal() {
this.showHelpPanel = false;
async closeModal() {
await this.dataset.viewSettings.openViewInfo(false);
},
},
};
Expand All @@ -85,10 +86,6 @@ export default {
border-radius: 1px;
position: relative;
margin-bottom: $base-space * 4;
.atom {
@include font-size(16px);
display: inline-block;
}
&__title {
@include font-size(16px);
color: $black-54;
Expand All @@ -103,31 +100,6 @@ export default {
padding-left: 1.5em;
margin-bottom: 1.5em;
}
&__button {
position: absolute;
right: 1em;
top: 1em;
cursor: pointer;
&:after {
content: "\2715";
font-weight: bold;
color: palette(brown);
font-size: 14px;
}
}
}
&__button {
display: flex;
margin-right: 0;
margin-left: auto;
background: palette(grey, 700) !important;
&:hover {
background: darken(palette(grey, 700), 2%) !important;
}
.svg-icon {
margin-right: 0.3em;
fill: $black-54;
}
}
}
</style>
10 changes: 10 additions & 0 deletions frontend/models/DatasetViewSettings.js
Expand Up @@ -52,9 +52,19 @@ export default class DatasetViewSettings extends Model {
headerHeight: this.number(140),
visibleMetrics: this.boolean(false),
visibleRulesList: this.boolean(false),
visibleViewInfo: this.boolean(false),
};
}

async openViewInfo(value) {
return await DatasetViewSettings.update({
where: this.$id,
data: {
visibleViewInfo: value,
},
});
}

async enableRulesSummary() {
return await DatasetViewSettings.update({
where: this.$id,
Expand Down
Expand Up @@ -2,6 +2,7 @@

exports[`TaskSidebar Show sidebar panel 1`] = `
<div class="sidebar__container">
<textclassificationviewinfo dataset="[object Object]"></textclassificationviewinfo>
<aside class="sidebar TextClassification">
<div class="sidebar__wrapper">
<div class="sidebar__content"><a href="#" class="sidebar__close-button"><svg version="1.1" viewBox="0 0 41 40" class="svg-icon svg-fill" style="width: 12px; height: 12px;">
Expand All @@ -19,6 +20,7 @@ exports[`TaskSidebar Show sidebar panel 1`] = `

exports[`TaskSidebar renders properly 1`] = `
<div class="sidebar__container">
<textclassificationviewinfo dataset="[object Object]"></textclassificationviewinfo>
<aside class="sidebar TextClassification">
<div class="sidebar__wrapper">
<div class="sidebar__content"><a href="#" class="sidebar__close-button"><svg version="1.1" viewBox="0 0 41 40" class="svg-icon svg-fill" style="width: 12px; height: 12px;">
Expand Down
@@ -0,0 +1,34 @@
import { mount } from "@vue/test-utils";
import ComponentTextClassifierViewInfo from "@/components/text-classifier/sidebar/TextClassificationViewInfo";
import { DatasetViewSettings } from "@/models/DatasetViewSettings";

const props = {
dataset: {
task: "TextClassification",
viewSettings: new DatasetViewSettings({
visibleViewInfo: true,
}),
},
};

let wrapper = null;
beforeEach(() => {
wrapper = mount(ComponentTextClassifierViewInfo, {
propsData: props,
});
});
afterEach(() => {
wrapper.destroy();
});
describe("TextClassificationViewInfo", () => {
let spy = jest.spyOn(console, "error");
afterEach(() => spy.mockReset());

test("Required property", () => {
expect(ComponentTextClassifierViewInfo.props.dataset.required).toBe(true);
});

test("renders properly", () => {
expect(wrapper).toMatchSnapshot();
});
});