Initial Drupal 11 with DDEV setup
This commit is contained in:
@ -0,0 +1,175 @@
|
||||
(($, Drupal) => {
|
||||
Drupal.contextual.ContextualToolbarModelView = class {
|
||||
constructor(options) {
|
||||
this.strings = options.strings;
|
||||
this.isVisible = false;
|
||||
this._contextualCount = Drupal.contextual.instances.count;
|
||||
this.tabbingContext = null;
|
||||
this._isViewing =
|
||||
localStorage.getItem('Drupal.contextualToolbar.isViewing') !== 'false';
|
||||
this.$el = options.el;
|
||||
|
||||
window.addEventListener('contextual-instances-added', () =>
|
||||
this.lockNewContextualLinks(),
|
||||
);
|
||||
window.addEventListener('contextual-instances-removed', () => {
|
||||
this.contextualCount = Drupal.contextual.instances.count;
|
||||
});
|
||||
|
||||
this.$el.on({
|
||||
click: () => {
|
||||
this.isViewing = !this.isViewing;
|
||||
},
|
||||
touchend: (event) => {
|
||||
event.preventDefault();
|
||||
event.target.click();
|
||||
},
|
||||
'click touchend': () => this.render(),
|
||||
});
|
||||
|
||||
$(document).on('keyup', (event) => this.onKeypress(event));
|
||||
this.manageTabbing(true);
|
||||
this.render();
|
||||
}
|
||||
|
||||
/**
|
||||
* Responds to esc and tab key press events.
|
||||
*
|
||||
* @param {jQuery.Event} event
|
||||
* The keypress event.
|
||||
*/
|
||||
onKeypress(event) {
|
||||
// The first tab key press is tracked so that an announcement about
|
||||
// tabbing constraints can be raised if edit mode is enabled when the page
|
||||
// is loaded.
|
||||
if (!this.announcedOnce && event.keyCode === 9 && !this.isViewing) {
|
||||
this.announceTabbingConstraint();
|
||||
// Set announce to true so that this conditional block won't run again.
|
||||
this.announcedOnce = true;
|
||||
}
|
||||
// Respond to the ESC key. Exit out of edit mode.
|
||||
if (event.keyCode === 27) {
|
||||
this.isViewing = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the rendered representation of the current toolbar model view.
|
||||
*/
|
||||
render() {
|
||||
this.$el[0].classList.toggle('hidden', this.isVisible);
|
||||
const button = this.$el[0].querySelector('button');
|
||||
button.classList.toggle('is-active', !this.isViewing);
|
||||
button.setAttribute('aria-pressed', !this.isViewing);
|
||||
this.contextualCount = Drupal.contextual.instances.count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Automatically updates visibility of the view/edit mode toggle.
|
||||
*/
|
||||
updateVisibility() {
|
||||
this.isVisible = this.get('contextualCount') > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Lock newly added contextual links if edit mode is enabled.
|
||||
*/
|
||||
lockNewContextualLinks() {
|
||||
Drupal.contextual.instances.forEach((model) => {
|
||||
model.isLocked = !this.isViewing;
|
||||
});
|
||||
this.contextualCount = Drupal.contextual.instances.count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Limits tabbing to the contextual links and edit mode toolbar tab.
|
||||
*
|
||||
* @param {boolean} init - true to initialize tabbing.
|
||||
*/
|
||||
manageTabbing(init = false) {
|
||||
let { tabbingContext } = this;
|
||||
// Always release an existing tabbing context.
|
||||
if (tabbingContext && !init) {
|
||||
// Only announce release when the context was active.
|
||||
if (tabbingContext.active) {
|
||||
Drupal.announce(this.strings.tabbingReleased);
|
||||
}
|
||||
tabbingContext.release();
|
||||
this.tabbingContext = null;
|
||||
}
|
||||
// Create a new tabbing context when edit mode is enabled.
|
||||
if (!this.isViewing) {
|
||||
tabbingContext = Drupal.tabbingManager.constrain(
|
||||
$('.contextual-toolbar-tab, .contextual'),
|
||||
);
|
||||
this.tabbingContext = tabbingContext;
|
||||
this.announceTabbingConstraint();
|
||||
this.announcedOnce = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Announces the current tabbing constraint.
|
||||
*/
|
||||
announceTabbingConstraint() {
|
||||
const { strings } = this;
|
||||
Drupal.announce(
|
||||
Drupal.formatString(strings.tabbingConstrained, {
|
||||
'@contextualsCount': Drupal.formatPlural(
|
||||
Drupal.contextual.instances.length,
|
||||
'@count contextual link',
|
||||
'@count contextual links',
|
||||
),
|
||||
}) + strings.pressEsc,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the current viewing state.
|
||||
*
|
||||
* @return {boolean} the viewing state.
|
||||
*/
|
||||
get isViewing() {
|
||||
return this._isViewing;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the current viewing state.
|
||||
*
|
||||
* @param {boolean} value - new viewing state
|
||||
*/
|
||||
set isViewing(value) {
|
||||
this._isViewing = value;
|
||||
localStorage[!value ? 'setItem' : 'removeItem'](
|
||||
'Drupal.contextualToolbar.isViewing',
|
||||
'false',
|
||||
);
|
||||
|
||||
Drupal.contextual.instances.forEach((model) => {
|
||||
model.isLocked = !this.isViewing;
|
||||
});
|
||||
this.manageTabbing();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the current contextual links count.
|
||||
*
|
||||
* @return {integer} the current contextual links count.
|
||||
*/
|
||||
get contextualCount() {
|
||||
return this._contextualCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the current contextual links count.
|
||||
*
|
||||
* @param {integer} value - new contextual links count.
|
||||
*/
|
||||
set contextualCount(value) {
|
||||
if (value !== this._contextualCount) {
|
||||
this._contextualCount = value;
|
||||
this.updateVisibility();
|
||||
}
|
||||
}
|
||||
};
|
||||
})(jQuery, Drupal);
|
||||
Reference in New Issue
Block a user