Browse Source

Content modeling overhaul (#86)

* Derivatives

* Working through testing

* Coding standards.  Responding to @whikloj's review

* Patching up existing tests

* Baaad merge

* No longer requiring Content-Disposition for media updates since we're updating the file in place.

* Went a bit deeper than I thought.  Small refactor on MediaSourceServcie

* Fiiinnnnaaaalllllllllyyyyyyyy

* Shuffling things around for islandora_image tests

* Altering view and form modes using context

* Coding standards

* Features

* updating feature

* updating feature

* Derivatives and RDF

* Terms flushing to Fedora, split out openseadragon functionality

* Updating dependencies

* Touching up after testing a fresh deploy

* More config updates

* Updating features

* s/field_memberof/field_member_of

* Coding standards and tests

* take that phpcpd

* coding standards

* Adding pcdm#fileOf to the rdf mappings for media.

* Getting rid of swap file

* Updated README.  Shuffled config round into two features, one for core and one as a demo

* Coder

* too good to be true

* maybe this?

* Cleaning up cruft and no longer removing teaser mode when uninstalling the demo feature

* Missed the services yml

* Re-export after testing

* mimetypo

* Re-re-re-re-re-exported

* Changing to dc on terms rdf mapping so title shows up in Fedora
pull/756/head
dannylamb 7 years ago committed by Seth Shaw
parent
commit
a1987aecb7
  1. BIN
      .islandora.services.yml.swp
  2. 4
      .travis.yml
  3. 205
      README.md
  4. 13
      composer.json
  5. 41
      config/install/core.entity_form_display.media.tn.default.yml
  6. 36
      config/install/core.entity_form_display.media.tn.inline.yml
  7. 13
      config/install/core.entity_form_mode.media.inline.yml
  8. 37
      config/install/core.entity_view_display.media.tn.content.yml
  9. 76
      config/install/core.entity_view_display.media.tn.default.yml
  10. 14
      config/install/core.entity_view_mode.media.content.yml
  11. 22
      config/install/field.field.media.tn.field_mimetype.yml
  12. 5
      config/install/islandora.settings.yml
  13. 22
      config/install/media_entity.bundle.tn.yml
  14. 13
      config/install/system.action.delete_media.yml
  15. 13
      config/install/system.action.delete_media_and_file.yml
  16. 47
      config/schema/islandora.schema.yml
  17. 13
      islandora.info.yml
  18. 11
      islandora.links.action.yml
  19. 295
      islandora.module
  20. 8
      islandora.permissions.yml
  21. 32
      islandora.routing.yml
  22. 26
      islandora.services.yml
  23. 9
      migrate/tags.csv
  24. 41
      modules/islandora_core_feature/config/install/core.entity_view_display.media.audio.source.yml
  25. 38
      modules/islandora_core_feature/config/install/core.entity_view_display.media.file.source.yml
  26. 43
      modules/islandora_core_feature/config/install/core.entity_view_display.media.image.source.yml
  27. 44
      modules/islandora_core_feature/config/install/core.entity_view_display.media.video.source.yml
  28. 12
      modules/islandora_core_feature/config/install/core.entity_view_mode.media.source.yml
  29. 100
      modules/islandora_core_feature/config/install/features.bundle.islandora.yml
  30. 25
      modules/islandora_core_feature/config/install/field.field.media.audio.field_file_size.yml
  31. 29
      modules/islandora_core_feature/config/install/field.field.media.audio.field_media_audio_file.yml
  32. 23
      modules/islandora_core_feature/config/install/field.field.media.audio.field_media_of.yml
  33. 21
      modules/islandora_core_feature/config/install/field.field.media.audio.field_mime_type.yml
  34. 23
      modules/islandora_core_feature/config/install/field.field.media.audio.field_tags.yml
  35. 25
      modules/islandora_core_feature/config/install/field.field.media.file.field_file_size.yml
  36. 30
      modules/islandora_core_feature/config/install/field.field.media.file.field_media_file.yml
  37. 23
      modules/islandora_core_feature/config/install/field.field.media.file.field_media_of.yml
  38. 21
      modules/islandora_core_feature/config/install/field.field.media.file.field_mime_type.yml
  39. 23
      modules/islandora_core_feature/config/install/field.field.media.file.field_tags.yml
  40. 25
      modules/islandora_core_feature/config/install/field.field.media.image.field_file_size.yml
  41. 13
      modules/islandora_core_feature/config/install/field.field.media.image.field_height.yml
  42. 30
      modules/islandora_core_feature/config/install/field.field.media.image.field_media_image.yml
  43. 23
      modules/islandora_core_feature/config/install/field.field.media.image.field_media_of.yml
  44. 21
      modules/islandora_core_feature/config/install/field.field.media.image.field_mime_type.yml
  45. 23
      modules/islandora_core_feature/config/install/field.field.media.image.field_tags.yml
  46. 13
      modules/islandora_core_feature/config/install/field.field.media.image.field_width.yml
  47. 25
      modules/islandora_core_feature/config/install/field.field.media.video.field_file_size.yml
  48. 23
      modules/islandora_core_feature/config/install/field.field.media.video.field_media_of.yml
  49. 29
      modules/islandora_core_feature/config/install/field.field.media.video.field_media_video_file.yml
  50. 21
      modules/islandora_core_feature/config/install/field.field.media.video.field_mime_type.yml
  51. 23
      modules/islandora_core_feature/config/install/field.field.media.video.field_tags.yml
  52. 25
      modules/islandora_core_feature/config/install/field.field.taxonomy_term.tags.field_external_uri.yml
  53. 22
      modules/islandora_core_feature/config/install/field.storage.media.field_file_size.yml
  54. 7
      modules/islandora_core_feature/config/install/field.storage.media.field_height.yml
  55. 17
      modules/islandora_core_feature/config/install/field.storage.media.field_media_audio_file.yml
  56. 26
      modules/islandora_core_feature/config/install/field.storage.media.field_media_file.yml
  57. 16
      modules/islandora_core_feature/config/install/field.storage.media.field_media_image.yml
  58. 17
      modules/islandora_core_feature/config/install/field.storage.media.field_media_of.yml
  59. 25
      modules/islandora_core_feature/config/install/field.storage.media.field_media_video_file.yml
  60. 11
      modules/islandora_core_feature/config/install/field.storage.media.field_mime_type.yml
  61. 17
      modules/islandora_core_feature/config/install/field.storage.media.field_tags.yml
  62. 7
      modules/islandora_core_feature/config/install/field.storage.media.field_width.yml
  63. 12
      modules/islandora_core_feature/config/install/field.storage.node.field_member_of.yml
  64. 21
      modules/islandora_core_feature/config/install/field.storage.taxonomy_term.field_external_uri.yml
  65. 17
      modules/islandora_core_feature/config/install/media.type.audio.yml
  66. 17
      modules/islandora_core_feature/config/install/media.type.file.yml
  67. 19
      modules/islandora_core_feature/config/install/media.type.image.yml
  68. 17
      modules/islandora_core_feature/config/install/media.type.video.yml
  69. 31
      modules/islandora_core_feature/config/install/migrate_plus.migration.islandora_tags.yml
  70. 12
      modules/islandora_core_feature/config/install/migrate_plus.migration_group.islandora.yml
  71. 45
      modules/islandora_core_feature/config/install/rdf.mapping.media.audio.yml
  72. 25
      modules/islandora_core_feature/config/install/rdf.mapping.media.file.yml
  73. 51
      modules/islandora_core_feature/config/install/rdf.mapping.media.image.yml
  74. 45
      modules/islandora_core_feature/config/install/rdf.mapping.media.video.yml
  75. 30
      modules/islandora_core_feature/config/install/rdf.mapping.taxonomy_term.tags.yml
  76. 46
      modules/islandora_core_feature/config/install/rest.resource.entity.file.yml
  77. 46
      modules/islandora_core_feature/config/install/rest.resource.entity.media.yml
  78. 46
      modules/islandora_core_feature/config/install/rest.resource.entity.node.yml
  79. 46
      modules/islandora_core_feature/config/install/rest.resource.entity.taxonomy_term.yml
  80. 7
      modules/islandora_core_feature/config/install/system.action.delete_file_from_fedora.yml
  81. 7
      modules/islandora_core_feature/config/install/system.action.delete_media_from_triplestore.yml
  82. 7
      modules/islandora_core_feature/config/install/system.action.delete_node_from_fedora.yml
  83. 7
      modules/islandora_core_feature/config/install/system.action.delete_node_from_triplestore.yml
  84. 15
      modules/islandora_core_feature/config/install/system.action.delete_taxonomy_term_in_fedora.yml
  85. 15
      modules/islandora_core_feature/config/install/system.action.delete_taxonomy_term_in_triplestore.yml
  86. 7
      modules/islandora_core_feature/config/install/system.action.index_file_in_fedora.yml
  87. 7
      modules/islandora_core_feature/config/install/system.action.index_media_in_fedora.yml
  88. 7
      modules/islandora_core_feature/config/install/system.action.index_media_in_triplestore.yml
  89. 7
      modules/islandora_core_feature/config/install/system.action.index_node_in_fedora.yml
  90. 7
      modules/islandora_core_feature/config/install/system.action.index_node_in_triplestore.yml
  91. 15
      modules/islandora_core_feature/config/install/system.action.index_taxonomy_term_in_fedora.yml
  92. 15
      modules/islandora_core_feature/config/install/system.action.index_taxonomy_term_in_the_triplestore.yml
  93. 11
      modules/islandora_core_feature/config/install/taxonomy.vocabulary.tags.yml
  94. 422
      modules/islandora_core_feature/config/install/views.view.display_media.yml
  95. 12
      modules/islandora_core_feature/config/install/views.view.file_checksum.yml
  96. 342
      modules/islandora_core_feature/config/install/views.view.manage_members.yml
  97. 1235
      modules/islandora_core_feature/config/install/views.view.media_of.yml
  98. 255
      modules/islandora_core_feature/config/install/views.view.members.yml
  99. 2
      modules/islandora_core_feature/islandora_core_feature.features.yml
  100. 26
      modules/islandora_core_feature/islandora_core_feature.info.yml
  101. Some files were not shown because too many files have changed in this diff Show More

BIN
.islandora.services.yml.swp

Binary file not shown.

4
.travis.yml

@ -22,8 +22,8 @@ install:
- $SCRIPT_DIR/travis_setup_drupal.sh - $SCRIPT_DIR/travis_setup_drupal.sh
- git -C "$TRAVIS_BUILD_DIR" checkout -b travis-testing - git -C "$TRAVIS_BUILD_DIR" checkout -b travis-testing
- cd $DRUPAL_DIR; - cd $DRUPAL_DIR;
- php -dmemory_limit=-1 $COMPOSER_PATH config repositories.local path "$TRAVIS_BUILD_DIR" - COMPOSER_MEMORY_LIMIT=-1 php -d memory_limit=-1 $COMPOSER_PATH config repositories.local path "$TRAVIS_BUILD_DIR"
- php -dmemory_limit=-1 $COMPOSER_PATH require "islandora/islandora:dev-travis-testing as dev-8.x-1.x" --prefer-source --update-with-dependencies - COMPOSER_MEMORY_LIMIT=-1 php -d memory_limit=-1 $COMPOSER_PATH require "islandora/islandora:dev-travis-testing as dev-8.x-1.x" --prefer-source --update-with-dependencies
- cd web; drush --uri=127.0.0.1:8282 en -y islandora - cd web; drush --uri=127.0.0.1:8282 en -y islandora
script: script:

205
README.md

@ -5,51 +5,201 @@
## Introduction ## Introduction
CLAW's core Islandora module for Drupal 8.x Islandora is a module that turns a Drupal 8 site into a control panel for your digital repository. Through a user
interface, it allows repository administrators to
- Persist digital content in a Fedora repository
- Model digital content using core Drupal entities (nodes, media, files, and taxonomy terms). Currently, there is
support for
- collections
- images
- binary files (including PDfs)
- audio
- video
- Design forms for editing metadata
- Control the display and theming of digital content
- Perform full text searching of content and metadata
- Bulk ingest content (using Drupal's migrate framework)
- Administer fine grained access control
- Index RDF metadata in a triplestore
- Generate derivative files, such as web quality represenations.
- Currently, only image derivatives are supported (requires islandora_image), but more to come.
- Apply bulk operations to lists of content (re-index content, regenerate derivatives, etc...)
- And much, much more...
Content in an Islandora repository is treated as ordinary Drupal content, so the entire Drupal ecosystem of contributed
modules is at your disposal. In fact, Islandora uses many contributed modules itself, including the extremely powerful
and flexible `context` module. The `context` module allows users to do many things through a UI that normally would
require programming custom modules or themes. Want to show certain users a simplified form for data entry? Want to
give each collection a different theme? Want to give anonymous users a restricted view? All of this can be done using
the `context` module. It is similar to the `rules` module, and it allows repository administrators to filter repository events (view, create,
update, delete, etc...) by the criteria of their choice and respond by executing configurable actions.
## Requirements / Installation
Setting up a full digital repsository is a daunting task involving many moving parts on one or more servers. To make things
easier to get started, you can fully bootstrap a complete repository solution using our Ansible installer, claw-playbook.
It can install both to a local Vagrant environment for development purposes, or it can install to one or more remote servers
by providing your own playbook. By default you'll get one server with everything on it (i.e. the kitchen sink install). But
we have broken down each component into its own Ansible role, so more advanced users can create customized builds containing
only what their needs require. See the README for more details.
## Configuration
If you want to get up and running as quickly as possible, import the `islanora_demo_feature` feature to install example configuration
and bootstrap your site. If you're starting from scratch, then _at a minimum_, you must:
1. Set the url to your message broker at `admin/config/islandora`
1. Enable the `islandora_core_feature` module, then visit `admin/config/development/features` and import its config. It contains
everything required for basic content modeling. You can also use drush to import the feature
`drush -y fim --bundle=islandora islandora_core_feature`.
1. Run the migration to load the taxonomy terms required by Islandora. This can be done by visiting `admin/structure/migrate`, or executed via drush
`drush -l http://localhost:8000 mim --group=islandora`.
## Content Modeling
Islandora uses core Drupal 8 functionality for modeling content. Most core content entities are utilized:
1. Nodes
1. Nodes hold descriptive and structural metadata about objects in your repository. Membership between nodes (e.g. members
of a collection, or pages of a book) is denoted with `field_member_of`, which is provided by `islandora_core_feature`.
Additional behavior can be controlled by tagging nodes with taxonomy terms using `field_tags`.
1. Media
1. Media hold technical metadata for the files they represent. There are four core media types, used for audio, video,
images, and generic files. Media are associated with a node using `field_media_of`, which is provided by `islandora_core_feature`.
The role of the media is indicated by tagging it with a taxonomy term using `field_tags`. For example,
tagging a media as 'Preservation Master' indicates that it is the master archival copy of a file, while 'Service File' would
indicate that it is a lower quality derivative intended to be shown to the average user.
1. Files
1. Files hold the binary conents that are described by Media. They often created along with a media to hold its technical metadata,
but can be created and then later associted with a Media in a separate process.
1. Taxonomy Terms
1. Taxonomy terms are used to tag nodes and media so they can be classified, organized, and acted upon. They must contain a
`field_external_uri` field that holds an external URI for the term from a controlled vocabulary / ontology. The `islandora_core_feature`
provides a migration that can be executed to load all of the required terms for basic use into your repository.
The `islandora_demo_feature` provides a complete example of content modeling in Islandora for audio, video, files, and images, including
tiff and JP2 support (e.g. large images). This includes some more advanced techniques, like switching display modes based on
taxonomy terms so 'images' and 'large images' can share a metadata profile but be displayed differently. It also includes
example actions for generating image derivatives (using the `islandora_image` module). You may not, however, want all of this functionality.
In fact, this feature is not meant to be the end-all-be-all of content modeling, but serves as an example of how it's done using
Islandora. You can take as much or as little of it as you'd like. If you're doing you're own thing, the gist is:
- When making your own content type, it will require `field_member_of`, `field_tags`, and an rdf mapping.
- When making your own media type, it will require `field_media_of`, `field_tags`, `field_mimetype`, an rdf mapping, and a field to hold the file.
You can re-use `field_media_file`, `field_media_image`, `field_media_audio`, and `field_media_video` to do so. Media should
always be tagged (`field_tags`) with a term from the pcdmuse ontology (preservation master, service file, thumbnail image) to denote its usage.
- When making your own taxonomy vocabulary, its terms will require `field_external_uri` and an rdf mapping.
- All rdf mappings need to map the `changed` time to `schema:dateModified`.
## Actions
Islandora provides several useful actions for repository administrators that can be configured and executed through the user
interface. Any view can expose bulk operations by adding a `Bulk update` field to its display.
Islandora also provides a thin wrapper around Actions so that they can be used in conjunction with the `context` module.
Repository events for indexing, deletion, and derivative generation are all handled by selecting one or more preconfigured
actions using the `context` user interface.
### Delete Media
You can use the `Delete media` action to bulk delete media, but not delete source files.
### Delete Media and File(s)
You can use the `Delete media and file(s)` action to bulk delete media and their source files.
### Emit Node/Media/File/Term Event
You can use `Emit a * event to a queue/topic` actions to produce messages so background processes can consume them and
perform work. The `islandora_core_feature` contains several preconfigured actions to perform indexing and removal
operations for Fedora and a triplestore.
## Installation ## REST API
For a fully automated install, see [claw-playbook](https://github.com/Islandora-Devops/claw-playbook). If you're installing Islandora has a light, mostly RESTful HTTP API that relies heavily on Drupal's core Rest module. The majority of what Islandora
manually, then _at a minimum_, the REST configuration for Nodes, Media, and Files need to be enabled with `jwt_auth` for provides is Link headers in GET and HEAD responses. These headers can be used to locate related resources and navigate your
authentication on all methods. The `json` and `jsonld` formats need to be enabled for for GET requests. Only the `json` fomat repository. In addition to these link headers, there are additional endpoints exposed for uploading files, as well as a couple
is required for POST, PATCH, and DELETE requests. of useful REST exports.
This can be done using the Rest UI module by setting granularity to 'Method'. If you want to use GET requests through a browser, ### Exposed Headers
you'll want to enable `cookie` authentication. And if you want to use a username/password with cURL, you'll want to enable `basic
authentication`.
![screenshot from 2018-03-09 10-09-57](https://user-images.githubusercontent.com/20773151/37212586-caf31dc8-2385-11e8-8122-1608dacbfb5f.png) #### Referenced taxonomy terms (Nodes and Media)
If you want to import the configuration through Drupal's configuration synchronization tools, you can use these yaml files The taxonomy terms used to tag content are exposed as link headers with `rel="tag"` and a title equal to the taxonomy term's display
from claw-playbook for [Nodes](https://github.com/Islandora-Devops/claw-playbook/blob/master/roles/internal/webserver-app/files/rest.resource.entity.node.yml), label. If the term has an external uri in a controlled vocabulary, then that uri is provided. Otherwise, the local Drupal uri is
[Media](https://github.com/Islandora-Devops/claw-playbook/blob/master/roles/internal/webserver-app/files/rest.resource.entity.media.yml), provided. For example, if a piece of content is tagged with `taxonomy/term/1`, which has a display label of "Example Term", then the
and [Files](https://github.com/Islandora-Devops/claw-playbook/blob/master/roles/internal/webserver-app/files/rest.resource.entity.file.yml). link header returned in a GET or HEAD response would look like `Link: <http://example.org/taxonomy/term/1>; rel="tag"; title="Example Term"`
## REST API If instead the term were to have the `field_external_uri` field with a value of `http://purl.org/dc/dcmitype/Collection` then the link
header would look like `Link: <http://purl.org/dc/dcmitype/Collection>; rel="tag"; title="Example Term"`.
Islandora has a light, mostly RESTful HTTP API that relies heavily on Drupal's core Rest module. #### Referenced entities (Nodes and Media)
### /media/{media}/source Entity reference fields are exposed as link headers with `rel="related"` and a title equal to the entity reference field's display label.
For example, if `http://example.org/node/1` has an entity reference field name "Associated Content" that references
`http://example.org/node/2`, then the link header returned in a GET or HEAD response would look like
`Link: <http://example.org/node/2>; rel="related"; title="Associated Content"`.
You can PUT content to the `/media/{media}/source` endpoint to update the File associated with a Media. The `Content-Type` #### Associated media (Nodes only)
header is expected, as well as a `Content-Disposition` header of the form `attachment; filename="your_filename"` to indicate
the name to give the file. Requests with empty bodies or no `Content-Length` header will be rejected. Media entities that belong to nodes and are tagged with terms from the PCDM Use ontology are exposed as link headers with `rel="related"`
and a title equal to the display label of the taxonomy term. For example, if a Media is tagged as `Preservation Master` indicating
that it is the archival copy, the link header returned in a GET or HEAD response for a node would look like
`Link: <http://example.org/media/1>; rel="related"; title="Preservation Master"`.
#### Source files (Media only)
Files that are the source for Media entities are exposed as Link headers in the GET and HEAD responses with `rel="describes"`. The endpoint
to edit the contents of the source file is also exposed using `rel="edit-media"`. For example, if `http://example.org/media/1` has the source
file `http://example.org/file.txt`, then a GET or HEAD response would contain both
- `Link: <http://example.org/file.txt>; rel="describes"`
- `Link: <http://example.org/media/1/source>; rel="edit-media"`
### Exposed Endpoints
#### /media/{media}/source
You can PUT content to the `/media/{media}/source` endpoint to update the source file for a media. The `Content-Type`
header is required in addition to the PUT body. Requests with empty bodies or no `Content-Type` header will be rejected.
Example usage: Example usage:
``` ```
curl -u admin:islandora -v -X PUT -H 'Content-Type: image/png' -H 'Content-Disposition: attachment; filename="my_image.png"' --data-binary @my_image.png localhost:8000/media/1/source curl -u admin:islandora -v -X PUT -H 'Content-Type: image/png' --data-binary @my_image.png localhost:8000/media/1/source
``` ```
### /node/{node}/media/{field}/add/{bundle} #### /node/{node}/media/{media_type}/{taxonomy_term}
You can POST content to the `/node/{node}/media/{field}/add/{bundle}` endpoint to create a new Media of the specified bundle You can PUT content to the `/node/{node}/media/{media_type}/{taxonomy_term}` endpoint to create or update Media for Nodes. Media created
using the POST body. It will be associated with the specified Node using the field from the route. The `Content-Type` in this way will automatically be assigned to the node in the route and tagged with the term in the route. The `Content-Type`
header is expected, as well as a `Content-Disposition` header of the form `attachment; filename="your_filename"` to indicate header is expected, as well as a `Content-Disposition` header of the form `attachment; filename="your_filename"` to indicate
the name to give the file. Requests with empty bodies or no `Content-Length` header will be rejected. the name to give the file if it's new. Requests with empty bodies or that are without `Content-Type` and `Content-Disposition`
headers will be rejected.
For example, to create a new Image media for node 1, and tag it with taxonomy term 1:
```
curl -v -u admin:islandora -H "Content-Type: image/jpeg" -H "Content-Disposition: attachment; filename=\"test.jpeg\"" --data-binary @test.jpeg http://localhost:8000/node/1/media/image/1
```
Or, to update an existing image media that is tagged with taxonomy term 2:
```
curl -v -u admin:islandora -H "Content-Type: image/jpeg" -H "Content-Disposition: attachment; filename=\"test2.jpeg\"" --data-binary @test2.jpeg http://localhost:8000/node/1/media/image/2
```
#### /node/{node}/members
You can issue GET requests to this endpoint to get a list of members of a node. It is actually a REST export, and requires the `_format` query param. It can (read should) also be paged
like other REST export. For example, to get a paged list of members for a node, ten at a time:
```
curl -v -u admin:islandora http://localhost:8000/node/1/members?_format=json&items_per_page=10&offset=0
```
#### /node/{node}/media
You can issue GET requests to this endpoint to get a list of media of a node. It is actually a REST export, and requires the `_format` query param. Like the members endpoint, it can
be paged, but is less likely to be neccessary as most nodes don't have that many media. For example, to get the full list of media for a node:
Example usage:
``` ```
curl -v -u admin:islandora -H "Content-Type: image/jpeg" -H "Content-Disposition: attachment; filename=\"test.jpeg\"" --data-binary @test.jpeg http://localhost:8000/node/1/media/my_media_field/add/my_media_bundle curl -v -u admin:islandora http://localhost:8000/node/1/media?_format=json
``` ```
## Maintainers ## Maintainers
@ -58,6 +208,7 @@ Current maintainers:
* [Diego Pino](https://github.com/diegopino) * [Diego Pino](https://github.com/diegopino)
* [Jared Whiklo](https://github.com/whikloj) * [Jared Whiklo](https://github.com/whikloj)
* [Danny Lamb](https://github.com/dannylamb)
## Development ## Development

13
composer.json

@ -15,14 +15,19 @@
} }
], ],
"require": { "require": {
"drupal/inline_entity_form": "^1.0@beta",
"drupal/context": "^4.0", "drupal/context": "^4.0",
"drupal/search_api": "^1.0@beta", "drupal/search_api": "1.x-dev",
"islandora/jsonld": "dev-8.x-1.x", "islandora/jsonld": "dev-8.x-1.x",
"stomp-php/stomp-php": "4.*", "stomp-php/stomp-php": "4.*",
"drupal/jwt": "1.0.0-alpha6", "drupal/jwt": "1.0.0-alpha6",
"drupal/media_entity_image": "^1.2", "drupal/filehash": "^1.1",
"drupal/filehash": "^1.1" "drupal/prepopulate" : "^2.0@alpha",
"drupal/eva" : "^1.3",
"drupal/features" : "^3.7",
"drupal/migrate_plus" : "4.0-beta3",
"drupal/migrate_tools" : "4.0-beta3",
"drupal/migrate_source_csv" : "^2.1",
"drupal/permissions_by_term" : "^1.51"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^4.8", "phpunit/phpunit": "^4.8",

41
config/install/core.entity_form_display.media.tn.default.yml

@ -1,41 +0,0 @@
uuid: 9a8e59ea-6372-4dd8-8643-4afcaa583185
langcode: en
status: true
dependencies:
config:
- field.field.media.tn.field_height
- field.field.media.tn.field_image
- field.field.media.tn.field_mimetype
- field.field.media.tn.field_width
- image.style.thumbnail
- media_entity.bundle.tn
enforced:
module:
- islandora
module:
- image
id: media.tn.default
targetEntityType: media
bundle: tn
mode: default
content:
field_image:
weight: 1
settings:
progress_indicator: throbber
preview_image_style: thumbnail
third_party_settings: { }
type: image_image
name:
type: string_textfield
weight: 0
settings:
size: 60
placeholder: ''
third_party_settings: { }
hidden:
created: true
field_height: true
field_mimetype: true
field_width: true
uid: true

36
config/install/core.entity_form_display.media.tn.inline.yml

@ -1,36 +0,0 @@
uuid: 7102e88a-f6ea-40db-9bbc-9ac31b1f99a3
langcode: en
status: true
dependencies:
config:
- core.entity_form_mode.media.inline
- field.field.media.tn.field_height
- field.field.media.tn.field_image
- field.field.media.tn.field_mimetype
- field.field.media.tn.field_width
- image.style.thumbnail
- media_entity.bundle.tn
enforced:
module:
- islandora
module:
- image
id: media.tn.inline
targetEntityType: media
bundle: tn
mode: inline
content:
field_image:
weight: 0
settings:
progress_indicator: throbber
preview_image_style: thumbnail
third_party_settings: { }
type: image_image
hidden:
created: true
field_height: true
field_mimetype: true
field_width: true
name: true
uid: true

13
config/install/core.entity_form_mode.media.inline.yml

@ -1,13 +0,0 @@
uuid: 2cea66e8-8a46-4292-906c-24d85f6b8c04
langcode: en
status: true
dependencies:
enforced:
module:
- islandora
module:
- media_entity
id: media.inline
label: Inline
targetEntityType: media
cache: true

37
config/install/core.entity_view_display.media.tn.content.yml

@ -1,37 +0,0 @@
uuid: cf7d61f8-9098-49c7-a46f-0f6d26692c0e
langcode: en
status: true
dependencies:
config:
- core.entity_view_mode.media.content
- field.field.media.tn.field_height
- field.field.media.tn.field_image
- field.field.media.tn.field_mimetype
- field.field.media.tn.field_width
- media_entity.bundle.tn
enforced:
module:
- islandora
module:
- image
id: media.tn.content
targetEntityType: media
bundle: tn
mode: content
content:
field_image:
weight: 0
label: above
settings:
image_style: ''
image_link: ''
third_party_settings: { }
type: image
hidden:
created: true
field_height: true
field_mimetype: true
field_width: true
name: true
thumbnail: true
uid: true

76
config/install/core.entity_view_display.media.tn.default.yml

@ -1,76 +0,0 @@
uuid: dae6d069-ea8a-48eb-9d7f-44f10b38dff8
langcode: en
status: true
dependencies:
config:
- field.field.media.tn.field_height
- field.field.media.tn.field_image
- field.field.media.tn.field_mimetype
- field.field.media.tn.field_width
- media_entity.bundle.tn
enforced:
module:
- islandora
module:
- image
- user
id: media.tn.default
targetEntityType: media
bundle: tn
mode: default
content:
created:
label: hidden
type: timestamp
weight: 2
settings:
date_format: medium
custom_date_format: ''
timezone: ''
third_party_settings: { }
field_height:
weight: 6
label: above
settings:
thousand_separator: ''
prefix_suffix: true
third_party_settings: { }
type: number_integer
field_image:
weight: 3
label: above
settings:
image_style: ''
image_link: ''
third_party_settings: { }
type: image
field_mimetype:
weight: 4
label: above
settings:
link_to_entity: false
third_party_settings: { }
type: string
field_width:
weight: 5
label: above
settings:
thousand_separator: ''
prefix_suffix: true
third_party_settings: { }
type: number_integer
name:
label: hidden
type: string
weight: 0
settings:
link_to_entity: false
third_party_settings: { }
uid:
label: hidden
type: author
weight: 1
settings: { }
third_party_settings: { }
hidden:
thumbnail: true

14
config/install/core.entity_view_mode.media.content.yml

@ -1,14 +0,0 @@
uuid: 72d426d5-5788-4a12-828b-31d7176e9e30
langcode: en
status: true
dependencies:
module:
- media_entity
- islandora
enforced:
module:
- islandora
id: media.content
label: Content
targetEntityType: media
cache: true

22
config/install/field.field.media.tn.field_mimetype.yml

@ -1,22 +0,0 @@
uuid: dd6d11c2-912c-49c4-a88b-66263a800727
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_mimetype
- media_entity.bundle.tn
enforced:
module:
- islandora
id: media.tn.field_mimetype
field_name: field_mimetype
entity_type: media
bundle: tn
label: Mimetype
description: 'Thumbnail mimetype'
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings: { }
field_type: string

5
config/install/islandora.settings.yml

@ -1,5 +0,0 @@
broker_url: 'tcp://localhost:61613'
fedora_rest_endpoint: 'http://localhost:8080/fcrepo/rest'
_core:
default_config_hash: nDZDR2rrpXXQ-D_7BYrdDFAXYOsB5hgH6vCAMV5I3w8
broadcast_queue: islandora-connector-broadcast

22
config/install/media_entity.bundle.tn.yml

@ -1,22 +0,0 @@
uuid: 76912590-fe79-472d-9025-3538a6dfb5cb
langcode: en
status: true
dependencies:
module:
- media_entity_image
enforced:
module:
- islandora
id: tn
label: TN
description: 'Thumbnail image file'
type: image
queue_thumbnail_downloads: false
new_revision: false
type_configuration:
source_field: field_image
gather_exif: false
field_map:
mime: field_mimetype
width: field_width
height: field_height

13
config/install/system.action.delete_media.yml

@ -0,0 +1,13 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora
module:
- media
id: delete_media
label: 'Delete media'
type: media
plugin: delete_media
configuration: { }

13
config/install/system.action.delete_media_and_file.yml

@ -0,0 +1,13 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora
module:
- media
id: delete_media_and_file
label: 'Delete media and file(s)'
type: media
plugin: delete_media_and_file
configuration: { }

47
config/schema/islandora.schema.yml

@ -36,7 +36,7 @@ action.configuration.emit_media_event:
action.configuration.emit_file_event: action.configuration.emit_file_event:
type: mapping type: mapping
label: 'Emit a Flie event to a queue/topic' label: 'Emit a File event to a queue/topic'
mapping: mapping:
queue: queue:
type: text type: text
@ -45,6 +45,25 @@ action.configuration.emit_file_event:
type: text type: text
label: 'Event Type' label: 'Event Type'
action.configuration.emit_term_event:
type: mapping
label: 'Emit a Taxonomy Term event to a queue/topic'
mapping:
queue:
type: text
label: 'Queue'
event:
type: text
label: 'Event Type'
action.configuration.delete_media:
type: action_configuration_default
label: 'Delete media'
action.configuration.delete_media_and_file:
type: action_configuration_default
label: 'Delete media and file'
condition.plugin.is_node: condition.plugin.is_node:
type: condition.plugin type: condition.plugin
mapping: mapping:
@ -53,13 +72,31 @@ condition.plugin.is_media:
type: condition.plugin type: condition.plugin
mapping: mapping:
condition.plugin.is_referenced_media: condition.plugin.is_file:
type: condition.plugin
mapping:
condition.plugin.is_term:
type: condition.plugin
mapping:
condition.plugin.node_has_term:
type: condition.plugin type: condition.plugin
mapping: mapping:
field: uri:
type: text type: text
label: 'Reference Field' label: 'Taxonomy Term URI'
condition.plugin.is_file: condition.plugin.media_has_term:
type: condition.plugin
mapping:
uri:
type: text
label: 'Taxonomy Term URI'
condition.plugin.parent_node_has_term:
type: condition.plugin type: condition.plugin
mapping: mapping:
uri:
type: text
label: 'Taxonomy Term URI'

13
islandora.info.yml

@ -11,13 +11,20 @@ dependencies:
- path - path
- text - text
- options - options
- inline_entity_form - link
- jsonld - jsonld
- search_api - search_api
- jwt - jwt
- media_entity_image
- rest - rest
- filehash - filehash
- basic_auth - basic_auth
- context - context_ui
- action - action
- eva
- taxonomy
- views_ui
- media
- prepopulate
- features_ui
- migrate_tools
- migrate_source_csv

11
islandora.links.action.yml

@ -0,0 +1,11 @@
islandora.add_media_to_node:
route_name: islandora.add_media_to_node_page
title: Add media
appears_on:
- view.media_of.page_1
islandora.add_member_to_node:
route_name: islandora.add_member_to_node_page
title: Add member
appears_on:
- view.manage_members.page_1

295
islandora.module

@ -15,9 +15,10 @@
*/ */
use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityInterface;
use Drupal\islandora\ContextProvider\NodeContextProvider; use Drupal\node\NodeInterface;
use Drupal\islandora\ContextProvider\MediaContextProvider; use Drupal\media\MediaInterface;
use Drupal\islandora\ContextProvider\FileContextProvider; use Drupal\file\FileInterface;
use Drupal\taxonomy\TermInterface;
use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Routing\RouteMatchInterface;
/** /**
@ -58,104 +59,185 @@ function islandora_rdf_namespaces() {
} }
/** /**
* Implements hook_entity_insert(). * Implements hook_node_insert().
*/ */
function islandora_entity_insert(EntityInterface $entity) { function islandora_node_insert(NodeInterface $node) {
switch ($entity->getEntityType()->id()) { $utils = \Drupal::service('islandora.utils');
case "node":
$provider = new NodeContextProvider($entity);
break;
case "media": // Execute index reactions.
$provider = new MediaContextProvider($entity); $utils->executeNodeReactions('\Drupal\islandora\Plugin\ContextReaction\IndexReaction', $node);
break; }
case "file": /**
$provider = new FileContextProvider($entity); * Implements hook_node_update().
break; */
function islandora_node_update(NodeInterface $node) {
default: $utils = \Drupal::service('islandora.utils');
$provider = NULL; if (!$utils->haveFieldsChanged($node, $node->original)) {
break; return;
} };
if ($provider) { // Execute index reactions.
$context_manager = \Drupal::service('context.manager'); $utils->executeNodeReactions('\Drupal\islandora\Plugin\ContextReaction\IndexReaction', $node);
$provided = $provider->getRuntimeContexts([]); }
$context_manager->evaluateContexts($provided);
foreach ($context_manager->getActiveReactions('index') as $reaction) { /**
$reaction->execute($entity); * Implements hook_node_delete().
} */
function islandora_node_delete(NodeInterface $node) {
$utils = \Drupal::service('islandora.utils');
// Execute delete reactions.
$utils->executeNodeReactions('\Drupal\islandora\Plugin\ContextReaction\DeleteReaction', $node);
}
/**
* Implements hook_media_insert().
*/
function islandora_media_insert(MediaInterface $media) {
$utils = \Drupal::service('islandora.utils');
// Execute index reactions.
$utils->executeMediaReactions('\Drupal\islandora\Plugin\ContextReaction\IndexReaction', $media);
// If it has a parent node...
$node = $utils->getParentNode($media);
if ($node) {
// Fire off derivative reactions for the Media.
$utils->executeDerivativeReactions(
'\Drupal\islandora\Plugin\ContextReaction\DerivativeReaction',
$node,
$media
);
} }
} }
/** /**
* Implements hook_entity_update(). * Implements hook_media_update().
*/ */
function islandora_entity_update(EntityInterface $entity) { function islandora_media_update(MediaInterface $media) {
switch ($entity->getEntityType()->id()) { $media_source_service = \Drupal::service('islandora.media_source_service');
case "node":
$provider = new NodeContextProvider($entity);
break;
case "media": // Exit early if nothing's changed.
$provider = new MediaContextProvider($entity); $utils = \Drupal::service('islandora.utils');
break; if (!$utils->haveFieldsChanged($media, $media->original)) {
return;
};
case "file": // Execute index reactions.
$provider = new FileContextProvider($entity); $utils->executeMediaReactions('\Drupal\islandora\Plugin\ContextReaction\IndexReaction', $media);
break;
default: // Does it have a source field?
$provider = NULL; $source_field = $media_source_service->getSourceFieldName($media->bundle());
break; if (empty($source_field)) {
return;
} }
if ($provider) { // Exit early if the source file did not change.
$context_manager = \Drupal::service('context.manager'); if ($media->get($source_field)->equals($media->original->get($source_field))) {
$provided = $provider->getRuntimeContexts([]); return;
$context_manager->evaluateContexts($provided);
foreach ($context_manager->getActiveReactions('index') as $reaction) {
$reaction->execute($entity);
} }
// If it has a parent node...
$node = $utils->getParentNode($media);
if ($node) {
// Fire off derivative reactions for the Media.
$utils->executeDerivativeReactions(
'\Drupal\islandora\Plugin\ContextReaction\DerivativeReaction',
$node,
$media
);
} }
} }
/** /**
* Implements hook_entity_delete(). * Implements hook_media_delete().
*/ */
function islandora_entity_delete(EntityInterface $entity) { function islandora_media_delete(MediaInterface $media) {
switch ($entity->getEntityType()->id()) { $utils = \Drupal::service('islandora.utils');
case "node":
$provider = new NodeContextProvider($entity);
break;
case "media": // Execute delete reactions.
$provider = new MediaContextProvider($entity); $utils->executeMediaReactions('\Drupal\islandora\Plugin\ContextReaction\DeleteReaction', $media);
break; }
case "file": /**
$provider = new FileContextProvider($entity); * Implements hook_file_insert().
break; */
function islandora_file_insert(FileInterface $file) {
$utils = \Drupal::service('islandora.utils');
default: // Execute index reactions.
$provider = NULL; $utils->executeFileReactions('\Drupal\islandora\Plugin\ContextReaction\IndexReaction', $file);
break; }
/**
* Implements hook_file_update().
*/
function islandora_file_update(FileInterface $file) {
// Exit early if unchanged.
if ($file->filehash['sha1'] == $file->original->filehash['sha1']) {
return;
} }
if ($provider) { $utils = \Drupal::service('islandora.utils');
$context_manager = \Drupal::service('context.manager');
$provided = $provider->getRuntimeContexts([]);
$context_manager->evaluateContexts($provided);
foreach ($context_manager->getActiveReactions('delete') as $reaction) { // Execute index reactions.
$reaction->execute($entity); $utils->executeFileReactions('\Drupal\islandora\Plugin\ContextReaction\IndexReaction', $file);
// Execute derivative reactions.
foreach ($utils->getReferencingMedia($file->id()) as $media) {
$node = $utils->getParentNode($media);
if ($node) {
$utils->executeDerivativeReactions(
'\Drupal\islandora\Plugin\ContextReaction\DerivativeReaction',
$node,
$media
);
} }
} }
} }
/**
* Implements hook_file_delete().
*/
function islandora_file_delete(FileInterface $file) {
$utils = \Drupal::service('islandora.utils');
// Execute delete reactions.
$utils->executeFileReactions('\Drupal\islandora\Plugin\ContextReaction\DeleteReaction', $file);
}
/**
* Implements hook_taxonomy_term_insert().
*/
function islandora_taxonomy_term_insert(TermInterface $term) {
$utils = \Drupal::service('islandora.utils');
// Execute delete reactions.
$utils->executeTermReactions('\Drupal\islandora\Plugin\ContextReaction\IndexReaction', $term);
}
/**
* Implements hook_taxonomy_term_update().
*/
function islandora_taxonomy_term_update(TermInterface $term) {
$utils = \Drupal::service('islandora.utils');
// Execute delete reactions.
$utils->executeTermReactions('\Drupal\islandora\Plugin\ContextReaction\IndexReaction', $term);
}
/**
* Implements hook_taxonomy_term_delete().
*/
function islandora_taxonomy_term_delete(TermInterface $term) {
$utils = \Drupal::service('islandora.utils');
// Execute delete reactions.
$utils->executeTermReactions('\Drupal\islandora\Plugin\ContextReaction\DeleteReaction', $term);
}
/** /**
* Implements hook_jsonld_alter_normalized_array(). * Implements hook_jsonld_alter_normalized_array().
*/ */
@ -165,3 +247,78 @@ function islandora_jsonld_alter_normalized_array(EntityInterface $entity, array
$reaction->execute($entity, $normalized, $context); $reaction->execute($entity, $normalized, $context);
} }
} }
/**
* Implements hook_entity_view_mode_alter().
*/
function islandora_entity_view_mode_alter(&$view_mode, EntityInterface $entity) {
// Change the view mode based on user input from a 'view_mode_alter'
// ContextReaction.
$storage = \Drupal::service('entity_type.manager')->getStorage('entity_view_mode');
$context_manager = \Drupal::service('context.manager');
foreach ($context_manager->getActiveReactions('\Drupal\islandora\Plugin\ContextReaction\ViewModeAlterReaction') as $reaction) {
// Construct the new view mode's machine name.
$entity_type = $entity->getEntityTypeId();
$mode = $reaction->execute();
$machine_name = "$entity_type.$mode";
// Try to load it.
$new_mode = $storage->load($machine_name);
// If successful, alter the view mode.
if ($new_mode) {
$view_mode = $mode;
}
else {
// Otherwise, leave it be, but log a message.
\Drupal::logger('islandora')->info("EntityViewMode $machine_name does not exist. View mode cannot be altered.");
}
}
}
/**
* Implements hook_preprocess_node().
*/
function islandora_preprocess_node(&$variables) {
// Using alternate view modes causes on a node's canoncial page
// causes the title to get printed out twice. Once from the
// fields themselves and again as a block above the main content.
// Setting 'page' to TRUE gets rid of the title in the fields and
// leaves the block. This makes it look uniform with the 'default'
// view mode.
if (node_is_page($variables['elements']['#node'])) {
$variables['page'] = TRUE;
}
}
/**
* Implements hook_entity_form_display_alter().
*/
function islandora_entity_form_display_alter(&$form_display, $context) {
// Change the form display based on user input from a 'form_display_alter'
// ContextReaction.
$storage = \Drupal::service('entity_type.manager')->getStorage('entity_form_display');
$context_manager = \Drupal::service('context.manager');
// Alter form display based on context.
foreach ($context_manager->getActiveReactions('\Drupal\islandora\Plugin\ContextReaction\FormDisplayAlterReaction') as $reaction) {
// Construct the new form display's machine name.
$entity_type = $context['entity_type'];
$bundle = $context['bundle'];
$mode = $reaction->execute();
$machine_name = "$entity_type.$bundle.$mode";
// Try to load it.
$new_display = $storage->load($machine_name);
// If successful, alter the form display.
if ($new_display) {
$form_display = $new_display;
}
else {
// Otherwise, leave it be, but log a message.
\Drupal::logger('islandora')->info("EntityFormDisplay $machine_name does not exist. Form display cannot be altered.");
}
}
}

8
islandora.permissions.yml

@ -2,3 +2,11 @@
view checksums: view checksums:
title: 'View Checksums' title: 'View Checksums'
description: 'Allows access to viewing file checksums' description: 'Allows access to viewing file checksums'
manage members:
title: 'Manage Members'
description: 'Allows access to managing members for content'
manage media:
title: 'Manage Media'
description: 'Allows access to managing media for content'

32
islandora.routing.yml

@ -16,6 +16,28 @@ system.islandora_settings:
requirements: requirements:
_permission: 'administer site configuration' _permission: 'administer site configuration'
islandora.add_member_to_node_page:
path: '/node/{node}/members/add'
defaults:
_controller: '\Drupal\islandora\Controller\ManageMembersController::addToNodePage'
_title_callback: '\Drupal\islandora\Controller\ManageMembersController::addTitle'
entity_type_id: node
options:
_admin_route: 'true'
requirements:
_entity_create_any_access: 'node'
islandora.add_media_to_node_page:
path: '/node/{node}/media/add'
defaults:
_controller: '\Drupal\islandora\Controller\ManageMediaController::addToNodePage'
_title_callback: '\Drupal\islandora\Controller\ManageMediaController::addTitle'
entity_type_id: media
options:
_admin_route: 'true'
requirements:
_entity_create_any_access: 'media'
islandora.media_source_update: islandora.media_source_update:
path: '/media/{media}/source' path: '/media/{media}/source'
defaults: defaults:
@ -26,12 +48,12 @@ islandora.media_source_update:
options: options:
_auth: ['basic_auth', 'cookie', 'jwt_auth'] _auth: ['basic_auth', 'cookie', 'jwt_auth']
islandora.media_source_add_to_node: islandora.media_source_put_to_node:
path: '/node/{node}/media/{field}/add/{bundle}' path: '/node/{node}/media/{media_type}/{taxonomy_term}'
defaults: defaults:
_controller: '\Drupal\islandora\Controller\MediaSourceController::addToNode' _controller: '\Drupal\islandora\Controller\MediaSourceController::putToNode'
methods: [POST] methods: [PUT]
requirements: requirements:
_custom_access: '\Drupal\islandora\Controller\MediaSourceController::addToNodeAccess' _custom_access: '\Drupal\islandora\Controller\MediaSourceController::putToNodeAccess'
options: options:
_auth: ['basic_auth', 'cookie', 'jwt_auth'] _auth: ['basic_auth', 'cookie', 'jwt_auth']

26
islandora.services.yml

@ -1,11 +1,6 @@
# Islandora Services # Islandora Services
# islandora.services.yml: # islandora.services.yml:
services: services:
islandora.paramconverter.entity:
class: Drupal\islandora\ParamConverter\UuidEntityConverter
tags:
- { name: paramconverter }
arguments: ['@entity.manager']
islandora.eventgenerator: islandora.eventgenerator:
class: Drupal\islandora\EventGenerator\EventGenerator class: Drupal\islandora\EventGenerator\EventGenerator
islandora.stomp: islandora.stomp:
@ -20,17 +15,18 @@ services:
- { name: event_subscriber } - { name: event_subscriber }
islandora.media_link_header_subscriber: islandora.media_link_header_subscriber:
class: Drupal\islandora\EventSubscriber\MediaLinkHeaderSubscriber class: Drupal\islandora\EventSubscriber\MediaLinkHeaderSubscriber
arguments: ['@entity_type.manager', '@entity_field.manager', '@current_route_match', '@access_manager', '@current_user'] arguments: ['@entity_type.manager', '@entity_field.manager', '@access_manager', '@current_user', '@current_route_match', '@request_stack']
tags: tags:
- { name: event_subscriber } - { name: event_subscriber }
islandora.node_link_header_subscriber: islandora.node_link_header_subscriber:
class: Drupal\islandora\EventSubscriber\NodeLinkHeaderSubscriber class: Drupal\islandora\EventSubscriber\NodeLinkHeaderSubscriber
arguments: ['@entity_type.manager', '@entity_field.manager', '@current_route_match', '@access_manager', '@current_user'] arguments: ['@entity_type.manager', '@entity_field.manager', '@access_manager', '@current_user', '@current_route_match', '@request_stack', '@islandora.utils']
tags:
- { name: event_subscriber }
islandora.admin_view_route_subscriber:
class: Drupal\islandora\EventSubscriber\AdminViewsRouteSubscriber
tags: tags:
- { name: event_subscriber } - { name: event_subscriber }
islandora.versioncounter:
class: Drupal\islandora\VersionCounter\VersionCounter
arguments: ['@database']
logger.channel.islandora: logger.channel.islandora:
parent: logger.channel_base parent: logger.channel_base
arguments: ['islandora'] arguments: ['islandora']
@ -44,6 +40,14 @@ services:
arguments: ['@current_route_match'] arguments: ['@current_route_match']
tags: tags:
- { name: 'context_provider' } - { name: 'context_provider' }
islandora.taxonomy_term_route_context_provider:
class: Drupal\islandora\ContextProvider\TermRouteContextProvider
arguments: ['@current_route_match']
tags:
- { name: 'context_provider' }
islandora.media_source_service: islandora.media_source_service:
class: Drupal\islandora\MediaSource\MediaSourceService class: Drupal\islandora\MediaSource\MediaSourceService
arguments: ['@entity_type.manager', '@current_user', '@stream_wrapper_manager', '@token'] arguments: ['@entity_type.manager', '@current_user', '@stream_wrapper_manager', '@language_manager', '@token', '@entity.query']
islandora.utils:
class: Drupal\islandora\IslandoraUtils
arguments: ['@entity_type.manager', '@entity_field.manager', '@entity.query', '@context.manager', '@stream_wrapper_manager']

9
migrate/tags.csv

@ -0,0 +1,9 @@
vid,name,description,external_uri
tags,"Preservation Master","Best quality representation of the Object appropriate for long-term preservation",http://pcdm.org/use#PreservationMasterFile
tags,"Service File","A medium quality representation of the Object appropriate for serving to users",http://pcdm.org/use#ServiceFile
tags,"Thumbnail","A low resolution image representation of the Object appropriate for using as an icon",http://pcdm.org/use#ThumbnailImage
tags,"Audio","A resource primarily intended to be heard. Examples include a music playback file format, an audio compact disc, and recorded speech or sounds",http://purl.org/coar/resource_type/c_18cc
tags,"Binary","A generic binary file for repository items that don't fall into any other category or cannot be shown in a browser",http://purl.org/coar/resource_type/c_1843
tags,"Collection","A collection is an aggregation of items",http://purl.org/dc/dcmitype/Collection
tags,"Image","A visual representation other than text, including all types of moving image and still image",http://purl.org/coar/resource_type/c_c513
tags,"Video","A recording of visual images, usually in motion and with sound accompaniment",http://purl.org/coar/resource_type/c_12ce
1 vid name description external_uri
2 tags Preservation Master Best quality representation of the Object appropriate for long-term preservation http://pcdm.org/use#PreservationMasterFile
3 tags Service File A medium quality representation of the Object appropriate for serving to users http://pcdm.org/use#ServiceFile
4 tags Thumbnail A low resolution image representation of the Object appropriate for using as an icon http://pcdm.org/use#ThumbnailImage
5 tags Audio A resource primarily intended to be heard. Examples include a music playback file format, an audio compact disc, and recorded speech or sounds http://purl.org/coar/resource_type/c_18cc
6 tags Binary A generic binary file for repository items that don't fall into any other category or cannot be shown in a browser http://purl.org/coar/resource_type/c_1843
7 tags Collection A collection is an aggregation of items http://purl.org/dc/dcmitype/Collection
8 tags Image A visual representation other than text, including all types of moving image and still image http://purl.org/coar/resource_type/c_c513
9 tags Video A recording of visual images, usually in motion and with sound accompaniment http://purl.org/coar/resource_type/c_12ce

41
modules/islandora_core_feature/config/install/core.entity_view_display.media.audio.source.yml

@ -0,0 +1,41 @@
langcode: en
status: true
dependencies:
config:
- core.entity_view_mode.media.source
- field.field.media.audio.field_file_size
- field.field.media.audio.field_media_audio_file
- field.field.media.audio.field_media_of
- field.field.media.audio.field_mime_type
- field.field.media.audio.field_tags
- media.type.audio
enforced:
module:
- islandora_core_feature
module:
- file
id: media.audio.source
targetEntityType: media
bundle: audio
mode: source
content:
field_media_audio_file:
type: file_audio
weight: 0
label: visually_hidden
settings:
controls: true
multiple_file_display_type: tags
autoplay: false
loop: false
third_party_settings: { }
region: content
hidden:
created: true
field_file_size: true
field_media_of: true
field_mime_type: true
field_tags: true
name: true
thumbnail: true
uid: true

38
modules/islandora_core_feature/config/install/core.entity_view_display.media.file.source.yml

@ -0,0 +1,38 @@
langcode: en
status: true
dependencies:
config:
- core.entity_view_mode.media.source
- field.field.media.file.field_file_size
- field.field.media.file.field_media_file
- field.field.media.file.field_media_of
- field.field.media.file.field_mime_type
- field.field.media.file.field_tags
- media.type.file
enforced:
module:
- islandora_core_feature
module:
- file
id: media.file.source
targetEntityType: media
bundle: file
mode: source
content:
field_media_file:
label: hidden
settings:
use_description_as_link_text: true
third_party_settings: { }
type: file_default
weight: 0
region: content
hidden:
created: true
field_file_size: true
field_media_of: true
field_mime_type: true
field_tags: true
name: true
thumbnail: true
uid: true

43
modules/islandora_core_feature/config/install/core.entity_view_display.media.image.source.yml

@ -0,0 +1,43 @@
langcode: en
status: true
dependencies:
config:
- core.entity_view_mode.media.source
- field.field.media.image.field_file_size
- field.field.media.image.field_height
- field.field.media.image.field_media_image
- field.field.media.image.field_media_of
- field.field.media.image.field_mime_type
- field.field.media.image.field_tags
- field.field.media.image.field_width
- media.type.image
enforced:
module:
- islandora_core_feature
module:
- image
id: media.image.source
targetEntityType: media
bundle: image
mode: source
content:
field_media_image:
label: visually_hidden
settings:
image_style: ''
image_link: content
third_party_settings: { }
type: image
weight: 0
region: content
hidden:
created: true
field_file_size: true
field_height: true
field_media_of: true
field_mime_type: true
field_tags: true
field_width: true
name: true
thumbnail: true
uid: true

44
modules/islandora_core_feature/config/install/core.entity_view_display.media.video.source.yml

@ -0,0 +1,44 @@
langcode: en
status: true
dependencies:
config:
- core.entity_view_mode.media.source
- field.field.media.video.field_file_size
- field.field.media.video.field_media_of
- field.field.media.video.field_media_video_file
- field.field.media.video.field_mime_type
- field.field.media.video.field_tags
- media.type.video
enforced:
module:
- islandora_core_feature
module:
- file
id: media.video.source
targetEntityType: media
bundle: video
mode: source
content:
field_media_video_file:
type: file_video
weight: 0
label: visually_hidden
settings:
muted: false
width: 640
height: 480
controls: true
autoplay: false
loop: false
multiple_file_display_type: tags
third_party_settings: { }
region: content
hidden:
created: true
field_file_size: true
field_media_of: true
field_mime_type: true
field_tags: true
name: true
thumbnail: true
uid: true

12
modules/islandora_core_feature/config/install/core.entity_view_mode.media.source.yml

@ -0,0 +1,12 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
module:
- media
id: media.source
label: Source
targetEntityType: media
cache: true

100
modules/islandora_core_feature/config/install/features.bundle.islandora.yml

@ -0,0 +1,100 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
name: Islandora
machine_name: islandora
description: 'Features for islandora'
assignments:
alter:
core: true
uuid: true
user_permissions: true
enabled: true
weight: 0
base:
types:
config:
comment_type: comment_type
node_type: node_type
content:
user: user
enabled: true
weight: -2
core:
types:
config:
date_format: date_format
field_storage_config: field_storage_config
entity_form_mode: entity_form_mode
image_style: image_style
menu: menu
responsive_image_style: responsive_image_style
user_role: user_role
entity_view_mode: entity_view_mode
enabled: true
weight: 5
dependency:
enabled: true
weight: 15
exclude:
types:
config:
features_bundle: features_bundle
curated: true
module:
installed: true
profile: true
namespace: true
namespace_any: false
enabled: true
weight: -5
existing:
enabled: true
weight: 12
forward_dependency:
enabled: true
weight: 4
namespace:
enabled: true
weight: 0
optional:
types:
config: { }
enabled: true
weight: 0
packages:
enabled: true
weight: -20
profile:
curated: true
standard:
files: true
dependencies: true
types:
config:
block: block
language_content_settings: language_content_settings
configurable_language: configurable_language
migration: migration
shortcut_set: shortcut_set
tour: tour
enabled: true
weight: 10
site:
types:
config:
action: action
contact_form: contact_form
block_content_type: block_content_type
rdf_mapping: rdf_mapping
search_page: search_page
taxonomy_vocabulary: taxonomy_vocabulary
editor: editor
filter_format: filter_format
enabled: true
weight: 7
profile_name: ''
is_profile: false

25
modules/islandora_core_feature/config/install/field.field.media.audio.field_file_size.yml

@ -0,0 +1,25 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_file_size
- media.type.audio
enforced:
module:
- islandora_core_feature
id: media.audio.field_file_size
field_name: field_file_size
entity_type: media
bundle: audio
label: 'File size'
description: ''
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings:
min: null
max: null
prefix: ''
suffix: ''
field_type: integer

29
modules/islandora_core_feature/config/install/field.field.media.audio.field_media_audio_file.yml

@ -0,0 +1,29 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_media_audio_file
- media.type.audio
enforced:
module:
- islandora_core_feature
module:
- file
id: media.audio.field_media_audio_file
field_name: field_media_audio_file
entity_type: media
bundle: audio
label: 'Audio file'
description: ''
required: true
translatable: true
default_value: { }
default_value_callback: ''
settings:
file_extensions: 'mp3 wav aac'
file_directory: '[date:custom:Y]-[date:custom:m]'
max_filesize: ''
description_field: false
handler: 'default:file'
handler_settings: { }
field_type: file

23
modules/islandora_core_feature/config/install/field.field.media.audio.field_media_of.yml

@ -0,0 +1,23 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_media_of
- media.type.audio
enforced:
module:
- islandora_core_feature
id: media.audio.field_media_of
field_name: field_media_of
entity_type: media
bundle: audio
label: 'Media of'
description: ''
required: false
translatable: false
default_value: { }
default_value_callback: ''
settings:
handler: 'default:node'
handler_settings: { }
field_type: entity_reference

21
modules/islandora_core_feature/config/install/field.field.media.audio.field_mime_type.yml

@ -0,0 +1,21 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_mime_type
- media.type.audio
enforced:
module:
- islandora_core_feature
id: media.audio.field_mime_type
field_name: field_mime_type
entity_type: media
bundle: audio
label: 'MIME type'
description: ''
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings: { }
field_type: string

23
modules/islandora_core_feature/config/install/field.field.media.audio.field_tags.yml

@ -0,0 +1,23 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_tags
- media.type.audio
enforced:
module:
- islandora_core_feature
id: media.audio.field_tags
field_name: field_tags
entity_type: media
bundle: audio
label: Tags
description: ''
required: false
translatable: false
default_value: { }
default_value_callback: ''
settings:
handler: 'default:taxonomy_term'
handler_settings: { }
field_type: entity_reference

25
modules/islandora_core_feature/config/install/field.field.media.file.field_file_size.yml

@ -0,0 +1,25 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_file_size
- media.type.file
enforced:
module:
- islandora_core_feature
id: media.file.field_file_size
field_name: field_file_size
entity_type: media
bundle: file
label: 'File size'
description: ''
required: false
translatable: false
default_value: { }
default_value_callback: ''
settings:
min: null
max: null
prefix: ''
suffix: ''
field_type: integer

30
modules/islandora_core_feature/config/install/field.field.media.file.field_media_file.yml

@ -0,0 +1,30 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_media_file
- media.type.file
enforced:
module:
- media
- islandora_core_feature
module:
- file
id: media.file.field_media_file
field_name: field_media_file
entity_type: media
bundle: file
label: File
description: ''
required: true
translatable: true
default_value: { }
default_value_callback: ''
settings:
file_directory: '[date:custom:Y]-[date:custom:m]'
file_extensions: 'txt rtf doc docx ppt pptx xls xlsx pdf odf odg odp ods odt fodt fods fodp fodg key numbers pages tiff tif jp2'
max_filesize: ''
description_field: false
handler: 'default:file'
handler_settings: { }
field_type: file

23
modules/islandora_core_feature/config/install/field.field.media.file.field_media_of.yml

@ -0,0 +1,23 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_media_of
- media.type.file
enforced:
module:
- islandora_core_feature
id: media.file.field_media_of
field_name: field_media_of
entity_type: media
bundle: file
label: 'Media of'
description: ''
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings:
handler: 'default:node'
handler_settings: { }
field_type: entity_reference

21
modules/islandora_core_feature/config/install/field.field.media.file.field_mime_type.yml

@ -0,0 +1,21 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_mime_type
- media.type.file
enforced:
module:
- islandora_core_feature
id: media.file.field_mime_type
field_name: field_mime_type
entity_type: media
bundle: file
label: 'MIME type'
description: 'MIME type of the underlying file'
required: false
translatable: false
default_value: { }
default_value_callback: ''
settings: { }
field_type: string

23
modules/islandora_core_feature/config/install/field.field.media.file.field_tags.yml

@ -0,0 +1,23 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_tags
- media.type.file
enforced:
module:
- islandora_core_feature
id: media.file.field_tags
field_name: field_tags
entity_type: media
bundle: file
label: Tags
description: ''
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings:
handler: 'default:taxonomy_term'
handler_settings: { }
field_type: entity_reference

25
modules/islandora_core_feature/config/install/field.field.media.image.field_file_size.yml

@ -0,0 +1,25 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_file_size
- media.type.image
enforced:
module:
- islandora_core_feature
id: media.image.field_file_size
field_name: field_file_size
entity_type: media
bundle: image
label: 'File size'
description: ''
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings:
min: null
max: null
prefix: ''
suffix: ''
field_type: integer

13
config/install/field.field.media.tn.field_height.yml → modules/islandora_core_feature/config/install/field.field.media.image.field_height.yml

@ -1,21 +1,20 @@
uuid: 64ecf3f3-8aad-4794-a9cc-ea2320885fea
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
config: config:
- field.storage.media.field_height - field.storage.media.field_height
- media_entity.bundle.tn - media.type.image
enforced: enforced:
module: module:
- islandora - islandora_core_feature
id: media.tn.field_height id: media.image.field_height
field_name: field_height field_name: field_height
entity_type: media entity_type: media
bundle: tn bundle: image
label: Height label: Height
description: 'Thumbnail height' description: ''
required: false required: false
translatable: true translatable: false
default_value: { } default_value: { }
default_value_callback: '' default_value_callback: ''
settings: settings:

30
config/install/field.field.media.tn.field_image.yml → modules/islandora_core_feature/config/install/field.field.media.image.field_media_image.yml

@ -1,41 +1,41 @@
uuid: 3e86756e-0782-4514-86f8-97d26ec6985d
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
config: config:
- field.storage.media.field_image - field.storage.media.field_media_image
- media_entity.bundle.tn - media.type.image
enforced: enforced:
module: module:
- islandora - media
- islandora_core_feature
module: module:
- image - image
id: media.tn.field_image id: media.image.field_media_image
field_name: field_image field_name: field_media_image
entity_type: media entity_type: media
bundle: tn bundle: image
label: Image label: Image
description: 'Thumbnail contents' description: ''
required: false required: true
translatable: true translatable: true
default_value: { } default_value: { }
default_value_callback: '' default_value_callback: ''
settings: settings:
file_directory: '[date:custom:Y]-[date:custom:m]'
file_extensions: 'png gif jpg jpeg'
max_filesize: ''
max_resolution: ''
min_resolution: ''
alt_field: true alt_field: true
alt_field_required: true alt_field_required: true
title_field: false title_field: false
title_field_required: false title_field_required: false
max_resolution: ''
min_resolution: ''
default_image: default_image:
uuid: '' uuid: null
alt: '' alt: ''
title: '' title: ''
width: null width: null
height: null height: null
file_directory: '[date:custom:Y]-[date:custom:m]'
file_extensions: 'png gif jpg jpeg'
max_filesize: ''
handler: 'default:file' handler: 'default:file'
handler_settings: { } handler_settings: { }
field_type: image field_type: image

23
modules/islandora_core_feature/config/install/field.field.media.image.field_media_of.yml

@ -0,0 +1,23 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_media_of
- media.type.image
enforced:
module:
- islandora_core_feature
id: media.image.field_media_of
field_name: field_media_of
entity_type: media
bundle: image
label: 'Media of'
description: ''
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings:
handler: 'default:node'
handler_settings: { }
field_type: entity_reference

21
modules/islandora_core_feature/config/install/field.field.media.image.field_mime_type.yml

@ -0,0 +1,21 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_mime_type
- media.type.image
enforced:
module:
- islandora_core_feature
id: media.image.field_mime_type
field_name: field_mime_type
entity_type: media
bundle: image
label: 'MIME type'
description: ''
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings: { }
field_type: string

23
modules/islandora_core_feature/config/install/field.field.media.image.field_tags.yml

@ -0,0 +1,23 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_tags
- media.type.image
enforced:
module:
- islandora_core_feature
id: media.image.field_tags
field_name: field_tags
entity_type: media
bundle: image
label: Tags
description: ''
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings:
handler: 'default:taxonomy_term'
handler_settings: { }
field_type: entity_reference

13
config/install/field.field.media.tn.field_width.yml → modules/islandora_core_feature/config/install/field.field.media.image.field_width.yml

@ -1,21 +1,20 @@
uuid: 1f18aa08-5384-4880-892d-947eb1c3b457
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
config: config:
- field.storage.media.field_width - field.storage.media.field_width
- media_entity.bundle.tn - media.type.image
enforced: enforced:
module: module:
- islandora - islandora_core_feature
id: media.tn.field_width id: media.image.field_width
field_name: field_width field_name: field_width
entity_type: media entity_type: media
bundle: tn bundle: image
label: Width label: Width
description: 'Thumbnail width' description: ''
required: false required: false
translatable: true translatable: false
default_value: { } default_value: { }
default_value_callback: '' default_value_callback: ''
settings: settings:

25
modules/islandora_core_feature/config/install/field.field.media.video.field_file_size.yml

@ -0,0 +1,25 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_file_size
- media.type.video
enforced:
module:
- islandora_core_feature
id: media.video.field_file_size
field_name: field_file_size
entity_type: media
bundle: video
label: 'File size'
description: ''
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings:
min: null
max: null
prefix: ''
suffix: ''
field_type: integer

23
modules/islandora_core_feature/config/install/field.field.media.video.field_media_of.yml

@ -0,0 +1,23 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_media_of
- media.type.video
enforced:
module:
- islandora_core_feature
id: media.video.field_media_of
field_name: field_media_of
entity_type: media
bundle: video
label: 'Media of'
description: ''
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings:
handler: 'default:node'
handler_settings: { }
field_type: entity_reference

29
modules/islandora_core_feature/config/install/field.field.media.video.field_media_video_file.yml

@ -0,0 +1,29 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_media_video_file
- media.type.video
enforced:
module:
- islandora_core_feature
module:
- file
id: media.video.field_media_video_file
field_name: field_media_video_file
entity_type: media
bundle: video
label: 'Video file'
description: ''
required: true
translatable: true
default_value: { }
default_value_callback: ''
settings:
file_extensions: mp4
file_directory: '[date:custom:Y]-[date:custom:m]'
max_filesize: ''
description_field: false
handler: 'default:file'
handler_settings: { }
field_type: file

21
modules/islandora_core_feature/config/install/field.field.media.video.field_mime_type.yml

@ -0,0 +1,21 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_mime_type
- media.type.video
enforced:
module:
- islandora_core_feature
id: media.video.field_mime_type
field_name: field_mime_type
entity_type: media
bundle: video
label: 'MIME type'
description: ''
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings: { }
field_type: string

23
modules/islandora_core_feature/config/install/field.field.media.video.field_tags.yml

@ -0,0 +1,23 @@
langcode: en
status: true
dependencies:
config:
- field.storage.media.field_tags
- media.type.video
enforced:
module:
- islandora_core_feature
id: media.video.field_tags
field_name: field_tags
entity_type: media
bundle: video
label: Tags
description: ''
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings:
handler: 'default:taxonomy_term'
handler_settings: { }
field_type: entity_reference

25
modules/islandora_core_feature/config/install/field.field.taxonomy_term.tags.field_external_uri.yml

@ -0,0 +1,25 @@
langcode: en
status: true
dependencies:
config:
- field.storage.taxonomy_term.field_external_uri
- taxonomy.vocabulary.tags
enforced:
module:
- islandora_core_feature
module:
- link
id: taxonomy_term.tags.field_external_uri
field_name: field_external_uri
entity_type: taxonomy_term
bundle: tags
label: 'External URI'
description: ''
required: false
translatable: false
default_value: { }
default_value_callback: ''
settings:
link_type: 16
title: 0
field_type: link

22
modules/islandora_core_feature/config/install/field.storage.media.field_file_size.yml

@ -0,0 +1,22 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
module:
- media
id: media.field_file_size
field_name: field_file_size
entity_type: media
type: integer
settings:
unsigned: false
size: normal
module: core
locked: false
cardinality: 1
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false

7
config/install/field.storage.media.field_height.yml → modules/islandora_core_feature/config/install/field.storage.media.field_height.yml

@ -1,12 +1,11 @@
uuid: 68e445be-834e-4a03-b5f3-46e4d3214660
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
module:
- media_entity
enforced: enforced:
module: module:
- islandora - islandora_core_feature
module:
- media
id: media.field_height id: media.field_height
field_name: field_height field_name: field_height
entity_type: media entity_type: media

17
config/install/field.storage.media.field_file.yml → modules/islandora_core_feature/config/install/field.storage.media.field_media_audio_file.yml

@ -1,22 +1,21 @@
uuid: 3187338b-84ab-4ad4-9396-0600ed7cc6d6
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
module:
- file
- media_entity
enforced: enforced:
module: module:
- islandora - islandora_core_feature
id: media.field_file module:
field_name: field_file - file
- media
id: media.field_media_audio_file
field_name: field_media_audio_file
entity_type: media entity_type: media
type: file type: file
settings: settings:
display_field: true target_type: file
display_field: false
display_default: false display_default: false
uri_scheme: public uri_scheme: public
target_type: file
module: file module: file
locked: false locked: false
cardinality: 1 cardinality: 1

26
modules/islandora_core_feature/config/install/field.storage.media.field_media_file.yml

@ -0,0 +1,26 @@
langcode: en
status: true
dependencies:
enforced:
module:
- media
- islandora_core_feature
module:
- file
- media
id: media.field_media_file
field_name: field_media_file
entity_type: media
type: file
settings:
uri_scheme: public
target_type: file
display_field: false
display_default: false
module: file
locked: false
cardinality: 1
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false

16
config/install/field.storage.media.field_image.yml → modules/islandora_core_feature/config/install/field.storage.media.field_media_image.yml

@ -1,24 +1,21 @@
uuid: 864f50f8-57b5-4a43-80f9-7548b1dc0196
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
enforced: enforced:
module: module:
- islandora - media
- islandora_core_feature
module: module:
- file - file
- image - image
- media_entity - media
_core: id: media.field_media_image
default_config_hash: MX6T38DOi1q6LSZEP_PsH6mWEBZv-ncKCgfYVjQDvlY field_name: field_media_image
id: media.field_image
field_name: field_image
entity_type: media entity_type: media
type: image type: image
settings: settings:
uri_scheme: public
default_image: default_image:
uuid: '' uuid: null
alt: '' alt: ''
title: '' title: ''
width: null width: null
@ -26,6 +23,7 @@ settings:
target_type: file target_type: file
display_field: false display_field: false
display_default: false display_default: false
uri_scheme: public
module: image module: image
locked: false locked: false
cardinality: 1 cardinality: 1

17
config/install/field.storage.node.field_tn.yml → modules/islandora_core_feature/config/install/field.storage.media.field_media_of.yml

@ -1,19 +1,18 @@
uuid: 70d43fa1-2c63-42a7-86ca-9ccaa1d0ac6d
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
module:
- islandora
- media_entity
enforced: enforced:
module: module:
- islandora - islandora_core_feature
id: node.field_tn module:
field_name: field_tn - media
entity_type: node - node
id: media.field_media_of
field_name: field_media_of
entity_type: media
type: entity_reference type: entity_reference
settings: settings:
target_type: media target_type: node
module: core module: core
locked: false locked: false
cardinality: 1 cardinality: 1

25
modules/islandora_core_feature/config/install/field.storage.media.field_media_video_file.yml

@ -0,0 +1,25 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
module:
- file
- media
id: media.field_media_video_file
field_name: field_media_video_file
entity_type: media
type: file
settings:
target_type: file
display_field: false
display_default: false
uri_scheme: public
module: file
locked: false
cardinality: 1
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false

11
config/install/field.storage.media.field_mimetype.yml → modules/islandora_core_feature/config/install/field.storage.media.field_mime_type.yml

@ -1,14 +1,13 @@
uuid: ac5aa8aa-4672-498c-b814-2e4d477b8a75
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
module:
- media_entity
enforced: enforced:
module: module:
- islandora - islandora_core_feature
id: media.field_mimetype module:
field_name: field_mimetype - media
id: media.field_mime_type
field_name: field_mime_type
entity_type: media entity_type: media
type: string type: string
settings: settings:

17
config/install/field.storage.node.field_obj.yml → modules/islandora_core_feature/config/install/field.storage.media.field_tags.yml

@ -1,22 +1,21 @@
uuid: d31f7746-57f6-4081-973e-da400b1e51d1
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
enforced: enforced:
module: module:
- islandora - islandora_core_feature
module: module:
- islandora - media
- media_entity - taxonomy
id: node.field_obj id: media.field_tags
field_name: field_obj field_name: field_tags
entity_type: node entity_type: media
type: entity_reference type: entity_reference
settings: settings:
target_type: media target_type: taxonomy_term
module: core module: core
locked: false locked: false
cardinality: 1 cardinality: -1
translatable: true translatable: true
indexes: { } indexes: { }
persist_with_no_fields: false persist_with_no_fields: false

7
config/install/field.storage.media.field_width.yml → modules/islandora_core_feature/config/install/field.storage.media.field_width.yml

@ -1,12 +1,11 @@
uuid: 3d8f21ae-673c-4569-b7be-6352068e5fcb
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
module:
- media_entity
enforced: enforced:
module: module:
- islandora - islandora_core_feature
module:
- media
id: media.field_width id: media.field_width
field_name: field_width field_name: field_width
entity_type: media entity_type: media

12
config/install/field.storage.node.field_memberof.yml → modules/islandora_core_feature/config/install/field.storage.node.field_member_of.yml

@ -1,20 +1,20 @@
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
module:
- islandora
enforced: enforced:
module: module:
- islandora - islandora_core_feature
id: node.field_memberof module:
field_name: field_memberof - node
id: node.field_member_of
field_name: field_member_of
entity_type: node entity_type: node
type: entity_reference type: entity_reference
settings: settings:
target_type: node target_type: node
module: core module: core
locked: false locked: false
cardinality: 1 cardinality: -1
translatable: true translatable: true
indexes: { } indexes: { }
persist_with_no_fields: false persist_with_no_fields: false

21
modules/islandora_core_feature/config/install/field.storage.taxonomy_term.field_external_uri.yml

@ -0,0 +1,21 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
module:
- link
- taxonomy
id: taxonomy_term.field_external_uri
field_name: field_external_uri
entity_type: taxonomy_term
type: link
settings: { }
module: link
locked: false
cardinality: -1
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false

17
modules/islandora_core_feature/config/install/media.type.audio.yml

@ -0,0 +1,17 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
id: audio
label: Audio
description: 'A locally hosted audio file.'
source: audio_file
queue_thumbnail_downloads: false
new_revision: true
source_configuration:
source_field: field_media_audio_file
field_map:
mimetype: field_mime_type
filesize: field_file_size

17
modules/islandora_core_feature/config/install/media.type.file.yml

@ -0,0 +1,17 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
id: file
label: File
description: 'Use local files for reusable media.'
source: file
queue_thumbnail_downloads: false
new_revision: true
source_configuration:
source_field: field_media_file
field_map:
mimetype: field_mime_type
filesize: field_file_size

19
modules/islandora_core_feature/config/install/media.type.image.yml

@ -0,0 +1,19 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
id: image
label: Image
description: 'Use local images for reusable media.'
source: image
queue_thumbnail_downloads: false
new_revision: true
source_configuration:
source_field: field_media_image
field_map:
mimetype: field_mime_type
filesize: field_file_size
width: field_width
height: field_height

17
modules/islandora_core_feature/config/install/media.type.video.yml

@ -0,0 +1,17 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
id: video
label: Video
description: 'A locally hosted video file.'
source: video_file
queue_thumbnail_downloads: false
new_revision: true
source_configuration:
source_field: field_media_video_file
field_map:
mimetype: field_mime_type
filesize: field_file_size

31
modules/islandora_core_feature/config/install/migrate_plus.migration.islandora_tags.yml

@ -0,0 +1,31 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
id: islandora_tags
class: null
field_plugin_method: null
cck_plugin_method: null
migration_tags: islandora_tags
migration_group: islandora
label: 'Tags migration from CSV'
source:
plugin: csv
path: /var/www/html/drupal/web/modules/contrib/islandora/migrate/tags.csv
header_row_count: 1
keys:
- external_uri
process:
name: name
vid: vid
description: description
field_external_uri:
plugin: urlencode
source: external_uri
destination:
plugin: 'entity:taxonomy_term'
migration_dependencies:
required: { }
optional: { }

12
modules/islandora_core_feature/config/install/migrate_plus.migration_group.islandora.yml

@ -0,0 +1,12 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
id: islandora
label: Islandora
description: 'Migrations into Islandora'
source_type: Anything
module: null
shared_configuration: null

45
modules/islandora_core_feature/config/install/rdf.mapping.media.audio.yml

@ -0,0 +1,45 @@
langcode: en
status: true
dependencies:
config:
- media.type.audio
enforced:
module:
- islandora_core_feature
module:
- media
id: media.audio
targetEntityType: media
bundle: audio
types:
- 'pcdm:File'
fieldMappings:
name:
properties:
- 'dc:title'
- 'rdf:label'
created:
properties:
- 'schema:dateCreated'
datatype_callback:
callable: 'Drupal\rdf\CommonDataConverter::dateIso8601Value'
changed:
properties:
- 'schema:dateModified'
datatype_callback:
callable: 'Drupal\rdf\CommonDataConverter::dateIso8601Value'
uid:
properties:
- 'schema:author'
mapping_type: rel
field_mime_type:
properties:
- 'ebucore:hasMimeType'
field_media_of:
properties:
- 'pcdm:fileOf'
mapping_type: rel
field_tags:
properties:
- 'schema:additionalType'
mapping_type: rel

25
config/install/rdf.mapping.media.tn.yml → modules/islandora_core_feature/config/install/rdf.mapping.media.file.yml

@ -1,21 +1,18 @@
uuid: 77e9e71f-f67f-438f-80eb-bb5fa931a5ec
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
config: config:
- media_entity.bundle.tn - media.type.file
enforced: enforced:
module: module:
- islandora - islandora_core_feature
module: module:
- media_entity - media
_core: id: media.file
default_config_hash: 6L5MoXE-kIJb53NSl9cSQBFoyZNG1DWL8CFOSV60yMk
id: media.tn
targetEntityType: media targetEntityType: media
bundle: tn bundle: file
types: types:
- 'use:ThumbnailImage' - 'pcdm:File'
fieldMappings: fieldMappings:
name: name:
properties: properties:
@ -35,6 +32,14 @@ fieldMappings:
properties: properties:
- 'schema:author' - 'schema:author'
mapping_type: rel mapping_type: rel
field_mimetype: field_mime_type:
properties: properties:
- 'ebucore:hasMimeType' - 'ebucore:hasMimeType'
field_media_of:
properties:
- 'pcdm:fileOf'
mapping_type: rel
field_tags:
properties:
- 'schema:additionalType'
mapping_type: rel

51
modules/islandora_core_feature/config/install/rdf.mapping.media.image.yml

@ -0,0 +1,51 @@
langcode: en
status: true
dependencies:
config:
- media.type.image
enforced:
module:
- islandora_core_feature
module:
- media
id: media.image
targetEntityType: media
bundle: image
types:
- 'pcdm:File'
fieldMappings:
name:
properties:
- 'dc:title'
- 'rdf:label'
created:
properties:
- 'schema:dateCreated'
datatype_callback:
callable: 'Drupal\rdf\CommonDataConverter::dateIso8601Value'
changed:
properties:
- 'schema:dateModified'
datatype_callback:
callable: 'Drupal\rdf\CommonDataConverter::dateIso8601Value'
uid:
properties:
- 'schema:author'
mapping_type: rel
field_mime_type:
properties:
- 'ebucore:hasMimeType'
field_media_of:
properties:
- 'pcdm:fileOf'
mapping_type: rel
field_tags:
properties:
- 'schema:additionalType'
mapping_type: rel
field_width:
properties:
- 'ebucore:width'
field_height:
properties:
- 'ebucore:height'

45
modules/islandora_core_feature/config/install/rdf.mapping.media.video.yml

@ -0,0 +1,45 @@
langcode: en
status: true
dependencies:
config:
- media.type.video
enforced:
module:
- islandora_core_feature
module:
- media
id: media.video
targetEntityType: media
bundle: video
types:
- 'pcdm:File'
fieldMappings:
name:
properties:
- 'dc:title'
- 'rdf:label'
created:
properties:
- 'schema:dateCreated'
datatype_callback:
callable: 'Drupal\rdf\CommonDataConverter::dateIso8601Value'
changed:
properties:
- 'schema:dateModified'
datatype_callback:
callable: 'Drupal\rdf\CommonDataConverter::dateIso8601Value'
uid:
properties:
- 'schema:author'
mapping_type: rel
field_mime_type:
properties:
- 'ebucore:hasMimeType'
field_media_of:
properties:
- 'pcdm:fileOf'
mapping_type: rel
field_tags:
properties:
- 'schema:additionalType'
mapping_type: rel

30
modules/islandora_core_feature/config/install/rdf.mapping.taxonomy_term.tags.yml

@ -0,0 +1,30 @@
langcode: en
status: true
dependencies:
config:
- taxonomy.vocabulary.tags
enforced:
module:
- islandora_core_feature
module:
- taxonomy
id: taxonomy_term.tags
targetEntityType: taxonomy_term
bundle: tags
types:
- 'schema:Thing'
fieldMappings:
name:
properties:
- 'dc:title'
description:
properties:
- 'dc:description'
field_external_uri:
properties:
- 'owl:sameAs'
changed:
properties:
- 'schema:dateModified'
datatype_callback:
callable: 'Drupal\rdf\CommonDataConverter::dateIso8601Value'

46
modules/islandora_core_feature/config/install/rest.resource.entity.file.yml

@ -0,0 +1,46 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
module:
- basic_auth
- file
- jsonld
- jwt
- serialization
- user
id: entity.file
plugin_id: 'entity:file'
granularity: method
configuration:
GET:
supported_formats:
- jsonld
- json
supported_auth:
- basic_auth
- jwt_auth
- cookie
POST:
supported_formats:
- json
supported_auth:
- basic_auth
- jwt_auth
- cookie
DELETE:
supported_formats:
- json
supported_auth:
- basic_auth
- jwt_auth
- cookie
PATCH:
supported_formats:
- json
supported_auth:
- basic_auth
- jwt_auth
- cookie

46
modules/islandora_core_feature/config/install/rest.resource.entity.media.yml

@ -0,0 +1,46 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
module:
- basic_auth
- jsonld
- jwt
- media
- serialization
- user
id: entity.media
plugin_id: 'entity:media'
granularity: method
configuration:
GET:
supported_formats:
- jsonld
- json
supported_auth:
- basic_auth
- jwt_auth
- cookie
POST:
supported_formats:
- json
supported_auth:
- basic_auth
- jwt_auth
- cookie
DELETE:
supported_formats:
- json
supported_auth:
- basic_auth
- jwt_auth
- cookie
PATCH:
supported_formats:
- json
supported_auth:
- basic_auth
- jwt_auth
- cookie

46
modules/islandora_core_feature/config/install/rest.resource.entity.node.yml

@ -0,0 +1,46 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
module:
- basic_auth
- jsonld
- jwt
- node
- serialization
- user
id: entity.node
plugin_id: 'entity:node'
granularity: method
configuration:
GET:
supported_formats:
- jsonld
- json
supported_auth:
- basic_auth
- jwt_auth
- cookie
POST:
supported_formats:
- json
supported_auth:
- basic_auth
- jwt_auth
- cookie
DELETE:
supported_formats:
- json
supported_auth:
- basic_auth
- jwt_auth
- cookie
PATCH:
supported_formats:
- json
supported_auth:
- basic_auth
- jwt_auth
- cookie

46
modules/islandora_core_feature/config/install/rest.resource.entity.taxonomy_term.yml

@ -0,0 +1,46 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
module:
- basic_auth
- jsonld
- jwt
- serialization
- taxonomy
- user
id: entity.taxonomy_term
plugin_id: 'entity:taxonomy_term'
granularity: method
configuration:
GET:
supported_formats:
- jsonld
- json
supported_auth:
- basic_auth
- jwt_auth
- cookie
POST:
supported_formats:
- json
supported_auth:
- basic_auth
- jwt_auth
- cookie
DELETE:
supported_formats:
- json
supported_auth:
- basic_auth
- jwt_auth
- cookie
PATCH:
supported_formats:
- json
supported_auth:
- basic_auth
- jwt_auth
- cookie

7
config/install/system.action.delete_file_from_fedora.yml → modules/islandora_core_feature/config/install/system.action.delete_file_from_fedora.yml

@ -1,10 +1,9 @@
uuid: 76d619dd-54f1-4047-8e89-54d5f1a7c16a
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
module:
- islandora
enforced: enforced:
module:
- islandora_core_feature
module: module:
- islandora - islandora
id: delete_file_from_fedora id: delete_file_from_fedora
@ -12,5 +11,5 @@ label: 'Delete File from Fedora'
type: file type: file
plugin: emit_file_event plugin: emit_file_event
configuration: configuration:
queue: 'islandora-indexing-fcrepo-delete' queue: islandora-indexing-fcrepo-delete
event: delete event: delete

7
config/install/system.action.delete_media_from_triplestore.yml → modules/islandora_core_feature/config/install/system.action.delete_media_from_triplestore.yml

@ -1,10 +1,9 @@
uuid: a5f0a427-9c30-41ec-92b8-04b47855aee1
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
module:
- islandora
enforced: enforced:
module:
- islandora_core_feature
module: module:
- islandora - islandora
id: delete_media_from_triplestore id: delete_media_from_triplestore
@ -12,5 +11,5 @@ label: 'Delete Media from Triplestore'
type: media type: media
plugin: emit_media_event plugin: emit_media_event
configuration: configuration:
queue: 'islandora-indexing-triplestore-delete' queue: islandora-indexing-triplestore-delete
event: delete event: delete

7
config/install/system.action.delete_node_from_fedora.yml → modules/islandora_core_feature/config/install/system.action.delete_node_from_fedora.yml

@ -1,10 +1,9 @@
uuid: 23ad55f4-301b-4ffb-b542-4cf2c0c291d8
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
module:
- islandora
enforced: enforced:
module:
- islandora_core_feature
module: module:
- islandora - islandora
id: delete_node_from_fedora id: delete_node_from_fedora
@ -12,5 +11,5 @@ label: 'Delete Node from Fedora'
type: node type: node
plugin: emit_node_event plugin: emit_node_event
configuration: configuration:
queue: 'islandora-indexing-fcrepo-delete' queue: islandora-indexing-fcrepo-delete
event: delete event: delete

7
config/install/system.action.delete_node_from_triplestore.yml → modules/islandora_core_feature/config/install/system.action.delete_node_from_triplestore.yml

@ -1,10 +1,9 @@
uuid: 4340c20a-d314-4cbf-a26f-c36d7180ede5
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
module:
- islandora
enforced: enforced:
module:
- islandora_core_feature
module: module:
- islandora - islandora
id: delete_node_from_triplestore id: delete_node_from_triplestore
@ -12,5 +11,5 @@ label: 'Delete Node from Triplestore'
type: node type: node
plugin: emit_node_event plugin: emit_node_event
configuration: configuration:
queue: 'islandora-indexing-triplestore-delete' queue: islandora-indexing-triplestore-delete
event: delete event: delete

15
modules/islandora_core_feature/config/install/system.action.delete_taxonomy_term_in_fedora.yml

@ -0,0 +1,15 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
module:
- islandora
id: delete_taxonomy_term_in_fedora
label: 'Delete Taxonomy Term in Fedora'
type: taxonomy_term
plugin: emit_term_event
configuration:
queue: islandora-indexing-fcrepo-delete
event: Delete

15
modules/islandora_core_feature/config/install/system.action.delete_taxonomy_term_in_triplestore.yml

@ -0,0 +1,15 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
module:
- islandora
id: delete_taxonomy_term_in_triplestore
label: 'Delete Taxonomy Term in Triplestore'
type: taxonomy_term
plugin: emit_term_event
configuration:
queue: islandora-indexing-triplestore-delete
event: Delete

7
config/install/system.action.index_file_in_fedora.yml → modules/islandora_core_feature/config/install/system.action.index_file_in_fedora.yml

@ -1,10 +1,9 @@
uuid: 526d2857-de6f-472d-87e2-d8726db72301
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
module:
- islandora
enforced: enforced:
module:
- islandora_core_feature
module: module:
- islandora - islandora
id: index_file_in_fedora id: index_file_in_fedora
@ -12,5 +11,5 @@ label: 'Index File in Fedora'
type: file type: file
plugin: emit_file_event plugin: emit_file_event
configuration: configuration:
queue: 'islandora-indexing-fcrepo-file' queue: islandora-indexing-fcrepo-file
event: update event: update

7
config/install/system.action.index_media_in_fedora.yml → modules/islandora_core_feature/config/install/system.action.index_media_in_fedora.yml

@ -1,10 +1,9 @@
d: 27ce85fc-a9fe-46f5-b518-5af1126e2368
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
module:
- islandora
enforced: enforced:
module:
- islandora_core_feature
module: module:
- islandora - islandora
id: index_media_in_fedora id: index_media_in_fedora
@ -12,5 +11,5 @@ label: 'Index Media in Fedora'
type: media type: media
plugin: emit_media_event plugin: emit_media_event
configuration: configuration:
queue: 'islandora-indexing-fcrepo-media' queue: islandora-indexing-fcrepo-media
event: update event: update

7
config/install/system.action.index_media_in_triplestore.yml → modules/islandora_core_feature/config/install/system.action.index_media_in_triplestore.yml

@ -1,10 +1,9 @@
uuid: f7c9169d-6556-4720-b225-11a09581272e
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
module:
- islandora
enforced: enforced:
module:
- islandora_core_feature
module: module:
- islandora - islandora
id: index_media_in_triplestore id: index_media_in_triplestore
@ -12,5 +11,5 @@ label: 'Index Media in Triplestore'
type: media type: media
plugin: emit_media_event plugin: emit_media_event
configuration: configuration:
queue: 'islandora-indexing-triplestore-index' queue: islandora-indexing-triplestore-index
event: update event: update

7
config/install/system.action.index_node_in_fedora.yml → modules/islandora_core_feature/config/install/system.action.index_node_in_fedora.yml

@ -1,10 +1,9 @@
uuid: edb74080-7cf3-45e7-97e2-78cd7494ea92
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
module:
- islandora
enforced: enforced:
module:
- islandora_core_feature
module: module:
- islandora - islandora
id: index_node_in_fedora id: index_node_in_fedora
@ -12,5 +11,5 @@ label: 'Index Node in Fedora'
type: node type: node
plugin: emit_node_event plugin: emit_node_event
configuration: configuration:
queue: 'islandora-indexing-fcrepo-content' queue: islandora-indexing-fcrepo-content
event: update event: update

7
config/install/system.action.index_node_in_triplestore.yml → modules/islandora_core_feature/config/install/system.action.index_node_in_triplestore.yml

@ -1,10 +1,9 @@
uuid: 5012a177-307c-4ee0-a986-cd35d76f2a58
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
module:
- islandora
enforced: enforced:
module:
- islandora_core_feature
module: module:
- islandora - islandora
id: index_node_in_triplestore id: index_node_in_triplestore
@ -12,5 +11,5 @@ label: 'Index Node in Triplestore'
type: node type: node
plugin: emit_node_event plugin: emit_node_event
configuration: configuration:
queue: 'islandora-indexing-triplestore-index' queue: islandora-indexing-triplestore-index
event: update event: update

15
modules/islandora_core_feature/config/install/system.action.index_taxonomy_term_in_fedora.yml

@ -0,0 +1,15 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
module:
- islandora
id: index_taxonomy_term_in_fedora
label: 'Index taxonomy term in Fedora'
type: taxonomy_term
plugin: emit_term_event
configuration:
queue: islandora-indexing-fcrepo-content
event: Update

15
modules/islandora_core_feature/config/install/system.action.index_taxonomy_term_in_the_triplestore.yml

@ -0,0 +1,15 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
module:
- islandora
id: index_taxonomy_term_in_the_triplestore
label: 'Index Taxonomy Term in the Triplestore'
type: taxonomy_term
plugin: emit_term_event
configuration:
queue: islandora-indexing-triplestore-index
event: Update

11
modules/islandora_core_feature/config/install/taxonomy.vocabulary.tags.yml

@ -0,0 +1,11 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
name: Tags
vid: tags
description: 'Use tags to group articles on similar topics into categories.'
hierarchy: 0
weight: 0

422
modules/islandora_core_feature/config/install/views.view.display_media.yml

@ -0,0 +1,422 @@
langcode: en
status: true
dependencies:
config:
- core.entity_view_mode.media.source
enforced:
module:
- islandora_core_feature
module:
- eva
- media
- taxonomy
- user
id: display_media
label: 'Media EVAs'
module: views
description: 'Displays media for content as EVA''s per model.'
tag: ''
base_table: media_field_data
base_field: mid
core: 8.x
display:
default:
display_plugin: default
id: default
display_title: Master
position: 0
display_options:
access:
type: perm
options:
perm: 'view media'
cache:
type: tag
options: { }
query:
type: views_query
options:
disable_sql_rewrite: false
distinct: false
replica: false
query_comment: ''
query_tags: { }
exposed_form:
type: basic
options:
submit_button: Apply
reset_button: false
reset_button_label: Reset
exposed_sorts_label: 'Sort by'
expose_sort_order: true
sort_asc_label: Asc
sort_desc_label: Desc
pager:
type: some
options:
items_per_page: 1
offset: 0
style:
type: default
options:
row_class: ''
default_row_class: true
uses_fields: false
row:
type: 'entity:media'
options:
relationship: none
view_mode: source
fields:
name:
id: name
table: media_field_data
field: name
entity_type: media
entity_field: media
label: ''
alter:
alter_text: false
make_link: false
absolute: false
trim: false
word_boundary: false
ellipsis: false
strip_tags: false
html: false
hide_empty: false
empty_zero: false
settings:
link_to_entity: true
plugin_id: field
relationship: none
group_type: group
admin_label: ''
exclude: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_alter_empty: true
click_sort_column: value
type: string
group_column: value
group_columns: { }
group_rows: true
delta_limit: 0
delta_offset: 0
delta_reversed: false
delta_first_last: false
multi_type: separator
separator: ', '
field_api_classes: false
filters:
status:
value: '1'
table: media_field_data
field: status
plugin_id: boolean
entity_type: media
entity_field: status
id: status
expose:
operator: ''
group: 1
sorts: { }
title: ''
header: { }
footer: { }
empty: { }
relationships:
field_tags:
id: field_tags
table: media__field_tags
field: field_tags
relationship: none
group_type: group
admin_label: 'field_tags: Taxonomy term'
required: false
plugin_id: standard
arguments:
field_media_of_target_id:
id: field_media_of_target_id
table: media__field_media_of
field: field_media_of_target_id
relationship: none
group_type: group
admin_label: ''
default_action: default
exception:
value: all
title_enable: false
title: All
title_enable: false
title: ''
default_argument_type: node
default_argument_options: { }
default_argument_skip_url: false
summary_options:
base_path: ''
count: true
items_per_page: 25
override: false
summary:
sort_order: asc
number_of_records: 0
format: default_summary
specify_validation: false
validate:
type: none
fail: 'not found'
validate_options: { }
break_phrase: false
not: false
plugin_id: numeric
display_extenders: { }
cache_metadata:
max-age: -1
contexts:
- 'languages:language_content'
- 'languages:language_interface'
- url
- user.permissions
tags: { }
entity_view_1:
display_plugin: entity_view
id: entity_view_1
display_title: 'Preservation Master - Download'
position: 1
display_options:
display_extenders: { }
display_description: 'Best quality representation of the Object appropriate for long-term preservation.'
filters:
status:
value: '1'
table: media_field_data
field: status
plugin_id: boolean
entity_type: media
entity_field: status
id: status
expose:
operator: ''
group: 1
field_external_uri_uri:
id: field_external_uri_uri
table: taxonomy_term__field_external_uri
field: field_external_uri_uri
relationship: field_tags
group_type: group
admin_label: ''
operator: '='
value: 'http://pcdm.org/use#PreservationMasterFile'
group: 1
exposed: false
expose:
operator_id: ''
label: ''
description: ''
use_operator: false
operator: ''
identifier: ''
required: false
remember: false
multiple: false
remember_roles:
authenticated: authenticated
placeholder: ''
is_grouped: false
group_info:
label: ''
description: ''
identifier: ''
optional: true
widget: select
multiple: false
remember: false
default_group: All
default_group_multiple: { }
group_items: { }
plugin_id: string
defaults:
filters: false
filter_groups: false
filter_groups:
operator: AND
groups:
1: AND
entity_type: node
bundles:
- islandora_object
argument_mode: id
default_argument: null
title: 'Preservation Master'
show_title: false
cache_metadata:
max-age: -1
contexts:
- 'languages:language_content'
- 'languages:language_interface'
- url
- user.permissions
tags: { }
service_file:
display_plugin: entity_view
id: service_file
display_title: 'Service File'
position: 1
display_options:
display_extenders: { }
display_description: 'A medium quality representation of the Object appropriate for serving to users.'
filters:
status:
value: '1'
table: media_field_data
field: status
plugin_id: boolean
entity_type: media
entity_field: status
id: status
expose:
operator: ''
group: 1
field_external_uri_uri:
id: field_external_uri_uri
table: taxonomy_term__field_external_uri
field: field_external_uri_uri
relationship: field_tags
group_type: group
admin_label: ''
operator: '='
value: 'http://pcdm.org/use#ServiceFile'
group: 1
exposed: false
expose:
operator_id: ''
label: ''
description: ''
use_operator: false
operator: ''
identifier: ''
required: false
remember: false
multiple: false
remember_roles:
authenticated: authenticated
placeholder: ''
is_grouped: false
group_info:
label: ''
description: ''
identifier: ''
optional: true
widget: select
multiple: false
remember: false
default_group: All
default_group_multiple: { }
group_items: { }
plugin_id: string
defaults:
filters: false
filter_groups: false
title: false
filter_groups:
operator: AND
groups:
1: AND
entity_type: node
bundles:
- islandora_object
title: 'Service File'
cache_metadata:
max-age: -1
contexts:
- 'languages:language_content'
- 'languages:language_interface'
- url
- user.permissions
tags: { }
thumbnail:
display_plugin: entity_view
id: thumbnail
display_title: Thumbnail
position: 1
display_options:
display_extenders: { }
display_description: 'A low resolution image representation of the Object appropriate for using as an icon.'
filters:
status:
value: '1'
table: media_field_data
field: status
plugin_id: boolean
entity_type: media
entity_field: status
id: status
expose:
operator: ''
group: 1
field_external_uri_uri:
id: field_external_uri_uri
table: taxonomy_term__field_external_uri
field: field_external_uri_uri
relationship: field_tags
group_type: group
admin_label: ''
operator: '='
value: 'http://pcdm.org/use#ThumbnailImage'
group: 1
exposed: false
expose:
operator_id: ''
label: ''
description: ''
use_operator: false
operator: ''
identifier: ''
required: false
remember: false
multiple: false
remember_roles:
authenticated: authenticated
placeholder: ''
is_grouped: false
group_info:
label: ''
description: ''
identifier: ''
optional: true
widget: select
multiple: false
remember: false
default_group: All
default_group_multiple: { }
group_items: { }
plugin_id: string
defaults:
filters: false
filter_groups: false
title: false
filter_groups:
operator: AND
groups:
1: AND
entity_type: node
bundles:
- islandora_object
title: Thumbnail
show_title: false
cache_metadata:
max-age: -1
contexts:
- 'languages:language_content'
- 'languages:language_interface'
- url
- user.permissions
tags: { }

12
config/install/views.view.file_checksum.yml → modules/islandora_core_feature/config/install/views.view.file_checksum.yml

@ -1,19 +1,13 @@
uuid: cd3f8b61-8032-4c3d-9de3-624b298c9bca
langcode: en langcode: en
status: true status: true
dependencies: dependencies:
enforced:
module:
- islandora_core_feature
module: module:
- basic_auth
- file - file
- jwt
- rest - rest
- serialization - serialization
- user
enforced:
module:
- islandora
_core:
default_config_hash: e7XqQa-N16XDqeDTA7Ohgx6iLb6mIQ1RUs0krFFIbAw
id: file_checksum id: file_checksum
label: 'File Checksum' label: 'File Checksum'
module: views module: views

342
modules/islandora_core_feature/config/install/views.view.manage_members.yml

@ -0,0 +1,342 @@
langcode: en
status: true
dependencies:
enforced:
module:
- islandora_core_feature
module:
- jsonld
- node
- rest
- serialization
- user
id: manage_members
label: 'Manage members'
module: views
description: 'Manage members belonging to a piece of content'
tag: ''
base_table: node_field_data
base_field: nid
core: 8.x
display:
default:
display_plugin: default
id: default
display_title: Master
position: 0
display_options:
access:
type: perm
options:
perm: 'manage members'
cache:
type: tag
options: { }
query:
type: views_query
options:
disable_sql_rewrite: false
distinct: false
replica: false
query_comment: ''
query_tags: { }
exposed_form:
type: basic
options:
submit_button: Apply
reset_button: false
reset_button_label: Reset
exposed_sorts_label: 'Sort by'
expose_sort_order: true
sort_asc_label: Asc
sort_desc_label: Desc
pager:
type: mini
options:
items_per_page: 10
offset: 0
id: 0
total_pages: null
expose:
items_per_page: false
items_per_page_label: 'Items per page'
items_per_page_options: '5, 10, 25, 50'
items_per_page_options_all: false
items_per_page_options_all_label: '- All -'
offset: false
offset_label: Offset
tags:
previous: ‹‹
next: ››
style:
type: table
row:
type: fields
fields:
node_bulk_form:
id: node_bulk_form
table: node
field: node_bulk_form
relationship: none
group_type: group
admin_label: ''
label: 'Node operations bulk form'
exclude: false
alter:
alter_text: false
text: ''
make_link: false
path: ''
absolute: false
external: false
replace_spaces: false
path_case: none
trim_whitespace: false
alt: ''
rel: ''
link_class: ''
prefix: ''
suffix: ''
target: ''
nl2br: false
max_length: 0
word_boundary: true
ellipsis: true
more_link: false
more_link_text: ''
more_link_path: ''
strip_tags: false
trim: false
preserve_tags: ''
html: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
action_title: Action
include_exclude: exclude
selected_actions: { }
entity_type: node
plugin_id: node_bulk_form
title:
id: title
table: node_field_data
field: title
entity_type: node
entity_field: title
alter:
alter_text: false
make_link: false
absolute: false
trim: false
word_boundary: false
ellipsis: false
strip_tags: false
html: false
hide_empty: false
empty_zero: false
settings:
link_to_entity: true
plugin_id: field
relationship: none
group_type: group
admin_label: ''
label: Title
exclude: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_alter_empty: true
click_sort_column: value
type: string
group_column: value
group_columns: { }
group_rows: true
delta_limit: 0
delta_offset: 0
delta_reversed: false
delta_first_last: false
multi_type: separator
separator: ', '
field_api_classes: false
operations:
id: operations
table: node
field: operations
relationship: none
group_type: group
admin_label: ''
label: 'Operations links'
exclude: false
alter:
alter_text: false
text: ''
make_link: false
path: ''
absolute: false
external: false
replace_spaces: false
path_case: none
trim_whitespace: false
alt: ''
rel: ''
link_class: ''
prefix: ''
suffix: ''
target: ''
nl2br: false
max_length: 0
word_boundary: true
ellipsis: true
more_link: false
more_link_text: ''
more_link_path: ''
strip_tags: false
trim: false
preserve_tags: ''
html: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
destination: false
entity_type: node
plugin_id: entity_operations
filters: { }
sorts: { }
title: 'Manage members'
header: { }
footer: { }
empty: { }
relationships: { }
arguments:
field_member_of_target_id:
id: field_member_of_target_id
table: node__field_member_of
field: field_member_of_target_id
relationship: none
group_type: group
admin_label: ''
default_action: default
exception:
value: all
title_enable: false
title: All
title_enable: false
title: ''
default_argument_type: node
default_argument_options: { }
default_argument_skip_url: false
summary_options:
base_path: ''
count: true
items_per_page: 25
override: false
summary:
sort_order: asc
number_of_records: 0
format: default_summary
specify_validation: true
validate:
type: 'entity:node'
fail: 'not found'
validate_options:
operation: view
multiple: 0
bundles: { }
access: false
break_phrase: false
not: false
plugin_id: numeric
display_extenders: { }
filter_groups:
operator: AND
groups: { }
cache_metadata:
max-age: 0
contexts:
- 'languages:language_content'
- 'languages:language_interface'
- url
- url.query_args
- 'user.node_grants:view'
- user.permissions
tags: { }
page_1:
display_plugin: page
id: page_1
display_title: Page
position: 1
display_options:
display_extenders: { }
path: node/%node/members
menu:
type: tab
title: Members
description: ''
expanded: false
parent: ''
weight: 0
context: '0'
menu_name: main
cache_metadata:
max-age: 0
contexts:
- 'languages:language_content'
- 'languages:language_interface'
- url
- url.query_args
- 'user.node_grants:view'
- user.permissions
tags: { }
rest_export_1:
display_plugin: rest_export
id: rest_export_1
display_title: 'REST export'
position: 1
display_options:
display_extenders: { }
path: node/%node/members
style:
type: serializer
options:
uses_fields: false
formats:
jsonld: jsonld
json: json
auth:
- basic_auth
- jwt_auth
- cookie
cache_metadata:
max-age: 0
contexts:
- 'languages:language_content'
- 'languages:language_interface'
- request_format
- url
- 'user.node_grants:view'
- user.permissions
tags: { }

1235
modules/islandora_core_feature/config/install/views.view.media_of.yml

File diff suppressed because it is too large Load Diff

255
modules/islandora_core_feature/config/install/views.view.members.yml

@ -0,0 +1,255 @@
langcode: en
status: true
dependencies:
config:
- core.entity_view_mode.node.teaser
enforced:
module:
- islandora_core_feature
module:
- node
- user
id: members
label: Members
module: views
description: 'Displays members for content.'
tag: ''
base_table: node_field_data
base_field: nid
core: 8.x
display:
default:
display_plugin: default
id: default
display_title: Master
position: 0
display_options:
access:
type: perm
options:
perm: 'access content'
cache:
type: tag
options: { }
query:
type: views_query
options:
disable_sql_rewrite: false
distinct: false
replica: false
query_comment: ''
query_tags: { }
exposed_form:
type: basic
options:
submit_button: Apply
reset_button: false
reset_button_label: Reset
exposed_sorts_label: 'Sort by'
expose_sort_order: true
sort_asc_label: Asc
sort_desc_label: Desc
pager:
type: mini
options:
items_per_page: 10
offset: 0
id: 0
total_pages: null
expose:
items_per_page: false
items_per_page_label: 'Items per page'
items_per_page_options: '5, 10, 25, 50'
items_per_page_options_all: false
items_per_page_options_all_label: '- All -'
offset: false
offset_label: Offset
tags:
previous: ‹‹
next: ››
style:
type: default
options:
grouping: { }
row_class: ''
default_row_class: true
uses_fields: false
row:
type: 'entity:node'
options:
relationship: none
view_mode: teaser
fields:
title:
id: title
table: node_field_data
field: title
entity_type: node
entity_field: title
label: ''
alter:
alter_text: false
make_link: false
absolute: false
trim: false
word_boundary: false
ellipsis: false
strip_tags: false
html: false
hide_empty: false
empty_zero: false
settings:
link_to_entity: true
plugin_id: field
relationship: none
group_type: group
admin_label: ''
exclude: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_alter_empty: true
click_sort_column: value
type: string
group_column: value
group_columns: { }
group_rows: true
delta_limit: 0
delta_offset: 0
delta_reversed: false
delta_first_last: false
multi_type: separator
separator: ', '
field_api_classes: false
filters:
status:
id: status
table: node_field_data
field: status
relationship: none
group_type: group
admin_label: ''
operator: '='
value: '1'
group: 1
exposed: false
expose:
operator_id: ''
label: ''
description: ''
use_operator: false
operator: ''
identifier: ''
required: false
remember: false
multiple: false
remember_roles:
authenticated: authenticated
is_grouped: false
group_info:
label: ''
description: ''
identifier: ''
optional: true
widget: select
multiple: false
remember: false
default_group: All
default_group_multiple: { }
group_items: { }
entity_type: node
entity_field: status
plugin_id: boolean
sorts:
created:
id: created
table: node_field_data
field: created
order: DESC
entity_type: node
entity_field: created
plugin_id: date
relationship: none
group_type: group
admin_label: ''
exposed: false
expose:
label: ''
granularity: second
header: { }
footer: { }
empty: { }
relationships: { }
arguments:
field_member_of_target_id:
id: field_member_of_target_id
table: node__field_member_of
field: field_member_of_target_id
relationship: none
group_type: group
admin_label: ''
default_action: default
exception:
value: all
title_enable: false
title: All
title_enable: false
title: ''
default_argument_type: node
default_argument_options: { }
default_argument_skip_url: false
summary_options:
base_path: ''
count: true
items_per_page: 25
override: false
summary:
sort_order: asc
number_of_records: 0
format: default_summary
specify_validation: false
validate:
type: none
fail: 'not found'
validate_options: { }
break_phrase: false
not: false
plugin_id: numeric
display_extenders: { }
filter_groups:
operator: AND
groups: { }
title: Members
cache_metadata:
max-age: -1
contexts:
- 'languages:language_content'
- 'languages:language_interface'
- url
- url.query_args
- 'user.node_grants:view'
- user.permissions
tags: { }
block_1:
display_plugin: block
id: block_1
display_title: Block
position: 2
display_options:
display_extenders: { }
cache_metadata:
max-age: -1
contexts:
- 'languages:language_content'
- 'languages:language_interface'
- url
- url.query_args
- 'user.node_grants:view'
- user.permissions
tags: { }

2
modules/islandora_core_feature/islandora_core_feature.features.yml

@ -0,0 +1,2 @@
bundle: islandora
required: true

26
modules/islandora_core_feature/islandora_core_feature.info.yml

@ -0,0 +1,26 @@
name: 'Islandora Core Feature'
description: 'Minimum configuration required for Islandora.'
type: module
core: 8.x
dependencies:
- basic_auth
- eva
- features
- field
- file
- image
- islandora
- jsonld
- jwt
- link
- media
- migrate_plus
- node
- rdf
- rest
- serialization
- system
- taxonomy
- user
- views
package: Islandora

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save