Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 37 additions & 13 deletions apps/files/src/components/BreadCrumbs.vue
Original file line number Diff line number Diff line change
@@ -1,3 +1,25 @@
<!--
- @copyright Copyright (c) 2023 John Molakvoæ <[email protected]>
-
- @author John Molakvoæ <[email protected]>
-
- @license AGPL-3.0-or-later
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-->

<template>
<NcBreadcrumbs
data-cy-files-content-breadcrumbs
Expand All @@ -22,18 +44,20 @@
</NcBreadcrumbs>
</template>

<script>
<script lang="ts">
import type { Node } from '@nextcloud/files'

import { translate as t} from '@nextcloud/l10n'
import { basename } from 'path'
import Home from 'vue-material-design-icons/Home.vue'
import NcBreadcrumb from '@nextcloud/vue/dist/Components/NcBreadcrumb.js'
import NcBreadcrumbs from '@nextcloud/vue/dist/Components/NcBreadcrumbs.js'
import Vue from 'vue'
import { defineComponent } from 'vue'

import { useFilesStore } from '../store/files.ts'
import { usePathsStore } from '../store/paths.ts'

export default Vue.extend({
export default defineComponent({
name: 'BreadCrumbs',

components: {
Expand Down Expand Up @@ -63,16 +87,16 @@ export default Vue.extend({
return this.$navigation.active
},

dirs() {
const cumulativePath = (acc) => (value) => (acc += `${value}/`)
dirs(): string[] {
const cumulativePath = (acc: string) => (value: string) => (acc += `${value}/`)
// Generate a cumulative path for each path segment: ['/', '/foo', '/foo/bar', ...] etc
const paths = this.path.split('/').filter(Boolean).map(cumulativePath('/'))
const paths: string[] = this.path.split('/').filter(Boolean).map(cumulativePath('/'))
// Strip away trailing slash
return ['/', ...paths.map(path => path.replace(/^(.+)\/$/, '$1'))]
return ['/', ...paths.map((path: string) => path.replace(/^(.+)\/$/, '$1'))]
},

sections() {
return this.dirs.map(dir => {
return this.dirs.map((dir: string) => {
const fileid = this.getFileIdFromPath(dir)
const to = { ...this.$route, params: { fileid }, query: { dir } }
return {
Expand All @@ -86,19 +110,19 @@ export default Vue.extend({
},

methods: {
getNodeFromId(id) {
getNodeFromId(id: number): Node | undefined {
return this.filesStore.getNode(id)
},
getFileIdFromPath(path) {
getFileIdFromPath(path: string): number | undefined {
return this.pathsStore.getPath(this.currentView?.id, path)
},
getDirDisplayName(path) {
getDirDisplayName(path: string): string {
if (path === '/') {
return t('files', 'Home')
}

const fileId = this.getFileIdFromPath(path)
const node = this.getNodeFromId(fileId)
const fileId: number | undefined = this.getFileIdFromPath(path)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You assert in the next line that the fileid is not undefined so you are sure this returns a valid number.
So I would say you should then assert on this line or be defensive on the next line.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I decided to be defensive on the next line. The changes in the updated commit is

const fileId: number | undefined = this.getFileIdFromPath(path)

const node: Node | undefined = (fileId) ? this.getNodeFromId(fileId) : undefined

Using getNodeFromId() will just access an array from the filestore, so accessing array[undefined] will throw undefined anyways, but its good to be declarative with the ternary operator. If you believe there is a better, more intuitive way to display this LMK!! :)

const node: Node | undefined = (fileId) ? this.getNodeFromId(fileId) : undefined
return node?.attributes?.displayName || basename(path)
},

Expand Down
4 changes: 2 additions & 2 deletions dist/files-main.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/files-main.js.map

Large diffs are not rendered by default.