index.pug 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // app/pages/Admin/Routes/index.pug
  2. div
  3. .flex.justify-between.items-center.mb-6
  4. h1(class="text-2xl font-bold text-gray-900 dark:text-white") Управление маршрутами
  5. button(
  6. @click="showRouteModal = true"
  7. class="bg-primary-500 text-white px-4 py-2 rounded-lg hover:bg-primary-600 transition-colors"
  8. ) + Новый маршрут
  9. .bg-white.dark_bg-gray-800.rounded-lg.shadow.overflow-hidden
  10. table(class="min-w-full divide-y divide-gray-200 dark:divide-gray-700")
  11. thead(class="bg-gray-50 dark:bg-gray-700")
  12. tr
  13. th(class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider") Путь
  14. th(class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider") Компонент
  15. th(class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider") Название
  16. th(class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider") Статус
  17. th(class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-300 uppercase tracking-wider") Действия
  18. tbody(class="divide-y divide-gray-200 dark:divide-gray-700")
  19. tr(v-for="route in routes" :key="route._id")
  20. td(class="px-6 py-4 whitespace-nowrap text-sm font-mono text-gray-900 dark:text-white") {{ route.path }}
  21. td(class="px-6 py-4 whitespace-nowrap text-sm text-gray-500 dark:text-gray-300") {{ route.component }}
  22. td(class="px-6 py-4 whitespace-nowrap text-sm text-gray-500 dark:text-gray-300") {{ route.name }}
  23. td(class="px-6 py-4 whitespace-nowrap")
  24. span(
  25. :class="getRouteStatusClass(route.active)"
  26. ) {{ route.active ? 'Активен' : 'Неактивен' }}
  27. td(class="px-6 py-4 whitespace-nowrap text-sm font-medium")
  28. button(
  29. @click="editRoute(route)"
  30. class="text-blue-600 hover:text-blue-900 mr-3"
  31. ) Редактировать
  32. button(
  33. @click="deleteRoute(route._id)"
  34. class="text-red-600 hover:text-red-900"
  35. ) Удалить
  36. // Модальное окно маршрута
  37. modalwindow(
  38. v-if="showRouteModal"
  39. @close="showRouteModal = false"
  40. :title="currentRoute._id ? 'Редактирование маршрута' : 'Новый маршрут'"
  41. )
  42. .space-y-4
  43. .grid.grid-cols-2.gap-4
  44. div
  45. label(class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1") Путь
  46. input(
  47. v-model="currentRoute.path"
  48. type="text"
  49. placeholder="/about"
  50. class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary-500 dark:bg-gray-700 dark:border-gray-600"
  51. )
  52. div
  53. label(class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1") Название
  54. input(
  55. v-model="currentRoute.name"
  56. type="text"
  57. placeholder="about"
  58. class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary-500 dark:bg-gray-700 dark:border-gray-600"
  59. )
  60. .grid.grid-cols-1.gap-4
  61. label(class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1") Компонент
  62. select(
  63. v-model="currentRoute.component"
  64. class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary-500 dark:bg-gray-700 dark:border-gray-600"
  65. )
  66. option(value="") Выберите компонент
  67. option(value="About") About
  68. option(value="Contacts") Contacts
  69. option(value="BlogArticle") BlogArticle
  70. option(value="CustomPage") CustomPage
  71. .grid.grid-cols-2.gap-4
  72. div
  73. label(class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1") Мета-заголовок
  74. input(
  75. v-model="currentRoute.metaTitle"
  76. type="text"
  77. class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary-500 dark:bg-gray-700 dark:border-gray-600"
  78. )
  79. div
  80. label(class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1") Мета-описание
  81. input(
  82. v-model="currentRoute.metaDescription"
  83. type="text"
  84. class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-primary-500 dark:bg-gray-700 dark:border-gray-600"
  85. )
  86. .flex.items-center
  87. input(
  88. v-model="currentRoute.active"
  89. type="checkbox"
  90. id="routeActive"
  91. class="w-4 h-4 text-primary-600 border-gray-300 rounded focus:ring-primary-500"
  92. )
  93. label(for="routeActive" class="ml-2 text-sm text-gray-700 dark:text-gray-300") Активный маршрут
  94. .flex.justify-end.space-x-3
  95. button(
  96. @click="showRouteModal = false"
  97. class="px-4 py-2 text-gray-600 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-200"
  98. ) Отмена
  99. button(
  100. @click="saveRoute"
  101. class="bg-primary-500 text-white px-4 py-2 rounded hover:bg-primary-600 transition-colors"
  102. ) {{ currentRoute._id ? 'Обновить' : 'Сохранить' }}