/** * @file * Theme hooks for the Drupal Bootstrap base theme. */ (function ($, Drupal, Bootstrap, Attributes) { /** * Fallback for theming an icon if the Icon API module is not installed. */ if (!Drupal.icon) Drupal.icon = { bundles: {} }; if (!Drupal.theme.icon || Drupal.theme.prototype.icon) { $.extend(Drupal.theme, /** @lends Drupal.theme */ { /** * Renders an icon. * * @param {string} bundle * The bundle which the icon belongs to. * @param {string} icon * The name of the icon to render. * @param {object|Attributes} [attributes] * An object of attributes to also apply to the icon. * * @returns {string} */ icon: function (bundle, icon, attributes) { if (!Drupal.icon.bundles[bundle]) return ''; attributes = Attributes.create(attributes).addClass('icon').set('aria-hidden', 'true'); icon = Drupal.icon.bundles[bundle](icon, attributes); return ''; } }); } /** * Callback for modifying an icon in the "bootstrap" icon bundle. * * @param {string} icon * The icon being rendered. * @param {Attributes} attributes * Attributes object for the icon. */ Drupal.icon.bundles.bootstrap = function (icon, attributes) { attributes.addClass(['glyphicon', 'glyphicon-' + icon]); }; /** * Add necessary theming hooks. */ $.extend(Drupal.theme, /** @lends Drupal.theme */ { /** * Renders a Bootstrap AJAX glyphicon throbber. * * @returns {string} */ ajaxThrobber: function () { return Drupal.theme('bootstrapIcon', 'refresh', {'class': ['ajax-throbber', 'glyphicon-spin'] }); }, /** * Renders a button element. * * @param {object|Attributes} attributes * An object of attributes to apply to the button. If it contains one of: * - value: The label of the button. * - context: The context type of Bootstrap button, can be one of: * - default * - primary * - success * - info * - warning * - danger * - link * * @returns {string} */ button: function (attributes) { attributes = Attributes.create(attributes).addClass('btn'); var context = attributes.get('context', 'default'); var label = attributes.get('value', ''); attributes.remove('context').remove('value'); if (!attributes.hasClass(['btn-default', 'btn-primary', 'btn-success', 'btn-info', 'btn-warning', 'btn-danger', 'btn-link'])) { attributes.addClass('btn-' + Bootstrap.checkPlain(context)); } // Attempt to, intelligently, provide a default button "type". if (!attributes.exists('type')) { attributes.set('type', attributes.hasClass('form-submit') ? 'submit' : 'button'); } return '' + label + ''; }, /** * Alias for "button" theme hook. * * @param {object|Attributes} attributes * An object of attributes to apply to the button. * * @see Drupal.theme.button() * * @returns {string} */ btn: function (attributes) { return Drupal.theme('button', attributes); }, /** * Renders a button block element. * * @param {object|Attributes} attributes * An object of attributes to apply to the button. * * @see Drupal.theme.button() * * @returns {string} */ 'btn-block': function (attributes) { return Drupal.theme('button', Attributes.create(attributes).addClass('btn-block')); }, /** * Renders a large button element. * * @param {object|Attributes} attributes * An object of attributes to apply to the button. * * @see Drupal.theme.button() * * @returns {string} */ 'btn-lg': function (attributes) { return Drupal.theme('button', Attributes.create(attributes).addClass('btn-lg')); }, /** * Renders a small button element. * * @param {object|Attributes} attributes * An object of attributes to apply to the button. * * @see Drupal.theme.button() * * @returns {string} */ 'btn-sm': function (attributes) { return Drupal.theme('button', Attributes.create(attributes).addClass('btn-sm')); }, /** * Renders an extra small button element. * * @param {object|Attributes} attributes * An object of attributes to apply to the button. * * @see Drupal.theme.button() * * @returns {string} */ 'btn-xs': function (attributes) { return Drupal.theme('button', Attributes.create(attributes).addClass('btn-xs')); }, /** * Renders a glyphicon. * * @param {string} name * The name of the glyphicon. * @param {object|Attributes} [attributes] * An object of attributes to apply to the icon. * * @returns {string} */ bootstrapIcon: function (name, attributes) { return Drupal.theme('icon', 'bootstrap', name, attributes); } }); })(window.jQuery, window.Drupal, window.Drupal.bootstrap, window.Attributes);