Skip to content

Commit 71209a3

Browse files
committed
Merge #301 [V32] Disabled checkbox and file list actions for e2ee folders
2 parents b9eb5ec + fb03183 commit 71209a3

3 files changed

Lines changed: 101 additions & 83 deletions

File tree

apps/files/src/components/FileEntry/FileEntryActions.vue

Lines changed: 84 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -6,63 +6,36 @@
66
<td class="files-list__row-actions"
77
data-cy-files-list-row-actions>
88
<!-- Render actions -->
9-
<CustomElementRender v-for="action in enabledRenderActions"
10-
:key="action.id"
11-
:class="'files-list__row-action-' + action.id"
12-
:current-view="currentView"
13-
:render="action.renderInline"
14-
:source="source"
15-
class="files-list__row-action--inline" />
16-
17-
<!-- Menu actions -->
18-
<NcActions ref="actionsMenu"
19-
:boundaries-element="getBoundariesElement"
20-
:container="getBoundariesElement"
21-
:force-name="true"
22-
type="tertiary"
23-
:force-menu="enabledInlineActions.length === 0 /* forceMenu only if no inline actions */"
24-
:inline="enabledInlineActions.length"
25-
:open="openedMenu"
26-
@close="onMenuClose"
27-
@closed="onMenuClosed">
28-
<!-- Non-destructive actions list -->
29-
<!-- Please keep this block in sync with the destructive actions block below -->
30-
<NcActionButton v-for="action, index in renderedNonDestructiveActions"
9+
<template v-if="!isEncrypted">
10+
<CustomElementRender v-for="action in enabledRenderActions"
3111
:key="action.id"
32-
:ref="`action-${action.id}`"
33-
class="files-list__row-action"
34-
:class="{
35-
[`files-list__row-action-${action.id}`]: true,
36-
'files-list__row-action--inline': index < enabledInlineActions.length,
37-
'files-list__row-action--menu': isValidMenu(action),
38-
}"
39-
:close-after-click="!isValidMenu(action)"
40-
:data-cy-files-list-row-action="action.id"
41-
:is-menu="isValidMenu(action)"
42-
:aria-label="action.title?.([source], currentView)"
43-
:title="action.title?.([source], currentView)"
44-
@click="onActionClick(action)">
45-
<template #icon>
46-
<NcLoadingIcon v-if="isLoadingAction(action)" />
47-
<NcIconSvgWrapper v-else
48-
class="files-list__row-action-icon"
49-
:svg="action.iconSvgInline([source], currentView)" />
50-
</template>
51-
{{ actionDisplayName(action) }}
52-
</NcActionButton>
53-
54-
<!-- Destructive actions list -->
55-
<template v-if="renderedDestructiveActions.length > 0">
56-
<NcActionSeparator />
57-
<NcActionButton v-for="action, index in renderedDestructiveActions"
12+
:class="'files-list__row-action-' + action.id"
13+
:current-view="currentView"
14+
:render="action.renderInline"
15+
:source="source"
16+
class="files-list__row-action--inline" />
17+
18+
<!-- Menu actions -->
19+
<NcActions ref="actionsMenu"
20+
:boundaries-element="getBoundariesElement"
21+
:container="getBoundariesElement"
22+
:force-name="true"
23+
type="tertiary"
24+
:force-menu="enabledInlineActions.length === 0 /* forceMenu only if no inline actions */"
25+
:inline="enabledInlineActions.length"
26+
:open="openedMenu"
27+
@close="onMenuClose"
28+
@closed="onMenuClosed">
29+
<!-- Non-destructive actions list -->
30+
<!-- Please keep this block in sync with the destructive actions block below -->
31+
<NcActionButton v-for="action, index in renderedNonDestructiveActions"
5832
:key="action.id"
5933
:ref="`action-${action.id}`"
6034
class="files-list__row-action"
6135
:class="{
6236
[`files-list__row-action-${action.id}`]: true,
6337
'files-list__row-action--inline': index < enabledInlineActions.length,
6438
'files-list__row-action--menu': isValidMenu(action),
65-
'files-list__row-action--destructive': true,
6639
}"
6740
:close-after-click="!isValidMenu(action)"
6841
:data-cy-files-list-row-action="action.id"
@@ -78,37 +51,66 @@
7851
</template>
7952
{{ actionDisplayName(action) }}
8053
</NcActionButton>
81-
</template>
8254

83-
<!-- Submenu actions list-->
84-
<template v-if="openedSubmenu && enabledSubmenuActions[openedSubmenu?.id]">
85-
<!-- Back to top-level button -->
86-
<NcActionButton class="files-list__row-action-back" data-cy-files-list-row-action="menu-back" @click="onBackToMenuClick(openedSubmenu)">
87-
<template #icon>
88-
<ArrowLeftIcon />
89-
</template>
90-
{{ t('files', 'Back') }}
91-
</NcActionButton>
92-
<NcActionSeparator />
55+
<!-- Destructive actions list -->
56+
<template v-if="renderedDestructiveActions.length > 0">
57+
<NcActionSeparator />
58+
<NcActionButton v-for="action, index in renderedDestructiveActions"
59+
:key="action.id"
60+
:ref="`action-${action.id}`"
61+
class="files-list__row-action"
62+
:class="{
63+
[`files-list__row-action-${action.id}`]: true,
64+
'files-list__row-action--inline': index < enabledInlineActions.length,
65+
'files-list__row-action--menu': isValidMenu(action),
66+
'files-list__row-action--destructive': true,
67+
}"
68+
:close-after-click="!isValidMenu(action)"
69+
:data-cy-files-list-row-action="action.id"
70+
:is-menu="isValidMenu(action)"
71+
:aria-label="action.title?.([source], currentView)"
72+
:title="action.title?.([source], currentView)"
73+
@click="onActionClick(action)">
74+
<template #icon>
75+
<NcLoadingIcon v-if="isLoadingAction(action)" />
76+
<NcIconSvgWrapper v-else
77+
class="files-list__row-action-icon"
78+
:svg="action.iconSvgInline([source], currentView)" />
79+
</template>
80+
{{ actionDisplayName(action) }}
81+
</NcActionButton>
82+
</template>
9383

