mirror of
https://github.com/nasa/openmct.git
synced 2025-01-19 03:06:54 +00:00
* [Notebook] Save snapshot dropdown should be available from "view large" overlay #2922\ * Significant improvements to Snapshot styling * [Notebook] Embed links aren't navigating #2979 Co-authored-by: charlesh88 <charlesh88@gmail.com> Co-authored-by: Andrew Henry <akhenry@gmail.com>
This commit is contained in:
parent
7c07b66cc9
commit
c157fab081
@ -40,6 +40,18 @@ export default {
|
|||||||
default() {
|
default() {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
ignoreLink: {
|
||||||
|
type: Boolean,
|
||||||
|
default() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
objectPath: {
|
||||||
|
type: Array,
|
||||||
|
default() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
@ -97,17 +109,27 @@ export default {
|
|||||||
this.showMenu = false;
|
this.showMenu = false;
|
||||||
},
|
},
|
||||||
snapshot(notebook) {
|
snapshot(notebook) {
|
||||||
let element = document.getElementsByClassName("l-shell__main-container")[0];
|
this.hideMenu();
|
||||||
const bounds = this.openmct.time.bounds();
|
|
||||||
const objectPath = this.openmct.router.path;
|
|
||||||
const snapshotMeta = {
|
|
||||||
bounds,
|
|
||||||
link: window.location.href,
|
|
||||||
objectPath,
|
|
||||||
openmct: this.openmct
|
|
||||||
};
|
|
||||||
|
|
||||||
this.notebookSnapshot.capture(snapshotMeta, notebook.type, element);
|
this.$nextTick(() => {
|
||||||
|
const element = document.querySelector('.c-overlay__contents')
|
||||||
|
|| document.getElementsByClassName('l-shell__main-container')[0];
|
||||||
|
|
||||||
|
const bounds = this.openmct.time.bounds();
|
||||||
|
const link = !this.ignoreLink
|
||||||
|
? window.location.href
|
||||||
|
: null;
|
||||||
|
|
||||||
|
const objectPath = this.objectPath || this.openmct.router.path;
|
||||||
|
const snapshotMeta = {
|
||||||
|
bounds,
|
||||||
|
link,
|
||||||
|
objectPath,
|
||||||
|
openmct: this.openmct
|
||||||
|
};
|
||||||
|
|
||||||
|
this.notebookSnapshot.capture(snapshotMeta, notebook.type, element);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
-->
|
-->
|
||||||
<div ng-controller="StackedPlotController as stackedPlot"
|
<div ng-controller="StackedPlotController as stackedPlot"
|
||||||
class="c-plot c-plot--stacked holder holder-plot has-control-bar">
|
class="c-plot c-plot--stacked holder holder-plot has-control-bar">
|
||||||
<div class="l-control-bar" ng-show="!stackedPlot.hideExportButtons">
|
<div class="c-control-bar" ng-show="!stackedPlot.hideExportButtons">
|
||||||
<span class="c-button-set c-button-set--strip-h">
|
<span class="c-button-set c-button-set--strip-h">
|
||||||
<button class="c-button icon-download"
|
<button class="c-button icon-download"
|
||||||
ng-click="stackedPlot.exportPNG()"
|
ng-click="stackedPlot.exportPNG()"
|
||||||
|
@ -81,7 +81,8 @@ define(
|
|||||||
clonedElement.classList.add(className);
|
clonedElement.classList.add(className);
|
||||||
}
|
}
|
||||||
element.id = oldId;
|
element.id = oldId;
|
||||||
}
|
},
|
||||||
|
removeContainer: true // Set to false to debug what html2canvas renders
|
||||||
}).then(function (canvas) {
|
}).then(function (canvas) {
|
||||||
dialog.dismiss();
|
dialog.dismiss();
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
|
@ -165,7 +165,16 @@
|
|||||||
/******************************* LEGACY */
|
/******************************* LEGACY */
|
||||||
.s-status-taking-snapshot,
|
.s-status-taking-snapshot,
|
||||||
.overlay.snapshot {
|
.overlay.snapshot {
|
||||||
// Handle overflow-y issues with tables and html2canvas
|
.c-table {
|
||||||
// Replaces .l-sticky-headers .l-tabular-body { overflow: auto; }
|
&__body-w {
|
||||||
.c-table__body-w { overflow: auto; }
|
overflow: auto; // Handle overflow-y issues with tables and html2canvas
|
||||||
|
}
|
||||||
|
|
||||||
|
&-control-bar {
|
||||||
|
display: none;
|
||||||
|
+ * {
|
||||||
|
margin-top: 0 !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -565,6 +565,20 @@ select {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/******************************************************** CONTROL BARS */
|
||||||
|
.c-control-bar {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
> * + * {
|
||||||
|
margin-left: $interiorMarginSm;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__label {
|
||||||
|
display: inline-block;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************** PALETTES */
|
/******************************************************** PALETTES */
|
||||||
.c-palette {
|
.c-palette {
|
||||||
|
@ -40,28 +40,58 @@ mct-plot {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.c-plot,
|
||||||
|
.gl-plot {
|
||||||
|
.s-status-taking-snapshot & {
|
||||||
|
.c-control-bar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.gl-plot-y-label__select {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.c-plot {
|
.c-plot {
|
||||||
$p: $mainViewPad;
|
//$p: $mainViewPad;
|
||||||
position: absolute;
|
@include abs($mainViewPad);
|
||||||
top: $p; right: $p; bottom: $p; left: $p;
|
//position: absolute;
|
||||||
|
//top: $p; right: $p; bottom: $p; left: $p;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
> * + * {
|
||||||
|
margin-top: $interiorMargin;
|
||||||
|
}
|
||||||
|
|
||||||
|
.l-control-bar {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.l-view-section {
|
||||||
|
display: flex;
|
||||||
|
flex: 1 1 auto;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
&--stacked {
|
&--stacked {
|
||||||
.l-view-section {
|
.child-frame {
|
||||||
// Make this a flex container
|
.has-control-bar {
|
||||||
display: flex;
|
.c-control-bar {
|
||||||
flex-flow: column nowrap;
|
// Hides buttons per plot element in a stacked plot
|
||||||
.gl-plot.child-frame {
|
display: none;
|
||||||
mct-plot {
|
|
||||||
display: flex;
|
|
||||||
flex: 1 1 auto;
|
|
||||||
height: 100%;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
flex: 1 1 auto;
|
|
||||||
&:not(:first-child) {
|
|
||||||
margin-top: $interiorMargin;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mct-plot {
|
||||||
|
display: flex;
|
||||||
|
flex: 1 1 auto;
|
||||||
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
flex: 1 1 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.s-status-timeconductor-unsynced .holder-plot {
|
.s-status-timeconductor-unsynced .holder-plot {
|
||||||
@ -70,7 +100,6 @@ mct-plot {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -186,7 +215,7 @@ mct-plot {
|
|||||||
left: 0; top: 0; right: auto; bottom: 0;
|
left: 0; top: 0; right: auto; bottom: 0;
|
||||||
padding-left: 5px;
|
padding-left: 5px;
|
||||||
text-orientation: mixed;
|
text-orientation: mixed;
|
||||||
overflow: hidden;
|
//overflow: hidden;
|
||||||
writing-mode: vertical-lr;
|
writing-mode: vertical-lr;
|
||||||
&:before {
|
&:before {
|
||||||
// Icon denoting configurability
|
// Icon denoting configurability
|
||||||
@ -339,11 +368,11 @@ mct-plot {
|
|||||||
z-index: -10;
|
z-index: -10;
|
||||||
|
|
||||||
.l-view-section {
|
.l-view-section {
|
||||||
$m: $interiorMargin;
|
//$m: $interiorMargin;
|
||||||
top: $m !important;
|
//top: $m !important;
|
||||||
right: $m;
|
//right: $m;
|
||||||
bottom: $m;
|
//bottom: $m;
|
||||||
left: $m;
|
//left: $m;
|
||||||
|
|
||||||
.s-status-timeconductor-unsynced .holder-plot {
|
.s-status-timeconductor-unsynced .holder-plot {
|
||||||
.t-object-alert.t-alert-unsynced {
|
.t-object-alert.t-alert-unsynced {
|
||||||
|
@ -19,53 +19,6 @@
|
|||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/******************************************************************* VIEWS */
|
|
||||||
// From _views.scss
|
|
||||||
// Legacy overlay and stacked plots depend on this for now
|
|
||||||
// Styles for sub-dividing views generically
|
|
||||||
.l-control-bar {
|
|
||||||
// Element that can be placed above l-view-section, holds controls, buttons, etc.
|
|
||||||
height: $controlBarH;
|
|
||||||
}
|
|
||||||
|
|
||||||
.c-control-bar {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
> * + * {
|
|
||||||
margin-left: $interiorMarginSm;
|
|
||||||
}
|
|
||||||
|
|
||||||
&__label {
|
|
||||||
display: inline-block;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.l-view-section {
|
|
||||||
@include abs();
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.has-control-bar {
|
|
||||||
.l-view-section {
|
|
||||||
top: $controlBarH + $interiorMargin;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.child-frame {
|
|
||||||
.has-control-bar {
|
|
||||||
.l-control-bar,
|
|
||||||
.c-control-bar {
|
|
||||||
// Hides buttons per plot element in a stacked plot
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.l-view-section {
|
|
||||||
top: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************************************** CLOCKS AND TIMERS */
|
/*********************************************************************** CLOCKS AND TIMERS */
|
||||||
.c-clock,
|
.c-clock,
|
||||||
.c-timer {
|
.c-timer {
|
||||||
|
@ -388,7 +388,21 @@
|
|||||||
.s-status-taking-snapshot,
|
.s-status-taking-snapshot,
|
||||||
.overlay.snapshot {
|
.overlay.snapshot {
|
||||||
// Handle overflow-y issues with tables and html2canvas
|
// Handle overflow-y issues with tables and html2canvas
|
||||||
|
background: $colorBodyBg; // Prevent html2canvas from using white background
|
||||||
|
color: $colorBodyFg;
|
||||||
|
padding: $interiorMarginSm !important; // Prevents items from going right to the edge of the image
|
||||||
|
|
||||||
.l-sticky-headers .l-tabular-body { overflow: auto; }
|
.l-sticky-headers .l-tabular-body { overflow: auto; }
|
||||||
|
.l-browse-bar {
|
||||||
|
display: none; // Suppress browse-bar when snapshotting from view-large overlay
|
||||||
|
+ * {
|
||||||
|
margin-top: 0 !important; // Remove margin from any following elements
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
box-shadow: none !important; // Prevent html2canvas problems with box-shadow
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.c-notebook-snapshot {
|
.c-notebook-snapshot {
|
||||||
|
@ -59,6 +59,8 @@
|
|||||||
<script>
|
<script>
|
||||||
import ObjectView from './ObjectView.vue'
|
import ObjectView from './ObjectView.vue'
|
||||||
import ContextMenuDropDown from './contextMenuDropDown.vue';
|
import ContextMenuDropDown from './contextMenuDropDown.vue';
|
||||||
|
import PreviewHeader from '@/ui/preview/preview-header.vue';
|
||||||
|
import Vue from 'vue';
|
||||||
|
|
||||||
const SIMPLE_CONTENT_TYPES = [
|
const SIMPLE_CONTENT_TYPES = [
|
||||||
'clock',
|
'clock',
|
||||||
@ -116,13 +118,41 @@ export default {
|
|||||||
childElement = parentElement.children[0];
|
childElement = parentElement.children[0];
|
||||||
|
|
||||||
this.openmct.overlays.overlay({
|
this.openmct.overlays.overlay({
|
||||||
element: childElement,
|
element: this.getOverlayElement(childElement),
|
||||||
size: 'large',
|
size: 'large',
|
||||||
onDestroy() {
|
onDestroy() {
|
||||||
parentElement.append(childElement);
|
parentElement.append(childElement);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
getOverlayElement(childElement) {
|
||||||
|
const fragment = new DocumentFragment();
|
||||||
|
const header = this.getPreviewHeader();
|
||||||
|
fragment.append(header);
|
||||||
|
fragment.append(childElement);
|
||||||
|
|
||||||
|
return fragment;
|
||||||
|
},
|
||||||
|
getPreviewHeader() {
|
||||||
|
const domainObject = this.objectPath[0];
|
||||||
|
const preview = new Vue({
|
||||||
|
components: {
|
||||||
|
PreviewHeader
|
||||||
|
},
|
||||||
|
provide: {
|
||||||
|
openmct: this.openmct,
|
||||||
|
objectPath: this.objectPath
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
domainObject
|
||||||
|
}
|
||||||
|
},
|
||||||
|
template: '<PreviewHeader :domainObject="domainObject" :hideViewSwitcher="true" :showNotebookMenuSwitcher="true"></PreviewHeader>'
|
||||||
|
});
|
||||||
|
|
||||||
|
return preview.$mount().$el;
|
||||||
|
},
|
||||||
getSelectionContext() {
|
getSelectionContext() {
|
||||||
return this.$refs.objectView.getSelectionContext();
|
return this.$refs.objectView.getSelectionContext();
|
||||||
}
|
}
|
||||||
|
@ -23,9 +23,12 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
&:not(.c-so-view--no-frame) {
|
&:not(.c-so-view--no-frame) {
|
||||||
background: $colorBodyBg;
|
|
||||||
border: $browseFrameBorder;
|
border: $browseFrameBorder;
|
||||||
padding: $interiorMargin;
|
padding: $interiorMargin;
|
||||||
|
|
||||||
|
.is-editing & {
|
||||||
|
background: rgba($colorBodyBg, 0.8);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&--no-frame {
|
&--no-frame {
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
<!-- Action buttons -->
|
<!-- Action buttons -->
|
||||||
<NotebookMenuSwitcher v-if="notebookEnabled"
|
<NotebookMenuSwitcher v-if="notebookEnabled"
|
||||||
:domain-object="domainObject"
|
:domain-object="domainObject"
|
||||||
|
:object-path="openmct.router.path"
|
||||||
class="c-notebook-snapshot-menubutton"
|
class="c-notebook-snapshot-menubutton"
|
||||||
/>
|
/>
|
||||||
<div class="l-browse-bar__actions">
|
<div class="l-browse-bar__actions">
|
||||||
|
@ -21,28 +21,12 @@
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
<template>
|
<template>
|
||||||
<div class="l-preview-window">
|
<div class="l-preview-window">
|
||||||
<div class="l-browse-bar">
|
<PreviewHeader
|
||||||
<div class="l-browse-bar__start">
|
:current-view="currentView"
|
||||||
<div
|
:domain-object="domainObject"
|
||||||
class="l-browse-bar__object-name--w"
|
:views="views"
|
||||||
:class="type.cssClass"
|
@setView="setView"
|
||||||
>
|
/>
|
||||||
<span class="l-browse-bar__object-name">
|
|
||||||
{{ domainObject.name }}
|
|
||||||
</span>
|
|
||||||
<context-menu-drop-down :object-path="objectPath" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="l-browse-bar__end">
|
|
||||||
<div class="l-browse-bar__actions">
|
|
||||||
<view-switcher
|
|
||||||
:views="views"
|
|
||||||
:current-view="currentView"
|
|
||||||
@setView="setView"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="l-preview-window__object-view">
|
<div class="l-preview-window__object-view">
|
||||||
<div ref="objectView"></div>
|
<div ref="objectView"></div>
|
||||||
</div>
|
</div>
|
||||||
@ -50,13 +34,11 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import ContextMenuDropDown from '../../ui/components/contextMenuDropDown.vue';
|
import PreviewHeader from './preview-header.vue';
|
||||||
import ViewSwitcher from '../../ui/layout/ViewSwitcher.vue';
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
ContextMenuDropDown,
|
PreviewHeader
|
||||||
ViewSwitcher
|
|
||||||
},
|
},
|
||||||
inject: [
|
inject: [
|
||||||
'openmct',
|
'openmct',
|
||||||
@ -64,12 +46,9 @@ export default {
|
|||||||
],
|
],
|
||||||
data() {
|
data() {
|
||||||
let domainObject = this.objectPath[0];
|
let domainObject = this.objectPath[0];
|
||||||
let type = this.openmct.types.get(domainObject.type);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
domainObject: domainObject,
|
domainObject: domainObject,
|
||||||
type: type,
|
|
||||||
notebookEnabled: false,
|
|
||||||
viewKey: undefined
|
viewKey: undefined
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@ -97,6 +76,7 @@ export default {
|
|||||||
this.view.destroy();
|
this.view.destroy();
|
||||||
this.$refs.objectView.innerHTML = '';
|
this.$refs.objectView.innerHTML = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
delete this.view;
|
delete this.view;
|
||||||
delete this.viewContainer;
|
delete this.viewContainer;
|
||||||
},
|
},
|
||||||
|
92
src/ui/preview/preview-header.vue
Normal file
92
src/ui/preview/preview-header.vue
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
<template>
|
||||||
|
<div class="l-browse-bar">
|
||||||
|
<div class="l-browse-bar__start">
|
||||||
|
<div
|
||||||
|
class="l-browse-bar__object-name--w"
|
||||||
|
:class="type.cssClass"
|
||||||
|
>
|
||||||
|
<span class="l-browse-bar__object-name">
|
||||||
|
{{ domainObject.name }}
|
||||||
|
</span>
|
||||||
|
<context-menu-drop-down :object-path="objectPath" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="l-browse-bar__end">
|
||||||
|
<div class="l-browse-bar__actions">
|
||||||
|
<view-switcher
|
||||||
|
:v-if="!hideViewSwitcher"
|
||||||
|
:views="views"
|
||||||
|
:current-view="currentView"
|
||||||
|
@setView="setView"
|
||||||
|
/>
|
||||||
|
<NotebookMenuSwitcher v-if="showNotebookMenuSwitcher"
|
||||||
|
:domain-object="domainObject"
|
||||||
|
:ignore-link="true"
|
||||||
|
:object-path="objectPath"
|
||||||
|
class="c-notebook-snapshot-menubutton"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import ContextMenuDropDown from '../../ui/components/contextMenuDropDown.vue';
|
||||||
|
import NotebookMenuSwitcher from '@/plugins/notebook/components/notebook-menu-switcher.vue';
|
||||||
|
import ViewSwitcher from '../../ui/layout/ViewSwitcher.vue';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
inject: [
|
||||||
|
'openmct',
|
||||||
|
'objectPath'
|
||||||
|
],
|
||||||
|
components: {
|
||||||
|
ContextMenuDropDown,
|
||||||
|
NotebookMenuSwitcher,
|
||||||
|
ViewSwitcher
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
currentView: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
domainObject: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
hideViewSwitcher: {
|
||||||
|
type: Boolean,
|
||||||
|
default: () => {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
showNotebookMenuSwitcher: {
|
||||||
|
type: Boolean,
|
||||||
|
default: () => {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
views: {
|
||||||
|
type: Array,
|
||||||
|
default: () => {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
type: this.openmct.types.get(this.domainObject.type)
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
setView(view) {
|
||||||
|
this.$emit('setView', view);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
Loading…
Reference in New Issue
Block a user