summaryrefslogtreecommitdiff
path: root/src/client/components/page-window.vue
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/components/page-window.vue')
-rw-r--r--src/client/components/page-window.vue86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/client/components/page-window.vue b/src/client/components/page-window.vue
new file mode 100644
index 0000000000..77312fec7f
--- /dev/null
+++ b/src/client/components/page-window.vue
@@ -0,0 +1,86 @@
+<template>
+<XWindow ref="window" :initial-width="400" :initial-height="450" :can-resize="true" @closed="$emit('closed')">
+ <template #header>
+ <XHeader :info="pageInfo" :with-back="false"/>
+ </template>
+ <template #buttons>
+ <button class="_button" @click="expand" v-tooltip="$t('showInPage')"><Fa :icon="faExpandAlt"/></button>
+ <button class="_button" @click="popout" v-tooltip="$t('popout')"><Fa :icon="faExternalLinkAlt"/></button>
+ </template>
+ <div style="min-height: 100%; background: var(--bg);">
+ <component :is="component" v-bind="props" :ref="changePage"/>
+ </div>
+</XWindow>
+</template>
+
+<script lang="ts">
+import { defineComponent, markRaw } from 'vue';
+import { faExternalLinkAlt, faExpandAlt } from '@fortawesome/free-solid-svg-icons';
+import XWindow from '@/components/ui/window.vue';
+import XHeader from '@/ui/_common_/header.vue';
+import { popout } from '@/scripts/popout';
+
+export default defineComponent({
+ components: {
+ XWindow,
+ XHeader,
+ },
+
+ props: {
+ initialUrl: {
+ type: String,
+ required: true,
+ },
+ initialComponent: {
+ type: Object,
+ required: true,
+ },
+ initialProps: {
+ type: Object,
+ required: false,
+ default: {},
+ },
+ },
+
+ emits: ['closed'],
+
+ data() {
+ return {
+ pageInfo: null,
+ url: this.initialUrl,
+ component: this.initialComponent,
+ props: this.initialProps,
+ faExternalLinkAlt, faExpandAlt,
+ };
+ },
+
+ provide() {
+ return {
+ navHook: (url, component, props) => {
+ this.url = url;
+ this.component = markRaw(component);
+ this.props = props;
+ }
+ };
+ },
+
+ methods: {
+ changePage(page) {
+ if (page == null) return;
+ if (page.INFO) {
+ this.pageInfo = page.INFO;
+ }
+ },
+
+ expand() {
+ this.$router.push(this.url);
+ this.$refs.window.close();
+ },
+
+ popout() {
+ popout(this.url, this.$el);
+ this.$refs.window.close();
+ },
+ },
+});
+</script>