├── .gitignore ├── .github └── pull_request_template.md ├── assets └── logo.png ├── docs ├── development │ ├── third-party │ │ ├── drupal │ │ │ ├── index.md │ │ │ ├── routing-sytem.md │ │ │ ├── forms.md │ │ │ └── services-dependency-injection.md │ │ └── drone.md │ ├── feature-development.md │ ├── configuration-management.md │ ├── release-workflow.md │ ├── ci-deployment-workflow.md │ ├── code-reviews.md │ ├── development-workflow.md │ ├── module-update-policy.md │ ├── dependency-management-and-patching.md │ ├── coding-standards.md │ ├── content-architecture.md │ ├── automated-testing.md │ ├── testing.md │ └── tooling.md ├── templates │ ├── pull-request-template.md │ └── issue-template.md ├── starting │ ├── repository-scaffolding.md │ └── solution-definition.md ├── initiative │ ├── code-of-conduct.md │ ├── contribution-workflow.md │ ├── release-cycle.md │ └── how-to-contribute.md └── openeuropa-components.md ├── README.md └── LICENCE.txt /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ../docs/templates/pull-request-template.md -------------------------------------------------------------------------------- /assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openeuropa/documentation/HEAD/assets/logo.png -------------------------------------------------------------------------------- /docs/development/third-party/drupal/index.md: -------------------------------------------------------------------------------- 1 | # Drupal development 2 | 3 | Some resources to supoprt development in Drupal: 4 | 5 | - [Routing system](routing-sytem.md) 6 | - [Services dependency injection](services-dependency-injection.md) 7 | - [Form System](forms.md) 8 | -------------------------------------------------------------------------------- /docs/templates/pull-request-template.md: -------------------------------------------------------------------------------- 1 | ## OPENEUROPA-[Insert ticket number here] 2 | 3 | ### Description 4 | 5 | [Insert description here] 6 | 7 | ### Changelog 8 | 9 | - Added: 10 | - Changed: 11 | - Deprecated: 12 | - Removed: 13 | - Fixed: 14 | - Security: 15 | -------------------------------------------------------------------------------- /docs/development/feature-development.md: -------------------------------------------------------------------------------- 1 | # Feature implementation 2 | 3 | Definition of mandatory steps of feature development 4 | 5 | -- TO BE DEFINED -- 6 | 7 | ## Purpose and scope 8 | 9 | ## Implementation 10 | 11 | ## Reviewing performance/security/configuration management 12 | 13 | ## Feature Documentation 14 | 15 | ## Feature Test coverage 16 | -------------------------------------------------------------------------------- /docs/development/configuration-management.md: -------------------------------------------------------------------------------- 1 | # Configuration management 2 | 3 | OpenEuropa components are responsible for shipping with the configuration defaults. After installation, the site owners take ownership over this configuration. 4 | 5 | During the development life-cycle of a component, the maintainers undertake to make updates to these configuration values and provide upgrade paths whenever it makes sense. -------------------------------------------------------------------------------- /docs/development/release-workflow.md: -------------------------------------------------------------------------------- 1 | # Release workflow 2 | 3 | OpenEuropa components follow a semantic version release cycle. For more information about this, go [here](../initiative/release-cycle.md). 4 | 5 | They are released every time the maintainers decide enough functionality has been included to create a new minor version or when the new functionality is needed by an existing European Commission distribution. 6 | 7 | Patch (or security) updates can be done more often and as needed. -------------------------------------------------------------------------------- /docs/development/ci-deployment-workflow.md: -------------------------------------------------------------------------------- 1 | # CI Deployment Workflow 2 | 3 | OpenEuropa is using [Drone](https://drone.fpfis.eu) for continuous integration and continuous delivery of its components. It is integrated with the Github repositories in order to trigger automatically build pipelines for commits and pull requests. 4 | 5 | You can see a default Drone pipeline configuration in the [Drupal module template repository](https://github.com/openeuropa/drupal-module-template/blob/master/.drone.yml). -------------------------------------------------------------------------------- /docs/starting/repository-scaffolding.md: -------------------------------------------------------------------------------- 1 | # Repository scaffolding 2 | 3 | Repositories follow a certain structure that allows for a fast and easy development setup. 4 | 5 | Creating new Drupal module repositories can be done by using the [OpenEuropa module template](https://github.com/openeuropa/drupal-module-template). 6 | 7 | In addition, the OpenEuropa project also provides a [site template](https://github.com/openeuropa/drupal-site-template) that can be used to quickly set up a site using a lightweight profile and the more common components already included. -------------------------------------------------------------------------------- /docs/development/code-reviews.md: -------------------------------------------------------------------------------- 1 | # Code reviews 2 | 3 | Pull Requests introducing changes in the Openeuropa components are manually reviewed. 4 | 5 | The following aspects should be checked: 6 | - Implementation follows the ticket instruction and the defined solution. 7 | - Correct code split between components, and inside components correct split between services, plugins, .module file, and .install file. 8 | - Prefixing on configuration provided. 9 | - Type-hinting for code that is not inherited. 10 | - Comments explain complex logic. 11 | - Test cover introduced all introduced functionality. 12 | -------------------------------------------------------------------------------- /docs/development/development-workflow.md: -------------------------------------------------------------------------------- 1 | # Development workflow 2 | 3 | OpenEuropa component development starts from business requirements provided by the European Commission to support various corporate solutions. 4 | 5 | The DIGIT core team responsible for the OpenEuropa project analyses these requirements and turns them into generic technical solutions that could support these business goals as well as others. 6 | 7 | After the completion of a given requirement in the component, if the latter is used in any European Commission distribution, it is updated and configured to meet the original business requirement. -------------------------------------------------------------------------------- /docs/starting/solution-definition.md: -------------------------------------------------------------------------------- 1 | # Solution definition 2 | 3 | Solution definition for OpenEuropa components is defined by OpenEuropa Solution design team. 4 | Major changes or introductions of new components respect a defined workflow. 5 | 6 | For work in new components, the following needs to happen: 7 | - Technical proposal by development team and validated by the Solutions Design Team. 8 | - Code repository correctly created and handed over to dev team. 9 | - Future maintainership of the component is clear and assigned before the work is started. 10 | 11 | For small changes in existing components: 12 | - Discuss with OpenEuropa team by opening an issue on Github or ping on #openeuropa slack chat 13 | - Create a PR on the component 14 | - Component maintainers will review and approve 15 | -------------------------------------------------------------------------------- /docs/templates/issue-template.md: -------------------------------------------------------------------------------- 1 | ### Prerequisites 2 | 3 | Check completed tasks from the checklist below: 4 | 5 | - [ ] Reproduced the problem in the component's latest version. 6 | - [ ] Read the associated Readme and user guides for common solutions. 7 | - [ ] Checked that your issue isn't already filed [here](https://github.com/issues?utf8=✓&q=is%3Aissue+user%3Aopeneuropa) 8 | - [ ] Checked that there is not already an OpenEuropa component that provides the described functionality: [OpenEuropa component list](openeuropa-components.md) 9 | 10 | ### Description 11 | 12 | [Description of the issue] 13 | 14 | ### Steps to reproduce 15 | 16 | 1. [First Step] 17 | 2. [Second Step] 18 | 3. [and so on...] 19 | 20 | **Expected behavior:** [What you expect to happen] 21 | 22 | **Actual behavior:** [What actually happens] 23 | 24 | **Reproduces how often:** [What percentage of the time does it reproduce?] 25 | 26 | ### Versions 27 | 28 | Please add the version of the component you found the bug in. 29 | 30 | ### Additional information 31 | 32 | Any additional information, configuration or data that might be necessary to reproduce the issue. -------------------------------------------------------------------------------- /docs/development/module-update-policy.md: -------------------------------------------------------------------------------- 1 | # Module update policy 2 | 3 | Drupal modules are updated using the [update API for Drupal 8][1] by implementing the following hooks: 4 | 5 | - [`hook_update_N`][2] 6 | - [`hook_post_update_NAME`][3] 7 | 8 | Since `hook_post_update_NAME` hooks are executed alphabetically we prepend `_NAME` with an incremental numeric string, 9 | so that we can be sure they are executed in the right order. 10 | 11 | Our current convention is a 5-digits numeric string starting from `00001`, as shown below: 12 | 13 | ``` 14 | /** 15 | * A meaningful comment describing the first update. 16 | */ 17 | function MY_MODULE_post_update_00001() { ... } 18 | 19 | /** 20 | * Another meaningful comment describing the second update. 21 | */ 22 | function MY_MODULE_post_update_00002() { ... } 23 | ``` 24 | 25 | We suggest not to append anything after the sequence number as doing so will eliminate the risk of having hooks with the same number. Instead, we suggest to add a meaningful comment on top of each hook, that will be displayed when running `drush updb`. 26 | 27 | [1]: https://www.drupal.org/docs/8/api/update-api/introduction-to-update-api-for-drupal-8 28 | [2]: https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Extension!module.api.php/function/hook_update_N 29 | [3]: https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Extension!module.api.php/function/hook_post_update_NAME 30 | -------------------------------------------------------------------------------- /docs/development/dependency-management-and-patching.md: -------------------------------------------------------------------------------- 1 | # Dependency management 2 | 3 | OpenEuropa components often depend on external libraries or Drupal modules. These are included in the component's `composer.json` file but their version 4 | is not locked using a `composer.lock` file. This means that every time the component is installed for development purposes, it will use the latest version 5 | of its dependencies. 6 | 7 | In order to ensure that components works with a wide range of dependency versions, the Drone-based continuous integration pipelines install and test them using 8 | both the lowest and highest version of the dependencies allowed in the `composer.json` file. You can see how this is set up in the [Drupal module template repository](https://github.com/openeuropa/drupal-module-template/blob/master/.drone.yml). 9 | 10 | Components made for Drupal modules can and very often do include submodules that may have their own dependencies which are not necessarily needed by the parent component as a whole or the other submodules. 11 | In such cases, the dependencies are not declared in the `composer.json` of the main component but are mentioned in the submodule's README file. They are however included in the list of Composer development dependencies 12 | so that they can be loaded and tested during the development of the component. 13 | 14 | Dependencies can also be patched using the Composer-based patching plugin. However, if patches are needed for production use (as opposed to patching development dependencies), they should be declared in the component README file. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

