summaryrefslogtreecommitdiffstats
path: root/apps/files/src/components/FilesListHeader.vue
blob: 588d86709da3a43a82199be45c7fcd1866a27005 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<!--
  - @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev>
  -
  - @author Gary Kim <gary@garykim.dev>
  -
  - @license GNU AGPL version 3 or any later version
  -
  - 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>
	<tr>
		<th class="files-list__row-checkbox">
			<NcCheckboxRadioSwitch v-bind="selectAllBind" @update:checked="onToggleAll" />
		</th>

		<!-- Icon or preview -->
		<th class="files-list__row-icon" />

		<!-- Link to file and -->
		<th class="files-list__row-name">
			{{ t('files', 'Name') }}
		</th>
	</tr>
</template>

<script lang="ts">
import { translate } from '@nextcloud/l10n'
import NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'

import logger from '../logger'
import { File, Folder } from '@nextcloud/files'

export default {
	name: 'FilesListHeader',

	components: {
		NcCheckboxRadioSwitch,
	},

	props: {
		nodes: {
			type: [File, Folder],
			required: true,
		},
	},

	computed: {
		dir() {
			// Remove any trailing slash but leave root slash
			return (this.$route?.query?.dir || '/').replace(/^(.+)\/$/, '$1')
		},

		selectAllBind() {
			return {
				ariaLabel: this.isNoneSelected || this.isSomeSelected
					? this.t('files', 'Select all')
					: this.t('files', 'Unselect all'),
				checked: this.isAllSelected,
				indeterminate: this.isSomeSelected,
			}
		},

		isAllSelected() {
			return this.selectedFiles.length === this.nodes.length
		},

		isNoneSelected() {
			return this.selectedFiles.length === 0
		},

		isSomeSelected() {
			return !this.isAllSelected && !this.isNoneSelected
		},

		selectedFiles() {
			return this.$store.state.selection.selected
		},
	},

	methods: {
		/**
		 * Get a cached note from the store
		 *
		 * @param {number} fileId the file id to get
		 * @return {Folder|File}
		 */
		getNode(fileId) {
			return this.$store.getters['files/getNode'](fileId)
		},

		onToggleAll(selected) {
			if (selected) {
				const selection = this.nodes.map(node => node.attributes.fileid.toString())
				logger.debug('Added all nodes to selection', { selection })
				this.$store.dispatch('selection/set', selection)
			} else {
				logger.debug('Cleared selection')
				this.$store.dispatch('selection/reset')
			}
		},

		t: translate,
	},
}
</script>

<style scoped lang="scss">
@import '../mixins/fileslist-row.scss'

</style>