Skip to content

Commit

Permalink
fix(dashboard): Correctly handle non-rounded icons for dashboard widgets
Browse files Browse the repository at this point in the history
Signed-off-by: Ferdinand Thiessen <[email protected]>
  • Loading branch information
susnux committed Jan 14, 2025
1 parent d74ec78 commit 002be92
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 17 deletions.
4 changes: 2 additions & 2 deletions apps/dashboard/src/DashboardApp.vue
Original file line number Diff line number Diff line change
Expand Up @@ -461,8 +461,8 @@ export default {
}
},
async fetchApiWidgets() {
const response = await axios.get(generateOcsUrl('/apps/dashboard/api/v1/widgets'))
this.apiWidgets = response.data.ocs.data
const { data } = await axios.get(generateOcsUrl('/apps/dashboard/api/v1/widgets'))
this.apiWidgets = data.ocs.data
},
async fetchApiWidgetItems(widgetIds, merge = false) {
try {
Expand Down
29 changes: 14 additions & 15 deletions apps/dashboard/src/components/ApiDashboardWidget.vue
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,7 @@
:show-items-and-empty-content="!!halfEmptyContentMessage"
:half-empty-content-message="halfEmptyContentMessage">
<template #default="{ item }">
<NcDashboardWidgetItem :target-url="item.link"
:overlay-icon-url="item.overlayIconUrl ? item.overlayIconUrl : ''"
:main-text="item.title"
:sub-text="item.subtitle">
<template #avatar>
<template v-if="item.iconUrl">
<NcAvatar :size="44" :url="item.iconUrl" />
</template>
</template>
</NcDashboardWidgetItem>
<ApiDashboardWidgetItem :item="item" :icon-size="iconSize" :rounded-icons="widget.item_icons_round" />
</template>
<template #empty-content>
<NcEmptyContent v-if="items.length === 0"
Expand All @@ -39,23 +30,21 @@

<script>
import {
NcAvatar,
NcDashboardWidget,
NcDashboardWidgetItem,
NcEmptyContent,
NcButton,
} from '@nextcloud/vue'
import CheckIcon from 'vue-material-design-icons/Check.vue'
import ApiDashboardWidgetItem from './ApiDashboardWidgetItem.vue'

export default {
name: 'ApiDashboardWidget',
components: {
NcAvatar,
ApiDashboardWidgetItem,
CheckIcon,
NcDashboardWidget,
NcDashboardWidgetItem,
NcEmptyContent,
NcButton,
CheckIcon,
},
props: {
widget: {
Expand All @@ -71,6 +60,11 @@ export default {
required: true,
},
},
data() {
return {
iconSize: 44,
}
},
computed: {
/** @return {object[]} */
items() {
Expand Down Expand Up @@ -115,5 +109,10 @@ export default {
return this.moreButton?.link
},
},
mounted() {
const size = window.getComputedStyle(document.body).getPropertyValue('--default-clickable-area')
const numeric = Number.parseFloat(size)
this.iconSize = Number.isNaN(numeric) ? 44 : numeric
},
}
</script>
68 changes: 68 additions & 0 deletions apps/dashboard/src/components/ApiDashboardWidgetItem.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<!--
- SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
<script setup lang="ts">
import { ref } from 'vue'
import NcAvatar from '@nextcloud/vue/dist/Components/NcAvatar.js'
import NcDashboardWidgetItem from '@nextcloud/vue/dist/Components/NcDashboardWidgetItem.js'
import IconFile from 'vue-material-design-icons/File.vue'

defineProps({
item: {
type: Object,
required: true,
},
iconSize: {
type: Number,
required: true,
},
roundedIcons: {
type: Boolean,
default: true,
},
})

/**
* True as soon as the image is loaded
*/
const imageLoaded = ref(false)
/**
* True if the image failed to load and we should show a fallback
*/
const loadingImageFailed = ref(false)
</script>

<template>
<NcDashboardWidgetItem :target-url="item.link"
:overlay-icon-url="item.overlayIconUrl ? item.overlayIconUrl : ''"
:main-text="item.title"
:sub-text="item.subtitle">
<template #avatar>
<template v-if="item.iconUrl">
<NcAvatar v-if="roundedIcons"
:size="iconSize"
:url="item.iconUrl" />
<template v-else>
<img v-show="!loadingImageFailed"
alt=""
class="api-dashboard-widget-item__icon"
:class="{'hidden-visually': !imageLoaded }"
:src="item.iconUrl"
@error="loadingImageFailed = true"
@load="imageLoaded = true">
<!-- Placeholder while the image is loaded and also the fallback if the URL is broken -->
<IconFile v-if="!imageLoaded"
:size="iconSize" />
</template>
</template>
</template>
</NcDashboardWidgetItem>
</template>

<style scoped>
.api-dashboard-widget-item__icon {
height: var(--default-clickable-area);
width: var(--default-clickable-area);
}
</style>

0 comments on commit 002be92

Please sign in to comment.