AI-in-Healthcare / Developer Meetup in Boston Generative AI Use Cases in Healthcare _files /js__AHgjf2ygf84Pe0mY75o8LxG_JniCslUWjSju-MgdGEE__Qd-WIxQp7S5P.js
nmitchko's picture
Upload 77 files
1e4c25f
raw
history blame
No virus
11.6 kB
(function ($) {
/**
* Attaches the autocomplete behavior to all required fields.
*/
Drupal.behaviors.autocomplete = {
attach: function (context) {
var $context = $(context);
var acdb = [];
$context.find('input.autocomplete').once('autocomplete', function () {
var uri = this.value;
if (!acdb[uri]) {
acdb[uri] = new Drupal.ACDB(uri);
}
var $input = $context.find('#' + this.id.substr(0, this.id.length - 13))
.attr('autocomplete', 'OFF')
.attr('aria-autocomplete', 'list');
$context.find($input[0].form).submit(Drupal.autocompleteSubmit);
$input.parents('.form-item')
.attr('role', 'application')
.append($('<span class="element-invisible" aria-live="assertive"></span>')
.attr('id', $input.attr('id') + '-autocomplete-aria-live')
);
new Drupal.jsAC($input, acdb[uri], $context);
});
}
};
/**
* Prevents the form from submitting if the suggestions popup is open
* and closes the suggestions popup when doing so.
*/
Drupal.autocompleteSubmit = function () {
$('.form-autocomplete > .dropdown').each(function () {
this.owner.hidePopup();
});
// Always return true to make it possible to submit even when there was an
// autocomplete suggestion list open.
return true;
};
/**
* Highlights a suggestion.
*/
Drupal.jsAC.prototype.highlight = function (node) {
if (this.selected) {
$(this.selected).removeClass('active');
}
$(node).addClass('active');
this.selected = node;
$(this.ariaLive).html($(this.selected).html());
};
/**
* Unhighlights a suggestion.
*/
Drupal.jsAC.prototype.unhighlight = function (node) {
$(node).removeClass('active');
this.selected = false;
$(this.ariaLive).empty();
};
/**
* Positions the suggestions popup and starts a search.
*/
Drupal.jsAC.prototype.populatePopup = function () {
var $input = $(this.input);
// Show popup.
if (this.popup) {
$(this.popup).remove();
}
this.selected = false;
this.popup = $('<div class="dropdown"></div>')[0];
this.popup.owner = this;
$input.parent().after(this.popup);
// Do search.
this.db.owner = this;
this.db.search(this.input.value);
};
/**
* Fills the suggestion popup with any matches received.
*/
Drupal.jsAC.prototype.found = function (matches) {
// If no value in the textfield, do not show the popup.
if (!this.input.value.length) {
return false;
}
// Prepare matches.
var ul = $('<ul class="dropdown-menu"></ul>');
var ac = this;
ul.css({
display: 'block',
right: 0
});
for (var key in matches) {
$('<li></li>')
.html($('<a href="#"></a>').html(matches[key]).on('click', function (e) {
e.preventDefault();
}))
.on('mousedown', function () {
ac.hidePopup(this);
})
.on('mouseover', function () {
ac.highlight(this);
})
.on('mouseout', function () {
ac.unhighlight(this);
})
.data('autocompleteValue', key)
.appendTo(ul);
}
// Show popup with matches, if any.
if (this.popup) {
if (ul.children().length) {
$(this.popup).empty().append(ul).show();
$(this.ariaLive).html(Drupal.t('Autocomplete popup'));
}
else {
$(this.popup).css({visibility: 'hidden'});
this.hidePopup();
}
}
};
/**
* Finds the next sibling item.
*/
Drupal.jsAC.prototype.findNextSibling = function (element) {
var sibling = element && element.nextSibling;
if (sibling && !this.validItem(sibling)) {
return this.findNextSibling(sibling.nextSibling);
}
return sibling;
};
/**
* Finds the previous sibling item.
*/
Drupal.jsAC.prototype.findPreviousSibling = function (element) {
var sibling = element && element.previousSibling;
if (sibling && !this.validItem(sibling)) {
return this.findPreviousSibling(sibling.previousSibling);
}
return sibling;
};
/**
* Highlights the next suggestion.
*/
Drupal.jsAC.prototype.selectDown = function () {
var sibling = this.findNextSibling(this.selected);
if (sibling) {
this.highlight(sibling);
}
else if (this.popup) {
var lis = $('li', this.popup);
if (lis.length > 0) {
if (this.validItem(lis[0])) {
this.highlight(lis[0]);
}
else {
this.highlight(this.findNextSibling(lis[0]));
}
}
}
};
/**
* Highlights the previous suggestion.
*/
Drupal.jsAC.prototype.selectUp = function () {
var sibling = this.findPreviousSibling(this.selected);
if (sibling) {
this.highlight(sibling);
}
else if (this.popup) {
var lis = $('li', this.popup);
if (lis.length > 0) {
if (this.validItem(lis[lis.length - 1])) {
this.highlight(lis[lis.length - 1]);
}
else {
this.highlight(this.findPreviousSibling(lis[lis.length - 1]));
}
}
}
};
/**
* Ensures the item is valid.
*/
Drupal.jsAC.prototype.validItem = function (element) {
return !$(element).is('.dropdown-header, .divider, .disabled');
};
Drupal.jsAC.prototype.setStatus = function (status) {
var $throbber = $(this.input).parent().find('.glyphicon-refresh, .autocomplete-throbber').first();
var throbbingClass = $throbber.is('.autocomplete-throbber') ? 'throbbing' : 'glyphicon-spin';
switch (status) {
case 'begin':
$throbber.addClass(throbbingClass);
$(this.ariaLive).html(Drupal.t('Searching for matches...'));
break;
case 'cancel':
case 'error':
case 'found':
$throbber.removeClass(throbbingClass);
break;
}
};
// Save the previous autocomplete prototype.
var oldPrototype = Drupal.jsAC.prototype;
/**
* Override the autocomplete constructor.
*/
Drupal.jsAC = function ($input, db, context) {
var ac = this;
// Context is normally passed by Drupal.behaviors.autocomplete above. However,
// if a module has manually invoked this method they will likely not know
// about this feature and a global fallback context to document must be used.
// @see https://www.drupal.org/node/2594243
// @see https://www.drupal.org/node/2315295
this.$context = context && $(context) || $(document);
this.input = $input[0];
this.ariaLive = this.$context.find('#' + this.input.id + '-autocomplete-aria-live');
this.db = db;
$input
.keydown(function (event) {
return ac.onkeydown(this, event);
})
.keyup(function (event) {
ac.onkeyup(this, event);
})
.blur(function () {
ac.hidePopup();
ac.db.cancel();
});
};
// Restore the previous prototype.
Drupal.jsAC.prototype = oldPrototype;
})(jQuery);
;/*})'"*/
;/*})'"*/
(function ($) {
/**
* Override Drupal's AJAX prototype beforeSend function so it can append the
* throbber inside the pager links.
*/
Drupal.ajax.prototype.beforeSend = function (xmlhttprequest, options) {
// For forms without file inputs, the jQuery Form plugin serializes the form
// values, and then calls jQuery's $.ajax() function, which invokes this
// handler. In this circumstance, options.extraData is never used. For forms
// with file inputs, the jQuery Form plugin uses the browser's normal form
// submission mechanism, but captures the response in a hidden IFRAME. In this
// circumstance, it calls this handler first, and then appends hidden fields
// to the form to submit the values in options.extraData. There is no simple
// way to know which submission mechanism will be used, so we add to extraData
// regardless, and allow it to be ignored in the former case.
if (this.form) {
options.extraData = options.extraData || {};
// Let the server know when the IFRAME submission mechanism is used. The
// server can use this information to wrap the JSON response in a TEXTAREA,
// as per http://jquery.malsup.com/form/#file-upload.
options.extraData.ajax_iframe_upload = '1';
// The triggering element is about to be disabled (see below), but if it
// contains a value (e.g., a checkbox, textfield, select, etc.), ensure that
// value is included in the submission. As per above, submissions that use
// $.ajax() are already serialized prior to the element being disabled, so
// this is only needed for IFRAME submissions.
var v = $.fieldValue(this.element);
if (v !== null) {
options.extraData[this.element.name] = v;
}
}
var $element = $(this.element);
// Disable the element that received the change to prevent user interface
// interaction while the Ajax request is in progress. ajax.ajaxing prevents
// the element from triggering a new request, but does not prevent the user
// from changing its value.
$element.addClass('progress-disabled').attr('disabled', true);
// Insert progressbar or throbber.
if (this.progress.type == 'bar') {
var progressBar = new Drupal.progressBar('ajax-progress-' + this.element.id, eval(this.progress.update_callback), this.progress.method, eval(this.progress.error_callback));
if (this.progress.message) {
progressBar.setProgress(-1, this.progress.message);
}
if (this.progress.url) {
progressBar.startMonitoring(this.progress.url, this.progress.interval || 500);
}
this.progress.element = $(progressBar.element).addClass('ajax-progress ajax-progress-bar');
this.progress.object = progressBar;
$element.closest('.file-widget,.form-item').after(this.progress.element);
}
else if (this.progress.type == 'throbber') {
this.progress.element = $('<div class="ajax-progress ajax-progress-throbber"><i class="glyphicon glyphicon-refresh glyphicon-spin"></i></div>');
if (this.progress.message) {
$('.throbber', this.progress.element).after('<div class="message">' + this.progress.message + '</div>');
}
// If element is an input type, append after.
if ($element.is('input')) {
$element.after(this.progress.element);
}
else if ($element.is('select')) {
var $inputGroup = $element.closest('.form-item').find('.input-group-addon, .input-group-btn');
if (!$inputGroup.length) {
$element.wrap('<div class="input-group">');
$inputGroup = $('<span class="input-group-addon">');
$element.after($inputGroup);
}
$inputGroup.append(this.progress.element);
}
// Otherwise append the throbber inside the element.
else {
$element.append(this.progress.element);
}
}
};
})(jQuery);
;/*})'"*/
;/*})'"*/
(function ($) {
function updateFilterHelpLink () {
var $link = $(this).parents('.filter-wrapper').find('.filter-help > a');
var originalLink = $link.data('originalLink');
if (!originalLink) {
originalLink = $link.attr('href');
$link.data('originalLink', originalLink);
}
$link.attr('href', originalLink + '/' + $(this).find(':selected').val());
}
$(document).on('change', '.filter-wrapper select.filter-list', updateFilterHelpLink);
/**
* Override core's functionality.
*/
Drupal.behaviors.filterGuidelines = {
attach: function (context) {
$(context).find('.filter-wrapper select.filter-list').once('filter-list', updateFilterHelpLink);
}
};
})(jQuery);
;/*})'"*/
;/*})'"*/