Skip to content

Commit

Permalink
Merge pull request #43108 from nextcloud/backport/43090/stable28
Browse files Browse the repository at this point in the history
[stable28] fix(files): combine navigation and files list into single Vue app
  • Loading branch information
susnux authored Feb 1, 2024
2 parents 5249783 + 8b92cf8 commit 8d1d8da
Show file tree
Hide file tree
Showing 10 changed files with 55 additions and 81 deletions.
7 changes: 0 additions & 7 deletions apps/files/lib/Controller/ViewController.php
Original file line number Diff line number Diff line change
Expand Up @@ -288,16 +288,9 @@ public function index($dir = '', $view = '', $fileid = null, $fileNotFound = fal
$this->initialState->provideInitialState('templates_path', $this->templateManager->hasTemplateDirectory() ? $this->templateManager->getTemplatePath() : false);
$this->initialState->provideInitialState('templates', $this->templateManager->listCreators());

$params = [
'fileNotFound' => $fileNotFound ? 1 : 0,
'id-app-content' => '#app-content-vue',
'id-app-navigation' => '#app-navigation-vue',
];

$response = new TemplateResponse(
Application::APP_ID,
'index',
$params
);
$policy = new ContentSecurityPolicy();
$policy->addAllowedFrameDomain('\'self\'');
Expand Down
25 changes: 25 additions & 0 deletions apps/files/src/FilesApp.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<template>
<NcContent app-name="files">
<Navigation />
<FilesList />
</NcContent>
</template>

<script lang="ts">
import { defineComponent } from 'vue'
import NcContent from '@nextcloud/vue/dist/Components/NcContent.js'
import Navigation from './views/Navigation.vue'
import FilesList from './views/FilesList.vue'
export default defineComponent({
name: 'FilesApp',
components: {
NcContent,
FilesList,
Navigation,
},
})
</script>
2 changes: 1 addition & 1 deletion apps/files/src/components/FileEntry/FileEntryActions.vue
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,7 @@ export default Vue.extend({
<style lang="scss">
// Allow right click to define the position of the menu
// only if defined
.app-content[style*="mouse-pos-x"] .v-popper__popper {
.content[style*="mouse-pos-x"] .v-popper__popper {
transform: translate3d(var(--mouse-pos-x), var(--mouse-pos-y), 0px) !important;
// If the menu is too close to the bottom, we move it up
Expand Down
24 changes: 4 additions & 20 deletions apps/files/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,11 @@ import { createPinia, PiniaVuePlugin } from 'pinia'
import { getNavigation } from '@nextcloud/files'
import { getRequestToken } from '@nextcloud/auth'

import FilesListView from './views/FilesList.vue'
import NavigationView from './views/Navigation.vue'
import router from './router/router'
import RouterService from './services/RouterService'
import SettingsModel from './models/Setting.js'
import SettingsService from './services/Settings.js'
import FilesApp from './FilesApp.vue'

// @ts-expect-error __webpack_nonce__ is injected by webpack
__webpack_nonce__ = btoa(getRequestToken())
Expand Down Expand Up @@ -43,23 +42,8 @@ const Settings = new SettingsService()
Object.assign(window.OCA.Files, { Settings })
Object.assign(window.OCA.Files.Settings, { Setting: SettingsModel })

// Init Navigation View
const View = Vue.extend(NavigationView)
const FilesNavigationRoot = new View({
name: 'FilesNavigationRoot',
propsData: {
Navigation,
},
const FilesAppVue = Vue.extend(FilesApp)
new FilesAppVue({
router,
pinia,
})
FilesNavigationRoot.$mount('#app-navigation-files')

// Init content list view
const ListView = Vue.extend(FilesListView)
const FilesList = new ListView({
name: 'FilesListRoot',
router,
pinia,
})
FilesList.$mount('#app-content-vue')
}).$mount('#content')
36 changes: 12 additions & 24 deletions apps/files/src/views/Navigation.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,15 @@ import router from '../router/router'
import { useViewConfigStore } from '../store/viewConfig'
import { Folder, View, getNavigation } from '@nextcloud/files'

import Vue from 'vue'

describe('Navigation renders', () => {
delete window._nc_navigation
const Navigation = getNavigation()

before(() => {
Vue.prototype.$navigation = Navigation

cy.mockInitialState('files', 'storageStats', {
used: 1000 * 1000 * 1000,
quota: -1,
Expand All @@ -22,9 +26,6 @@ describe('Navigation renders', () => {

it('renders', () => {
cy.mount(NavigationView, {
propsData: {
Navigation,
},
global: {
plugins: [createTestingPinia({
createSpy: cy.spy,
Expand All @@ -42,6 +43,10 @@ describe('Navigation API', () => {
delete window._nc_navigation
const Navigation = getNavigation()

before(() => {
Vue.prototype.$navigation = Navigation
})

it('Check API entries rendering', () => {
Navigation.register(new View({
id: 'files',
Expand All @@ -52,9 +57,6 @@ describe('Navigation API', () => {
}))

cy.mount(NavigationView, {
propsData: {
Navigation,
},
global: {
plugins: [createTestingPinia({
createSpy: cy.spy,
Expand All @@ -79,9 +81,6 @@ describe('Navigation API', () => {
}))

cy.mount(NavigationView, {
propsData: {
Navigation,
},
global: {
plugins: [createTestingPinia({
createSpy: cy.spy,
Expand All @@ -107,9 +106,6 @@ describe('Navigation API', () => {
}))

cy.mount(NavigationView, {
propsData: {
Navigation,
},
global: {
plugins: [createTestingPinia({
createSpy: cy.spy,
Expand Down Expand Up @@ -159,13 +155,14 @@ describe('Quota rendering', () => {
delete window._nc_navigation
const Navigation = getNavigation()

before(() => {
Vue.prototype.$navigation = Navigation
})

afterEach(() => cy.unmockInitialState())

it('Unknown quota', () => {
cy.mount(NavigationView, {
propsData: {
Navigation,
},
global: {
plugins: [createTestingPinia({
createSpy: cy.spy,
Expand All @@ -183,9 +180,6 @@ describe('Quota rendering', () => {
})

cy.mount(NavigationView, {
propsData: {
Navigation,
},
global: {
plugins: [createTestingPinia({
createSpy: cy.spy,
Expand All @@ -206,9 +200,6 @@ describe('Quota rendering', () => {
})

cy.mount(NavigationView, {
propsData: {
Navigation,
},
global: {
plugins: [createTestingPinia({
createSpy: cy.spy,
Expand All @@ -230,9 +221,6 @@ describe('Quota rendering', () => {
})

cy.mount(NavigationView, {
propsData: {
Navigation,
},
global: {
plugins: [createTestingPinia({
createSpy: cy.spy,
Expand Down
21 changes: 8 additions & 13 deletions apps/files/src/views/Navigation.vue
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@
</template>

<script lang="ts">
import { emit, subscribe } from '@nextcloud/event-bus'
import { emit } from '@nextcloud/event-bus'
import { translate } from '@nextcloud/l10n'
import Cog from 'vue-material-design-icons/Cog.vue'
import NcAppNavigation from '@nextcloud/vue/dist/Components/NcAppNavigation.js'
Expand All @@ -85,7 +85,7 @@ import NcIconSvgWrapper from '@nextcloud/vue/dist/Components/NcIconSvgWrapper.js
import { setPageHeading } from '../../../../core/src/OCP/accessibility.js'
import { useViewConfigStore } from '../store/viewConfig.ts'
import logger from '../logger.js'
import type { Navigation, View } from '@nextcloud/files'
import type { View } from '@nextcloud/files'
import NavigationQuota from '../components/NavigationQuota.vue'
import SettingsModal from './Settings.vue'
Expand All @@ -101,14 +101,6 @@ export default {
SettingsModal,
},
props: {
// eslint-disable-next-line vue/prop-name-casing
Navigation: {
type: Object as Navigation,
required: true,
},
},
setup() {
const viewConfigStore = useViewConfigStore()
return {
Expand All @@ -132,7 +124,7 @@ export default {
},
views(): View[] {
return this.Navigation.views
return this.$navigation.views
},
parentViews(): View[] {
Expand Down Expand Up @@ -164,7 +156,7 @@ export default {
watch: {
currentView(view, oldView) {
if (view.id !== oldView?.id) {
this.Navigation.setActive(view)
this.$navigation.setActive(view)
logger.debug('Navigation changed', { id: view.id, view })
this.showView(view)
Expand Down Expand Up @@ -193,14 +185,15 @@ export default {
showView(view: View) {
// Closing any opened sidebar
window?.OCA?.Files?.Sidebar?.close?.()
this.Navigation.setActive(view)
this.$navigation.setActive(view)
setPageHeading(view.name)
emit('files:navigation:changed', view)
},
/**
* Expand/collapse a a view with children and permanently
* save this setting in the server.
* @param view
*/
onToggleExpand(view: View) {
// Invert state
Expand All @@ -213,6 +206,7 @@ export default {
/**
* Check if a view is expanded by user config
* or fallback to the default value.
* @param view
*/
isExpanded(view: View): boolean {
return typeof this.viewConfigStore.getConfig(view.id)?.expanded === 'boolean'
Expand All @@ -222,6 +216,7 @@ export default {
/**
* Generate the route to a view
* @param view
*/
generateToNavigation(view: View) {
if (view.params) {
Expand Down
10 changes: 2 additions & 8 deletions apps/files/templates/index.php
Original file line number Diff line number Diff line change
@@ -1,9 +1,3 @@
<!-- File navigation -->
<div id="app-navigation-files" role="navigation"></div>
<?php

<!-- File list vue container -->
<div id="app-content-vue" class="hidden"></div>

<!-- config hints for javascript -->
<input type="hidden" name="filesApp" id="filesApp" value="1" />
<input type="hidden" name="fileNotFound" id="fileNotFound" value="<?php p($_['fileNotFound']); ?>" />
// Empty template
5 changes: 0 additions & 5 deletions apps/files/tests/Controller/ViewControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -184,11 +184,6 @@ public function testIndexWithRegularBrowser() {
$expected = new Http\TemplateResponse(
'files',
'index',
[
'fileNotFound' => 0,
'id-app-content' => '#app-content-vue',
'id-app-navigation' => '#app-navigation-vue',
]
);
$policy = new Http\ContentSecurityPolicy();
$policy->addAllowedWorkerSrcDomain('\'self\'');
Expand Down
4 changes: 2 additions & 2 deletions dist/files-main.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/files-main.js.map

Large diffs are not rendered by default.

0 comments on commit 8d1d8da

Please sign in to comment.