From 4e62ed3fcb5fc2ac782524a862cc18c56402ff7c Mon Sep 17 00:00:00 2001 From: Sujan Shrestha <sujan.shrestha.k@gmail.com> Date: Sat, 31 Dec 2022 09:39:24 +0545 Subject: [PATCH] Permission bug fixes --- .../views.view.expense_tracker_admin.yml | 2 +- css/et_transaction.theme.css | 13 +- expense_tracker.module | 14 +- expense_tracker.permissions.yml | 12 +- expense_tracker.routing.yml | 3 +- expense_tracker.services.yml | 7 - src/Entity/EtTransaction.php | 48 ++--- src/EtTransactionAccessControlHandler.php | 174 +++++++++++++++-- src/EtTransactionInterface.php | 75 +------- src/EtTransactionListBuilder.php | 4 +- src/EtTransactionStorage.php | 42 ----- src/EtTransactionStorageInterface.php | 85 --------- src/EtTransactionViewData.php | 8 +- src/Form/EtTransactionDeleteForm.php | 2 +- src/Form/EtTransactionViewForm.php | 175 +++--------------- templates/et-transaction-results.html.twig | 6 +- templates/et-transaction-vote.html.twig | 17 -- 17 files changed, 240 insertions(+), 447 deletions(-) delete mode 100644 expense_tracker.services.yml delete mode 100644 templates/et-transaction-vote.html.twig diff --git a/config/install/views.view.expense_tracker_admin.yml b/config/install/views.view.expense_tracker_admin.yml index 280c359..6511440 100644 --- a/config/install/views.view.expense_tracker_admin.yml +++ b/config/install/views.view.expense_tracker_admin.yml @@ -559,7 +559,7 @@ display: access: type: perm options: - perm: 'access et_transaction overview' + perm: 'access expense_tracker' cache: type: none options: { } diff --git a/css/et_transaction.theme.css b/css/et_transaction.theme.css index bb5dbb0..1c42409 100644 --- a/css/et_transaction.theme.css +++ b/css/et_transaction.theme.css @@ -15,21 +15,10 @@ .et_transaction .total { text-align: center; } -.et_transaction .vote-form { - text-align: center; -} -.et_transaction .vote-form { - text-align: left; /* LTR */ -} -.et_transaction .vote-form .et_transaction-title { - font-weight: bold; -} .et_transaction-chtext { width: 80%; } -.et_transaction-chvotes .form-text { - width: 85%; -} + .et_transaction { overflow: hidden; } diff --git a/expense_tracker.module b/expense_tracker.module index 3b6dafc..0db09bd 100644 --- a/expense_tracker.module +++ b/expense_tracker.module @@ -1,10 +1,5 @@ <?php -/** - * @file - * Collects votes on different topics in the form of multiple choice titles. - */ - use Drupal\Core\Template\Attribute; use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Url; @@ -502,9 +497,14 @@ function expense_tracker_views_query_alter(ViewExecutable $view, QueryPluginBase } } } - } - +if($view->id() == 'expense_tracker_admin') { + $current_user = \Drupal::currentUser(); + if (!$current_user->hasPermission('access all expense_tracker')) { + $uid = $current_user->id(); + $query->addWhere('view_access', 'et_transaction_field_data.uid', [$uid], 'IN'); + } +} } diff --git a/expense_tracker.permissions.yml b/expense_tracker.permissions.yml index 40add08..d5034fd 100644 --- a/expense_tracker.permissions.yml +++ b/expense_tracker.permissions.yml @@ -1,9 +1,9 @@ create expense_tracker: title: 'Create expense and income transactions' edit expense_tracker: - title: 'Edit expense and income transactions' + title: 'Edit own expense and income transactions' delete expense_tracker: - title: 'Delete expense and income transactions' + title: 'Delete own expense and income transactions' config expense_tracker: title: 'Configure expense and income transactions' reports expense_tracker: @@ -11,4 +11,10 @@ reports expense_tracker: import expense_tracker: title: 'Import expense and income date' access expense_tracker: - title: 'View expense and income data' + title: 'View own expense and income data' +edit all expense_tracker: + title: 'Edit all expense and income transactions' +delete all expense_tracker: + title: 'Delete all expense and income transactions' +access all expense_tracker: + title: 'View all expense and income data' \ No newline at end of file diff --git a/expense_tracker.routing.yml b/expense_tracker.routing.yml index 0f8df2b..3091691 100644 --- a/expense_tracker.routing.yml +++ b/expense_tracker.routing.yml @@ -4,7 +4,8 @@ expense_tracker.et_transaction_list: _entity_list: 'et_transaction' _title: 'EtTransactions' requirements: - _permission: 'access expense_tracker' + # _permission: 'access expense_tracker' + _entity_access: 'et_transaction' expense_tracker.expense_tracker_add: path: '/admin/income-expense-transactions/add' diff --git a/expense_tracker.services.yml b/expense_tracker.services.yml deleted file mode 100644 index 6d0ce15..0000000 --- a/expense_tracker.services.yml +++ /dev/null @@ -1,7 +0,0 @@ -services: - expense_tracker.post_render_cache: - class: Drupal\expense_tracker\EtTransactionPostRenderCache - arguments: ['@entity_type.manager'] - expense_tracker_vote.storage: - class: Drupal\expense_tracker\EtTransactionVoteStorage - arguments: ['@database', '@cache_tags.invalidator'] diff --git a/src/Entity/EtTransaction.php b/src/Entity/EtTransaction.php index 23dc9ae..44460df 100644 --- a/src/Entity/EtTransaction.php +++ b/src/Entity/EtTransaction.php @@ -29,7 +29,7 @@ use Drupal\Core\Datetime\DrupalDateTime; * "default" = "Drupal\expense_tracker\Form\EtTransactionForm", * "edit" = "Drupal\expense_tracker\Form\EtTransactionForm", * "delete" = "Drupal\expense_tracker\Form\EtTransactionDeleteForm", - * "delete_vote" = "Drupal\expense_tracker\Form\EtTransactionVoteDeleteForm", + * "delete_transaction" = "Drupal\expense_tracker\Form\EtTransactionDeleteForm", * "delete_items" = "Drupal\expense_tracker\Form\EtTransactionItemsDeleteForm", * } * }, @@ -129,45 +129,45 @@ class EtTransaction extends ContentEntityBase implements EtTransactionInterface /** * {@inheritdoc} */ - public function getAnonymousVoteAllow() { - return $this->get('anonymous_vote_allow')->value; + public function getAnonymousTransactionAllow() { + return $this->get('anonymous_transaction_allow')->value; } /** * {@inheritdoc} */ - public function setAnonymousVoteAllow($anonymous_vote_allow) { - $this->set('anonymous_vote_allow', $anonymous_vote_allow); + public function setAnonymousTransactionAllow($anonymous_transaction_allow) { + $this->set('anonymous_transaction_allow', $anonymous_transaction_allow); return $this; } /** * {@inheritdoc} */ - public function getCancelVoteAllow() { - return $this->get('cancel_vote_allow')->value; + public function getCancelTransactionAllow() { + return $this->get('cancel_transaction_allow')->value; } /** * {@inheritdoc} */ - public function setCancelVoteAllow($cancel_vote_allow) { - $this->set('cancel_vote_allow', $cancel_vote_allow); + public function setCancelTransactionAllow($cancel_transaction_allow) { + $this->set('cancel_transaction_allow', $cancel_transaction_allow); return $this; } /** * {@inheritdoc} */ - public function getResultVoteAllow() { - return $this->get('result_vote_allow')->value; + public function getResultTransactionAllow() { + return $this->get('result_transaction_allow')->value; } /** * {@inheritdoc} */ - public function setResultVoteAllow($result_vote_allow) { - $this->set('result_vote_allow', $result_vote_allow); + public function setResultTransactionAllow($result_transaction_allow) { + $this->set('result_transaction_allow', $result_transaction_allow); return $this; } @@ -643,10 +643,10 @@ class EtTransaction extends ContentEntityBase implements EtTransactionInterface * * @return mixed */ - public function hasUserVoted() { - /** @var \Drupal\et_transaction\EtTransactionVoteStorage $vote_storage */ - $vote_storage = \Drupal::service('expense_tracker_vote.storage'); - return $vote_storage->getUserVote($this); + public function hasUserTransactiond() { + /** @var \Drupal\et_transaction\EtTransactionTransactionStorage $transaction_storage */ + $transaction_storage = \Drupal::service('expense_tracker_transaction.storage'); + return $transaction_storage->getUserTransaction($this); } /** @@ -701,7 +701,7 @@ class EtTransaction extends ContentEntityBase implements EtTransactionInterface $removed_choices = array_diff($original_choices, $current_choices); if ($removed_choices) { - \Drupal::service('expense_tracker_vote.storage')->deleteChoicesVotes($removed_choices); + \Drupal::service('expense_tracker_transaction.storage')->deleteChoicesTransactions($removed_choices); $storage = \Drupal::entityTypeManager()->getStorage('et_transaction_choice'); $storage->delete($storage->loadMultiple($removed_choices)); } @@ -714,9 +714,9 @@ class EtTransaction extends ContentEntityBase implements EtTransactionInterface public static function postDelete(EntityStorageInterface $storage, array $entities) { // parent::postDelete($storage, $entities); - // // Delete votes. + // // Delete transactions. // foreach ($entities as $entity) { - // $storage->deleteVotes($entity); + // $storage->deleteTransactions($entity); // } // // Delete referenced choices. @@ -732,10 +732,10 @@ class EtTransaction extends ContentEntityBase implements EtTransactionInterface /** * {@inheritdoc} */ - public function getVotes() { - /** @var \Drupal\et_transaction\EtTransactionVoteStorage $vote_storage */ - $vote_storage = \Drupal::service('expense_tracker_vote.storage'); - return $vote_storage->getVotes($this); + public function getTransactions() { + /** @var \Drupal\et_transaction\EtTransactionTransactionStorage $transaction_storage */ + $transaction_storage = \Drupal::service('expense_tracker_transaction.storage'); + return $transaction_storage->getTransactions($this); } } diff --git a/src/EtTransactionAccessControlHandler.php b/src/EtTransactionAccessControlHandler.php index 329f02f..bd847c1 100644 --- a/src/EtTransactionAccessControlHandler.php +++ b/src/EtTransactionAccessControlHandler.php @@ -20,37 +20,187 @@ class EtTransactionAccessControlHandler extends EntityAccessControlHandler { * {@inheritdoc} */ protected function checkCreateAccess(AccountInterface $account, array $context, $entity_bundle = NULL) { - return AccessResult::allowedIfHasPermissions($account, ['create et_transactions', 'administer et_transactions'], 'OR'); + + $entityTypeIndicator = \Drupal::routeMatch()->getParameters()->keys()[0]; + $entity = \Drupal::routeMatch()->getParameter($entityTypeIndicator); + $route_name = \Drupal::routeMatch()->getRouteName(); + $is_author = false; + + + if($entity && is_object($entity)) { + if(!$account->isAnonymous() && $account->id() == $entity->get('uid')->target_id) { + $is_author = true; + } + } + + $valid = false; + + switch ($route_name) { + case 'entity.et_transaction.edit_form': + + if(!$account->isAnonymous() && $account->hasPermission('edit all expense_tracker')) { + return AccessResult::allowed()->cachePerPermissions(); + } elseif ($account->hasPermission('edit expense_tracker')) { + if($is_author) { + $valid = true; + } + } + + break; + case 'entity.et_transaction.delete_form': + if(!$account->isAnonymous() && $account->hasPermission('delete all expense_tracker')) { + return AccessResult::allowed()->cachePerPermissions(); + } elseif ($account->hasPermission('delete expense_tracker')) { + if($is_author) { + $valid = true; + } + }else + + break; + + default: + return AccessResult::allowed()->cachePerPermissions(); + break; + } + + if($valid) { + return AccessResult::allowed()->cachePerPermissions(); + } else { + throw new \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException(); + } + } /** * {@inheritdoc} */ protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) { - // Allow view access if the user has the access et_transactions permission. - if ($operation == 'view') { - return AccessResult::allowedIfHasPermission($account, 'access et_transactions'); + + $route_name = \Drupal::routeMatch()->getRouteName(); + + switch ($route_name) { + case 'entity.et_transaction.edit_form': + if($account->hasPermission('edit all expense_tracker')) { + + return AccessResult::allowed()->cachePerPermissions(); + } else { + if($is_author) { + return AccessResult::allowedIfHasPermission($account, 'edit expense_tracker'); + } + } + break; + + default: + // code... + break; + } + + + $is_author = false; + if(!$account->isAnonymous() && $account->id() == $entity->get('uid')->target_id) { + $is_author = true; } - elseif ($operation == 'update' && !$account->isAnonymous() && $account->id() == $entity->get('uid')->target_id) { - return AccessResult::allowedIfHasPermissions($account, [ - 'edit own et_transactions', - 'administer et_transactions', - ], 'OR'); + + $user_roles = $account->getRoles(); + if (!in_array('administrator', $user_roles)) { + + // var_export($operation); + if ($operation == 'view') { + + if($account->hasPermission('access all expense_tracker')) { + return AccessResult::allowed()->cachePerPermissions(); + } else { + if($is_author) { + return AccessResult::allowedIfHasPermission($account, 'access expense_tracker'); + } + } + } elseif ($operation == 'update') { + if($account->hasPermission('edit all expense_tracker')) { + return AccessResult::allowed()->cachePerPermissions(); + } else { + if($is_author) { + return AccessResult::allowedIfHasPermission($account, 'edit expense_tracker'); + } + } + } elseif ($operation == 'delete') { + if($account->hasPermission('delete all expense_tracker')) { + return AccessResult::allowed()->cachePerPermissions(); + } else { + if($is_author) { + return AccessResult::allowedIfHasPermission($account, 'delete expense_tracker'); + } + } + } else { + + + if(!$account->isAnonymous()) { + + return AccessResult::allowedIfHasPermissions($account, [ + 'create expense_tracker', + 'access expense_tracker', + 'edit expense_tracker', + 'delete expense_tracker', + 'access all expense_tracker', + 'edit all expense_tracker', + 'delete all expense_tracker', + ], 'OR'); + + // var_dump($return); + } + } } - // Otherwise fall back to the parent which checks the administer et_transactions - // permission. + return parent::checkAccess($entity, $operation, $account); + +// // Allow view access if the user has the access expense_tracker permission. +// if ($operation == 'view') { +// return AccessResult::allowedIfHasPermission($account, 'access expense_tracker'); +// } +// elseif (($operation == 'update' || $operation == 'delete') && !$account->isAnonymous() && $account->id() == $entity->get('uid')->target_id) { +// return AccessResult::allowedIfHasPermission($account, 'access expense_tracker'); + +// return AccessResult::allowedIfHasPermissions($account, [ +// 'edit expense_tracker', +// 'delete expense_tracker', +// ], 'OR'); +// } elseif(!$account->isAnonymous() && $account->id() == $entity->get('uid')->target_id) { +// return AccessResult::allowedIfHasPermissions($account, [ +// 'access expense_tracker', +// 'edit expense_tracker', +// 'create expense_tracker', +// 'delete expense_tracker', +// 'administer expense_tracker', +// ], 'OR'); +// } else { +// if(!$account->isAnonymous()) { +// return AccessResult::allowedIfHasPermissions($account, [ +// 'create expense_tracker', +// 'access expense_tracker', +// 'edit expense_tracker', +// 'delete expense_tracker', +// 'access all expense_tracker', +// 'edit all expense_tracker', +// 'delete all expense_tracker', +// 'administer expense_tracker', +// 'administer expense_tracker', +// ], 'OR'); +// } +// } +// // Otherwise fall back to the parent which checks the administer expense_tracker +// // permission. +// return parent::checkAccess($entity, $operation, $account); } /** * {@inheritdoc} */ protected function checkFieldAccess($operation, FieldDefinitionInterface $field_definition, AccountInterface $account, FieldItemListInterface $items = NULL) { + $restricted_fields = [ 'uid', ]; if ($operation === 'edit' && in_array($field_definition->getName(), $restricted_fields, TRUE)) { - return AccessResult::allowedIfHasPermission($account, 'administer et_transactions'); + return AccessResult::allowedIfHasPermission($account, 'administer expense_tracker'); } return parent::checkFieldAccess($operation, $field_definition, $account, $items); } diff --git a/src/EtTransactionInterface.php b/src/EtTransactionInterface.php index 026c2c1..816fd01 100644 --- a/src/EtTransactionInterface.php +++ b/src/EtTransactionInterface.php @@ -59,65 +59,6 @@ interface EtTransactionInterface extends ContentEntityInterface { */ public function setRuntime($runtime); - - /** - * Returns the last time where the feed was checked for new items. - * - * @return int - * The timestamp when new items were last checked for. - */ - public function getAnonymousVoteAllow(); - - /** - * Sets the time when this feed was queued for refresh, 0 if not queued. - * - * @param int $anonymous_vote_allow - * The timestamp of the last refresh. - * - * @return \Drupal\expense_tracker\EtTransactionInterface - * The class instance that this method is called on. - */ - public function setAnonymousVoteAllow($anonymous_vote_allow); - - /** - * Returns the time when this feed was queued for refresh, 0 if not queued. - * - * @return int - * The timestamp of the last refresh. - */ - public function getCancelVoteAllow(); - - /** - * Sets the time when this feed was queued for refresh, 0 if not queued. - * - * @param int $cancel_vote_allow - * The timestamp of the last refresh. - * - * @return \Drupal\expense_tracker\EtTransactionInterface - * The class instance that this method is called on. - */ - public function setCancelVoteAllow($cancel_vote_allow); - - - /** - * Returns the time when this feed was queued for refresh, 0 if not queued. - * - * @return int - * The timestamp of the last refresh. - */ - public function getResultVoteAllow(); - - /** - * Sets the time when this feed was queued for refresh, 0 if not queued. - * - * @param int $result_vote_allow - * The timestamp of the last refresh. - * - * @return \Drupal\expense_tracker\EtTransactionInterface - * The class instance that this method is called on. - */ - public function setResultVoteAllow($result_vote_allow); - /** * Returns if the et_transaction is open. * @@ -144,13 +85,6 @@ interface EtTransactionInterface extends ContentEntityInterface { */ public function open(); - /** - * @todo: Refactor - doesn't belong here. - * - * @return mixed - */ - public function hasUserVoted(); - /** * Get all options for this et_transaction. * @@ -160,18 +94,11 @@ interface EtTransactionInterface extends ContentEntityInterface { public function getOptions(); /** - * Get the values of each vote option for this et_transaction. + * Get the values of each transaction option for this et_transaction. * * @return array * Associative array of option values. */ public function getOptionValues(); - /** - * Get all the votes of this et_transaction. - * - * @return array - */ - public function getVotes(); - } diff --git a/src/EtTransactionListBuilder.php b/src/EtTransactionListBuilder.php index af20b56..39f3df5 100644 --- a/src/EtTransactionListBuilder.php +++ b/src/EtTransactionListBuilder.php @@ -52,8 +52,8 @@ class EtTransactionListBuilder extends DraggableListBuilder { * Overrides Drupal\Core\Entity\EntityListController::buildRow(). */ public function buildRow(EntityInterface $entity) { - /** @var \Drupal\et_transaction\EtTransactionVoteStorage $vote_storage */ - $vote_storage = \Drupal::service('expense_tracker_vote.storage'); + /** @var \Drupal\et_transaction\EtTransactionVoteStorage $transaction_storage */ + $transaction_storage = \Drupal::service('expense_tracker.storage'); $row['title'] = $entity->toLink()->toString(); $row['author']['data'] = array( diff --git a/src/EtTransactionStorage.php b/src/EtTransactionStorage.php index 055c740..a6869b3 100644 --- a/src/EtTransactionStorage.php +++ b/src/EtTransactionStorage.php @@ -13,48 +13,6 @@ use Drupal\Core\Session\AccountInterface; */ class EtTransactionStorage extends SqlContentEntityStorage implements EtTransactionStorageInterface { - /** - * {@inheritdoc} - */ - public function getTotalVotes(EtTransactionInterface $et_transaction) { - return \Drupal::service('expense_tracker_vote.storage')->getTotalVotes($et_transaction); - } - - /** - * {@inheritdoc} - */ - public function deleteVotes(EtTransactionInterface $et_transaction) { - return \Drupal::service('expense_tracker_vote.storage')->deleteVotes($et_transaction); - } - - /** - * {@inheritdoc} - */ - public function getUserVote(EtTransactionInterface $et_transaction) { - return \Drupal::service('expense_tracker_vote.storage')->getUserVote($et_transaction); - } - - /** - * {@inheritdoc} - */ - public function saveVote(array $options) { - return \Drupal::service('expense_tracker_vote.storage')->saveVote($options); - } - - /** - * {@inheritdoc} - */ - public function getVotes(EtTransactionInterface $et_transaction) { - return \Drupal::service('expense_tracker_vote.storage')->getVotes($et_transaction); - } - - /** - * {@inheritdoc} - */ - public function cancelVote(EtTransactionInterface $et_transaction, AccountInterface $account = NULL) { - \Drupal::service('expense_tracker_vote.storage')->cancelVote($et_transaction, $account); - } - /** * {@inheritdoc} */ diff --git a/src/EtTransactionStorageInterface.php b/src/EtTransactionStorageInterface.php index 56adcc6..b2a7586 100644 --- a/src/EtTransactionStorageInterface.php +++ b/src/EtTransactionStorageInterface.php @@ -10,91 +10,6 @@ use Drupal\Core\Session\AccountInterface; */ interface EtTransactionStorageInterface extends EntityStorageInterface { - /** - * Save a user's vote. - * - * @param array $options - * - * @return mixed - * - * @deprecated in Drupal 8.x-1.0. - * Use \Drupal\et_transaction\EtTransactionVoteStorageInterface::saveVote() instead. - * - * @see \Drupal\et_transaction\EtTransactionVoteStorageInterface::saveVote() - */ - public function saveVote(array $options); - - /** - * Cancel a user's vote. - * - * @param EtTransactionInterface $et_transaction - * @param AccountInterface $account - * - * @return mixed - * - * @deprecated in Drupal 8.x-1.0. - * Use \Drupal\et_transaction\EtTransactionVoteStorageInterface::cancelVote() instead. - * - * @see \Drupal\et_transaction\EtTransactionVoteStorageInterface::cancelVote() - */ - public function cancelVote(EtTransactionInterface $et_transaction, AccountInterface $account = NULL); - - /** - * Get total votes for a et_transaction. - * - * @param EtTransactionInterface $et_transaction - * - * @return mixed - * - * @deprecated in Drupal 8.x-1.0. - * Use \Drupal\et_transaction\EtTransactionVoteStorageInterface::getTotalVotes() instead. - * - * @see \Drupal\et_transaction\EtTransactionVoteStorageInterface::getTotalVotes() - */ - public function getTotalVotes(EtTransactionInterface $et_transaction); - - /** - * Get all votes for a et_transaction. - * - * @param EtTransactionInterface $et_transaction - * - * @return mixed - * - * @deprecated in Drupal 8.x-1.0. - * Use \Drupal\et_transaction\EtTransactionVoteStorageInterface::getVotes() instead. - * - * @see \Drupal\et_transaction\EtTransactionVoteStorageInterface::getVotes() - */ - public function getVotes(EtTransactionInterface $et_transaction); - - /** - * Delete a user's votes for a et_transaction. - * - * @param EtTransactionInterface $et_transaction - * - * @return mixed - * - * @deprecated in Drupal 8.x-1.0. - * Use \Drupal\et_transaction\EtTransactionVoteStorageInterface::deleteVotes() instead. - * - * @see \Drupal\et_transaction\EtTransactionVoteStorageInterface::deleteVotes() - */ - public function deleteVotes(EtTransactionInterface $et_transaction); - - /** - * Get a user's votes for a et_transaction. - * - * @param EtTransactionInterface $et_transaction - * - * @return mixed - * - * @deprecated in Drupal 8.x-1.0. - * Use \Drupal\et_transaction\EtTransactionVoteStorageInterface::getUserVote() instead. - * - * @see \Drupal\et_transaction\EtTransactionVoteStorageInterface::getUserVote() - */ - public function getUserVote(EtTransactionInterface $et_transaction); - /** * Get the most recent et_transaction posted on the site. * diff --git a/src/EtTransactionViewData.php b/src/EtTransactionViewData.php index 3b425ec..f0969eb 100644 --- a/src/EtTransactionViewData.php +++ b/src/EtTransactionViewData.php @@ -15,12 +15,12 @@ class EtTransactionViewData extends EntityViewsData { public function getViewsData() { $data = parent::getViewsData(); - $data['et_transaction_field_data']['votes'] = array( - 'title' => 'Total votes', - 'help' => 'Displays the total number of votes.', + $data['et_transaction_field_data']['transactions'] = array( + 'title' => 'Total transactions', + 'help' => 'Displays the total number of transactions.', 'real field' => 'id', 'field' => array( - 'id' => 'et_transaction_totalvotes', + 'id' => 'et_transaction_totaltransactions', ), ); diff --git a/src/Form/EtTransactionDeleteForm.php b/src/Form/EtTransactionDeleteForm.php index 1f4814c..0be9df3 100644 --- a/src/Form/EtTransactionDeleteForm.php +++ b/src/Form/EtTransactionDeleteForm.php @@ -22,7 +22,7 @@ class EtTransactionDeleteForm extends ContentEntityConfirmFormBase { * {@inheritdoc} */ public function getDescription() { - return t('All associated votes will be deleted too. This action cannot be undone.'); + return t('All associated transactions will be deleted too. This action cannot be undone.'); } /** diff --git a/src/Form/EtTransactionViewForm.php b/src/Form/EtTransactionViewForm.php index e175b74..474c436 100644 --- a/src/Form/EtTransactionViewForm.php +++ b/src/Form/EtTransactionViewForm.php @@ -59,7 +59,7 @@ class EtTransactionViewForm extends FormBase implements BaseFormIdInterface { if ($this->showResults($this->et_transaction, $form_state)) { - // Check if the user already voted. The form is still being built but + // Check if the user already. The form is still being built but // the Vote button won't be added so the submit callbacks will not be // called. Directly check for the request method and use the raw user // input. @@ -68,8 +68,8 @@ class EtTransactionViewForm extends FormBase implements BaseFormIdInterface { if (isset($input['op']) && $input['op'] == $this->t('Vote')) { // If this happened, then the form submission was likely a cached page. // Force a session for this user so he can see the results. - $this->messenger()->addError($this->t('Your vote for this et_transaction has already been submitted.')); - $_SESSION['expense_tracker_vote'][$this->et_transaction->id()] = FALSE; + $this->messenger()->addError($this->t('Your transaction for this et_transaction has already been submitted.')); + $_SESSION['expense_tracker'][$this->et_transaction->id()] = FALSE; } } @@ -91,7 +91,7 @@ class EtTransactionViewForm extends FormBase implements BaseFormIdInterface { '#options' => $options, ); } - $form['#theme'] = 'expense_tracker_vote'; + $form['#theme'] = 'expense_tracker'; $form['#entity'] = $this->et_transaction; $form['#action'] = $this->et_transaction->toUrl()->setOption('query', \Drupal::destination()->getAsArray())->toString(); // Set a flag to hide results which will be removed if we want to view @@ -145,22 +145,14 @@ class EtTransactionViewForm extends FormBase implements BaseFormIdInterface { switch (TRUE) { // The "View results" button, when available, has been clicked. case $form_state->get('show_results'): - return TRUE; + return TRUE; // The et_transaction is closed. case ($et_transaction->isClosed()): - return TRUE; - - // Anonymous user is trying to view a et_transaction they aren't allowed to vote in. - case ($account->isAnonymous() && !$et_transaction->getAnonymousVoteAllow()): - return TRUE; - - // The user has already voted. - case ($et_transaction->hasUserVoted()): - return TRUE; + return TRUE; default: - return FALSE; + return FALSE; } } @@ -177,38 +169,27 @@ class EtTransactionViewForm extends FormBase implements BaseFormIdInterface { ]; if ($this->showResults($et_transaction, $form_state)) { - // Allow user to cancel their vote. + // Allow user to cancel their transaction. if ($this->isCancelAllowed($et_transaction)) { $actions['#type'] = 'actions'; $actions['cancel']['#type'] = 'submit'; $actions['cancel']['#button_type'] = 'primary'; - $actions['cancel']['#value'] = t('Cancel vote'); + $actions['cancel']['#value'] = t('Cancel transaction'); $actions['cancel']['#submit'] = array('::cancel'); $actions['cancel']['#ajax'] = $ajax; $actions['cancel']['#weight'] = '0'; } - if (!$et_transaction->hasUserVoted() && $et_transaction->isOpen() && $et_transaction->getAnonymousVoteAllow()) { - $actions['#type'] = 'actions'; - $actions['back']['#type'] = 'submit'; - $actions['back']['#button_type'] = 'primary'; - $actions['back']['#value'] = t('View et_transaction'); - $actions['back']['#submit'] = array('::back'); - $actions['back']['#ajax'] = $ajax; - $actions['back']['#weight'] = '0'; - } } else { $actions['#type'] = 'actions'; - $actions['vote']['#type'] = 'submit'; - $actions['vote']['#button_type'] = 'primary'; - $actions['vote']['#value'] = t('Vote'); - $actions['vote']['#validate'] = array('::validateVote'); - $actions['vote']['#submit'] = array('::save'); - $actions['vote']['#ajax'] = $ajax; - $actions['vote']['#weight'] = '0'; + $actions['transaction']['#type'] = 'submit'; + $actions['transaction']['#button_type'] = 'primary'; + $actions['transaction']['#submit'] = array('::save'); + $actions['transaction']['#ajax'] = $ajax; + $actions['transaction']['#weight'] = '0'; // View results before voting. - if ($et_transaction->result_vote_allow->value || $this->currentUser()->hasPermission('view et_transaction results')) { + if ($et_transaction->result_allow->value || $this->currentUser()->hasPermission('view et_transaction results')) { $actions['result']['#type'] = 'submit'; $actions['result']['#button_type'] = 'primary'; $actions['result']['#value'] = t('View results'); @@ -232,84 +213,22 @@ class EtTransactionViewForm extends FormBase implements BaseFormIdInterface { * * @return array $output */ - function showEtTransactionResults(EtTransactionInterface $et_transaction, $view_mode = 'default', $block = FALSE) { - - // Ensure that a page that shows et_transaction results can not be cached. - \Drupal::service('page_cache_kill_switch')->trigger(); - - $total_votes = 0; - foreach ($et_transaction->getVotes() as $vote) { - $total_votes += $vote; - } - - $options = $et_transaction->getOptions(); - $et_transaction_results = array(); - foreach ($et_transaction->getVotes() as $pid => $vote) { - $percentage = round($vote * 100 / max($total_votes, 1)); - $display_votes = (!$block) ? ' (' . \Drupal::translation() - ->formatPlural($vote, '1 vote', '@count votes') . ')' : ''; - - $et_transaction_results[] = array( - '#theme' => 'et_transaction_meter', - '#choice' => $options[$pid], - '#display_value' => t('@percentage%', array('@percentage' => $percentage)) . $display_votes, - '#min' => 0, - '#max' => $total_votes, - '#value' => $vote, - '#percentage' => $percentage, - '#attributes' => array('class' => array('bar')), - '#et_transaction' => $et_transaction, - ); - } - - /** @var \Drupal\et_transaction\EtTransactionVoteStorageInterface $vote_storage */ - $vote_storage = \Drupal::service('expense_tracker_vote.storage'); - $user_vote = $vote_storage->getUserVote($et_transaction); - - $output = array( - '#theme' => 'et_transaction_results', - '#raw_title' => $et_transaction->label(), - '#results' => $et_transaction_results, - '#votes' => $total_votes, - '#block' => $block, - '#pid' => $et_transaction->id(), - '#et_transaction' => $et_transaction, - '#view_mode' => $view_mode, - '#vote' => isset($user_vote['chid']) ? $user_vote['chid'] : NULL, - ); - - return $output; - } + function showEtTransactionResults(EtTransactionInterface $et_transaction, $view_mode = 'default', $block = FALSE) {} /** - * Cancel vote submit function. + * Cancel transaction submit function. * * @param array $form * The previous form. * @param \Drupal\Core\Form\FormStateInterface $form_state * The form state. */ - public function cancel(array $form, FormStateInterface $form_state) { - /** @var \Drupal\et_transaction\EtTransactionVoteStorageInterface $vote_storage */ - $vote_storage = \Drupal::service('expense_tracker_vote.storage'); - $vote_storage->cancelVote($this->et_transaction, $this->currentUser()); - \Drupal::logger('et_transaction')->notice('%user\'s vote in EtTransaction #%et_transaction deleted.', array( - '%user' => $this->currentUser()->id(), - '%et_transaction' => $this->et_transaction->id(), - )); - $this->messenger()->addMessage($this->t('Your vote was cancelled.')); - - // In case of an ajax submission, trigger a form rebuild so that we can - // return an updated form through the ajax callback. - if ($this->getRequest()->query->get('ajax_form')) { - $form_state->setRebuild(TRUE); - } - } + public function cancel(array $form, FormStateInterface $form_state) {} /** - * View vote results submit function. + * View transaction results submit function. * * @param array $form * @param \Drupal\Core\Form\FormStateInterface $form_state @@ -331,55 +250,20 @@ class EtTransactionViewForm extends FormBase implements BaseFormIdInterface { } /** - * Save a user's vote submit function. + * Save a user's transaction submit function. * * @param array $form * @param \Drupal\Core\Form\FormStateInterface $form_state */ - public function save(array $form, FormStateInterface $form_state) { - $options = array(); - $options['chid'] = $form_state->getValue('choice'); - $options['uid'] = $this->currentUser()->id(); - $options['pid'] = $form_state->getValue('et_transaction')->id(); - $options['hostname'] = \Drupal::request()->getClientIp(); - $options['timestamp'] = \Drupal::time()->getRequestTime(); - // Save vote. - /** @var \Drupal\et_transaction\EtTransactionVoteStorage $vote_storage */ - $vote_storage = \Drupal::service('expense_tracker_vote.storage'); - $vote_storage->saveVote($options); - $this->messenger()->addMessage($this->t('Your vote has been recorded.')); - - if ($this->currentUser()->isAnonymous()) { - // The vote is recorded so the user gets the result view instead of the - // voting form when viewing the et_transaction. Saving a value in $_SESSION has the - // convenient side effect of preventing the user from hitting the page - // cache. When anonymous voting is allowed, the page cache should only - // contain the voting form, not the results. - $_SESSION['expense_tracker_vote'][$form_state->getValue('et_transaction')->id()] = $form_state->getValue('choice'); - } - - // In case of an ajax submission, trigger a form rebuild so that we can - // return an updated form through the ajax callback. - if ($this->getRequest()->query->get('ajax_form')) { - $form_state->setRebuild(TRUE); - } - - // No explicit redirect, so that we stay on the current page, which might - // be the et_transaction form or another page that is displaying this et_transaction, for - // example as a block. - } + public function save(array $form, FormStateInterface $form_state) {} /** - * Validates the vote action. + * Validates the transaction action. * * @param array $form * @param \Drupal\Core\Form\FormStateInterface $form_state */ - public function validateVote(array &$form, FormStateInterface $form_state) { - if (!$form_state->hasValue('choice')) { - $form_state->setErrorByName('choice', $this->t('Your vote could not be recorded because you did not select any of the choices.')); - } - } + public function validateVote(array &$form, FormStateInterface $form_state) {} /** * Checks if the current user is allowed to cancel on the given et_transaction. @@ -389,17 +273,6 @@ class EtTransactionViewForm extends FormBase implements BaseFormIdInterface { * @return bool * TRUE if the user can cancel. */ - protected function isCancelAllowed(EtTransactionInterface $et_transaction) { - // Allow access if the user has voted. - return $et_transaction->hasUserVoted() - // And the et_transaction allows to cancel votes. - && $et_transaction->getCancelVoteAllow() - // And the user has the cancel own vote permission. - && $this->currentUser()->hasPermission('cancel own vote') - // And the user is authenticated or his session contains the voted flag. - && (\Drupal::currentUser()->isAuthenticated() || !empty($_SESSION['expense_tracker_vote'][$et_transaction->id()])) - // And et_transaction is open. - && $et_transaction->isOpen(); - } + protected function isCancelAllowed(EtTransactionInterface $et_transaction) {} } diff --git a/templates/et-transaction-results.html.twig b/templates/et-transaction-results.html.twig index 5e2cabe..d0c8904 100644 --- a/templates/et-transaction-results.html.twig +++ b/templates/et-transaction-results.html.twig @@ -6,12 +6,10 @@ * Variables available: * - title: The title of the et_transaction. * - results: The results of the et_transaction. - * - votes: The total results in the et_transaction. * - links: Links in the et_transaction. * - pid: The pid of the et_transaction - * - cancel_form: A form to cancel the user's vote, if allowed. + * - cancel_form: A form to cancel the user's transaction, if allowed. * - raw_links: The raw array of links. - * - vote: The choice number of the current user's vote. * * @see template_preprocess_et_transaction_results() * @@ -28,6 +26,6 @@ {{ results }} </dl> <div class="total"> - {% trans %}Total votes: {{ votes }}{% endtrans %} + {% trans %}Total transactions: {{ transactions }}{% endtrans %} </div> </div> diff --git a/templates/et-transaction-vote.html.twig b/templates/et-transaction-vote.html.twig deleted file mode 100644 index 29e8ffc..0000000 --- a/templates/et-transaction-vote.html.twig +++ /dev/null @@ -1,17 +0,0 @@ -{# -/** - */ -#} -{{ form.messages }} -<div class="et_transaction"> - <div class="vote-form"> - {% if show_title %} - <h3 class="et_transaction-title">{{ title }}</h3> - {% endif %} - - {{ form.choice }} - - {{ form.actions }} - </div> -{{ form|without('actions', 'choice', 'messages', 'title') }} -</div> -- GitLab