| Component | 16 |Status | 17 |
|---|---|
|
20 | OpenEuropa Authentication 21 | This module allows to authenticate users against the European Commission login service. Details of this service can be found here. 22 | |
23 |
24 | |
|
30 | OpenEuropa Content 31 | This component ships with corporate and standardised content and entity types, as well as content modelling and handling functionalities. 32 | Additionally, it uses the OpenEuropa RDF SKOS component to integrate the Publications Office (OP) vocabularies. 33 | |
34 |
35 | |
|
41 | OpenEuropa Corporate Blocks 42 | This simple component contains the European Commission corporate blocks meant to display standardised parts of EC sites, such as the footer. It integrates with the OpenEuropa Theme for styling. 43 | |
44 |
45 | |
|
51 | OpenEuropa Drupal Module Template 52 | Builds the default files for a component to be used with the OpenEuropa project. 53 | |
54 |
55 | |
59 |
|
62 | OpenEuropa Editorial 63 | This component provides various editorial features (workflow, versioning, etc), shipped as indiviual submodules. 64 | |
65 |
66 | |
70 |
|
73 | OpenEuropa Link Lists 74 | This component provides site building features that allow the creation of lists of links, external and to internal content, dynamic and manual. 75 | |
76 |
77 | |
81 |
|
84 | OpenEuropa Media 85 | This component provides functionality for using Media of various types. Things like images, remote videos and integration with the EC AV Portal service are included. 86 | |
87 |
88 | |
|
94 | OpenEuropa Multilingual 95 | This component provides EC corporate multilingual features such as the official EU languages, language switcher, language negotiation, etc. 96 | |
97 |
98 | |
|
104 | OpenEuropa Paragraphs 105 | This component provides various Drupal paragraph types meant that display using the ECL components via the OpenEuropa Theme. 106 | |
107 |
108 | |
|
114 | OpenEuropa Profile 115 | A basic installation profile that can be used for sites that use OpenEuropa components. 116 | |
117 |
118 | |
|
124 | OpenEuropa RDF SKOS 125 | An RDF Entity based implementation for SKOS vocabularies located in triple stores. This can be used for integrating the taxonomies provided by the EC Publications Office (OP). See also the OpenEuropa Content component. 126 | |
127 |
128 | |
|
134 | OpenEuropa Search 135 | This component provides corporate search functionalities. 136 | |
137 |
138 | |
|
144 | OpenEuropa Theme 145 | Drupal 10 theme based on the Europa Component Library (ECL). 146 | |
147 |
148 | |
|
154 | OpenEuropa Translation 155 | This component provides translation capabilities for multilingual sites and integrations with various external translation services such as DGT Poetry. 156 | |
157 |
158 | |
|
164 | OpenEuropa Webtools 165 | This component provides integration with the EC Webtools service for various widgets and functionalities such as analytics, LACO, cookie consent, etc. 166 | |
167 |
168 | |
|
174 | OpenEuropa Time Caching 175 | The OpenEuropa Time Caching provides a cache tag service to generate and invalidate cache tags that deal with time. 176 | |
177 |
178 | |
|
184 | OpenEuropa oEmbed 185 | The OpenEuropa oEmbed module allows the embedding of entities into content in an agnostic (non-Drupal) way. 186 | |
187 |
188 | |
|
194 | Open Vocabularies 195 | The Open Vocabularies module allows users to choose how a piece of content will be categorised without having to change the related content type field definition. 196 | |
197 |
198 | |
|
204 | OpenEuropa Corporate Site Information 205 | The OpenEuropa Corporate Site Information module provides corporate information about the site, such as site owner, content owners, etc. 206 | |
207 |
208 | |
|
214 | OpenEuropa Newsroom 215 | The OpenEuropa oe_newsroom provides integration with the Newsroom service. 216 | |
217 |
218 | |
|
224 | OpenEuropa GraphQL 225 | GraphQL integration module for OpenEuropa components, based on the GraphQL Core Schema module. 226 | |
227 |
228 | |
|
234 | OpenEuropa Agenda 235 | Drupal module that exposes an agenda. The module defines the Agenda, Day, and Session sub-entity types and their default bundles. 236 | |
237 |
238 | |
|
244 | OpenEuropa Starter Content 245 | The OpenEuropa Starter Content provides a series of content types to quickstart a project. 246 | |
247 |
248 | |
|
254 | OpenEuropa Content Extra 255 | Enhances the basic OpenEuropa Content module with additional fields and entity types. 256 | |
257 |
258 | |
|
264 | OpenEuropa Subscriptions 265 | The OpenEuropa Subscriptions module provides a system that allows both registered users and anonymous visitors to subscribe to content and receive notifications using the Message stack and Symfony Mailer. 266 | |
267 |
268 | |
|
274 | OpenEuropa Bootstrap base theme 275 | Drupal theme based on Bootstrap 5, UI Patterns and the OpenEuropa Bootstrap Component Library. 276 | |
277 |
278 | |
|
284 | OpenEuropa Whitelabel theme 285 | Sub-theme of OpenEuropa Bootstrap base theme, with theming for OpenEuropa library features. 286 | |
287 |
288 | |
|
294 | OpenEuropa Showcase 295 | Installation profile to demo openeuropa library features. 296 | |
297 |
298 | |
|
304 | OpenEuropa List Pages 305 | The OpenEuropa List Pages component allows creation and management of list pages with configurable options. 306 | |
307 |
308 | |
|
314 | OpenEuropa Corporate countries 315 | This module provides integration of EC Corporate countries with Drupal. 316 | |
317 |
318 | |
|
324 | OpenEuropa Contact Forms 325 | This is a Drupal module that is an extension to drupal core contact forms and defines the European Commission corporate forms. 326 | |
327 |
328 | |
|
334 | OpenEuropa Dashboard Agent 335 | Drupal module that integrates with the central Dashboard. 336 | |
337 |
338 | |
| Component | 349 |Status | 350 |
|---|---|
|
353 | Behat Transformation Context 354 | This package provides a Behat context allowing to transform human readable labels to selectors or page paths. 355 | |
356 |
357 | |
360 |
|
363 | Code Review 364 | Automated quality assurance checks based on GrumPHP. 365 | |
366 |
367 | |
|
373 | Code Review Drupal 374 | Extends the Code Review with Drupal based rules. 375 | |
376 |
377 | |
|
383 | Code Review Library 384 | Coding standard dependencies for PHP libraries. 385 | |
386 |
387 | |
|
393 | Composer artifacts 394 | Composer plugin that allows to download a specified artifact instead of the project source. 395 | |
396 |
397 | |
|
403 | Drupal Core require dev 404 | This package provides the require dependencies of drupal/core as a standalone package. 405 | |
406 |
407 | |
|
413 | ECL Twig loader 414 | Twig loader for Europa Component Library, it allows to load components by accessing them via a configurable ecl-twig-loaderspace. 415 | |
416 |
417 | |
|
423 | Task Runner 424 | PHP task runner based on Robo, focused on extensibility. 425 | |
426 |
427 | |
|
433 | Webtools Geolocation provider 434 | This is a provider for the Geocoder PHP library that integrates the Webtools Geolocation service from the European Commission. 435 | |
436 |
437 | |
|
443 | Europa Search Client 444 | Europa Search Client is a library offering a PHP API to consume Europa Search services. 445 | |
446 |
447 | |
|
453 | Content layer development triple store 454 | Triple storage containing default data to kick-start content layer local development based on OpenLink Virtuoso. 455 | |
456 |
457 | |
|
463 | ePoetry PHP client 464 | PHP client for the ePoetry service. 465 | |
466 |
467 | |
|
473 | ePoetry PHP client 474 | PHP client for the ePoetry service. 475 | |
476 |
477 | |
|
483 | OpenEuropa Task Runner: Drupal project symlink 484 | The Drupal project symlink "Task Runner command aims at simplifying Drupal development, when using a Composer-based workflow. 485 | |
486 |
487 | |
|
493 | OpenEuropa CDT Client 494 | CDT Client is a library offering a PHP API to consume Translation Centre For the Bodies of the EU services. 495 | |
496 |
497 | |