Skip to content

Commit

Permalink
Merge pull request #423 from nextcloud/bugfix/noid/richworkspace-polish
Browse files Browse the repository at this point in the history
Workspace polishing
  • Loading branch information
juliusknorr authored Nov 25, 2019
2 parents 95bf168 + da1ef87 commit 740b3e0
Show file tree
Hide file tree
Showing 6 changed files with 193 additions and 23 deletions.
10 changes: 9 additions & 1 deletion appinfo/info.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,14 @@
- **💾 Open format:** Files are saved as [Markdown](https://en.wikipedia.org/wiki/Markdown), so you can edit them from any other text app too.
- **✊ Strong foundation:** We use [🐈 tiptap](https://tiptap.scrumpy.io) which is based on [🦉 ProseMirror](https://prosemirror.net) – huge thanks to them!
]]></description>
<version>1.2.0</version>
<version>1.2.3</version>
<licence>agpl</licence>
<author mail="jus@bitgrid.net">Julius Härtl</author>
<namespace>Text</namespace>
<default_enable/>
<types>
<dav />
</types>
<category>office</category>
<website>https://github.com/nextcloud/text</website>
<bugs>https://github.com/nextcloud/text/issues</bugs>
Expand All @@ -29,4 +32,9 @@
<background-jobs>
<job>OCA\Text\Cron\Cleanup</job>
</background-jobs>
<sabre>
<plugins>
<plugin>OCA\Text\DAV\WorkspacePlugin</plugin>
</plugins>
</sabre>
</info>
29 changes: 10 additions & 19 deletions lib/Controller/WorkspaceController.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@

