region-selection.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. /// <reference path="../../node_modules/@types/jquery/index.d.ts"/>
  2. var RegionSelection;
  3. (function (RegionSelection) {
  4. function foreach(data, callback) {
  5. for (var key in data) {
  6. if (data.hasOwnProperty(key) && typeof data[key] !== 'function') {
  7. callback(data[key], key, data);
  8. }
  9. }
  10. }
  11. var RegionsCollection = (function () {
  12. function RegionsCollection(data) {
  13. var _this = this;
  14. var length = 0;
  15. this.setLength = function (value) {
  16. length = value;
  17. };
  18. this.getLength = function () {
  19. return length;
  20. };
  21. foreach(data, function (region) { return _this.push(region); });
  22. }
  23. Object.defineProperty(RegionsCollection.prototype, "length", {
  24. get: function () {
  25. return this.getLength();
  26. },
  27. set: function (value) {
  28. this.setLength(value);
  29. },
  30. enumerable: true,
  31. configurable: true
  32. });
  33. ;
  34. RegionsCollection.prototype.setLength = function (value) {
  35. };
  36. ;
  37. RegionsCollection.prototype.getLength = function () {
  38. return 0;
  39. };
  40. ;
  41. RegionsCollection.prototype.push = function (item) {
  42. Array.prototype.push.call(this, item);
  43. };
  44. RegionsCollection.prototype.forEach = function (callback) {
  45. Array.prototype.forEach.call(this, callback);
  46. };
  47. RegionsCollection.prototype.group = function (groupFunction) {
  48. var groups = {};
  49. this.forEach(function (region) {
  50. var groupName = groupFunction(region);
  51. if (groups[groupName] === undefined) {
  52. groups[groupName] = new RegionsCollection([]);
  53. }
  54. groups[groupName].push(region);
  55. });
  56. return groups;
  57. };
  58. RegionsCollection.prototype.sort = function (sortFunction) {
  59. var data = [];
  60. this.forEach(function (region) { return data.push(region); });
  61. data.sort(sortFunction);
  62. return new RegionsCollection(data);
  63. };
  64. return RegionsCollection;
  65. }());
  66. var RegionSelectionBox = (function () {
  67. function RegionSelectionBox(selector) {
  68. this.regions = new RegionsCollection([]);
  69. this.selector = selector;
  70. if (this.selector.data('regions') !== undefined) {
  71. this.fillRegions(this.selector.data('regions'));
  72. }
  73. this.selector.on('click', this.showBox.bind(this));
  74. }
  75. RegionSelectionBox.prototype.fillRegions = function (data) {
  76. var _this = this;
  77. foreach(eval(data), function (value) {
  78. _this.regions.push(new Region(value));
  79. });
  80. };
  81. RegionSelectionBox.prototype.showBox = function (e) {
  82. e.preventDefault();
  83. e.stopPropagation();
  84. if (this.box === undefined) {
  85. this.renderBox();
  86. }
  87. var box = this.box;
  88. var hide = function () {
  89. box.hide(0, function () {
  90. $('body').off('click', hide);
  91. });
  92. }.bind(this);
  93. if (box.is(':visible')) {
  94. hide();
  95. }
  96. else {
  97. $('body').on('click', hide);
  98. box.show(0);
  99. }
  100. };
  101. RegionSelectionBox.prototype.renderBox = function () {
  102. var _this = this;
  103. if (!$('.region__selection-box').length) {
  104. this.box = $('<div class="region__selection-box region-selection__box"></div>');
  105. var linkTemplate_1 = '<a href="{link}" class="region-selection__link">{name}</a>';
  106. // let iconTemplate = '<img src="{icon}" class="region-selection__icon">';
  107. var grouped = this.regions.sort(function (region1, region2) {
  108. return region1.caption < region2.caption ? -1 : region1.caption > region2.caption ? 1 : 0;
  109. }).group(function (region) {
  110. return region.caption.charAt(0).toUpperCase();
  111. });
  112. foreach(grouped, function (regionCollection, groupName) {
  113. var itemsList = $('<div class="region-selection__items-list"></div>');
  114. itemsList.append($("<div class=\"region-selection__list-letter\">" + groupName + "</div>"));
  115. foreach(regionCollection, function (region) {
  116. var item = $('<div class="region-selection__item"></div>').append(linkTemplate_1
  117. .replace('{link}', region.link)
  118. .replace('{name}', region.caption)
  119. // .replace('{icon}', iconTemplate.replace('{icon}', region.icon))
  120. );
  121. itemsList.append($(item));
  122. });
  123. _this.box.append(itemsList);
  124. });
  125. this.box.css('display', 'none');
  126. this.selector.parent().append(this.box);
  127. }
  128. };
  129. return RegionSelectionBox;
  130. }());
  131. var Region = (function () {
  132. function Region(data) {
  133. this._id = data.id;
  134. this._caption = data.caption;
  135. this._link = data.link;
  136. this._icon = data.icon;
  137. }
  138. Object.defineProperty(Region.prototype, "id", {
  139. get: function () {
  140. return this._id;
  141. },
  142. enumerable: true,
  143. configurable: true
  144. });
  145. Object.defineProperty(Region.prototype, "caption", {
  146. get: function () {
  147. return this._caption;
  148. },
  149. enumerable: true,
  150. configurable: true
  151. });
  152. Object.defineProperty(Region.prototype, "link", {
  153. get: function () {
  154. return this._link;
  155. },
  156. enumerable: true,
  157. configurable: true
  158. });
  159. Object.defineProperty(Region.prototype, "icon", {
  160. get: function () {
  161. return this._icon;
  162. },
  163. enumerable: true,
  164. configurable: true
  165. });
  166. return Region;
  167. }());
  168. function createSelectionBox($object) {
  169. return new RegionSelectionBox($object);
  170. }
  171. RegionSelection.createSelectionBox = createSelectionBox;
  172. })(RegionSelection || (RegionSelection = {}));