From 0bfe50f6d5d7aaaeb876067d09893ecbc7c1bf32 Mon Sep 17 00:00:00 2001 From: Alex Dryden Date: Mon, 18 Sep 2023 14:07:41 -0400 Subject: [PATCH 1/5] Add query parameter to get items with no teams. --- Module.php | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Module.php b/Module.php index 2daa75a..6173cbe 100644 --- a/Module.php +++ b/Module.php @@ -1007,6 +1007,21 @@ public function filterByTeam(Event $event) } } + public function getOrphans(Event $event) + { + $request = $event->getParam('request')->getContent(); + if(array_key_exists('orphans', $request)){ + $qb = $event->getParam('queryBuilder'); + $sub = $this->getServiceLocator()->get('Omeka\EntityManager') + ->createQueryBuilder() + ->select('tr') + ->from('Teams\Entity\TeamResource', 'tr'); + $q = $sub->getQuery()->getResult(\Doctrine\ORM\Query::HYDRATE_SCALAR); + $resource_ids = array_column($q,'tr_resource_id'); + $qb->andWhere($qb->expr()->notIn('omeka_root.id', $resource_ids)); + } + } + //Handle Users public function filterByTeamUser(Event $event) { @@ -2537,8 +2552,15 @@ public function attachListeners(SharedEventManagerInterface $sharedEventManager) 'api.search.query', [$this, 'filterByTeam'] ); + endforeach; + $sharedEventManager->attach( + ItemAdapter::class, + 'api.search.query', + [$this, 'getOrphans'] + ); + $sharedEventManager->attach( UserAdapter::class, 'api.search.query', From daaedca42617a61563fbb12a73a3d9edd5f67483 Mon Sep 17 00:00:00 2001 From: Alex Dryden Date: Mon, 18 Sep 2023 14:36:08 -0400 Subject: [PATCH 2/5] Update to use 'orphans' query parameter to get items with no team --- src/Controller/TrashController.php | 52 +++++++++--------------------- 1 file changed, 15 insertions(+), 37 deletions(-) diff --git a/src/Controller/TrashController.php b/src/Controller/TrashController.php index 0bf5294..f8da28d 100644 --- a/src/Controller/TrashController.php +++ b/src/Controller/TrashController.php @@ -41,7 +41,6 @@ public function createNamedParameter( public function indexAction() { - $qb = $this->entityManager->createQueryBuilder(); if ($this->request->isPost()) { if ($this->identity()->getRole() == 'global_admin') { @@ -70,42 +69,17 @@ public function indexAction() } } } - $params = $this->params(); - if ($params()->fromQuery('sort_order') === 'asc') { - $order = 'asc'; - } else { - $order = 'desc'; - } - $sort_options = [ - 'title' => 'title', - 'id' => 'id', - 'resource_class_label' => 'class', - 'owner_name' => 'owner', - 'created' => 'created', - ]; - if (key_exists($params->fromQuery('sort_by'), $sort_options)) { - $sort = $sort_options[$params->fromQuery('sort_by')]; - } else { - $sort = 'created'; - } + $this->browse()->setDefaults('items'); + $params = $this->params()->fromQuery(); + $params['orphans'] = true; + $params['bypass_team_filter'] = true; + $response = $this->api()->search('items', $params); + $this->paginator($response->getTotalResults()); + + $orphans = $response->getContent(); + $returnQuery = $this->params()->fromQuery(); + unset($returnQuery['page']); - $qb->select('r_trash') - ->from('Omeka\Entity\Item ', 'r_trash') - ->leftJoin( - 'Teams\Entity\TeamResource', - 'tr_trash', - \Doctrine\ORM\Query\Expr\Join::WITH, - 'r_trash.id = tr_trash.resource' - ) - ->where('tr_trash.team is NULL') - ->orderBy('r_trash.' . $sort, $order); - - $orphans = $qb->getQuery()->getResult(); - $this->paginator(count($orphans)); - - $page = $this->params()->fromQuery('page'); - $offset = ($page * 10) - 10; - $orphans = array_slice($orphans, $offset, 10); $formDeleteSelected = $this->getForm(ConfirmForm::class); $formDeleteSelected->setAttribute('action', $this->url()->fromRoute('admin/trash', ['action' => 'batch-delete'], true)); $formDeleteSelected->setButtonLabel('Delete Selected'); // @translate @@ -118,9 +92,13 @@ public function indexAction() $formDeleteAll->get('submit')->setAttribute('disabled', true); $view = new ViewModel; - $view->setVariable('orphan', $orphans); + $view->setVariable('items', $orphans); + $view->setVariable('formDeleteSelected', $formDeleteSelected); + $view->setVariable('formDeleteAll', $formDeleteAll); + $view->setVariable('resources', $orphans); $view->setVariable('formDeleteSelected', $formDeleteSelected); $view->setVariable('formDeleteAll', $formDeleteAll); + $view->setVariable('returnQuery', $returnQuery); return $view; } From 2a20981a157c0bc2c1859fe036b869ef44753318 Mon Sep 17 00:00:00 2001 From: Alex Dryden Date: Mon, 18 Sep 2023 14:37:08 -0400 Subject: [PATCH 3/5] Pass items directly to view --- view/teams/trash/index.phtml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/view/teams/trash/index.phtml b/view/teams/trash/index.phtml index 2515e04..f3039fe 100644 --- a/view/teams/trash/index.phtml +++ b/view/teams/trash/index.phtml @@ -1,10 +1,4 @@ -orphan as $item): - $items[] = $this->api()->read('items', $item->getId())->getContent(); -endforeach; -?> plugin('translate'); $escape = $this->plugin('escapeHtml'); From 26458113cc708ab92663a80acf80bda6854a9ad6 Mon Sep 17 00:00:00 2001 From: Alex Dryden Date: Mon, 18 Sep 2023 14:54:43 -0400 Subject: [PATCH 4/5] Update to use custom fields --- view/teams/trash/index.phtml | 178 +++++++++++++++-------------------- 1 file changed, 75 insertions(+), 103 deletions(-) diff --git a/view/teams/trash/index.phtml b/view/teams/trash/index.phtml index f3039fe..9c2fe9c 100644 --- a/view/teams/trash/index.phtml +++ b/view/teams/trash/index.phtml @@ -1,4 +1,3 @@ - plugin('translate'); $escape = $this->plugin('escapeHtml'); @@ -33,105 +32,77 @@ $sortHeadings = [
pagination(); ?> -hyperlink($translate('Advanced search'), $this->url(null, ['action' => 'search'], ['query' => $this->params()->fromQuery()], true), ['class' => 'advanced-search']);?> sortSelector($sortHeadings); ?>
-
- -
trigger('view.browse.before'); ?> -
- userIsAllowed('Teams\Controller\Trash', 'perm_delete')): ?> -
- -
- - - - -
-
- - - - - - - - - - - - - - - - - owner()) { - $ownerText = $this->hyperlink( - $owner->name(), - $this->url( - 'admin/id', - [ - 'controller' => 'user', - 'action' => 'show', - 'id' => $owner->id()] - ) - ); - } else { - $ownerText = $translate('[no owner]'); - } - ?> - - - - - - - - - - -
- userIsAllowed('update') || $item->userIsAllowed('delete')): ?> - - - linkPretty(); ?> - isPublic()): ?> - - -
    - userIsAllowed('update')): ?> -
  • link('', 'edit', [ - 'class' => 'o-icon-edit', - 'title' => $translate('Edit'), - ]); ?>
  • + + userIsAllowed('Omeka\Api\Adapter\ItemAdapter', 'batch_update')): ?> +
    +
