aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files_trashbin/src
diff options
context:
space:
mode:
Diffstat (limited to 'apps/files_trashbin/src')
-rw-r--r--apps/files_trashbin/src/files_actions/restoreAction.ts4
-rw-r--r--apps/files_trashbin/src/files_views/columns.spec.ts18
-rw-r--r--apps/files_trashbin/src/files_views/columns.ts10
3 files changed, 22 insertions, 10 deletions
diff --git a/apps/files_trashbin/src/files_actions/restoreAction.ts b/apps/files_trashbin/src/files_actions/restoreAction.ts
index 9af0a13a2b0..3aeeceea7b3 100644
--- a/apps/files_trashbin/src/files_actions/restoreAction.ts
+++ b/apps/files_trashbin/src/files_actions/restoreAction.ts
@@ -3,6 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { getCurrentUser } from '@nextcloud/auth'
+import { showError } from '@nextcloud/dialogs'
import { emit } from '@nextcloud/event-bus'
import { Permission, Node, View, FileAction } from '@nextcloud/files'
import { t } from '@nextcloud/l10n'
@@ -52,6 +53,9 @@ export const restoreAction = new FileAction({
emit('files:node:deleted', node)
return true
} catch (error) {
+ if (error.response?.status === 507) {
+ showError(t('files_trashbin', 'Not enough free space to restore the file/folder'))
+ }
logger.error('Failed to restore node', { error, node })
return false
}
diff --git a/apps/files_trashbin/src/files_views/columns.spec.ts b/apps/files_trashbin/src/files_views/columns.spec.ts
index 12fb1628bb3..a22ef17ea6b 100644
--- a/apps/files_trashbin/src/files_views/columns.spec.ts
+++ b/apps/files_trashbin/src/files_views/columns.spec.ts
@@ -9,6 +9,12 @@ import { deleted, deletedBy, originalLocation } from './columns.ts'
import { trashbinView } from './trashbinView.ts'
import * as ncAuth from '@nextcloud/auth'
+vi.mock('@nextcloud/l10n', async (originalModule) => ({
+ ...(await originalModule()),
+ getLanguage: () => 'en',
+ getCanonicalLocale: () => 'en-US',
+}))
+
describe('files_trashbin: file list columns', () => {
describe('column: original location', () => {
@@ -100,19 +106,19 @@ describe('files_trashbin: file list columns', () => {
})
it('renders a node with deletion date', () => {
- const node = new File({ owner: 'test', source: 'https://example.com/remote.php/dav/files/test/a.txt', mime: 'text/plain', attributes: { 'trashbin-deletion-time': 1741684522 } })
+ const node = new File({ owner: 'test', source: 'https://example.com/remote.php/dav/files/test/a.txt', mime: 'text/plain', attributes: { 'trashbin-deletion-time': (Date.now() / 1000) - 120 } })
const el: HTMLElement = deleted.render(node, trashbinView)
expect(el).toBeInstanceOf(HTMLElement)
- expect(el.textContent).toBe('a minute ago')
- expect(el.title).toBe('March 11, 2025 9:15 AM')
+ expect(el.textContent).toBe('2 minutes ago')
+ expect(el.title).toBe('March 11, 2025 at 9:14 AM')
})
it('renders a node when deletion date is missing and falls back to mtime', () => {
- const node = new File({ owner: 'test', source: 'https://example.com/remote.php/dav/files/test/a.txt', mime: 'text/plain', mtime: new Date(1741684522000) })
+ const node = new File({ owner: 'test', source: 'https://example.com/remote.php/dav/files/test/a.txt', mime: 'text/plain', mtime: new Date(Date.now() - 60000) })
const el: HTMLElement = deleted.render(node, trashbinView)
expect(el).toBeInstanceOf(HTMLElement)
- expect(el.textContent).toBe('a minute ago')
- expect(el.title).toBe('March 11, 2025 9:15 AM')
+ expect(el.textContent).toBe('1 minute ago')
+ expect(el.title).toBe('March 11, 2025 at 9:15 AM')
})
it('renders a node when deletion date is missing', () => {
diff --git a/apps/files_trashbin/src/files_views/columns.ts b/apps/files_trashbin/src/files_views/columns.ts
index 78c5d368878..085d22c67a6 100644
--- a/apps/files_trashbin/src/files_views/columns.ts
+++ b/apps/files_trashbin/src/files_views/columns.ts
@@ -3,10 +3,9 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-import moment from '@nextcloud/moment'
import { getCurrentUser } from '@nextcloud/auth'
import { Column, Node } from '@nextcloud/files'
-import { getCanonicalLocale, getLanguage, translate as t } from '@nextcloud/l10n'
+import { formatRelativeTime, getCanonicalLocale, getLanguage, t } from '@nextcloud/l10n'
import { dirname } from '@nextcloud/paths'
import Vue from 'vue'
@@ -67,8 +66,11 @@ export const deleted = new Column({
const deletionTime = node.attributes?.['trashbin-deletion-time'] || ((node?.mtime?.getTime() ?? 0) / 1000)
const span = document.createElement('span')
if (deletionTime) {
- span.title = moment.unix(deletionTime).format('LLL')
- span.textContent = moment.unix(deletionTime).fromNow()
+ const formatter = Intl.DateTimeFormat([getCanonicalLocale()], { dateStyle: 'long', timeStyle: 'short' })
+ const timestamp = new Date(deletionTime * 1000)
+
+ span.title = formatter.format(timestamp)
+ span.textContent = formatRelativeTime(timestamp, { ignoreSeconds: t('files', 'few seconds ago') })
return span
}