Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
cbf32d8
IONOS(infra): add IONOS app directory stubs and .gitignore entries
printminion-co Apr 22, 2026
dc70210
IONOS(custom-npms): add custom npm submodules
printminion-co Apr 22, 2026
87a344b
IONOS(apps): add custom app submodules
printminion-co Apr 22, 2026
3f834b1
IONOS(theme): add nc-ionos-theme
printminion-co Apr 23, 2026
392bf73
IONOS(apps): add IONOS-forked external apps
printminion-co Apr 23, 2026
62e2900
IONOS(apps): add original Nextcloud external apps
printminion-co Apr 23, 2026
6b6192c
IONOS(config): add IONOS config submodule
printminion-co Apr 22, 2026
3596906
IONOS(ci): add IONOS build and SBOM workflows
printminion-co Apr 22, 2026
1c29182
IONOS(core): add user-agent validation to session and OCS
printminion-co Apr 22, 2026
8a297ab
IONOS(files-sharing): provision initial share-acceptance state
printminion-co Apr 22, 2026
e3d6404
IONOS(files): add SidebarQuota component and wire into navigation
printminion-co Apr 22, 2026
e739552
IONOS(nc-vue-icons): adjust folder-{open}-icon size
printminion-co Sep 10, 2024
874bf1d
IONOS(search): disable person search by default
printminion-co Apr 22, 2026
25e04f7
IONOS(files-sharing): confirm before deleting a share
printminion-co Apr 22, 2026
e7137a7
IONOS(occ): add redirect config and mask sensitive config values in o…
thlehmann-ionos Jul 5, 2024
f70ad2f
IONOS(build): inject build number as 5th version component
printminion-co Apr 7, 2026
f015279
IONOS(files_downloadlimit): update submodule to v33.0.2 (NC32 compati…
printminion-co Apr 23, 2026
3cd4d80
IONOS(serverinfo): update submodule to v32.0.8 (NC32 compatible)
printminion-co Apr 23, 2026
b443800
IONOS(groupquota): update submodule to v0.2.4 (NC32 compatible)
printminion-co Apr 23, 2026
e8edc44
IONOS(deps): alias @mdi and @nextcloud/vue to custom npm forks
printminion-co Apr 22, 2026
7f470bd
IONOS(frontend): add custom MDI icon mappings
printminion-co Apr 22, 2026
3d78f9e
Revert "IONOS(deps): alias @mdi and @nextcloud/vue to custom npm forks"
printminion-co May 5, 2026
772010d
Revert "IONOS(frontend): add custom MDI icon mappings"
printminion-co May 5, 2026
e382723
IONOS(view): update submodule to vanilla v32.0.6 (7f1d8dc) (NC32 comp…
printminion-co Apr 29, 2026
1cf6e87
IONOS(richdocuments): update submodule to v9.0.6-005602a (NC32 compat…
printminion-co May 6, 2026
e5dd935
IONOS(nc-theming): update submodule to 33.0.0-de7a242 (NC33 compatible)
tanyaka May 7, 2026
8bf393f
IONOS(nc-theming): update submodule to 32.0.6-de7a242a06a89f (align v…
tanyaka May 7, 2026
c14a33a
IONOS(simplesettings): update submodule to v32.0.6-d87bf5b (NC32 comp…
printminion-co May 7, 2026
6a880ac
IONOS(config): update submodule to cce9a71 (remove custom-npm build t…
printminion-co May 7, 2026
4160515
IONOS(ci): remove FONTAWESOME_PACKAGE_TOKEN and custom-npm install steps
tanyaka Apr 28, 2026
410e25f
Revert "IONOS(nc-vue-icons): adjust folder-{open}-icon size"
tanyaka May 7, 2026
82872c7
IONOS(.gitmodules): remove FA custom-npms
tanyaka May 7, 2026
5572794
fix(lib): templates core path detection
skjnldsv Mar 11, 2026
a08a8ee
Merge pull request #246 from IONOS-Productivity/tkl/dev/HDNEXT-1719/H…
printminion-co May 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
444 changes: 444 additions & 0 deletions .github/workflows/hidrive-next-build.yml

Large diffs are not rendered by default.

417 changes: 417 additions & 0 deletions .github/workflows/sbom-matrix.yaml

Large diffs are not rendered by default.

11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
/translationfiles
/translationtool.phar

# CI/CD generated files
/.buildnumber

# ignore all apps except core ones
/apps*/*
!/apps/cloud_federation_api
Expand Down Expand Up @@ -54,6 +57,13 @@
/apps/files_external/3rdparty/irodsphp/prods/tutorials
/apps/files_external/3rdparty/irodsphp/prods/test*
/apps/files_external/tests/config.*.php
# IONOS: this should not be upstreamed!
!/apps-external/viewer
!/apps-external/user_oidc
!/apps-external/serverinfo
!/apps-external/groupquota
!/apps-external/files_downloadlimit
!/apps-custom/*

# apps modules
/apps/*/node_modules
Expand Down Expand Up @@ -137,6 +147,7 @@ nbproject
# nodejs
/build/bin
/build/lib/
/build/jsdocs/
/build/integration/output/
/build/integration/phpserver.log
/npm-debug.log
Expand Down
36 changes: 36 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,39 @@
[submodule "3rdparty"]
path = 3rdparty
url = https://github.com/nextcloud/3rdparty.git
[submodule "apps-custom/simplesettings"]
path = apps-custom/simplesettings
url = git@github.com:IONOS-Productivity/nc-simplesettings.git
[submodule "apps-custom/googleanalytics"]
path = apps-custom/googleanalytics
url = git@github.com:IONOS-Productivity/nc-googleanalytics.git
[submodule "apps-custom/nc_theming"]
path = apps-custom/nc_theming
url = git@github.com:IONOS-Productivity/nc-theming.git
[submodule "apps-custom/nc_ionos_processes"]
path = apps-custom/nc_ionos_processes
url = git@github.com:IONOS-Productivity/nc-ionos-processes.git
[submodule "themes/nc-ionos-theme"]
path = themes/nc-ionos-theme
url = git@github.com:IONOS-Productivity/nc-ionos-theme.git
[submodule "apps-external/viewer"]
path = apps-external/viewer
url = git@github.com:IONOS-Productivity/nc-viewer.git
[submodule "apps-external/richdocuments"]
path = apps-external/richdocuments
url = git@github.com:IONOS-Productivity/nc-richdocuments.git
[submodule "apps-external/user_oidc"]
path = apps-external/user_oidc
url = git@github.com:nextcloud/user_oidc.git
[submodule "apps-external/serverinfo"]
path = apps-external/serverinfo
url = git@github.com:nextcloud/serverinfo.git
[submodule "apps-external/groupquota"]
path = apps-external/groupquota
url = git@github.com:nextcloud/groupquota.git
[submodule "apps-external/files_downloadlimit"]
path = apps-external/files_downloadlimit
url = git@github.com:nextcloud/files_downloadlimit.git
[submodule "IONOS"]
path = IONOS
url = git@github.com:IONOS-Productivity/easystorage-config.git
1 change: 1 addition & 0 deletions IONOS
Submodule IONOS added at cce9a7
Empty file added apps-custom/.gitkeep
Empty file.
1 change: 1 addition & 0 deletions apps-custom/googleanalytics
Submodule googleanalytics added at 8766e3
1 change: 1 addition & 0 deletions apps-custom/nc_ionos_processes
Submodule nc_ionos_processes added at 170d17
1 change: 1 addition & 0 deletions apps-custom/nc_theming
Submodule nc_theming added at a06a89
1 change: 1 addition & 0 deletions apps-custom/simplesettings
Submodule simplesettings added at d87bf5
Empty file added apps-external/.gitkeep
Empty file.
1 change: 1 addition & 0 deletions apps-external/files_downloadlimit
Submodule files_downloadlimit added at 28ed1f
1 change: 1 addition & 0 deletions apps-external/groupquota
Submodule groupquota added at 5b2d66
1 change: 1 addition & 0 deletions apps-external/richdocuments
Submodule richdocuments added at 005602
1 change: 1 addition & 0 deletions apps-external/serverinfo
Submodule serverinfo added at 57a038
1 change: 1 addition & 0 deletions apps-external/user_oidc
Submodule user_oidc added at b5a67c
1 change: 1 addition & 0 deletions apps-external/viewer
Submodule viewer added at 7f1d8d
161 changes: 161 additions & 0 deletions apps/files/src/components/SidebarQuota.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
<!--
SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
SPDX-FileCopyrightText: 2024 STRATO AG
SPDX-License-Identifier: AGPL-3.0-or-later
-->

<template>
<NcAppNavigationItem :aria-label="t('files', 'Storage information')"
:class="{ 'app-navigation-entry__settings-quota--not-unlimited': storageStats.quota >= 0}"
:loading="loadingStorageStats"
:name="storageStatsTitle"
:title="storageStatsTitle + ': ' + storageStatsTextUsed + ' ' + storageStatsTextOf"
class="app-navigation-entry__settings-quota"
data-cy-files-navigation-settings-quota
@click.stop.prevent="debounceUpdateStorageStats">
<CloudIcon slot="icon" :size="16" />
<NcProgressBar v-if="storageStats.quota >= 0"
slot="extra"
size="7"
:error="storageStats.relative > 80"
:value="Math.min(storageStats.relative, 100)"
:color="barColor"
:style="{'background-color': backgroundColor}" />
<div slot="extra" class="quota-text">
<span class="quota-text-bold">{{ storageStatsTextUsed }}</span>
<span>{{ storageStatsTextOf }}</span>
</div>
</NcAppNavigationItem>
</template>

<script>
import { debounce, throttle } from 'throttle-debounce'
import { formatFileSize } from '@nextcloud/files'
import { generateUrl } from '@nextcloud/router'
import { loadState } from '@nextcloud/initial-state'
import { subscribe } from '@nextcloud/event-bus'
import { translate } from '@nextcloud/l10n'
import axios from '@nextcloud/axios'

import CloudIcon from 'vue-material-design-icons/Cloud.vue'
import NcAppNavigationItem from '@nextcloud/vue/dist/Components/NcAppNavigationItem.js'
import NcProgressBar from '@nextcloud/vue/dist/Components/NcProgressBar.js'

export default {
name: 'SidebarQuota',

components: {
CloudIcon,
NcAppNavigationItem,
NcProgressBar,
},

data() {
return {
loadingStorageStats: false,
storageStats: loadState('files', 'storageStats', null),
barColor: null,
backgroundColor: null,
}
},

computed: {
storageStatsTitle() {
return this.t('core', 'Storage used')
},
storageStatsTextUsed() {
return formatFileSize(this.storageStats?.used, false, false)
},
storageStatsTextOf() {
return this.storageStats?.quota >= 0
? this.t('core', 'of {quota}', { quota: formatFileSize(this.storageStats?.quota, false, false) })
: ''
},
},

beforeMount() {
subscribe('files:node:created', this.throttleUpdateStorageStats)
subscribe('files:node:deleted', this.throttleUpdateStorageStats)
subscribe('files:node:moved', this.throttleUpdateStorageStats)
subscribe('files:node:updated', this.throttleUpdateStorageStats)
},

mounted() {
const styles = getComputedStyle(document.documentElement)
this.barColor = styles.getPropertyValue('--ion-color-blue-b4')
this.backgroundColor = styles.getPropertyValue('--color-primary-text')
},

methods: {
// From user input
debounceUpdateStorageStats: debounce(200, function(event) {
this.updateStorageStats(event)
}),
// From interval or event bus
throttleUpdateStorageStats: throttle(1000, function(event) {
this.updateStorageStats(event)
}),

/**
* Update the storage stats
* Throttled at max 1 refresh per minute
*
*/
async updateStorageStats() {
if (this.loadingStorageStats) {
return
}

this.loadingStorageStats = true
try {
const response = await axios.get(generateUrl('/apps/files/api/v1/stats'))
if (!response?.data?.data) {
throw new Error('Invalid storage stats')
}

this.storageStats = response.data.data
} finally {
this.loadingStorageStats = false
}
},

t: translate,
},
}
</script>

<style lang="scss" scoped>
.app-navigation-entry__settings-quota {
:deep(.app-navigation-entry:hover) {
background-color: initial !important;
}

:deep(.app-navigation-entry__name) {
font-weight: 500;
padding-bottom: 32px;
}

&--not-unlimited :deep(.app-navigation-entry__name) {
padding-bottom: 50px;
}

progress {
position: absolute;
bottom: 46px;
margin-inline-start: 14px;
width: calc(100% - 44px);
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.15) inset;
}

.quota-text {
position: absolute;
bottom: 16px;
margin-inline-start: 14px;

.quota-text-bold {
font-weight: 500;
}
}
}

</style>
6 changes: 3 additions & 3 deletions apps/files/src/views/Navigation.vue
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
<template #footer>
<ul class="app-navigation-entry__settings">
<!-- User storage usage statistics -->
<NavigationQuota />
<SidebarQuota />

<!-- Files settings modal toggle-->
<NcAppNavigationItem :name="t('files', 'Files settings')"
Expand All @@ -51,7 +51,7 @@ import IconCog from 'vue-material-design-icons/CogOutline.vue'
import NcAppNavigation from '@nextcloud/vue/components/NcAppNavigation'
import NcAppNavigationItem from '@nextcloud/vue/components/NcAppNavigationItem'
import NcAppNavigationList from '@nextcloud/vue/components/NcAppNavigationList'
import NavigationQuota from '../components/NavigationQuota.vue'
import SidebarQuota from '../components/SidebarQuota.vue'
import SettingsModal from './Settings.vue'
import FilesNavigationItem from '../components/FilesNavigationItem.vue'
import FilesNavigationSearch from '../components/FilesNavigationSearch.vue'
Expand All @@ -77,7 +77,7 @@ export default defineComponent({
FilesNavigationItem,
FilesNavigationSearch,

NavigationQuota,
SidebarQuota,
NcAppNavigation,
NcAppNavigationItem,
NcAppNavigationList,
Expand Down
11 changes: 11 additions & 0 deletions apps/files_sharing/lib/Listener/LoadAdditionalListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
use OCA\Files_Sharing\AppInfo\Application;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use OCP\IConfig;
use OCP\IInitialStateService;
use OCP\Server;
use OCP\Share\IManager;
use OCP\Util;
Expand All @@ -31,5 +33,14 @@ public function handle(Event $event): void {
if ($shareManager->shareApiEnabled() && class_exists('\OCA\Files\App')) {
Util::addInitScript(Application::APP_ID, 'init');
}

$this->provideInitialStates();
}

private function provideInitialStates(): void {
$initialState = Server::get(IInitialStateService::class);
$config = Server::get(IConfig::class);
$defaultAcceptSystemConfig = $config->getSystemValueBool('sharing.enable_share_accept');
$initialState->provideInitialState(Application::APP_ID, 'accept_default', $defaultAcceptSystemConfig);
}
}
38 changes: 37 additions & 1 deletion apps/files_sharing/src/mixins/SharesMixin.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
*/

import { getCurrentUser } from '@nextcloud/auth'
import { showError, showSuccess } from '@nextcloud/dialogs'
import { DialogBuilder, showError, showSuccess } from '@nextcloud/dialogs'
import { ShareType } from '@nextcloud/sharing'
import { emit } from '@nextcloud/event-bus'

Expand Down Expand Up @@ -278,10 +278,46 @@ export default {
}
},

/**
* Display delete share confirmation dialog
* @returns {Promise<boolean>}
*/
async askDeleteConfirmation() {
let confirmed = false
await new DialogBuilder()
.setName(t('files_sharing', 'Confirm deletion'))
.setText(t('files_sharing', 'You are about to delete this share'))
.setButtons([
{
label: t('core', 'Cancel'),
},
{
label: t('files_sharing', 'Delete share'),
type: 'error',
callback: () => {
confirmed = true
},
},
])
.build()
.show()

return confirmed
},

/**
* Delete share button handler
*/
async onDelete() {
console.debug('Deleting share', this.share.id)
this.open = false
const deletionConfirmed = await this.askDeleteConfirmation()

if (!deletionConfirmed) {
console.debug('Deletion aborted', this.share.id)
return
}

try {
this.loading = true
this.open = false
Expand Down
19 changes: 19 additions & 0 deletions config/config.sample.php
Original file line number Diff line number Diff line change
Expand Up @@ -2828,4 +2828,23 @@
* Defaults to `\OC::$SERVERROOT . '/resources/config/ca-bundle.crt'`.
*/
'default_certificates_bundle_path' => \OC::$SERVERROOT . '/resources/config/ca-bundle.crt',

/**
* Request path without /index.php/ maps to a controller path in the form
* <app name>.<controller name>.<handler>.
*
* - For a FooController.php the controller name is "foo" (lowercase)
* - A handler would be a method in FooController that was annotated with
* - either #[FrontpageRoute] attribute
* - or configured in routes.php
*
* Defaults to ``[]`` (no redirects)
*/
'redirects' => [
/**
* Example:
* '^\/settings' => 'acmesettings.page.index'
*/
],

];
Loading
Loading