list.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /**
  2. * Copyright © Magento, Inc. All rights reserved.
  3. * See COPYING.txt for license details.
  4. */
  5. /**
  6. * @deprecated since version 2.2.0
  7. */
  8. define([
  9. 'jquery',
  10. 'mage/template',
  11. 'jquery/ui'
  12. ], function ($, mageTemplate) {
  13. 'use strict';
  14. $.widget('mage.list', {
  15. options: {
  16. template: '[data-role=item]', //template for item,
  17. templateWrapper: null, //template wrapper
  18. templateClass: null, //template wrapper class
  19. destinationSelector: '[data-role=container]', //destination selector of list
  20. itemIndex: 0, //setting an item index
  21. itemCount: 0, //get count of items
  22. addButton: '[data-button=add]', //button for adding list item
  23. removeButton: '[data-button=remove]', //button for removing list item
  24. maxItems: null,
  25. maxItemsAlert: null
  26. },
  27. /**
  28. * @private
  29. */
  30. _create: function () {
  31. var options, destination, addButton;
  32. this.options.itemCount = this.options.itemIndex = 0;
  33. options = this.options;
  34. destination = $(options.destinationSelector);
  35. addButton = this.element.find($(options.addButton));
  36. this.element
  37. .addClass('list-widget');
  38. addButton.bind('click', $.proxy(this.handleAdd, this));
  39. //handle remove
  40. destination.on('click', this.options.removeButton, $.proxy(this.removeItem, this));
  41. },
  42. /**
  43. * @return {Boolean}
  44. */
  45. handleAdd: function () {
  46. this.addItem(++this.options.itemIndex);
  47. return false;
  48. },
  49. /**
  50. * @param {*} index
  51. * @param {*} parent
  52. * @return {*|jQuery|HTMLElement}
  53. */
  54. addItem: function (index, parent) {
  55. var options = this.options,
  56. template = $(options.template),
  57. destination = $(options.destinationSelector),
  58. item = $(options.templateWrapper),
  59. source, preTemplate, context, compiledTemplate;
  60. item.addClass(this.options.templateClass)
  61. .attr('id', 'list-item-' + index)
  62. .attr('data-role', 'addedItem')
  63. .attr('data-parent', parent);
  64. source = template.html();
  65. preTemplate = mageTemplate(source);
  66. context = this.handleContext(index);
  67. compiledTemplate = preTemplate({
  68. data: context
  69. });
  70. item.append(compiledTemplate);
  71. destination.append(item);
  72. this.checkLimit(++this.options.itemCount);
  73. return item;
  74. },
  75. /**
  76. * @param {*} index
  77. * @return {Object}
  78. */
  79. handleContext: function (index) {
  80. var context = {
  81. _index_: index
  82. };
  83. return context;
  84. },
  85. /**
  86. * @param {jQuery.Event} e
  87. * @return {Boolean}
  88. */
  89. removeItem: function (e) {
  90. $(e.currentTarget).closest('[data-role="addedItem"]').remove();
  91. this.checkLimit(--this.options.itemCount);
  92. return false;
  93. },
  94. /**
  95. * @param {*} index
  96. */
  97. checkLimit: function (index) {
  98. var addButton = $(this.options.addButton),
  99. maxItems = this.options.maxItems,
  100. maxItemsAlert = $(this.options.maxItemsAlert);
  101. if (maxItems !== null && index >= maxItems) {
  102. addButton.hide();
  103. maxItemsAlert.show();
  104. } else if (addButton.is(':hidden')) {
  105. addButton.show();
  106. maxItemsAlert.hide();
  107. }
  108. },
  109. /**
  110. * @private
  111. */
  112. _destroy: function () {
  113. var destination = $(this.options.destinationSelector);
  114. this.element
  115. .removeClass('list-widget');
  116. destination
  117. .find('[data-role="addedItem"]')
  118. .remove();
  119. }
  120. });
  121. return $.mage.list;
  122. });