diff --git a/lib/Api/V1Api.php b/lib/Api/V1Api.php index daaa6ff12..5c4e61698 100644 --- a/lib/Api/V1Api.php +++ b/lib/Api/V1Api.php @@ -3,12 +3,9 @@ namespace OCA\Tables\Api; use OCA\Tables\Errors\InternalError; -use OCA\Tables\Errors\NotFoundError; use OCA\Tables\Errors\PermissionError; use OCA\Tables\Service\ColumnService; use OCA\Tables\Service\RowService; -use OCP\AppFramework\Db\DoesNotExistException; -use OCP\AppFramework\Db\MultipleObjectsReturnedException; class V1Api { private RowService $rowService; diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 12af9ab48..3679992a9 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -8,11 +8,9 @@ use OCA\Tables\Listener\AnalyticsDatasourceListener; use OCA\Tables\Listener\TablesReferenceListener; use OCA\Tables\Listener\UserDeletedListener; -use OCA\Tables\Reference\LegacyReferenceProvider; -use OCA\Tables\Reference\RowReferenceProvider; use OCA\Tables\Reference\ContentReferenceProvider; +use OCA\Tables\Reference\LegacyReferenceProvider; use OCA\Tables\Reference\ReferenceProvider; -use OCA\Tables\Reference\ViewReferenceProvider; use OCA\Tables\Search\SearchTablesProvider; use OCP\AppFramework\App; use OCP\AppFramework\Bootstrap\IBootContext; diff --git a/lib/Controller/Api1Controller.php b/lib/Controller/Api1Controller.php index e49e2fc41..83535c345 100644 --- a/lib/Controller/Api1Controller.php +++ b/lib/Controller/Api1Controller.php @@ -510,7 +510,7 @@ public function createRowInView( ]; } - return $this->handleError(function () use ( $viewId, $dataNew) { + return $this->handleError(function () use ($viewId, $dataNew) { return $this->rowService->create(null, $viewId, $dataNew); }); } @@ -553,8 +553,8 @@ public function getRow(int $rowId): DataResponse { * @NoCSRFRequired */ public function updateRow(int $rowId, - ?int $viewId, - array $data): DataResponse { + ?int $viewId, + array $data): DataResponse { $dataNew = []; foreach ($data as $key => $value) { $dataNew[] = [ diff --git a/lib/Controller/SearchController.php b/lib/Controller/SearchController.php index 247a19f1a..4be328cad 100644 --- a/lib/Controller/SearchController.php +++ b/lib/Controller/SearchController.php @@ -3,7 +3,6 @@ namespace OCA\Tables\Controller; use OCA\Tables\AppInfo\Application; -use OCA\Tables\Service\ImportService; use OCA\Tables\Service\SearchService; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\DataResponse; diff --git a/lib/Db/ShareMapper.php b/lib/Db/ShareMapper.php index a5aa08ef9..b4c1267de 100644 --- a/lib/Db/ShareMapper.php +++ b/lib/Db/ShareMapper.php @@ -15,7 +15,7 @@ class ShareMapper extends QBMapper { protected string $table = 'tables_shares'; protected LoggerInterface $logger; - public function __construct( LoggerInterface $logger, IDBConnection $db) { + public function __construct(LoggerInterface $logger, IDBConnection $db) { parent::__construct($db, $this->table, Share::class); $this->logger = $logger; } diff --git a/lib/Reference/LegacyReferenceProvider.php b/lib/Reference/LegacyReferenceProvider.php index 5e4dfdb14..86088eba3 100644 --- a/lib/Reference/LegacyReferenceProvider.php +++ b/lib/Reference/LegacyReferenceProvider.php @@ -3,21 +3,18 @@ namespace OCA\Tables\Reference; use OC\Collaboration\Reference\ReferenceManager; -use OCA\Tables\AppInfo\Application; -use OCP\Collaboration\Reference\ADiscoverableReferenceProvider; use OCP\Collaboration\Reference\IReference; use OCP\Collaboration\Reference\IReferenceProvider; -use OCP\Collaboration\Reference\ISearchableReferenceProvider; use OCP\IL10N; use OCP\IURLGenerator; class LegacyReferenceProvider implements IReferenceProvider { - private TableReferenceHelper $referenceHelper; + private ReferenceHelper $referenceHelper; private ReferenceManager $referenceManager; private IURLGenerator $urlGenerator; private IL10N $l10n; - public function __construct(IL10N $l10n, IURLGenerator $urlGenerator, TableReferenceHelper $referenceHelper, ReferenceManager $referenceManager) { + public function __construct(IL10N $l10n, IURLGenerator $urlGenerator, ReferenceHelper $referenceHelper, ReferenceManager $referenceManager) { $this->referenceHelper = $referenceHelper; $this->referenceManager = $referenceManager; $this->urlGenerator = $urlGenerator; diff --git a/lib/Reference/ReferenceProvider.php b/lib/Reference/ReferenceProvider.php index f783204c3..fb0a647e4 100644 --- a/lib/Reference/ReferenceProvider.php +++ b/lib/Reference/ReferenceProvider.php @@ -6,7 +6,6 @@ use OCA\Tables\AppInfo\Application; use OCP\Collaboration\Reference\ADiscoverableReferenceProvider; use OCP\Collaboration\Reference\IReference; -use OCP\Collaboration\Reference\IReferenceProvider; use OCP\Collaboration\Reference\ISearchableReferenceProvider; use OCP\IL10N; use OCP\IURLGenerator; diff --git a/lib/Reference/stuff/RowReferenceHelper.php b/lib/Reference/stuff/RowReferenceHelper.php deleted file mode 100644 index 2b04fa240..000000000 --- a/lib/Reference/stuff/RowReferenceHelper.php +++ /dev/null @@ -1,132 +0,0 @@ -userId === null) { - return false; - } - $start = $this->urlGenerator->getAbsoluteURL('/apps/' . Application::APP_ID); - $startIndex = $this->urlGenerator->getAbsoluteURL('/index.php/apps/' . Application::APP_ID); - - // link example: - // https://nextcloud.local/apps/tables/#/table/3 - $noIndexMatch = preg_match('/^' . preg_quote($start, '/') . '\/#\/view\/\d+\/row\/\d+$/i', $referenceText) === 1; - $indexMatch = preg_match('/^' . preg_quote($startIndex, '/') . '\/#\/view\/\d+\/row\/\d+$/i', $referenceText) === 1; - - return $noIndexMatch || $indexMatch; - } - - /** @noinspection PhpUndefinedMethodInspection */ - /** @psalm-suppress InvalidReturnType */ - public function resolveReference(string $referenceText): ?IReference { - if ($this->matchReference($referenceText)) { - $viewId = $this->getTableIdFromLink($referenceText); - $rowId = $this->getRowIdFromLink($referenceText); - if ($viewId === null || $this->userId === null) { - // fallback to opengraph if it matches, but somehow we can't resolve - /** @psalm-suppress InvalidReturnStatement */ - return $this->linkReferenceProvider->resolveReference($referenceText); - } - try { - $view = $this->viewService->find($viewId, false, $this->userId); - } catch (Exception | Throwable $e) { - /** @psalm-suppress InvalidReturnStatement */ - return $this->linkReferenceProvider->resolveReference($referenceText); - } - - $reference = new Reference($referenceText); - $viewReferenceInfo = []; - - if ($view->getEmoji()) { - $reference->setDescription($view->getEmoji() . ' ' . $view->getTitle()); - $viewReferenceInfo['title'] = $view->getTitle(); - $viewReferenceInfo['emoji'] = $view->getEmoji(); - } else { - $reference->setTitle($view->getTitle()); - $viewReferenceInfo['title'] = $view->getTitle(); - } - - $reference->setDescription($view->getOwnerDisplayName() ?? $view->getOwnership()); - - $viewReferenceInfo['ownership'] = $view->getOwnership(); - $viewReferenceInfo['ownerDisplayName'] = $view->getOwnerDisplayName(); - $viewReferenceInfo['rowsCount'] = $view->getRowsCount(); - $viewReferenceInfo['columnIds'] = $view->getColumnsArray(); - - $imageUrl = $this->urlGenerator->getAbsoluteURL( - $this->urlGenerator->imagePath(Application::APP_ID, 'app-dark.svg') - ); - $reference->setImageUrl($imageUrl); - - $viewReferenceInfo['link'] = $referenceText; - $reference->setUrl($referenceText); - - - // add Columns - $viewReferenceInfo['columns'] = $this->columnService->findAllByView($viewId, $this->userId); - // add rows data - try { - $viewReferenceInfo['rows'] = [$this->rowService->find($rowId)]; - } catch (InternalError $e) { - } catch (PermissionError $e) { - } - - $reference->setRichObject( - $this::RICH_OBJECT_TYPE, - $viewReferenceInfo, - ); - return $reference; - } - - return null; - } - - /** - * @param string $url - * @return int|null - */ - private function getRowIdFromLink(string $url): ?int { - $start = $this->urlGenerator->getAbsoluteURL('/apps/' . Application::APP_ID); - $startIndex = $this->urlGenerator->getAbsoluteURL('/index.php/apps/' . Application::APP_ID); - - preg_match('/^' . preg_quote($start, '/') . '\/#\/view\/\d+\/row\/(\d+)(?:\/[^\/]+)*$/i', $url, $matches); - if (!$matches || count($matches) < 2) { - preg_match('/^' . preg_quote($startIndex, '/') . '\/#\/view\/\d+\/row\/(\d+)(?:\/[^\/]+)*$/i', $url, $matches); - } - if ($matches && count($matches) > 1) { - return (int) $matches[1]; - } - - return null; - } -} diff --git a/lib/Reference/stuff/RowReferenceProvider.php b/lib/Reference/stuff/RowReferenceProvider.php deleted file mode 100644 index 6e48c8735..000000000 --- a/lib/Reference/stuff/RowReferenceProvider.php +++ /dev/null @@ -1,61 +0,0 @@ -referenceHelper = $referenceHelper; - $this->referenceManager = $referenceManager; - } - - /** - * @inheritDoc - */ - public function matchReference(string $referenceText): bool { - return $this->referenceHelper->matchReference($referenceText); - } - - /** - * @inheritDoc - */ - public function resolveReference(string $referenceText): ?IReference { - return $this->referenceHelper->resolveReference($referenceText); - } - - /** - * @param string $url - * @return int|null - */ - public function getTableIdFromLink(string $url): ?int { - return $this->referenceHelper->getTableIdFromLink($url); - } - - /** - * @inheritDoc - */ - public function getCachePrefix(string $referenceId): string { - return $this->referenceHelper->getCachePrefix($referenceId); - } - - /** - * @inheritDoc - */ - public function getCacheKey(string $referenceId): ?string { - return $this->referenceHelper->getCacheKey($referenceId); - } - - /** - * @param string $userId - * @return void - */ - public function invalidateUserCache(string $userId): void { - $this->referenceManager->invalidateCache($userId); - } -} diff --git a/lib/Reference/stuff/SearchableTableReferenceProvider.php b/lib/Reference/stuff/SearchableTableReferenceProvider.php deleted file mode 100644 index 920f60344..000000000 --- a/lib/Reference/stuff/SearchableTableReferenceProvider.php +++ /dev/null @@ -1,112 +0,0 @@ -referenceHelper = $referenceHelper; - $this->l10n = $l10n; - $this->urlGenerator = $urlGenerator; - $this->referenceManager = $referenceManager; - } - - /** - * @inheritDoc - */ - public function getId(): string { - return Application::APP_ID . '-ref-tables'; - } - - /** - * @inheritDoc - */ - public function getTitle(): string { - return $this->l10n->t('Nextcloud tables'); - } - - /** - * @inheritDoc - */ - public function getOrder(): int { - return 10; - } - - /** - * @inheritDoc - */ - public function getIconUrl(): string { - return $this->urlGenerator->getAbsoluteURL( - $this->urlGenerator->imagePath(Application::APP_ID, 'app-dark.svg') - ); - } - - /** - * @inheritDoc - */ - public function getSupportedSearchProviderIds(): array { - return ['tables-search-tables']; - } - - /** - * @inheritDoc - */ - public function matchReference(string $referenceText): bool { - return $this->referenceHelper->matchReference($referenceText); - } - - /** - * @inheritDoc - */ - public function resolveReference(string $referenceText): ?IReference { - return $this->referenceHelper->resolveReference($referenceText); - } - - /** - * @param string $url - * @return int|null - */ - public function getTableIdFromLink(string $url): ?int { - return $this->referenceHelper->getTableIdFromLink($url); - } - - /** - * @inheritDoc - */ - public function getCachePrefix(string $referenceId): string { - return $this->referenceHelper->getCachePrefix($referenceId); - } - - /** - * @inheritDoc - */ - public function getCacheKey(string $referenceId): ?string { - return $this->referenceHelper->getCacheKey($referenceId); - } - - /** - * @param string $userId - * @return void - */ - public function invalidateUserCache(string $userId): void { - $this->referenceManager->invalidateCache($userId); - } -} diff --git a/lib/Reference/stuff/ViewReferenceProvider.php b/lib/Reference/stuff/ViewReferenceProvider.php deleted file mode 100644 index fba2d44d5..000000000 --- a/lib/Reference/stuff/ViewReferenceProvider.php +++ /dev/null @@ -1,61 +0,0 @@ -referenceHelper = $referenceHelper; - $this->referenceManager = $referenceManager; - } - - /** - * @inheritDoc - */ - public function matchReference(string $referenceText): bool { - return $this->referenceHelper->matchReference($referenceText, 'view'); - } - - /** - * @inheritDoc - */ - public function resolveReference(string $referenceText): ?IReference { - return $this->referenceHelper->resolveReference($referenceText); - } - - /** - * @param string $url - * @return int|null - */ - public function getTableIdFromLink(string $url): ?int { - return $this->referenceHelper->getViewIdFromLink($url); - } - - /** - * @inheritDoc - */ - public function getCachePrefix(string $referenceId): string { - return $this->referenceHelper->getCachePrefix($referenceId); - } - - /** - * @inheritDoc - */ - public function getCacheKey(string $referenceId): ?string { - return $this->referenceHelper->getCacheKey($referenceId); - } - - /** - * @param string $userId - * @return void - */ - public function invalidateUserCache(string $userId): void { - $this->referenceManager->invalidateCache($userId); - } -} diff --git a/lib/Service/ColumnService.php b/lib/Service/ColumnService.php index 683ec20e9..0bc694fe2 100644 --- a/lib/Service/ColumnService.php +++ b/lib/Service/ColumnService.php @@ -186,7 +186,7 @@ public function create( if ($viewId) { $view = $this->viewService->find($viewId); $table = $this->tableMapper->find($view->getTableId()); - } else if ($tableId) { + } elseif ($tableId) { $table = $this->tableMapper->find($tableId); } else { throw new InternalError('Cannot update row without table or view in context'); diff --git a/lib/Service/ColumnTypes/TextLinkBusiness.php b/lib/Service/ColumnTypes/TextLinkBusiness.php index c0c2c09bb..d6f6d1693 100644 --- a/lib/Service/ColumnTypes/TextLinkBusiness.php +++ b/lib/Service/ColumnTypes/TextLinkBusiness.php @@ -17,7 +17,9 @@ public function parseValue(string $value, ?Column $column = null): string { } preg_match('/(http|https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/', $value, $matches); - if (empty($matches)) return ''; + if (empty($matches)) { + return ''; + } return json_encode(json_encode([ 'title' => $matches[0], 'resourceUrl' => $matches[0] diff --git a/lib/Service/ImportService.php b/lib/Service/ImportService.php index 652058419..28bc454bc 100644 --- a/lib/Service/ImportService.php +++ b/lib/Service/ImportService.php @@ -198,7 +198,7 @@ private function createRow(Row $row): void { // if cell is empty if(!$cell || $cell->getValue() === null) { $this->logger->info('Cell is empty while fetching rows data for importing.'); - if($this->columns[$i]->getMandatory()){ + if($this->columns[$i]->getMandatory()) { $this->logger->warning('Mandatory column was not set'); $this->countErrors++; return; diff --git a/lib/Service/PermissionsService.php b/lib/Service/PermissionsService.php index 8ddbcc3df..152e1864d 100644 --- a/lib/Service/PermissionsService.php +++ b/lib/Service/PermissionsService.php @@ -111,9 +111,13 @@ public function canAccessView($view, ?string $userId = null): bool { * @throws InternalError */ public function canManageElementById(int $elementId, string $nodeType = 'table', ?string $userId = null): bool { - if ($nodeType === 'table') return $this->canManageTableById($elementId, $userId); - else if ($nodeType === 'view') return $this->canManageViewById($elementId, $userId); - else throw new InternalError('Cannot read permission for node type '.$nodeType); + if ($nodeType === 'table') { + return $this->canManageTableById($elementId, $userId); + } elseif ($nodeType === 'view') { + return $this->canManageViewById($elementId, $userId); + } else { + throw new InternalError('Cannot read permission for node type '.$nodeType); + } } /** @@ -229,7 +233,9 @@ public function canReadRowsByElement($element, string $nodeType, ?string $userId * @return bool */ public function canCreateRows($element, string $nodeType = 'view', ?string $userId = null): bool { - if ($nodeType === 'table') return $this->checkPermission($element, 'table', 'manage', $userId); + if ($nodeType === 'table') { + return $this->checkPermission($element, 'table', 'manage', $userId); + } return $this->checkPermission($element, 'view', 'create', $userId); } @@ -286,7 +292,7 @@ public function canReadShare(Share $share, ?string $userId = null): bool { return true; } try { - if ($this->canManageElementById($share->getNodeId(), $share->getNodeType())){ + if ($this->canManageElementById($share->getNodeId(), $share->getNodeType())) { return true; } } catch (InternalError $e) { @@ -415,8 +421,7 @@ private function checkPermissionById(int $elementId, string $nodeType, string $p * @param string|null $userId * @return bool */ - private function basisCheck($element, string $nodeType, ?string &$userId): bool - { + private function basisCheck($element, string $nodeType, ?string &$userId): bool { try { $userId = $this->preCheckUserId($userId); } catch (InternalError $e) { diff --git a/lib/Service/RowService.php b/lib/Service/RowService.php index 94547c611..c1b5a21c8 100644 --- a/lib/Service/RowService.php +++ b/lib/Service/RowService.php @@ -122,20 +122,20 @@ public function create( ):Row { if ($viewId) { - $view = $this->viewMapper->find($viewId); - // security - if (!$this->permissionsService->canCreateRows($view)) { - throw new PermissionError('create row at the view id = '.$viewId.' is not allowed.'); - } + $view = $this->viewMapper->find($viewId); + // security + if (!$this->permissionsService->canCreateRows($view)) { + throw new PermissionError('create row at the view id = '.$viewId.' is not allowed.'); + } - $columns = $view->getColumnsArray(); - } else if ($tableId) { + $columns = $view->getColumnsArray(); + } elseif ($tableId) { $table = $this->tableMapper->find($tableId); // security if (!$this->permissionsService->canCreateRows($table, 'table')) { throw new PermissionError('create row at the table id = '.$tableId.' is not allowed.'); } - $columns = $this->columnMapper->findAllIdsByTable($tableId); + $columns = $this->columnMapper->findAllIdsByTable($tableId); } else { throw new InternalError('Cannot create row without table or view in context'); } @@ -192,7 +192,7 @@ public function update( if(!in_array($id, $rowIds)) { throw new PermissionError('update row id = '.$item->getId().' is not allowed.'); } - } else if ($tableId) { + } elseif ($tableId) { // security if (!$this->permissionsService->canUpdateRowsByTableId($tableId)) { throw new PermissionError('update row id = '.$item->getId().' is not allowed.'); @@ -270,7 +270,9 @@ public function updateSet( $d = $item->getDataArray(); foreach ($data as $dataObject) { // Check whether the column of which the value should change is part of the table / view - if (!in_array($dataObject['columnId'],$columnIds)) continue; + if (!in_array($dataObject['columnId'], $columnIds)) { + continue; + } $d = $this->replaceOrAddData($d, $dataObject); } $item->setDataArray($d); diff --git a/lib/Service/SearchService.php b/lib/Service/SearchService.php index 52716109b..01c4a2dfd 100644 --- a/lib/Service/SearchService.php +++ b/lib/Service/SearchService.php @@ -6,7 +6,6 @@ use OCA\Tables\Db\View; use OCA\Tables\Errors\PermissionError; use OCP\AppFramework\Db\MultipleObjectsReturnedException; -use PhpOffice\PhpSpreadsheet\Worksheet\Row; use Psr\Log\LoggerInterface; class SearchService extends SuperService { diff --git a/lib/Service/TableService.php b/lib/Service/TableService.php index f90eb4e9b..3d0c2e985 100644 --- a/lib/Service/TableService.php +++ b/lib/Service/TableService.php @@ -166,9 +166,9 @@ private function enhanceTable(Table $table, string $userId): void { // (senseless if we have no user in context) if ($userId !== '' && $userId !== $table->getOwnership()) { try { - $permissions = $this->shareService->getSharedPermissionsIfSharedWithMe($table->getId(), 'table', $userId); - $table->setIsShared(true); - $table->setOnSharePermissions($permissions); + $permissions = $this->shareService->getSharedPermissionsIfSharedWithMe($table->getId(), 'table', $userId); + $table->setIsShared(true); + $table->setOnSharePermissions($permissions); } catch (NotFoundError $e) { } } diff --git a/lib/Service/TableTemplateService.php b/lib/Service/TableTemplateService.php index 86e47baf0..2e54abee0 100644 --- a/lib/Service/TableTemplateService.php +++ b/lib/Service/TableTemplateService.php @@ -5,7 +5,6 @@ use OCA\Tables\Db\Column; use OCA\Tables\Db\Table; use OCA\Tables\Errors\InternalError; -use OCA\Tables\Errors\NotFoundError; use OCA\Tables\Errors\PermissionError; use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Db\MultipleObjectsReturnedException; @@ -76,41 +75,40 @@ public function getTemplateList(): array { /** * @param Table $table * @param string $template - * @param int $defaultViewId * @return Table * @throws DoesNotExistException * @throws Exception * @throws InternalError * @throws MultipleObjectsReturnedException - * @throws NotFoundError * @throws PermissionError */ public function makeTemplate(Table $table, string $template): Table { - $createColumn = function ($params) use ($table) {return $this->createColumn($params, $table->getId());}; - $createRow = function ($data) use ($table) {$this->createRow($table->getId(), $data);}; - $createView = function ($data) use ($table) {$this->createView($table, $data);}; if ($template === 'todo') { - $this->makeTodo($createColumn, $createRow); + $this->makeTodo($table); } elseif ($template === 'members') { - $this->makeMembers($createColumn, $createRow); + $this->makeMembers($table); } elseif ($template === 'weight') { - $this->makeWeight($createColumn, $createRow); + $this->makeWeight($table); } elseif ($template === 'vacation-requests') { - $this->makeVacationRequests($createColumn, $createRow, $createView); + $this->makeVacationRequests($table); } elseif ($template === 'customers') { - $this->makeCustomers($createColumn, $createRow); + $this->makeCustomers($table); } elseif ($template === 'tutorial') { - $this->makeStartupTable($createColumn, $createRow); + $this->makeStartupTable($table); } return $table; } /** * @psalm-suppress PossiblyNullReference - * @param $createColumn - * @param $createRow + * @param Table $table + * @throws DoesNotExistException + * @throws Exception + * @throws InternalError + * @throws MultipleObjectsReturnedException + * @throws PermissionError */ - private function makeWeight($createColumn, $createRow):void { + private function makeWeight(Table $table):void { $columns = []; $params = [ @@ -120,7 +118,7 @@ private function makeWeight($createColumn, $createRow):void { 'mandatory' => true, 'datetimeDefault' => 'today', ]; - $columns['date'] = $createColumn($params); + $columns['date'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Weight'), @@ -129,7 +127,7 @@ private function makeWeight($createColumn, $createRow):void { 'numberMin' => 0, 'numberMax' => 200, ]; - $columns['weight'] = $createColumn($params); + $columns['weight'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Body fat'), @@ -138,45 +136,45 @@ private function makeWeight($createColumn, $createRow):void { 'numberMax' => 100, 'numberSuffix' => '%', ]; - $columns['bodyFat'] = $createColumn($params); + $columns['bodyFat'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Feeling over all'), 'type' => 'number', 'subtype' => 'stars', ]; - $columns['feeling'] = $createColumn($params); + $columns['feeling'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Comments'), 'type' => 'text', 'subtype' => 'long', ]; - $columns['comment'] = $createColumn($params); + $columns['comment'] = $this->createColumn($table->id, $params); // let's add some example rows - $createRow([ + $this->createRow($table, [ $columns['date']->getId() => '2022-03-01', $columns['weight']->getId() => 92.5, $columns['bodyFat']->getId() => 30, $columns['feeling']->getId() => 4, $columns['comment']->getId() => '', ]); - $createRow([ + $this->createRow($table, [ $columns['date']->getId() => '2022-03-02', $columns['weight']->getId() => 92.7, $columns['bodyFat']->getId() => 30.3, $columns['feeling']->getId() => 3, $columns['comment']->getId() => $this->l->t('feel sick'), ]); - $createRow([ + $this->createRow($table, [ $columns['date']->getId() => '2022-03-10', $columns['weight']->getId() => 91, $columns['bodyFat']->getId() => 33.1, $columns['feeling']->getId() => 4, $columns['comment']->getId() => '', ]); - $createRow([ + $this->createRow($table, [ $columns['date']->getId() => '2022-03-19', $columns['weight']->getId() => 92.5, $columns['bodyFat']->getId() => 30.7, @@ -187,10 +185,14 @@ private function makeWeight($createColumn, $createRow):void { /** * @psalm-suppress PossiblyNullReference - * @param $createColumn - * @param $createRow + * @param Table $table + * @throws DoesNotExistException + * @throws Exception + * @throws InternalError + * @throws MultipleObjectsReturnedException + * @throws PermissionError */ - private function makeCustomers($createColumn, $createRow):void { + private function makeCustomers(Table $table):void { $columns = []; $params = [ @@ -198,21 +200,21 @@ private function makeCustomers($createColumn, $createRow):void { 'type' => 'text', 'subtype' => 'line', ]; - $columns['name'] = $createColumn($params); + $columns['name'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Account manager'), 'type' => 'text', 'subtype' => 'line', ]; - $columns['accountManager'] = $createColumn($params); + $columns['accountManager'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Contract type'), 'type' => 'text', 'subtype' => 'line', ]; - $columns['contractType'] = $createColumn($params); + $columns['contractType'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Contract start'), @@ -220,14 +222,14 @@ private function makeCustomers($createColumn, $createRow):void { 'subtype' => 'date', 'datetimeDefault' => 'today', ]; - $columns['contractStart'] = $createColumn($params); + $columns['contractStart'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Contract end'), 'type' => 'datetime', 'subtype' => 'date', ]; - $columns['contractEnd'] = $createColumn($params); + $columns['contractEnd'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Description'), @@ -235,7 +237,7 @@ private function makeCustomers($createColumn, $createRow):void { 'subtype' => 'long', ]; - $columns['description'] = $createColumn($params); + $columns['description'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Contact information'), @@ -243,7 +245,7 @@ private function makeCustomers($createColumn, $createRow):void { 'subtype' => 'long', ]; - $columns['contactInformation'] = $createColumn($params); + $columns['contactInformation'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Quality of relationship'), @@ -252,7 +254,7 @@ private function makeCustomers($createColumn, $createRow):void { 'numberDefault' => 30, ]; - $columns['qualityRelationship'] = $createColumn($params); + $columns['qualityRelationship'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Comment'), @@ -260,10 +262,10 @@ private function makeCustomers($createColumn, $createRow):void { 'subtype' => 'long', ]; - $columns['comment'] = $createColumn($params); + $columns['comment'] = $this->createColumn($table->id, $params); // let's add some example rows - $createRow([ + $this->createRow($table, [ // TRANSLATORS This is an example name $columns['name']->getId() => $this->l->t('Dog'), // TRANSLATORS This is an example account manager @@ -280,7 +282,7 @@ private function makeCustomers($createColumn, $createRow):void { // TRANSLATORS This is an example comment $columns['comment']->getId() => $this->l->t('Likes treats'), ]); - $createRow([ + $this->createRow($table, [ // TRANSLATORS This is an example name $columns['name']->getId() => $this->l->t('Cat'), // TRANSLATORS This is an example account manager @@ -297,7 +299,7 @@ private function makeCustomers($createColumn, $createRow):void { // TRANSLATORS This is an example comment $columns['comment']->getId() => $this->l->t('New customer, let\'s see if there is more.'), ]); - $createRow([ + $this->createRow($table, [ // TRANSLATORS This is an example name $columns['name']->getId() => $this->l->t('Horse'), // TRANSLATORS This is an example account manager @@ -318,11 +320,14 @@ private function makeCustomers($createColumn, $createRow):void { /** * @psalm-suppress PossiblyNullReference - * @param $createColumn - * @param $createRow - * @param $createView + * @param Table $table + * @throws DoesNotExistException + * @throws Exception + * @throws InternalError + * @throws MultipleObjectsReturnedException + * @throws PermissionError */ - private function makeVacationRequests($createColumn, $createRow, $createView):void { + private function makeVacationRequests(Table $table):void { $columns = []; $params = [ @@ -332,7 +337,7 @@ private function makeVacationRequests($createColumn, $createRow, $createView):vo 'mandatory' => true, ]; - $columns['employee'] = $createColumn($params); + $columns['employee'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('from'), @@ -342,7 +347,7 @@ private function makeVacationRequests($createColumn, $createRow, $createView):vo 'mandatory' => true, ]; - $columns['from'] = $createColumn($params); + $columns['from'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('to'), @@ -352,7 +357,7 @@ private function makeVacationRequests($createColumn, $createRow, $createView):vo 'mandatory' => true, ]; - $columns['to'] = $createColumn($params); + $columns['to'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Number of working days'), @@ -363,7 +368,7 @@ private function makeVacationRequests($createColumn, $createRow, $createView):vo 'mandatory' => true, ]; - $columns['workingDays'] = $createColumn($params); + $columns['workingDays'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Request date'), @@ -373,7 +378,7 @@ private function makeVacationRequests($createColumn, $createRow, $createView):vo 'datetimeDefault' => 'today', ]; - $columns['dateRequest'] = $createColumn($params); + $columns['dateRequest'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Approved'), @@ -381,7 +386,7 @@ private function makeVacationRequests($createColumn, $createRow, $createView):vo 'subtype' => 'check', ]; - $columns['approved'] = $createColumn($params); + $columns['approved'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Approve date'), @@ -389,7 +394,7 @@ private function makeVacationRequests($createColumn, $createRow, $createView):vo 'subtype' => 'date', ]; - $columns['dateApprove'] = $createColumn($params); + $columns['dateApprove'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Approved by'), @@ -397,7 +402,7 @@ private function makeVacationRequests($createColumn, $createRow, $createView):vo 'subtype' => 'line', ]; - $columns['approveBy'] = $createColumn($params); + $columns['approveBy'] = $this->createColumn($table->id, $params); $params = [ @@ -406,10 +411,10 @@ private function makeVacationRequests($createColumn, $createRow, $createView):vo 'subtype' => 'long', ]; - $columns['comment'] = $createColumn($params); + $columns['comment'] = $this->createColumn($table->id, $params); // let's add some example rows - $createRow([ + $this->createRow($table, [ $columns['employee']->getId() => 'Alice', $columns['from']->getId() => '2023-02-05', $columns['to']->getId() => '2023-02-10', @@ -422,7 +427,7 @@ private function makeVacationRequests($createColumn, $createRow, $createView):vo // TRANSLATORS This is an example comment $columns['comment']->getId() => $this->l->t('Bob will help for this time'), ]); - $createRow([ + $this->createRow($table, [ $columns['employee']->getId() => 'Bob', $columns['from']->getId() => '2023-04-05', $columns['to']->getId() => '2023-04-12', @@ -434,7 +439,7 @@ private function makeVacationRequests($createColumn, $createRow, $createView):vo $columns['approveBy']->getId() => $this->l->t('The Boss'), $columns['comment']->getId() => '', ]); - $createRow([ + $this->createRow($table, [ $columns['employee']->getId() => 'Evil', $columns['from']->getId() => '2023-03-05', $columns['to']->getId() => '2023-04-10', @@ -446,7 +451,7 @@ private function makeVacationRequests($createColumn, $createRow, $createView):vo // TRANSLATORS This is an example comment $columns['comment']->getId() => $this->l->t('We have to talk about that.'), ]); - $createRow([ + $this->createRow($table, [ $columns['employee']->getId() => 'Pete', $columns['from']->getId() => '2023-12-18', $columns['to']->getId() => '2023-12-28', @@ -456,7 +461,7 @@ private function makeVacationRequests($createColumn, $createRow, $createView):vo // let's add views - $createView( + $this->createView($table, [ 'title' => $this->l->t('Create Vacation Request'), 'emoji' => '️➕', @@ -465,7 +470,7 @@ private function makeVacationRequests($createColumn, $createRow, $createView):vo 'filter' => json_encode([[["columnId" => -2, "operator" => "is-equal", "value" => "@my-name"], ["columnId" => $columns['approved']->getId(), "operator" => "is-empty", "value" => ""]]]), ] ); - $createView( + $this->createView($table, [ 'title' => $this->l->t('Open Request'), 'emoji' => '️📝', @@ -476,7 +481,7 @@ private function makeVacationRequests($createColumn, $createRow, $createView):vo 'filter' => json_encode([[["columnId" => $columns['approved']->getId(), "operator" => "is-empty", "value" => ""]]]), ] ); - $createView( + $this->createView($table, [ 'title' => $this->l->t('Request Status'), 'emoji' => '️❓', @@ -487,7 +492,7 @@ private function makeVacationRequests($createColumn, $createRow, $createView):vo 'filter' => json_encode([[["columnId" => -2, "operator" => "is-equal", "value" => "@my-name"]]]), ] ); - $createView( + $this->createView($table, [ 'title' => $this->l->t('Closed requests'), 'emoji' => '️✅', @@ -502,10 +507,14 @@ private function makeVacationRequests($createColumn, $createRow, $createView):vo /** * @psalm-suppress PossiblyNullReference - * @param $createColumn - * @param $createRow + * @param Table $table + * @throws DoesNotExistException + * @throws Exception + * @throws InternalError + * @throws MultipleObjectsReturnedException + * @throws PermissionError */ - private function makeMembers($createColumn, $createRow):void { + private function makeMembers(Table $table):void { $columns = []; $params = [ @@ -515,7 +524,7 @@ private function makeMembers($createColumn, $createRow):void { 'mandatory' => true, ]; - $columns['name'] = $createColumn($params); + $columns['name'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Position'), @@ -523,7 +532,7 @@ private function makeMembers($createColumn, $createRow):void { 'subtype' => 'line', ]; - $columns['position'] = $createColumn($params); + $columns['position'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Skills'), @@ -531,7 +540,7 @@ private function makeMembers($createColumn, $createRow):void { 'subtype' => 'long', ]; - $columns['skills'] = $createColumn($params); + $columns['skills'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Birthday'), @@ -539,7 +548,7 @@ private function makeMembers($createColumn, $createRow):void { 'subtype' => 'date', ]; - $columns['birthday'] = $createColumn($params); + $columns['birthday'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Comments'), @@ -547,10 +556,10 @@ private function makeMembers($createColumn, $createRow):void { 'subtype' => 'long', ]; - $columns['comment'] = $createColumn($params); + $columns['comment'] = $this->createColumn($table->id, $params); // let's add some example rows - $createRow([ + $this->createRow($table, [ // TRANSLATORS This is an example name $columns['name']->getId() => $this->l->t('Santa Claus'), // TRANSLATORS This is an example for a "position" for a member @@ -564,10 +573,14 @@ private function makeMembers($createColumn, $createRow):void { /** * @psalm-suppress PossiblyNullReference - * @param $createColumn - * @param $createRow + * @param Table $table + * @throws DoesNotExistException + * @throws Exception + * @throws InternalError + * @throws MultipleObjectsReturnedException + * @throws PermissionError */ - private function makeTodo($createColumn, $createRow): void { + private function makeTodo(Table $table): void { $columns = []; $params = [ @@ -577,7 +590,7 @@ private function makeTodo($createColumn, $createRow): void { 'mandatory' => true, ]; - $columns['task'] = $createColumn($params); + $columns['task'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Description'), @@ -587,7 +600,7 @@ private function makeTodo($createColumn, $createRow): void { 'textMultiline' => true, ]; - $columns['description'] = $createColumn($params); + $columns['description'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Target'), @@ -596,7 +609,7 @@ private function makeTodo($createColumn, $createRow): void { 'description' => $this->l->t('Date, time or whatever'), ]; - $columns['target'] = $createColumn($params); + $columns['target'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Progress'), @@ -605,7 +618,7 @@ private function makeTodo($createColumn, $createRow): void { 'numberDefault' => 0, ]; - $columns['progress'] = $createColumn($params); + $columns['progress'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Comments'), @@ -613,7 +626,7 @@ private function makeTodo($createColumn, $createRow): void { 'subtype' => 'long', ]; - $columns['comments'] = $createColumn($params); + $columns['comments'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Proofed'), @@ -621,10 +634,10 @@ private function makeTodo($createColumn, $createRow): void { 'subtype' => 'check', ]; - $columns['proofed'] = $createColumn($params); + $columns['proofed'] = $this->createColumn($table->id, $params); // let's add some example rows - $createRow([ + $this->createRow($table, [ /** @psalm-suppress PossiblyNullArgument */ // TRANSLATORS This is an example for a task $columns['task']->getId() => $this->l->t('Create initial milestones'), @@ -637,7 +650,7 @@ private function makeTodo($createColumn, $createRow): void { $columns['progress']->getId() => 100, $columns['proofed']->getId() => 'true', ]); - $createRow([ + $this->createRow($table, [ // TRANSLATORS This is an example for a task $columns['task']->getId() => $this->l->t('Kickoff meeting'), // TRANSLATORS This is an example description @@ -649,7 +662,7 @@ private function makeTodo($createColumn, $createRow): void { $columns['progress']->getId() => 80, $columns['proofed']->getId() => 'true', ]); - $createRow([ + $this->createRow($table, [ // TRANSLATORS This is an example for a task $columns['task']->getId() => $this->l->t('Set up some documentation and collaboration tools'), // TRANSLATORS This is an example description @@ -661,7 +674,7 @@ private function makeTodo($createColumn, $createRow): void { $columns['progress']->getId() => 10, $columns['proofed']->getId() => 'false', ]); - $createRow([ + $this->createRow($table, [ // TRANSLATORS This is an example for a task $columns['task']->getId() => $this->l->t('Add more actions'), // TRANSLATORS This is an example description @@ -672,10 +685,14 @@ private function makeTodo($createColumn, $createRow): void { /** * @psalm-suppress PossiblyNullReference - * @param $createColumn - * @param $createRow + * @param Table $table + * @throws DoesNotExistException + * @throws Exception + * @throws InternalError + * @throws MultipleObjectsReturnedException + * @throws PermissionError */ - private function makeStartupTable($createColumn, $createRow):void { + private function makeStartupTable(Table $table):void { $columns = []; $params = [ @@ -685,7 +702,7 @@ private function makeStartupTable($createColumn, $createRow):void { 'subtype' => 'line', ]; - $columns['what'] = $createColumn($params); + $columns['what'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('How to do'), @@ -693,7 +710,7 @@ private function makeStartupTable($createColumn, $createRow):void { 'subtype' => 'long', ]; - $columns['how'] = $createColumn($params); + $columns['how'] = $this->createColumn($table->id, $params); $params = [ 'title' => $this->l->t('Ease of use'), @@ -701,7 +718,7 @@ private function makeStartupTable($createColumn, $createRow):void { 'subtype' => 'stars', ]; - $columns['ease'] = $createColumn($params); + $columns['ease'] = $this->createColumn($table->id, $params); $params = [ // TRANSLATORS This is an example title for a column to show if an action was done @@ -710,11 +727,11 @@ private function makeStartupTable($createColumn, $createRow):void { 'subtype' => 'check', ]; - $columns['done'] = $createColumn($params); + $columns['done'] = $this->createColumn($table->id, $params); // let's add some example rows - $createRow([ + $this->createRow($table, [ // TRANSLATORS This is an example name $columns['what']->getId() => $this->l->t('Open the tables app'), // TRANSLATORS This is an example account manager @@ -722,7 +739,7 @@ private function makeStartupTable($createColumn, $createRow):void { $columns['ease']->getId() => 5, $columns['done']->getId() => 'true', ]); - $createRow([ + $this->createRow($table, [ // TRANSLATORS This is an example name $columns['what']->getId() => $this->l->t('Add your first row'), // TRANSLATORS This is an example account manager @@ -730,7 +747,7 @@ private function makeStartupTable($createColumn, $createRow):void { $columns['ease']->getId() => 5, $columns['done']->getId() => 'false', ]); - $createRow([ + $this->createRow($table, [ // TRANSLATORS This is an example name $columns['what']->getId() => $this->l->t('Edit a row'), // TRANSLATORS This is an example account manager @@ -738,7 +755,7 @@ private function makeStartupTable($createColumn, $createRow):void { $columns['ease']->getId() => 5, $columns['done']->getId() => 'false', ]); - $createRow([ + $this->createRow($table, [ // TRANSLATORS This is an example name $columns['what']->getId() => $this->l->t('Add a new column'), // TRANSLATORS This is an example account manager @@ -746,7 +763,7 @@ private function makeStartupTable($createColumn, $createRow):void { $columns['ease']->getId() => 4, $columns['done']->getId() => 'false', ]); - $createRow([ + $this->createRow($table, [ // TRANSLATORS This is an example name $columns['what']->getId() => $this->l->t('Read the docs'), // TRANSLATORS This is an example account manager @@ -757,16 +774,16 @@ private function makeStartupTable($createColumn, $createRow):void { } /** + * @param int $tableId * @param (mixed)[] $parameters - * @param int $defaultViewId * @return Column + * @throws DoesNotExistException * @throws Exception * @throws InternalError - * @throws PermissionError - * @throws DoesNotExistException * @throws MultipleObjectsReturnedException + * @throws PermissionError */ - private function createColumn(array $parameters, int $tableId): ?Column { + private function createColumn(int $tableId, array $parameters): ?Column { if ($this->userId === null) { return null; } @@ -838,15 +855,7 @@ private function createColumn(array $parameters, int $tableId): ?Column { ); } - /** - * @param int $viewId - * @param array $values - * @return void - * @throws DoesNotExistException - * @throws InternalError - * @throws MultipleObjectsReturnedException - */ - private function createRow(int $tableId, array $values): void { + private function createRow(Table $table, array $values): void { $data = []; foreach ($values as $columnId => $value) { $data[] = [ @@ -855,10 +864,10 @@ private function createRow(int $tableId, array $values): void { ]; } try { - $this->rowService->create($tableId, null, $data); + $this->rowService->create($table->getId(), null, $data); } catch (PermissionError $e) { $this->logger->warning('Cannot create row, permission denied: '.$e->getMessage()); - } catch (Exception $e) { + } catch (Exception|InternalError|DoesNotExistException|MultipleObjectsReturnedException $e) { $this->logger->warning('Exception occurred while creating a row: '.$e->getMessage()); } } diff --git a/lib/Service/ViewService.php b/lib/Service/ViewService.php index 1efaca497..3de353db1 100644 --- a/lib/Service/ViewService.php +++ b/lib/Service/ViewService.php @@ -395,12 +395,12 @@ public function deleteColumnDataFromViews(int $columnId, Table $table) { throw new InternalError($e->getMessage()); } foreach ($views as $view) { - $filteredSortingRules = array_filter($view->getSortArray(), function ($sort) use ($columnId) { + $filteredSortingRules = array_filter($view->getSortArray(), function (array $sort) use ($columnId) { return $sort['columnId'] !== $columnId; }); $filteredSortingRules = array_values($filteredSortingRules); - $filteredFilters = array_filter(array_map(function ($filterGroup) use ($columnId) { - return array_filter($filterGroup, function ($filter) use ($columnId) { + $filteredFilters = array_filter(array_map(function (array $filterGroup) use ($columnId) { + return array_filter($filterGroup, function (array $filter) use ($columnId) { return $filter['columnId'] !== $columnId; }); }, $view->getFilterArray()), fn ($filterGroup) => !empty($filterGroup)); diff --git a/src/modules/main/partials/editViewPartials/sort/SortForm.vue b/src/modules/main/partials/editViewPartials/sort/SortForm.vue index 6d16b168a..5e92c8b9e 100644 --- a/src/modules/main/partials/editViewPartials/sort/SortForm.vue +++ b/src/modules/main/partials/editViewPartials/sort/SortForm.vue @@ -132,6 +132,7 @@ export default { .locallyAdded { background-color: var(--color-success-hover); } + .locallyRemoved { background-color: var(--color-error-hover); } diff --git a/src/modules/main/sections/Dashboard.vue b/src/modules/main/sections/Dashboard.vue index 987f59dfd..9e6d511fe 100644 --- a/src/modules/main/sections/Dashboard.vue +++ b/src/modules/main/sections/Dashboard.vue @@ -359,7 +359,7 @@ export default { diff --git a/src/modules/navigation/partials/NavigationTableItem.vue b/src/modules/navigation/partials/NavigationTableItem.vue index f04825280..0550342db 100644 --- a/src/modules/navigation/partials/NavigationTableItem.vue +++ b/src/modules/navigation/partials/NavigationTableItem.vue @@ -95,7 +95,7 @@ export default { NcAvatar, Creation, PlaylistPlus, -}, + }, filters: { truncate(string, num) { diff --git a/src/modules/navigation/sections/Navigation.vue b/src/modules/navigation/sections/Navigation.vue index 2d84d57aa..2f35b0f6b 100644 --- a/src/modules/navigation/sections/Navigation.vue +++ b/src/modules/navigation/sections/Navigation.vue @@ -59,31 +59,25 @@