aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/comments/src/comments-activity-tab.ts4
-rw-r--r--apps/files/src/store/viewConfig.ts6
-rw-r--r--apps/files/src/views/FilesList.vue2
-rw-r--r--apps/files_external/src/actions/enterCredentialsAction.ts9
-rw-r--r--apps/files_external/src/actions/inlineStorageCheckAction.ts3
-rw-r--r--apps/files_sharing/src/files_views/shares.spec.ts1
-rw-r--r--apps/files_sharing/src/mixins/ShareRequests.js4
-rw-r--r--apps/files_sharing/src/models/Share.ts2
-rw-r--r--apps/files_sharing/src/utils/GeneratePassword.ts6
-rw-r--r--apps/files_sharing/src/views/SharingDetailsTab.vue1
-rw-r--r--apps/files_sharing/src/views/SharingTab.vue12
-rw-r--r--apps/files_versions/src/files_versions_tab.js4
-rw-r--r--apps/files_versions/src/views/VersionTab.vue9
-rw-r--r--apps/settings/src/admin.js9
-rw-r--r--apps/settings/src/components/AuthToken.vue4
-rw-r--r--apps/settings/src/components/BasicSettings/BackgroundJob.vue3
-rw-r--r--apps/settings/src/components/Encryption.vue17
-rw-r--r--apps/settings/src/components/Markdown.vue1
-rw-r--r--apps/settings/src/components/PersonalInfo/BirthdaySection.vue14
-rw-r--r--apps/settings/src/components/PersonalInfo/DetailsSection.vue12
-rw-r--r--apps/settings/src/components/Users/NewUserDialog.vue3
-rw-r--r--apps/settings/src/main-apps-users-management.ts13
-rw-r--r--apps/settings/src/main-declarative-settings-forms.ts10
-rw-r--r--apps/settings/src/mixins/UserRowMixin.js12
-rw-r--r--apps/settings/src/utils/userUtils.ts4
-rw-r--r--apps/systemtags/src/services/api.ts5
-rw-r--r--apps/systemtags/src/services/files.ts9
-rw-r--r--apps/user_status/src/UserStatus.vue3
-rw-r--r--apps/user_status/src/services/statusService.js4
-rw-r--r--core/js/tests/html-domparser.js21
-rw-r--r--core/src/OCP/loader.js6
-rw-r--r--core/src/install.js4
-rw-r--r--core/src/jquery/avatar.js10
-rw-r--r--core/src/services/UnifiedSearchService.js2
-rw-r--r--core/src/systemtags/systemtagmodel.js2
-rw-r--r--tests/karma.config.js6
36 files changed, 128 insertions, 109 deletions
diff --git a/apps/comments/src/comments-activity-tab.ts b/apps/comments/src/comments-activity-tab.ts
index f38484d25e7..f092f2b8f5b 100644
--- a/apps/comments/src/comments-activity-tab.ts
+++ b/apps/comments/src/comments-activity-tab.ts
@@ -24,7 +24,7 @@ export function registerCommentsPlugins() {
if (!ActivityTabPluginView) {
const { default: ActivityCommentAction } = await import('./views/ActivityCommentAction.vue')
- /** @ts-expect-error Types are broken for Vue2 */
+ // @ts-expect-error Types are broken for Vue2
ActivityTabPluginView = Vue.extend(ActivityCommentAction)
}
ActivityTabPluginInstance = new ActivityTabPluginView({
@@ -50,7 +50,7 @@ export function registerCommentsPlugins() {
const { data: comments } = await getComments({ resourceType: 'files', resourceId: fileInfo.id }, { limit, offset })
logger.debug('Loaded comments', { fileInfo, comments })
const { default: CommentView } = await import('./views/ActivityCommentEntry.vue')
- /** @ts-expect-error Types are broken for Vue2 */
+ // @ts-expect-error Types are broken for Vue2
const CommentsViewObject = Vue.extend(CommentView)
return comments.map((comment) => ({
diff --git a/apps/files/src/store/viewConfig.ts b/apps/files/src/store/viewConfig.ts
index 08d75b3d050..76786306d60 100644
--- a/apps/files/src/store/viewConfig.ts
+++ b/apps/files/src/store/viewConfig.ts
@@ -59,8 +59,8 @@ export const useViewConfigStore = function(...args) {
* Set the sorting key AND sort by ASC
* The key param must be a valid key of a File object
* If not found, will be searched within the File attributes
- * @param key
- * @param view
+ * @param key Key to sort by
+ * @param view View to set the sorting key for
*/
setSortingBy(key = 'basename', view = 'files') {
// Save new config
@@ -70,7 +70,7 @@ export const useViewConfigStore = function(...args) {
/**
* Toggle the sorting direction
- * @param view
+ * @param view view to set the sorting order for
*/
toggleSortingDirection(view = 'files') {
const config = this.getConfig(view) || { sorting_direction: 'asc' }
diff --git a/apps/files/src/views/FilesList.vue b/apps/files/src/views/FilesList.vue
index 5341502df24..9383f98a00b 100644
--- a/apps/files/src/views/FilesList.vue
+++ b/apps/files/src/views/FilesList.vue
@@ -410,7 +410,7 @@ export default defineComponent({
showCustomEmptyView() {
return !this.loading && this.isEmptyDir && this.currentView?.emptyView !== undefined
- }
+ },
},
watch: {
diff --git a/apps/files_external/src/actions/enterCredentialsAction.ts b/apps/files_external/src/actions/enterCredentialsAction.ts
index 29d660315b4..20821298db5 100644
--- a/apps/files_external/src/actions/enterCredentialsAction.ts
+++ b/apps/files_external/src/actions/enterCredentialsAction.ts
@@ -23,8 +23,15 @@ type CredentialResponse = {
password?: string,
}
+/**
+ * Set credentials for external storage
+ *
+ * @param node The node for which to set the credentials
+ * @param login The username
+ * @param password The password
+ */
async function setCredentials(node: Node, login: string, password: string): Promise<null|true> {
- const configResponse = await axios.put(generateUrl('apps/files_external/userglobalstorages/{id}', node.attributes), {
+ const configResponse = await axios.put(generateUrl('apps/files_external/userglobalstorages/{id}', { id: node.attributes.id }), {
backendOptions: { user: login, password },
}) as AxiosResponse<StorageConfig>
diff --git a/apps/files_external/src/actions/inlineStorageCheckAction.ts b/apps/files_external/src/actions/inlineStorageCheckAction.ts
index a213c196b50..42b1d5b3718 100644
--- a/apps/files_external/src/actions/inlineStorageCheckAction.ts
+++ b/apps/files_external/src/actions/inlineStorageCheckAction.ts
@@ -30,7 +30,8 @@ export const action = new FileAction({
/**
* Use this function to check the storage availability
* We then update the node attributes directly.
- * @param node
+ *
+ * @param node The node to render inline
*/
async renderInline(node: Node) {
let config = null as unknown as StorageConfig
diff --git a/apps/files_sharing/src/files_views/shares.spec.ts b/apps/files_sharing/src/files_views/shares.spec.ts
index 153057bc0ad..79ef2a09843 100644
--- a/apps/files_sharing/src/files_views/shares.spec.ts
+++ b/apps/files_sharing/src/files_views/shares.spec.ts
@@ -3,6 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/* eslint-disable n/no-extraneous-import */
+/* eslint-disable @typescript-eslint/no-explicit-any */
import type { OCSResponse } from '@nextcloud/typings/ocs'
import { Folder, Navigation, View, getNavigation } from '@nextcloud/files'
import { beforeEach, describe, expect, test, vi } from 'vitest'
diff --git a/apps/files_sharing/src/mixins/ShareRequests.js b/apps/files_sharing/src/mixins/ShareRequests.js
index dcccd5e78ed..24b4b12061e 100644
--- a/apps/files_sharing/src/mixins/ShareRequests.js
+++ b/apps/files_sharing/src/mixins/ShareRequests.js
@@ -26,10 +26,10 @@ export default {
* @param {string} [data.password] password to protect public link Share with
* @param {number} [data.permissions] 1 = read; 2 = update; 4 = create; 8 = delete; 16 = share; 31 = all (default: 31, for public shares: 1)
* @param {boolean} [data.sendPasswordByTalk] send the password via a talk conversation
- * @param {string} [data.expireDate] expire the shareautomatically after
+ * @param {string} [data.expireDate] expire the share automatically after
* @param {string} [data.label] custom label
* @param {string} [data.attributes] Share attributes encoded as json
- * @param data.note
+ * @param {string} data.note custom note to recipient
* @return {Share} the new share
* @throws {Error}
*/
diff --git a/apps/files_sharing/src/models/Share.ts b/apps/files_sharing/src/models/Share.ts
index dab409853d0..bfc6357240d 100644
--- a/apps/files_sharing/src/models/Share.ts
+++ b/apps/files_sharing/src/models/Share.ts
@@ -314,7 +314,7 @@ export default class Share {
/**
* Get the shared item id
- */
+ */
get fileSource(): number {
return this._share.file_source
}
diff --git a/apps/files_sharing/src/utils/GeneratePassword.ts b/apps/files_sharing/src/utils/GeneratePassword.ts
index bbfa5e7b27d..2f3f65c51d8 100644
--- a/apps/files_sharing/src/utils/GeneratePassword.ts
+++ b/apps/files_sharing/src/utils/GeneratePassword.ts
@@ -13,9 +13,9 @@ const config = new Config()
const passwordSet = 'abcdefgijkmnopqrstwxyzABCDEFGHJKLMNPQRSTWXYZ23456789'
/**
- * Generate a valid policy password or
- * request a valid password if password_policy
- * is enabled
+ * Generate a valid policy password or request a valid password if password_policy is enabled
+ *
+ * @param {boolean} verbose If enabled the the status is shown to the user via toast
*/
export default async function(verbose = false): Promise<string> {
// password policy is enabled, let's request a pass
diff --git a/apps/files_sharing/src/views/SharingDetailsTab.vue b/apps/files_sharing/src/views/SharingDetailsTab.vue
index baa098352d1..3f9dca57d03 100644
--- a/apps/files_sharing/src/views/SharingDetailsTab.vue
+++ b/apps/files_sharing/src/views/SharingDetailsTab.vue
@@ -247,6 +247,7 @@
import { emit } from '@nextcloud/event-bus'
import { getLanguage } from '@nextcloud/l10n'
import { ShareType } from '@nextcloud/sharing'
+import moment from '@nextcloud/moment'
import NcAvatar from '@nextcloud/vue/dist/Components/NcAvatar.js'
import NcButton from '@nextcloud/vue/dist/Components/NcButton.js'
diff --git a/apps/files_sharing/src/views/SharingTab.vue b/apps/files_sharing/src/views/SharingTab.vue
index 318b8ca3b56..6870e43d816 100644
--- a/apps/files_sharing/src/views/SharingTab.vue
+++ b/apps/files_sharing/src/views/SharingTab.vue
@@ -82,15 +82,19 @@
</template>
<script>
-import axios from '@nextcloud/axios'
+import { getCurrentUser } from '@nextcloud/auth'
import { orderBy } from '@nextcloud/files'
import { loadState } from '@nextcloud/initial-state'
import { generateOcsUrl } from '@nextcloud/router'
import { CollectionList } from 'nextcloud-vue-collections'
+
+import axios from '@nextcloud/axios'
+import moment from '@nextcloud/moment'
import NcAvatar from '@nextcloud/vue/dist/Components/NcAvatar.js'
-import Config from '../services/ConfigService.ts'
import { shareWithTitle } from '../utils/SharedWithMe.js'
+
+import Config from '../services/ConfigService.ts'
import Share from '../models/Share.ts'
import ShareTypes from '../mixins/ShareTypes.js'
import SharingEntryInternal from '../components/SharingEntryInternal.vue'
@@ -241,7 +245,7 @@ export default {
updateExpirationSubtitle(share) {
const expiration = moment(share.expireDate).unix()
this.$set(this.sharedWithMe, 'subtitle', t('files_sharing', 'Expires {relativetime}', {
- relativetime: OC.Util.relativeModifiedDate(expiration * 1000),
+ relativetime: moment(expiration * 1000).fromNow(),
}))
// share have expired
@@ -310,7 +314,7 @@ export default {
// interval update
this.expirationInterval = setInterval(this.updateExpirationSubtitle, 10000, share)
}
- } else if (this.fileInfo && this.fileInfo.shareOwnerId !== undefined ? this.fileInfo.shareOwnerId !== OC.currentUser : false) {
+ } else if (this.fileInfo && this.fileInfo.shareOwnerId !== undefined ? this.fileInfo.shareOwnerId !== getCurrentUser().uid : false) {
// Fallback to compare owner and current user.
this.sharedWithMe = {
displayName: this.fileInfo.shareOwner,
diff --git a/apps/files_versions/src/files_versions_tab.js b/apps/files_versions/src/files_versions_tab.js
index 011cde11c04..12f36bad24a 100644
--- a/apps/files_versions/src/files_versions_tab.js
+++ b/apps/files_versions/src/files_versions_tab.js
@@ -7,14 +7,14 @@ import Vue from 'vue'
import { translate as t, translatePlural as n } from '@nextcloud/l10n'
import VersionTab from './views/VersionTab.vue'
-import VTooltip from 'v-tooltip'
+import VTooltipPlugin from 'v-tooltip'
// eslint-disable-next-line n/no-missing-import, import/no-unresolved
import BackupRestore from '@mdi/svg/svg/backup-restore.svg?raw'
Vue.prototype.t = t
Vue.prototype.n = n
-Vue.use(VTooltip)
+Vue.use(VTooltipPlugin)
// Init Sharing tab component
const View = Vue.extend(VersionTab)
diff --git a/apps/files_versions/src/views/VersionTab.vue b/apps/files_versions/src/views/VersionTab.vue
index 6fa5ac3fcaa..658b95c8e99 100644
--- a/apps/files_versions/src/views/VersionTab.vue
+++ b/apps/files_versions/src/views/VersionTab.vue
@@ -177,7 +177,7 @@ export default {
/**
* Handle restored event from Version.vue
*
- * @param {import('../utils/versions.ts').Version} version
+ * @param {import('../utils/versions.ts').Version} version The version to restore
*/
async handleRestore(version) {
// Update local copy of fileInfo as rendering depends on it.
@@ -217,7 +217,7 @@ export default {
/**
* Handle label-updated event from Version.vue
- * @param {import('../utils/versions.ts').Version} version
+ * @param {import('../utils/versions.ts').Version} version The version to update
*/
handleLabelUpdateRequest(version) {
this.showVersionLabelForm = true
@@ -226,7 +226,7 @@ export default {
/**
* Handle label-updated event from Version.vue
- * @param {string} newLabel
+ * @param {string} newLabel The new label
*/
async handleLabelUpdate(newLabel) {
const oldLabel = this.editedVersion.label
@@ -246,8 +246,7 @@ export default {
/**
* Handle deleted event from Version.vue
*
- * @param {import('../utils/versions.ts').Version} version
- * @param {string} newName
+ * @param {import('../utils/versions.ts').Version} version The version to delete
*/
async handleDelete(version) {
const index = this.versions.indexOf(version)
diff --git a/apps/settings/src/admin.js b/apps/settings/src/admin.js
index 88b32f941a5..52778aec7df 100644
--- a/apps/settings/src/admin.js
+++ b/apps/settings/src/admin.js
@@ -3,11 +3,12 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+import { generateUrl } from '@nextcloud/router'
import $ from 'jquery'
window.addEventListener('DOMContentLoaded', () => {
$('#loglevel').change(function() {
- $.post(OC.generateUrl('/settings/admin/log/level'), { level: $(this).val() }, () => {
+ $.post(generateUrl('/settings/admin/log/level'), { level: $(this).val() }, () => {
OC.Log.reload()
})
})
@@ -48,7 +49,7 @@ window.addEventListener('DOMContentLoaded', () => {
OC.msg.startSaving('#mail_settings_msg')
$.ajax({
- url: OC.generateUrl('/settings/admin/mailsettings'),
+ url: generateUrl('/settings/admin/mailsettings'),
type: 'POST',
data: $('#mail_general_settings_form').serialize(),
success: () => {
@@ -68,7 +69,7 @@ window.addEventListener('DOMContentLoaded', () => {
OC.msg.startSaving('#mail_settings_msg')
$.ajax({
- url: OC.generateUrl('/settings/admin/mailsettings/credentials'),
+ url: generateUrl('/settings/admin/mailsettings/credentials'),
type: 'POST',
data: $('#mail_credentials_settings').serialize(),
success: () => {
@@ -94,7 +95,7 @@ window.addEventListener('DOMContentLoaded', () => {
OC.msg.startAction('#sendtestmail_msg', t('settings', 'Sending…'))
$.ajax({
- url: OC.generateUrl('/settings/admin/mailtest'),
+ url: generateUrl('/settings/admin/mailtest'),
type: 'POST',
success: () => {
OC.msg.finishedSuccess('#sendtestmail_msg', t('settings', 'Email sent'))
diff --git a/apps/settings/src/components/AuthToken.vue b/apps/settings/src/components/AuthToken.vue
index 2efe2db4145..9e77d8b3749 100644
--- a/apps/settings/src/components/AuthToken.vue
+++ b/apps/settings/src/components/AuthToken.vue
@@ -175,8 +175,8 @@ export default defineComponent({
return this.token.type === TokenType.PERMANENT_TOKEN
},
/**
- * Object ob the current user agend used by the token
- * @return Either an object containing user agent information or null if unknown
+ * Object ob the current user agent used by the token
+ * This either returns an object containing user agent information or `null` if unknown
*/
client() {
// pretty format sync client user agent
diff --git a/apps/settings/src/components/BasicSettings/BackgroundJob.vue b/apps/settings/src/components/BasicSettings/BackgroundJob.vue
index 835f65a2477..4924014b78a 100644
--- a/apps/settings/src/components/BasicSettings/BackgroundJob.vue
+++ b/apps/settings/src/components/BasicSettings/BackgroundJob.vue
@@ -56,6 +56,7 @@
@update:checked="onBackgroundJobModeChanged">
{{ t('settings', 'Cron (Recommended)') }}
</NcCheckboxRadioSwitch>
+ <!-- eslint-disable-next-line vue/no-v-html The translation is sanitized-->
<em v-html="cronLabel" />
</NcSettingsSection>
</template>
@@ -111,7 +112,7 @@ export default {
desc += '<br>' + t('settings', 'The PHP POSIX extension is required. See {linkstart}PHP documentation{linkend} for more details.', {
linkstart: '<a target="_blank" rel="noreferrer nofollow" class="external" href="https://www.php.net/manual/en/book.posix.php">',
linkend: '</a>',
- }, undefined, { escape: false, sanitize: false })
+ }, undefined, { escape: false })
}
return desc
},
diff --git a/apps/settings/src/components/Encryption.vue b/apps/settings/src/components/Encryption.vue
index 72b597c61d3..4d80f9b9833 100644
--- a/apps/settings/src/components/Encryption.vue
+++ b/apps/settings/src/components/Encryption.vue
@@ -53,7 +53,15 @@
</template>
</div>
- <div v-else-if="externalBackendsEnabled" v-html="migrationMessage" />
+ <div v-else-if="externalBackendsEnabled">
+ {{
+ t(
+ 'settings',
+ 'You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the "Default encryption module" and run {command}',
+ { command: '"occ encryption:migrate"' },
+ )
+ }}
+ </div>
</div>
</NcSettingsSection>
</template>
@@ -92,13 +100,6 @@ export default {
defaultCheckedModule: Object.entries(encryptionModules).find((module) => module[1].default)[0],
}
},
- computed: {
- migrationMessage() {
- return t('settings', 'You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the "Default encryption module" and run {command}', {
- command: '"occ encryption:migrate"',
- })
- },
- },
methods: {
displayWarning() {
if (!this.encryptionEnabled) {
diff --git a/apps/settings/src/components/Markdown.vue b/apps/settings/src/components/Markdown.vue
index f3b8747119d..dc7a076a700 100644
--- a/apps/settings/src/components/Markdown.vue
+++ b/apps/settings/src/components/Markdown.vue
@@ -4,6 +4,7 @@
-->
<template>
+ <!-- eslint-disable-next-line vue/no-v-html This is rendered markdown so should be "safe" -->
<div class="settings-markdown" v-html="renderMarkdown" />
</template>
diff --git a/apps/settings/src/components/PersonalInfo/BirthdaySection.vue b/apps/settings/src/components/PersonalInfo/BirthdaySection.vue
index 86917257600..633794d9d5d 100644
--- a/apps/settings/src/components/PersonalInfo/BirthdaySection.vue
+++ b/apps/settings/src/components/PersonalInfo/BirthdaySection.vue
@@ -8,13 +8,11 @@
:input-id="inputId"
:readable="birthdate.readable" />
- <template>
- <NcDateTimePickerNative :id="inputId"
- type="date"
- label=""
- :value="value"
- @input="onInput" />
- </template>
+ <NcDateTimePickerNative :id="inputId"
+ type="date"
+ label=""
+ :value="value"
+ @input="onInput" />
<p class="property__helper-text-message">
{{ t('settings', 'Enter your date of birth') }}
@@ -66,7 +64,7 @@ export default {
get() {
return new Date(this.birthdate.value)
},
- /** @param {Date} value */
+ /** @param {Date} value The date to set */
set(value) {
const day = value.getDate().toString().padStart(2, '0')
const month = (value.getMonth() + 1).toString().padStart(2, '0')
diff --git a/apps/settings/src/components/PersonalInfo/DetailsSection.vue b/apps/settings/src/components/PersonalInfo/DetailsSection.vue
index a69b6d58ed7..a5de95f7ee5 100644
--- a/apps/settings/src/components/PersonalInfo/DetailsSection.vue
+++ b/apps/settings/src/components/PersonalInfo/DetailsSection.vue
@@ -20,6 +20,7 @@
<div class="details__quota">
<CircleSlice :size="20" />
<div class="details__quota-info">
+ <!-- eslint-disable-next-line vue/no-v-html -->
<p class="details__quota-text" v-html="quotaText" />
<NcProgressBar size="medium"
:value="usageRelative"
@@ -32,8 +33,9 @@
<script>
import { loadState } from '@nextcloud/initial-state'
-import NcProgressBar from '@nextcloud/vue/dist/Components/NcProgressBar.js'
+import { t } from '@nextcloud/l10n'
+import NcProgressBar from '@nextcloud/vue/dist/Components/NcProgressBar.js'
import Account from 'vue-material-design-icons/Account.vue'
import CircleSlice from 'vue-material-design-icons/CircleSlice3.vue'
@@ -64,12 +66,14 @@ export default {
computed: {
quotaText() {
if (quota === SPACE_UNLIMITED) {
- return t('settings', 'You are using <strong>{usage}</strong>', { usage })
+ return t('settings', 'You are using {s}{usage}{/s}', { usage, s: '<strong>', '/s': '</strong>' }, undefined, { escape: false })
}
return t(
'settings',
- 'You are using <strong>{usage}</strong> of <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)',
- { usage, totalSpace, usageRelative },
+ 'You are using {s}{usage}{/s} of {s}{totalSpace}{/s} ({s}{usageRelative}%{/s})',
+ { usage, totalSpace, usageRelative, s: '<strong>', '/s': '</strong>' },
+ undefined,
+ { escape: false },
)
},
},
diff --git a/apps/settings/src/components/Users/NewUserDialog.vue b/apps/settings/src/components/Users/NewUserDialog.vue
index bc6ba0901d9..26e4afbd924 100644
--- a/apps/settings/src/components/Users/NewUserDialog.vue
+++ b/apps/settings/src/components/Users/NewUserDialog.vue
@@ -135,6 +135,7 @@
</template>
<script>
+import { formatFileSize, parseFileSize } from '@nextcloud/files'
import NcButton from '@nextcloud/vue/dist/Components/NcButton.js'
import NcDialog from '@nextcloud/vue/dist/Components/NcDialog.js'
import NcPasswordField from '@nextcloud/vue/dist/Components/NcPasswordField.js'
@@ -317,7 +318,7 @@ export default {
const validQuota = OC.Util.computerFileSize(quota)
if (validQuota !== null && validQuota >= 0) {
// unify format output
- quota = OC.Util.humanFileSize(OC.Util.computerFileSize(quota))
+ quota = formatFileSize(parseFileSize(quota))
this.newUser.quota = { id: quota, label: quota }
return this.newUser.quota
}
diff --git a/apps/settings/src/main-apps-users-management.ts b/apps/settings/src/main-apps-users-management.ts
index c923406ce7f..f24562d3e82 100644
--- a/apps/settings/src/main-apps-users-management.ts
+++ b/apps/settings/src/main-apps-users-management.ts
@@ -4,9 +4,9 @@
*/
import Vue from 'vue'
-import VTooltip from 'v-tooltip'
+import VTooltipPlugin from 'v-tooltip'
import { sync } from 'vuex-router-sync'
-import { translate as t, translatePlural as n } from '@nextcloud/l10n'
+import { t, n } from '@nextcloud/l10n'
import SettingsApp from './views/SettingsApp.vue'
import router from './router/index.ts'
@@ -14,19 +14,18 @@ import { useStore } from './store/index.js'
import { getCSPNonce } from '@nextcloud/auth'
import { PiniaVuePlugin, createPinia } from 'pinia'
-Vue.use(VTooltip, { defaultHtml: false })
-
-const store = useStore()
-sync(store, router)
-
// CSP config for webpack dynamic chunk loading
// eslint-disable-next-line camelcase
__webpack_nonce__ = getCSPNonce()
+const store = useStore()
+sync(store, router)
+
// bind to window
Vue.prototype.t = t
Vue.prototype.n = n
Vue.use(PiniaVuePlugin)
+Vue.use(VTooltipPlugin, { defaultHtml: false })
const pinia = createPinia()
diff --git a/apps/settings/src/main-declarative-settings-forms.ts b/apps/settings/src/main-declarative-settings-forms.ts
index 7cd4cb68345..6e2d71b69ca 100644
--- a/apps/settings/src/main-declarative-settings-forms.ts
+++ b/apps/settings/src/main-declarative-settings-forms.ts
@@ -5,9 +5,10 @@
import type { ComponentInstance } from 'vue'
import { loadState } from '@nextcloud/initial-state'
-import { translate as t, translatePlural as n } from '@nextcloud/l10n'
+import { t, n } from '@nextcloud/l10n'
import Vue from 'vue'
import DeclarativeSection from './components/DeclarativeSettings/DeclarativeSection.vue'
+import logger from './logger'
interface DeclarativeFormField {
id: string,
@@ -34,12 +35,10 @@ interface DeclarativeForm {
fields: Array<DeclarativeFormField>,
}
-const forms = loadState('settings', 'declarative-settings-forms', []) as Array<DeclarativeForm>
-console.debug('Loaded declarative forms:', forms)
+const forms = loadState<DeclarativeForm[]>('settings', 'declarative-settings-forms', [])
/**
- *
- * @param forms
+ * @param forms The forms to render
*/
function renderDeclarativeSettingsSections(forms: Array<DeclarativeForm>): ComponentInstance[] {
Vue.mixin({ methods: { t, n } })
@@ -57,5 +56,6 @@ function renderDeclarativeSettingsSections(forms: Array<DeclarativeForm>): Compo
}
document.addEventListener('DOMContentLoaded', () => {
+ logger.debug('Loaded declarative forms', { forms })
renderDeclarativeSettingsSections(forms)
})
diff --git a/apps/settings/src/mixins/UserRowMixin.js b/apps/settings/src/mixins/UserRowMixin.js
index a06b310bcca..6ed29cf0049 100644
--- a/apps/settings/src/mixins/UserRowMixin.js
+++ b/apps/settings/src/mixins/UserRowMixin.js
@@ -3,6 +3,8 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+import { formatFileSize } from '@nextcloud/files'
+
export default {
props: {
user: {
@@ -68,11 +70,10 @@ export default {
/* QUOTA MANAGEMENT */
usedSpace() {
- if (this.user.quota.used) {
- return t('settings', '{size} used', { size: OC.Util.humanFileSize(this.user.quota.used) })
- }
- return t('settings', '{size} used', { size: OC.Util.humanFileSize(0) })
+ const quotaUsed = this.user.quota.used > 0 ? this.user.quota.used : 0
+ return t('settings', '{size} used', { size: formatFileSize(quotaUsed, true) })
},
+
usedQuota() {
let quota = this.user.quota.quota
if (quota > 0) {
@@ -84,11 +85,12 @@ export default {
}
return isNaN(quota) ? 0 : quota
},
+
// Mapping saved values to objects
userQuota() {
if (this.user.quota.quota >= 0) {
// if value is valid, let's map the quotaOptions or return custom quota
- const humanQuota = OC.Util.humanFileSize(this.user.quota.quota)
+ const humanQuota = formatFileSize(this.user.quota.quota)
const userQuota = this.quotaOptions.find(quota => quota.id === humanQuota)
return userQuota || { id: humanQuota, label: humanQuota }
} else if (this.user.quota.quota === 'default') {
diff --git a/apps/settings/src/utils/userUtils.ts b/apps/settings/src/utils/userUtils.ts
index 9ac21fd4c0e..7d9a516a542 100644
--- a/apps/settings/src/utils/userUtils.ts
+++ b/apps/settings/src/utils/userUtils.ts
@@ -18,8 +18,8 @@ export const defaultQuota = {
/**
* Return `true` if the logged in user does not have permissions to view the
* data of `user`
- * @param user
- * @param user.id
+ * @param user The user to check
+ * @param user.id Id of the user
*/
export const isObfuscated = (user: { id: string, [key: string]: unknown }) => {
const keys = Object.keys(user)
diff --git a/apps/systemtags/src/services/api.ts b/apps/systemtags/src/services/api.ts
index 64ca97fc02c..1e2c9aeb9d4 100644
--- a/apps/systemtags/src/services/api.ts
+++ b/apps/systemtags/src/services/api.ts
@@ -52,8 +52,9 @@ export const fetchLastUsedTagIds = async (): Promise<number[]> => {
}
/**
- * @param tag
- * @return created tag id
+ * Create a tag and return the Id of the newly created tag.
+ *
+ * @param tag The tag to create
*/
export const createTag = async (tag: Tag | ServerTag): Promise<number> => {
const path = '/systemtags'
diff --git a/apps/systemtags/src/services/files.ts b/apps/systemtags/src/services/files.ts
index 74917bf0415..8759a99d560 100644
--- a/apps/systemtags/src/services/files.ts
+++ b/apps/systemtags/src/services/files.ts
@@ -6,6 +6,7 @@
import type { FileStat, ResponseDataDetailed } from 'webdav'
import type { ServerTagWithId, Tag, TagWithId } from '../types.js'
+import { t } from '@nextcloud/l10n'
import { davClient } from './davClient.js'
import { createTag, fetchTagsPayload } from './api.js'
import { formatTag, parseTags } from '../utils.js'
@@ -27,9 +28,11 @@ export const fetchTagsForFile = async (fileId: number): Promise<TagWithId[]> =>
}
/**
- * @param tag
- * @param fileId
- * @return created tag id
+ * Create a tag and apply it to a given file (by id).
+ * This returns the id of the newly created tag.
+ *
+ * @param tag The tag to create
+ * @param fileId Id of the file to tag
*/
export const createTagForFile = async (tag: Tag, fileId: number): Promise<number> => {
const tagToCreate = formatTag(tag)
diff --git a/apps/user_status/src/UserStatus.vue b/apps/user_status/src/UserStatus.vue
index d25629f3e5f..3ed24e419b8 100644
--- a/apps/user_status/src/UserStatus.vue
+++ b/apps/user_status/src/UserStatus.vue
@@ -36,6 +36,7 @@
</template>
<script>
+import { getCurrentUser } from '@nextcloud/auth'
import { subscribe, unsubscribe } from '@nextcloud/event-bus'
import { Fragment } from 'vue-frag'
import NcButton from '@nextcloud/vue/dist/Components/NcButton.js'
@@ -159,7 +160,7 @@ export default {
}
},
handleUserStatusUpdated(state) {
- if (OC.getCurrentUser().uid === state.userId) {
+ if (getCurrentUser()?.uid === state.userId) {
this.$store.dispatch('setStatusFromObject', {
status: state.status,
icon: state.icon,
diff --git a/apps/user_status/src/services/statusService.js b/apps/user_status/src/services/statusService.js
index fcaf2ef9902..6504411c996 100644
--- a/apps/user_status/src/services/statusService.js
+++ b/apps/user_status/src/services/statusService.js
@@ -21,7 +21,7 @@ const fetchCurrentStatus = async () => {
/**
* Fetches the current user-status
*
- * @param {string} userId
+ * @param {string} userId Id of the user to fetch the status
* @return {Promise<object>}
*/
const fetchBackupStatus = async (userId) => {
@@ -89,7 +89,7 @@ const clearMessage = async () => {
/**
* Revert the automated status
*
- * @param {string} messageId
+ * @param {string} messageId ID of the message to revert
* @return {Promise<object>}
*/
const revertToBackupStatus = async (messageId) => {
diff --git a/core/js/tests/html-domparser.js b/core/js/tests/html-domparser.js
index b0bb4e62718..945d4b1f441 100644
--- a/core/js/tests/html-domparser.js
+++ b/core/js/tests/html-domparser.js
@@ -16,10 +16,8 @@
(function(DOMParser) {
"use strict";
- var
- DOMParser_proto = DOMParser.prototype
- , real_parseFromString = DOMParser_proto.parseFromString
- ;
+ var DOMParser_proto = DOMParser.prototype;
+ var real_parseFromString = DOMParser_proto.parseFromString;
// Firefox/Opera/IE throw errors on unsupported types
try {
@@ -32,15 +30,12 @@
DOMParser_proto.parseFromString = function(markup, type) {
if (/^\s*text\/html\s*(?:;|$)/i.test(type)) {
- var
- doc = document.implementation.createHTMLDocument("")
- ;
- if (markup.toLowerCase().indexOf('<!doctype') > -1) {
- doc.documentElement.innerHTML = markup;
- }
- else {
- doc.body.innerHTML = markup;
- }
+ var doc = document.implementation.createHTMLDocument("");
+ if (markup.toLowerCase().indexOf('<!doctype') > -1) {
+ doc.documentElement.innerHTML = markup;
+ } else {
+ doc.body.innerHTML = markup;
+ }
return doc;
} else {
return real_parseFromString.apply(this, arguments);
diff --git a/core/src/OCP/loader.js b/core/src/OCP/loader.js
index 7b4e87dd9b4..d307eb27996 100644
--- a/core/src/OCP/loader.js
+++ b/core/src/OCP/loader.js
@@ -3,6 +3,8 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+import { generateFilePath } from '@nextcloud/router'
+
const loadedScripts = {}
const loadedStylesheets = {}
/**
@@ -25,7 +27,7 @@ export default {
}
loadedScripts[key] = true
return new Promise(function(resolve, reject) {
- const scriptPath = OC.filePath(app, 'js', file)
+ const scriptPath = generateFilePath(app, 'js', file)
const script = document.createElement('script')
script.src = scriptPath
script.setAttribute('nonce', btoa(OC.requestToken))
@@ -49,7 +51,7 @@ export default {
}
loadedStylesheets[key] = true
return new Promise(function(resolve, reject) {
- const stylePath = OC.filePath(app, 'css', file)
+ const stylePath = generateFilePath(app, 'css', file)
const link = document.createElement('link')
link.href = stylePath
link.type = 'text/css'
diff --git a/core/src/install.js b/core/src/install.js
index 261cb4bedd7..ea2e2996a2a 100644
--- a/core/src/install.js
+++ b/core/src/install.js
@@ -5,6 +5,8 @@
import $ from 'jquery'
import { translate as t } from '@nextcloud/l10n'
+import { linkTo } from '@nextcloud/router'
+
import { getToken } from './OC/requesttoken.js'
import getURLParameter from './Util/get-url-parameter.js'
@@ -129,7 +131,7 @@ window.addEventListener('DOMContentLoaded', function() {
}
$('#adminpass').strengthify({
- zxcvbn: OC.linkTo('core', 'vendor/zxcvbn/dist/zxcvbn.js'),
+ zxcvbn: linkTo('core', 'vendor/zxcvbn/dist/zxcvbn.js'),
titles: [
t('core', 'Very weak password'),
t('core', 'Weak password'),
diff --git a/core/src/jquery/avatar.js b/core/src/jquery/avatar.js
index 826d94f7a08..3851a26ce31 100644
--- a/core/src/jquery/avatar.js
+++ b/core/src/jquery/avatar.js
@@ -3,10 +3,10 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+import { getCurrentUser } from '@nextcloud/auth'
+import { generateUrl } from '@nextcloud/router'
import $ from 'jquery'
-import OC from '../OC/index.js'
-
/**
* This plugin inserts the right avatar for the user, depending on, whether a
* custom avatar is uploaded - which it uses then - or not, and display a
@@ -90,8 +90,8 @@ $.fn.avatar = function(user, size, ie8fix, hidedefault, callback, displayname) {
let url
// If this is our own avatar we have to use the version attribute
- if (user === OC.getCurrentUser().uid) {
- url = OC.generateUrl(
+ if (user === getCurrentUser()?.uid) {
+ url = generateUrl(
'/avatar/{user}/{size}?v={version}',
{
user,
@@ -99,7 +99,7 @@ $.fn.avatar = function(user, size, ie8fix, hidedefault, callback, displayname) {
version: oc_userconfig.avatar.version,
})
} else {
- url = OC.generateUrl(
+ url = generateUrl(
'/avatar/{user}/{size}',
{
user,
diff --git a/core/src/services/UnifiedSearchService.js b/core/src/services/UnifiedSearchService.js
index 1fa5cae8ef8..7067c994c90 100644
--- a/core/src/services/UnifiedSearchService.js
+++ b/core/src/services/UnifiedSearchService.js
@@ -82,7 +82,7 @@ export function search({ type, query, cursor, since, until, limit, person, extra
* Get the list of active contacts
*
* @param {object} filter filter contacts by string
- * @param filter.searchTerm
+ * @param {string} filter.searchTerm the query
* @return {object} {request: Promise}
*/
export async function getContacts({ searchTerm }) {
diff --git a/core/src/systemtags/systemtagmodel.js b/core/src/systemtags/systemtagmodel.js
index 349650e02be..1d2cd3ae57d 100644
--- a/core/src/systemtags/systemtagmodel.js
+++ b/core/src/systemtags/systemtagmodel.js
@@ -2,7 +2,7 @@
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-or-later
- * @param OC
+ * @param {object} OC The OC namespace
*/
(function(OC) {
diff --git a/tests/karma.config.js b/tests/karma.config.js
index 2847b046b25..db8e6e9734d 100644
--- a/tests/karma.config.js
+++ b/tests/karma.config.js
@@ -41,14 +41,8 @@ module.exports = function(config) {
// up with the global namespace/classes/state
'dist/files_sharing-additionalScripts.js',
'dist/files_sharing-files_sharing_tab.js',
- 'dist/files_sharing-files_sharing.js',
'dist/files_sharing-main.js',
- 'apps/files_sharing/js/files_drop.js',
- 'apps/files_sharing/js/public.js',
- 'apps/files_sharing/js/sharedfilelist.js',
- 'apps/files_sharing/js/templates.js',
],
- testFiles: ['apps/files_sharing/tests/js/*.js']
},
'files_trashbin',
];