summaryrefslogtreecommitdiffstats
path: root/settings/src/components/appNavigation/navigationItem.vue
blob: e9ed7579a88ae32fccf5809d1ba86c913d3f8658 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<template>
	<li :id="item.id" :class="[{'icon-loading-small': item.loading, 'open': item.opened, 'collapsible': item.collapsible&&item.children&&item.children.length>0 }, item.classes]">

		<!-- Bullet -->
		<div v-if="item.bullet" class="app-navigation-entry-bullet" :style="{ backgroundColor: item.bullet }"></div>

		<!-- Main link -->
		<a v-if="item.href" :href="(item.href) ? item.href : '#' " @click="toggleCollapse" :class="item.icon" >
			<img v-if="item.iconUrl" :alt="item.text" :src="item.iconUrl">
			{{item.text}}
		</a>

		<!-- Router link if specified. href OR router -->
		<router-link :to="item.router" v-else-if="item.router" :class="item.icon" >
			<img v-if="item.iconUrl" :alt="item.text" :src="item.iconUrl">
			{{item.text}}
		</router-link>	

		<!-- Popover, counter and button(s) -->
		<div v-if="item.utils" class="app-navigation-entry-utils">
			<ul>
				<!-- counter -->
				<li v-if="Number.isInteger(item.utils.counter)"
					class="app-navigation-entry-utils-counter">{{item.utils.counter}}</li>

				<!-- first action if only one action and counter -->
				<li v-if="item.utils.actions && item.utils.actions.length === 1 && Number.isInteger(item.utils.counter)"
					class="app-navigation-entry-utils-menu-button">
					<button @click="item.utils.actions[0].action" :class="item.utils.actions[0].icon" :title="item.utils.actions[0].text"></button>
				</li>

				<!-- second action only two actions and no counter -->
				<li v-else-if="item.utils.actions && item.utils.actions.length === 2 && !Number.isInteger(item.utils.counter)"
					v-for="action in item.utils.actions" :key="action.action"
					class="app-navigation-entry-utils-menu-button">
					<button @click="action.action" :class="action.icon" :title="action.text"></button>
				</li>

				<!-- menu if only at least one action and counter OR two actions and no counter-->
				<li v-else-if="item.utils.actions && item.utils.actions.length > 1 && (Number.isInteger(item.utils.counter) || item.utils.actions.length > 2)"
					class="app-navigation-entry-utils-menu-button">
					<button v-click-outside="hideMenu" @click="showMenu" ></button>
				</li>
			</ul>
		</div>

		<!-- if more than 2 actions or more than 1 actions with counter -->
		<div v-if="item.utils && item.utils.actions && item.utils.actions.length > 1 && (Number.isInteger(item.utils.counter) || item.utils.actions.length > 2)"
			 class="app-navigation-entry-menu" :class="{ 'open': openedMenu }">
			 <popover-menu :menu="item.utils.actions"/>
		</div>

		<!-- undo entry -->
		<div class="app-navigation-entry-deleted" v-if="item.undo">
			<div class="app-navigation-entry-deleted-description">{{item.undo.text}}</div>
			<button class="app-navigation-entry-deleted-button icon-history" :title="t('settings', 'Undo')"></button>
		</div>

		<!-- edit entry -->
		<div class="app-navigation-entry-edit" v-if="item.edit">
			<form>
				<input type="text" v-model="item.text">
				<input type="submit" value="" class="icon-confirm">
				<input type="submit" value="" class="icon-close" @click.stop.prevent="cancelEdit">
			</form>
		</div>

		<!-- if the item has children, inject the component with proper data -->
		<ul v-if="item.children">
			<navigation-item v-for="(item, key) in item.children" :item="item" :key="key" />
		</ul>
	</li>
</template>

<script>
import popoverMenu from '../popoverMenu';
import ClickOutside from 'vue-click-outside';
import Vue from 'vue';

export default {
	name: 'navigationItem',
	props: ['item'],
	components: {
		popoverMenu
	},
	directives: {
		ClickOutside
	},
	data() {
		return {
			openedMenu: false
		}
	},
	methods: {
		showMen() {
			this.openedMenu = true;
		},
		hideMenu() {
			this.openedMenu = false;
		},
		toggleCollapse() {
			// if item.opened isn't set, Vue won't trigger view updates https://vuejs.org/v2/api/#Vue-set
			// ternary is here to detect the undefined state of item.opened
			Vue.set(this.item, 'opened', this.item.opened ? !this.item.opened : true);
		},
		cancelEdit() {
			// remove the editing class
			if (Array.isArray(this.item.classes))
				this.item.classes = this.item.classes.filter(item => item !== 'editing');
		}
	},
	mounted() {
		// prevent click outside event with popupItem.
		this.popupItem = this.$el;
	},
}
</script>