From 484fb5a1194eb7572e4f3452d6db0bae3acc138a Mon Sep 17 00:00:00 2001 From: naomi Date: Sat, 14 Apr 2018 12:26:09 +0200 Subject: [PATCH] Added activity entity --- modules/zencrm_entities/activity.page.inc | 30 +++ .../config/schema/activity_type.schema.yml | 12 + .../src/ActivityAccessControlHandler.php | 47 ++++ .../src/ActivityHtmlRouteProvider.php | 56 +++++ .../src/ActivityListBuilder.php | 40 ++++ .../src/ActivityTranslationHandler.php | 14 ++ .../src/ActivityTypeHtmlRouteProvider.php | 28 +++ .../src/ActivityTypeListBuilder.php | 32 +++ .../zencrm_entities/src/Entity/Activity.php | 224 ++++++++++++++++++ .../src/Entity/ActivityInterface.php | 77 ++++++ .../src/Entity/ActivityType.php | 58 +++++ .../src/Entity/ActivityTypeInterface.php | 13 + .../src/Entity/ActivityViewsData.php | 24 ++ .../src/Form/ActivityDeleteForm.php | 15 ++ .../zencrm_entities/src/Form/ActivityForm.php | 50 ++++ .../src/Form/ActivitySettingsForm.php | 53 +++++ .../src/Form/ActivityTypeDeleteForm.php | 53 +++++ .../src/Form/ActivityTypeForm.php | 65 +++++ .../activity-content-add-list.html.twig | 23 ++ .../templates/activity.html.twig | 22 ++ .../zencrm_entities.links.action.yml | 11 + .../zencrm_entities.links.menu.yml | 18 ++ .../zencrm_entities.links.task.yml | 18 ++ .../zencrm_entities/zencrm_entities.module | 26 ++ .../zencrm_entities.permissions.yml | 19 ++ 25 files changed, 1028 insertions(+) create mode 100644 modules/zencrm_entities/activity.page.inc create mode 100644 modules/zencrm_entities/config/schema/activity_type.schema.yml create mode 100644 modules/zencrm_entities/src/ActivityAccessControlHandler.php create mode 100644 modules/zencrm_entities/src/ActivityHtmlRouteProvider.php create mode 100644 modules/zencrm_entities/src/ActivityListBuilder.php create mode 100644 modules/zencrm_entities/src/ActivityTranslationHandler.php create mode 100644 modules/zencrm_entities/src/ActivityTypeHtmlRouteProvider.php create mode 100644 modules/zencrm_entities/src/ActivityTypeListBuilder.php create mode 100644 modules/zencrm_entities/src/Entity/Activity.php create mode 100644 modules/zencrm_entities/src/Entity/ActivityInterface.php create mode 100644 modules/zencrm_entities/src/Entity/ActivityType.php create mode 100644 modules/zencrm_entities/src/Entity/ActivityTypeInterface.php create mode 100644 modules/zencrm_entities/src/Entity/ActivityViewsData.php create mode 100644 modules/zencrm_entities/src/Form/ActivityDeleteForm.php create mode 100644 modules/zencrm_entities/src/Form/ActivityForm.php create mode 100644 modules/zencrm_entities/src/Form/ActivitySettingsForm.php create mode 100644 modules/zencrm_entities/src/Form/ActivityTypeDeleteForm.php create mode 100644 modules/zencrm_entities/src/Form/ActivityTypeForm.php create mode 100644 modules/zencrm_entities/templates/activity-content-add-list.html.twig create mode 100644 modules/zencrm_entities/templates/activity.html.twig diff --git a/modules/zencrm_entities/activity.page.inc b/modules/zencrm_entities/activity.page.inc new file mode 100644 index 0000000..b625101 --- /dev/null +++ b/modules/zencrm_entities/activity.page.inc @@ -0,0 +1,30 @@ +isPublished()) { + return AccessResult::allowedIfHasPermission($account, 'view unpublished activity entities'); + } + return AccessResult::allowedIfHasPermission($account, 'view published activity entities'); + + case 'update': + return AccessResult::allowedIfHasPermission($account, 'edit activity entities'); + + case 'delete': + return AccessResult::allowedIfHasPermission($account, 'delete activity entities'); + } + + // Unknown operation, no opinion. + return AccessResult::neutral(); + } + + /** + * {@inheritdoc} + */ + protected function checkCreateAccess(AccountInterface $account, array $context, $entity_bundle = NULL) { + return AccessResult::allowedIfHasPermission($account, 'add activity entities'); + } + +} diff --git a/modules/zencrm_entities/src/ActivityHtmlRouteProvider.php b/modules/zencrm_entities/src/ActivityHtmlRouteProvider.php new file mode 100644 index 0000000..995afa5 --- /dev/null +++ b/modules/zencrm_entities/src/ActivityHtmlRouteProvider.php @@ -0,0 +1,56 @@ +id(); + + if ($settings_form_route = $this->getSettingsFormRoute($entity_type)) { + $collection->add("$entity_type_id.settings", $settings_form_route); + } + + return $collection; + } + + /** + * Gets the settings form route. + * + * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type + * The entity type. + * + * @return \Symfony\Component\Routing\Route|null + * The generated route, if available. + */ + protected function getSettingsFormRoute(EntityTypeInterface $entity_type) { + if (!$entity_type->getBundleEntityType()) { + $route = new Route("/admin/structure/{$entity_type->id()}/settings"); + $route + ->setDefaults([ + '_form' => 'Drupal\zencrm_entities\Form\ActivitySettingsForm', + '_title' => "{$entity_type->getLabel()} settings", + ]) + ->setRequirement('_permission', $entity_type->getAdminPermission()) + ->setOption('_admin_route', TRUE); + + return $route; + } + } + +} diff --git a/modules/zencrm_entities/src/ActivityListBuilder.php b/modules/zencrm_entities/src/ActivityListBuilder.php new file mode 100644 index 0000000..5a46cd9 --- /dev/null +++ b/modules/zencrm_entities/src/ActivityListBuilder.php @@ -0,0 +1,40 @@ +t('Activity ID'); + $header['name'] = $this->t('Name'); + return $header + parent::buildHeader(); + } + + /** + * {@inheritdoc} + */ + public function buildRow(EntityInterface $entity) { + /* @var $entity \Drupal\zencrm_entities\Entity\Activity */ + $row['id'] = $entity->id(); + $row['name'] = Link::createFromRoute( + $entity->label(), + 'entity.activity.edit_form', + ['activity' => $entity->id()] + ); + return $row + parent::buildRow($entity); + } + +} diff --git a/modules/zencrm_entities/src/ActivityTranslationHandler.php b/modules/zencrm_entities/src/ActivityTranslationHandler.php new file mode 100644 index 0000000..97653bd --- /dev/null +++ b/modules/zencrm_entities/src/ActivityTranslationHandler.php @@ -0,0 +1,14 @@ +t('Activity type'); + $header['id'] = $this->t('Machine name'); + return $header + parent::buildHeader(); + } + + /** + * {@inheritdoc} + */ + public function buildRow(EntityInterface $entity) { + $row['label'] = $entity->label(); + $row['id'] = $entity->id(); + // You probably want a few more properties here... + return $row + parent::buildRow($entity); + } + +} diff --git a/modules/zencrm_entities/src/Entity/Activity.php b/modules/zencrm_entities/src/Entity/Activity.php new file mode 100644 index 0000000..e361038 --- /dev/null +++ b/modules/zencrm_entities/src/Entity/Activity.php @@ -0,0 +1,224 @@ + \Drupal::currentUser()->id(), + ]; + } + + /** + * {@inheritdoc} + */ + public function getName() { + return $this->get('name')->value; + } + + /** + * {@inheritdoc} + */ + public function setName($name) { + $this->set('name', $name); + return $this; + } + + /** + * {@inheritdoc} + */ + public function getCreatedTime() { + return $this->get('created')->value; + } + + /** + * {@inheritdoc} + */ + public function setCreatedTime($timestamp) { + $this->set('created', $timestamp); + return $this; + } + + /** + * {@inheritdoc} + */ + public function getOwner() { + return $this->get('user_id')->entity; + } + + /** + * {@inheritdoc} + */ + public function getOwnerId() { + return $this->get('user_id')->target_id; + } + + /** + * {@inheritdoc} + */ + public function setOwnerId($uid) { + $this->set('user_id', $uid); + return $this; + } + + /** + * {@inheritdoc} + */ + public function setOwner(UserInterface $account) { + $this->set('user_id', $account->id()); + return $this; + } + + /** + * {@inheritdoc} + */ + public function isPublished() { + return (bool) $this->getEntityKey('status'); + } + + /** + * {@inheritdoc} + */ + public function setPublished($published) { + $this->set('status', $published ? TRUE : FALSE); + return $this; + } + + /** + * {@inheritdoc} + */ + public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { + $fields = parent::baseFieldDefinitions($entity_type); + + $fields['user_id'] = BaseFieldDefinition::create('entity_reference') + ->setLabel(t('Authored by')) + ->setDescription(t('The user ID of author of the Activity entity.')) + ->setRevisionable(TRUE) + ->setSetting('target_type', 'user') + ->setSetting('handler', 'default') +# ->setDisplayOptions('view', [ +# 'label' => 'hidden', +# 'type' => 'author', +# 'weight' => 0, +# ]) +# ->setDisplayOptions('form', [ +# 'type' => 'entity_reference_autocomplete', +# 'weight' => 5, +# 'settings' => [ +# 'match_operator' => 'CONTAINS', +# 'size' => '60', +# 'autocomplete_type' => 'tags', +# 'placeholder' => '', +# ], +# ]) +# ->setDisplayConfigurable('form', TRUE) +# ->setDisplayConfigurable('view', TRUE); + ->setTranslatable(TRUE); + + $fields['name'] = BaseFieldDefinition::create('string') + ->setLabel(t('Name')) + ->setDescription(t('The name of the Activity entity.')) + ->setSettings([ + 'max_length' => 50, + 'text_processing' => 0, + ]) + ->setDefaultValue('') + ->setDisplayOptions('view', [ + 'label' => 'above', + 'type' => 'string', + 'weight' => -4, + ]) + ->setDisplayOptions('form', [ + 'type' => 'string_textfield', + 'weight' => -4, + ]) + ->setDisplayConfigurable('form', TRUE) + ->setDisplayConfigurable('view', TRUE) + ->setRequired(TRUE); + + $fields['status'] = BaseFieldDefinition::create('boolean') + ->setLabel(t('Publishing status')) + ->setDescription(t('A boolean indicating whether the Activity is published.')) + ->setDefaultValue(TRUE) + ->setDisplayOptions('form', [ + 'type' => 'boolean_checkbox', + 'weight' => -3, + ]); + + $fields['created'] = BaseFieldDefinition::create('created') + ->setLabel(t('Created')) + ->setDescription(t('The time that the entity was created.')); + + $fields['changed'] = BaseFieldDefinition::create('changed') + ->setLabel(t('Changed')) + ->setDescription(t('The time that the entity was last edited.')); + + return $fields; + } + +} diff --git a/modules/zencrm_entities/src/Entity/ActivityInterface.php b/modules/zencrm_entities/src/Entity/ActivityInterface.php new file mode 100644 index 0000000..2529255 --- /dev/null +++ b/modules/zencrm_entities/src/Entity/ActivityInterface.php @@ -0,0 +1,77 @@ +entity; + + return $form; + } + + /** + * {@inheritdoc} + */ + public function save(array $form, FormStateInterface $form_state) { + $entity = $this->entity; + + $status = parent::save($form, $form_state); + + switch ($status) { + case SAVED_NEW: + drupal_set_message($this->t('Created the %label Activity.', [ + '%label' => $entity->label(), + ])); + break; + + default: + drupal_set_message($this->t('Saved the %label Activity.', [ + '%label' => $entity->label(), + ])); + } + $form_state->setRedirect('entity.activity.canonical', ['activity' => $entity->id()]); + } + +} diff --git a/modules/zencrm_entities/src/Form/ActivitySettingsForm.php b/modules/zencrm_entities/src/Form/ActivitySettingsForm.php new file mode 100644 index 0000000..5eaf677 --- /dev/null +++ b/modules/zencrm_entities/src/Form/ActivitySettingsForm.php @@ -0,0 +1,53 @@ +t('Are you sure you want to delete %name?', ['%name' => $this->entity->label()]); + } + + /** + * {@inheritdoc} + */ + public function getCancelUrl() { + return new Url('entity.activity_type.collection'); + } + + /** + * {@inheritdoc} + */ + public function getConfirmText() { + return $this->t('Delete'); + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, FormStateInterface $form_state) { + $this->entity->delete(); + + drupal_set_message( + $this->t('content @type: deleted @label.', + [ + '@type' => $this->entity->bundle(), + '@label' => $this->entity->label(), + ] + ) + ); + + $form_state->setRedirectUrl($this->getCancelUrl()); + } + +} diff --git a/modules/zencrm_entities/src/Form/ActivityTypeForm.php b/modules/zencrm_entities/src/Form/ActivityTypeForm.php new file mode 100644 index 0000000..be3b89f --- /dev/null +++ b/modules/zencrm_entities/src/Form/ActivityTypeForm.php @@ -0,0 +1,65 @@ +entity; + $form['label'] = [ + '#type' => 'textfield', + '#title' => $this->t('Label'), + '#maxlength' => 255, + '#default_value' => $activity_type->label(), + '#description' => $this->t("Label for the Activity type."), + '#required' => TRUE, + ]; + + $form['id'] = [ + '#type' => 'machine_name', + '#default_value' => $activity_type->id(), + '#machine_name' => [ + 'exists' => '\Drupal\zencrm_entities\Entity\ActivityType::load', + ], + '#disabled' => !$activity_type->isNew(), + ]; + + /* You will need additional form elements for your custom properties. */ + + return $form; + } + + /** + * {@inheritdoc} + */ + public function save(array $form, FormStateInterface $form_state) { + $activity_type = $this->entity; + $status = $activity_type->save(); + + switch ($status) { + case SAVED_NEW: + drupal_set_message($this->t('Created the %label Activity type.', [ + '%label' => $activity_type->label(), + ])); + break; + + default: + drupal_set_message($this->t('Saved the %label Activity type.', [ + '%label' => $activity_type->label(), + ])); + } + $form_state->setRedirectUrl($activity_type->toUrl('collection')); + } + +} diff --git a/modules/zencrm_entities/templates/activity-content-add-list.html.twig b/modules/zencrm_entities/templates/activity-content-add-list.html.twig new file mode 100644 index 0000000..0c627f6 --- /dev/null +++ b/modules/zencrm_entities/templates/activity-content-add-list.html.twig @@ -0,0 +1,23 @@ +{# +/** + * @file + * Default theme implementation to present a list of custom content entity types/bundles. + * + * Available variables: + * - types: A collection of all the available custom entity types/bundles. + * Each type/bundle contains the following: + * - link: A link to add a content entity of this type. + * - description: A description of this content entity types/bundle. + * + * @see template_preprocess_activity_content_add_list() + * + * @ingroup themeable + */ +#} +{% spaceless %} +
+ {% for type in types %} +
{{ type.link }}
+ {% endfor %} +
+{% endspaceless %} diff --git a/modules/zencrm_entities/templates/activity.html.twig b/modules/zencrm_entities/templates/activity.html.twig new file mode 100644 index 0000000..682cbc6 --- /dev/null +++ b/modules/zencrm_entities/templates/activity.html.twig @@ -0,0 +1,22 @@ +{# +/** + * @file activity.html.twig + * Default theme implementation to present Activity data. + * + * This template is used when viewing Activity pages. + * + * + * Available variables: + * - content: A list of content items. Use 'content' to print all content, or + * - attributes: HTML attributes for the container element. + * + * @see template_preprocess_activity() + * + * @ingroup themeable + */ +#} + + {% if content %} + {{- content -}} + {% endif %} + diff --git a/modules/zencrm_entities/zencrm_entities.links.action.yml b/modules/zencrm_entities/zencrm_entities.links.action.yml index 20bba41..52962cd 100644 --- a/modules/zencrm_entities/zencrm_entities.links.action.yml +++ b/modules/zencrm_entities/zencrm_entities.links.action.yml @@ -41,3 +41,14 @@ entity.case_entity_type.add_form: appears_on: - entity.case_entity_type.collection +entity.activity.add_form: + route_name: entity.activity.add_page + title: 'Add Activity' + appears_on: + - entity.activity.collection +entity.activity_type.add_form: + route_name: entity.activity_type.add_form + title: 'Add Activity type' + appears_on: + - entity.activity_type.collection + diff --git a/modules/zencrm_entities/zencrm_entities.links.menu.yml b/modules/zencrm_entities/zencrm_entities.links.menu.yml index 60664c4..5c70787 100644 --- a/modules/zencrm_entities/zencrm_entities.links.menu.yml +++ b/modules/zencrm_entities/zencrm_entities.links.menu.yml @@ -90,3 +90,21 @@ entity.case_entity_type.collection: parent: system.admin_structure weight: 99 + +# Activity menu items definition +entity.activity.collection: + title: 'Activity list' + route_name: entity.activity.collection + description: 'List Activity entities' + parent: system.admin_structure + weight: 100 + + +# Activity type menu items definition +entity.activity_type.collection: + title: 'Activity type' + route_name: entity.activity_type.collection + description: 'List Activity type (bundles)' + parent: system.admin_structure + weight: 99 + diff --git a/modules/zencrm_entities/zencrm_entities.links.task.yml b/modules/zencrm_entities/zencrm_entities.links.task.yml index b21d97e..c9d127f 100644 --- a/modules/zencrm_entities/zencrm_entities.links.task.yml +++ b/modules/zencrm_entities/zencrm_entities.links.task.yml @@ -122,3 +122,21 @@ entity.case_entity.delete_form: title: Delete weight: 10 +# Activity routing definition + +entity.activity.canonical: + route_name: entity.activity.canonical + base_route: entity.activity.canonical + title: 'View' + +entity.activity.edit_form: + route_name: entity.activity.edit_form + base_route: entity.activity.canonical + title: 'Edit' + +entity.activity.delete_form: + route_name: entity.activity.delete_form + base_route: entity.activity.canonical + title: Delete + weight: 10 + diff --git a/modules/zencrm_entities/zencrm_entities.module b/modules/zencrm_entities/zencrm_entities.module index 2d142af..064515a 100644 --- a/modules/zencrm_entities/zencrm_entities.module +++ b/modules/zencrm_entities/zencrm_entities.module @@ -81,6 +81,16 @@ function zencrm_entities_theme() { 'variables' => ['content' => NULL], 'file' => 'case_entity.page.inc', ]; + $theme['activity'] = [ + 'render element' => 'elements', + 'file' => 'activity.page.inc', + 'template' => 'activity', + ]; + $theme['activity_content_add_list'] = [ + 'render element' => 'content', + 'variables' => ['content' => NULL], + 'file' => 'activity.page.inc', + ]; return $theme; } @@ -115,3 +125,19 @@ function zencrm_entities_theme_suggestions_case_entity(array $variables) { $suggestions[] = 'case_entity__' . $entity->id() . '__' . $sanitized_view_mode; return $suggestions; } + +/** +* Implements hook_theme_suggestions_HOOK(). +*/ +function zencrm_entities_theme_suggestions_activity(array $variables) { + $suggestions = []; + $entity = $variables['elements']['#activity']; + $sanitized_view_mode = strtr($variables['elements']['#view_mode'], '.', '_'); + + $suggestions[] = 'activity__' . $sanitized_view_mode; + $suggestions[] = 'activity__' . $entity->bundle(); + $suggestions[] = 'activity__' . $entity->bundle() . '__' . $sanitized_view_mode; + $suggestions[] = 'activity__' . $entity->id(); + $suggestions[] = 'activity__' . $entity->id() . '__' . $sanitized_view_mode; + return $suggestions; +} diff --git a/modules/zencrm_entities/zencrm_entities.permissions.yml b/modules/zencrm_entities/zencrm_entities.permissions.yml index 90c6ab4..8f61d6c 100644 --- a/modules/zencrm_entities/zencrm_entities.permissions.yml +++ b/modules/zencrm_entities/zencrm_entities.permissions.yml @@ -135,3 +135,22 @@ view published case entity entities: view unpublished case entity entities: title: 'View unpublished Case entity entities' +add activity entities: + title: 'Create new Activity entities' + +administer activity entities: + title: 'Administer Activity entities' + description: 'Allow to access the administration form to configure Activity entities.' + restrict access: true + +delete activity entities: + title: 'Delete Activity entities' + +edit activity entities: + title: 'Edit Activity entities' + +view published activity entities: + title: 'View published Activity entities' + +view unpublished activity entities: + title: 'View unpublished Activity entities'