Повторный пользовательский интерфейс | Repeating user interface
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.

89 lines
2.6KB

  1. ВыборныйСписок = function(элемент, настройки)
  2. {
  3. if (!настройки)
  4. {
  5. настройки = {
  6. "макет": {
  7. "элемент": `
  8. <li id="%id%">
  9. <a id="%id%-ссылка">%название%</a>
  10. </li>
  11. `,
  12. },
  13. "отклик": {},
  14. };
  15. }
  16. this.задатьЗаголовок = (заголовок) =>
  17. {
  18. this.заголовок = заголовок;
  19. this.__пересобрать();
  20. };
  21. this.задатьСписок = (список) =>
  22. {
  23. this.список = список;
  24. this.__пересобрать();
  25. };
  26. this.очиститьВыбор = () =>
  27. {
  28. for (var номер in this.список)
  29. {
  30. var id = `${элемент.id}-${номер}`;
  31. $(`#${id}`).removeClass("uk-active");
  32. }
  33. };
  34. this.выбратьЭлемент = (номер) =>
  35. {
  36. this.очиститьВыбор();
  37. $(`#${элемент.id}-${номер}`).addClass("uk-active");
  38. };
  39. this.__пересобрать = () =>
  40. {
  41. this.__задатьЗаголовокИСписок();
  42. this.__отслеживатьВыбор();
  43. }
  44. this.__задатьЗаголовокИСписок = () =>
  45. {
  46. var содержимое = "";
  47. for (var номер in this.список)
  48. {
  49. var название = this.список[номер];
  50. var id = `${элемент.id}-${номер}`;
  51. var пункт = настройки.макет.элемент
  52. .replace(/%название%/g, название)
  53. .replace(/%id%/g, id)
  54. ;
  55. содержимое += пункт;
  56. }
  57. if (this.заголовок && this.заголовок.length)
  58. {
  59. содержимое = `
  60. <li class="uk-nav-header">${this.заголовок}</li>
  61. ${содержимое}
  62. `;
  63. }
  64. элемент.innerHTML = содержимое;
  65. };
  66. this.__отслеживатьВыбор = () =>
  67. {
  68. for (var номер in this.список)
  69. {
  70. var id = `${элемент.id}-${номер}`;
  71. const номерПункта = номер;
  72. $(`#${id}-ссылка`).click(function() {
  73. if (настройки.отклик && настройки.отклик.выбор)
  74. {
  75. настройки.отклик.выбор(номерПункта);
  76. }
  77. });
  78. }
  79. };
  80. };