inputData.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. define([
  2. 'jquery'
  3. ], function ($) {
  4. function InputData (decorated, $element, options) {
  5. this._currentData = [];
  6. this._valueSeparator = options.get('valueSeparator') || ',';
  7. if ($element.prop('type') === 'hidden') {
  8. if (console && console.warn) {
  9. console.warn(
  10. 'Select2: Using a hidden input with Select2 is no longer ' +
  11. 'supported and may stop working in the future. It is recommended ' +
  12. 'to use a `<select>` element instead.'
  13. );
  14. }
  15. }
  16. decorated.call(this, $element, options);
  17. }
  18. InputData.prototype.current = function (_, callback) {
  19. function getSelected (data, selectedIds) {
  20. var selected = [];
  21. if (data.selected || $.inArray(data.id, selectedIds) !== -1) {
  22. data.selected = true;
  23. selected.push(data);
  24. } else {
  25. data.selected = false;
  26. }
  27. if (data.children) {
  28. selected.push.apply(selected, getSelected(data.children, selectedIds));
  29. }
  30. return selected;
  31. }
  32. var selected = [];
  33. for (var d = 0; d < this._currentData.length; d++) {
  34. var data = this._currentData[d];
  35. selected.push.apply(
  36. selected,
  37. getSelected(
  38. data,
  39. this.$element.val().split(
  40. this._valueSeparator
  41. )
  42. )
  43. );
  44. }
  45. callback(selected);
  46. };
  47. InputData.prototype.select = function (_, data) {
  48. if (!this.options.get('multiple')) {
  49. this.current(function (allData) {
  50. $.map(allData, function (data) {
  51. data.selected = false;
  52. });
  53. });
  54. this.$element.val(data.id);
  55. this.$element.trigger('change');
  56. } else {
  57. var value = this.$element.val();
  58. value += this._valueSeparator + data.id;
  59. this.$element.val(value);
  60. this.$element.trigger('change');
  61. }
  62. };
  63. InputData.prototype.unselect = function (_, data) {
  64. var self = this;
  65. data.selected = false;
  66. this.current(function (allData) {
  67. var values = [];
  68. for (var d = 0; d < allData.length; d++) {
  69. var item = allData[d];
  70. if (data.id == item.id) {
  71. continue;
  72. }
  73. values.push(item.id);
  74. }
  75. self.$element.val(values.join(self._valueSeparator));
  76. self.$element.trigger('change');
  77. });
  78. };
  79. InputData.prototype.query = function (_, params, callback) {
  80. var results = [];
  81. for (var d = 0; d < this._currentData.length; d++) {
  82. var data = this._currentData[d];
  83. var matches = this.matches(params, data);
  84. if (matches !== null) {
  85. results.push(matches);
  86. }
  87. }
  88. callback({
  89. results: results
  90. });
  91. };
  92. InputData.prototype.addOptions = function (_, $options) {
  93. var options = $.map($options, function (option) {
  94. return $.data(option, 'data');
  95. });
  96. this._currentData.push.apply(this._currentData, options);
  97. };
  98. return InputData;
  99. });