menu_store.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. "use strict";
  2. var __values = (this && this.__values) || function(o) {
  3. var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
  4. if (m) return m.call(o);
  5. if (o && typeof o.length === "number") return {
  6. next: function () {
  7. if (o && i >= o.length) o = void 0;
  8. return { value: o && o[i++], done: !o };
  9. }
  10. };
  11. throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
  12. };
  13. Object.defineProperty(exports, "__esModule", { value: true });
  14. exports.MenuStore = void 0;
  15. var menu_util_js_1 = require("./menu_util.js");
  16. var html_classes_js_1 = require("./html_classes.js");
  17. var key_navigatable_js_1 = require("./key_navigatable.js");
  18. var MenuStore = (function () {
  19. function MenuStore(menu) {
  20. this.menu = menu;
  21. this.store = [];
  22. this._active = null;
  23. this.counter = 0;
  24. this.attachedClass = html_classes_js_1.HtmlClasses['ATTACHED'] + '_' +
  25. menu_util_js_1.MenuUtil.counter();
  26. this.taborder = true;
  27. this.attrMap = {};
  28. }
  29. Object.defineProperty(MenuStore.prototype, "active", {
  30. get: function () {
  31. return this._active;
  32. },
  33. set: function (element) {
  34. do {
  35. if (this.store.indexOf(element) !== -1) {
  36. this._active = element;
  37. break;
  38. }
  39. element = element.parentNode;
  40. } while (element);
  41. },
  42. enumerable: false,
  43. configurable: true
  44. });
  45. MenuStore.prototype.next = function () {
  46. var length = this.store.length;
  47. if (length === 0) {
  48. this.active = null;
  49. return null;
  50. }
  51. var index = this.store.indexOf(this.active);
  52. index = index === -1 ? 0 : (index < length - 1 ? index + 1 : 0);
  53. this.active = this.store[index];
  54. return this.active;
  55. };
  56. MenuStore.prototype.previous = function () {
  57. var length = this.store.length;
  58. if (length === 0) {
  59. this.active = null;
  60. return null;
  61. }
  62. var last = length - 1;
  63. var index = this.store.indexOf(this.active);
  64. index = index === -1 ? last : (index === 0 ? last : index - 1);
  65. this.active = this.store[index];
  66. return this.active;
  67. };
  68. MenuStore.prototype.clear = function () {
  69. this.remove(this.store);
  70. };
  71. MenuStore.prototype.insert = function (elementOrList) {
  72. var e_1, _a;
  73. var elements = elementOrList instanceof HTMLElement ?
  74. [elementOrList] : elementOrList;
  75. try {
  76. for (var elements_1 = __values(elements), elements_1_1 = elements_1.next(); !elements_1_1.done; elements_1_1 = elements_1.next()) {
  77. var element = elements_1_1.value;
  78. this.insertElement(element);
  79. }
  80. }
  81. catch (e_1_1) { e_1 = { error: e_1_1 }; }
  82. finally {
  83. try {
  84. if (elements_1_1 && !elements_1_1.done && (_a = elements_1.return)) _a.call(elements_1);
  85. }
  86. finally { if (e_1) throw e_1.error; }
  87. }
  88. this.sort();
  89. };
  90. MenuStore.prototype.remove = function (elementOrList) {
  91. var e_2, _a;
  92. var elements = elementOrList instanceof HTMLElement ?
  93. [elementOrList] : elementOrList;
  94. try {
  95. for (var elements_2 = __values(elements), elements_2_1 = elements_2.next(); !elements_2_1.done; elements_2_1 = elements_2.next()) {
  96. var element = elements_2_1.value;
  97. this.removeElement(element);
  98. }
  99. }
  100. catch (e_2_1) { e_2 = { error: e_2_1 }; }
  101. finally {
  102. try {
  103. if (elements_2_1 && !elements_2_1.done && (_a = elements_2.return)) _a.call(elements_2);
  104. }
  105. finally { if (e_2) throw e_2.error; }
  106. }
  107. this.sort();
  108. };
  109. MenuStore.prototype.inTaborder = function (flag) {
  110. if (this.taborder && !flag) {
  111. this.removeTaborder();
  112. }
  113. if (!this.taborder && flag) {
  114. this.insertTaborder();
  115. }
  116. this.taborder = flag;
  117. };
  118. MenuStore.prototype.insertTaborder = function () {
  119. if (this.taborder) {
  120. this.insertTaborder_();
  121. }
  122. };
  123. MenuStore.prototype.removeTaborder = function () {
  124. if (this.taborder) {
  125. this.removeTaborder_();
  126. }
  127. };
  128. MenuStore.prototype.insertElement = function (element) {
  129. if (element.classList.contains(this.attachedClass)) {
  130. return;
  131. }
  132. element.classList.add(this.attachedClass);
  133. if (this.taborder) {
  134. this.addTabindex(element);
  135. }
  136. this.addEvents(element);
  137. };
  138. MenuStore.prototype.removeElement = function (element) {
  139. if (!element.classList.contains(this.attachedClass)) {
  140. return;
  141. }
  142. element.classList.remove(this.attachedClass);
  143. if (this.taborder) {
  144. this.removeTabindex(element);
  145. }
  146. this.removeEvents(element);
  147. };
  148. MenuStore.prototype.sort = function () {
  149. var nodes = document.getElementsByClassName(this.attachedClass);
  150. this.store = [].slice.call(nodes);
  151. };
  152. MenuStore.prototype.insertTaborder_ = function () {
  153. this.store.forEach(function (x) { return x.setAttribute('tabindex', '0'); });
  154. };
  155. MenuStore.prototype.removeTaborder_ = function () {
  156. this.store.forEach(function (x) { return x.setAttribute('tabindex', '-1'); });
  157. };
  158. MenuStore.prototype.addTabindex = function (element) {
  159. if (element.hasAttribute('tabindex')) {
  160. element.setAttribute(html_classes_js_1.HtmlAttrs['OLDTAB'], element.getAttribute('tabindex'));
  161. }
  162. element.setAttribute('tabindex', '0');
  163. };
  164. MenuStore.prototype.removeTabindex = function (element) {
  165. if (element.hasAttribute(html_classes_js_1.HtmlAttrs['OLDTAB'])) {
  166. element.setAttribute('tabindex', element.getAttribute(html_classes_js_1.HtmlAttrs['OLDTAB']));
  167. element.removeAttribute(html_classes_js_1.HtmlAttrs['OLDTAB']);
  168. }
  169. else {
  170. element.removeAttribute('tabindex');
  171. }
  172. };
  173. MenuStore.prototype.addEvents = function (element) {
  174. if (element.hasAttribute(html_classes_js_1.HtmlAttrs['COUNTER'])) {
  175. return;
  176. }
  177. this.addEvent(element, 'contextmenu', this.menu.post.bind(this.menu));
  178. this.addEvent(element, 'keydown', this.keydown.bind(this));
  179. element.setAttribute(html_classes_js_1.HtmlAttrs['COUNTER'], this.counter.toString());
  180. this.counter++;
  181. };
  182. MenuStore.prototype.addEvent = function (element, name, func) {
  183. var attrName = html_classes_js_1.HtmlAttrs[name.toUpperCase() + 'FUNC'];
  184. this.attrMap[attrName + this.counter] = func;
  185. element.addEventListener(name, func);
  186. };
  187. MenuStore.prototype.removeEvents = function (element) {
  188. if (!element.hasAttribute(html_classes_js_1.HtmlAttrs['COUNTER'])) {
  189. return;
  190. }
  191. var counter = element.getAttribute(html_classes_js_1.HtmlAttrs['COUNTER']);
  192. this.removeEvent(element, 'contextmenu', counter);
  193. this.removeEvent(element, 'keydown', counter);
  194. element.removeAttribute(html_classes_js_1.HtmlAttrs['COUNTER']);
  195. };
  196. MenuStore.prototype.removeEvent = function (element, name, counter) {
  197. var attrName = html_classes_js_1.HtmlAttrs[name.toUpperCase() + 'FUNC'];
  198. var menuFunc = this.attrMap[attrName + counter];
  199. element.removeEventListener(name, menuFunc);
  200. };
  201. MenuStore.prototype.keydown = function (event) {
  202. if (event.keyCode === key_navigatable_js_1.KEY.SPACE) {
  203. this.menu.post(event);
  204. event.preventDefault();
  205. event.stopImmediatePropagation();
  206. }
  207. };
  208. return MenuStore;
  209. }());
  210. exports.MenuStore = MenuStore;
  211. //# sourceMappingURL=menu_store.js.map