94-
<!-- Submenu actions -->
95-
<NcActionButton v-for="action in enabledSubmenuActions[openedSubmenu?.id]"
96-
:key="action.id"
97-
:class="`files-list__row-action-${action.id}`"
98-
class="files-list__row-action--submenu"
99-
close-after-click
100-
:data-cy-files-list-row-action="action.id"
101-
:aria-label="action.title?.([source], currentView)"
102-
:title="action.title?.([source], currentView)"
103-
@click="onActionClick(action)">
104-
<template #icon>
105-
<NcLoadingIcon v-if="isLoadingAction(action)" />
106-
<NcIconSvgWrapper v-else :svg="action.iconSvgInline([source], currentView)" />
107-
</template>
108-
{{ actionDisplayName(action) }}
109-
</NcActionButton>
110-
</template>
111-
</NcActions>
84+
<!-- Submenu actions list-->
85+
<template v-if="openedSubmenu && enabledSubmenuActions[openedSubmenu?.id]">
86+
<!-- Back to top-level button -->
87+
<NcActionButton class="files-list__row-action-back" data-cy-files-list-row-action="menu-back" @click="onBackToMenuClick(openedSubmenu)">
88+
<template #icon>
89+
<ArrowLeftIcon />
90+
</template>
91+
{{ t('files', 'Back') }}
92+
</NcActionButton>
93+
<NcActionSeparator />
94+
95+
<!-- Submenu actions -->
96+
<NcActionButton v-for="action in enabledSubmenuActions[openedSubmenu?.id]"
97+
:key="action.id"
98+
:class="`files-list__row-action-${action.id}`"
99+
class="files-list__row-action--submenu"
100+
close-after-click
101+
:data-cy-files-list-row-action="action.id"
102+
:aria-label="action.title?.([source], currentView)"
103+
:title="action.title?.([source], currentView)"
104+
@click="onActionClick(action)">
105+
<template #icon>
106+
<NcLoadingIcon v-if="isLoadingAction(action)" />
107+
<NcIconSvgWrapper v-else :svg="action.iconSvgInline([source], currentView)" />
108+
</template>
109+
{{ actionDisplayName(action) }}
110+
</NcActionButton>
111+
</template>
112+
</NcActions>
113+
</template>
112114
</td>
113115
</template>
114116

@@ -194,6 +196,10 @@ export default defineComponent({
194196
return this.source.status === NodeStatus.LOADING
195197
},
196198
199+
isEncrypted(): boolean {
200+
return this.source?.attributes?.['is-encrypted'] === 1
201+
},
202+
197203
// Enabled action that are displayed inline
198204
enabledInlineActions() {
199205
if (this.filesListWidth < 768 || this.gridMode) {

apps/files/src/components/FileEntry/FileEntryCheckbox.vue

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<td class="files-list__row-checkbox"
77
@keyup.esc.exact="resetSelection">
88
<NcLoadingIcon v-if="isLoading" :name="loadingLabel" />
9-
<NcCheckboxRadioSwitch v-else
9+
<NcCheckboxRadioSwitch v-else-if="!isEncrypted"
1010
:aria-label="ariaLabel"
1111
:checked="isSelected"
1212
data-cy-files-list-row-checkbox
@@ -89,6 +89,9 @@ export default defineComponent({
8989
isFile() {
9090
return this.source.type === FileType.File
9191
},
92+
isEncrypted(): boolean {
93+
return this.source?.attributes?.['is-encrypted'] === 1
94+
},
9295
ariaLabel() {
9396
return this.isFile
9497
? t('files', 'Toggle selection for file "{displayName}"', { displayName: this.source.basename })

apps/files/src/components/FilesListTableHeader.vue

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,20 +157,29 @@ export default defineComponent({
157157
}
158158
},
159159
160+
selectableNodes(): Node[] {
161+
return this.nodes.filter((node: Node) => {
162+
const enc = node?.attributes?.['is-encrypted']
163+
return enc != 1
164+
})
165+
},
166+
160167
selectedNodes() {
161168
return this.selectionStore.selected
162169
},
163170
164171
isAllSelected() {
165-
return this.selectedNodes.length === this.nodes.length
172+
const total = this.selectableNodes.length
173+
return total > 0 && this.selectedNodes.length === total
166174
},
167175
168176
isNoneSelected() {
169177
return this.selectedNodes.length === 0
170178
},
171179
172180
isSomeSelected() {
173-
return !this.isAllSelected && !this.isNoneSelected
181+
const total = this.selectableNodes.length
182+
return this.selectedNodes.length > 0 && this.selectedNodes.length < total
174183
},
175184
},
176185
@@ -213,8 +222,8 @@ export default defineComponent({
213222
214223
onToggleAll(selected = true) {
215224
if (selected) {
216-
const selection = this.nodes.map(node => node.source).filter(Boolean) as FileSource[]
217-
logger.debug('Added all nodes to selection', { selection })
225+
const selection = this.selectableNodes.map(node => node.source).filter(Boolean) as FileSource[]
226+
logger.debug('Added all selectable nodes to selection', { selection })
218227
this.selectionStore.setLastIndex(null)
219228
this.selectionStore.set(selection)
220229
} else {

0 commit comments

Comments
 (0)