Mercurial > gemma
changeset 2898:d57c951aec65
client: added spinner button component
for buttons that toggle an expandable content that might need to be loaded asynchronously,
thus requiring some sort of loading animation
author | Markus Kottlaender <markus@intevation.de> |
---|---|
date | Tue, 02 Apr 2019 14:33:09 +0200 |
parents | b7cfbb21f252 |
children | eb9651074b88 |
files | client/src/components/ui/UISpinnerButton.vue client/src/main.js |
diffstat | 2 files changed, 60 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/components/ui/UISpinnerButton.vue Tue Apr 02 14:33:09 2019 +0200 @@ -0,0 +1,58 @@ +<template> + <transition name="fade"> + <div :class="classesString" @click="$emit('click')"> + <font-awesome-icon :icon="iconString" :spin="loading" fixed-width /> + <slot /> + </div> + </transition> +</template> + +<script> +/* This is Free Software under GNU Affero General Public License v >= 3.0 + * without warranty, see README.md and license for details. + * + * SPDX-License-Identifier: AGPL-3.0-or-later + * License-Filename: LICENSES/AGPL-3.0.txt + * + * Copyright (C) 2018 by via donau + * – Österreichische Wasserstraßen-Gesellschaft mbH + * Software engineering by Intevation GmbH + * + * Author(s): + * Markus Kottländer <markus.kottlaender@intevation.de> + */ +export default { + props: { + loading: { + type: Boolean, + default: false + }, + state: [Number, Boolean], + icons: { + type: [String, Array], + default: () => ["angle-down", "angle-up"] + }, + classes: { + type: [String, Array], + default: () => ["text-info", "text-white"] + } + }, + computed: { + classesString() { + return ( + "pointer " + + (Array.isArray(this.classes) + ? this.classes[Number(this.state)] + : this.classes) + ); + }, + iconString() { + return this.loading + ? "spinner" + : Array.isArray(this.icons) + ? this.icons[Number(this.state)] + : this.icons; + } + } +}; +</script>
--- a/client/src/main.js Tue Apr 02 14:14:32 2019 +0200 +++ b/client/src/main.js Tue Apr 02 14:33:09 2019 +0200 @@ -34,6 +34,7 @@ import UITableHeader from "@/components/ui/UITableHeader"; import UITableBody from "@/components/ui/UITableBody"; import UISpinnerOverlay from "@/components/ui/UISpinnerOverlay"; +import UISpinnerButton from "@/components/ui/UISpinnerButton"; // styles import "../node_modules/bootstrap/dist/css/bootstrap.min.css"; @@ -180,6 +181,7 @@ Vue.component("UITableHeader", UITableHeader); Vue.component("UITableBody", UITableBody); Vue.component("UISpinnerOverlay", UISpinnerOverlay); +Vue.component("UISpinnerButton", UISpinnerButton); // register global filters for (let name in filters) Vue.filter(name, filters[name]);