pockit.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. // Возвращает список значений из БД
  2. async function crudRead(route, limit = 999) {
  3. const url = "/"+route+"/read?limit="+limit;
  4. return $.ajax({
  5. type: 'POST',
  6. url: url
  7. });
  8. }
  9. // Отправляет запрос к API на удаление
  10. // После удаления на странице удаляется элемент с ID контейнера
  11. function crudDelete(route, id, containerID=null) {
  12. if (!confirm("Точно удалить?")) {
  13. return;
  14. }
  15. const url = '/'+route+'/delete?id='+id;
  16. $.ajax({
  17. url: url,
  18. success: function() {
  19. document.getElementById(containerID).remove();
  20. }
  21. });
  22. }
  23. // Показывает форму обновления элемента
  24. async function crudUpdateShowWindow(route, options, name, afterUpdatedCallback) {
  25. const card = await createWindow(route, "update", name, options, afterUpdatedCallback)
  26. $(document.body).append(card);
  27. $(document.body).append($('<div class="dark-overlay"></div>'));
  28. }
  29. // Показывает форму создания элемента
  30. async function crudCreateShowWindow(route, options, name, afterCreatedCallback) {
  31. const card = await createWindow(route, "create", name, options, afterCreatedCallback)
  32. $(document.body).append(card);
  33. $(document.body).append($('<div class="dark-overlay"></div>'));
  34. }
  35. async function createWindow(route, action, name, options, afterCallback) {
  36. // Создание карточки-контейнера
  37. const card = $("<div class='card modal'></div>");
  38. // Создание формы и привязка к ней обратного вызова
  39. const form = $("<form class='crudcreateform' method='post' action='/"+route+"/"+action+"'></form>");
  40. form.submit(function(e) {
  41. e.preventDefault();
  42. $.ajax({
  43. url: "/"+route+"/"+action,
  44. type: 'post',
  45. data: $(this).serialize(),
  46. success: function(response) {
  47. // Окно и слой затемнения удаляется
  48. removeModalWindows();
  49. // Вызывается функция обратного вызова с параметром - объектом с информацией о созданном элементе
  50. afterCallback(JSON.parse(response));
  51. }
  52. });
  53. });
  54. // Добавление к форме полей ввода
  55. for (const [key, value] of Object.entries(options)) {
  56. if (value.type == "hidden") {
  57. // Невидимое поле ввода
  58. form.append($('<input type="hidden" name="'+value.name+'" value="'+value.default+'"/>'));
  59. continue;
  60. }
  61. // Добавляем контейнер поля
  62. let control_container = $("<div class='form-control-container'></div>");
  63. // Надпись
  64. control_container.append($('<label for="'+key+'">'+ key +'</label>'));
  65. // Непосредственно поле ввода
  66. if (value.type == 'plain') {
  67. // Текстовое
  68. const input = $('<input class="form-control" id="'+key+'" type="text" name="'+value.name+'"/>');
  69. if (value.default != undefined) {
  70. input.attr("value", value.default);
  71. }
  72. control_container.append(input);
  73. } else if (value.type == 'crudRead') {
  74. // Выбор из нескольких вариантов
  75. const values = JSON.parse(await crudRead(value.route));
  76. const selectInput = $('<select class="form-control" id="'+key+'" name="'+value.name+'">');
  77. for (let i = 0; i < values.length; ++i) {
  78. if (values[i].id == value.default) {
  79. // Это значение по-умолчанию
  80. selectInput.append($('<option selected="selected" value="'+values[i].id+'">'+values[i].repr+'</option>'));
  81. } else {
  82. selectInput.append($('<option value="'+values[i].id+'">'+values[i].repr+'</option>'));
  83. }
  84. }
  85. control_container.append(selectInput);
  86. } else {
  87. console.log("Неизвестный тип: " + value.type);
  88. }
  89. form.append(control_container);
  90. };
  91. // Кнопки добавления и отмены
  92. form.append($(`
  93. <div style='display: grid;grid-template-columns: auto 25%;grid-gap: 1em;width: 100%;'>
  94. <button type="submit" class="crudcreate success form-control">Сохранить</button>
  95. <button type="submit" onclick='removeModalWindows()' class="crudcancel form-control">Отмена</button>
  96. </div>`));
  97. // Добавление всех элементов и показ
  98. card.append($('<h1>'+name+'</h1>'));
  99. card.append(form);
  100. return card;
  101. }
  102. // Удаляет все компоненты с модальными окнами
  103. function removeModalWindows() {
  104. $('.modal, .dark-overlay').remove();
  105. }