You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

96 lines
2.9 KiB

  1. /**
  2. * Copyright © Magento, Inc. All rights reserved.
  3. * See COPYING.txt for license details.
  4. */
  5. define([
  6. 'ko',
  7. 'jquery',
  8. 'Magento_Ui/js/lib/knockout/template/loader',
  9. 'mage/template'
  10. ], function (ko, $, templateLoader, template) {
  11. 'use strict';
  12. var blockLoaderTemplatePath = 'ui/block-loader',
  13. blockContentLoadingClass = '_block-content-loading',
  14. blockLoader,
  15. blockLoaderClass,
  16. blockLoaderElement = $.Deferred(),
  17. loaderImageHref = $.Deferred();
  18. templateLoader.loadTemplate(blockLoaderTemplatePath).done(function (blockLoaderTemplate) {
  19. loaderImageHref.done(function (loaderHref) {
  20. blockLoader = template(blockLoaderTemplate.trim(), {
  21. loaderImageHref: loaderHref
  22. });
  23. blockLoader = $(blockLoader);
  24. blockLoaderClass = '.' + blockLoader.attr('class');
  25. blockLoaderElement.resolve();
  26. });
  27. });
  28. /**
  29. * Helper function to check if blockContentLoading class should be applied.
  30. * @param {Object} element
  31. * @returns {Boolean}
  32. */
  33. function isLoadingClassRequired(element) {
  34. var position = element.css('position');
  35. if (position === 'absolute' || position === 'fixed') {
  36. return false;
  37. }
  38. return true;
  39. }
  40. /**
  41. * Add loader to block.
  42. * @param {Object} element
  43. */
  44. function addBlockLoader(element) {
  45. element.find(':focus').trigger('blur');
  46. element.find('input:disabled, select:disabled').addClass('_disabled');
  47. element.find('input, select').prop('disabled', true);
  48. if (isLoadingClassRequired(element)) {
  49. element.addClass(blockContentLoadingClass);
  50. }
  51. element.append(blockLoader.clone());
  52. }
  53. /**
  54. * Remove loader from block.
  55. * @param {Object} element
  56. */
  57. function removeBlockLoader(element) {
  58. if (!element.has(blockLoaderClass).length) {
  59. return;
  60. }
  61. element.find(blockLoaderClass).remove();
  62. element.find('input:not("._disabled"), select:not("._disabled")').prop('disabled', false);
  63. element.find('input:disabled, select:disabled').removeClass('_disabled');
  64. element.removeClass(blockContentLoadingClass);
  65. }
  66. return function (loaderHref) {
  67. loaderImageHref.resolve(loaderHref);
  68. ko.bindingHandlers.blockLoader = {
  69. /**
  70. * Process loader for block
  71. * @param {String} element
  72. * @param {Boolean} displayBlockLoader
  73. */
  74. update: function (element, displayBlockLoader) {
  75. element = $(element);
  76. if (ko.unwrap(displayBlockLoader())) {
  77. blockLoaderElement.done(addBlockLoader(element));
  78. } else {
  79. blockLoaderElement.done(removeBlockLoader(element));
  80. }
  81. }
  82. };
  83. };
  84. });