mirror of https://github.com/bastienwirtz/homer
refactor(layouts): remove duplicated code.
parent
a38514739d
commit
dfb7b4d37f
74
src/App.vue
74
src/App.vue
|
@ -68,64 +68,23 @@
|
||||||
<!-- Optional messages -->
|
<!-- Optional messages -->
|
||||||
<Message :item="config.message" />
|
<Message :item="config.message" />
|
||||||
|
|
||||||
<!-- Horizontal layout -->
|
<!-- Unified layout -->
|
||||||
<div v-if="!vlayout || filter" class="columns is-multiline">
|
|
||||||
<template v-for="(group, groupIndex) in services">
|
|
||||||
<h2
|
|
||||||
v-if="group.name"
|
|
||||||
:key="`header-${groupIndex}`"
|
|
||||||
class="column is-full group-title"
|
|
||||||
:class="group.class"
|
|
||||||
>
|
|
||||||
<i v-if="group.icon" :class="['fa-fw', group.icon]"></i>
|
|
||||||
<div v-else-if="group.logo" class="group-logo media-left">
|
|
||||||
<figure class="image is-48x48">
|
|
||||||
<img :src="group.logo" :alt="`${group.name} logo`" />
|
|
||||||
</figure>
|
|
||||||
</div>
|
|
||||||
{{ group.name }}
|
|
||||||
</h2>
|
|
||||||
<Service
|
|
||||||
v-for="(item, index) in group.items"
|
|
||||||
:key="`service-${groupIndex}-${index}`"
|
|
||||||
:item="item"
|
|
||||||
:proxy="config.proxy"
|
|
||||||
:class="[
|
|
||||||
'column',
|
|
||||||
`is-${12 / config.columns}`,
|
|
||||||
`${item.class || group.class || ''}`,
|
|
||||||
]"
|
|
||||||
/>
|
|
||||||
</template>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Vertical layout -->
|
|
||||||
<div
|
<div
|
||||||
v-if="!filter && vlayout"
|
:class="[
|
||||||
class="columns is-multiline layout-vertical"
|
'columns',
|
||||||
|
'is-multiline',
|
||||||
|
{ 'layout-vertical': vlayout && !filter },
|
||||||
|
]"
|
||||||
>
|
>
|
||||||
<div
|
<ServiceGroup
|
||||||
v-for="(group, groupIndex) in services"
|
v-for="(group, groupIndex) in services"
|
||||||
:key="groupIndex"
|
:key="groupIndex"
|
||||||
:class="['column', `is-${12 / config.columns}`]"
|
:group="group"
|
||||||
>
|
:is-vertical="vlayout && !filter"
|
||||||
<h2 v-if="group.name" class="group-title" :class="group.class">
|
:proxy="config.proxy"
|
||||||
<i v-if="group.icon" :class="['fa-fw', group.icon]"></i>
|
:columns="config.columns"
|
||||||
<div v-else-if="group.logo" class="group-logo media-left">
|
:group-index="groupIndex"
|
||||||
<figure class="image is-48x48">
|
/>
|
||||||
<img :src="group.logo" :alt="`${group.name} logo`" />
|
|
||||||
</figure>
|
|
||||||
</div>
|
|
||||||
{{ group.name }}
|
|
||||||
</h2>
|
|
||||||
<Service
|
|
||||||
v-for="(item, index) in group.items"
|
|
||||||
:key="index"
|
|
||||||
:item="item"
|
|
||||||
:proxy="config.proxy"
|
|
||||||
:class="item.class || group.class"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -150,7 +109,7 @@ import merge from "lodash.merge";
|
||||||
import Navbar from "./components/Navbar.vue";
|
import Navbar from "./components/Navbar.vue";
|
||||||
import GetStarted from "./components/GetStarted.vue";
|
import GetStarted from "./components/GetStarted.vue";
|
||||||
import ConnectivityChecker from "./components/ConnectivityChecker.vue";
|
import ConnectivityChecker from "./components/ConnectivityChecker.vue";
|
||||||
import Service from "./components/Service.vue";
|
import ServiceGroup from "./components/ServiceGroup.vue";
|
||||||
import Message from "./components/Message.vue";
|
import Message from "./components/Message.vue";
|
||||||
import SearchInput from "./components/SearchInput.vue";
|
import SearchInput from "./components/SearchInput.vue";
|
||||||
import SettingToggle from "./components/SettingToggle.vue";
|
import SettingToggle from "./components/SettingToggle.vue";
|
||||||
|
@ -165,7 +124,7 @@ export default {
|
||||||
Navbar,
|
Navbar,
|
||||||
GetStarted,
|
GetStarted,
|
||||||
ConnectivityChecker,
|
ConnectivityChecker,
|
||||||
Service,
|
ServiceGroup,
|
||||||
Message,
|
Message,
|
||||||
SearchInput,
|
SearchInput,
|
||||||
SettingToggle,
|
SettingToggle,
|
||||||
|
@ -196,6 +155,9 @@ export default {
|
||||||
window.onhashchange = this.buildDashboard;
|
window.onhashchange = this.buildDashboard;
|
||||||
this.loaded = true;
|
this.loaded = true;
|
||||||
},
|
},
|
||||||
|
beforeUnmount() {
|
||||||
|
window.onhashchange = null;
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
searchHotkey() {
|
searchHotkey() {
|
||||||
if (this.config.hotkey && this.config.hotkey.search) {
|
if (this.config.hotkey && this.config.hotkey.search) {
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
<template>
|
||||||
|
<h2 :class="group.class">
|
||||||
|
<i v-if="group.icon" :class="['fa-fw', group.icon]"></i>
|
||||||
|
<div v-else-if="group.logo" class="group-logo media-left">
|
||||||
|
<figure class="image is-48x48">
|
||||||
|
<img :src="group.logo" :alt="`${group.name} logo`" />
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
{{ group.name }}
|
||||||
|
</h2>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "GroupHeader",
|
||||||
|
props: {
|
||||||
|
group: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
|
@ -0,0 +1,69 @@
|
||||||
|
<template>
|
||||||
|
<!-- Vertical layout: Group container wrapper -->
|
||||||
|
<div v-if="isVertical" :class="['column', `is-${12 / columns}`]">
|
||||||
|
<GroupHeader v-if="group.name" :group="group" class="group-title" />
|
||||||
|
<Service
|
||||||
|
v-for="(item, index) in group.items"
|
||||||
|
:key="index"
|
||||||
|
:item="item"
|
||||||
|
:proxy="proxy"
|
||||||
|
:class="item.class || group.class"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Horizontal layout: Direct rendering -->
|
||||||
|
<template v-else>
|
||||||
|
<GroupHeader
|
||||||
|
v-if="group.name"
|
||||||
|
:key="`header-${groupIndex}`"
|
||||||
|
:group="group"
|
||||||
|
class="column is-full group-title"
|
||||||
|
/>
|
||||||
|
<Service
|
||||||
|
v-for="(item, index) in group.items"
|
||||||
|
:key="`service-${groupIndex}-${index}`"
|
||||||
|
:item="item"
|
||||||
|
:proxy="proxy"
|
||||||
|
:class="[
|
||||||
|
'column',
|
||||||
|
`is-${12 / columns}`,
|
||||||
|
`${item.class || group.class || ''}`,
|
||||||
|
]"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import Service from "./Service.vue";
|
||||||
|
import GroupHeader from "./GroupHeader.vue";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "ServiceGroup",
|
||||||
|
components: {
|
||||||
|
Service,
|
||||||
|
GroupHeader,
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
group: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
isVertical: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
proxy: {
|
||||||
|
type: String,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
columns: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
groupIndex: {
|
||||||
|
type: Number,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
Loading…
Reference in New Issue