diff --git a/checklistapi.info.yml b/checklistapi.info.yml index 2f37097..8f3c04b 100644 --- a/checklistapi.info.yml +++ b/checklistapi.info.yml @@ -1,7 +1,7 @@ name: Checklist API type: module description: Provides an API for creating fillable, persistent checklists. +version: VERSION package: Other -version: 8.x-1.x core: 8.x -configure: checklistapi.admin_index \ No newline at end of file +configure: checklistapi.report diff --git a/checklistapi.module b/checklistapi.module index c1a5f91..6ec8c57 100644 --- a/checklistapi.module +++ b/checklistapi.module @@ -18,9 +18,9 @@ function checklistapi_menu_link_defaults() { // Checklists report. $links['admin/reports/checklistapi'] = array( - 'link_title' => 'Checklists', + 'link_title' => 'Checklists', 'description' => 'Get an overview of your installed checklists with progress details.', - 'route_name' => 'checklistapi.admin_index', + 'route_name' => 'checklistapi.report', 'parent' => 'system.admin.reports', ); diff --git a/checklistapi.routing.yml b/checklistapi.routing.yml index 6ca5711..46df682 100644 --- a/checklistapi.routing.yml +++ b/checklistapi.routing.yml @@ -1,10 +1,10 @@ -checklistapi.admin_index: - path: '/admin/reports/checklistapi' +checklistapi.report: + path: /admin/reports/checklistapi defaults: - _content: '\Drupal\checklistapi\Controller\ChecklistapiController::adminOverview' - _title: 'Checklists' + _content: \Drupal\checklistapi\Controller\ChecklistapiController::report + _title: Checklists requirements: - _permission: 'view checklistapi checklists report' - + _permission: view checklistapi checklists report + route_callbacks: - - '\Drupal\checklistapi\Routing\ChecklistapiRouteSubscriber::routes' + - \Drupal\checklistapi\Routing\ChecklistapiRouteSubscriber::routes diff --git a/checklistapi_example/checklistapi_example.info.yml b/checklistapi_example/checklistapi_example.info.yml index beddaf4..4bd0aac 100644 --- a/checklistapi_example/checklistapi_example.info.yml +++ b/checklistapi_example/checklistapi_example.info.yml @@ -1,6 +1,9 @@ name: Checklist API example type: module -description: rovides an example implementation of the Checklist API. -package: Other -version: 8.x-1.x -core: 8.x \ No newline at end of file +description: Provides an example implementation of the Checklist API. +version: VERSION +package: Example modules +core: 8.x +dependencies: + - checklistapi +configure: checklistapi.checklists.example_checklist diff --git a/lib/Drupal/checklistapi/Access/ChecklistapiAccessCheck.php b/lib/Drupal/checklistapi/Access/ChecklistapiAccessCheck.php index 1e29ffd..27d7d71 100644 --- a/lib/Drupal/checklistapi/Access/ChecklistapiAccessCheck.php +++ b/lib/Drupal/checklistapi/Access/ChecklistapiAccessCheck.php @@ -15,19 +15,12 @@ use Symfony\Component\Routing\Route; class ChecklistapiAccessCheck implements AccessInterface { /** - * The key used by the routing requirement. - * - * @var string - */ - protected $requirementsKey = '_checklistapi_access'; - - /** * {@inheritdoc} */ public function access(Route $route, Request $request, AccountInterface $account) { $op = $request->attributes->get('op'); $op = !empty($op) ? $op : 'any'; - return checklistapi_checklist_access($request->attributes->get('plugin_id'), $op) ? static::ALLOW : static::DENY; + return checklistapi_checklist_access($request->attributes->get('checklist_id'), $op) ? static::ALLOW : static::DENY; } } diff --git a/lib/Drupal/checklistapi/ChecklistapiChecklist.php b/lib/Drupal/checklistapi/ChecklistapiChecklist.php index 66a61fa..0830e63 100644 --- a/lib/Drupal/checklistapi/ChecklistapiChecklist.php +++ b/lib/Drupal/checklistapi/ChecklistapiChecklist.php @@ -83,13 +83,20 @@ class ChecklistapiChecklist { public $savedProgress; /** + * The configuration object for saving progress. + * + * @var \Drupal\Core\Config\Config + */ + public $config; + + /** * Constructs a ChecklistapiChecklist object. * * @param array $definition * A checklist definition, as returned by checklistapi_get_checklist_info(). */ public function __construct(array $definition) { - $config = \Drupal::config('checklistapi.progress'); + $this->config = \Drupal::config('checklistapi.progress'); foreach (element_children($definition) as $group_key) { $this->numberOfItems += count(element_children($definition[$group_key])); @@ -100,7 +107,7 @@ class ChecklistapiChecklist { $property_name = checklistapi_strtolowercamel(drupal_substr($property_key, 1)); $this->$property_name = $value; } - $this->savedProgress = $config->get($this->getSavedProgressVariableName()); + $this->savedProgress = $this->config->get($this->getSavedProgressVariableName()); } /** @@ -170,9 +177,7 @@ class ChecklistapiChecklist { * Deletes the Drupal variable containing the checklist's saved progress. */ public function clearSavedProgress() { - $config = \Drupal::config('checklistapi.progress'); - - $config->set($this->getSavedProgressVariableName(), 0)->save(); + $this->config->set($this->getSavedProgressVariableName(), 0)->save(); drupal_set_message(t('%title saved progress has been cleared.', array( '%title' => $this->title, @@ -196,9 +201,7 @@ class ChecklistapiChecklist { * TRUE if the checklist has saved progress, or FALSE if it doesn't. */ public function hasSavedProgress() { - $config = \Drupal::config('checklistapi.progress'); - - return (bool) $config->get($this->getSavedProgressVariableName()); + return (bool) $this->config->get($this->getSavedProgressVariableName()); } /** @@ -210,7 +213,6 @@ class ChecklistapiChecklist { * @see checklistapi_checklist_form_submit() */ public function saveProgress(array $values) { - $config = \Drupal::config('checklistapi.progress'); $user = \Drupal::currentUser(); $time = time(); @@ -268,7 +270,7 @@ class ChecklistapiChecklist { // saved progress variable. This simplifies use with Strongarm. ksort($progress); - $config->set($this->getSavedProgressVariableName(), $progress); + $this->config->set($this->getSavedProgressVariableName(), $progress); drupal_set_message(format_plural( $num_changed_items, '%title progress has been saved. 1 item changed.', @@ -276,7 +278,7 @@ class ChecklistapiChecklist { array('%title' => $this->title) )); - $config->save(); + $this->config->save(); } /** diff --git a/lib/Drupal/checklistapi/Controller/ChecklistapiController.php b/lib/Drupal/checklistapi/Controller/ChecklistapiController.php index c311a5b..4ad2119 100644 --- a/lib/Drupal/checklistapi/Controller/ChecklistapiController.php +++ b/lib/Drupal/checklistapi/Controller/ChecklistapiController.php @@ -2,7 +2,7 @@ /** * @file - * Contains \Drupal\system\Form\SiteInformationForm. + * Contains \Drupal\checklistapi\Controller\ChecklistapiController. */ namespace Drupal\checklistapi\Controller; @@ -10,22 +10,20 @@ namespace Drupal\checklistapi\Controller; use Drupal\Core\Controller\ControllerBase; /** - * Configure site information settings for this site. + * Controller for Checklist API. */ class ChecklistapiController extends ControllerBase { /** - * Callback for the admin overview route. + * Returns the Checklists report. */ - public function adminOverview() { - + public function report() { // Define table header. $header = array( - array( - 'data' => t('Checklist'), - ), + array('data' => t('Checklist')), array( 'data' => t('Progress'), + 'class' => array(RESPONSIVE_PRIORITY_MEDIUM), ), array( 'data' => t('Last updated'), @@ -35,10 +33,7 @@ class ChecklistapiController extends ControllerBase { 'data' => t('Last updated by'), 'class' => array(RESPONSIVE_PRIORITY_LOW), ), - array( - 'data' => t('Operations'), - 'class' => array(RESPONSIVE_PRIORITY_LOW), - ), + array('data' => t('Operations')), ); // Build table rows. @@ -58,19 +53,35 @@ class ChecklistapiController extends ControllerBase { )); $row[] = $checklist->getLastUpdatedDate(); $row[] = $checklist->getLastUpdatedUser(); - $row[] = ($checklist->userHasAccess('edit') && $checklist->hasSavedProgress()) ? l(t('clear saved progress'), $checklist->path . '/clear', array( - 'query' => array('destination' => 'admin/reports/checklistapi'), - )) : ''; + if ($checklist->userHasAccess('edit') && $checklist->hasSavedProgress()) { + $row[] = array( + 'data' => array( + '#type' => 'operations', + '#links' => array( + 'clear' => array( + 'title' => t('Clear'), + 'href' => "{$checklist->path}/clear", + 'query' => array('destination' => 'admin/reports/checklistapi'), + ), + ), + ), + ); + } + else { + $row[] = ''; + } $rows[] = $row; } - $render_array['table'] = array( + // Compile output. + $output['table'] = array( '#theme' => 'table', '#header' => $header, '#rows' => $rows, + '#empty' => t('No checklists available.'), ); - return $render_array; + return $output; } /** diff --git a/lib/Drupal/checklistapi/Form/ChecklistapiChecklistClearConfirmForm.php b/lib/Drupal/checklistapi/Form/ChecklistapiChecklistClearConfirmForm.php deleted file mode 100644 index 88e2857..0000000 --- a/lib/Drupal/checklistapi/Form/ChecklistapiChecklistClearConfirmForm.php +++ /dev/null @@ -1,85 +0,0 @@ -clearSavedProgress(); - } - - // Redirect back to checklist. - $form_state['redirect'] = $form['#checklist']->path; - } - - /** - * {@inheritdoc} - */ - public function getFormId() { - return 'checklistapi_checklist_clear_confirm'; - } -} diff --git a/lib/Drupal/checklistapi/Form/ChecklistapiChecklistClearForm.php b/lib/Drupal/checklistapi/Form/ChecklistapiChecklistClearForm.php new file mode 100644 index 0000000..08166d0 --- /dev/null +++ b/lib/Drupal/checklistapi/Form/ChecklistapiChecklistClearForm.php @@ -0,0 +1,91 @@ +checklist->id}"); + } + + /** + * {@inheritdoc} + */ + public function getDescription() { + return t('All progress details for %checklist will be erased. This action cannot be undone.', array( + '%checklist' => $this->checklist->title, + )); + } + + /** + * {@inheritdoc} + */ + public function getConfirmText() { + return t('Clear'); + } + + /** + * {@inheritdoc} + */ + public function getCancelText() { + return t('Cancel'); + } + + /** + * {@inheritdoc} + */ + public function buildForm(array $form, array &$form_state, $checklist_id = NULL) { + $this->checklist = checklistapi_checklist_load($checklist_id); + $form['#checklist'] = $this->checklist; + return parent::buildForm($form, $form_state); + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, array &$form_state) { + // Clear saved progress. + $form['#checklist']->clearSavedProgress(); + + // Redirect back to checklist. + $form_state['redirect'] = $form['#checklist']->path; + } +} diff --git a/lib/Drupal/checklistapi/Form/ChecklistapiDefinitionForm.php b/lib/Drupal/checklistapi/Form/ChecklistapiChecklistForm.php similarity index 96% rename from lib/Drupal/checklistapi/Form/ChecklistapiDefinitionForm.php rename to lib/Drupal/checklistapi/Form/ChecklistapiChecklistForm.php index 8a33b87..c62341a 100644 --- a/lib/Drupal/checklistapi/Form/ChecklistapiDefinitionForm.php +++ b/lib/Drupal/checklistapi/Form/ChecklistapiChecklistForm.php @@ -2,7 +2,7 @@ /** * @file - * Contains \Drupal\checklistapi\Form\ChecklistapiDefinitionForm. + * Contains \Drupal\checklistapi\Form\ChecklistapiChecklistForm. */ namespace Drupal\checklistapi\Form; @@ -12,7 +12,7 @@ use Drupal\Core\Form\FormInterface; /** * todo */ -class ChecklistapiDefinitionForm implements FormInterface { +class ChecklistapiChecklistForm implements FormInterface { /** * {@inheritdoc} @@ -24,8 +24,8 @@ class ChecklistapiDefinitionForm implements FormInterface { /** * {@inheritdoc} */ - public function buildForm(array $form, array &$form_state, $plugin_id = NULL) { - $form['#checklist'] = $checklist = checklistapi_checklist_load($plugin_id); + public function buildForm(array $form, array &$form_state, $checklist_id = NULL) { + $form['#checklist'] = $checklist = checklistapi_checklist_load($checklist_id); $form['progress_bar'] = array( '#type' => 'markup', diff --git a/lib/Drupal/checklistapi/Routing/ChecklistapiRouteSubscriber.php b/lib/Drupal/checklistapi/Routing/ChecklistapiRouteSubscriber.php index 4855133..85029f7 100644 --- a/lib/Drupal/checklistapi/Routing/ChecklistapiRouteSubscriber.php +++ b/lib/Drupal/checklistapi/Routing/ChecklistapiRouteSubscriber.php @@ -7,15 +7,16 @@ namespace Drupal\checklistapi\Routing; +use Drupal\Core\Routing\RouteSubscriberBase; use Symfony\Component\Routing\Route; /** - * Listens to the dynamic checklistapi route events. + * Listens to the dynamic route events. */ -class ChecklistapiRouteSubscriber { +class ChecklistapiRouteSubscriber extends RouteSubscriberBase { /** - * Provides dynamic routes for various checklistapi pages. + * Provides dynamic routes for Checklist API. * * @return \Symfony\Component\Routing\Route[] * An array of route objects. @@ -23,44 +24,35 @@ class ChecklistapiRouteSubscriber { public function routes() { $routes = array(); foreach (checklistapi_get_checklist_info() as $id => $definition) { + // Ignore incomplete definitions. if (empty($definition['#path']) || empty($definition['#title'])) { continue; } - $routes['checklistapi.definition_' . $id] = new Route( - $definition['#path'], - array( - '_title' => $definition['#title'], - '_form' => '\Drupal\checklistapi\Form\ChecklistapiDefinitionForm', - 'plugin_id' => $id, - ), - array( - '_checklistapi_access' => 'TRUE', - ) - ); - $routes['checklistapi.definition_' . $id . '_compact'] = new Route( - $definition['#path'] . '/compact/{mode}', - array( - '_title' => 'Compact mode', - '_content' => '\Drupal\checklistapi\Controller\ChecklistapiController::setCompact', - 'plugin_id' => $id, - 'mode' => 'off', - ), - array( - '_checklistapi_access' => 'TRUE', - ) - ); - $routes['checklistapi.definition_' . $id . '_clear'] = new Route( - $definition['#path'] . '/clear', - array( - '_title' => 'Clear', - '_form' => '\Drupal\checklistapi\Form\ChecklistapiChecklistClearConfirmForm', - 'plugin_id' => $id, - 'op' => 'edit', - ), - array( - '_checklistapi_access' => 'TRUE', - ) - ); + + // View/edit checklist. + $routes["checklistapi.checklists.{$id}"] = new Route($definition['#path'], array( + '_title' => $definition['#title'], + '_form' => '\Drupal\checklistapi\Form\ChecklistapiChecklistForm', + 'checklist_id' => $id, + 'op' => 'any', + ), $requirements = array('_checklistapi_access' => 'TRUE')); + + // Clear saved progress. + $routes["checklistapi.checklists.{$id}.clear"] = new Route($definition['#path'] . '/clear', array( + '_title' => 'Clear', + '_form' => '\Drupal\checklistapi\Form\ChecklistapiChecklistClearForm', + 'checklist_id' => $id, + 'op' => 'edit', + ), $requirements); + + // Toggle compact mode. + $routes["checklistapi.checklists.{$id}.compact"] = new Route($definition['#path'] . '/compact/{mode}', array( + '_title' => 'Compact mode', + '_content' => '\Drupal\checklistapi\Controller\ChecklistapiController::setCompact', + 'checklist_id' => $id, + 'op' => 'any', + 'mode' => 'off', + ), $requirements); return $routes; }