diff options
| author | Jan-Hendrik Willms <tleilax+github@gmail.com> | 2021-07-22 16:07:19 +0200 |
|---|---|---|
| committer | Jan-Hendrik Willms <tleilax+github@gmail.com> | 2021-07-22 16:19:12 +0200 |
| commit | a3da1483a9e689846179159355badfec8073dbec (patch) | |
| tree | 770dcca6bdf5f6f2a11b0e7fcbbeda6919a3fc52 /resources/vue/components/StudipActionMenu.vue | |
current code from svn, revision 62608
Diffstat (limited to 'resources/vue/components/StudipActionMenu.vue')
| -rw-r--r-- | resources/vue/components/StudipActionMenu.vue | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/resources/vue/components/StudipActionMenu.vue b/resources/vue/components/StudipActionMenu.vue new file mode 100644 index 0000000..95ec6a5 --- /dev/null +++ b/resources/vue/components/StudipActionMenu.vue @@ -0,0 +1,114 @@ +<template> + <nav v-if="shouldCollapse" class="action-menu"> + <a class="action-menu-icon" :title="$gettext('Aktionen')" aria-expanded="false" :aria-label="$gettext('Aktionsmenü')" href="#"> + <div></div> + <div></div> + <div></div> + </a> + <div class="action-menu-content"> + <div class="action-menu-title"> + {{ $gettext('Aktionen') }} + </div> + <ul class="action-menu-list"> + <li v-for="item in navigationItems" :key="item.id" class="action-menu-item"> + <a v-if="item.type === 'link'" v-bind="linkAttributes(item)" v-on="linkEvents(item)"> + <studip-icon v-if="item.icon !== false" :shape="item.icon.shape" :role="item.icon.role"></studip-icon> + <span v-else class="action-menu-no-icon"></span> + + {{ item.label }} + </a> + </li> + </ul> + </div> + </nav> + <nav v-else> + <a v-for="item in navigationItems" :key="item.id" v-bind="linkAttributes(item)" v-on="linkEvents(item)"> + <studip-icon :title="item.label" :shape="item.icon.shape" :role="item.icon.role" :size="20"></studip-icon> + </a> + </nav> +</template> + +<script> +export default { + name: 'studip-action-menu', + props: { + items: Array, + collapseAt: { + default: true, + } + }, + data () { + return { + open: false + }; + }, + methods: { + linkAttributes (item) { + let attributes = item.attributes; + attributes.class = item.classes; + + if (item.disabled) { + attributes.disabled = true; + } + + if (item.url) { + attributes.href = item.url; + } + + return attributes; + }, + linkEvents (item) { + let events = {}; + if (item.emit) { + events.click = () => { + this.$emit.apply(this, [item.emit].concat(item.emitArguments)); + this.close(); + }; + } + return events; + }, + close () { + STUDIP.ActionMenu.closeAll(); + } + }, + computed: { + navigationItems () { + return this.items.map((item) => { + let classes = item.classes || ''; + if (item.disabled) { + classes += " action-menu-item-disabled"; + } + return { + label: item.label, + url: item.url || false, + emit: item.emit || false, + emitArguments: item.emitArguments || [], + icon: item.icon ? { + shape: item.icon, + role: item.disabled ? 'inactive' : 'clickable' + } : false, + type: item.type || 'link', + classes: classes.trim(), + attributes: item.attributes || {}, + disabled: item.disabled, + }; + }); + }, + shouldCollapse () { + if (this.collapseAt === false) { + return false; + } + if (this.collapseAt === true) { + return true; + } + return Number.parseInt(this.collapseAt) <= this.items.length; + } + } +} +</script> + +<style lang="scss"> +.action-menu .action-menu-item a { + cursor: pointer; +} +</style> |