use OCA\Text\AppInfo\Application;
use OCA\Text\Service\SessionService;
use OCA\Text\Service\WorkspaceService;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
Expand All @@ -68,17 +69,18 @@ class WorkspaceController extends OCSController {
/** @var IManager */
private $shareManager;

private const SUPPORTED_FILENAMES = [
'README.md',
'Readme.md',
'readme.md'
];
/** @var WorkspaceService */
private $workspaceService;

/** @var string */
private $userId;

public function __construct($appName, IRequest $request, IRootFolder $rootFolder, IManager $shareManager, $userId) {

public function __construct($appName, IRequest $request, IRootFolder $rootFolder, IManager $shareManager, WorkspaceService $workspaceService, $userId) {
parent::__construct($appName, $request);
$this->rootFolder = $rootFolder;
$this->shareManager = $shareManager;
$this->workspaceService = $workspaceService;
$this->userId = $userId;
}

Expand All @@ -92,7 +94,7 @@ public function folder(string $path = '/'): DataResponse {
try {
$folder = $this->rootFolder->getUserFolder($this->userId)->get($path);
if ($folder instanceof Folder) {
$file = $this->getFile($folder);
$file = $this->workspaceService->getFile($folder);
if ($file === null) {
return new DataResponse(['message' => 'No workspace file found'], Http::STATUS_NOT_FOUND);
}
Expand Down Expand Up @@ -122,7 +124,7 @@ public function publicFolder(string $shareToken, string $path = '/'): DataRespon
$share = $this->shareManager->getShareByToken($shareToken);
$folder = $share->getNode()->get($path);
if ($folder instanceof Folder) {
$file = $this->getFile($folder);
$file = $this->workspaceService->getFile($folder);
if ($file === null) {
return new DataResponse(['message' => 'No workspace file found'], Http::STATUS_NOT_FOUND);
}
Expand All @@ -143,15 +145,4 @@ public function publicFolder(string $shareToken, string $path = '/'): DataRespon
}
}

private function getFile(Folder $folder) {
$file = null;
foreach (self::SUPPORTED_FILENAMES as $filename) {
if ($folder->nodeExists($filename)) {
$file = $folder->get($filename);
continue;
}
}
return $file;
}

}
97 changes: 97 additions & 0 deletions lib/DAV/WorkspacePlugin.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
<?php
declare(strict_types=1);
/**
* @copyright Copyright (c) 2019 Julius Härtl <jus@bitgrid.net>
*
* @author Julius Härtl <jus@bitgrid.net>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/

namespace OCA\Text\DAV;

use OC\Files\Node\File;
use OC\Files\Node\Folder;
use OCA\DAV\Connector\Sabre\Directory;
use OCA\DAV\Files\FilesHome;
use OCA\Text\Service\WorkspaceService;
use OCP\Files\IRootFolder;
use Sabre\DAV\INode;
use Sabre\DAV\PropFind;
use Sabre\DAV\Server;
use Sabre\DAV\ServerPlugin;

class WorkspacePlugin extends ServerPlugin {

public const WORKSPACE = '{http://nextcloud.org/ns}rich-workspace';

/** @var Server */
private $server;

/** @var WorkspaceService */
private $workspaceService;

/** @var IRootFolder */
private $rootFolder;

/** @var string|null */
private $userId;

public function __construct(WorkspaceService $workspaceService, IRootFolder $rootFolder, $userId) {
$this->workspaceService = $workspaceService;
$this->rootFolder = $rootFolder;
$this->userId = $userId;
}

/**
* This initializes the plugin.
*
* This function is called by Sabre\DAV\Server, after
* addPlugin is called.
*
* This method should set up the required event subscriptions.
*
* @param Server $server
* @return void
*/
function initialize(Server $server) {
$this->server = $server;

$this->server->on('propFind', [$this, 'propFind']);
}


public function propFind(PropFind $propFind, INode $node) {
if (!$node instanceof Directory && !$node instanceof FilesHome) {
return;
}

$propFind->handle(self::WORKSPACE, function () use ($node) {
/** @var Folder[] $nodes */
$nodes = $this->rootFolder->getUserFolder($this->userId)->getById($node->getId());
if (count($nodes) > 0) {
/** @var File $file */
$file = $this->workspaceService->getFile($nodes[0]);
if ($file instanceof File) {
return $file->getContent();
}
}
});

}

}
45 changes: 45 additions & 0 deletions lib/Service/WorkspaceService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php


namespace OCA\Text\Service;


use OCP\Files\Folder;
use OCP\Files\NotFoundException;
use OCP\IL10N;

class WorkspaceService {

private const SUPPORTED_STATIC_FILENAMES = [
'README.md',
'Readme.md',
'readme.md'
];

/** @var IL10N */
private $l10n;

public function __construct(IL10N $l10n) {
$this->l10n = $l10n;
}

public function getFile(Folder $folder) {
$file = null;
foreach ($this->getSupportedFilenames() as $filename) {
if ($folder->nodeExists($filename)) {
try {
$file = $folder->get($filename);
} catch (NotFoundException $e) {
}
continue;
}
}
return $file;
}

private function getSupportedFilenames() {
return array_merge([
$this->l10n->t('Readme') . '.md'
], self::SUPPORTED_STATIC_FILENAMES);
}
}
8 changes: 7 additions & 1 deletion src/components/EditorWrapper.vue
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
</SessionList>
</div>
</MenuBar>
<div class="editor__content">
<div>
<MenuBubble v-if="!readOnly && isRichEditor" :editor="tiptap" />
<EditorContent v-show="initialLoading"
class="editor__content"
Expand Down Expand Up @@ -316,6 +316,12 @@ export default {
enableRichEditing: this.isRichEditor,
languages,
})
this.tiptap.on('focus', () => {
this.$emit('focus')
})
this.tiptap.on('blur', () => {
this.$emit('blur')
})
this.syncService.state = this.tiptap.state
})
})
Expand Down
27 changes: 25 additions & 2 deletions src/views/RichWorkspace.vue
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
-->

<template>
<div id="rich-workspace" :class="{'icon-loading': !loaded || !ready }">
<div id="rich-workspace" :class="{'icon-loading': !loaded || !ready, 'focus': focus }">
<div v-if="!file || (autofocus && !ready)" class="empty-workspace" @click="createNew">
<p class="placeholder">
{{ t('text', 'Add notes, lists or links …') }}
Expand All @@ -38,7 +38,9 @@
:autohide="true"
:mime="file.mimetype"
:autofocus="autofocus"
@ready="ready=true" />
@ready="ready=true"
@focus="focus=true"
@blur="focus=false" />
</div>
</template>

Expand All @@ -62,6 +64,7 @@ export default {
},
data() {
return {
focus: false,
file: null,
loaded: false,
ready: false,
Expand Down Expand Up @@ -158,4 +161,24 @@ export default {
#rich-workspace::v-deep .editor__content {
margin: 0;
}

@media only screen and (max-width: 1024px) {
#rich-workspace:not(.focus) {
max-height: 30vh;
position: relative;
overflow: hidden;
}
#rich-workspace:not(.focus):not(.icon-loading):after {
content: '';
position: absolute;
z-index: 1;
bottom: 0;
left: 0;
pointer-events: none;
background-image: linear-gradient(to bottom, rgba(0,0,0, 0), var(--color-main-background));
width: 100%;
height: 4em;
}
}

</style>

0 comments on commit 740b3e0

Please sign in to comment.