diff --git a/js/openseadragon_viewer.js b/js/openseadragon_viewer.js index f6d6fb0..7883887 100644 --- a/js/openseadragon_viewer.js +++ b/js/openseadragon_viewer.js @@ -124,5 +124,6 @@ }); } + return viewer; }; })(once); diff --git a/modules/openseadragon_bookmark_url/README.md b/modules/openseadragon_bookmark_url/README.md new file mode 100644 index 0000000..7876f96 --- /dev/null +++ b/modules/openseadragon_bookmark_url/README.md @@ -0,0 +1,21 @@ +# OpenSeadragon Bookmark URL + +Enables the OpenSeadragon Bookmark URL plugin that tracks OpenSeadragon zoom level and coordinates to allow sharing of a display via URL. + +This module assumes you have added a string field to a media type that can hold the bookmark fragment, e.g. +`file` with `field_bookmark_url`. + +## Requirements +- [OpenSeadragon](https://www.drupal.org/project/openseadragon) + +## Installation + +Install as you would normally install a contributed Drupal module. For further information, see +[Installing Drupal Modules](https://www.drupal.org/docs/extending-drupal/installing-modules). + +## Configuration +Currently, no UI exists for configuration. + +Create an openseadragon_bookmark_url.settings.yml file and set `bookmark_url_bundle` to the media type, e.g. `file`, and `bookmark_url_field` to the field. The value from the specific media and field are inject into the Drupal settings available to javascript. +* `bookmark_url_bundle`: `file` +* `bookmark_url_field`: `field_bookmark_url` diff --git a/modules/openseadragon_bookmark_url/config/install/openseadragon_bookmark_url.settings.yml b/modules/openseadragon_bookmark_url/config/install/openseadragon_bookmark_url.settings.yml new file mode 100644 index 0000000..774f308 --- /dev/null +++ b/modules/openseadragon_bookmark_url/config/install/openseadragon_bookmark_url.settings.yml @@ -0,0 +1,5 @@ +# Default configuration for the OpenSeadragon Bookmark URL submodule. +# These values are intentionally empty; an administrator must choose the +# appropriate content type and field for their site via the settings form. +bookmark_url_bundle: '' +bookmark_url_field: '' diff --git a/modules/openseadragon_bookmark_url/config/schema/openseadragon_bookmark_url.schema.yml b/modules/openseadragon_bookmark_url/config/schema/openseadragon_bookmark_url.schema.yml new file mode 100644 index 0000000..8cc8d2a --- /dev/null +++ b/modules/openseadragon_bookmark_url/config/schema/openseadragon_bookmark_url.schema.yml @@ -0,0 +1,22 @@ +# Schema for openseadragon_bookmark_url.settings config object. + +openseadragon_bookmark_url.settings: + type: config_object + label: 'OpenSeadragon Bookmark URL settings' + mapping: + bookmark_url_bundle: + type: string + label: 'Content type (bundle) machine name' + constraints: + # Must be a valid (media) bundle machine name or empty string. + Regex: + pattern: '/^[a-z0-9_]*$/' + message: 'The bundle must be a valid machine name (lowercase letters, digits, and underscores only).' + + bookmark_url_field: + type: string + label: 'Field machine name that stores the bookmark URL' + constraints: + Regex: + pattern: '/^[a-z0-9_]*$/' + message: 'The field name must be a valid machine name (lowercase letters, digits, and underscores only).' diff --git a/modules/openseadragon_bookmark_url/js/drupal-openseadragon-bookmark-url.js b/modules/openseadragon_bookmark_url/js/drupal-openseadragon-bookmark-url.js new file mode 100644 index 0000000..ed1986c --- /dev/null +++ b/modules/openseadragon_bookmark_url/js/drupal-openseadragon-bookmark-url.js @@ -0,0 +1,42 @@ +/*jslint browser: true*/ +/*global OpenSeadragon, Drupal*/ +/** + * @file + * Attaches openseadragon-bookmark-url to OpenSeadragon viewer. + */ +(function($, Drupal, drupalSettings, once) { + 'use strict'; + + /** + * The DOM element that represents the Singleton Instance of this class. + * @type {string} + */ + var base = '#openseadragon-viewer'; + + /** + * Invoke bookmark url plugin. + */ + Drupal.behaviors.openSeadragonBookmarkURL = { + attach: function(context, settings) { + Object.keys(settings.openseadragon).forEach(function(osdViewerId) { + // Use custom element #id if set. + base = '#' + osdViewerId; + once('openSeadragonViewerBookmarkURL', base, context).forEach(function () { + // Load bookmark url, but without page tracking, to allow hash to be set. + Drupal.openSeadragonViewer[base].bookmarkUrl({trackPage: false}); + if (window.location.hash === '') { + var hash = settings.openseadragon[osdViewerId].openseadragonBookmarkUrl; + if (hash !== '') { + window.location.hash = hash; + } + } + // With hash set or not, once OSD loaded, begin page tracking. + Drupal.openSeadragonViewer[base].addOnceHandler('open', function(){ + Drupal.openSeadragonViewer[base].bookmarkUrl({trackPage: true}); + }); + }); + }); + } + }; + +})($, Drupal, drupalSettings, once); diff --git a/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.info.yml b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.info.yml new file mode 100644 index 0000000..98a4ddd --- /dev/null +++ b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.info.yml @@ -0,0 +1,7 @@ +name: 'OpenSeadragon Bookmark URL' +type: module +description: 'Wrapper for https://github.com/openseadragon/bookmark-url library' +package: Media +core_version_requirement: ^10 || ^11 +dependencies: + - openseadragon:openseadragon diff --git a/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.libraries.yml b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.libraries.yml new file mode 100644 index 0000000..ce22ba3 --- /dev/null +++ b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.libraries.yml @@ -0,0 +1,23 @@ +plugin: + remote: https://github.com/openseadragon/bookmark-url + version: "0.0.5" + license: + name: BSD-3-Clause + url: https://github.com/openseadragon/bookmark-url/blob/master/LICENSE + gpl-compatible: true + js: + https://cdn.jsdelivr.net/gh/openseadragon/bookmark-url@13c534c6ad7078fa44675f23185b75ee760d659c/openseadragon-bookmark-url.js: + type: external + minified: false + attributes: + integrity: "sha256-RDZWd2DzG9Asb3Pf3U0UrC0wKEGVJaC3D00Z9mqN63w=" + crossorigin: anonymous +openseadragon_bookmark_url: + js: + js/drupal-openseadragon-bookmark-url.js: {} + dependencies: + - core/drupal + - core/once + - core/drupalSettings + - openseadragon/openseadragon + - openseadragon_bookmark_url/plugin diff --git a/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module new file mode 100644 index 0000000..cfcc1a8 --- /dev/null +++ b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.module @@ -0,0 +1,38 @@ +get('bookmark_url_bundle'); + $bookmark_url_field = $config->get('bookmark_url_field'); + if (isset($item['content']['#entity'])) { + $entity = $item['content']['#entity']; + if ($entity->bundle() == $bookmark_url_bundle) { + $openseadragon_viewer_id = 'openseadragon-viewer-' . $entity->id(); + if ($entity->hasField($bookmark_url_field)) { + $fragment = $entity->get($bookmark_url_field)->value; + $variables['#attached']['drupalSettings']['openseadragon'][$openseadragon_viewer_id]['openseadragonBookmarkUrl'] = $fragment; + } + } + } + } + } + } +} diff --git a/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.services.yml b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.services.yml new file mode 100644 index 0000000..6eca5c9 --- /dev/null +++ b/modules/openseadragon_bookmark_url/openseadragon_bookmark_url.services.yml @@ -0,0 +1,5 @@ +services: + openseadragon_bookmark_url.config: + class: Drupal\openseadragon_bookmark_url\BookmarkUrlConfig + arguments: + - '@config.factory' diff --git a/modules/openseadragon_bookmark_url/src/BookmarkUrlConfig.php b/modules/openseadragon_bookmark_url/src/BookmarkUrlConfig.php new file mode 100644 index 0000000..3fbca09 --- /dev/null +++ b/modules/openseadragon_bookmark_url/src/BookmarkUrlConfig.php @@ -0,0 +1,62 @@ +getBundle(); + * $field = $config->getField(); + * @endcode + */ +final class BookmarkUrlConfig { + + private const CONFIG_NAME = 'openseadragon_bookmark_url.settings'; + + /** + * The openseadragon bookmark url config. + * + * @var \Drupal\Core\Config\ImmutableConfig + */ + private ImmutableConfig $config; + + /** + * Constructs a BookmarkUrlConfig instance. + * + * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory + * The Drupal config factory service. + */ + public function __construct(ConfigFactoryInterface $configFactory) { + $this->config = $configFactory->get(self::CONFIG_NAME); + } + + /** + * Returns the configured node bundle machine name, or an empty string. + */ + public function getBundle(): string { + return $this->config->get('bookmark_url_bundle') ?? ''; + } + + /** + * Returns the configured field machine name, or an empty string. + */ + public function getField(): string { + return $this->config->get('bookmark_url_field') ?? ''; + } + + /** + * Returns TRUE when both bundle and field have been set by an administrator. + */ + public function isConfigured(): bool { + return $this->getBundle() !== '' && $this->getField() !== ''; + } + +}