Skip to content

Commit 91f9e17

Browse files
authored
Merge pull request #4776 from nextcloud/enh/rich-workspace-switch
2 parents a41a212 + ce0efd6 commit 91f9e17

File tree

8 files changed

+54
-31
lines changed

8 files changed

+54
-31
lines changed

composer.lock

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cypress/e2e/conflict.spec.js

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ const variants = [
3232
variants.forEach(function({ fixture, mime }) {
3333
const fileName = fixture
3434
describe(`${mime} (${fileName})`, function() {
35-
const getWrapper = () => cy.get('.text-editor__wrapper.has-conflicts')
35+
const getWrapper = () => cy.get('.viewer__content .text-editor__wrapper.has-conflicts')
3636

3737
before(() => {
3838
initUserAndFiles(user, fileName)
@@ -56,13 +56,13 @@ variants.forEach(function({ fixture, mime }) {
5656
cy.openFile(fileName)
5757
cy.get('.text-editor .document-status .icon-error')
5858
getWrapper()
59-
.get('#read-only-editor')
59+
.find('#read-only-editor')
6060
.should('contain', 'Hello world')
6161
getWrapper()
62-
.get('.text-editor__main')
62+
.find('.text-editor__main')
6363
.should('contain', 'Hello world')
6464
getWrapper()
65-
.get('.text-editor__main')
65+
.find('.text-editor__main')
6666
.should('contain', 'cruel conflicting')
6767
})
6868

@@ -81,7 +81,6 @@ variants.forEach(function({ fixture, mime }) {
8181
cy.get('[data-cy="resolveThisVersion"]').click()
8282

8383
getWrapper()
84-
.get('#read-only-editor')
8584
.should('not.exist')
8685

8786
cy.get('[data-cy="resolveThisVersion"]')
@@ -105,12 +104,10 @@ variants.forEach(function({ fixture, mime }) {
105104
cy.get('#viewer').should('not.exist')
106105
cy.openFile(fileName)
107106

108-
getWrapper()
109-
.get('[data-cy="resolveServerVersion"]')
107+
cy.get('[data-cy="resolveServerVersion"]')
110108
.click()
111109

112110
getWrapper()
113-
.get('#read-only-editor')
114111
.should('not.exist')
115112
cy.get('[data-cy="resolveThisVersion"]')
116113
.should('not.exist')

lib/Listeners/FilesLoadAdditionalScriptsListener.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public function handle(Event $event): void {
4545
return;
4646
}
4747

48+
\OCP\Util::addInitScript('text', 'text-init');
4849
\OCP\Util::addScript('text', 'text-files');
4950

5051
$this->initialStateProvider->provideState();

src/files.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,10 @@
2121
*/
2222
import { linkTo } from '@nextcloud/router'
2323
import { loadState } from '@nextcloud/initial-state'
24-
import { registerFileListHeaders } from '@nextcloud/files'
2524
import Vue from 'vue'
2625

2726
import { logger } from './helpers/logger.js'
28-
import { registerFileActionFallback, FilesWorkspaceHeader } from './helpers/files.js'
27+
import { registerFileActionFallback } from './helpers/files.js'
2928
import FilesSettings from './views/FilesSettings.vue'
3029
import store from './store/index.js'
3130

@@ -56,9 +55,6 @@ document.addEventListener('DOMContentLoaded', () => {
5655
}
5756

5857
})
59-
if (workspaceAvailable) {
60-
registerFileListHeaders(FilesWorkspaceHeader)
61-
}
6258

6359
OCA.Text = {
6460
RichWorkspaceEnabled: workspaceEnabled,

src/helpers/files.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ export const FilesWorkspaceHeader = new Header({
187187

188188
render(el, folder, view) {
189189
addMenuRichWorkspace()
190+
const hasRichWorkspace = !!folder.attributes['rich-workspace-file']
190191

191192
import('vue').then((module) => {
192193
el.id = 'files-workspace-wrapper'
@@ -201,14 +202,19 @@ export const FilesWorkspaceHeader = new Header({
201202
vm = new View({
202203
propsData: {
203204
path: folder.path,
205+
hasRichWorkspace,
206+
content: folder.attributes['rich-workspace'],
204207
},
205208
store,
206209
}).$mount(el)
207210
})
208211
},
209212

210213
updated(folder, view) {
214+
const hasRichWorkspace = !!folder.attributes['rich-workspace-file']
211215
vm.path = folder.path
216+
vm.hasRichWorkspace = hasRichWorkspace
217+
vm.content = folder.attributes['rich-workspace']
212218
},
213219
})
214220

src/init.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { registerFileListHeaders, registerDavProperty } from '@nextcloud/files'
2+
import { loadState } from '@nextcloud/initial-state'
3+
import { FilesWorkspaceHeader } from './helpers/files.js'
4+
5+
const workspaceAvailable = loadState('text', 'workspace_available')
6+
7+
registerDavProperty('nc:rich-workspace', { nc: 'http://nextcloud.org/ns' })
8+
registerDavProperty('nc:rich-workspace-file', { nc: 'http://nextcloud.org/ns' })
9+
10+
if (workspaceAvailable) {
11+
registerFileListHeaders(FilesWorkspaceHeader)
12+
}

src/views/RichWorkspace.vue

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@
2222

2323
<template>
2424
<div v-if="enabled"
25-
v-show="file"
25+
v-show="hasRichWorkspace"
2626
id="rich-workspace"
27-
:class="{'focus': focus, 'dark': darkTheme, 'creatable': canCreate }">
28-
<SkeletonLoading v-if="!loaded || !ready" />
27+
:class="{'focus': focus, 'dark': darkTheme }">
28+
<RichTextReader v-if="!loaded || !ready" :content="content" class="rich-workspace--preview" />
2929
<Editor v-if="file"
3030
v-show="ready"
3131
:key="file.path"
@@ -48,19 +48,23 @@
4848
import axios from '@nextcloud/axios'
4949
import { generateOcsUrl } from '@nextcloud/router'
5050
import { subscribe, unsubscribe } from '@nextcloud/event-bus'
51-
import SkeletonLoading from '../components/SkeletonLoading.vue'
5251
import getEditorInstance from '../components/Editor.singleton.js'
52+
import RichTextReader from '../components/RichTextReader.vue'
5353
5454
const IS_PUBLIC = !!(document.getElementById('isPublic'))
5555
const WORKSPACE_URL = generateOcsUrl('apps/text' + (IS_PUBLIC ? '/public' : '') + '/workspace', 2)
5656
5757
export default {
5858
name: 'RichWorkspace',
5959
components: {
60-
SkeletonLoading,
60+
RichTextReader,
6161
Editor: getEditorInstance,
6262
},
6363
props: {
64+
content: {
65+
type: String,
66+
default: '',
67+
},
6468
path: {
6569
type: String,
6670
required: true,
@@ -69,6 +73,10 @@ export default {
6973
type: Boolean,
7074
default: true,
7175
},
76+
hasRichWorkspace: {
77+
type: Boolean,
78+
default: false,
79+
},
7280
},
7381
data() {
7482
return {
@@ -87,9 +95,6 @@ export default {
8795
shareToken() {
8896
return document.getElementById('sharingToken')?.value
8997
},
90-
canCreate() {
91-
return !!(this.folder && (this.folder.permissions & OC.PERMISSION_CREATE))
92-
},
9398
},
9499
watch: {
95100
path() {
@@ -134,9 +139,12 @@ export default {
134139
})
135140
},
136141
getFileInfo(autofocus) {
137-
this.loaded = false
138-
this.autofocus = false
142+
if (!this.hasRichWorkspace) {
143+
return
144+
}
139145
this.ready = false
146+
this.loaded = true
147+
this.autofocus = false
140148
const params = { path: this.path }
141149
if (IS_PUBLIC) {
142150
params.shareToken = this.shareToken
@@ -209,9 +217,11 @@ export default {
209217
transition: max-height 0.5s cubic-bezier(0, 1, 0, 1);
210218
z-index: 61;
211219
position: relative;
212-
&.creatable {
213-
min-height: 100px;
214-
}
220+
min-height: 30vh;
221+
}
222+
223+
.rich-workspace--preview {
224+
margin-top: 44px;
215225
}
216226
217227
/* For subfolders, where there are no Recommendations */

webpack.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ webpackConfig.entry = {
88
public: path.join(__dirname, 'src', 'public.js'),
99
viewer: path.join(__dirname, 'src', 'viewer.js'),
1010
editors: path.join(__dirname, 'src', 'editor.js'),
11+
init: path.join(__dirname, 'src', 'init.js'),
1112
}
1213

1314
webpackConfig.output.chunkFilename = '[id].js?v=[contenthash]'

0 commit comments

Comments
 (0)