\ No newline at end of file
diff --git a/js/templates/notes.handlebars b/js/templates/notes.handlebars
index a05d93e..1de82bf 100644
--- a/js/templates/notes.handlebars
+++ b/js/templates/notes.handlebars
@@ -2,18 +2,7 @@
diff --git a/js/templates/settings.handlebars b/js/templates/settings.handlebars
new file mode 100644
index 0000000..fcb44c2
--- /dev/null
+++ b/js/templates/settings.handlebars
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/js/templates/shares.handlebars b/js/templates/shares.handlebars
new file mode 100644
index 0000000..77c5a7d
--- /dev/null
+++ b/js/templates/shares.handlebars
@@ -0,0 +1,5 @@
+
+ {{#each shared_with}}
+
{{{ shared_user }}}
+ {{/each}}
+
\ No newline at end of file
diff --git a/lib/Controller/NoteController.php b/lib/Controller/NoteController.php
index 4be01ca..623e96a 100644
--- a/lib/Controller/NoteController.php
+++ b/lib/Controller/NoteController.php
@@ -91,7 +91,7 @@ class NoteController extends Controller {
* @param string $content
* @param string $color
*/
- public function create($title, $content, $color = "#F7EB96") {
+ public function create($title, $content, $color = NULL) {
$note = $this->noteService->create($this->userId, $title, $content, $color);
$etag = md5(json_encode($note));
@@ -111,10 +111,11 @@ class NoteController extends Controller {
* @param array $attachts
* @param bool $pinned
* @param array $tags
+ * @param array $shares
* @param string $color
*/
- public function update(int $id, string $title, string $content, array $attachts, bool $pinned, array $tags, string $color = "#F7EB96"): JSONResponse {
- $note = $this->noteService->update($this->userId, $id, $title, $content, $attachts, $pinned, $tags, $color);
+ public function update(int $id, string $title, string $content, array $attachts, bool $pinned, array $tags, array $shares, string $color = "#F7EB96"): JSONResponse {
+ $note = $this->noteService->update($this->userId, $id, $title, $content, $attachts, $pinned, $tags, $shares, $color);
if (is_null($note)) {
return new JSONResponse([], Http::STATUS_NOT_FOUND);
}
diff --git a/lib/Controller/SettingsController.php b/lib/Controller/SettingsController.php
new file mode 100644
index 0000000..6cff97a
--- /dev/null
+++ b/lib/Controller/SettingsController.php
@@ -0,0 +1,112 @@
+
+ *
+ * @author Matias De lellis
+ *
+ * @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 .
+ *
+ */
+
+namespace OCA\QuickNotes\Controller;
+
+use OCP\AppFramework\Controller;
+use OCP\AppFramework\Http\JSONResponse;
+use OCP\IRequest;
+
+use OCA\QuickNotes\Service\SettingsService;
+
+
+class SettingsController extends Controller {
+
+ /** @var SettingsService */
+ private $settingsService;
+
+ /** @var string */
+ private $userId;
+
+ const STATE_OK = 0;
+ const STATE_FALSE = 1;
+ const STATE_SUCCESS = 2;
+ const STATE_ERROR = 3;
+
+ public function __construct ($appName,
+ IRequest $request,
+ SettingsService $settingsService,
+ $userId)
+ {
+ parent::__construct($appName, $request);
+
+ $this->appName = $appName;
+ $this->settingsService = $settingsService;
+ $this->userId = $userId;
+ }
+
+ /**
+ * @NoAdminRequired
+ * @param $type
+ * @param $value
+ * @return JSONResponse
+ */
+ public function setUserValue($type, $value) {
+ $status = self::STATE_SUCCESS;
+
+ switch ($type) {
+ case SettingsService::COLOR_FOR_NEW_NOTES_KEY:
+ $this->settingsService->setColorForNewNotes($value);
+ break;
+ default:
+ $status = self::STATE_ERROR;
+ break;
+ }
+
+ // Response
+ $result = [
+ 'status' => $status,
+ 'value' => $value
+ ];
+
+ return new JSONResponse($result);
+ }
+
+ /**
+ * @NoAdminRequired
+ * @param $type
+ * @return JSONResponse
+ */
+ public function getUserValue($type) {
+ $status = self::STATE_OK;
+ $value ='nodata';
+
+ switch ($type) {
+ case SettingsService::COLOR_FOR_NEW_NOTES_KEY:
+ $value = $this->settingsService->getColorForNewNotes($this->userId);
+ break;
+ default:
+ $status = self::STATE_FALSE;
+ break;
+ }
+
+ $result = [
+ 'status' => $status,
+ 'value' => $value
+ ];
+
+ return new JSONResponse($result);
+ }
+
+}
diff --git a/lib/Controller/ShareController.php b/lib/Controller/ShareController.php
new file mode 100644
index 0000000..1d5b6fe
--- /dev/null
+++ b/lib/Controller/ShareController.php
@@ -0,0 +1,68 @@
+
+ *
+ * @author 2020 Matias De lellis
+ *
+ * @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 .
+ */
+
+namespace OCA\QuickNotes\Controller;
+
+use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\JSONResponse;
+use OCP\AppFramework\Controller;
+
+use OCP\IRequest;
+
+use OCA\QuickNotes\Db\NoteShare;
+use OCA\QuickNotes\Db\NoteShareMapper;
+
+
+class ShareController extends Controller {
+
+ private $noteShareMapper;
+ private $userId;
+
+ public function __construct($AppName,
+ IRequest $request,
+ NoteShareMapper $noteShareMapper,
+ $userId)
+ {
+ parent::__construct($AppName, $request);
+
+ $this->noteShareMapper = $noteShareMapper;
+ $this->userId = $userId;
+ }
+
+ /**
+ * @NoAdminRequired
+ *
+ * @param int $noteId
+ */
+ public function destroy(int $noteId): JSONResponse {
+ try {
+ $noteShare = $this->noteShareMapper->findByNoteAndUser($noteId, $this->userId);
+ } catch (DoesNotExistException $e) {
+ return new JSONResponse([], Http::STATUS_NOT_FOUND);
+ }
+
+ $this->noteShareMapper->delete($noteShare);
+
+ return new JSONResponse([]);
+ }
+
+}
diff --git a/lib/Db/AttachMapper.php b/lib/Db/AttachMapper.php
index 9fa896a..158b085 100644
--- a/lib/Db/AttachMapper.php
+++ b/lib/Db/AttachMapper.php
@@ -73,8 +73,7 @@ class AttachMapper extends QBMapper {
* @param string $userId
* @param int $noteId
* @throws \OCP\AppFramework\Db\DoesNotExistException if not found
- * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException if more than one result
- * @return Note[]
+ * @return Attach[]
*/
public function findFromNote($userId, $noteId) {
$qb = $this->db->getQueryBuilder();
@@ -86,4 +85,5 @@ class AttachMapper extends QBMapper {
);
return $this->findEntities($qb);
}
+
}
diff --git a/lib/Db/Note.php b/lib/Db/Note.php
index c941ee8..15007da 100644
--- a/lib/Db/Note.php
+++ b/lib/Db/Note.php
@@ -13,7 +13,8 @@ class Note extends Entity implements JsonSerializable {
protected $timestamp;
protected $colorId;
protected $userId;
- protected $sharedWith;
+ protected $sharedWith = [];
+ protected $sharedBy = [];
protected $isShared;
protected $tags;
protected $attachts;
@@ -40,8 +41,9 @@ class Note extends Entity implements JsonSerializable {
'colorid' => $this->colorId,
'color' => $this->color,
'userid' => $this->userId,
- 'sharedwith' => $this->sharedWith,
- 'isshared' => $this->isShared,
+ 'shared_with' => $this->sharedWith,
+ 'shared_by' => $this->sharedBy,
+ 'is_shared' => $this->isShared,
'tags' => $this->tags,
'attachts' => $this->attachts
];
diff --git a/lib/Db/NoteMapper.php b/lib/Db/NoteMapper.php
index 5b7e287..c8ca2a0 100644
--- a/lib/Db/NoteMapper.php
+++ b/lib/Db/NoteMapper.php
@@ -31,6 +31,22 @@ class NoteMapper extends QBMapper {
return $this->findEntity($qb);
}
+ /**
+ * @param int $id
+ * @throws \OCP\AppFramework\Db\DoesNotExistException if not found
+ * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException if more than one result
+ * @return Note
+ */
+ public function findShared($id) {
+ $qb = $this->db->getQueryBuilder();
+ $qb->select('*')
+ ->from($this->tableName)
+ ->where(
+ $qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT))
+ );
+ return $this->findEntity($qb);
+ }
+
public function findAll($userId) {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
diff --git a/lib/Db/NoteShare.php b/lib/Db/NoteShare.php
index bf32689..f522a1c 100644
--- a/lib/Db/NoteShare.php
+++ b/lib/Db/NoteShare.php
@@ -8,15 +8,18 @@ use OCP\AppFramework\Db\Entity;
class NoteShare extends Entity implements JsonSerializable {
protected $noteId;
+ protected $userId;
protected $sharedUser;
protected $sharedGroup;
public function jsonSerialize() {
return [
'id' => $this->id,
- 'noteid' => $this->noteId,
- 'shareduser' => $this->sharedUser,
- 'sharedgroup' => $this->sharedGroup
+ 'user_id' => $this->userId,
+ 'note_id' => $this->noteId,
+ 'shared_user' => $this->sharedUser,
+ 'shared_group' => $this->sharedGroup
];
}
+
}
diff --git a/lib/Db/NoteShareMapper.php b/lib/Db/NoteShareMapper.php
index f9d9d6b..50fcc67 100644
--- a/lib/Db/NoteShareMapper.php
+++ b/lib/Db/NoteShareMapper.php
@@ -45,4 +45,14 @@ class NoteShareMapper extends Mapper {
$sql = 'DELETE FROM *PREFIX*quicknotes_shares WHERE note_id = ?';
$this->execute($sql, [$noteId]);
}
+
+ public function existsByNoteAndUser($noteId, $userId) {
+ $sql = 'SELECT * FROM *PREFIX*quicknotes_shares WHERE shared_user = ? AND note_id = ?';
+ try {
+ return $this->findEntities($sql, [$userId, $noteId]);
+ } catch (DoesNotExistException $e) {
+ return false;
+ }
+ return true;
+ }
}
diff --git a/lib/Service/FileService.php b/lib/Service/FileService.php
index c2dbc06..6123392 100644
--- a/lib/Service/FileService.php
+++ b/lib/Service/FileService.php
@@ -57,13 +57,16 @@ class FileService {
* @param int $fileId file id to show
* @param int $sideSize side lenght to show
*/
- public function getPreviewUrl(int $fileId, int $sideSize): string {
+ public function getPreviewUrl(int $fileId, int $sideSize): ?string {
$userFolder = $this->rootFolder->getUserFolder($this->userId);
- $node = current($userFolder->getById($fileId));
- $path = $userFolder->getRelativePath($node->getPath());
+ $file = current($userFolder->getById($fileId));
+
+ if (!($file instanceof File)) {
+ return null;
+ }
return $this->urlGenerator->linkToRouteAbsolute('core.Preview.getPreview', [
- 'file' => $path,
+ 'file' => $userFolder->getRelativePath($file->getPath()),
'x' => $sideSize,
'y' => $sideSize
]);
@@ -78,7 +81,7 @@ class FileService {
$userFolder = $this->rootFolder->getUserFolder($this->userId);
$file = current($userFolder->getById($fileId));
- if(!($file instanceof File)) {
+ if (!($file instanceof File)) {
return null;
}
diff --git a/lib/Service/NoteService.php b/lib/Service/NoteService.php
index 9110d85..99c7b9b 100644
--- a/lib/Service/NoteService.php
+++ b/lib/Service/NoteService.php
@@ -48,26 +48,29 @@ class NoteService {
private $notemapper;
private $notetagmapper;
private $colormapper;
- private $notesharemapper;
+ private $noteShareMapper;
private $attachMapper;
private $tagmapper;
private $fileService;
+ private $settingsService;
public function __construct(NoteMapper $notemapper,
NoteTagMapper $notetagmapper,
- NoteShareMapper $notesharemapper,
+ NoteShareMapper $noteShareMapper,
ColorMapper $colormapper,
AttachMapper $attachMapper,
TagMapper $tagmapper,
- FileService $fileService)
+ FileService $fileService,
+ SettingsService $settingsService)
{
$this->notemapper = $notemapper;
$this->notetagmapper = $notetagmapper;
$this->colormapper = $colormapper;
- $this->notesharemapper = $notesharemapper;
+ $this->noteShareMapper = $noteShareMapper;
$this->attachMapper = $attachMapper;
$this->tagmapper = $tagmapper;
$this->fileService = $fileService;
+ $this->settingsService = $settingsService;
}
/**
@@ -75,57 +78,62 @@ class NoteService {
*/
public function getAll(string $userId): array {
$notes = $this->notemapper->findAll($userId);
+
+ // Set shares with others.
foreach($notes as $note) {
$note->setIsShared(false);
- $sharedWith = $this->notesharemapper->getSharesForNote($note->getId());
- if(count($sharedWith) > 0) {
- $shareList = array();
- foreach($sharedWith as $share) {
- $shareList[] = $share->getSharedUser();
- }
- $note->setSharedWith(implode(", ", $shareList));
- } else {
- $note->setSharedWith(null);
- }
- $note->setTags($this->tagmapper->getTagsForNote($userId, $note->getId()));
+ $note->setSharedWith($this->noteShareMapper->getSharesForNote($note->getId()));
}
- $shareEntries = $this->notesharemapper->findForUser($userId);
- $shares = array();
- foreach($shareEntries as $entry) {
- try {
- //find is only to check if current user is owner
- $this->notemapper->find($entry->getNoteId(), $userId);
- //user is owner, nothing to do
- } catch(\OCP\AppFramework\Db\DoesNotExistException $e) {
- $share = $this->notemapper->findById($entry->getNoteId());
- $share->setIsShared(true);
- $shares[] = $share;
- }
+
+ // Get shares from others.
+ $shares = [];
+ $sharedEntries = $this->noteShareMapper->findForUser($userId);
+ foreach($sharedEntries as $sharedEntry) {
+ $sharedNote = $this->notemapper->findShared($sharedEntry->getNoteId());
+ $sharedNote->setIsShared(true);
+
+ $sharedEntry->setUserId($sharedNote->getUserId());
+ $sharedNote->setSharedBy([$sharedEntry]);
+ $shares[] = $sharedNote;
}
+
+ // Attahch shared notes from others to same response
$notes = array_merge($notes, $shares);
- foreach ($notes as $note) {
- $note->setTitle(strip_tags($note->getTitle()));
+ // Set tags to response.
+ foreach($notes as $note) {
+ $note->setTags($this->tagmapper->getTagsForNote($userId, $note->getId()));
}
- // Insert true color to response
+ // Insert color to response
foreach ($notes as $note) {
$note->setColor($this->colormapper->find($note->getColorId())->getColor());
}
- // Insert true color to response
+ // Insert pin to response
foreach ($notes as $note) {
$note->setIsPinned($note->getPinned() ? true : false);
}
- // Insert true attachts to response
+ // Insert attachts to response.
foreach ($notes as $note) {
- $attachts = $this->attachMapper->findFromNote($userId, $note->getId());
+ $rAttachts = [];
+ $attachts = $this->attachMapper->findFromNote($note->getUserId(), $note->getId());
foreach ($attachts as $attach) {
- $attach->setPreviewUrl($this->fileService->getPreviewUrl($attach->getFileId(), 512));
- $attach->setRedirectUrl($this->fileService->getRedirectToFileUrl($attach->getFileId()));
+ $previewUrl = $this->fileService->getPreviewUrl($attach->getFileId(), 512);
+ if (is_null($previewUrl))
+ continue;
+
+ $redirectUrl = $this->fileService->getRedirectToFileUrl($attach->getFileId());
+ if (is_null($redirectUrl))
+ continue;
+
+ $attach->setPreviewUrl($previewUrl);
+ $attach->setRedirectUrl($redirectUrl);
+
+ $rAttachts[] = $attach;
}
- $note->setAttachts($attachts);
+ $note->setAttachts($rAttachts);
}
return $notes;
@@ -149,7 +157,11 @@ class NoteService {
* @param string $content
* @param string $color
*/
- public function create(string $userId, string $title, string $content, string $color = "#F7EB96"): Note {
+ public function create(string $userId, string $title, string $content, string $color = NULL): Note {
+ if (is_null($color)) {
+ $color = $this->settingsService->getColorForNewNotes();
+ }
+
// Get color or append it
if ($this->colormapper->colorExists($color)) {
$hcolor = $this->colormapper->findByColor($color);
@@ -187,6 +199,7 @@ class NoteService {
* @param array $attachts
* @param bool $pinned
* @param array $tags
+ * @param array $shares
* @param string $color
*/
public function update(string $userId,
@@ -196,14 +209,14 @@ class NoteService {
array $attachts,
bool $pinned,
array $tags,
- string $color): Note
+ array $shares,
+ string $color): ?Note
{
// Get current Note and Color.
- try {
- $note = $this->notemapper->find($id, $userId);
- } catch(Exception $e) {
+ $note = $this->get($userId, $id);
+ if (is_null($note))
return null;
- }
+
$oldcolorid = $note->getColorId();
// Get new Color or append it.
@@ -242,6 +255,31 @@ class NoteService {
}
}
+ // Delete old shares
+ $dbShares = $this->noteShareMapper->getSharesForNote($id);
+ foreach ($dbShares as $dbShare) {
+ $delete = true;
+ foreach ($shares as $share) {
+ if ($dbShare->getSharedUser() === $share['name']) {
+ $delete = false;
+ break;
+ }
+ }
+ if ($delete) {
+ $this->noteShareMapper->delete($dbShare);
+ }
+ }
+
+ // Add new shares
+ foreach ($shares as $share) {
+ if (!$this->noteShareMapper->existsByNoteAndUser($id, $share['name'])) {
+ $hShare = new NoteShare();
+ $hShare->setNoteId($id);
+ $hShare->setSharedUser($share['name']);
+ $this->noteShareMapper->insert($hShare);
+ }
+ }
+
// Delete old tag relations
$dbTags = $this->tagmapper->getTagsForNote($userId, $id);
foreach ($dbTags as $dbTag) {
@@ -304,6 +342,10 @@ class NoteService {
}
$newnote->setAttachts($attachts);
+ // Fill shared with with others
+ $newnote->setIsShared(false);
+ $newnote->setSharedWith($this->noteShareMapper->getSharesForNote($newnote->getId()));
+
// Remove old color if necessary
if (($oldcolorid !== $hcolor->getId()) &&
(!$this->notemapper->colorIdCount($oldcolorid))) {
@@ -330,7 +372,7 @@ class NoteService {
}
$oldcolorid = $note->getColorId();
- $this->notesharemapper->deleteByNoteId($note->getId());
+ $this->noteShareMapper->deleteByNoteId($note->getId());
// Delete note.
$this->notemapper->delete($note);
@@ -381,7 +423,7 @@ class NoteService {
}
$pos_users = array();
$pos_groups = array();
- $shares = $this->notesharemapper->getSharesForNote($noteId);
+ $shares = $this->noteShareMapper->getSharesForNote($noteId);
foreach($shares as $s) {
$shareType = $s->getSharedUser();
if(strlen($shareType) !== 0) {
@@ -406,14 +448,14 @@ class NoteService {
$share = new NoteShare();
$share->setSharedGroup($groupId);
$share->setNoteId($noteId);
- $this->notesharemapper->insert($share);
+ $this->noteShareMapper->insert($share);
}
/**
*/
public function removeGroupShare($groupId, $noteId) {
- $share = $this->notesharemapper->findByNoteAndGroup($noteId, $groupId);
- $this->notesharemapper->delete($share);
+ $share = $this->noteShareMapper->findByNoteAndGroup($noteId, $groupId);
+ $this->noteShareMapper->delete($share);
}
/**
@@ -422,13 +464,13 @@ class NoteService {
$share = new NoteShare();
$share->setSharedUser($userId);
$share->setNoteId($noteId);
- $this->notesharemapper->insert($share);
+ $this->noteShareMapper->insert($share);
}
/**
*/
public function removeUserShare($userId, $noteId) {
- $share = $this->notesharemapper->findByNoteAndUser($noteId, $userId);
- $this->notesharemapper->delete($share);
+ $share = $this->noteShareMapper->findByNoteAndUser($noteId, $userId);
+ $this->noteShareMapper->delete($share);
}
}
diff --git a/lib/Service/SettingsService.php b/lib/Service/SettingsService.php
new file mode 100644
index 0000000..97ff5bc
--- /dev/null
+++ b/lib/Service/SettingsService.php
@@ -0,0 +1,65 @@
+
+ *
+ * @author Matias De lellis
+ *
+ * @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 .
+ *
+ */
+
+namespace OCA\QuickNotes\Service;
+
+use OCA\QuickNotes\AppInfo\Application;
+
+use OCP\IConfig;
+
+class SettingsService {
+
+ /**
+ * Settings keys and default values.
+ */
+ const COLOR_FOR_NEW_NOTES_KEY = 'default_color';
+ const DEFAULT_COLOR_FOR_NEW_NOTES = '#F7EB96';
+
+ /** @var IConfig Config */
+ private $config;
+
+ /** @var string|null */
+ private $userId;
+
+ /**
+ * @param IConfig $config
+ * @param string $userId
+ */
+ public function __construct(IConfig $config,
+ $userId)
+ {
+ $this->config = $config;
+ $this->userId = $userId;
+ }
+
+
+ public function getColorForNewNotes(): string {
+ return $this->config->getUserValue($this->userId, Application::APP_NAME, self::COLOR_FOR_NEW_NOTES_KEY, self::DEFAULT_COLOR_FOR_NEW_NOTES);
+ }
+
+ public function setColorForNewNotes(string $color) {
+ $this->config->setUserValue($this->userId, Application::APP_NAME, self::COLOR_FOR_NEW_NOTES_KEY, $color);
+ }
+
+}
diff --git a/templates/fake.php b/templates/fake.php
index 5857412..73b15c4 100644
--- a/templates/fake.php
+++ b/templates/fake.php
@@ -4,3 +4,9 @@
*/
p($l->t('Delete attachment'));
p($l->t('Attach file'));
+p($l->t('Shared'));
+p($l->t('Shared with others'));
+p($l->t('Shared with you'));
+p($l->t('Share note'));
+p($l->t('Close'));
+p($l->t('Default color for new notes'));
\ No newline at end of file
diff --git a/templates/part.settings.php b/templates/part.settings.php
index 7eebe65..594ef30 100644
--- a/templates/part.settings.php
+++ b/templates/part.settings.php
@@ -1,8 +1,8 @@