Compare commits

..

1 Commits

Author SHA1 Message Date
Ferdinand Thiessen 691aedd13e fix(db): set session timezone to UTC
Some (well all except sqlite) database platforms support timezone
configuration. The problem is that we expect everything in UTC,
but some servers might have set some different default (e.g. in database
configuration or even just because of `TZ` environment variable).

This causes incorrect values when expecting `NOW()` to return the
current time in UTC.

For PHP we already enforce UTC as timezone, this PR adds a middleware
that enforces UTC also as the database connection / session timezone.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-01 13:47:03 +02:00
905 changed files with 6217 additions and 7212 deletions
+1 -1
View File
@@ -55,7 +55,7 @@ package-lock.json @nextcloud/server-dependabot
/apps/user_ldap/appinfo/info.xml @come-nc @blizzz
/apps/user_status/appinfo/info.xml @Antreesy @nickvergessen
/apps/weather_status/appinfo/info.xml @julien-nc @juliusknorr
/apps/webhook_listeners/appinfo/info.xml @janepie @julien-nc
/apps/webhook_listeners/appinfo/info.xml @come-nc @julien-nc
/apps/workflowengine/appinfo/info.xml @blizzz @juliusknorr
# Files frontend expertise
-1
View File
@@ -9,7 +9,6 @@ on:
- ".github/workflows/phpunit-32bits.yml"
- "tests/phpunit-autotest.xml"
- "lib/private/Snowflake/*"
- "tests/lib/Preview/PreviewMapperTest.php"
workflow_dispatch:
schedule:
- cron: "15 1 * * 1-6"
+3
View File
@@ -129,6 +129,9 @@ jobs:
- name: PHPUnit
run: composer run test:db -- --log-junit junit.xml ${{ matrix.coverage && '--coverage-clover ./clover.db.xml' || '' }}
env:
DB_ROOT_USER: root
DB_ROOT_PASS: rootpassword
- name: Upload db code coverage
if: ${{ !cancelled() && matrix.coverage }}
+3
View File
@@ -129,6 +129,9 @@ jobs:
- name: PHPUnit
run: composer run test:db -- --log-junit junit.xml ${{ matrix.coverage && '--coverage-clover ./clover.db.xml' || '' }}
env:
DB_ROOT_USER: root
DB_ROOT_PASS: rootpassword
- name: Upload db code coverage
if: ${{ !cancelled() && matrix.coverage }}
+1 -39
View File
@@ -13,34 +13,10 @@ concurrency:
cancel-in-progress: true
jobs:
changes:
runs-on: ubuntu-latest-low
outputs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
id: changes
continue-on-error: true
with:
filters: |
src:
- '.github/workflows/**'
- '3rdparty/**'
- '**/lib/**'
- '**/tests/**'
- '**/vendor-bin/**'
- '.php-cs-fixer.dist.php'
- 'composer.json'
- 'composer.lock'
- '**.php'
strict:
runs-on: ubuntu-latest
needs: changes
if: ${{ needs.changes.outputs.src != 'false' && github.event_name != 'push' && github.repository_owner != 'nextcloud-gmbh' }}
if: ${{ github.event_name != 'push' && github.repository_owner != 'nextcloud-gmbh' }}
steps:
- name: Checkout
@@ -67,17 +43,3 @@ jobs:
- name: Show changes
if: always()
run: git diff --exit-code -- . ':!lib/composer'
summary:
permissions:
contents: none
runs-on: ubuntu-latest-low
needs: [changes, strict]
if: always()
name: rector-summary
steps:
- name: Summary status
run: if ${{ needs.changes.outputs.src != 'false' && needs.strict.result != 'success' }}; then exit 1; fi
+27 -32
View File
@@ -1,37 +1,32 @@
OC.L10N.register(
"comments",
{
"Comments" : "კომენტარები",
"You commented" : "თქვენი კომენტარი",
"{author} commented" : "{author}-ის კომენტარი",
"You commented on %1$s" : "თქვენი კომენტარი %1$s-ზე",
"You commented on {file}" : "თქვენი კომენტარი {file}-ზე",
"%1$s commented on %2$s" : "%1$s-მა დატოვა კომენტარი %2$s-ზე",
"{author} commented on {file}" : "{author}-მა დატოვა კომენტარი {file}-ზე",
"<strong>Comments</strong> for files" : "<strong>კომენტარები</strong> ფაილებისთვის",
"Files" : "ფაილები",
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "თქვენ გახსენეს \"{file}\"-ის კომენტარში ანგარიშიდან, რომელიც მის შემდეგ წაიშალა",
"{user} mentioned you in a comment on \"{file}\"" : "{user}-მა გახსენათ კომენტარში ფაილზე \"{file}\"",
"Files app plugin to add comments to files" : "Files აპის დამატება ფაილებზე კომენტარების დასამატებლად",
"Edit comment" : "კომენტარის ჩასწორება",
"Delete comment" : "კომენტარის წაშლა",
"Cancel edit" : "ჩასწორების გაუქმება",
"New comment" : "ახალი კომენტარი",
"Write a comment …" : "კომენტარის დაწერა …",
"Post comment" : "კომენტარის დაპოსტვა",
"@ for mentions, : for emoji, / for smart picker" : "@ ხსენებისთვის, : ემოჯისთვის, / ჭკვიანი ამრჩევისთვის",
"Could not reload comments" : "კომენტარების თავიდან ჩატვირთვა შეუძლებელია",
"Failed to mark comments as read" : "კომენტარების წაკითხულად მონიშვნა ჩავარდა",
"Unable to load the comments list" : "კომენტარების სიის ჩატვირთვა ჩავარდა",
"No comments yet, start the conversation!" : "ჯერ კომენტარები არაა. დაიწყეთ საუბარი!",
"No more messages" : "მეტი შეტყობინება აღარაა",
"Retry" : "თავიდან ცდა",
"_1 new comment_::_{unread} new comments_" : ["1 ახალი კომენტარი","{unread} ახალი კომენტარი"],
"Comment" : "კომენტარი",
"An error occurred while trying to edit the comment" : "კომენტარის ჩასწორებისას აღმოჩენილია შეცდომა",
"Comment deleted" : "კომენტარი წაიშალა",
"An error occurred while trying to delete the comment" : "კომენტარის წაშლისას აღმოჩენილია შეცდომა",
"An error occurred while trying to create the comment" : "კომენტარის შექმნისას აღმოჩენილია შეცდომა",
"Write a comment …" : "კომენტარის დაწერა …"
"Comments" : "Comments",
"You commented" : "You commented",
"{author} commented" : "{author} commented",
"You commented on %1$s" : "You commented on %1$s",
"You commented on {file}" : "You commented on {file}",
"%1$s commented on %2$s" : "%1$s commented on %2$s",
"{author} commented on {file}" : "{author} commented on {file}",
"<strong>Comments</strong> for files" : "<strong>Comments</strong> for files",
"{user} mentioned you in a comment on \"{file}\"" : "{user} mentioned you in a comment on \"{file}\"",
"Files app plugin to add comments to files" : "Files app plugin to add comments to files",
"Edit comment" : "Edit comment",
"Delete comment" : "Delete comment",
"Cancel edit" : "Cancel edit",
"Post comment" : "Post comment",
"@ for mentions, : for emoji, / for smart picker" : "@ for mentions, : for emoji, / for smart picker",
"Could not reload comments" : "Could not reload comments",
"Failed to mark comments as read" : "Failed to mark comments as read",
"Unable to load the comments list" : "Unable to load the comments list",
"No comments yet, start the conversation!" : "No comments yet, start the conversation!",
"No more messages" : "No more messages",
"Retry" : "Retry",
"_1 new comment_::_{unread} new comments_" : ["1 new comment","{unread} new comments"],
"Comment" : "Comment",
"An error occurred while trying to edit the comment" : "An error occurred while trying to edit the comment",
"Comment deleted" : "Comment deleted",
"An error occurred while trying to delete the comment" : "An error occurred while trying to delete the comment",
"An error occurred while trying to create the comment" : "An error occurred while trying to create the comment"
},
"nplurals=2; plural=(n!=1);");
+27 -32
View File
@@ -1,35 +1,30 @@
{ "translations": {
"Comments" : "კომენტარები",
"You commented" : "თქვენი კომენტარი",
"{author} commented" : "{author}-ის კომენტარი",
"You commented on %1$s" : "თქვენი კომენტარი %1$s-ზე",
"You commented on {file}" : "თქვენი კომენტარი {file}-ზე",
"%1$s commented on %2$s" : "%1$s-მა დატოვა კომენტარი %2$s-ზე",
"{author} commented on {file}" : "{author}-მა დატოვა კომენტარი {file}-ზე",
"<strong>Comments</strong> for files" : "<strong>კომენტარები</strong> ფაილებისთვის",
"Files" : "ფაილები",
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "თქვენ გახსენეს \"{file}\"-ის კომენტარში ანგარიშიდან, რომელიც მის შემდეგ წაიშალა",
"{user} mentioned you in a comment on \"{file}\"" : "{user}-მა გახსენათ კომენტარში ფაილზე \"{file}\"",
"Files app plugin to add comments to files" : "Files აპის დამატება ფაილებზე კომენტარების დასამატებლად",
"Edit comment" : "კომენტარის ჩასწორება",
"Delete comment" : "კომენტარის წაშლა",
"Cancel edit" : "ჩასწორების გაუქმება",
"New comment" : "ახალი კომენტარი",
"Write a comment …" : "კომენტარის დაწერა …",
"Post comment" : "კომენტარის დაპოსტვა",
"@ for mentions, : for emoji, / for smart picker" : "@ ხსენებისთვის, : ემოჯისთვის, / ჭკვიანი ამრჩევისთვის",
"Could not reload comments" : "კომენტარების თავიდან ჩატვირთვა შეუძლებელია",
"Failed to mark comments as read" : "კომენტარების წაკითხულად მონიშვნა ჩავარდა",
"Unable to load the comments list" : "კომენტარების სიის ჩატვირთვა ჩავარდა",
"No comments yet, start the conversation!" : "ჯერ კომენტარები არაა. დაიწყეთ საუბარი!",
"No more messages" : "მეტი შეტყობინება აღარაა",
"Retry" : "თავიდან ცდა",
"_1 new comment_::_{unread} new comments_" : ["1 ახალი კომენტარი","{unread} ახალი კომენტარი"],
"Comment" : "კომენტარი",
"An error occurred while trying to edit the comment" : "კომენტარის ჩასწორებისას აღმოჩენილია შეცდომა",
"Comment deleted" : "კომენტარი წაიშალა",
"An error occurred while trying to delete the comment" : "კომენტარის წაშლისას აღმოჩენილია შეცდომა",
"An error occurred while trying to create the comment" : "კომენტარის შექმნისას აღმოჩენილია შეცდომა",
"Write a comment …" : "კომენტარის დაწერა …"
"Comments" : "Comments",
"You commented" : "You commented",
"{author} commented" : "{author} commented",
"You commented on %1$s" : "You commented on %1$s",
"You commented on {file}" : "You commented on {file}",
"%1$s commented on %2$s" : "%1$s commented on %2$s",
"{author} commented on {file}" : "{author} commented on {file}",
"<strong>Comments</strong> for files" : "<strong>Comments</strong> for files",
"{user} mentioned you in a comment on \"{file}\"" : "{user} mentioned you in a comment on \"{file}\"",
"Files app plugin to add comments to files" : "Files app plugin to add comments to files",
"Edit comment" : "Edit comment",
"Delete comment" : "Delete comment",
"Cancel edit" : "Cancel edit",
"Post comment" : "Post comment",
"@ for mentions, : for emoji, / for smart picker" : "@ for mentions, : for emoji, / for smart picker",
"Could not reload comments" : "Could not reload comments",
"Failed to mark comments as read" : "Failed to mark comments as read",
"Unable to load the comments list" : "Unable to load the comments list",
"No comments yet, start the conversation!" : "No comments yet, start the conversation!",
"No more messages" : "No more messages",
"Retry" : "Retry",
"_1 new comment_::_{unread} new comments_" : ["1 new comment","{unread} new comments"],
"Comment" : "Comment",
"An error occurred while trying to edit the comment" : "An error occurred while trying to edit the comment",
"Comment deleted" : "Comment deleted",
"An error occurred while trying to delete the comment" : "An error occurred while trying to delete the comment",
"An error occurred while trying to create the comment" : "An error occurred while trying to create the comment"
},"pluralForm" :"nplurals=2; plural=(n!=1);"
}
@@ -34,8 +34,7 @@ class LoadSidebarScripts implements IEventListener {
$this->commentsManager->load();
$this->initialState->provideInitialState('activityEnabled', $this->appManager->isEnabledForUser('activity'));
// Add comments sidebar tab script/style
Util::addStyle(Application::APP_ID, 'comments-tab');
// Add comments sidebar tab script
Util::addScript(Application::APP_ID, 'comments-tab', 'files');
}
}
@@ -7,7 +7,7 @@ import type { IFolder, IView } from '@nextcloud/files'
import { File, Permission } from '@nextcloud/files'
import { describe, expect, test, vi } from 'vitest'
import logger from '../logger.ts'
import logger from '../logger.js'
import { action } from './inlineUnreadCommentsAction.ts'
const view = {
@@ -8,8 +8,8 @@ import type { IFileAction } from '@nextcloud/files'
import CommentProcessingSvg from '@mdi/svg/svg/comment-processing.svg?raw'
import { getSidebar } from '@nextcloud/files'
import { n, t } from '@nextcloud/l10n'
import logger from '../logger.ts'
import { isUsingActivityIntegration } from '../utils/activity.ts'
import logger from '../logger.js'
import { isUsingActivityIntegration } from '../utils/activity.js'
export const action: IFileAction = {
id: 'comments-unread',
+33 -27
View File
@@ -4,40 +4,46 @@
*/
import type { INode } from '@nextcloud/files'
import type { App } from 'vue'
import { createPinia } from 'pinia'
import { createApp } from 'vue'
import logger from './logger.ts'
import { getComments } from './services/GetComments.ts'
import moment from '@nextcloud/moment'
import { createPinia, PiniaVuePlugin } from 'pinia'
import Vue, { type ComponentPublicInstance } from 'vue'
import logger from './logger.js'
import { getComments } from './services/GetComments.js'
Vue.use(PiniaVuePlugin)
let ActivityTabPluginView
let ActivityTabPluginInstance
/**
* Register the comments plugins for the Activity sidebar
*/
export function registerCommentsPlugins() {
let app: App
window.OCA.Activity.registerSidebarAction({
mount: async (el: HTMLElement, { node, reload }: { node: INode, reload: () => void }) => {
const pinia = createPinia()
if (!app) {
if (!ActivityTabPluginView) {
const { default: ActivityCommentAction } = await import('./views/ActivityCommentAction.vue')
app = createApp(
ActivityCommentAction,
{
reloadCallback: reload,
resourceId: node.fileid,
},
)
// @ts-expect-error Types are broken for Vue2
ActivityTabPluginView = Vue.extend(ActivityCommentAction)
}
app.use(pinia)
app.mount(el)
ActivityTabPluginInstance = new ActivityTabPluginView({
el,
pinia,
propsData: {
reloadCallback: reload,
resourceId: node.fileid,
},
})
logger.info('Comments plugin mounted in Activity sidebar action', { node })
},
unmount: () => {
// destroy previous instance if available
app?.unmount()
if (ActivityTabPluginInstance) {
ActivityTabPluginInstance.$destroy()
}
},
})
@@ -51,26 +57,26 @@ export function registerCommentsPlugins() {
)
logger.debug('Loaded comments', { node, comments })
const { default: CommentView } = await import('./views/ActivityCommentEntry.vue')
// @ts-expect-error Types are broken for Vue2
const CommentsViewObject = Vue.extend(CommentView)
return comments.map((comment) => ({
_CommentsViewInstance: undefined as App | undefined,
_CommentsViewInstance: undefined as ComponentPublicInstance | undefined,
timestamp: Date.parse(comment.props?.creationDateTime as string | undefined ?? ''),
timestamp: moment(comment.props?.creationDateTime).toDate().getTime(),
mount(element: HTMLElement, { reload }) {
const app = createApp(
CommentView,
{
this._CommentsViewInstance = new CommentsViewObject({
el: element,
propsData: {
comment,
resourceId: node.fileid,
reloadCallback: reload,
},
)
app.mount(element)
this._CommentsViewInstance = app
})
},
unmount() {
this._CommentsViewInstance?.unmount()
this._CommentsViewInstance?.$destroy()
},
}))
})
@@ -3,8 +3,8 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import logger from './logger.ts'
import CommentsInstance from './services/CommentsInstance.ts'
import logger from './logger.js'
import CommentsInstance from './services/CommentsInstance.js'
// Init Comments
if (window.OCA && !window.OCA.Comments) {
+14 -15
View File
@@ -13,7 +13,7 @@
<!-- Author -->
<NcAvatar
class="comment__avatar"
:displayName="actorDisplayName"
:display-name="actorDisplayName"
:user="actorId"
:size="32" />
</div>
@@ -26,7 +26,7 @@
<NcActions v-if="isOwnComment && id && !loading" class="comment__actions">
<template v-if="!editing">
<NcActionButton
closeAfterClick
close-after-click
@click="onEdit">
<template #icon>
<IconPencilOutline :size="20" />
@@ -35,7 +35,7 @@
</NcActionButton>
<NcActionSeparator />
<NcActionButton
closeAfterClick
close-after-click
@click="onDeleteWithUndo">
<template #icon>
<IconTrashCanOutline :size="20" />
@@ -60,7 +60,7 @@
v-else-if="creationDateTime"
class="comment__timestamp"
:timestamp="timestamp"
:ignoreSeconds="true" />
:ignore-seconds="true" />
</div>
<!-- Message editor -->
@@ -68,14 +68,14 @@
<div class="comment__editor-group">
<NcRichContenteditable
ref="editor"
v-model="localMessage"
:autoComplete
:auto-complete="autoComplete"
:contenteditable="!loading"
:label="editor ? t('comments', 'New comment') : t('comments', 'Edit comment')"
:placeholder="t('comments', 'Write a comment ')"
:userData
:model-value="localMessage"
:user-data="userData"
aria-describedby="tab-comments__editor-description"
@update:modelValue="submitted = false"
@update:value="updateLocalMessage"
@submit="onSubmit" />
<div class="comment__submit">
<NcButton
@@ -103,8 +103,8 @@
:class="{ 'comment__message--expanded': expanded }"
:text="richContent.message"
:arguments="richContent.mentions"
useMarkdown
@click="onExpand" />
use-markdown
@click.native="onExpand" />
</div>
</component>
</template>
@@ -113,7 +113,6 @@
import { getCurrentUser } from '@nextcloud/auth'
import { translate as t } from '@nextcloud/l10n'
import { mapStores } from 'pinia'
import { defineAsyncComponent } from 'vue'
import NcActionButton from '@nextcloud/vue/components/NcActionButton'
import NcActions from '@nextcloud/vue/components/NcActions'
import NcActionSeparator from '@nextcloud/vue/components/NcActionSeparator'
@@ -126,12 +125,12 @@ import IconArrowRight from 'vue-material-design-icons/ArrowRight.vue'
import IconClose from 'vue-material-design-icons/Close.vue'
import IconPencilOutline from 'vue-material-design-icons/PencilOutline.vue'
import IconTrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue'
import CommentMixin from '../mixins/CommentMixin.ts'
import { useDeletedCommentLimbo } from '../store/deletedCommentLimbo.ts'
import CommentMixin from '../mixins/CommentMixin.js'
import { useDeletedCommentLimbo } from '../store/deletedCommentLimbo.js'
// Dynamic loading
const NcRichContenteditable = defineAsyncComponent(() => import('@nextcloud/vue/components/NcRichContenteditable'))
const NcRichText = defineAsyncComponent(() => import('@nextcloud/vue/components/NcRichText'))
const NcRichContenteditable = () => import('@nextcloud/vue/components/NcRichContenteditable')
const NcRichText = () => import('@nextcloud/vue/components/NcRichText')
export default {
/* eslint vue/multi-word-component-names: "warn" */
+16 -10
View File
@@ -4,13 +4,17 @@
*/
import MessageReplyText from '@mdi/svg/svg/message-reply-text.svg?raw'
import { getCSPNonce } from '@nextcloud/auth'
import { registerSidebarTab } from '@nextcloud/files'
import { t } from '@nextcloud/l10n'
import { createPinia } from 'pinia'
import { defineCustomElement } from 'vue'
import wrap from '@vue/web-component-wrapper'
import { createPinia, PiniaVuePlugin } from 'pinia'
import Vue from 'vue'
import { registerCommentsPlugins } from './comments-activity-tab.ts'
import { isUsingActivityIntegration } from './utils/activity.ts'
__webpack_nonce__ = getCSPNonce()
const tagName = 'comments_files-sidebar-tab'
if (isUsingActivityIntegration()) {
@@ -28,15 +32,17 @@ if (isUsingActivityIntegration()) {
async onInit() {
const { default: FilesSidebarTab } = await import('./views/FilesSidebarTab.vue')
const FilesSidebarTabElement = defineCustomElement(FilesSidebarTab, {
configureApp(app) {
const pinia = createPinia()
app.use(pinia)
},
shadowRoot: false,
Vue.use(PiniaVuePlugin)
Vue.mixin({ pinia: createPinia() })
const webComponent = wrap(Vue, FilesSidebarTab)
// In Vue 2, wrap doesn't support disabling shadow. Disable with a hack
Object.defineProperty(webComponent.prototype, 'attachShadow', {
value() { return this },
})
window.customElements.define(tagName, FilesSidebarTabElement)
Object.defineProperty(webComponent.prototype, 'shadowRoot', {
get() { return this },
})
window.customElements.define(tagName, webComponent)
},
})
}
@@ -5,11 +5,11 @@
import { showError, showUndo, TOAST_UNDO_TIMEOUT } from '@nextcloud/dialogs'
import { mapStores } from 'pinia'
import logger from '../logger.ts'
import DeleteComment from '../services/DeleteComment.ts'
import EditComment from '../services/EditComment.ts'
import NewComment from '../services/NewComment.ts'
import { useDeletedCommentLimbo } from '../store/deletedCommentLimbo.ts'
import logger from '../logger.js'
import DeleteComment from '../services/DeleteComment.js'
import EditComment from '../services/EditComment.js'
import NewComment from '../services/NewComment.js'
import { useDeletedCommentLimbo } from '../store/deletedCommentLimbo.js'
export default {
props: {
@@ -0,0 +1,53 @@
/**
* SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { getCSPNonce } from '@nextcloud/auth'
import { n, t } from '@nextcloud/l10n'
import { createPinia, PiniaVuePlugin } from 'pinia'
import Vue from 'vue'
import CommentsApp from '../views/Comments.vue'
import logger from '../logger.js'
Vue.use(PiniaVuePlugin)
__webpack_nonce__ = getCSPNonce()
// Add translates functions
Vue.mixin({
data() {
return {
logger,
}
},
methods: {
t,
n,
},
})
export default class CommentInstance {
/**
* Initialize a new Comments instance for the desired type
*
* @param {string} resourceType the comments endpoint type
* @param {object} options the vue options (propsData, parent, el...)
*/
constructor(resourceType = 'files', options = {}) {
const pinia = createPinia()
// Merge options and set `resourceType` property
options = {
...options,
propsData: {
...(options.propsData ?? {}),
resourceType,
},
pinia,
}
// Init Comments component
const View = Vue.extend(CommentsApp)
return new View(options)
}
}
@@ -1,94 +0,0 @@
/*!
* SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import type { App, ComponentPublicInstance } from 'vue'
import { n, t } from '@nextcloud/l10n'
import { createPinia } from 'pinia'
import { createApp } from 'vue'
import CommentsApp from '../views/CommentsApp.vue'
import logger from '../logger.ts'
export interface CommentsInstanceOptions {
el?: HTMLElement
props?: Record<string, unknown>
/** @deprecated use `props` instead */
propsData?: Record<string, unknown>
}
export default class CommentInstance {
private app: App
private instance: ComponentPublicInstance<typeof CommentsApp> | undefined
/**
* Initialize a new Comments instance for the desired type
*
* @param resourceType - The comments endpoint type
* @param options - The vue options (props, parent, el...)
*/
constructor(resourceType = 'files', options: CommentsInstanceOptions = {}) {
const pinia = createPinia()
this.app = createApp(
CommentsApp,
{
...(options.propsData ?? {}),
...(options.props ?? {}),
resourceType,
},
)
// Add translates functions
this.app.mixin({
data() {
return {
logger,
}
},
methods: {
t,
n,
},
})
this.app.use(pinia)
if (options.el) {
this.instance = this.app.mount(options.el)
}
}
/**
* Mount the Comments instance to a new element.
*
* @param el - The element to mount the instance on
*/
$mount(el: HTMLElement | string) {
if (this.instance) {
this.app.unmount()
}
this.instance = this.app.mount(el)
}
/**
* Unmount the Comments instance from the DOM and destroy it.
*/
$unmount() {
this.app.unmount()
this.instance = undefined
}
/**
* Update the current resource id.
*
* @param id - The new resource id to load the comments for
*/
update(id: string | number) {
if (this.instance) {
this.instance.update(id)
}
}
}
@@ -5,7 +5,7 @@
import { getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth'
import { createClient } from 'webdav'
import { getRootPath } from '../utils/davUtils.ts'
import { getRootPath } from '../utils/davUtils.js'
// init webdav client
const client = createClient(getRootPath())
@@ -3,16 +3,16 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import client from './DavClient.ts'
import client from './DavClient.js'
/**
* Delete a comment
*
* @param resourceType the resource type
* @param resourceId the resource ID
* @param commentId the comment iD
* @param {string} resourceType the resource type
* @param {number} resourceId the resource ID
* @param {number} commentId the comment iD
*/
export default async function(resourceType: string, resourceId: number, commentId: number) {
export default async function(resourceType, resourceId, commentId) {
const commentPath = ['', resourceType, resourceId, commentId].join('/')
// Fetch newly created comment data
@@ -3,17 +3,17 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import client from './DavClient.ts'
import client from './DavClient.js'
/**
* Edit an existing comment
*
* @param resourceType the resource type
* @param resourceId the resource ID
* @param commentId the comment iD
* @param message the message content
* @param {string} resourceType the resource type
* @param {number} resourceId the resource ID
* @param {number} commentId the comment iD
* @param {string} message the message content
*/
export default async function(resourceType: string, resourceId: number, commentId: number, message: string) {
export default async function(resourceType, resourceId, commentId, message) {
const commentPath = ['', resourceType, resourceId, commentId].join('/')
return await client.customRequest(commentPath, {
+1 -1
View File
@@ -8,7 +8,7 @@ import type { DAVResult, FileStat, ResponseDataDetailed } from 'webdav'
import { parseXML } from 'webdav'
import { processResponsePayload } from 'webdav/dist/node/response.js'
import { prepareFileFromProps } from 'webdav/dist/node/tools/dav.js'
import client from './DavClient.ts'
import client from './DavClient.js'
export const DEFAULT_LIMIT = 20
@@ -5,24 +5,24 @@
import { getCurrentUser } from '@nextcloud/auth'
import axios from '@nextcloud/axios'
import { getRootPath } from '../utils/davUtils.ts'
import { decodeHtmlEntities } from '../utils/decodeHtmlEntities.ts'
import client from './DavClient.ts'
import { getRootPath } from '../utils/davUtils.js'
import { decodeHtmlEntities } from '../utils/decodeHtmlEntities.js'
import client from './DavClient.js'
/**
* Retrieve the comments list
*
* @param resourceType the resource type
* @param resourceId the resource ID
* @param message the message
* @return The new comment
* @param {string} resourceType the resource type
* @param {number} resourceId the resource ID
* @param {string} message the message
* @return {object} the new comment
*/
export default async function(resourceType: string, resourceId: number, message: string) {
export default async function(resourceType, resourceId, message) {
const resourcePath = ['', resourceType, resourceId].join('/')
const response = await axios.post(getRootPath() + resourcePath, {
actorDisplayName: getCurrentUser()!.displayName,
actorId: getCurrentUser()!.uid,
actorDisplayName: getCurrentUser().displayName,
actorId: getCurrentUser().uid,
actorType: 'users',
creationDateTime: (new Date()).toUTCString(),
message,
+1 -1
View File
@@ -5,7 +5,7 @@
import type { Response } from 'webdav'
import client from './DavClient.ts'
import client from './DavClient.js'
/**
* Mark comments older than the date timestamp as read
@@ -6,20 +6,20 @@
/**
* Creates a cancelable axios 'request object'.
*
* @param request the axios promise request
* @return
* @param {Function} request the axios promise request
* @return {object}
*/
function cancelableRequest(request: (url: string, options?: Record<string, unknown>) => Promise<unknown>) {
function cancelableRequest(request) {
const controller = new AbortController()
const signal = controller.signal
/**
* Execute the request
*
* @param url the url to send the request to
* @param [options] optional config for the request
* @param {string} url the url to send the request to
* @param {object} [options] optional config for the request
*/
const fetch = async function(url: string, options?: Record<string, unknown>) {
const fetch = async function(url, options) {
const response = await request(
url,
{ signal, ...options },
@@ -4,10 +4,10 @@
*/
/**
* @param value - the string to decode
* @param passes - the number of times to decode the string, default is 1
* @param {any} value -
* @param {any} passes -
*/
export function decodeHtmlEntities(value: string, passes = 1) {
export function decodeHtmlEntities(value, passes = 1) {
const parser = new DOMParser()
let decoded = value
for (let i = 0; i < passes; i++) {
@@ -6,11 +6,11 @@
<template>
<Comment
v-bind="editorData"
:autoComplete="autoComplete"
:resourceType="resourceType"
:auto-complete="autoComplete"
:resource-type="resourceType"
:editor="true"
:userData="userData"
:resourceId="resourceId"
:user-data="userData"
:resource-id="resourceId"
class="comments-action"
@new="onNewComment" />
</template>
@@ -20,8 +20,8 @@ import { showError } from '@nextcloud/dialogs'
import { t } from '@nextcloud/l10n'
import { defineComponent } from 'vue'
import Comment from '../components/Comment.vue'
import logger from '../logger.ts'
import CommentView from '../mixins/CommentView.ts'
import logger from '../logger.js'
import CommentView from '../mixins/CommentView.js'
export default defineComponent({
components: {
@@ -8,11 +8,11 @@
ref="comment"
tag="li"
v-bind="comment.props"
:autoComplete="autoComplete"
:resourceType="resourceType"
:auto-complete="autoComplete"
:resource-type="resourceType"
:message="commentMessage"
:resourceId="resourceId"
:userData="genMentionsData(comment.props.mentions)"
:resource-id="resourceId"
:user-data="genMentionsData(comment.props.mentions)"
class="comments-activity"
@delete="reloadCallback()" />
</template>
@@ -11,11 +11,11 @@
<!-- Editor -->
<Comment
v-bind="editorData"
editor
:autoComplete
:resourceType
:userData
:resourceId="currentResourceId"
:auto-complete="autoComplete"
:resource-type="resourceType"
:editor="true"
:user-data="userData"
:resource-id="currentResourceId"
class="comments__writer"
@new="onNewComment" />
@@ -33,13 +33,13 @@
<Comment
v-for="comment in comments"
:key="comment.props.id"
v-model="comment.props.message"
tag="li"
v-bind="comment.props"
:autoComplete
:resourceType
:resourceId="currentResourceId"
:userData="genMentionsData(comment.props.mentions)"
:auto-complete="autoComplete"
:resource-type="resourceType"
:message.sync="comment.props.message"
:resource-id="currentResourceId"
:user-data="genMentionsData(comment.props.mentions)"
class="comments__list"
@delete="onDelete" />
</ul>
@@ -79,14 +79,15 @@ import IconAlertCircleOutline from 'vue-material-design-icons/AlertCircleOutline
import IconMessageReplyTextOutline from 'vue-material-design-icons/MessageReplyTextOutline.vue'
import IconRefresh from 'vue-material-design-icons/Refresh.vue'
import Comment from '../components/Comment.vue'
import logger from '../logger.ts'
import logger from '../logger.js'
import CommentView from '../mixins/CommentView.ts'
import { DEFAULT_LIMIT, getComments } from '../services/GetComments.ts'
import { markCommentsAsRead } from '../services/ReadComments.ts'
import cancelableRequest from '../utils/cancelableRequest.ts'
import cancelableRequest from '../utils/cancelableRequest.js'
export default {
name: 'CommentsApp',
/* eslint vue/multi-word-component-names: "warn" */
name: 'Comments',
components: {
Comment,
@@ -103,8 +104,6 @@ export default {
mixins: [CommentView],
expose: ['update'],
data() {
return {
error: '',
+4 -4
View File
@@ -7,7 +7,7 @@
import type { IFolder, INode, IView } from '@nextcloud/files'
import { computed } from 'vue'
import CommentsApp from './CommentsApp.vue'
import Comments from './Comments.vue'
const props = defineProps<{
node?: INode
@@ -24,9 +24,9 @@ const resourceId = computed(() => props.node?.fileid)
</script>
<template>
<CommentsApp
<Comments
v-if="resourceId !== undefined"
:key="resourceId"
:resourceId="resourceId"
resourceType="files" />
:resource-id="resourceId"
resource-type="files" />
</template>
@@ -202,7 +202,6 @@ class DashboardApiController extends OCSController {
#[NoAdminRequired]
#[ApiRoute(verb: 'POST', url: '/api/v3/layout')]
public function updateLayout(array $layout): DataResponse {
$layout = $this->service->sanitizeLayout($layout);
$this->userConfig->setValueString($this->userId, 'dashboard', 'layout', implode(',', $layout));
return new DataResponse(['layout' => $layout]);
}
@@ -31,30 +31,12 @@ class DashboardService {
*/
public function getLayout(): array {
$systemDefault = $this->appConfig->getAppValueString('layout', 'recommendations,spreed,mail,calendar');
return $this->sanitizeLayout(
return array_values(array_filter(
explode(',', $this->userConfig->getValueString($this->userId, 'dashboard', 'layout', $systemDefault)),
fn (string $value) => $value !== '')
);
}
/**
* @param list<string> $layout
* @return list<string>
*/
public function sanitizeLayout(array $layout): array {
$seen = [];
$result = [];
foreach ($layout as $value) {
if ($value === '' || isset($seen[$value])) {
continue;
}
$seen[$value] = true;
$result[] = $value;
}
return $result;
}
/**
* @return list<string>
*/
+1 -1
View File
@@ -5,7 +5,7 @@
<template>
<main id="app-dashboard">
<h2>{{ greeting.text }}</h2>
<ul v-if="sortedRegisteredStatus.length > 0" class="statuses">
<ul class="statuses">
<li
v-for="status in sortedRegisteredStatus"
:id="'status-' + status"
@@ -44,25 +44,6 @@ class DashboardServiceTest extends TestCase {
);
}
public function testGetLayoutRemovesEmptyAndDuplicateEntries(): void {
$this->appConfig->method('getAppValueString')
->with('layout', 'recommendations,spreed,mail,calendar')
->willReturn('recommendations,spreed,mail,calendar');
$this->userConfig->method('getValueString')
->with('alice', 'dashboard', 'layout', 'recommendations,spreed,mail,calendar')
->willReturn('spreed,,mail,mail,calendar,spreed');
$layout = $this->service->getLayout();
$this->assertSame(['spreed', 'mail', 'calendar'], $layout);
}
public function testSanitizeLayoutRemovesEmptyAndDuplicateEntries(): void {
$layout = $this->service->sanitizeLayout(['files', 'calendar', 'files', '', 'mail', 'calendar']);
$this->assertSame(['files', 'calendar', 'mail'], $layout);
}
public function testGetBirthdate(): void {
$user = $this->createMock(IUser::class);
$this->userManager->method('get')
-3
View File
@@ -204,8 +204,6 @@ OC.L10N.register(
"Could not rename part file to final file, canceled by hook" : "Ezin izan da zati-fitxategiaren izena aldatu azken fitxategira, kakoak bertan behera utzi du",
"Could not rename part file to final file" : "Ezin izan da zati-fitxategia azken fitxategira aldatu",
"Failed to check file size: %1$s" : "Ezin izan da egiaztatu fitxategiaren tamaina:%1$s",
"Could not open file: %1$s (%2$d), file does seem to exist" : "Ezin da fitxategi hau ireki: %1$s (%2$d), fitxategia badagoela dirudi",
"Could not open file: %1$s (%2$d), file doesn't seem to exist" : "Ezin da fitxategi hau ireki: %1$s (%2$d), fitxategia ez dagoela dirudi",
"Encryption not ready: %1$s" : "Enkriptatzea ez dago prest:%1$s",
"Failed to open file: %1$s" : "Ezin izan da fitxategia ireki:%1$s",
"Failed to unlink: %1$s" : "Ezin izan da deskonektatu:%1$s",
@@ -222,7 +220,6 @@ OC.L10N.register(
"Completed on %s" : "%s-an osatua",
"Due on %s by %s" : "%s-(e)an epemuga %s-(e)k",
"Due on %s" : "%s-(e)an epemuga",
"This is an example contact" : "Hau kontaktu adibide bat da",
"Welcome to Nextcloud Calendar!\n\nThis is a sample event - explore the flexibility of planning with Nextcloud Calendar by making any edits you want!\n\nWith Nextcloud Calendar, you can:\n- Create, edit, and manage events effortlessly.\n- Create multiple calendars and share them with teammates, friends, or family.\n- Check availability and display your busy times to others.\n- Seamlessly integrate with apps and devices via CalDAV.\n- Customize your experience: schedule recurring events, adjust notifications and other settings." : "Ongi etorri Nextcloud Egutegira!\n\nHau gertaera erakusgarria da - aztertu plangintzaren malgutasuna Nextcloud Egutegiarekin nahi dituzun edizioak eginez!\n\nNextcloud Egutegia aukerarekin, hau egin dezakezu:\n- Sortu, editatu eta kudeatu gertaerak esfortzurik gabe.\n- Egutegi ugari sortu eta taldekideekin, lagunekin edo familiarekin partekatu.\n- Egiaztatu libre egotea eta bistaratu zure laneko orduak beste batzuei.\n- Aplikazio eta gailuekin arazorik gabe integratzea CalDAV bidez.\n- Zure esperientzia pertsonalizatu: gertaera errepikariak programatu, jakinarazpenak doitu eta bestelako ezarpenak.",
"Example event - open me!" : "Gertaera adibidea - ireki nazazu!",
"System Address Book" : "Sistemaren helbide-liburua",
-3
View File
@@ -202,8 +202,6 @@
"Could not rename part file to final file, canceled by hook" : "Ezin izan da zati-fitxategiaren izena aldatu azken fitxategira, kakoak bertan behera utzi du",
"Could not rename part file to final file" : "Ezin izan da zati-fitxategia azken fitxategira aldatu",
"Failed to check file size: %1$s" : "Ezin izan da egiaztatu fitxategiaren tamaina:%1$s",
"Could not open file: %1$s (%2$d), file does seem to exist" : "Ezin da fitxategi hau ireki: %1$s (%2$d), fitxategia badagoela dirudi",
"Could not open file: %1$s (%2$d), file doesn't seem to exist" : "Ezin da fitxategi hau ireki: %1$s (%2$d), fitxategia ez dagoela dirudi",
"Encryption not ready: %1$s" : "Enkriptatzea ez dago prest:%1$s",
"Failed to open file: %1$s" : "Ezin izan da fitxategia ireki:%1$s",
"Failed to unlink: %1$s" : "Ezin izan da deskonektatu:%1$s",
@@ -220,7 +218,6 @@
"Completed on %s" : "%s-an osatua",
"Due on %s by %s" : "%s-(e)an epemuga %s-(e)k",
"Due on %s" : "%s-(e)an epemuga",
"This is an example contact" : "Hau kontaktu adibide bat da",
"Welcome to Nextcloud Calendar!\n\nThis is a sample event - explore the flexibility of planning with Nextcloud Calendar by making any edits you want!\n\nWith Nextcloud Calendar, you can:\n- Create, edit, and manage events effortlessly.\n- Create multiple calendars and share them with teammates, friends, or family.\n- Check availability and display your busy times to others.\n- Seamlessly integrate with apps and devices via CalDAV.\n- Customize your experience: schedule recurring events, adjust notifications and other settings." : "Ongi etorri Nextcloud Egutegira!\n\nHau gertaera erakusgarria da - aztertu plangintzaren malgutasuna Nextcloud Egutegiarekin nahi dituzun edizioak eginez!\n\nNextcloud Egutegia aukerarekin, hau egin dezakezu:\n- Sortu, editatu eta kudeatu gertaerak esfortzurik gabe.\n- Egutegi ugari sortu eta taldekideekin, lagunekin edo familiarekin partekatu.\n- Egiaztatu libre egotea eta bistaratu zure laneko orduak beste batzuei.\n- Aplikazio eta gailuekin arazorik gabe integratzea CalDAV bidez.\n- Zure esperientzia pertsonalizatu: gertaera errepikariak programatu, jakinarazpenak doitu eta bestelako ezarpenak.",
"Example event - open me!" : "Gertaera adibidea - ireki nazazu!",
"System Address Book" : "Sistemaren helbide-liburua",
+2 -3
View File
@@ -250,10 +250,9 @@ OC.L10N.register(
"Completed on %s" : "Completata il %s",
"Due on %s by %s" : "Scade il %s per %s",
"Due on %s" : "Scade il %s",
"This is an example contact" : "Questo è un contatto d'esempio",
"Welcome to Nextcloud Calendar!\n\nThis is a sample event - explore the flexibility of planning with Nextcloud Calendar by making any edits you want!\n\nWith Nextcloud Calendar, you can:\n- Create, edit, and manage events effortlessly.\n- Create multiple calendars and share them with teammates, friends, or family.\n- Check availability and display your busy times to others.\n- Seamlessly integrate with apps and devices via CalDAV.\n- Customize your experience: schedule recurring events, adjust notifications and other settings." : "Benvenuto nel Calendario Nextcloud!\n\nQuesto è un evento di esempio: scopri la flessibilità della pianificazione con Calendario Nextcloud apportando tutte le modifiche che desideri!\n\nCon il Calendario Nextcloud puoi:\n- Creare, modificare e gestire eventi senza alcuno sforzo.\n- Creare più calendari e condividerli con colleghi, amici o familiari.\n- Verificare la disponibilità e mostrare agli altri i tuoi impegni.\n- Integrare perfettamente app e dispositivi tramite CalDAV.\n- Personalizzare la tua esperienza: pianificare eventi ricorrenti, regolare le notifiche e altre impostazioni.",
"Example event - open me!" : "Evento d'esempio - aprimi!",
"System Address Book" : "Rubrica di sistema",
"System Address Book" : "Rubrica di Sistema",
"The system address book contains contact information for all users in your instance." : "La rubrica di sistema contiene le informazioni di contatto di tutti gli utenti della tua istanza.",
"Enable System Address Book" : "Abilita rubrica di sistema",
"DAV system address book" : "Rubrica di sistema DAV",
@@ -325,7 +324,7 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Invia notifiche di promemoria anche ai partecipanti al calendario",
"Reminders are always sent to organizers and attendees." : "I promemoria vengono sempre inviati agli organizzatori e ai partecipanti.",
"Enable notifications for events via push" : "Abilita notifiche per eventi tramite push",
"Example content" : "Contenuto di esempio",
"Example content" : "Contenuto d'esempio",
"Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "Il contenuto di esempio serve a mostrare le funzionalità di Nextcloud. Il contenuto predefinito viene fornito con Nextcloud e può essere sostituito da contenuti personalizzati.",
"Availability" : "Disponibilità",
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Se imposti il tuo orario di lavoro, le altre persone potranno vedere quando non sei in ufficio per organizzare una riunione.",
+2 -3
View File
@@ -248,10 +248,9 @@
"Completed on %s" : "Completata il %s",
"Due on %s by %s" : "Scade il %s per %s",
"Due on %s" : "Scade il %s",
"This is an example contact" : "Questo è un contatto d'esempio",
"Welcome to Nextcloud Calendar!\n\nThis is a sample event - explore the flexibility of planning with Nextcloud Calendar by making any edits you want!\n\nWith Nextcloud Calendar, you can:\n- Create, edit, and manage events effortlessly.\n- Create multiple calendars and share them with teammates, friends, or family.\n- Check availability and display your busy times to others.\n- Seamlessly integrate with apps and devices via CalDAV.\n- Customize your experience: schedule recurring events, adjust notifications and other settings." : "Benvenuto nel Calendario Nextcloud!\n\nQuesto è un evento di esempio: scopri la flessibilità della pianificazione con Calendario Nextcloud apportando tutte le modifiche che desideri!\n\nCon il Calendario Nextcloud puoi:\n- Creare, modificare e gestire eventi senza alcuno sforzo.\n- Creare più calendari e condividerli con colleghi, amici o familiari.\n- Verificare la disponibilità e mostrare agli altri i tuoi impegni.\n- Integrare perfettamente app e dispositivi tramite CalDAV.\n- Personalizzare la tua esperienza: pianificare eventi ricorrenti, regolare le notifiche e altre impostazioni.",
"Example event - open me!" : "Evento d'esempio - aprimi!",
"System Address Book" : "Rubrica di sistema",
"System Address Book" : "Rubrica di Sistema",
"The system address book contains contact information for all users in your instance." : "La rubrica di sistema contiene le informazioni di contatto di tutti gli utenti della tua istanza.",
"Enable System Address Book" : "Abilita rubrica di sistema",
"DAV system address book" : "Rubrica di sistema DAV",
@@ -323,7 +322,7 @@
"Send reminder notifications to calendar sharees as well" : "Invia notifiche di promemoria anche ai partecipanti al calendario",
"Reminders are always sent to organizers and attendees." : "I promemoria vengono sempre inviati agli organizzatori e ai partecipanti.",
"Enable notifications for events via push" : "Abilita notifiche per eventi tramite push",
"Example content" : "Contenuto di esempio",
"Example content" : "Contenuto d'esempio",
"Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "Il contenuto di esempio serve a mostrare le funzionalità di Nextcloud. Il contenuto predefinito viene fornito con Nextcloud e può essere sostituito da contenuti personalizzati.",
"Availability" : "Disponibilità",
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Se imposti il tuo orario di lavoro, le altre persone potranno vedere quando non sei in ufficio per organizzare una riunione.",
+1 -1
View File
@@ -148,7 +148,7 @@ OC.L10N.register(
"\"%1$s\" has been canceled" : "\"%1$s\" foi cancelado",
"Re: %1$s" : "Re: %1$s",
"%1$s has accepted your invitation" : "%1$s aceitou seu convite",
"%1$s has tentatively accepted your invitation" : "%1$s aceitou seu convite como tentativa",
"%1$s has tentatively accepted your invitation" : "%1$s aceitou provisoriamente seu convite",
"%1$s has declined your invitation" : "%1$s recusou seu convite",
"%1$s has responded to your invitation" : "%1$s respondeu ao seu convite",
"Invitation updated: %1$s" : "Convite atualizado: %1$s",
+1 -1
View File
@@ -146,7 +146,7 @@
"\"%1$s\" has been canceled" : "\"%1$s\" foi cancelado",
"Re: %1$s" : "Re: %1$s",
"%1$s has accepted your invitation" : "%1$s aceitou seu convite",
"%1$s has tentatively accepted your invitation" : "%1$s aceitou seu convite como tentativa",
"%1$s has tentatively accepted your invitation" : "%1$s aceitou provisoriamente seu convite",
"%1$s has declined your invitation" : "%1$s recusou seu convite",
"%1$s has responded to your invitation" : "%1$s respondeu ao seu convite",
"Invitation updated: %1$s" : "Convite atualizado: %1$s",
@@ -49,7 +49,7 @@ class BlockLegacyClientPlugin extends ServerPlugin {
return;
}
$minimumSupportedDesktopVersion = $this->config->getSystemValueString('minimum.supported.desktop.version', '3.1.83');
$minimumSupportedDesktopVersion = $this->config->getSystemValueString('minimum.supported.desktop.version', '3.1.81');
$maximumSupportedDesktopVersion = $this->config->getSystemValueString('maximum.supported.desktop.version', '99.99.99');
// Check if the client is a desktop client
@@ -38,12 +38,6 @@ class ZipFolderPlugin extends ServerPlugin {
*/
private ?Server $server = null;
/**
* Whether handleDownload has fully streamed an archive for the current request.
* Used by afterDownload to decide whether to suppress sabre/dav's own response logic.
*/
private bool $streamed = false;
public function __construct(
private Tree $tree,
private LoggerInterface $logger,
@@ -97,11 +91,10 @@ class ZipFolderPlugin extends ServerPlugin {
* It is possible to filter / limit the files that should be downloaded,
* either by passing (multiple) `X-NC-Files: the-file` headers
* or by setting a `files=JSON_ARRAY_OF_FILES` URL query.
*
* @return false|null
*/
public function handleDownload(Request $request, Response $response): ?false {
if ($request->getHeader('X-Sabre-Original-Method') === 'HEAD') {
return null;
}
public function handleDownload(Request $request, Response $response): ?bool {
$node = $this->tree->getNodeForPath($request->getPath());
if (!($node instanceof Directory)) {
// only handle directories
@@ -186,23 +179,21 @@ class ZipFolderPlugin extends ServerPlugin {
$this->streamNode($streamer, $node, $rootPath);
}
$streamer->finalize();
$this->streamed = true; // archive fully streamed
return false;
}
/**
* Tell sabre/dav not to trigger its own response sending logic as the handleDownload will have already sent the response
* Tell sabre/dav not to trigger it's own response sending logic as the handleDownload will have already send the response
*
* @return false|null
*/
public function afterDownload(Request $request, Response $response): ?false {
if ($request->getHeader('X-Sabre-Original-Method') === 'HEAD') {
public function afterDownload(Request $request, Response $response): ?bool {
$node = $this->tree->getNodeForPath($request->getPath());
if (!($node instanceof Directory)) {
// only handle directories
return null;
} else {
return false;
}
if (!$this->streamed) {
return null;
}
return false;
}
}
+1 -2
View File
@@ -343,7 +343,6 @@ class FileSearchBackend implements ISearchBackend {
}, $query->orderBy);
$limit = $query->limit;
$maxResults = $limit->maxResults !== 0 ? (int)$limit->maxResults : 100;
$offset = $limit->firstResult;
$limitHome = false;
@@ -371,7 +370,7 @@ class FileSearchBackend implements ISearchBackend {
return new SearchQuery(
$operators,
$maxResults,
(int)$limit->maxResults,
$offset,
$orders,
$this->user,
@@ -43,14 +43,6 @@ use Test\TestCase;
use Test\Traits\MountProviderTrait;
use Test\Traits\UserTrait;
/**
* Internal helper to mock legacy hook receiver.
*/
interface EventHandlerMock {
public function writeCallback(): void;
public function postWriteCallback(): void;
}
/**
* Class File
*
@@ -830,7 +822,9 @@ class FileTest extends TestCase {
$wasLockedPre = false;
$wasLockedPost = false;
$eventHandler = $this->createMock(EventHandlerMock::class);
$eventHandler = $this->getMockBuilder(\stdclass::class)
->addMethods(['writeCallback', 'postWriteCallback'])
->getMock();
// both pre and post hooks might need access to the file,
// so only shared lock is acceptable
@@ -97,7 +97,7 @@ class FileSearchBackendTest extends TestCase {
'name',
'foo'
),
100,
0,
0,
[],
$this->user
@@ -126,7 +126,7 @@ class FileSearchBackendTest extends TestCase {
'mimetype',
'foo'
),
100,
0,
0,
[],
$this->user
@@ -155,7 +155,7 @@ class FileSearchBackendTest extends TestCase {
'size',
10
),
100,
0,
0,
[],
$this->user
@@ -184,7 +184,7 @@ class FileSearchBackendTest extends TestCase {
'mtime',
10
),
100,
0,
0,
[],
$this->user
@@ -213,7 +213,7 @@ class FileSearchBackendTest extends TestCase {
'mimetype',
FileInfo::MIMETYPE_FOLDER
),
100,
0,
0,
[],
$this->user
+1 -11
View File
@@ -35,30 +35,21 @@ OC.L10N.register(
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan inte läsa denna filen, troligen är det en delad fil. Vänligen be ägaren att åter dela filen med dig.",
"Default Encryption Module" : "Standardmodul för kryptering",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Standardkrypteringsmodul för Nextcloud serverbaserad kryptering (SSE)",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to\n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Denna app tillhandahåller den (standard) kryptografiska implementeringen för Nextclouds funktion för serversidig kryptering (SSE).\n\n**Krypteringsdetaljer**\n* **Krypteringsläge:** AES-256-CTR (standard)\n* **Autentisering:** HMAC-SHA256\n\n**Viktiga varningar**\n* **FARA:** Inaktivera inte denna applikation förrän alla filer har dekrypterats (`occ encryption:decrypt-all`).\n* **VARNING**: För att återgå till icke-krypterad fillagring efter aktivering krävs åtkomst via kommandoraden. Åtgärden är permanent via webbgränssnittet.\n\n**Anmärkningar för befintliga filer**\n* Som standard krypteras inte befintliga filer när SSE aktiveras; endast nya filer krypteras.\n* Använd kommandot `occ encryption:encrypt-all` för att kryptera alla befintliga filer.\n\n**Innan du börjar**\n* **Läs dokumentationen:** Innan du aktiverar SSE, krypterar befintliga filer eller inaktiverar SSE är det viktigt att\nläsa dokumentationen för att förstå konsekvenserna och de lämpliga procedurerna för att undvika dataförlust.",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Aktivering av det här alternativet krypterar alla filer som är lagrade på huvudlagringsplatsen, annars kommer bara filer på extern lagringsplats att krypteras",
"Encrypt the home storage" : "Kryptera alla filer i molnet",
"Disable recovery key" : "Inaktivera återställningsnyckel",
"Enable recovery key" : "Aktivera återställningsnyckel",
"The recovery key is an additional encryption key used to encrypt files. It is used to recover files from an account if the password is forgotten." : "Återställningsnyckeln är en extra krypteringsnyckel som används för att kryptera filer. Den används för att återställa filer från ett konto om lösenordet glöms bort.",
"Recovery key password" : "Ange lösenord",
"Passwords fields do not match" : "Lösenorden matchar inte",
"Repeat recovery key password" : "Repetera lösenord",
"An error occurred while updating the recovery key settings. Please try again." : "Ett fel uppstod vid uppdateringen av inställningarna för återställningsnyckeln. Försök igen.",
"Change recovery key password" : "Ändra lösenordet för återställningsnyckeln",
"Old recovery key password" : "Gammalt lösenord",
"New recovery key password" : "Nytt lösenord",
"Repeat new recovery key password" : "Repetera lösenord",
"An error occurred while changing the recovery key password. Please try again." : "Ett fel uppstod när lösenordet för återställningsnyckeln skulle ändras. Försök igen.",
"Update private key password" : "Uppdatera lösenordet för den privata nyckeln",
"Your private key password no longer matches your log-in password. Set your old private key password to your current log-in password." : "Lösenordet till din privata nyckel stämmer inte längre överens med ditt inloggningslösenord. Ändra lösenordet till din privata nyckel så att det blir detsamma som ditt nuvarande inloggningslösenord.",
"If you do not remember your old password you can ask your administrator to recover your files." : "Om du inte kommer ihåg ditt gamla lösenord kan du be din administratör att återställa dina filer.",
"Old log-in password" : "Gammalt inloggningslösenord",
"Current log-in password" : "Nuvarande inloggningslösenord",
"Update" : "Uppdatera",
"Updating recovery keys. This can take some time…" : "Uppdaterar återställningsnycklar. Det kan ta en stund…",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Om du aktiverar det här alternativet kan du återställa åtkomst till dina krypterade filer vid lösenordsförlust",
"Enable password recovery" : "Aktivera återställning av lösenord",
"Default encryption module" : "Krypteringsfunktion",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsappen är aktiverad men dina krypteringsnycklar är inte initialiserade, vänligen logga ut och logga in igen.",
"Basic encryption module" : "Kryptering",
@@ -72,7 +63,6 @@ OC.L10N.register(
"Update Private Key Password" : "Uppdatera lösenordet för din privata nyckel",
"Enable password recovery:" : "Aktivera lösenordsåterställning:",
"Enabled" : "Aktiverad",
"Disabled" : "Inaktiverad",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to \n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Denna app tillhandahåller den (standard) kryptografiska implementeringen för Nextclouds funktion för serversidig kryptering (SSE).\n\n**Krypteringsdetaljer**\n* **Krypteringsläge:** AES-256-CTR (standard)\n* **Autentisering:** HMAC-SHA256\n\n**Viktiga varningar**\n* **FARA:** Inaktivera inte denna applikation förrän alla filer har dekrypterats (`occ encryption:decrypt-all`).\n* **VARNING**: För att återgå till icke-krypterad fillagring efter aktivering krävs åtkomst via kommandoraden. Åtgärden är permanent via webbgränssnittet.\n\n**Anmärkningar för befintliga filer**\n* Som standard krypteras inte befintliga filer när SSE aktiveras; endast nya filer krypteras.\n* Använd kommandot `occ encryption:encrypt-all` för att kryptera alla befintliga filer.\n\n**Innan du börjar**\n* **Läs dokumentationen:** Innan du aktiverar SSE, krypterar befintliga filer eller inaktiverar SSE är det viktigt att \nläsa dokumentationen för att förstå konsekvenserna och de lämpliga procedurerna för att undvika dataförlust."
"Disabled" : "Inaktiverad"
},
"nplurals=2; plural=(n != 1);");
+1 -11
View File
@@ -33,30 +33,21 @@
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan inte läsa denna filen, troligen är det en delad fil. Vänligen be ägaren att åter dela filen med dig.",
"Default Encryption Module" : "Standardmodul för kryptering",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Standardkrypteringsmodul för Nextcloud serverbaserad kryptering (SSE)",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to\n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Denna app tillhandahåller den (standard) kryptografiska implementeringen för Nextclouds funktion för serversidig kryptering (SSE).\n\n**Krypteringsdetaljer**\n* **Krypteringsläge:** AES-256-CTR (standard)\n* **Autentisering:** HMAC-SHA256\n\n**Viktiga varningar**\n* **FARA:** Inaktivera inte denna applikation förrän alla filer har dekrypterats (`occ encryption:decrypt-all`).\n* **VARNING**: För att återgå till icke-krypterad fillagring efter aktivering krävs åtkomst via kommandoraden. Åtgärden är permanent via webbgränssnittet.\n\n**Anmärkningar för befintliga filer**\n* Som standard krypteras inte befintliga filer när SSE aktiveras; endast nya filer krypteras.\n* Använd kommandot `occ encryption:encrypt-all` för att kryptera alla befintliga filer.\n\n**Innan du börjar**\n* **Läs dokumentationen:** Innan du aktiverar SSE, krypterar befintliga filer eller inaktiverar SSE är det viktigt att\nläsa dokumentationen för att förstå konsekvenserna och de lämpliga procedurerna för att undvika dataförlust.",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Aktivering av det här alternativet krypterar alla filer som är lagrade på huvudlagringsplatsen, annars kommer bara filer på extern lagringsplats att krypteras",
"Encrypt the home storage" : "Kryptera alla filer i molnet",
"Disable recovery key" : "Inaktivera återställningsnyckel",
"Enable recovery key" : "Aktivera återställningsnyckel",
"The recovery key is an additional encryption key used to encrypt files. It is used to recover files from an account if the password is forgotten." : "Återställningsnyckeln är en extra krypteringsnyckel som används för att kryptera filer. Den används för att återställa filer från ett konto om lösenordet glöms bort.",
"Recovery key password" : "Ange lösenord",
"Passwords fields do not match" : "Lösenorden matchar inte",
"Repeat recovery key password" : "Repetera lösenord",
"An error occurred while updating the recovery key settings. Please try again." : "Ett fel uppstod vid uppdateringen av inställningarna för återställningsnyckeln. Försök igen.",
"Change recovery key password" : "Ändra lösenordet för återställningsnyckeln",
"Old recovery key password" : "Gammalt lösenord",
"New recovery key password" : "Nytt lösenord",
"Repeat new recovery key password" : "Repetera lösenord",
"An error occurred while changing the recovery key password. Please try again." : "Ett fel uppstod när lösenordet för återställningsnyckeln skulle ändras. Försök igen.",
"Update private key password" : "Uppdatera lösenordet för den privata nyckeln",
"Your private key password no longer matches your log-in password. Set your old private key password to your current log-in password." : "Lösenordet till din privata nyckel stämmer inte längre överens med ditt inloggningslösenord. Ändra lösenordet till din privata nyckel så att det blir detsamma som ditt nuvarande inloggningslösenord.",
"If you do not remember your old password you can ask your administrator to recover your files." : "Om du inte kommer ihåg ditt gamla lösenord kan du be din administratör att återställa dina filer.",
"Old log-in password" : "Gammalt inloggningslösenord",
"Current log-in password" : "Nuvarande inloggningslösenord",
"Update" : "Uppdatera",
"Updating recovery keys. This can take some time…" : "Uppdaterar återställningsnycklar. Det kan ta en stund…",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Om du aktiverar det här alternativet kan du återställa åtkomst till dina krypterade filer vid lösenordsförlust",
"Enable password recovery" : "Aktivera återställning av lösenord",
"Default encryption module" : "Krypteringsfunktion",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsappen är aktiverad men dina krypteringsnycklar är inte initialiserade, vänligen logga ut och logga in igen.",
"Basic encryption module" : "Kryptering",
@@ -70,7 +61,6 @@
"Update Private Key Password" : "Uppdatera lösenordet för din privata nyckel",
"Enable password recovery:" : "Aktivera lösenordsåterställning:",
"Enabled" : "Aktiverad",
"Disabled" : "Inaktiverad",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to \n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Denna app tillhandahåller den (standard) kryptografiska implementeringen för Nextclouds funktion för serversidig kryptering (SSE).\n\n**Krypteringsdetaljer**\n* **Krypteringsläge:** AES-256-CTR (standard)\n* **Autentisering:** HMAC-SHA256\n\n**Viktiga varningar**\n* **FARA:** Inaktivera inte denna applikation förrän alla filer har dekrypterats (`occ encryption:decrypt-all`).\n* **VARNING**: För att återgå till icke-krypterad fillagring efter aktivering krävs åtkomst via kommandoraden. Åtgärden är permanent via webbgränssnittet.\n\n**Anmärkningar för befintliga filer**\n* Som standard krypteras inte befintliga filer när SSE aktiveras; endast nya filer krypteras.\n* Använd kommandot `occ encryption:encrypt-all` för att kryptera alla befintliga filer.\n\n**Innan du börjar**\n* **Läs dokumentationen:** Innan du aktiverar SSE, krypterar befintliga filer eller inaktiverar SSE är det viktigt att \nläsa dokumentationen för att förstå konsekvenserna och de lämpliga procedurerna för att undvika dataförlust."
"Disabled" : "Inaktiverad"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+1 -1
View File
@@ -244,7 +244,7 @@ OC.L10N.register(
"Files settings" : "Ρυθμίσεις αρχείων",
"Switch to list view" : "Αλλαγή σε προβολή λίστας",
"Switch to grid view" : "Εναλλαγή σε προβολή πλέγματος",
"The file could not be found" : "Το αρχείο δεν βρέθηκε",
"The file could not be found" : "Το αρχείο δεν μπορούσε να βρεθεί",
"Upload was cancelled by user" : "Η μεταφόρτωση ακυρώθηκε από τον χρήστη",
"Not enough free space" : "Δεν επαρκεί ο ελεύθερος χώρος",
"Operation is blocked by access control" : "Η λειτουργία μπλοκάρεται από τον έλεγχο πρόσβασης",
+1 -1
View File
@@ -242,7 +242,7 @@
"Files settings" : "Ρυθμίσεις αρχείων",
"Switch to list view" : "Αλλαγή σε προβολή λίστας",
"Switch to grid view" : "Εναλλαγή σε προβολή πλέγματος",
"The file could not be found" : "Το αρχείο δεν βρέθηκε",
"The file could not be found" : "Το αρχείο δεν μπορούσε να βρεθεί",
"Upload was cancelled by user" : "Η μεταφόρτωση ακυρώθηκε από τον χρήστη",
"Not enough free space" : "Δεν επαρκεί ο ελεύθερος χώρος",
"Operation is blocked by access control" : "Η λειτουργία μπλοκάρεται από τον έλεγχο πρόσβασης",
-12
View File
@@ -79,7 +79,6 @@ OC.L10N.register(
"Go to the \"{dir}\" directory" : "Ugrás a(z) „{dir}” könyvtárhoz",
"Current directory path" : "Jelenlegi könyvtár útvonala",
"Share" : "Megosztás",
"Reload content" : "Tartalom újratöltése",
"Your have used your space quota and cannot upload files anymore" : "Már felhasználta a tárhelykvótáját, így már nem tölthet fel fájlokat",
"You do not have permission to upload or create files here." : "Nincs jogosultsága, hogy fájlokat töltsön fel és hozzon létre itt.",
"Drag and drop files here to upload" : "Húzza ide a fájlokat a feltöltéshez",
@@ -95,7 +94,6 @@ OC.L10N.register(
"Another entry with the same name already exists." : "Már létezik ilyen nevű bejegyzés.",
"Invalid filename." : "Érvénytelen fájlnév.",
"Rename file" : "Fájl átnevezése",
"Recently created" : "Nemrég létrehozva",
"Folder" : "Mappa",
"Unknown file type" : "Ismeretlen fájltípus",
"{ext} image" : "{ext}-kép",
@@ -111,7 +109,6 @@ OC.L10N.register(
"Last 30 days" : "Előző 30 nap",
"This year ({year})" : "Idén ({year})",
"Last year ({year})" : "Tavaly ({year})",
"Custom range" : "Egyéni tartomány",
"Custom date range" : "Egyéni dátumtartomány",
"Search everywhere" : "Keresés mindenhol",
"Documents" : "Dokumentumok",
@@ -123,7 +120,6 @@ OC.L10N.register(
"Images" : "Képek",
"Videos" : "Videók",
"Filters" : "Szűrők",
"Back to filters" : "Vissza a szűrőkhöz",
"Appearance" : "Megjelenés",
"Show hidden files" : "Rejtett fájlok megjelenítése",
"Show file type column" : "Fájltípus oszlop megjelenítése",
@@ -235,9 +231,6 @@ OC.L10N.register(
"Removing the file extension \"{old}\" may render the file unreadable." : "A fájl „{old}” kiterjesztésének eltávolítása olvashatatlanná teheti azt.",
"Adding the file extension \"{new}\" may render the file unreadable." : "A fájl „{new}” kiterjesztésének hozzáadása olvashatatlanná teheti azt.",
"Do not show this dialog again." : "Ne jelenítse meg újra ezt a párbeszédablakot.",
"Rename file to hidden" : "Fájl átnevezése rejtettre",
"Prefixing a filename with a dot may render the file hidden." : "A fájlnév elé pont írása rejtetté teheti a fájlt.",
"Are you sure you want to rename the file to \"{filename}\"?" : "Biztos, hogy átnevezi erre a fájlt: „{filename}”?",
"Cancel" : "Mégse",
"Rename" : "Átnevezés",
"Select file or folder to link to" : "Válassza ki a hivatkozandó fájlt vagy mappát",
@@ -252,7 +245,6 @@ OC.L10N.register(
"Error during upload: {message}" : "Hiba a feltöltés során: {message}",
"Error during upload, status code {status}" : "Hiba a feltöltés közben, állapotkód: {status}",
"Unknown error during upload" : "Ismeretlen hiba a feltöltés során",
"File list is reloading" : "A fájllista újratöltődik",
"Loading current folder" : "Jelenlegi mappa betöltése",
"Retry" : "Újra",
"No files in here" : "Itt nincsenek fájlok",
@@ -320,9 +312,7 @@ OC.L10N.register(
"The files are locked" : "A fájlok zárolva vannak",
"The file does not exist anymore" : "Ez a fájl már nem létezik",
"Moving \"{source}\" to \"{destination}\" …" : "A(z) „{source}” áthelyezése ide: „{destination}”…",
"Moving {count} files to \"{destination}\" …" : "{count} fájl áthelyezési ide: „{destination}”…",
"Copying \"{source}\" to \"{destination}\" …" : "A(z) „{source}” másolása ide: „{destination}”…",
"Copying {count} files to \"{destination}\" …" : "{count} fájl másolása ide: „{destination}”…",
"Choose destination" : "Válasszon célt",
"Copy to {target}" : "Másolás ide: {target}",
"Move to {target}" : "Áthelyezés ide: {target}",
@@ -337,7 +327,6 @@ OC.L10N.register(
"Retry and close" : "Újrapróbálás és bezárás",
"Open online" : "Megnyitás online",
"Details" : "Részletek",
"Open the details sidebar" : "Részletek oldalsáv megnyitása",
"Unfavorite" : "Nem kedvenc",
"View in folder" : "Megtekintés mappában",
"Type" : "Típus",
@@ -347,7 +336,6 @@ OC.L10N.register(
"Templates" : "Sablonok",
"New template folder" : "Új sablonmappa",
"In folder" : "Könyvtárban",
"Pick folder to search in" : "Válasszon mappát a kereséshez",
"Search in all files" : "Keresés az összes fájlban",
"Search in folder: {folder}" : "Keresés a mappában: {folder}",
"One of the dropped files could not be processed" : "Egy vagy több idehúzott fájl nem dolgozható fel",
-12
View File
@@ -77,7 +77,6 @@
"Go to the \"{dir}\" directory" : "Ugrás a(z) „{dir}” könyvtárhoz",
"Current directory path" : "Jelenlegi könyvtár útvonala",
"Share" : "Megosztás",
"Reload content" : "Tartalom újratöltése",
"Your have used your space quota and cannot upload files anymore" : "Már felhasználta a tárhelykvótáját, így már nem tölthet fel fájlokat",
"You do not have permission to upload or create files here." : "Nincs jogosultsága, hogy fájlokat töltsön fel és hozzon létre itt.",
"Drag and drop files here to upload" : "Húzza ide a fájlokat a feltöltéshez",
@@ -93,7 +92,6 @@
"Another entry with the same name already exists." : "Már létezik ilyen nevű bejegyzés.",
"Invalid filename." : "Érvénytelen fájlnév.",
"Rename file" : "Fájl átnevezése",
"Recently created" : "Nemrég létrehozva",
"Folder" : "Mappa",
"Unknown file type" : "Ismeretlen fájltípus",
"{ext} image" : "{ext}-kép",
@@ -109,7 +107,6 @@
"Last 30 days" : "Előző 30 nap",
"This year ({year})" : "Idén ({year})",
"Last year ({year})" : "Tavaly ({year})",
"Custom range" : "Egyéni tartomány",
"Custom date range" : "Egyéni dátumtartomány",
"Search everywhere" : "Keresés mindenhol",
"Documents" : "Dokumentumok",
@@ -121,7 +118,6 @@
"Images" : "Képek",
"Videos" : "Videók",
"Filters" : "Szűrők",
"Back to filters" : "Vissza a szűrőkhöz",
"Appearance" : "Megjelenés",
"Show hidden files" : "Rejtett fájlok megjelenítése",
"Show file type column" : "Fájltípus oszlop megjelenítése",
@@ -233,9 +229,6 @@
"Removing the file extension \"{old}\" may render the file unreadable." : "A fájl „{old}” kiterjesztésének eltávolítása olvashatatlanná teheti azt.",
"Adding the file extension \"{new}\" may render the file unreadable." : "A fájl „{new}” kiterjesztésének hozzáadása olvashatatlanná teheti azt.",
"Do not show this dialog again." : "Ne jelenítse meg újra ezt a párbeszédablakot.",
"Rename file to hidden" : "Fájl átnevezése rejtettre",
"Prefixing a filename with a dot may render the file hidden." : "A fájlnév elé pont írása rejtetté teheti a fájlt.",
"Are you sure you want to rename the file to \"{filename}\"?" : "Biztos, hogy átnevezi erre a fájlt: „{filename}”?",
"Cancel" : "Mégse",
"Rename" : "Átnevezés",
"Select file or folder to link to" : "Válassza ki a hivatkozandó fájlt vagy mappát",
@@ -250,7 +243,6 @@
"Error during upload: {message}" : "Hiba a feltöltés során: {message}",
"Error during upload, status code {status}" : "Hiba a feltöltés közben, állapotkód: {status}",
"Unknown error during upload" : "Ismeretlen hiba a feltöltés során",
"File list is reloading" : "A fájllista újratöltődik",
"Loading current folder" : "Jelenlegi mappa betöltése",
"Retry" : "Újra",
"No files in here" : "Itt nincsenek fájlok",
@@ -318,9 +310,7 @@
"The files are locked" : "A fájlok zárolva vannak",
"The file does not exist anymore" : "Ez a fájl már nem létezik",
"Moving \"{source}\" to \"{destination}\" …" : "A(z) „{source}” áthelyezése ide: „{destination}”…",
"Moving {count} files to \"{destination}\" …" : "{count} fájl áthelyezési ide: „{destination}”…",
"Copying \"{source}\" to \"{destination}\" …" : "A(z) „{source}” másolása ide: „{destination}”…",
"Copying {count} files to \"{destination}\" …" : "{count} fájl másolása ide: „{destination}”…",
"Choose destination" : "Válasszon célt",
"Copy to {target}" : "Másolás ide: {target}",
"Move to {target}" : "Áthelyezés ide: {target}",
@@ -335,7 +325,6 @@
"Retry and close" : "Újrapróbálás és bezárás",
"Open online" : "Megnyitás online",
"Details" : "Részletek",
"Open the details sidebar" : "Részletek oldalsáv megnyitása",
"Unfavorite" : "Nem kedvenc",
"View in folder" : "Megtekintés mappában",
"Type" : "Típus",
@@ -345,7 +334,6 @@
"Templates" : "Sablonok",
"New template folder" : "Új sablonmappa",
"In folder" : "Könyvtárban",
"Pick folder to search in" : "Válasszon mappát a kereséshez",
"Search in all files" : "Keresés az összes fájlban",
"Search in folder: {folder}" : "Keresés a mappában: {folder}",
"One of the dropped files could not be processed" : "Egy vagy több idehúzott fájl nem dolgozható fel",
-21
View File
@@ -79,7 +79,6 @@ OC.L10N.register(
"Go to the \"{dir}\" directory" : "Fara í heimamöppu",
"Current directory path" : "Fyrirliggjandi slóð að möppu",
"Share" : "Deila",
"Reload content" : "Endurlesa efni",
"Your have used your space quota and cannot upload files anymore" : "Þú hefur fullnýtt geymslukvótann þinn og getur ekki lengur sent inn skrár",
"You do not have permission to upload or create files here." : "Þú hefur ekki heimild til að senda inn eða búa til skrár hér.",
"Drag and drop files here to upload" : "Dragðu og slepptu hér skrám til að senda inn",
@@ -95,7 +94,6 @@ OC.L10N.register(
"Another entry with the same name already exists." : "Önnur færsla með sama heiti er þegar til staðar.",
"Invalid filename." : "Ógilt skráarheiti.",
"Rename file" : "Endurnefna skrá",
"Recently created" : "Nýlega útbúið",
"Folder" : "Mappa",
"Unknown file type" : "Óþekkt skráartegund",
"{ext} image" : "{ext} mynd",
@@ -111,7 +109,6 @@ OC.L10N.register(
"Last 30 days" : "Síðustu 30 daga",
"This year ({year})" : "Þetta ár ({year})",
"Last year ({year})" : "Síðasta ár ({year})",
"Custom range" : "Sérsniðið bil",
"Custom date range" : "Sérsniðið dagsetningabil",
"Search everywhere" : "Leita allsstaðar",
"Documents" : "Skjöl",
@@ -123,7 +120,6 @@ OC.L10N.register(
"Images" : "Myndir",
"Videos" : "Myndskeið",
"Filters" : "Síur",
"Back to filters" : "Til baka í síur",
"Appearance" : "Útlit",
"Show hidden files" : "Sýna faldar skrár",
"Show file type column" : "Sýna dálk fyrir skráategund",
@@ -132,7 +128,6 @@ OC.L10N.register(
"General" : "Almennt",
"Sort favorites first" : "Raða eftirlætum fremst",
"Sort folders before files" : "Raða möppum á undan skrám",
"Enable folder tree view" : "Virkja möppugreinasýn",
"Default view" : "Sjálfgefin sýn",
"All files" : "Allar skrár",
"Personal files" : "Einkaskrár",
@@ -155,10 +150,7 @@ OC.L10N.register(
"Show those shortcuts" : "Sýna þessa flýtilykla",
"Warnings" : "Aðvaranir",
"Warn before changing a file extension" : "Aðvara áður en skráarendingu er breytt",
"Warn before deleting a file" : "Aðvara áður en skrá er eytt",
"WebDAV URL" : "WebDAV-slóð",
"Create an app password" : "Búa til lykilorð forrits",
"Required for WebDAV authentication because Two-Factor Authentication is enabled for this account." : "Er krafist fyrir WebDAV-auðkenningu þar sem tveggja-þátta auðkenning er virkjuð fyrir þennan aðgang.",
"How to access files using WebDAV" : "Hvernig á að nálgast skrár í gegnum WebDAV",
"Total rows summary" : "Samantek á fjölda raða",
"Toggle selection for all files and folders" : "Víxla vali af/á fyrir allar skrár og möppur",
@@ -235,9 +227,6 @@ OC.L10N.register(
"Removing the file extension \"{old}\" may render the file unreadable." : "Sé skráaendingin \"{old}\" fjarlægð, gæti skráin orðið ólæsileg.",
"Adding the file extension \"{new}\" may render the file unreadable." : "Sé skráaendingunni \"{new}\" bætt við, gæti skráin orðið ólæsileg.",
"Do not show this dialog again." : "Ekki sýna þennan glugga aftur.",
"Rename file to hidden" : "Endurnefna skrá sem falda",
"Prefixing a filename with a dot may render the file hidden." : "Sé settur punktur framan við skráaheiti, gæti skráin orðið falin.",
"Are you sure you want to rename the file to \"{filename}\"?" : "Ertu viss um að þú viljir endurnefna skrána sem \"{filename}\"?",
"Cancel" : "Hætta við",
"Rename" : "Endurnefna",
"Select file or folder to link to" : "Veldu skrá eða möppu til að tengja í",
@@ -252,13 +241,11 @@ OC.L10N.register(
"Error during upload: {message}" : "Villa við innsendingu: {message}",
"Error during upload, status code {status}" : "Villa við innsendingu, stöðukóði: {status}",
"Unknown error during upload" : "Óþekkt villa við innsendingu",
"File list is reloading" : "Skráalisti er að hlaðast inn",
"Loading current folder" : "Hleð inn núverandi möppu",
"Retry" : "Reyna aftur",
"No files in here" : "Engar skrár hér",
"Upload some content or sync with your devices!" : "Sendu inn eitthvað efni eða samstilltu við tækin þín!",
"Go back" : "Fara til baka",
"Loading …" : "Hleð inn…",
"Your files" : "Skrárnar þínar",
"Open in files" : "Opna í skráaforritinu",
"File cannot be accessed" : "Skráin er ekki aðgengileg",
@@ -282,9 +269,6 @@ OC.L10N.register(
"Failed to convert files: {message}" : "Mistókst að umbreyta skrám: {message}",
"All files failed to be converted" : "Mistókst að umbreyta öllum skrám",
"One file could not be converted: {message}" : "Ekki var hægt að umbreyta einni skrá: {message}",
"_%n file could not be converted_::_%n files could not be converted_" : ["Ekki var hægt að umbreyta %n skrá","Ekki var hægt að umbreyta %n skrám"],
"_%n file converted_::_%n files converted_" : ["%n skrá umbreytt","%n skrám umbreytt"],
"Files converted" : "Skrám umbreytt",
"Failed to convert files" : "Mistókst að umbreyta skrám",
"Converting file …" : "Umbreyti skrá…",
"File successfully converted" : "Tókst að umbreyta skrá",
@@ -320,9 +304,7 @@ OC.L10N.register(
"The files are locked" : "Skrárnar eru læstar",
"The file does not exist anymore" : "Skráin er ekki lengur til",
"Moving \"{source}\" to \"{destination}\" …" : "Færi \"{source}\" í \"{destination}\" …",
"Moving {count} files to \"{destination}\" …" : "Færi {count} skrár í \"{destination}\" …",
"Copying \"{source}\" to \"{destination}\" …" : "Afrita \"{source}\" í \"{destination}\" …",
"Copying {count} files to \"{destination}\" …" : "Afrita {count} skrár í \"{destination}\" …",
"Choose destination" : "Veldu áfangastað",
"Copy to {target}" : "Afrita í {target}",
"Move to {target}" : "Færa í {target}",
@@ -337,8 +319,6 @@ OC.L10N.register(
"Retry and close" : "Prófa aftur og loka",
"Open online" : "Opna á netinu",
"Details" : "Nánar",
"Open the details sidebar" : "Opna hliðarspjald með ítarupplýsingum",
"Unfavorite" : "Taka úr eftirlætum",
"View in folder" : "Skoða í möppu",
"Type" : "Tegund",
"Created new folder \"{name}\"" : "Bjó til nýja möppu \"{name}\"",
@@ -347,7 +327,6 @@ OC.L10N.register(
"Templates" : "Sniðmát",
"New template folder" : "Ný mappa fyrir sniðmát",
"In folder" : "Í möppunni",
"Pick folder to search in" : "Veldu möppu til að leita í",
"Search in all files" : "Leita í öllum skrám",
"Search in folder: {folder}" : "Leita í möppunni: {folder}",
"One of the dropped files could not be processed" : "Ekki var hægt að vinna með eina af slepptu skránum",
-21
View File
@@ -77,7 +77,6 @@
"Go to the \"{dir}\" directory" : "Fara í heimamöppu",
"Current directory path" : "Fyrirliggjandi slóð að möppu",
"Share" : "Deila",
"Reload content" : "Endurlesa efni",
"Your have used your space quota and cannot upload files anymore" : "Þú hefur fullnýtt geymslukvótann þinn og getur ekki lengur sent inn skrár",
"You do not have permission to upload or create files here." : "Þú hefur ekki heimild til að senda inn eða búa til skrár hér.",
"Drag and drop files here to upload" : "Dragðu og slepptu hér skrám til að senda inn",
@@ -93,7 +92,6 @@
"Another entry with the same name already exists." : "Önnur færsla með sama heiti er þegar til staðar.",
"Invalid filename." : "Ógilt skráarheiti.",
"Rename file" : "Endurnefna skrá",
"Recently created" : "Nýlega útbúið",
"Folder" : "Mappa",
"Unknown file type" : "Óþekkt skráartegund",
"{ext} image" : "{ext} mynd",
@@ -109,7 +107,6 @@
"Last 30 days" : "Síðustu 30 daga",
"This year ({year})" : "Þetta ár ({year})",
"Last year ({year})" : "Síðasta ár ({year})",
"Custom range" : "Sérsniðið bil",
"Custom date range" : "Sérsniðið dagsetningabil",
"Search everywhere" : "Leita allsstaðar",
"Documents" : "Skjöl",
@@ -121,7 +118,6 @@
"Images" : "Myndir",
"Videos" : "Myndskeið",
"Filters" : "Síur",
"Back to filters" : "Til baka í síur",
"Appearance" : "Útlit",
"Show hidden files" : "Sýna faldar skrár",
"Show file type column" : "Sýna dálk fyrir skráategund",
@@ -130,7 +126,6 @@
"General" : "Almennt",
"Sort favorites first" : "Raða eftirlætum fremst",
"Sort folders before files" : "Raða möppum á undan skrám",
"Enable folder tree view" : "Virkja möppugreinasýn",
"Default view" : "Sjálfgefin sýn",
"All files" : "Allar skrár",
"Personal files" : "Einkaskrár",
@@ -153,10 +148,7 @@
"Show those shortcuts" : "Sýna þessa flýtilykla",
"Warnings" : "Aðvaranir",
"Warn before changing a file extension" : "Aðvara áður en skráarendingu er breytt",
"Warn before deleting a file" : "Aðvara áður en skrá er eytt",
"WebDAV URL" : "WebDAV-slóð",
"Create an app password" : "Búa til lykilorð forrits",
"Required for WebDAV authentication because Two-Factor Authentication is enabled for this account." : "Er krafist fyrir WebDAV-auðkenningu þar sem tveggja-þátta auðkenning er virkjuð fyrir þennan aðgang.",
"How to access files using WebDAV" : "Hvernig á að nálgast skrár í gegnum WebDAV",
"Total rows summary" : "Samantek á fjölda raða",
"Toggle selection for all files and folders" : "Víxla vali af/á fyrir allar skrár og möppur",
@@ -233,9 +225,6 @@
"Removing the file extension \"{old}\" may render the file unreadable." : "Sé skráaendingin \"{old}\" fjarlægð, gæti skráin orðið ólæsileg.",
"Adding the file extension \"{new}\" may render the file unreadable." : "Sé skráaendingunni \"{new}\" bætt við, gæti skráin orðið ólæsileg.",
"Do not show this dialog again." : "Ekki sýna þennan glugga aftur.",
"Rename file to hidden" : "Endurnefna skrá sem falda",
"Prefixing a filename with a dot may render the file hidden." : "Sé settur punktur framan við skráaheiti, gæti skráin orðið falin.",
"Are you sure you want to rename the file to \"{filename}\"?" : "Ertu viss um að þú viljir endurnefna skrána sem \"{filename}\"?",
"Cancel" : "Hætta við",
"Rename" : "Endurnefna",
"Select file or folder to link to" : "Veldu skrá eða möppu til að tengja í",
@@ -250,13 +239,11 @@
"Error during upload: {message}" : "Villa við innsendingu: {message}",
"Error during upload, status code {status}" : "Villa við innsendingu, stöðukóði: {status}",
"Unknown error during upload" : "Óþekkt villa við innsendingu",
"File list is reloading" : "Skráalisti er að hlaðast inn",
"Loading current folder" : "Hleð inn núverandi möppu",
"Retry" : "Reyna aftur",
"No files in here" : "Engar skrár hér",
"Upload some content or sync with your devices!" : "Sendu inn eitthvað efni eða samstilltu við tækin þín!",
"Go back" : "Fara til baka",
"Loading …" : "Hleð inn…",
"Your files" : "Skrárnar þínar",
"Open in files" : "Opna í skráaforritinu",
"File cannot be accessed" : "Skráin er ekki aðgengileg",
@@ -280,9 +267,6 @@
"Failed to convert files: {message}" : "Mistókst að umbreyta skrám: {message}",
"All files failed to be converted" : "Mistókst að umbreyta öllum skrám",
"One file could not be converted: {message}" : "Ekki var hægt að umbreyta einni skrá: {message}",
"_%n file could not be converted_::_%n files could not be converted_" : ["Ekki var hægt að umbreyta %n skrá","Ekki var hægt að umbreyta %n skrám"],
"_%n file converted_::_%n files converted_" : ["%n skrá umbreytt","%n skrám umbreytt"],
"Files converted" : "Skrám umbreytt",
"Failed to convert files" : "Mistókst að umbreyta skrám",
"Converting file …" : "Umbreyti skrá…",
"File successfully converted" : "Tókst að umbreyta skrá",
@@ -318,9 +302,7 @@
"The files are locked" : "Skrárnar eru læstar",
"The file does not exist anymore" : "Skráin er ekki lengur til",
"Moving \"{source}\" to \"{destination}\" …" : "Færi \"{source}\" í \"{destination}\" …",
"Moving {count} files to \"{destination}\" …" : "Færi {count} skrár í \"{destination}\" …",
"Copying \"{source}\" to \"{destination}\" …" : "Afrita \"{source}\" í \"{destination}\" …",
"Copying {count} files to \"{destination}\" …" : "Afrita {count} skrár í \"{destination}\" …",
"Choose destination" : "Veldu áfangastað",
"Copy to {target}" : "Afrita í {target}",
"Move to {target}" : "Færa í {target}",
@@ -335,8 +317,6 @@
"Retry and close" : "Prófa aftur og loka",
"Open online" : "Opna á netinu",
"Details" : "Nánar",
"Open the details sidebar" : "Opna hliðarspjald með ítarupplýsingum",
"Unfavorite" : "Taka úr eftirlætum",
"View in folder" : "Skoða í möppu",
"Type" : "Tegund",
"Created new folder \"{name}\"" : "Bjó til nýja möppu \"{name}\"",
@@ -345,7 +325,6 @@
"Templates" : "Sniðmát",
"New template folder" : "Ný mappa fyrir sniðmát",
"In folder" : "Í möppunni",
"Pick folder to search in" : "Veldu möppu til að leita í",
"Search in all files" : "Leita í öllum skrám",
"Search in folder: {folder}" : "Leita í möppunni: {folder}",
"One of the dropped files could not be processed" : "Ekki var hægt að vinna með eina af slepptu skránum",
+13 -13
View File
@@ -131,8 +131,8 @@ OC.L10N.register(
"Crop image previews" : "Ritaglia le anteprime delle immagini",
"General" : "Generale",
"Sort favorites first" : "Ordina prima i preferiti",
"Sort folders before files" : "Ordina le cartelle prima dei file",
"Enable folder tree view" : "Abilita vista ad albero delle cartelle",
"Sort folders before files" : "Ordina cartelle prima dei files",
"Enable folder tree view" : "Abilita visuale ad albero delle cartelle",
"Default view" : "Vista predefinita",
"All files" : "Tutti i file",
"Personal files" : "File personali",
@@ -151,9 +151,9 @@ OC.L10N.register(
"Go left in grid" : "Vai a sinistra nella griglia",
"Go right in grid" : "Vai a destra nella griglia",
"View" : "Visualizza",
"Toggle grid view" : "Attiva/disattiva la vista a griglia",
"Show those shortcuts" : "Mostra scorciatoie",
"Warnings" : "Avvisi",
"Toggle grid view" : "Commuta la vista a griglia",
"Show those shortcuts" : "Mostra quelle scorciatoie",
"Warnings" : "Avvertenze",
"Warn before changing a file extension" : "Avvisa prima di modificare l'estensione di un file",
"Warn before deleting a file" : "Avvisa prima di eliminare un file",
"WebDAV URL" : "URL WebDAV",
@@ -243,8 +243,8 @@ OC.L10N.register(
"Select file or folder to link to" : "Seleziona un file o una cartella da collegare",
"Choose {file}" : "Scegli {file}",
"Files settings" : "Impostazioni File",
"Switch to list view" : "Passa alla vista a elenco",
"Switch to grid view" : "Passa alla vista a griglia",
"Switch to list view" : "Passa alla vista elenco",
"Switch to grid view" : "Passa alla vista griglia",
"The file could not be found" : "Il file non è stato trovato",
"Upload was cancelled by user" : "Caricamento annullato dall'utente",
"Not enough free space" : "Spazio libero insufficiente",
@@ -259,16 +259,16 @@ OC.L10N.register(
"Upload some content or sync with your devices!" : "Carica dei contenuti o sincronizza con i tuoi dispositivi!",
"Go back" : "Indietro",
"Loading …" : "Caricamento in corso...",
"Your files" : "I tuoi file",
"Your files" : "I tuoi files",
"Open in files" : "Apri in file",
"File cannot be accessed" : "Il file non possono essere acceduti",
"The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Impossibile trovare il file oppure non disponi dei permessi per visualizzarlo. Chiedi al mittente di condividerlo.",
"No search results for “{query}”" : "Nessun risultato di ricerca per “{query}”",
"Search for files" : "Cerca file",
"Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Consenti di limitare i nomi dei file per assicurarsi che questi ultimi possano essere sincronizzati con tutti i client. Per impostazione predefinita, tutti i nomi di file validi su sistemi POSIX (es. Linux o macOS) sono consentiti.",
"Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Consenti di limitare i nomi di file per assicurarsi che i file vengano sincronizzati con tutti i client. In modo predefinito, tutti i nomi di file validi su POSIX (es. Linux o macOS) sono consentiti.",
"After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Dopo aver abilitato i nomi file compatibili con Windows, i file esistenti non potranno più essere modificati, ma potranno essere rinominati con nuovi nomi validi dal rispettivo proprietario.",
"Failed to toggle Windows filename support" : "Impossibile attivare il supporto per i nomi file di Windows",
"Files compatibility" : "Compatibilità dei file",
"Files compatibility" : "Compatibilità di File",
"Enforce Windows compatibility" : "Imponi la compatibilità con Windows",
"This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Ciò bloccherà i nomi di file non validi sui sistemi Windows, come l'uso di nomi riservati o caratteri speciali. Tuttavia non verrà imposta la compatibilità con le maiuscole/minuscole.",
"Blank" : "Vuoto",
@@ -317,7 +317,7 @@ OC.L10N.register(
"This file/folder is already in that directory" : "Questo file/cartella è già in quella cartella",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Non puoi spostare un file/cartella in se stesso o in una sottocartella di se stesso",
"A file or folder with that name already exists in this folder" : "Esiste già un file o una cartella con quel nome in questa cartella",
"The files are locked" : "I file sono bloccati",
"The files are locked" : "I files sono bloccati",
"The file does not exist anymore" : "Il file non esiste più",
"Moving \"{source}\" to \"{destination}\" …" : "Spostare \"{source}\" in \"{destination}\" …",
"Moving {count} files to \"{destination}\" …" : "Spostamento di {count} file in \"{destination}\" …",
@@ -355,7 +355,7 @@ OC.L10N.register(
"No files to upload" : "Nessun file da caricare",
"Unable to create the directory {directory}" : "Impossibile creare la cartella {directory}",
"Some files could not be uploaded" : "Alcuni file non possono essere caricati",
"Files uploaded successfully" : "File caricati correttamente",
"Files uploaded successfully" : "Files caricati correttamente",
"No files to process" : "Nessun file da elaborare",
"Files copied successfully" : "File copiati correttamente",
"Files moved successfully" : "File spostati correttamente",
@@ -382,7 +382,7 @@ OC.L10N.register(
"No favorites yet" : "Nessun preferito ancora",
"Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui",
"List of your files and folders." : "Lista dei tuoi file e cartelle.",
"Folder tree" : "Albero delle cartelle",
"Folder tree" : "Albero delle cartella",
"List of your files and folders that are not shared." : "Elenco dei file e delle cartelle che non sono condivisi.",
"No personal files found" : "Nessun file personale trovato",
"Files that are not shared will show up here." : "I file che non vengono condivisi verranno visualizzati qui.",
+13 -13
View File
@@ -129,8 +129,8 @@
"Crop image previews" : "Ritaglia le anteprime delle immagini",
"General" : "Generale",
"Sort favorites first" : "Ordina prima i preferiti",
"Sort folders before files" : "Ordina le cartelle prima dei file",
"Enable folder tree view" : "Abilita vista ad albero delle cartelle",
"Sort folders before files" : "Ordina cartelle prima dei files",
"Enable folder tree view" : "Abilita visuale ad albero delle cartelle",
"Default view" : "Vista predefinita",
"All files" : "Tutti i file",
"Personal files" : "File personali",
@@ -149,9 +149,9 @@
"Go left in grid" : "Vai a sinistra nella griglia",
"Go right in grid" : "Vai a destra nella griglia",
"View" : "Visualizza",
"Toggle grid view" : "Attiva/disattiva la vista a griglia",
"Show those shortcuts" : "Mostra scorciatoie",
"Warnings" : "Avvisi",
"Toggle grid view" : "Commuta la vista a griglia",
"Show those shortcuts" : "Mostra quelle scorciatoie",
"Warnings" : "Avvertenze",
"Warn before changing a file extension" : "Avvisa prima di modificare l'estensione di un file",
"Warn before deleting a file" : "Avvisa prima di eliminare un file",
"WebDAV URL" : "URL WebDAV",
@@ -241,8 +241,8 @@
"Select file or folder to link to" : "Seleziona un file o una cartella da collegare",
"Choose {file}" : "Scegli {file}",
"Files settings" : "Impostazioni File",
"Switch to list view" : "Passa alla vista a elenco",
"Switch to grid view" : "Passa alla vista a griglia",
"Switch to list view" : "Passa alla vista elenco",
"Switch to grid view" : "Passa alla vista griglia",
"The file could not be found" : "Il file non è stato trovato",
"Upload was cancelled by user" : "Caricamento annullato dall'utente",
"Not enough free space" : "Spazio libero insufficiente",
@@ -257,16 +257,16 @@
"Upload some content or sync with your devices!" : "Carica dei contenuti o sincronizza con i tuoi dispositivi!",
"Go back" : "Indietro",
"Loading …" : "Caricamento in corso...",
"Your files" : "I tuoi file",
"Your files" : "I tuoi files",
"Open in files" : "Apri in file",
"File cannot be accessed" : "Il file non possono essere acceduti",
"The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Impossibile trovare il file oppure non disponi dei permessi per visualizzarlo. Chiedi al mittente di condividerlo.",
"No search results for “{query}”" : "Nessun risultato di ricerca per “{query}”",
"Search for files" : "Cerca file",
"Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Consenti di limitare i nomi dei file per assicurarsi che questi ultimi possano essere sincronizzati con tutti i client. Per impostazione predefinita, tutti i nomi di file validi su sistemi POSIX (es. Linux o macOS) sono consentiti.",
"Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Consenti di limitare i nomi di file per assicurarsi che i file vengano sincronizzati con tutti i client. In modo predefinito, tutti i nomi di file validi su POSIX (es. Linux o macOS) sono consentiti.",
"After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Dopo aver abilitato i nomi file compatibili con Windows, i file esistenti non potranno più essere modificati, ma potranno essere rinominati con nuovi nomi validi dal rispettivo proprietario.",
"Failed to toggle Windows filename support" : "Impossibile attivare il supporto per i nomi file di Windows",
"Files compatibility" : "Compatibilità dei file",
"Files compatibility" : "Compatibilità di File",
"Enforce Windows compatibility" : "Imponi la compatibilità con Windows",
"This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Ciò bloccherà i nomi di file non validi sui sistemi Windows, come l'uso di nomi riservati o caratteri speciali. Tuttavia non verrà imposta la compatibilità con le maiuscole/minuscole.",
"Blank" : "Vuoto",
@@ -315,7 +315,7 @@
"This file/folder is already in that directory" : "Questo file/cartella è già in quella cartella",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Non puoi spostare un file/cartella in se stesso o in una sottocartella di se stesso",
"A file or folder with that name already exists in this folder" : "Esiste già un file o una cartella con quel nome in questa cartella",
"The files are locked" : "I file sono bloccati",
"The files are locked" : "I files sono bloccati",
"The file does not exist anymore" : "Il file non esiste più",
"Moving \"{source}\" to \"{destination}\" …" : "Spostare \"{source}\" in \"{destination}\" …",
"Moving {count} files to \"{destination}\" …" : "Spostamento di {count} file in \"{destination}\" …",
@@ -353,7 +353,7 @@
"No files to upload" : "Nessun file da caricare",
"Unable to create the directory {directory}" : "Impossibile creare la cartella {directory}",
"Some files could not be uploaded" : "Alcuni file non possono essere caricati",
"Files uploaded successfully" : "File caricati correttamente",
"Files uploaded successfully" : "Files caricati correttamente",
"No files to process" : "Nessun file da elaborare",
"Files copied successfully" : "File copiati correttamente",
"Files moved successfully" : "File spostati correttamente",
@@ -380,7 +380,7 @@
"No favorites yet" : "Nessun preferito ancora",
"Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui",
"List of your files and folders." : "Lista dei tuoi file e cartelle.",
"Folder tree" : "Albero delle cartelle",
"Folder tree" : "Albero delle cartella",
"List of your files and folders that are not shared." : "Elenco dei file e delle cartelle che non sono condivisi.",
"No personal files found" : "Nessun file personale trovato",
"Files that are not shared will show up here." : "I file che non vengono condivisi verranno visualizzati qui.",
-10
View File
@@ -95,7 +95,6 @@ OC.L10N.register(
"Another entry with the same name already exists." : "En annan post med samma namn finns redan.",
"Invalid filename." : "Ogiltigt filnamn.",
"Rename file" : "Byt namn på fil",
"Recently created" : "Nyligen skapade",
"Folder" : "Mapp",
"Unknown file type" : "Okänd filtyp",
"{ext} image" : "{ext} bild",
@@ -111,7 +110,6 @@ OC.L10N.register(
"Last 30 days" : "Senaste 30 dagarna",
"This year ({year})" : "I år ({year})",
"Last year ({year})" : "Förra året ({year})",
"Custom range" : "Anpassat intervall",
"Custom date range" : "Anpassat datumintervall",
"Search everywhere" : "Sök överallt",
"Documents" : "Dokument",
@@ -235,9 +233,6 @@ OC.L10N.register(
"Removing the file extension \"{old}\" may render the file unreadable." : "Att ta bort filtillägget \"{old}\" kan göra filen oläsbar.",
"Adding the file extension \"{new}\" may render the file unreadable." : "Att lägga till filtillägget \"{new}\" kan göra filen oläsbar.",
"Do not show this dialog again." : "Visa inte denna dialog igen.",
"Rename file to hidden" : "Byt namn på filen till ”hidden”",
"Prefixing a filename with a dot may render the file hidden." : "Om man sätter en punkt framför ett filnamn kan filen bli dold.",
"Are you sure you want to rename the file to \"{filename}\"?" : "Är du säker på att du vill byta namn på filen till \"{filename}\"?",
"Cancel" : "Avbryt",
"Rename" : "Byt namn",
"Select file or folder to link to" : "Välj fil eller mapp att länka till",
@@ -320,9 +315,7 @@ OC.L10N.register(
"The files are locked" : "Filerna är låsta",
"The file does not exist anymore" : "Filen finns inte längre",
"Moving \"{source}\" to \"{destination}\" …" : "Flyttar \"{source}\" till \"{destination}\" …",
"Moving {count} files to \"{destination}\" …" : "Flyttar {count}filer till \"{destination}\" …",
"Copying \"{source}\" to \"{destination}\" …" : "Kopierar \"{source}\" till \"{destination}\" …",
"Copying {count} files to \"{destination}\" …" : "Kopierar {count} filer till \"{destination}\" …",
"Choose destination" : "Välj destination",
"Copy to {target}" : "Kopiera till {target}",
"Move to {target}" : "Flytta till {target}",
@@ -337,8 +330,6 @@ OC.L10N.register(
"Retry and close" : "Försök igen och stäng",
"Open online" : "Öppna online",
"Details" : "Detaljer",
"Open the details sidebar" : "Öppna informationsfältet",
"Unfavorite" : "Ta bort från favoriter",
"View in folder" : "Utforska i mapp",
"Type" : "Typ",
"Created new folder \"{name}\"" : "Skapat ny mapp \"{name}\"",
@@ -347,7 +338,6 @@ OC.L10N.register(
"Templates" : "Mallar",
"New template folder" : "Ny mallmapp",
"In folder" : "I mapp",
"Pick folder to search in" : "Välj en mapp att söka i",
"Search in all files" : "Sök i alla filer",
"Search in folder: {folder}" : "Sök i mapp: {folder}",
"One of the dropped files could not be processed" : "En av de släppta filerna kunde inte bearbetas",
-10
View File
@@ -93,7 +93,6 @@
"Another entry with the same name already exists." : "En annan post med samma namn finns redan.",
"Invalid filename." : "Ogiltigt filnamn.",
"Rename file" : "Byt namn på fil",
"Recently created" : "Nyligen skapade",
"Folder" : "Mapp",
"Unknown file type" : "Okänd filtyp",
"{ext} image" : "{ext} bild",
@@ -109,7 +108,6 @@
"Last 30 days" : "Senaste 30 dagarna",
"This year ({year})" : "I år ({year})",
"Last year ({year})" : "Förra året ({year})",
"Custom range" : "Anpassat intervall",
"Custom date range" : "Anpassat datumintervall",
"Search everywhere" : "Sök överallt",
"Documents" : "Dokument",
@@ -233,9 +231,6 @@
"Removing the file extension \"{old}\" may render the file unreadable." : "Att ta bort filtillägget \"{old}\" kan göra filen oläsbar.",
"Adding the file extension \"{new}\" may render the file unreadable." : "Att lägga till filtillägget \"{new}\" kan göra filen oläsbar.",
"Do not show this dialog again." : "Visa inte denna dialog igen.",
"Rename file to hidden" : "Byt namn på filen till ”hidden”",
"Prefixing a filename with a dot may render the file hidden." : "Om man sätter en punkt framför ett filnamn kan filen bli dold.",
"Are you sure you want to rename the file to \"{filename}\"?" : "Är du säker på att du vill byta namn på filen till \"{filename}\"?",
"Cancel" : "Avbryt",
"Rename" : "Byt namn",
"Select file or folder to link to" : "Välj fil eller mapp att länka till",
@@ -318,9 +313,7 @@
"The files are locked" : "Filerna är låsta",
"The file does not exist anymore" : "Filen finns inte längre",
"Moving \"{source}\" to \"{destination}\" …" : "Flyttar \"{source}\" till \"{destination}\" …",
"Moving {count} files to \"{destination}\" …" : "Flyttar {count}filer till \"{destination}\" …",
"Copying \"{source}\" to \"{destination}\" …" : "Kopierar \"{source}\" till \"{destination}\" …",
"Copying {count} files to \"{destination}\" …" : "Kopierar {count} filer till \"{destination}\" …",
"Choose destination" : "Välj destination",
"Copy to {target}" : "Kopiera till {target}",
"Move to {target}" : "Flytta till {target}",
@@ -335,8 +328,6 @@
"Retry and close" : "Försök igen och stäng",
"Open online" : "Öppna online",
"Details" : "Detaljer",
"Open the details sidebar" : "Öppna informationsfältet",
"Unfavorite" : "Ta bort från favoriter",
"View in folder" : "Utforska i mapp",
"Type" : "Typ",
"Created new folder \"{name}\"" : "Skapat ny mapp \"{name}\"",
@@ -345,7 +336,6 @@
"Templates" : "Mallar",
"New template folder" : "Ny mallmapp",
"In folder" : "I mapp",
"Pick folder to search in" : "Välj en mapp att söka i",
"Search in all files" : "Sök i alla filer",
"Search in folder: {folder}" : "Sök i mapp: {folder}",
"One of the dropped files could not be processed" : "En av de släppta filerna kunde inte bearbetas",
+1 -1
View File
@@ -12,8 +12,8 @@ import { emit } from '@nextcloud/event-bus'
import { n, t } from '@nextcloud/l10n'
import { generateOcsUrl } from '@nextcloud/router'
import PQueue from 'p-queue'
import logger from '../logger.ts'
import { fetchNode } from '../services/WebdavClient.ts'
import { logger } from '../utils/logger.ts'
type ConversionResponse = {
path: string
+1 -1
View File
@@ -10,7 +10,7 @@ import * as capabilities from '@nextcloud/capabilities'
import * as eventBus from '@nextcloud/event-bus'
import { File, Folder, Permission } from '@nextcloud/files'
import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'
import { logger } from '../utils/logger.ts'
import logger from '../logger.ts'
import { action } from './deleteAction.ts'
import { shouldAskForConfirmation } from './deleteUtils.ts'
+1 -1
View File
@@ -12,7 +12,7 @@ import { Permission } from '@nextcloud/files'
import { loadState } from '@nextcloud/initial-state'
import { t } from '@nextcloud/l10n'
import PQueue from 'p-queue'
import { logger } from '../utils/logger.ts'
import logger from '../logger.ts'
import { askConfirmation, canDisconnectOnly, canUnshareOnly, deleteNode, displayName, shouldAskForConfirmation } from './deleteUtils.ts'
// TODO: once the files app is migrated to the new frontend use the import instead:
+1 -1
View File
@@ -11,10 +11,10 @@ import { showError } from '@nextcloud/dialogs'
import { emit } from '@nextcloud/event-bus'
import { DefaultType, FileType } from '@nextcloud/files'
import { t } from '@nextcloud/l10n'
import logger from '../logger.ts'
import { useFilesStore } from '../store/files.ts'
import { getPinia } from '../store/index.ts'
import { usePathsStore } from '../store/paths.ts'
import { logger } from '../utils/logger.ts'
import { isDownloadable } from '../utils/permissions.ts'
export const action: IFileAction = {
@@ -9,7 +9,7 @@ import axios from '@nextcloud/axios'
import * as eventBus from '@nextcloud/event-bus'
import { File, Permission } from '@nextcloud/files'
import { beforeAll, beforeEach, describe, expect, test, vi } from 'vitest'
import { logger } from '../utils/logger.ts'
import logger from '../logger.ts'
import { action } from './favoriteAction.ts'
import * as favoriteAction from './favoriteAction.ts'
+1 -1
View File
@@ -16,7 +16,7 @@ import { generateUrl } from '@nextcloud/router'
import { isPublicShare } from '@nextcloud/sharing/public'
import PQueue from 'p-queue'
import Vue from 'vue'
import { logger } from '../utils/logger.ts'
import logger from '../logger.ts'
const queue = new PQueue({ concurrency: 5 })
+1 -1
View File
@@ -19,8 +19,8 @@ import { t } from '@nextcloud/l10n'
import { getConflicts } from '@nextcloud/upload'
import { basename, join } from 'path'
import Vue from 'vue'
import logger from '../logger.ts'
import { getContents } from '../services/Files.ts'
import { logger } from '../utils/logger.ts'
import { canCopy, canMove, getQueue, MoveCopyAction } from './moveOrCopyActionUtils.ts'
/**
+1 -1
View File
@@ -14,7 +14,7 @@ import { translate as t } from '@nextcloud/l10n'
import { encodePath } from '@nextcloud/paths'
import { generateOcsUrl } from '@nextcloud/router'
import { isPublicShare } from '@nextcloud/sharing/public'
import { logger } from '../utils/logger.ts'
import logger from '../logger.ts'
import { isSyncable } from '../utils/permissions.ts'
export const action: IFileAction = {
+1 -1
View File
@@ -7,7 +7,7 @@ import type { IView } from '@nextcloud/files'
import { File, Folder, Permission } from '@nextcloud/files'
import { beforeEach, describe, expect, test, vi } from 'vitest'
import { logger } from '../utils/logger.ts'
import logger from '../logger.ts'
import { action } from './sidebarAction.ts'
const sidebar = vi.hoisted(() => ({
+1 -1
View File
@@ -9,7 +9,7 @@ import InformationSvg from '@mdi/svg/svg/information-outline.svg?raw'
import { getSidebar, Permission } from '@nextcloud/files'
import { t } from '@nextcloud/l10n'
import { isPublicShare } from '@nextcloud/sharing/public'
import { logger } from '../utils/logger.ts'
import logger from '../logger.ts'
export const ACTION_DETAILS = 'details'
+1 -1
View File
@@ -76,6 +76,7 @@ import NcBreadcrumbs from '@nextcloud/vue/components/NcBreadcrumbs'
import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
import { useFileListWidth } from '../composables/useFileListWidth.ts'
import { useViews } from '../composables/useViews.ts'
import logger from '../logger.ts'
import { dataTransferToFileTree, onDropExternalFiles, onDropInternalFiles } from '../services/DropService.ts'
import { useActiveStore } from '../store/active.ts'
import { useDragAndDropStore } from '../store/dragging.ts'
@@ -83,7 +84,6 @@ import { useFilesStore } from '../store/files.ts'
import { usePathsStore } from '../store/paths.ts'
import { useSelectionStore } from '../store/selection.ts'
import { useUploaderStore } from '../store/uploader.ts'
import { logger } from '../utils/logger.ts'
export default defineComponent({
name: 'BreadCrumbs',
@@ -37,9 +37,9 @@ import { UploadStatus } from '@nextcloud/upload'
import debounce from 'debounce'
import { defineComponent } from 'vue'
import TrayArrowDownIcon from 'vue-material-design-icons/TrayArrowDown.vue'
import logger from '../logger.ts'
import { dataTransferToFileTree, onDropExternalFiles } from '../services/DropService.ts'
import { useActiveStore } from '../store/active.ts'
import { logger } from '../utils/logger.ts'
export default defineComponent({
name: 'DragAndDropNotice',
@@ -136,10 +136,10 @@ import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
import ArrowLeftIcon from 'vue-material-design-icons/ArrowLeft.vue'
import CustomElementRender from '../CustomElementRender.vue'
import { useFileListWidth } from '../../composables/useFileListWidth.ts'
import logger from '../../logger.ts'
import actionsMixins from '../../mixins/actionsMixin.ts'
import { useActiveStore } from '../../store/active.ts'
import { executeAction } from '../../utils/actionUtils.ts'
import { logger } from '../../utils/logger.ts'
export default defineComponent({
name: 'FileEntryActions',
@@ -27,10 +27,10 @@ import { useHotKey } from '@nextcloud/vue/composables/useHotKey'
import { defineComponent } from 'vue'
import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'
import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
import logger from '../../logger.ts'
import { useActiveStore } from '../../store/active.ts'
import { useKeyboardStore } from '../../store/keyboard.ts'
import { useSelectionStore } from '../../store/selection.ts'
import { logger } from '../../utils/logger.ts'
export default defineComponent({
name: 'FileEntryCheckbox',
@@ -49,11 +49,11 @@ import { basename } from '@nextcloud/paths'
import { defineComponent, inject } from 'vue'
import NcTextField from '@nextcloud/vue/components/NcTextField'
import { useFileListWidth } from '../../composables/useFileListWidth.ts'
import logger from '../../logger.ts'
import { useActiveStore } from '../../store/active.ts'
import { useRenamingStore } from '../../store/renaming.ts'
import { useUserConfigStore } from '../../store/userconfig.ts'
import { getFilenameValidity } from '../../utils/filenameValidity.ts'
import { logger } from '../../utils/logger.ts'
export default defineComponent({
name: 'FileEntryName',
@@ -78,9 +78,9 @@ import CollectivesIcon from './CollectivesIcon.vue'
import FavoriteIcon from './FavoriteIcon.vue'
import RecentlyCreatedIcon from './RecentlyCreatedIcon.vue'
import { usePreviewImage } from '../../composables/usePreviewImage.ts'
import logger from '../../logger.ts'
import { isLivePhoto } from '../../services/LivePhotos.ts'
import { useUserConfigStore } from '../../store/userconfig.ts'
import { logger } from '../../utils/logger.ts'
export default defineComponent({
name: 'FileEntryPreview',
+7 -12
View File
@@ -14,13 +14,13 @@ import { generateUrl } from '@nextcloud/router'
import { isPublicShare } from '@nextcloud/sharing/public'
import { getConflicts, getUploader } from '@nextcloud/upload'
import { vOnClickOutside } from '@vueuse/components'
import { extname, relative } from 'path'
import { extname } from 'path'
import Vue, { computed, defineComponent } from 'vue'
import { action as sidebarAction } from '../actions/sidebarAction.ts'
import logger from '../logger.ts'
import { onDropInternalFiles } from '../services/DropService.ts'
import { getDragAndDropPreview } from '../utils/dragUtils.ts'
import { hashCode } from '../utils/hashUtils.ts'
import { logger } from '../utils/logger.ts'
import { isDownloadable } from '../utils/permissions.ts'
Vue.directive('onClickOutside', vOnClickOutside)
@@ -488,17 +488,12 @@ export default defineComponent({
const items = Array.from(event.dataTransfer?.items || [])
if (selection.length === 0 && items.some((item) => item.kind === 'file')) {
const files = items.filter((item) => item.kind === 'file')
.map((item) => 'webkitGetAsEntry' in item ? item.webkitGetAsEntry() : item.getAsFile())
.filter(Boolean) as (FileSystemEntry | File)[]
const uploader = getUploader()
const root = uploader.destination.path
const relativePath = relative(root, this.source.path)
logger.debug('Start uploading dropped files', { target: this.source.path, root, relativePath, files: files.map((file) => file.name) })
await uploader.batchUpload(
relativePath,
files,
this.source.path,
items.filter((item) => item.kind === 'file')
.map((item) => 'webkitGetAsEntry' in item ? item.webkitGetAsEntry() : item.getAsFile())
.filter(Boolean) as (FileSystemEntry | File)[],
async (nodes, path) => {
try {
const { contents, folder } = await this.activeView!.getContents(path)
@@ -541,7 +536,7 @@ export default defineComponent({
const isCopy = event.ctrlKey
this.dragover = false
logger.debug('Dropped', { event, folder: this.source, selection })
logger.debug('Dropped', { event, folder: this.source, selection, fileTree })
const nodes = selection.map((source) => this.filesStore.getNode(source)) as Node[]
await onDropInternalFiles(nodes, this.source, contents, isCopy)
@@ -13,7 +13,7 @@ import type { Folder, IFileListHeader, View } from '@nextcloud/files'
import type { PropType } from 'vue'
import PQueue from 'p-queue'
import { logger } from '../utils/logger.ts'
import logger from '../logger.ts'
/**
* This component is used to render custom
@@ -84,11 +84,11 @@ import { FILE_LIST_HEAD_FIRST_BATCH_ACTION_ID } from './FilesListTableHeaderActi
import FilesListTableHeaderButton from './FilesListTableHeaderButton.vue'
import { useFileListWidth } from '../composables/useFileListWidth.ts'
import { useRouteParameters } from '../composables/useRouteParameters.ts'
import logger from '../logger.ts'
import filesSortingMixin from '../mixins/filesSorting.ts'
import { useActiveStore } from '../store/active.ts'
import { useFilesStore } from '../store/files.ts'
import { useSelectionStore } from '../store/selection.ts'
import { logger } from '../utils/logger.ts'
export const FILES_LIST_HEADER_SELECT_ALL_CHECKBOX_ID = 'files-list-header-select-all-checkbox'
@@ -88,12 +88,12 @@ import ArrowLeftIcon from 'vue-material-design-icons/ArrowLeft.vue'
import { FILES_LIST_HEADER_SELECT_ALL_CHECKBOX_ID } from './FilesListTableHeader.vue'
import { useFileActions } from '../composables/useFileActions.ts'
import { useFileListWidth } from '../composables/useFileListWidth.ts'
import logger from '../logger.ts'
import actionsMixins from '../mixins/actionsMixin.ts'
import { useActionsMenuStore } from '../store/actionsmenu.ts'
import { useActiveStore } from '../store/active.ts'
import { useFilesStore } from '../store/files.ts'
import { useSelectionStore } from '../store/selection.ts'
import { logger } from '../utils/logger.ts'
export const FILE_LIST_HEAD_FIRST_BATCH_ACTION_ID = 'files-list-head-first-batch-action'
@@ -91,10 +91,10 @@ import { useEnabledFileActions } from '../composables/useFileActions.ts'
import { useFileListHeaders } from '../composables/useFileListHeaders.ts'
import { useFileListWidth } from '../composables/useFileListWidth.ts'
import { useRouteParameters } from '../composables/useRouteParameters.ts'
import logger from '../logger.ts'
import { useActiveStore } from '../store/active.ts'
import { useSelectionStore } from '../store/selection.ts'
import { useUserConfigStore } from '../store/userconfig.ts'
import { logger } from '../utils/logger.ts'
export default defineComponent({
name: 'FilesListVirtual',
@@ -10,9 +10,9 @@ import { NcIconSvgWrapper, NcLoadingIcon } from '@nextcloud/vue'
import { ref, toRef, watch } from 'vue'
import NcAppSidebarTab from '@nextcloud/vue/components/NcAppSidebarTab'
import NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent'
import logger from '../../logger.ts'
import { useActiveStore } from '../../store/active.ts'
import { useSidebarStore } from '../../store/sidebar.ts'
import { logger } from '../../utils/logger.ts'
const props = defineProps<{
/**
@@ -37,7 +37,7 @@ import { debounce, throttle } from 'throttle-debounce'
import NcAppNavigationItem from '@nextcloud/vue/components/NcAppNavigationItem'
import NcProgressBar from '@nextcloud/vue/components/NcProgressBar'
import ChartPie from 'vue-material-design-icons/ChartPieOutline.vue'
import { logger } from '../utils/logger.ts'
import logger from '../logger.ts'
export default {
name: 'NavigationQuota',
@@ -17,8 +17,8 @@ import NcInputField from '@nextcloud/vue/components/NcInputField'
import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
import NcNoteCard from '@nextcloud/vue/components/NcNoteCard'
import NcProgressBar from '@nextcloud/vue/components/NcProgressBar'
import logger from '../../logger.ts'
import { SanitizeFilenameStatus } from '../../models/SanitizeFilenameStatus.ts'
import { logger } from '../../utils/logger.ts'
type ApiStatus = { total: number, processed: number, errors?: Record<string, string[]>, status: SanitizeFilenameStatus }
@@ -52,7 +52,7 @@ import debounce from 'debounce'
import Vue from 'vue'
import NcButton from '@nextcloud/vue/components/NcButton'
import NcSelect from '@nextcloud/vue/components/NcSelect'
import { logger } from '../utils/logger.ts'
import logger from '../logger.ts'
const picker = getFilePickerBuilder(t('files', 'Choose a file or folder to transfer'))
.setMultiSelect(false)
+1 -1
View File
@@ -77,7 +77,7 @@ import type { PropType } from 'vue'
import debounce from 'debounce'
import { defineComponent } from 'vue'
import { useFileListWidth } from '../composables/useFileListWidth.ts'
import { logger } from '../utils/logger.ts'
import logger from '../logger.ts'
interface RecycledPoolItem {
key: string
+1 -1
View File
@@ -7,9 +7,9 @@ import { getFileActions } from '@nextcloud/files'
import { useHotKey } from '@nextcloud/vue/composables/useHotKey'
import { dirname } from 'path'
import { useRoute, useRouter } from 'vue-router/composables'
import logger from '../logger.ts'
import { useUserConfigStore } from '../store/userconfig.ts'
import { executeAction } from '../utils/actionUtils.ts'
import { logger } from '../utils/logger.ts'
import { useRouteParameters } from './useRouteParameters.ts'
/**
+1 -1
View File
@@ -11,7 +11,7 @@ import { t } from '@nextcloud/l10n'
import wrap from '@vue/web-component-wrapper'
import Vue from 'vue'
import FileListFilterType from '../components/FileListFilter/FileListFilterType.vue'
import { logger } from '../utils/logger.ts'
import logger from '../logger.ts'
export interface ITypePreset {
id: string
@@ -1,11 +1,10 @@
/*!
/**
* SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { getLoggerBuilder } from '@nextcloud/logger'
export const logger = getLoggerBuilder()
export default getLoggerBuilder()
.setApp('files')
.detectUser()
.build()
+1 -1
View File
@@ -13,7 +13,7 @@ import { emit } from '@nextcloud/event-bus'
import { Folder, Permission } from '@nextcloud/files'
import { t } from '@nextcloud/l10n'
import { basename } from 'path'
import { logger } from '../utils/logger.ts'
import logger from '../logger.ts'
import { newNodeName } from '../utils/newNodeDialog.ts'
export const entry: NewMenuEntry = {
+1 -1
View File
@@ -14,7 +14,7 @@ import { loadState } from '@nextcloud/initial-state'
import { translate as t } from '@nextcloud/l10n'
import { generateOcsUrl } from '@nextcloud/router'
import { join } from 'path'
import { logger } from '../utils/logger.ts'
import logger from '../logger.ts'
import { newNodeName } from '../utils/newNodeDialog.ts'
const templatesEnabled = loadState<boolean>('files', 'templates_enabled', true)
@@ -9,7 +9,7 @@ import { getFilePickerBuilder } from '@nextcloud/dialogs'
import { emit } from '@nextcloud/event-bus'
import { translate as t } from '@nextcloud/l10n'
import { imagePath } from '@nextcloud/router'
import { logger } from '../../utils/logger.ts'
import logger from '../../logger.ts'
/**
* Initialize the unified search plugin.
+1 -1
View File
@@ -12,11 +12,11 @@ import { relative } from 'path'
import queryString from 'query-string'
import Vue from 'vue'
import Router, { isNavigationFailure, NavigationFailureType } from 'vue-router'
import logger from '../logger.ts'
import { useFilesStore } from '../store/files.ts'
import { getPinia } from '../store/index.ts'
import { usePathsStore } from '../store/paths.ts'
import { defaultView } from '../utils/filesViews.ts'
import { logger } from '../utils/logger.ts'
Vue.use(Router)
+2 -2
View File
@@ -13,7 +13,7 @@ import { join } from '@nextcloud/paths'
import { getUploader, hasConflict } from '@nextcloud/upload'
import { handleCopyMoveNodesTo, HintException } from '../actions/moveOrCopyAction.ts'
import { MoveCopyAction } from '../actions/moveOrCopyActionUtils.ts'
import { logger } from '../utils/logger.ts'
import logger from '../logger.ts'
import { createDirectoryIfNotExists, Directory, resolveConflict, traverseTree } from './DropServiceUtils.ts'
/**
@@ -123,7 +123,7 @@ export async function onDropExternalFiles(root: RootDirectory, destination: IFol
// then browse its tree and upload its contents.
if (file instanceof Directory) {
try {
logger.debug('Processing directory', { relativePath, destination })
logger.debug('Processing directory', { relativePath })
await createDirectoryIfNotExists(relativePath, destination)
await uploadDirectoryContents(file, relativePath)
} catch (error) {
@@ -6,7 +6,7 @@
import { join } from 'node:path'
import { beforeAll, describe, expect, it, vi } from 'vitest'
import { DataTransferItem as DataTransferItemMock, FileSystemDirectoryEntry, fileSystemEntryToDataTransferItem, FileSystemFileEntry } from '../../../../__tests__/FileSystemAPIUtils.ts'
import { logger } from '../utils/logger.ts'
import logger from '../logger.ts'
import { dataTransferToFileTree } from './DropService.ts'
import { Directory, traverseTree } from './DropServiceUtils.ts'
+1 -1
View File
@@ -12,7 +12,7 @@ import { defaultRemoteURL, defaultRootPath, getClient, getDefaultPropfind, resul
import { t } from '@nextcloud/l10n'
import { join } from '@nextcloud/paths'
import { openConflictPicker } from '@nextcloud/upload'
import { logger } from '../utils/logger.ts'
import logger from '../logger.ts'
/**
* This represents a Directory in the file tree
+1 -1
View File
@@ -8,7 +8,7 @@ import type { ContentsWithRoot } from '@nextcloud/files'
import { getCurrentUser } from '@nextcloud/auth'
import { Folder, Permission } from '@nextcloud/files'
import { getFavoriteNodes, getRemoteURL, getRootPath } from '@nextcloud/files/dav'
import { logger } from '../utils/logger.ts'
import logger from '../logger.ts'
import { getContents as filesContents } from './Files.ts'
import { client } from './WebdavClient.ts'
+1 -1
View File
@@ -7,10 +7,10 @@ import type { FileStat, ResponseDataDetailed } from 'webdav'
import { getDefaultPropfind, getRootPath, resultToNode } from '@nextcloud/files/dav'
import { join } from 'path'
import logger from '../logger.ts'
import { useFilesStore } from '../store/files.ts'
import { getPinia } from '../store/index.ts'
import { useSearchStore } from '../store/search.ts'
import { logger } from '../utils/logger.ts'
import { client } from './WebdavClient.ts'
import { searchNodes } from './WebDavSearch.ts'
+1 -1
View File
@@ -9,9 +9,9 @@ import { getCurrentUser } from '@nextcloud/auth'
import { Folder, Permission } from '@nextcloud/files'
import { getRecentSearch, getRemoteURL, getRootPath, resultToNode } from '@nextcloud/files/dav'
import { loadState } from '@nextcloud/initial-state'
import logger from '../logger.ts'
import { getPinia } from '../store/index.ts'
import { useUserConfigStore } from '../store/userconfig.ts'
import { logger } from '../utils/logger.ts'
import { client } from './WebdavClient.ts'
const lastTwoWeeksTimestamp = Math.round((Date.now() / 1000) - (60 * 60 * 24 * 14))
+1 -1
View File
@@ -8,9 +8,9 @@ import type { ContentsWithRoot } from '@nextcloud/files'
import { getCurrentUser } from '@nextcloud/auth'
import { Folder, Permission } from '@nextcloud/files'
import { defaultRemoteURL, getRootPath } from '@nextcloud/files/dav'
import logger from '../logger.ts'
import { getPinia } from '../store/index.ts'
import { useSearchStore } from '../store/search.ts'
import { logger } from '../utils/logger.ts'
import { searchNodes } from './WebDavSearch.ts'
/**

Some files were not shown because too many files have changed in this diff Show More