Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
c9aba16
IONOS(theme): add theme & header as submodule
bromiesTM Jul 24, 2024
0bfd8f0
IONOS(ci/build): switch to checkout v4
bromiesTM Jul 24, 2024
ff965a1
IONOS(ci/build): adds build step for ionos theme elements
bromiesTM Jul 24, 2024
f42d13d
IONOS(ci): build via makefile
bromiesTM Aug 1, 2024
450c25a
IONOS(config): switch submodule (viewer) to ionos nc-viewer
printminion-co Aug 26, 2024
4033e64
IONOS(ci/build): adds build step to build custom viewer app
printminion-co Sep 3, 2024
7421161
IONOS(theming): add nc-theming as submodule
printminion-co Sep 16, 2024
294ee6c
IONOS(ci-build): build easycloud on apps-custom changes
printminion-co Sep 19, 2024
fd851e7
IONOS(nc-vue-icons): add nc-vue-material-design-icons as submodule
printminion-co Sep 10, 2024
43f258d
IONOS(nc-vue-icons): adjust folder-{open}-icon size
printminion-co Sep 10, 2024
11de13a
IONOS(nc-vue-icons): add vue icons build step to github workflow
printminion-co Sep 10, 2024
ec91413
IONOS(ci-build): build easycloud for ionos-dev30 branch
printminion-co Oct 2, 2024
8863fe2
IONOS(chore): add license headers
printminion-co Oct 2, 2024
d159d3f
IONOS(ci): build custom css during build process
bromiesTM Sep 27, 2024
3f6faf9
IONOS(search): reduce search providers via core config unified_search…
printminion-co Sep 9, 2024
a1a8db4
IONOS(search): set person search to be disableable
printminion-co Sep 11, 2024
d05d442
IONOS(search): disable person search component
printminion-co Oct 22, 2024
0f36796
IONOS(ci): build themes on pull_request
printminion-co Nov 11, 2024
c504482
IONOS(nc-mdi-svg): add nc-MaterialDesign-SVG as submodule
fracado Nov 5, 2024
b24b1cc
IONOS(nc-mdi-svg): use custom nc-MaterialDesign-SVG dist
printminion-co Nov 12, 2024
588789f
IONOS(nc-mdi-js): add nc-MaterialDesign-JS as submodule
printminion-co Nov 11, 2024
871062f
IONOS(build): switch to custom mdi icons
printminion-co Nov 11, 2024
03ed1da
IONOS(nc-nextcloud-vue): add nc-nextcloud-vue as submodule
fracado Nov 22, 2024
413d222
IONOS(build): switch to custom nextcloud vue
fracado Nov 22, 2024
80c7ce5
IONOS(build): remove original "@mdi/js", "@mdi/svg", vue-material-des…
tanyaka Dec 3, 2024
ce98577
IONOS(ci): rename easycloud-build.yml to hidrive-next-build.yml
printminion-co Nov 22, 2024
b54946d
IONOS(ci): use HiDrive Next in hidrive-next-build.yml
printminion-co Nov 22, 2024
8015c23
IONOS(ci): split action to build and push to ghcr.io
printminion-co Nov 26, 2024
1598a96
IONOS(feat): add ionos_processes custom app
thlehmann-ionos Oct 18, 2024
debc1df
IONOS(ci): use self-hosted runner
printminion-co Nov 20, 2024
070105d
IONOS(serverinfo): add external app
printminion-co Jan 10, 2025
7c1880d
IONOS(chore): Remap icons for external-share to custom svg icons (leg…
tanyaka Jan 14, 2025
1d84600
IONOS(build): always build artifact on IONOS submodule change
printminion-co Jan 29, 2025
e579e60
IONOS(groupquota): add external app v0.2.1
printminion-co Feb 4, 2025
ec475d2
IONOS(build): always build artifact on apps-external submodule change
printminion-co Feb 4, 2025
9828d1a
IONOS(login-flow-v2): reject unknown api clients by user agent
printminion-co Jan 30, 2025
99eb25b
IONOS(build): rename hidrive_next_build_zip to hidrive_next_build_art…
printminion-co Feb 13, 2025
3d159ba
IONOS(build): save build artifacts only for 30 days
printminion-co Feb 13, 2025
cbd80d1
IONOS(build): remove unused permissions
printminion-co Feb 18, 2025
61f16b1
IONOS(build): remove build on non-hidrivenext branches
printminion-co Feb 13, 2025
6aa7a4d
IONOS(build): upload dev artifact to artifactory on PR push
printminion-co Feb 12, 2025
b1225db
IONOS(build): upload dev artifact to artifactory on ionos-stable push
printminion-co Feb 17, 2025
d459b78
IONOS(build): do not build on unknown ncVersion
printminion-co Feb 18, 2025
cbddfa2
IONOS(build): fix stable artifactory push
printminion-co Feb 19, 2025
75de1b5
IONOS(build): trigger remote build pipeline
printminion-co Feb 13, 2025
912a6c8
IONOS(richdocuments): Add the richdocuments as app-external
lara-fernandezcueto Feb 26, 2025
26122c6
IONOS(build): run hidrive-next-build on ./lib/** changes
printminion-co Mar 4, 2025
56f7b6e
IONOS(build): add richdocuments build job
printminion-co Mar 5, 2025
ab0cd8d
IONOS(feat): block unknown user agents
bromiesTM Mar 13, 2025
adea84d
IONOS(config): change submodule repo (nc-ionos-processes)
printminion-co Mar 31, 2025
6b6b03e
IONOS(config): remove unused submodule (NextcloudExtract)
printminion-co Apr 2, 2025
7783697
IONOS(build): switch to ssh submodule urls
bromiesTM Apr 3, 2025
0cfe743
IONOS(fix): block unknown user agents
printminion-co Apr 17, 2025
1bf6f2e
IONOS(chore): add "image-viewer" icon mapping for external-share (leg…
tanyaka May 6, 2025
8fca645
IONOS(config): switch submodule (richdocuments) to ionos nc-richdocum…
fracado May 14, 2025
308343f
IONOS(files-sharing): show pending menu only if feature enabled
printminion-co May 22, 2025
3ff8440
IONOS(config): add files_downloadlimit submodule and update .gitignore
printminion-co Jun 18, 2025
5e68e0a
IONOS(ci): Update hidrive-next-build.yml to use ubuntu-latest runner
printminion-co Jul 22, 2025
b13c264
IONOS(sbom-matrix): add SBOM generation workflow
printminion-co Jul 17, 2025
946f373
IONOS(fix): trigger GitLab image pipeline on main branch
printminion-co Apr 1, 2026
4ec1583
IONOS(ci): pass SOURCE_BUILD_URL to GitLab trigger
printminion-co Apr 1, 2026
dd9a7cb
IONOS(ci): add retry logic to GitLab trigger (3 attempts, exponential…
printminion-co Apr 1, 2026
ed9963d
IONOS(ci): add prerequisites check step to GitLab trigger job
printminion-co Apr 1, 2026
3192322
IONOS(ci): add DISABLE_REMOTE_TRIGGER guard and explicit job conditions
printminion-co Apr 1, 2026
51c4b91
IONOS(build): inject build number as 5th version component
printminion-co Apr 7, 2026
0a750ff
IONOS: apply latest submodule pointers from ionos-dev
Arsalanulhaq Apr 22, 2026
84ae0ab
IONOS: feat(base): add "redirect" config
thlehmann-ionos Jul 5, 2024
2b1464d
IONOS: config/redirects.config.php: add redirect /settings =>
thlehmann-ionos Jul 5, 2024
7623b87
IONOS: feat(files_sharing): confirm share deletion
printminion-co Aug 2, 2024
4f89f9b
IONOS: feat(files): add SidebarQuota component
fracado Sep 16, 2024
fe9ac56
IONOS: feat(files): replace NavigationQuota with SidebarQuota
fracado Sep 16, 2024
593cc75
IONOS: fix(sidebar): correct aria-label for storage information
printminion-co Jul 3, 2025
fc9d3d2
IONOS: fix(sidebar): replace margin-left with margin-inline-start for…
printminion-co Jul 3, 2025
8fa8d55
IONOS: fix(sidebar): update deep selector syntax for better compatibi…
printminion-co Jul 3, 2025
dc8c568
test(SearchComposerTest): add unit tests for SearchComposer
printminion-co Jul 29, 2025
99d64ec
test(SearchComposerTest): add test for handling unknown search provider
printminion-co Jul 29, 2025
2794425
test(SearchComposerTest): add unit test for getProviders with multipl…
printminion-co Jul 29, 2025
1eaa2ad
test(SearchComposerTest): add test for provider icon generation
printminion-co Jul 30, 2025
489daab
test(SearchComposerTest): add unit tests for getProviders with allowe…
printminion-co Jul 29, 2025
2e750ed
test(SearchComposerTest): add unit test for getProviders with mixed o…
printminion-co Jul 30, 2025
6ba89e6
fix(SidebarQuota): use 'core' app for translation keys
Arsalanulhaq Apr 22, 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
445 changes: 445 additions & 0 deletions .github/workflows/hidrive-next-build.yml

Large diffs are not rendered by default.

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

Large diffs are not rendered by default.

10 changes: 10 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 upsteamed!
!/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
48 changes: 48 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,51 @@
[submodule "3rdparty"]
path = 3rdparty
url = https://github.com/nextcloud/3rdparty.git
[submodule "IONOS"]
path = IONOS
url = git@github.com:IONOS-Productivity/easystorage-config.git
[submodule "apps-external/viewer"]
path = apps-external/viewer
url = git@github.com:IONOS-Productivity/nc-viewer.git
[submodule "apps-custom/simplesettings"]
path = apps-custom/simplesettings
url = git@github.com:IONOS-Productivity/nc-simplesettings.git
[submodule "apps-external/user_oidc"]
path = apps-external/user_oidc
url = git@github.com:nextcloud/user_oidc.git
[submodule "apps-custom/googleanalytics"]
path = apps-custom/googleanalytics
url = git@github.com:IONOS-Productivity/nc-googleanalytics.git
[submodule "themes/nc-ionos-theme"]
path = themes/nc-ionos-theme
url = git@github.com:IONOS-Productivity/nc-ionos-theme.git
[submodule "apps-custom/nc_theming"]
path = apps-custom/nc_theming
url = git@github.com:IONOS-Productivity/nc-theming.git
[submodule "custom-npms/nc-vue-material-design-icons"]
path = custom-npms/nc-vue-material-design-icons
url = git@github.com:IONOS-Productivity/nc-vue-material-design-icons.git
[submodule "custom-npms/nc-mdi-svg"]
path = custom-npms/nc-mdi-svg
url = git@github.com:IONOS-Productivity/nc-MaterialDesign-SVG.git
[submodule "custom-npms/nc-mdi-js"]
path = custom-npms/nc-mdi-js
url = git@github.com:IONOS-Productivity/nc-MaterialDesign-JS.git
[submodule "custom-npms/nc-nextcloud-vue"]
path = custom-npms/nc-nextcloud-vue
url = git@github.com:IONOS-Productivity/nc-nextcloud-vue.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/richdocuments"]
path = apps-external/richdocuments
url = git@github.com:IONOS-Productivity/nc-richdocuments.git
[submodule "apps-custom/nc-ionos-processes"]
path = apps-custom/nc-ionos-processes
url = git@github.com:IONOS-Productivity/nc-ionos-processes.git
[submodule "apps-external/files_downloadlimit"]
path = apps-external/files_downloadlimit
url = git@github.com:nextcloud/files_downloadlimit.git
1 change: 1 addition & 0 deletions IONOS
Submodule IONOS added at e881b3
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 213179
1 change: 1 addition & 0 deletions apps-custom/nc_theming
Submodule nc_theming added at e4b122
1 change: 1 addition & 0 deletions apps-custom/simplesettings
Submodule simplesettings added at ed207c
1 change: 1 addition & 0 deletions apps-external/files_downloadlimit
Submodule files_downloadlimit added at 045dbe
1 change: 1 addition & 0 deletions apps-external/groupquota
Submodule groupquota added at 4536f1
1 change: 1 addition & 0 deletions apps-external/richdocuments
Submodule richdocuments added at a0cc10
1 change: 1 addition & 0 deletions apps-external/serverinfo
Submodule serverinfo added at a3fd4a
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 c29e11
12 changes: 4 additions & 8 deletions apps/files/src/components/FilesListVirtual.vue
Original file line number Diff line number Diff line change
Expand Up @@ -723,15 +723,11 @@ export default defineComponent({
width: var(--icon-preview-size);
height: var(--icon-preview-size);
}

// Slightly increase the size of the folder icon
// Slightly decrease the size of the folder icon
&.folder-icon,
&.folder-open-icon {
margin: -3px;
svg {
width: calc(var(--icon-preview-size) + 6px);
height: calc(var(--icon-preview-size) + 6px);
}
&.folder-open-icon svg {
width: calc(var(--icon-preview-size) - 6px);
height: calc(var(--icon-preview-size) - 6px);
}
}

Expand Down
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,11 +77,11 @@ export default defineComponent({
FilesNavigationItem,
FilesNavigationSearch,

NavigationQuota,
NcAppNavigation,
NcAppNavigationItem,
NcAppNavigationList,
SettingsModal,
SidebarQuota,
},

setup() {
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 @@ -8,10 +8,12 @@
*/
namespace OCA\Files_Sharing\Listener;

use OC\InitialStateService;
use OCA\Files\Event\LoadAdditionalScriptsEvent;
use OCA\Files_Sharing\AppInfo\Application;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use OCP\IConfig;
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 = \OC::$server->get(InitialStateService::class);
$config = \OC::$server->get(IConfig::class);
$defaultAcceptSystemConfig = $config->getSystemValueBool('sharing.enable_share_accept');
$initialState->provideInitialState(Application::APP_ID, 'accept_default', $defaultAcceptSystemConfig);
}
}
13 changes: 13 additions & 0 deletions apps/files_sharing/src/files_views/shares.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,15 @@ export const deletedSharesViewId = 'deletedshares'
export const pendingSharesViewId = 'pendingshares'
export const fileRequestViewId = 'filerequest'

/**
* Checks if share accept approval required by nextcloud configuration.
*
* @returns {boolean} True if share accept approval is required, otherwise false.
*/
function isShareAcceptApprovalRequired(): boolean {
return loadState('files_sharing', 'accept_default', false)
}

export default () => {
const Navigation = getNavigation()
Navigation.register(new View({
Expand Down Expand Up @@ -137,6 +146,10 @@ export default () => {
getContents: () => getContents(false, false, false, true),
}))

if (!isShareAcceptApprovalRequired()) {
return
}

Navigation.register(new View({
id: pendingSharesViewId,
name: t('files_sharing', 'Pending shares'),
Expand Down
Loading
Loading