displayResourceClassLabel())); ?>i18n()->dateFormat($item->created())); ?>i18n()->dateFormat($item->modified())); ?>
- -
+ +
+ + + + + + +
+ + + + + + + + + browse()->renderHeaderRow('items'); ?> + + + + + + + browse()->renderContentRow('items', $item); ?> + + + +
+ userIsAllowed('Omeka\Api\Adapter\ItemAdapter', 'batch_update') && ($item->userIsAllowed('update') || $item->userIsAllowed('delete'))): ?> + + + linkPretty(); ?> + isPublic()): ?> + + +
    + userIsAllowed('update')): ?> +
  • link('', 'edit', [ + 'class' => 'o-icon-edit', + 'title' => $translate('Edit'), + ]); ?>
  • + +
  • hyperlink('', '#', [ + 'data-sidebar-selector' => '#sidebar', + 'data-sidebar-content-url' => $item->url('show-details'), + 'class' => 'o-icon-more sidebar-content', + 'title' => $translate('Details'), + ]); ?>
  • +
+
+ + trigger('view.browse.after'); ?>
@@ -155,10 +126,10 @@ $sortHeadings = [

%s', $translate('Warning')), - '' - ); ?>

+ $translate('%1$s: this action will permanently delete %2$s items and cannot be undone.'), + sprintf('%s', $translate('Warning')), + '' + ); ?>

form($this->formDeleteSelected); ?>
@@ -173,10 +144,10 @@ $sortHeadings = [

%s', $translate('Warning')), - sprintf('%s', number_format($this->pagination()->getPaginator()->getTotalCount())) - ); ?>

+ $translate('%1$s: this action will permanently delete %2$s items and cannot be undone.'), + sprintf('%s', $translate('Warning')), + sprintf('%s', number_format($this->pagination()->getPaginator()->getTotalCount())) + ); ?>

form($this->formDeleteAll); ?> @@ -211,9 +182,10 @@ $('#sidebar-delete-all').on('click', 'input[name="confirm-delete-all-check"]', f
-

+

+ From 9843732114f51a03de30dc74b9fb895a03ef0229 Mon Sep 17 00:00:00 2001 From: Alex Dryden Date: Mon, 18 Sep 2023 14:55:54 -0400 Subject: [PATCH 5/5] Use custom fields for sort selector --- view/teams/trash/index.phtml | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/view/teams/trash/index.phtml b/view/teams/trash/index.phtml index 9c2fe9c..0beeef4 100644 --- a/view/teams/trash/index.phtml +++ b/view/teams/trash/index.phtml @@ -2,28 +2,6 @@ $translate = $this->plugin('translate'); $escape = $this->plugin('escapeHtml'); $this->htmlElement('body')->appendAttribute('class', 'items browse'); -$sortHeadings = [ - [ - 'label' => $translate('Title'), - 'value' => 'title' - ], - [ - 'label' => $translate('Identifier'), - 'value' => 'dcterms:identifier' - ], - [ - 'label' => $translate('Class'), - 'value' => 'resource_class_label' - ], - [ - 'label' => $translate('Owner'), - 'value' => 'owner_name' - ], - [ - 'label' => $translate('Created'), - 'value' => 'created' - ], -]; ?> pageTitle($translate('Orphaned Items')); ?> @@ -32,7 +10,7 @@ $sortHeadings = [
pagination(); ?> - sortSelector($sortHeadings); ?> + browse()->renderSortSelector('items'); ?>
trigger('view.browse.before'); ?>