Mercurial > gemma
diff client/src/components/ui/UITableHeader.vue @ 2408:02d30251d594
client: table component for unified style
author | Markus Kottlaender <markus@intevation.de> |
---|---|
date | Thu, 28 Feb 2019 11:25:50 +0100 |
parents | |
children | 7ac90c4db14a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/components/ui/UITableHeader.vue Thu Feb 28 11:25:50 2019 +0100 @@ -0,0 +1,94 @@ +<template> + <div + :class="['table-header row no-gutters bg-light', { sortable: sortable }]" + > + <a + v-for="column in columns" + @click.prevent="sortBy(column.id)" + :key="column.id" + :class="[ + 'd-flex py-2 align-items-center justify-content-center small col ' + + column.class, + { active: sortColumn === column.id } + ]" + > + <span + :style="'opacity: ' + (sortColumn === column.id ? '1' : '0.3')" + v-if="sortable" + > + <font-awesome-icon + :icon="sortIcon(column.id)" + class="ml-1" + fixed-width + /> + </span> + {{ $gettext(column.title) }} + </a> + <div v-if="extraColumnForButtons" class="col"></div> + </div> +</template> + +<style lang="sass"> +.table-header + > a + border-right: solid 1px #e7e8e9 + background-color: #f8f9fa + a + outline: none + &:hover + text-decoration: none + background-color: #f8f9fa + &.sortable + a + cursor: pointer + &:hover, + &.active + background: #e7e8e9 +</style> + +<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: { + columns: { type: Array }, + sortable: { type: Boolean, default: true }, + extraColumnForButtons: { type: Boolean, default: true } + }, + data() { + return { + sortColumn: null, + sortDirection: "ASC" + }; + }, + methods: { + sortIcon(id) { + if (this.sortColumn === id) { + return "sort-" + (this.sortDirection === "ASC" ? "down" : "up"); + } + return "sort"; + }, + sortBy(id) { + if (this.sortable) { + this.sortColumn = id; + this.sortDirection = this.sortDirection === "ASC" ? "DESC" : "ASC"; + this.$emit("sortingChanged", { + sortColumn: this.sortColumn, + sortDirection: this.sortDirection + }); + } + } + } +}; +</script>