@atlassian/aui
Version:
Atlassian User Interface Framework
129 lines (103 loc) • 4.99 kB
JavaScript
(function (global, factory) {
if (typeof define === "function" && define.amd) {
define(['./jquery'], factory);
} else if (typeof exports !== "undefined") {
factory(require('./jquery'));
} else {
var mod = {
exports: {}
};
factory(global.jquery);
global.expander = mod.exports;
}
})(this, function (_jquery) {
'use strict';
var _jquery2 = _interopRequireDefault(_jquery);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
var $document = (0, _jquery2.default)(document);
//convenience function because this needs to be run for all the events.
var getExpanderProperties = function getExpanderProperties(event) {
var properties = {};
properties.$trigger = (0, _jquery2.default)(event.currentTarget);
properties.$content = $document.find('#' + properties.$trigger.attr('aria-controls'));
properties.triggerIsParent = properties.$content.parent().filter(properties.$trigger).length !== 0;
properties.$shortContent = properties.triggerIsParent ? properties.$trigger.find('.aui-expander-short-content') : null;
properties.height = properties.$content.css('min-height');
properties.isCollapsible = properties.$trigger.data('collapsible') !== false;
properties.replaceText = properties.$trigger.attr('data-replace-text'); //can't use .data here because it doesn't update after the first call
properties.replaceSelector = properties.$trigger.data('replace-selector');
return properties;
};
var replaceText = function replaceText(properties) {
if (properties.replaceText) {
var $replaceElement = properties.replaceSelector ? properties.$trigger.find(properties.replaceSelector) : properties.$trigger;
properties.$trigger.attr('data-replace-text', $replaceElement.text());
$replaceElement.text(properties.replaceText);
}
};
//events that the expander listens to
var EXPANDER_EVENTS = {
'aui-expander-invoke': function auiExpanderInvoke(event) {
var $trigger = (0, _jquery2.default)(event.currentTarget);
var $content = $document.find('#' + $trigger.attr('aria-controls'));
var isCollapsible = $trigger.data('collapsible') !== false;
//determine if content should be expanded or collapsed
if ($content.attr('aria-expanded') === 'true' && isCollapsible) {
$trigger.trigger('aui-expander-collapse');
} else {
$trigger.trigger('aui-expander-expand');
}
},
'aui-expander-expand': function auiExpanderExpand(event) {
var properties = getExpanderProperties(event);
// If the expander is already expanded, do nothing.
if (properties.$content.attr('aria-expanded') === 'true') {
return;
}
properties.$content.attr('aria-expanded', 'true');
properties.$trigger.attr('aria-expanded', 'true');
if (properties.$content.outerHeight() > 0) {
properties.$content.attr('aria-hidden', 'false');
}
//handle replace text
replaceText(properties);
//if the trigger is the parent also hide the short-content (default)
if (properties.triggerIsParent) {
properties.$shortContent.hide();
}
properties.$trigger.trigger('aui-expander-expanded');
},
'aui-expander-collapse': function auiExpanderCollapse(event) {
var properties = getExpanderProperties(event);
// If the expander is already collapsed, do nothing.
if (properties.$content.attr('aria-expanded') !== 'true') {
return;
}
//handle replace text
replaceText(properties);
//collapse the expander
properties.$content.attr('aria-expanded', 'false');
properties.$trigger.attr('aria-expanded', 'false');
//if the trigger is the parent also hide the short-content (default)
if (properties.triggerIsParent) {
properties.$shortContent.show();
}
//handle the height option
if (properties.$content.outerHeight() === 0) {
properties.$content.attr('aria-hidden', 'true');
}
properties.$trigger.trigger('aui-expander-collapsed');
},
'click.aui-expander': function clickAuiExpander(event) {
var $target = (0, _jquery2.default)(event.currentTarget);
$target.trigger('aui-expander-invoke', event.currentTarget);
}
};
//delegate events to the triggers on the page
$document.on(EXPANDER_EVENTS, '.aui-expander-trigger');
});
//# sourceMappingURL=expander.js.map