@topvisor/ui 1.5.9 → 1.5.10-animation.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/.chunks/api-nVBtzTDk.es.amd.js +2 -0
  2. package/.chunks/api-nVBtzTDk.es.amd.js.map +1 -0
  3. package/.chunks/{api-lAoAK33f.es.js → api-nVBtzTDk.es.js} +101 -51
  4. package/.chunks/api-nVBtzTDk.es.js.map +1 -0
  5. package/.chunks/app-BbV6AslA.es.amd.js +2 -0
  6. package/.chunks/app-BbV6AslA.es.amd.js.map +1 -0
  7. package/.chunks/{app-CY6euLQJ.es.js → app-BbV6AslA.es.js} +26 -25
  8. package/.chunks/{app-CY6euLQJ.es.js.map → app-BbV6AslA.es.js.map} +1 -1
  9. package/.chunks/{datepicker-CeUbso62.es.amd.js → datepicker-CpnGeB5y.es.amd.js} +2 -2
  10. package/.chunks/{datepicker-CeUbso62.es.amd.js.map → datepicker-CpnGeB5y.es.amd.js.map} +1 -1
  11. package/.chunks/{datepicker-CeUbso62.es.js → datepicker-CpnGeB5y.es.js} +2 -2
  12. package/.chunks/{datepicker-CeUbso62.es.js.map → datepicker-CpnGeB5y.es.js.map} +1 -1
  13. package/.chunks/{dialog-Cnx_s8X1.es.amd.js → dialog-CiK4MPcB.es.amd.js} +2 -2
  14. package/.chunks/{dialog-Cnx_s8X1.es.amd.js.map → dialog-CiK4MPcB.es.amd.js.map} +1 -1
  15. package/.chunks/{dialog-Cnx_s8X1.es.js → dialog-CiK4MPcB.es.js} +3 -3
  16. package/.chunks/{dialog-Cnx_s8X1.es.js.map → dialog-CiK4MPcB.es.js.map} +1 -1
  17. package/.chunks/{dialog_regionSelectorRegions-BCEJBT1H.es.amd.js → dialog_regionSelectorRegions-CRUwGUuz.es.amd.js} +2 -2
  18. package/.chunks/{dialog_regionSelectorRegions-BCEJBT1H.es.amd.js.map → dialog_regionSelectorRegions-CRUwGUuz.es.amd.js.map} +1 -1
  19. package/.chunks/{dialog_regionSelectorRegions-BCEJBT1H.es.js → dialog_regionSelectorRegions-CRUwGUuz.es.js} +4 -4
  20. package/.chunks/{dialog_regionSelectorRegions-BCEJBT1H.es.js.map → dialog_regionSelectorRegions-CRUwGUuz.es.js.map} +1 -1
  21. package/.chunks/forms-CjJD60m3.es.amd.js +2 -0
  22. package/.chunks/forms-CjJD60m3.es.amd.js.map +1 -0
  23. package/.chunks/{forms-Ch1q0UUt.es.js → forms-CjJD60m3.es.js} +601 -638
  24. package/.chunks/forms-CjJD60m3.es.js.map +1 -0
  25. package/.chunks/formsExt-B9hGGznb.es.amd.js +2 -0
  26. package/.chunks/formsExt-B9hGGznb.es.amd.js.map +1 -0
  27. package/.chunks/{formsExt-DtFeVRvE.es.js → formsExt-B9hGGznb.es.js} +110 -111
  28. package/.chunks/{formsExt-DtFeVRvE.es.js.map → formsExt-B9hGGznb.es.js.map} +1 -1
  29. package/.chunks/lazy-DQU-hLos.es.js.map +1 -1
  30. package/.chunks/mocker-h3ROH-VB.es.js.map +1 -1
  31. package/.chunks/{notice-40E7zRe5.es.amd.js → notice-BSVUBQ4B.es.amd.js} +2 -2
  32. package/.chunks/{notice-40E7zRe5.es.amd.js.map → notice-BSVUBQ4B.es.amd.js.map} +1 -1
  33. package/.chunks/{notice-40E7zRe5.es.js → notice-BSVUBQ4B.es.js} +2 -2
  34. package/.chunks/{notice-40E7zRe5.es.js.map → notice-BSVUBQ4B.es.js.map} +1 -1
  35. package/.chunks/popup-BoCCkzOM.es.amd.js +2 -0
  36. package/.chunks/popup-BoCCkzOM.es.amd.js.map +1 -0
  37. package/.chunks/{popup-l46cef9d.es.js → popup-BoCCkzOM.es.js} +26 -25
  38. package/.chunks/{popup-l46cef9d.es.js.map → popup-BoCCkzOM.es.js.map} +1 -1
  39. package/.chunks/{popup-DA17NrM5.es.amd.js → popup-q1PRZblX.es.amd.js} +2 -2
  40. package/.chunks/{popup-DA17NrM5.es.amd.js.map → popup-q1PRZblX.es.amd.js.map} +1 -1
  41. package/.chunks/{popup-DA17NrM5.es.js → popup-q1PRZblX.es.js} +3 -3
  42. package/.chunks/{popup-DA17NrM5.es.js.map → popup-q1PRZblX.es.js.map} +1 -1
  43. package/.chunks/utils-DzPB2u_5.es.amd.js +2 -0
  44. package/.chunks/utils-DzPB2u_5.es.amd.js.map +1 -0
  45. package/.chunks/{utils-C0Y5ido8.es.js → utils-DzPB2u_5.es.js} +5 -5
  46. package/.chunks/utils-DzPB2u_5.es.js.map +1 -0
  47. package/.chunks/utils-Xb6J5WcU.es.amd.js +2 -0
  48. package/.chunks/utils-Xb6J5WcU.es.amd.js.map +1 -0
  49. package/.chunks/{utils-hK-QjvqM.es.js → utils-Xb6J5WcU.es.js} +3 -3
  50. package/.chunks/{utils-hK-QjvqM.es.js.map → utils-Xb6J5WcU.es.js.map} +1 -1
  51. package/.chunks/worker-F-Y1IEi2.es.amd.js +2 -0
  52. package/.chunks/worker-F-Y1IEi2.es.amd.js.map +1 -0
  53. package/.chunks/{worker-D-5BEVm7.es.js → worker-F-Y1IEi2.es.js} +4 -3
  54. package/.chunks/{worker-D-5BEVm7.es.js.map → worker-F-Y1IEi2.es.js.map} +1 -1
  55. package/api/additional.amd.js +1 -1
  56. package/api/additional.amd.js.map +1 -1
  57. package/api/additional.js +1 -1
  58. package/api/index.amd.js +1 -1
  59. package/api/index.amd.js.map +1 -1
  60. package/api/index.js +2 -3
  61. package/assets/themes/dark-th.css +1 -1
  62. package/assets/themes/dark.css +1 -1
  63. package/assets/themes/light.css +1 -1
  64. package/autoload-css-manifest.amd.json +4 -4
  65. package/autoload-css-manifest.json +4 -4
  66. package/charts/charts.amd.js +1 -1
  67. package/charts/charts.amd.js.map +1 -1
  68. package/charts/charts.js +1 -1
  69. package/charts/charts.js.map +1 -1
  70. package/core/app.amd.js +1 -1
  71. package/core/app.amd.js.map +1 -1
  72. package/core/app.js +3 -3
  73. package/dialog/dialog.amd.js +1 -1
  74. package/dialog/dialog.amd.js.map +1 -1
  75. package/dialog/dialog.js +2 -2
  76. package/extra/extra.amd.js +1 -1
  77. package/extra/extra.amd.js.map +1 -1
  78. package/extra/extra.js +2 -0
  79. package/extra/extra.js.map +1 -1
  80. package/forms/forms.amd.js +1 -1
  81. package/forms/forms.amd.js.map +1 -1
  82. package/forms/forms.js +1 -1
  83. package/formsExt/formsExt.amd.js +1 -1
  84. package/formsExt/formsExt.amd.js.map +1 -1
  85. package/formsExt/formsExt.js +1 -1
  86. package/layout/layout.amd.js +1 -1
  87. package/layout/layout.amd.js.map +1 -1
  88. package/layout/layout.js +1 -1
  89. package/package.json +1 -1
  90. package/popup/popup.amd.js +1 -1
  91. package/popup/popup.amd.js.map +1 -1
  92. package/popup/popup.js +1 -1
  93. package/popup/worker.amd.js +1 -1
  94. package/popup/worker.amd.js.map +1 -1
  95. package/popup/worker.js +1 -1
  96. package/project/project.amd.js +1 -1
  97. package/project/project.amd.js.map +1 -1
  98. package/project/project.js +245 -246
  99. package/project/project.js.map +1 -1
  100. package/schedule/schedule.amd.js +1 -1
  101. package/schedule/schedule.amd.js.map +1 -1
  102. package/schedule/schedule.js +2 -2
  103. package/schedule/schedule.js.map +1 -1
  104. package/tabsView/tabsView.amd.js +1 -1
  105. package/tabsView/tabsView.amd.js.map +1 -1
  106. package/tabsView/tabsView.js +2 -2
  107. package/tabsView/tabsView.js.map +1 -1
  108. package/utils/clipboard.amd.js +1 -1
  109. package/utils/clipboard.amd.js.map +1 -1
  110. package/utils/clipboard.js +1 -1
  111. package/utils/date.amd.js +1 -1
  112. package/utils/date.amd.js.map +1 -1
  113. package/utils/date.js +1 -1
  114. package/utils/device.amd.js +1 -1
  115. package/utils/device.amd.js.map +1 -1
  116. package/utils/device.js +1 -1
  117. package/utils/dom.amd.js.map +1 -1
  118. package/utils/dom.js.map +1 -1
  119. package/utils/lodash.amd.js +1 -1
  120. package/utils/lodash.amd.js.map +1 -1
  121. package/utils/lodash.js +1 -1
  122. package/utils/price.amd.js +1 -1
  123. package/utils/price.amd.js.map +1 -1
  124. package/utils/price.js +1 -1
  125. package/utils/scroll.js.map +1 -1
  126. package/utils/string.amd.js +1 -1
  127. package/utils/string.amd.js.map +1 -1
  128. package/utils/string.js +1 -1
  129. package/utils/string.js.map +1 -1
  130. package/utils/system.amd.js.map +1 -1
  131. package/utils/system.js.map +1 -1
  132. package/.chunks/api-lAoAK33f.es.amd.js +0 -2
  133. package/.chunks/api-lAoAK33f.es.amd.js.map +0 -1
  134. package/.chunks/api-lAoAK33f.es.js.map +0 -1
  135. package/.chunks/app-CY6euLQJ.es.amd.js +0 -2
  136. package/.chunks/app-CY6euLQJ.es.amd.js.map +0 -1
  137. package/.chunks/field-DEusYVqS.es.amd.js +0 -2
  138. package/.chunks/field-DEusYVqS.es.amd.js.map +0 -1
  139. package/.chunks/field-DEusYVqS.es.js +0 -16
  140. package/.chunks/field-DEusYVqS.es.js.map +0 -1
  141. package/.chunks/forms-Ch1q0UUt.es.amd.js +0 -2
  142. package/.chunks/forms-Ch1q0UUt.es.amd.js.map +0 -1
  143. package/.chunks/forms-Ch1q0UUt.es.js.map +0 -1
  144. package/.chunks/formsExt-DtFeVRvE.es.amd.js +0 -2
  145. package/.chunks/formsExt-DtFeVRvE.es.amd.js.map +0 -1
  146. package/.chunks/popup-l46cef9d.es.amd.js +0 -2
  147. package/.chunks/popup-l46cef9d.es.amd.js.map +0 -1
  148. package/.chunks/utils-C0Y5ido8.es.amd.js +0 -2
  149. package/.chunks/utils-C0Y5ido8.es.amd.js.map +0 -1
  150. package/.chunks/utils-C0Y5ido8.es.js.map +0 -1
  151. package/.chunks/utils-hK-QjvqM.es.amd.js +0 -2
  152. package/.chunks/utils-hK-QjvqM.es.amd.js.map +0 -1
  153. package/.chunks/worker-D-5BEVm7.es.amd.js +0 -2
  154. package/.chunks/worker-D-5BEVm7.es.amd.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"schedule.js","names":[],"sources":["../../src/components/schedule/schedule/components/calendar/composables/useDaysByCalendarMode.ts","../../src/components/schedule/schedule/components/timeSelector/timeSelector.vue","../../src/components/schedule/schedule/components/timeSelector/timeSelector.vue","../../src/components/schedule/schedule/components/calendar/calendar.vue","../../src/components/schedule/schedule/components/calendar/calendar.vue","../../src/components/schedule/schedule/utils.ts","../../src/components/schedule/schedule/composables/useModeOptions.ts","../../src/components/schedule/schedule/composables/useModelByModeCache.ts","../../src/components/schedule/schedule/schedule.vue","../../src/components/schedule/schedule/schedule.vue","../../src/components/schedule/schedule/components/emails/selector/selector.vue","../../src/components/schedule/schedule/components/emails/selector/selector.vue","../../src/components/schedule/schedule/components/emails/emails.vue","../../src/components/schedule/schedule/components/emails/emails.vue","../../src/components/schedule/schedule/components/socials/socials.vue","../../src/components/schedule/schedule/components/socials/socials.vue"],"sourcesContent":["import { computed, type MaybeRefOrGetter, toValue } from 'vue';\nimport type { Day, Props } from '../types';\nimport { useI18n } from '@/core/app';\n\n/**\n * Формирует список дней для выбранного режима календаря.\n */\nexport const useDaysByCalendarMode = (mode: MaybeRefOrGetter<Props['mode']>) => {\n\tconst i18n = useI18n();\n\n\treturn computed<Day[]>(() => {\n\t\tswitch (toValue(mode)) {\n\t\t\t// Дни месяца\n\t\t\tcase 'dayOfMonth': {\n\t\t\t\tconst days: Day[] = Array.from({ length: 27 }, (_, index) => ({\n\t\t\t\t\tvalue: String(index + 1) as Day['value'],\n\t\t\t\t\ttitle: String(index + 1),\n\t\t\t\t}));\n\n\t\t\t\tdays.push({\n\t\t\t\t\tvalue: 'LAST_OF_MONTH',\n\t\t\t\t\ttitle: '',\n\t\t\t\t\tisIcon: true,\n\t\t\t\t});\n\n\t\t\t\treturn days;\n\t\t\t}\n\n\t\t\t// Дни недели\n\t\t\tcase 'dayOfWeek':\n\t\t\t\treturn [\n\t\t\t\t\t{ value: 'MONDAY', title: i18n.Calendar.Dw_1 },\n\t\t\t\t\t{ value: 'TUESDAY', title: i18n.Calendar.Dw_2 },\n\t\t\t\t\t{ value: 'WEDNESDAY', title: i18n.Calendar.Dw_3 },\n\t\t\t\t\t{ value: 'THURSDAY', title: i18n.Calendar.Dw_4 },\n\t\t\t\t\t{ value: 'FRIDAY', title: i18n.Calendar.Dw_5 },\n\t\t\t\t\t{ value: 'SATURDAY', title: i18n.Calendar.Dw_6 },\n\t\t\t\t\t{ value: 'SUNDAY', title: i18n.Calendar.Dw_7 },\n\t\t\t\t];\n\n\t\t\tdefault:\n\t\t\t\treturn [];\n\t\t}\n\t});\n};\n","<script setup lang=\"ts\">\nimport type { Props } from '@/components/schedule/schedule/components/timeSelector/types';\n\nconst props = defineProps<Props>();\n\nconst times = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\n/**\n * Варианты выбора часа от `00` до `23`.\n *\n * Поддерижвает вставку произвольного значения через `modelValue` для констант периода.\n */\nconst hourOptions = Array.from({ length: 24 }, (_, index) => ({\n\tvalue: String(index),\n\ttitle: String(index).padStart(2, '0'),\n}));\n\n/**\n * Предустановленные варианты минут.\n *\n * Поддерижвает вставку произвольного значения через `modelValue`.\n */\nconst minuteOptions = Array.from({ length: 4 }, (_, index) => {\n\tconst minute = index * 15;\n\n\treturn {\n\t\tvalue: String(minute),\n\t\ttitle: String(minute).padStart(2, '0'),\n\t};\n});\n\nconst updateTimeByIndex = (index: number, patch: Partial<Props['modelValue'][number]>) => {\n\tconst nextTimes = [...times.value];\n\tnextTimes[index] = { ...nextTimes[index], ...patch };\n\n\ttimes.value = nextTimes;\n};\n\n/**\n * Добавить временной слот.\n *\n * UX: Временной слот должен добавляться в конец списка:\n * - текущий временной слот не должен заменться новым и спускаться ниже\n * - пржений список сохраняет привычный порядок\n * - должно быть видно новый слот\n * - новый слот должно быть можно удалить\n */\nconst addTime = () => {\n\ttimes.value = [\n\t\t...times.value,\n\t\t{\n\t\t\thour: '0',\n\t\t\tminute: '0',\n\t\t},\n\t];\n};\n\nconst delTime = (index: number) => {\n\ttimes.value = times.value.filter((_, timeIndex) => timeIndex !== index);\n};\n</script>\n\n<template>\n\t<div class=\"top-scheduleTimeSelector\">\n\t\t<div v-for=\"(time, index) in times\" :key=\"index\" class=\"top-scheduleTimeSelector_item\">\n\t\t\t<TopSelect\n\t\t\t\tclass=\"top-scheduleTimeSelector_hour\"\n\t\t\t\t:modelValue=\"time.hour\"\n\t\t\t\t:options=\"hourOptions\"\n\t\t\t\tavailableCustomValue\n\t\t\t\t@update:modelValue=\"updateTimeByIndex(index, { hour: $event as Props['modelValue'][number]['hour'] })\"\n\t\t\t/>\n\n\t\t\t<TopSelect\n\t\t\t\tclass=\"top-scheduleTimeSelector_minute\"\n\t\t\t\t:modelValue=\"time.minute\"\n\t\t\t\t:options=\"minuteOptions\"\n\t\t\t\tavailableCustomValue\n\t\t\t\t@update:modelValue=\"updateTimeByIndex(index, { minute: $event as Props['modelValue'][number]['minute'] })\"\n\t\t\t/>\n\n\t\t\t<TopButton\n\t\t\t\tv-if=\"props.multipleTimes || times.length > 1\"\n\t\t\t\t@click=\"index ? delTime(index) : addTime()\"\n\t\t\t\tcolor=\"theme\"\n\t\t\t\t:icon=\"index ? '' : ''\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","<script setup lang=\"ts\">\nimport type { Props } from '@/components/schedule/schedule/components/timeSelector/types';\n\nconst props = defineProps<Props>();\n\nconst times = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\n/**\n * Варианты выбора часа от `00` до `23`.\n *\n * Поддерижвает вставку произвольного значения через `modelValue` для констант периода.\n */\nconst hourOptions = Array.from({ length: 24 }, (_, index) => ({\n\tvalue: String(index),\n\ttitle: String(index).padStart(2, '0'),\n}));\n\n/**\n * Предустановленные варианты минут.\n *\n * Поддерижвает вставку произвольного значения через `modelValue`.\n */\nconst minuteOptions = Array.from({ length: 4 }, (_, index) => {\n\tconst minute = index * 15;\n\n\treturn {\n\t\tvalue: String(minute),\n\t\ttitle: String(minute).padStart(2, '0'),\n\t};\n});\n\nconst updateTimeByIndex = (index: number, patch: Partial<Props['modelValue'][number]>) => {\n\tconst nextTimes = [...times.value];\n\tnextTimes[index] = { ...nextTimes[index], ...patch };\n\n\ttimes.value = nextTimes;\n};\n\n/**\n * Добавить временной слот.\n *\n * UX: Временной слот должен добавляться в конец списка:\n * - текущий временной слот не должен заменться новым и спускаться ниже\n * - пржений список сохраняет привычный порядок\n * - должно быть видно новый слот\n * - новый слот должно быть можно удалить\n */\nconst addTime = () => {\n\ttimes.value = [\n\t\t...times.value,\n\t\t{\n\t\t\thour: '0',\n\t\t\tminute: '0',\n\t\t},\n\t];\n};\n\nconst delTime = (index: number) => {\n\ttimes.value = times.value.filter((_, timeIndex) => timeIndex !== index);\n};\n</script>\n\n<template>\n\t<div class=\"top-scheduleTimeSelector\">\n\t\t<div v-for=\"(time, index) in times\" :key=\"index\" class=\"top-scheduleTimeSelector_item\">\n\t\t\t<TopSelect\n\t\t\t\tclass=\"top-scheduleTimeSelector_hour\"\n\t\t\t\t:modelValue=\"time.hour\"\n\t\t\t\t:options=\"hourOptions\"\n\t\t\t\tavailableCustomValue\n\t\t\t\t@update:modelValue=\"updateTimeByIndex(index, { hour: $event as Props['modelValue'][number]['hour'] })\"\n\t\t\t/>\n\n\t\t\t<TopSelect\n\t\t\t\tclass=\"top-scheduleTimeSelector_minute\"\n\t\t\t\t:modelValue=\"time.minute\"\n\t\t\t\t:options=\"minuteOptions\"\n\t\t\t\tavailableCustomValue\n\t\t\t\t@update:modelValue=\"updateTimeByIndex(index, { minute: $event as Props['modelValue'][number]['minute'] })\"\n\t\t\t/>\n\n\t\t\t<TopButton\n\t\t\t\tv-if=\"props.multipleTimes || times.length > 1\"\n\t\t\t\t@click=\"index ? delTime(index) : addTime()\"\n\t\t\t\tcolor=\"theme\"\n\t\t\t\t:icon=\"index ? '' : ''\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","<script setup lang=\"ts\">\nimport type { Props } from '@/components/schedule/schedule/components/calendar/types';\nimport { useDaysByCalendarMode } from './composables/useDaysByCalendarMode';\nimport { numberEnding } from '@/core/utils/string';\nimport { computed } from 'vue';\nimport TopScheduleTimeSelector from '@/components/schedule/schedule/components/timeSelector/timeSelector.vue';\n\nconst props = defineProps<Props>();\n\nconst selectedDays = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst times = defineModel<Props['times']>('times', {\n\trequired: true,\n});\n\nconst days = useDaysByCalendarMode(() => props.mode);\n\nconst isAllDaysSelected = computed(() => selectedDays.value.includes('ALL') || selectedDays.value.length === days.value.length);\n\nconst toggleDay = (day: Props['modelValue'][number]) => {\n\tconst nextDays = selectedDays.value.includes('ALL') ? days.value.map(item => item.value) : [...selectedDays.value];\n\tconst dayIndex = nextDays.indexOf(day);\n\n\tif (dayIndex === -1) {\n\t\tnextDays.push(day);\n\t} else {\n\t\tnextDays.splice(dayIndex, 1);\n\t}\n\n\tselectedDays.value = nextDays.length === days.value.length ? ['ALL'] : nextDays;\n};\n\nconst toggleSelectAll = () => {\n\tselectedDays.value = isAllDaysSelected.value ? [] : ['ALL'];\n};\n</script>\n\n<template>\n\t<div class=\"top-scheduleCalendar\">\n\t\t<div class=\"top-scheduleCalendar_header\">\n\t\t\t<TopScheduleTimeSelector v-model=\"times\" :multipleTimes />\n\n\t\t\t<TopButton\n\t\t\t\t@click=\"toggleSelectAll()\"\n\t\t\t\tcolor=\"theme\"\n\t\t\t\ttabindex=\"0\"\n\t\t\t>\n\t\t\t\t{{ isAllDaysSelected ? $i18n.Common.Clear : $i18n.Common.Select_all }}\n\t\t\t</TopButton>\n\t\t</div>\n\n\t\t<div class=\"top-scheduleCalendar_calendar\">\n\t\t\t<label\n\t\t\t\tclass=\"top-scheduleCalendar_calendarDay\"\n\t\t\t\tv-for=\"day in days\"\n\t\t\t\t:key=\"day.value\"\n\t\t\t>\n\t\t\t\t<input\n\t\t\t\t\tclass=\"top-scheduleCalendar_calendarDayCheckbox\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t:value=\"day.value\"\n\t\t\t\t\t:checked=\"selectedDays.includes('ALL') || selectedDays.includes(day.value)\"\n\t\t\t\t\t@change=\"toggleDay(day.value)\"\n\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t>\n\n\t\t\t\t<span :data-top-icon=\"day.isIcon ? day.title : undefined\">\n\t\t\t\t\t<template v-if=\"!day.isIcon\">\n\t\t\t\t\t\t{{ day.title }}\n\t\t\t\t\t</template>\n\t\t\t\t</span>\n\t\t\t</label>\n\t\t</div>\n\n\t\t<span\n\t\t\t:class=\"{\n\t\t\t\t'top-scheduleCalendar_selectionSummary': true,\n\t\t\t'top-error': !selectedDays.length\n\t\t\t}\"\n\t\t>\n\t\t\t<!-- Каждый день или Число проверок в неделю / месяц-->\n\t\t\t{{\n\t\t\t\tisAllDaysSelected ?\n\t\t\t\t\t$i18n.Common.Every_day :\n\t\t\t\t\tselectedDays.length\n\t\t\t}}\n\n\t\t\t<template v-if=\"times.length > 1 || !isAllDaysSelected\">\n\t\t\t\t<!-- Добавить число временных слотов, если их несколько -->\n\t\t\t\t{{ times.length > 1 ? ` × ${times.length}` : '' }}\n\n\t\t\t\t<!-- Суффикс \"раз\" -->\n\t\t\t\t{{\n\t\t\t\t\tnumberEnding(\n\t\t\t\t\t\ttimes.length === 1 ? selectedDays.length : times.length,\n\t\t\t\t\t\t$i18n.Common.time_a_0,\n\t\t\t\t\t\t$i18n.Common.time_a_0,\n\t\t\t\t\t\t$i18n.Common.time_a_2,\n\t\t\t\t\t)\n\t\t\t\t}}\n\n\t\t\t\t<!-- В неделю / месяц-->\n\t\t\t\t{{ mode === 'dayOfWeek' ? $i18n.Common.a_week : $i18n.Common.a_month }}\n\t\t\t</template>\n\t\t</span>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","<script setup lang=\"ts\">\nimport type { Props } from '@/components/schedule/schedule/components/calendar/types';\nimport { useDaysByCalendarMode } from './composables/useDaysByCalendarMode';\nimport { numberEnding } from '@/core/utils/string';\nimport { computed } from 'vue';\nimport TopScheduleTimeSelector from '@/components/schedule/schedule/components/timeSelector/timeSelector.vue';\n\nconst props = defineProps<Props>();\n\nconst selectedDays = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst times = defineModel<Props['times']>('times', {\n\trequired: true,\n});\n\nconst days = useDaysByCalendarMode(() => props.mode);\n\nconst isAllDaysSelected = computed(() => selectedDays.value.includes('ALL') || selectedDays.value.length === days.value.length);\n\nconst toggleDay = (day: Props['modelValue'][number]) => {\n\tconst nextDays = selectedDays.value.includes('ALL') ? days.value.map(item => item.value) : [...selectedDays.value];\n\tconst dayIndex = nextDays.indexOf(day);\n\n\tif (dayIndex === -1) {\n\t\tnextDays.push(day);\n\t} else {\n\t\tnextDays.splice(dayIndex, 1);\n\t}\n\n\tselectedDays.value = nextDays.length === days.value.length ? ['ALL'] : nextDays;\n};\n\nconst toggleSelectAll = () => {\n\tselectedDays.value = isAllDaysSelected.value ? [] : ['ALL'];\n};\n</script>\n\n<template>\n\t<div class=\"top-scheduleCalendar\">\n\t\t<div class=\"top-scheduleCalendar_header\">\n\t\t\t<TopScheduleTimeSelector v-model=\"times\" :multipleTimes />\n\n\t\t\t<TopButton\n\t\t\t\t@click=\"toggleSelectAll()\"\n\t\t\t\tcolor=\"theme\"\n\t\t\t\ttabindex=\"0\"\n\t\t\t>\n\t\t\t\t{{ isAllDaysSelected ? $i18n.Common.Clear : $i18n.Common.Select_all }}\n\t\t\t</TopButton>\n\t\t</div>\n\n\t\t<div class=\"top-scheduleCalendar_calendar\">\n\t\t\t<label\n\t\t\t\tclass=\"top-scheduleCalendar_calendarDay\"\n\t\t\t\tv-for=\"day in days\"\n\t\t\t\t:key=\"day.value\"\n\t\t\t>\n\t\t\t\t<input\n\t\t\t\t\tclass=\"top-scheduleCalendar_calendarDayCheckbox\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t:value=\"day.value\"\n\t\t\t\t\t:checked=\"selectedDays.includes('ALL') || selectedDays.includes(day.value)\"\n\t\t\t\t\t@change=\"toggleDay(day.value)\"\n\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t>\n\n\t\t\t\t<span :data-top-icon=\"day.isIcon ? day.title : undefined\">\n\t\t\t\t\t<template v-if=\"!day.isIcon\">\n\t\t\t\t\t\t{{ day.title }}\n\t\t\t\t\t</template>\n\t\t\t\t</span>\n\t\t\t</label>\n\t\t</div>\n\n\t\t<span\n\t\t\t:class=\"{\n\t\t\t\t'top-scheduleCalendar_selectionSummary': true,\n\t\t\t'top-error': !selectedDays.length\n\t\t\t}\"\n\t\t>\n\t\t\t<!-- Каждый день или Число проверок в неделю / месяц-->\n\t\t\t{{\n\t\t\t\tisAllDaysSelected ?\n\t\t\t\t\t$i18n.Common.Every_day :\n\t\t\t\t\tselectedDays.length\n\t\t\t}}\n\n\t\t\t<template v-if=\"times.length > 1 || !isAllDaysSelected\">\n\t\t\t\t<!-- Добавить число временных слотов, если их несколько -->\n\t\t\t\t{{ times.length > 1 ? ` × ${times.length}` : '' }}\n\n\t\t\t\t<!-- Суффикс \"раз\" -->\n\t\t\t\t{{\n\t\t\t\t\tnumberEnding(\n\t\t\t\t\t\ttimes.length === 1 ? selectedDays.length : times.length,\n\t\t\t\t\t\t$i18n.Common.time_a_0,\n\t\t\t\t\t\t$i18n.Common.time_a_0,\n\t\t\t\t\t\t$i18n.Common.time_a_2,\n\t\t\t\t\t)\n\t\t\t\t}}\n\n\t\t\t\t<!-- В неделю / месяц-->\n\t\t\t\t{{ mode === 'dayOfWeek' ? $i18n.Common.a_week : $i18n.Common.a_month }}\n\t\t\t</template>\n\t\t</span>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","import type { Props as CalendarProps } from '@/components/schedule/schedule/components/calendar/types';\nimport type { Mode, Props } from './types';\nimport type { Option as TopSelectOption } from '@/components/forms/select/types';\nimport { useI18n } from '@/core/plugins/i18n';\n\n/**\n * Генерирует варианты задержки запуска после апдейта Яндекса.\n *\n * См. Апометр\n */\nexport const genAfterYandexUpdatedOptions = (): TopSelectOption[] => {\n\tconst i18n = useI18n();\n\n\treturn [\n\t\t{\n\t\t\tvalue: '0',\n\t\t\ttitle: i18n.Projects.immediately,\n\t\t},\n\t\t...Array.from({ length: 24 }, (_, index) => ({\n\t\t\tvalue: String(index + 1),\n\t\t\ttitle: i18n('Projects', 'in_hour', { hour: index + 1 }),\n\t\t})),\n\t];\n};\n\n/**\n * Проверяет, относится ли режим к календарным режимам.\n *\n * Календарный режим, это режим с выбором дней недели или месяца.\n */\nexport const isCalendarMode = (value: Mode): value is CalendarProps['mode'] => value === 'dayOfWeek' || value === 'dayOfMonth';\n\n/**\n * Определяет режим расписания по выбранным дням.\n */\nexport const getModeByDays = (days: Props['modelValue']['days'], currentMode: Mode = 'onDemand'): Mode => {\n\tif (days.includes('YANDEX_UPDATE')) return 'afterYandexUpdated';\n\tif (days.includes('CHECK_POSITIONS')) return 'afterCheck';\n\tif (days.includes('LAST_OF_MONTH') || days.some(day => /^\\d+$/.test(day))) return 'dayOfMonth';\n\n\tif (days.length) {\n\t\t// Сохраняем текущий календарный режим\n\t\tif (isCalendarMode(currentMode)) return currentMode;\n\n\t\t// Режим по умолчанию для `ALL`\n\t\treturn 'dayOfWeek';\n\t}\n\n\treturn currentMode;\n};\n","import { computed, type Ref } from 'vue';\nimport type { Option as TopSelectOption } from '@/components/forms/select/types';\nimport { useI18n } from '@/core/plugins/i18n';\nimport type { Mode, Props } from '../types';\n\nconst defaultModsGo: readonly Mode[] = ['onDemand', 'dayOfWeek', 'dayOfMonth'];\nconst defaultModsReport: readonly Mode[] = ['onDemand', 'afterCheck'];\n\n/**\n * Формирует реактивный список режимов расписания с учетом дополнительных режимов.\n */\nexport const useModeOptions = (props: Props, mode: Ref<Mode>) => {\n\tconst i18n = useI18n();\n\n\treturn computed<TopSelectOption[]>(() => {\n\t\tconst modes: Mode[] = props.type === 'go' ? [...defaultModsGo] : [...defaultModsReport];\n\n\t\tif (props.extraMods) {\n\t\t\tmodes.push(...props.extraMods);\n\t\t}\n\n\t\t// Всегда отображать выбранный режим.\n\t\tif (!modes.includes(mode.value)) modes.push(mode.value);\n\n\t\t// Словарь Dynamics нужен только потребителям режима afterCheck.\n\t\tconst titles: Record<Mode, string> = {\n\t\t\tonDemand: i18n.Projects.Settings_on_demand,\n\t\t\tdayOfWeek: i18n.Projects.Report_on_weekdays,\n\t\t\tdayOfMonth: i18n.Projects.Settings_particular_days,\n\t\t\tafterYandexUpdated: i18n.Projects.After_updates,\n\t\t\tafterCheck: modes.includes('afterCheck') ? i18n.Dynamics.Report_after_tracking_30min_1 : '',\n\t\t};\n\n\t\treturn modes.map(value => ({ value, title: titles[value] }));\n\t});\n};\n","import { watch, type Ref } from 'vue';\nimport type { Mode, Props } from '../types';\nimport { isCalendarMode } from '../utils';\n\n/**\n * Создаёт независимую копию модели расписания.\n */\nconst cloneModel = (model: Props['modelValue']): Props['modelValue'] => ({\n\tdays: [...model.days],\n\ttimes: model.times.map(time => ({ ...time })),\n});\n\n/**\n * Сохраняет дни и временные слоты модели по режимам расписания.\n */\nexport const useModelByModeCache = (model: Ref<Props['modelValue']>, mode: Ref<Mode>) => {\n\ttype TimeCacheMode = Mode | 'calendar';\n\n\tconst cache = {\n\t\t// Дни календарных режимов кэшируем отдельно.\n\t\tdaysByMode: {} as Partial<Record<Mode, Props['modelValue']['days']>>,\n\n\t\t// Временные слоты храним по режимам, используя общий ключ `calendar` для недели и месяца.\n\t\ttimesByMode: {} as Partial<Record<TimeCacheMode, Props['modelValue']['times']>>,\n\t};\n\n\t// Сохранять настройки выбранного режима\n\twatch(model, () => {\n\t\tconst modelCached = cloneModel(model.value);\n\n\t\tcache.daysByMode[mode.value] = modelCached.days;\n\t\tcache.timesByMode[isCalendarMode(mode.value) ? 'calendar' : mode.value] = modelCached.times;\n\t}, { deep: true, immediate: true });\n\n\treturn cache;\n};\n","<script setup lang=\"ts\">\nimport { ref, watch } from 'vue';\nimport TopSelect from '@/components/forms/select/select.vue';\nimport TopScheduleCalendar from '@/components/schedule/schedule/components/calendar/calendar.vue';\nimport type { Mode, Props, Slots } from './types';\nimport { genAfterYandexUpdatedOptions, getModeByDays, isCalendarMode } from './utils';\nimport { useModeOptions } from './composables/useModeOptions';\nimport { useModelByModeCache } from './composables/useModelByModeCache';\n\n/**\n * Используется для размытия нагрузка на разное время\n */\nconst randomHour = String(Math.floor(Math.random() * 7) + 1) as Props['modelValue']['times'][number]['hour'];\n\nconst props = withDefaults(defineProps<Props>(), {\n\t// Тип `go` соответствует запуску инструмента по расписанию.\n\ttype: 'go',\n});\n\ndefineSlots<Slots>();\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\n// Выбранный режим\nconst mode = ref<Mode>(getModeByDays(model.value.days));\n\n// Список режимов\nconst modeOptions = useModeOptions(props, mode);\n\nconst afterYandexUpdatedOptions = genAfterYandexUpdatedOptions();\n\n// Кэш дней по режимам и временных слотов по группам расписания.\nconst cache = useModelByModeCache(model, mode);\n\n/**\n * При смене `days` сразу проверяем доступное значение режима и обновляем его, если надо.\n *\n * @note 1 в цепочке перед `watch(mode)`, цепочки не цикличны\n */\nwatch(\n\t() => model.value.days,\n\t() => mode.value = getModeByDays(model.value.days, mode.value),\n\t{ deep: true, immediate: true },\n);\n\n/**\n * При смене режима устанавливаем соответствующие `days` и `times`.\n *\n * Для календарных режимов восстанавливаем ранее сохранённый выбор дней.\n *\n * @note 2 в цепочке после `watch(() => model.value.days)`, цепочки не цикличны\n */\nwatch(mode, (newMode, oldMode) => {\n\t// Для недели и месяца временные слоты берём из общего кэша `calendar`.\n\tconst daysCached = cache.daysByMode[newMode];\n\tconst timesCached = cache.timesByMode[isCalendarMode(newMode) ? 'calendar' : newMode];\n\n\tconst modelPath: Partial<Props['modelValue']> = {};\n\tconst modeChaged = oldMode;\n\n\tswitch (newMode) {\n\t\tcase 'onDemand':\n\t\t\tif (modeChaged || model.value.days.length) modelPath.days = [];\n\t\t\tif (modeChaged || model.value.times.length) modelPath.times = [];\n\n\t\t\tbreak;\n\t\tcase 'dayOfWeek':\n\t\tcase 'dayOfMonth': {\n\t\t\tif (modeChaged || !model.value.days.length) modelPath.days = daysCached ?? ['ALL'];\n\t\t\tif (modeChaged || !model.value.times.length) modelPath.times = timesCached?.length ? timesCached : [{ hour: randomHour, minute: '0' }];\n\n\t\t\tbreak;\n\t\t}\n\t\tcase 'afterYandexUpdated':\n\t\t\tif (modeChaged || model.value.days[0] !== 'YANDEX_UPDATE') modelPath.days = ['YANDEX_UPDATE'];\n\t\t\tif (modeChaged || !model.value.times.length) modelPath.times = timesCached?.length ? timesCached : [{ hour: '1', minute: '0' }];\n\n\t\t\tbreak;\n\t\tcase 'afterCheck':\n\t\t\tif (modeChaged || model.value.days[0] !== 'CHECK_POSITIONS') modelPath.days = ['CHECK_POSITIONS'];\n\t\t\tif (modeChaged || !model.value.times.length) modelPath.times = timesCached?.length ? timesCached : [{ hour: '0', minute: '0' }];\n\n\t\t\tbreak;\n\t}\n\n\t// Отправляем новое значение только тогда, когда хотя бы одно поле требует изменения.\n\tif (Object.keys(modelPath).length) model.value = { ...model.value, ...modelPath };\n}, { immediate: true });\n</script>\n\n<template>\n\t<div :class=\"['top-schedule', 'top-schedule-type_' + type]\">\n\t\t<div class=\"top-schedule_header\">\n\t\t\t<div class=\"top-schedule_headerTitle\">\n\t\t\t\t{{ title ?? (type === 'go' ? $i18n.Projects.Checks : $i18n.Projects.Reports) }}\n\t\t\t</div>\n\n\t\t\t<TopSelect\n\t\t\t\tclass=\"top-schedule_headerMods\"\n\t\t\t\tv-model=\"mode\"\n\t\t\t\t:options=\"modeOptions\"\n\t\t\t\tsize=\"s\"\n\t\t\t/>\n\t\t</div>\n\n\t\t<div v-if=\"mode !== 'onDemand' && (isCalendarMode(mode) || mode === 'afterYandexUpdated' || $slots.default)\" class=\"top-schedule_body\">\n\t\t\t<TopScheduleCalendar\n\t\t\t\tv-if=\"isCalendarMode(mode)\"\n\t\t\t\tv-model=\"model.days\"\n\t\t\t\tv-model:times=\"model.times\"\n\t\t\t\t:mode\n\t\t\t\t:multipleTimes\n\t\t\t/>\n\n\t\t\t<TopSelect\n\t\t\t\tv-if=\"mode === 'afterYandexUpdated' && model.times[0]\"\n\t\t\t\tclass=\"top-schedule_afterYandexUpdatedDelay\"\n\t\t\t\tv-model=\"model.times[0].hour\"\n\t\t\t\t:options=\"afterYandexUpdatedOptions\"\n\t\t\t\tsize=\"s\"\n\t\t\t/>\n\n\t\t\t<hr v-if=\"(isCalendarMode(mode) || mode === 'afterYandexUpdated') && $slots.default\">\n\n\t\t\t<slot :mode></slot>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","<script setup lang=\"ts\">\nimport { ref, watch } from 'vue';\nimport TopSelect from '@/components/forms/select/select.vue';\nimport TopScheduleCalendar from '@/components/schedule/schedule/components/calendar/calendar.vue';\nimport type { Mode, Props, Slots } from './types';\nimport { genAfterYandexUpdatedOptions, getModeByDays, isCalendarMode } from './utils';\nimport { useModeOptions } from './composables/useModeOptions';\nimport { useModelByModeCache } from './composables/useModelByModeCache';\n\n/**\n * Используется для размытия нагрузка на разное время\n */\nconst randomHour = String(Math.floor(Math.random() * 7) + 1) as Props['modelValue']['times'][number]['hour'];\n\nconst props = withDefaults(defineProps<Props>(), {\n\t// Тип `go` соответствует запуску инструмента по расписанию.\n\ttype: 'go',\n});\n\ndefineSlots<Slots>();\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\n// Выбранный режим\nconst mode = ref<Mode>(getModeByDays(model.value.days));\n\n// Список режимов\nconst modeOptions = useModeOptions(props, mode);\n\nconst afterYandexUpdatedOptions = genAfterYandexUpdatedOptions();\n\n// Кэш дней по режимам и временных слотов по группам расписания.\nconst cache = useModelByModeCache(model, mode);\n\n/**\n * При смене `days` сразу проверяем доступное значение режима и обновляем его, если надо.\n *\n * @note 1 в цепочке перед `watch(mode)`, цепочки не цикличны\n */\nwatch(\n\t() => model.value.days,\n\t() => mode.value = getModeByDays(model.value.days, mode.value),\n\t{ deep: true, immediate: true },\n);\n\n/**\n * При смене режима устанавливаем соответствующие `days` и `times`.\n *\n * Для календарных режимов восстанавливаем ранее сохранённый выбор дней.\n *\n * @note 2 в цепочке после `watch(() => model.value.days)`, цепочки не цикличны\n */\nwatch(mode, (newMode, oldMode) => {\n\t// Для недели и месяца временные слоты берём из общего кэша `calendar`.\n\tconst daysCached = cache.daysByMode[newMode];\n\tconst timesCached = cache.timesByMode[isCalendarMode(newMode) ? 'calendar' : newMode];\n\n\tconst modelPath: Partial<Props['modelValue']> = {};\n\tconst modeChaged = oldMode;\n\n\tswitch (newMode) {\n\t\tcase 'onDemand':\n\t\t\tif (modeChaged || model.value.days.length) modelPath.days = [];\n\t\t\tif (modeChaged || model.value.times.length) modelPath.times = [];\n\n\t\t\tbreak;\n\t\tcase 'dayOfWeek':\n\t\tcase 'dayOfMonth': {\n\t\t\tif (modeChaged || !model.value.days.length) modelPath.days = daysCached ?? ['ALL'];\n\t\t\tif (modeChaged || !model.value.times.length) modelPath.times = timesCached?.length ? timesCached : [{ hour: randomHour, minute: '0' }];\n\n\t\t\tbreak;\n\t\t}\n\t\tcase 'afterYandexUpdated':\n\t\t\tif (modeChaged || model.value.days[0] !== 'YANDEX_UPDATE') modelPath.days = ['YANDEX_UPDATE'];\n\t\t\tif (modeChaged || !model.value.times.length) modelPath.times = timesCached?.length ? timesCached : [{ hour: '1', minute: '0' }];\n\n\t\t\tbreak;\n\t\tcase 'afterCheck':\n\t\t\tif (modeChaged || model.value.days[0] !== 'CHECK_POSITIONS') modelPath.days = ['CHECK_POSITIONS'];\n\t\t\tif (modeChaged || !model.value.times.length) modelPath.times = timesCached?.length ? timesCached : [{ hour: '0', minute: '0' }];\n\n\t\t\tbreak;\n\t}\n\n\t// Отправляем новое значение только тогда, когда хотя бы одно поле требует изменения.\n\tif (Object.keys(modelPath).length) model.value = { ...model.value, ...modelPath };\n}, { immediate: true });\n</script>\n\n<template>\n\t<div :class=\"['top-schedule', 'top-schedule-type_' + type]\">\n\t\t<div class=\"top-schedule_header\">\n\t\t\t<div class=\"top-schedule_headerTitle\">\n\t\t\t\t{{ title ?? (type === 'go' ? $i18n.Projects.Checks : $i18n.Projects.Reports) }}\n\t\t\t</div>\n\n\t\t\t<TopSelect\n\t\t\t\tclass=\"top-schedule_headerMods\"\n\t\t\t\tv-model=\"mode\"\n\t\t\t\t:options=\"modeOptions\"\n\t\t\t\tsize=\"s\"\n\t\t\t/>\n\t\t</div>\n\n\t\t<div v-if=\"mode !== 'onDemand' && (isCalendarMode(mode) || mode === 'afterYandexUpdated' || $slots.default)\" class=\"top-schedule_body\">\n\t\t\t<TopScheduleCalendar\n\t\t\t\tv-if=\"isCalendarMode(mode)\"\n\t\t\t\tv-model=\"model.days\"\n\t\t\t\tv-model:times=\"model.times\"\n\t\t\t\t:mode\n\t\t\t\t:multipleTimes\n\t\t\t/>\n\n\t\t\t<TopSelect\n\t\t\t\tv-if=\"mode === 'afterYandexUpdated' && model.times[0]\"\n\t\t\t\tclass=\"top-schedule_afterYandexUpdatedDelay\"\n\t\t\t\tv-model=\"model.times[0].hour\"\n\t\t\t\t:options=\"afterYandexUpdatedOptions\"\n\t\t\t\tsize=\"s\"\n\t\t\t/>\n\n\t\t\t<hr v-if=\"(isCalendarMode(mode) || mode === 'afterYandexUpdated') && $slots.default\">\n\n\t\t\t<slot :mode></slot>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref } from 'vue';\nimport TopInput from '@/components/forms/input/input.vue';\nimport TopButton from '@/components/forms/button/button.vue';\nimport Core from '@/core/core/core';\nimport { isEmail } from '@/core/utils/check';\nimport { useI18n } from '@/core/plugins/i18n';\nimport type { Props, Emits } from '@/components/schedule/schedule/components/emails/selector/types';\n\nconst props = withDefaults(defineProps<Props>(), {\n\temails: () => [],\n\tgetEmailSuggestions: () => [],\n});\n\nconst model = defineModel<Props['modelValue']>({ required: true });\n\nconst emit = defineEmits<Emits>();\n\nconst i18n = useI18n();\nconst $ = Core.$;\n\nconst elRootRef = ref<HTMLElement>();\nconst elInputRef = ref<InstanceType<typeof TopInput>>();\nlet elInput: HTMLInputElement | null = null;\nconst autocompleteCache: Record<string, string[]> = {};\n\n// При достижении лимита отключаем поле ввода и скрываем кнопку добавления.\nconst isLimitReached = computed(() => !!props.maxEmailsCount && props.emails.length >= props.maxEmailsCount);\n\nconst filterEmails = (emails: string[]) => emails.filter(email => !props.emails.includes(email));\n\nconst submit = (value: unknown = model.value) => {\n\tconst email = String(value).trim();\n\tif (!email) return;\n\n\tif (!isEmail(email)) {\n\t\tvoid Core.notice(i18n.Common.Enter_valid_email_notice, 'error');\n\n\t\treturn;\n\t}\n\n\temit('submit', email);\n};\n\nconst initAutocomplete = async () => {\n\tawait nextTick();\n\n\telInput = elInputRef.value?.$el.querySelector('input') ?? null;\n\tif (!elInput) return;\n\n\tif (!$?.ui?.autocomplete) {\n\t\tconsole.info('Для работы autocomplete требуется глобальная загрузка jQuery UI Autocomplete');\n\n\t\treturn;\n\t}\n\n\t$(elInput).autocomplete({\n\t\tappendTo: elRootRef.value,\n\t\tminLength: 0,\n\t\tsource: async (request: { term: string }, response: (items: Array<{ label: string, value: string }>) => void) => {\n\t\t\tconst term = request.term;\n\n\t\t\tif (!(term in autocompleteCache)) {\n\t\t\t\tautocompleteCache[term] = await props.getEmailSuggestions(term);\n\t\t\t}\n\n\t\t\tresponse(filterEmails(autocompleteCache[term]).map(email => ({\n\t\t\t\tlabel: email,\n\t\t\t\tvalue: email,\n\t\t\t})));\n\t\t},\n\t\tselect: (event: Event, ui: { item?: { value: string } }) => {\n\t\t\tif (!ui.item || !elInput) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tsubmit(ui.item.value);\n\t\t\tmodel.value = '';\n\n\t\t\t$(elInput).trigger('focus');\n\t\t},\n\t});\n\n\t$(elInput).attr('autocomplete', 'disabled');\n\t$(elInput).on('focus.scheduleEmailSelector', () => {\n\t\tif (!elInput) return;\n\n\t\t$(elInput).trigger('input');\n\t});\n};\n\nonMounted(() => {\n\tvoid initAutocomplete();\n});\n\nonBeforeUnmount(() => {\n\tif (!$?.ui?.autocomplete || !elInput) return;\n\n\t$(elInput).off('focus.scheduleEmailSelector');\n\t$(elInput).autocomplete('destroy');\n});\n</script>\n\n<template>\n\t<div\n\t\tclass=\"top-scheduleEmailSelector\"\n\t\tref=\"elRootRef\"\n\t>\n\t\t<!-- UX: Компонент не должен скраываться, это приведет к CLS -->\n\t\t<TopInput\n\t\t\tref=\"elInputRef\"\n\t\t\tv-model=\"model\"\n\t\t\t@keydown.enter.prevent=\"submit()\"\n\t\t\t:title=\"$i18n.Common.Enter_email\"\n\t\t\ttype=\"email\"\n\t\t\tsize=\"m\"\n\t\t\t:disabled=\"isLimitReached\"\n\t\t>\n\t\t\t<TopButton\n\t\t\t\tv-if=\"!isLimitReached\"\n\t\t\t\tclass=\"top-scheduleEmailSelector_submit\"\n\t\t\t\tcolor=\"theme\"\n\t\t\t\ticon=\"\"\n\t\t\t\t@click.prevent=\"submit()\"\n\t\t\t/>\n\t\t</TopInput>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref } from 'vue';\nimport TopInput from '@/components/forms/input/input.vue';\nimport TopButton from '@/components/forms/button/button.vue';\nimport Core from '@/core/core/core';\nimport { isEmail } from '@/core/utils/check';\nimport { useI18n } from '@/core/plugins/i18n';\nimport type { Props, Emits } from '@/components/schedule/schedule/components/emails/selector/types';\n\nconst props = withDefaults(defineProps<Props>(), {\n\temails: () => [],\n\tgetEmailSuggestions: () => [],\n});\n\nconst model = defineModel<Props['modelValue']>({ required: true });\n\nconst emit = defineEmits<Emits>();\n\nconst i18n = useI18n();\nconst $ = Core.$;\n\nconst elRootRef = ref<HTMLElement>();\nconst elInputRef = ref<InstanceType<typeof TopInput>>();\nlet elInput: HTMLInputElement | null = null;\nconst autocompleteCache: Record<string, string[]> = {};\n\n// При достижении лимита отключаем поле ввода и скрываем кнопку добавления.\nconst isLimitReached = computed(() => !!props.maxEmailsCount && props.emails.length >= props.maxEmailsCount);\n\nconst filterEmails = (emails: string[]) => emails.filter(email => !props.emails.includes(email));\n\nconst submit = (value: unknown = model.value) => {\n\tconst email = String(value).trim();\n\tif (!email) return;\n\n\tif (!isEmail(email)) {\n\t\tvoid Core.notice(i18n.Common.Enter_valid_email_notice, 'error');\n\n\t\treturn;\n\t}\n\n\temit('submit', email);\n};\n\nconst initAutocomplete = async () => {\n\tawait nextTick();\n\n\telInput = elInputRef.value?.$el.querySelector('input') ?? null;\n\tif (!elInput) return;\n\n\tif (!$?.ui?.autocomplete) {\n\t\tconsole.info('Для работы autocomplete требуется глобальная загрузка jQuery UI Autocomplete');\n\n\t\treturn;\n\t}\n\n\t$(elInput).autocomplete({\n\t\tappendTo: elRootRef.value,\n\t\tminLength: 0,\n\t\tsource: async (request: { term: string }, response: (items: Array<{ label: string, value: string }>) => void) => {\n\t\t\tconst term = request.term;\n\n\t\t\tif (!(term in autocompleteCache)) {\n\t\t\t\tautocompleteCache[term] = await props.getEmailSuggestions(term);\n\t\t\t}\n\n\t\t\tresponse(filterEmails(autocompleteCache[term]).map(email => ({\n\t\t\t\tlabel: email,\n\t\t\t\tvalue: email,\n\t\t\t})));\n\t\t},\n\t\tselect: (event: Event, ui: { item?: { value: string } }) => {\n\t\t\tif (!ui.item || !elInput) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tsubmit(ui.item.value);\n\t\t\tmodel.value = '';\n\n\t\t\t$(elInput).trigger('focus');\n\t\t},\n\t});\n\n\t$(elInput).attr('autocomplete', 'disabled');\n\t$(elInput).on('focus.scheduleEmailSelector', () => {\n\t\tif (!elInput) return;\n\n\t\t$(elInput).trigger('input');\n\t});\n};\n\nonMounted(() => {\n\tvoid initAutocomplete();\n});\n\nonBeforeUnmount(() => {\n\tif (!$?.ui?.autocomplete || !elInput) return;\n\n\t$(elInput).off('focus.scheduleEmailSelector');\n\t$(elInput).autocomplete('destroy');\n});\n</script>\n\n<template>\n\t<div\n\t\tclass=\"top-scheduleEmailSelector\"\n\t\tref=\"elRootRef\"\n\t>\n\t\t<!-- UX: Компонент не должен скраываться, это приведет к CLS -->\n\t\t<TopInput\n\t\t\tref=\"elInputRef\"\n\t\t\tv-model=\"model\"\n\t\t\t@keydown.enter.prevent=\"submit()\"\n\t\t\t:title=\"$i18n.Common.Enter_email\"\n\t\t\ttype=\"email\"\n\t\t\tsize=\"m\"\n\t\t\t:disabled=\"isLimitReached\"\n\t\t>\n\t\t\t<TopButton\n\t\t\t\tv-if=\"!isLimitReached\"\n\t\t\t\tclass=\"top-scheduleEmailSelector_submit\"\n\t\t\t\tcolor=\"theme\"\n\t\t\t\ticon=\"\"\n\t\t\t\t@click.prevent=\"submit()\"\n\t\t\t/>\n\t\t</TopInput>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport type { Emits, Props } from '@/components/schedule/schedule/components/emails/types';\nimport ScheduleEmailSelector from '@/components/schedule/schedule/components/emails/selector/selector.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\temails: () => [],\n\tgetEmailSuggestions: () => [],\n});\n\nconst emit = defineEmits<Emits>();\n\nconst value = ref('');\n\nconst addEmail = (email: string) => {\n\tconst preparedEmail = email.trim();\n\n\tif (!preparedEmail || props.emails.includes(preparedEmail)) {\n\t\tvalue.value = '';\n\n\t\treturn;\n\t}\n\n\temit('add:email', preparedEmail);\n\n\tvalue.value = '';\n};\n</script>\n\n<template>\n\t<div class=\"top-scheduleEmail\">\n\t\t<div class=\"top-scheduleEmail_title\">\n\t\t\t{{ $i18n.Projects.Reports_send_to_address }} E-mail:\n\t\t</div>\n\n\t\t<ScheduleEmailSelector\n\t\t\tv-model=\"value\"\n\t\t\t:emails\n\t\t\t:maxEmailsCount\n\t\t\t:getEmailSuggestions\n\t\t\t@submit=\"addEmail\"\n\t\t/>\n\n\t\t<div\n\t\t\tv-if=\"emails.length\"\n\t\t\tclass=\"top-scheduleEmail_emails\"\n\t\t>\n\t\t\t<div\n\t\t\t\tclass=\"top-scheduleEmail_emailsItem\"\n\t\t\t\tv-for=\"email in emails\"\n\t\t\t\t:key=\"email\"\n\t\t\t>\n\t\t\t\t<span class=\"top-ellipsis1\">{{ email }}</span>\n\n\t\t\t\t<TopButton\n\t\t\t\t\t@click=\"emit('remove:email', email)\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\ticon=\"\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport type { Emits, Props } from '@/components/schedule/schedule/components/emails/types';\nimport ScheduleEmailSelector from '@/components/schedule/schedule/components/emails/selector/selector.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\temails: () => [],\n\tgetEmailSuggestions: () => [],\n});\n\nconst emit = defineEmits<Emits>();\n\nconst value = ref('');\n\nconst addEmail = (email: string) => {\n\tconst preparedEmail = email.trim();\n\n\tif (!preparedEmail || props.emails.includes(preparedEmail)) {\n\t\tvalue.value = '';\n\n\t\treturn;\n\t}\n\n\temit('add:email', preparedEmail);\n\n\tvalue.value = '';\n};\n</script>\n\n<template>\n\t<div class=\"top-scheduleEmail\">\n\t\t<div class=\"top-scheduleEmail_title\">\n\t\t\t{{ $i18n.Projects.Reports_send_to_address }} E-mail:\n\t\t</div>\n\n\t\t<ScheduleEmailSelector\n\t\t\tv-model=\"value\"\n\t\t\t:emails\n\t\t\t:maxEmailsCount\n\t\t\t:getEmailSuggestions\n\t\t\t@submit=\"addEmail\"\n\t\t/>\n\n\t\t<div\n\t\t\tv-if=\"emails.length\"\n\t\t\tclass=\"top-scheduleEmail_emails\"\n\t\t>\n\t\t\t<div\n\t\t\t\tclass=\"top-scheduleEmail_emailsItem\"\n\t\t\t\tv-for=\"email in emails\"\n\t\t\t\t:key=\"email\"\n\t\t\t>\n\t\t\t\t<span class=\"top-ellipsis1\">{{ email }}</span>\n\n\t\t\t\t<TopButton\n\t\t\t\t\t@click=\"emit('remove:email', email)\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\ticon=\"\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","<script setup lang=\"ts\">\nimport type { Emits, Props } from '@/components/schedule/schedule/components/socials/types';\n\nconst props = defineProps<Props>();\ndefineEmits<Emits>();\n\ntype ReportChannelSource = Props['channels'][number]['source'];\n\nconst hasChannel = (source: ReportChannelSource) => props.channels.some(channel => channel.source === source);\n\nconst sourceIconBySource: Record<ReportChannelSource, string> = {\n\tinformer: '',\n\ttelegram: '',\n};\n</script>\n\n<template>\n\t<div class=\"top-scheduleSocials\">\n\t\t<div class=\"top-scheduleSocials_title\">\n\t\t\t{{ $i18n.Projects.Reports_send_to_address }}\n\t\t</div>\n\n\t\t<div class=\"top-scheduleSocials_channels\">\n\t\t\t<div\n\t\t\t\tclass=\"top-scheduleSocials_channel\"\n\t\t\t\tv-for=\"channel in channels\"\n\t\t\t\t:key=\"`${channel.source}-${channel.id}`\"\n\t\t\t>\n\t\t\t\t<span\n\t\t\t\t\tclass=\"top-scheduleSocials_channelIcon\"\n\t\t\t\t\t:data-top-icon=\"sourceIconBySource[channel.source]\"\n\t\t\t\t></span>\n\n\t\t\t\t<span class=\"top-scheduleSocials_channelLabel top-ellipsis1\">\n\t\t\t\t\t{{ channel.label }}\n\t\t\t\t</span>\n\n\t\t\t\t<TopButton\n\t\t\t\t\tv-if=\"channel.settingLink\"\n\t\t\t\t\tclass=\"top-scheduleSocials_channelSettings\"\n\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t:href=\"channel.settingLink\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\ticon=\"\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t></TopButton>\n\n\t\t\t\t<TopSwitcher\n\t\t\t\t\tclass=\"top-scheduleSocials_channelSwitcher\"\n\t\t\t\t\t:modelValue=\"channel.selected\"\n\t\t\t\t\t@update:modelValue=\"$emit('update:channelSelected', {\n\t\t\t\t\t\tid: channel.id,\n\t\t\t\t\t\tsource: channel.source,\n\t\t\t\t\t\tselected: $event as boolean,\n\t\t\t\t\t})\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<template\n\t\t\t\tv-for=\"connector in connectors\"\n\t\t\t\t:key=\"connector.source\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"!hasChannel(connector.source)\"\n\t\t\t\tclass=\"top-scheduleSocials_channel\"\n\t\t\t\t>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"top-scheduleSocials_channelIcon\"\n\t\t\t\t\t\t:data-top-icon=\"sourceIconBySource[connector.source]\"\n\t\t\t\t\t></span>\n\n\t\t\t\t\t<a\n\t\t\t\t\t\tclass=\"top-scheduleSocials_channelLabel top-ellipsis1\"\n\t\t\t\t\t\t:href=\"connector.connectLink\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ connector.connectLabel }}\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","<script setup lang=\"ts\">\nimport type { Emits, Props } from '@/components/schedule/schedule/components/socials/types';\n\nconst props = defineProps<Props>();\ndefineEmits<Emits>();\n\ntype ReportChannelSource = Props['channels'][number]['source'];\n\nconst hasChannel = (source: ReportChannelSource) => props.channels.some(channel => channel.source === source);\n\nconst sourceIconBySource: Record<ReportChannelSource, string> = {\n\tinformer: '',\n\ttelegram: '',\n};\n</script>\n\n<template>\n\t<div class=\"top-scheduleSocials\">\n\t\t<div class=\"top-scheduleSocials_title\">\n\t\t\t{{ $i18n.Projects.Reports_send_to_address }}\n\t\t</div>\n\n\t\t<div class=\"top-scheduleSocials_channels\">\n\t\t\t<div\n\t\t\t\tclass=\"top-scheduleSocials_channel\"\n\t\t\t\tv-for=\"channel in channels\"\n\t\t\t\t:key=\"`${channel.source}-${channel.id}`\"\n\t\t\t>\n\t\t\t\t<span\n\t\t\t\t\tclass=\"top-scheduleSocials_channelIcon\"\n\t\t\t\t\t:data-top-icon=\"sourceIconBySource[channel.source]\"\n\t\t\t\t></span>\n\n\t\t\t\t<span class=\"top-scheduleSocials_channelLabel top-ellipsis1\">\n\t\t\t\t\t{{ channel.label }}\n\t\t\t\t</span>\n\n\t\t\t\t<TopButton\n\t\t\t\t\tv-if=\"channel.settingLink\"\n\t\t\t\t\tclass=\"top-scheduleSocials_channelSettings\"\n\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t:href=\"channel.settingLink\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\ticon=\"\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t></TopButton>\n\n\t\t\t\t<TopSwitcher\n\t\t\t\t\tclass=\"top-scheduleSocials_channelSwitcher\"\n\t\t\t\t\t:modelValue=\"channel.selected\"\n\t\t\t\t\t@update:modelValue=\"$emit('update:channelSelected', {\n\t\t\t\t\t\tid: channel.id,\n\t\t\t\t\t\tsource: channel.source,\n\t\t\t\t\t\tselected: $event as boolean,\n\t\t\t\t\t})\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<template\n\t\t\t\tv-for=\"connector in connectors\"\n\t\t\t\t:key=\"connector.source\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"!hasChannel(connector.source)\"\n\t\t\t\tclass=\"top-scheduleSocials_channel\"\n\t\t\t\t>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"top-scheduleSocials_channelIcon\"\n\t\t\t\t\t\t:data-top-icon=\"sourceIconBySource[connector.source]\"\n\t\t\t\t\t></span>\n\n\t\t\t\t\t<a\n\t\t\t\t\t\tclass=\"top-scheduleSocials_channelLabel top-ellipsis1\"\n\t\t\t\t\t\t:href=\"connector.connectLink\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ connector.connectLabel }}\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"schedule.js","names":[],"sources":["../../src/components/schedule/schedule/components/calendar/composables/useDaysByCalendarMode.ts","../../src/components/schedule/schedule/components/timeSelector/timeSelector.vue","../../src/components/schedule/schedule/components/timeSelector/timeSelector.vue","../../src/components/schedule/schedule/components/calendar/calendar.vue","../../src/components/schedule/schedule/components/calendar/calendar.vue","../../src/components/schedule/schedule/utils.ts","../../src/components/schedule/schedule/composables/useModeOptions.ts","../../src/components/schedule/schedule/composables/useModelByModeCache.ts","../../src/components/schedule/schedule/schedule.vue","../../src/components/schedule/schedule/schedule.vue","../../src/components/schedule/schedule/components/emails/selector/selector.vue","../../src/components/schedule/schedule/components/emails/selector/selector.vue","../../src/components/schedule/schedule/components/emails/emails.vue","../../src/components/schedule/schedule/components/emails/emails.vue","../../src/components/schedule/schedule/components/socials/socials.vue","../../src/components/schedule/schedule/components/socials/socials.vue"],"sourcesContent":["import { computed, type MaybeRefOrGetter, toValue } from 'vue';\nimport type { Day, Props } from '../types';\nimport { useI18n } from '@/core/app';\n\n/**\n * Формирует список дней для выбранного режима календаря.\n */\nexport const useDaysByCalendarMode = (mode: MaybeRefOrGetter<Props['mode']>) => {\n\tconst i18n = useI18n();\n\n\treturn computed<Day[]>(() => {\n\t\tswitch (toValue(mode)) {\n\t\t\t// Дни месяца\n\t\t\tcase 'dayOfMonth': {\n\t\t\t\tconst days: Day[] = Array.from({ length: 27 }, (_, index) => ({\n\t\t\t\t\tvalue: String(index + 1) as Day['value'],\n\t\t\t\t\ttitle: String(index + 1),\n\t\t\t\t}));\n\n\t\t\t\tdays.push({\n\t\t\t\t\tvalue: 'LAST_OF_MONTH',\n\t\t\t\t\ttitle: '',\n\t\t\t\t\tisIcon: true,\n\t\t\t\t});\n\n\t\t\t\treturn days;\n\t\t\t}\n\n\t\t\t// Дни недели\n\t\t\tcase 'dayOfWeek':\n\t\t\t\treturn [\n\t\t\t\t\t{ value: 'MONDAY', title: i18n.Calendar.Dw_1 },\n\t\t\t\t\t{ value: 'TUESDAY', title: i18n.Calendar.Dw_2 },\n\t\t\t\t\t{ value: 'WEDNESDAY', title: i18n.Calendar.Dw_3 },\n\t\t\t\t\t{ value: 'THURSDAY', title: i18n.Calendar.Dw_4 },\n\t\t\t\t\t{ value: 'FRIDAY', title: i18n.Calendar.Dw_5 },\n\t\t\t\t\t{ value: 'SATURDAY', title: i18n.Calendar.Dw_6 },\n\t\t\t\t\t{ value: 'SUNDAY', title: i18n.Calendar.Dw_7 },\n\t\t\t\t];\n\n\t\t\tdefault:\n\t\t\t\treturn [];\n\t\t}\n\t});\n};\n","<script setup lang=\"ts\">\nimport type { Props } from '@/components/schedule/schedule/components/timeSelector/types';\n\nconst props = defineProps<Props>();\n\nconst times = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\n/**\n * Варианты выбора часа от `00` до `23`.\n *\n * Поддерижвает вставку произвольного значения через `modelValue` для констант периода.\n */\nconst hourOptions = Array.from({ length: 24 }, (_, index) => ({\n\tvalue: String(index),\n\ttitle: String(index).padStart(2, '0'),\n}));\n\n/**\n * Предустановленные варианты минут.\n *\n * Поддерижвает вставку произвольного значения через `modelValue`.\n */\nconst minuteOptions = Array.from({ length: 4 }, (_, index) => {\n\tconst minute = index * 15;\n\n\treturn {\n\t\tvalue: String(minute),\n\t\ttitle: String(minute).padStart(2, '0'),\n\t};\n});\n\nconst updateTimeByIndex = (index: number, patch: Partial<Props['modelValue'][number]>) => {\n\tconst nextTimes = [...times.value];\n\tnextTimes[index] = { ...nextTimes[index], ...patch };\n\n\ttimes.value = nextTimes;\n};\n\n/**\n * Добавить временной слот.\n *\n * UX: Временной слот должен добавляться в конец списка:\n * - текущий временной слот не должен заменться новым и спускаться ниже\n * - пржений список сохраняет привычный порядок\n * - должно быть видно новый слот\n * - новый слот должно быть можно удалить\n */\nconst addTime = () => {\n\ttimes.value = [\n\t\t...times.value,\n\t\t{\n\t\t\thour: '0',\n\t\t\tminute: '0',\n\t\t},\n\t];\n};\n\nconst delTime = (index: number) => {\n\ttimes.value = times.value.filter((_, timeIndex) => timeIndex !== index);\n};\n</script>\n\n<template>\n\t<div class=\"top-scheduleTimeSelector\">\n\t\t<div v-for=\"(time, index) in times\" :key=\"index\" class=\"top-scheduleTimeSelector_item\">\n\t\t\t<TopSelect\n\t\t\t\tclass=\"top-scheduleTimeSelector_hour\"\n\t\t\t\t:modelValue=\"time.hour\"\n\t\t\t\t:options=\"hourOptions\"\n\t\t\t\tavailableCustomValue\n\t\t\t\t@update:modelValue=\"updateTimeByIndex(index, { hour: $event as Props['modelValue'][number]['hour'] })\"\n\t\t\t/>\n\n\t\t\t<TopSelect\n\t\t\t\tclass=\"top-scheduleTimeSelector_minute\"\n\t\t\t\t:modelValue=\"time.minute\"\n\t\t\t\t:options=\"minuteOptions\"\n\t\t\t\tavailableCustomValue\n\t\t\t\t@update:modelValue=\"updateTimeByIndex(index, { minute: $event as Props['modelValue'][number]['minute'] })\"\n\t\t\t/>\n\n\t\t\t<TopButton\n\t\t\t\tv-if=\"props.multipleTimes || times.length > 1\"\n\t\t\t\t@click=\"index ? delTime(index) : addTime()\"\n\t\t\t\tcolor=\"theme\"\n\t\t\t\t:icon=\"index ? '' : ''\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","<script setup lang=\"ts\">\nimport type { Props } from '@/components/schedule/schedule/components/timeSelector/types';\n\nconst props = defineProps<Props>();\n\nconst times = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\n/**\n * Варианты выбора часа от `00` до `23`.\n *\n * Поддерижвает вставку произвольного значения через `modelValue` для констант периода.\n */\nconst hourOptions = Array.from({ length: 24 }, (_, index) => ({\n\tvalue: String(index),\n\ttitle: String(index).padStart(2, '0'),\n}));\n\n/**\n * Предустановленные варианты минут.\n *\n * Поддерижвает вставку произвольного значения через `modelValue`.\n */\nconst minuteOptions = Array.from({ length: 4 }, (_, index) => {\n\tconst minute = index * 15;\n\n\treturn {\n\t\tvalue: String(minute),\n\t\ttitle: String(minute).padStart(2, '0'),\n\t};\n});\n\nconst updateTimeByIndex = (index: number, patch: Partial<Props['modelValue'][number]>) => {\n\tconst nextTimes = [...times.value];\n\tnextTimes[index] = { ...nextTimes[index], ...patch };\n\n\ttimes.value = nextTimes;\n};\n\n/**\n * Добавить временной слот.\n *\n * UX: Временной слот должен добавляться в конец списка:\n * - текущий временной слот не должен заменться новым и спускаться ниже\n * - пржений список сохраняет привычный порядок\n * - должно быть видно новый слот\n * - новый слот должно быть можно удалить\n */\nconst addTime = () => {\n\ttimes.value = [\n\t\t...times.value,\n\t\t{\n\t\t\thour: '0',\n\t\t\tminute: '0',\n\t\t},\n\t];\n};\n\nconst delTime = (index: number) => {\n\ttimes.value = times.value.filter((_, timeIndex) => timeIndex !== index);\n};\n</script>\n\n<template>\n\t<div class=\"top-scheduleTimeSelector\">\n\t\t<div v-for=\"(time, index) in times\" :key=\"index\" class=\"top-scheduleTimeSelector_item\">\n\t\t\t<TopSelect\n\t\t\t\tclass=\"top-scheduleTimeSelector_hour\"\n\t\t\t\t:modelValue=\"time.hour\"\n\t\t\t\t:options=\"hourOptions\"\n\t\t\t\tavailableCustomValue\n\t\t\t\t@update:modelValue=\"updateTimeByIndex(index, { hour: $event as Props['modelValue'][number]['hour'] })\"\n\t\t\t/>\n\n\t\t\t<TopSelect\n\t\t\t\tclass=\"top-scheduleTimeSelector_minute\"\n\t\t\t\t:modelValue=\"time.minute\"\n\t\t\t\t:options=\"minuteOptions\"\n\t\t\t\tavailableCustomValue\n\t\t\t\t@update:modelValue=\"updateTimeByIndex(index, { minute: $event as Props['modelValue'][number]['minute'] })\"\n\t\t\t/>\n\n\t\t\t<TopButton\n\t\t\t\tv-if=\"props.multipleTimes || times.length > 1\"\n\t\t\t\t@click=\"index ? delTime(index) : addTime()\"\n\t\t\t\tcolor=\"theme\"\n\t\t\t\t:icon=\"index ? '' : ''\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","<script setup lang=\"ts\">\nimport type { Props } from '@/components/schedule/schedule/components/calendar/types';\nimport { useDaysByCalendarMode } from './composables/useDaysByCalendarMode';\nimport { numberEnding } from '@/core/utils/string';\nimport { computed } from 'vue';\nimport TopScheduleTimeSelector from '@/components/schedule/schedule/components/timeSelector/timeSelector.vue';\n\nconst props = defineProps<Props>();\n\nconst selectedDays = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst times = defineModel<Props['times']>('times', {\n\trequired: true,\n});\n\nconst days = useDaysByCalendarMode(() => props.mode);\n\nconst isAllDaysSelected = computed(() => selectedDays.value.includes('ALL') || selectedDays.value.length === days.value.length);\n\nconst toggleDay = (day: Props['modelValue'][number]) => {\n\tconst nextDays = selectedDays.value.includes('ALL') ? days.value.map(item => item.value) : [...selectedDays.value];\n\tconst dayIndex = nextDays.indexOf(day);\n\n\tif (dayIndex === -1) {\n\t\tnextDays.push(day);\n\t} else {\n\t\tnextDays.splice(dayIndex, 1);\n\t}\n\n\tselectedDays.value = nextDays.length === days.value.length ? ['ALL'] : nextDays;\n};\n\nconst toggleSelectAll = () => {\n\tselectedDays.value = isAllDaysSelected.value ? [] : ['ALL'];\n};\n</script>\n\n<template>\n\t<div class=\"top-scheduleCalendar\">\n\t\t<div class=\"top-scheduleCalendar_header\">\n\t\t\t<TopScheduleTimeSelector v-model=\"times\" :multipleTimes />\n\n\t\t\t<TopButton\n\t\t\t\t@click=\"toggleSelectAll()\"\n\t\t\t\tcolor=\"theme\"\n\t\t\t\ttabindex=\"0\"\n\t\t\t>\n\t\t\t\t{{ isAllDaysSelected ? $i18n.Common.Clear : $i18n.Common.Select_all }}\n\t\t\t</TopButton>\n\t\t</div>\n\n\t\t<div class=\"top-scheduleCalendar_calendar\">\n\t\t\t<label\n\t\t\t\tclass=\"top-scheduleCalendar_calendarDay\"\n\t\t\t\tv-for=\"day in days\"\n\t\t\t\t:key=\"day.value\"\n\t\t\t>\n\t\t\t\t<input\n\t\t\t\t\tclass=\"top-scheduleCalendar_calendarDayCheckbox\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t:value=\"day.value\"\n\t\t\t\t\t:checked=\"selectedDays.includes('ALL') || selectedDays.includes(day.value)\"\n\t\t\t\t\t@change=\"toggleDay(day.value)\"\n\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t>\n\n\t\t\t\t<span :data-top-icon=\"day.isIcon ? day.title : undefined\">\n\t\t\t\t\t<template v-if=\"!day.isIcon\">\n\t\t\t\t\t\t{{ day.title }}\n\t\t\t\t\t</template>\n\t\t\t\t</span>\n\t\t\t</label>\n\t\t</div>\n\n\t\t<span\n\t\t\t:class=\"{\n\t\t\t\t'top-scheduleCalendar_selectionSummary': true,\n\t\t\t'top-error': !selectedDays.length\n\t\t\t}\"\n\t\t>\n\t\t\t<!-- Каждый день или Число проверок в неделю / месяц-->\n\t\t\t{{\n\t\t\t\tisAllDaysSelected ?\n\t\t\t\t\t$i18n.Common.Every_day :\n\t\t\t\t\tselectedDays.length\n\t\t\t}}\n\n\t\t\t<template v-if=\"times.length > 1 || !isAllDaysSelected\">\n\t\t\t\t<!-- Добавить число временных слотов, если их несколько -->\n\t\t\t\t{{ times.length > 1 ? ` × ${times.length}` : '' }}\n\n\t\t\t\t<!-- Суффикс \"раз\" -->\n\t\t\t\t{{\n\t\t\t\t\tnumberEnding(\n\t\t\t\t\t\ttimes.length === 1 ? selectedDays.length : times.length,\n\t\t\t\t\t\t$i18n.Common.time_a_0,\n\t\t\t\t\t\t$i18n.Common.time_a_0,\n\t\t\t\t\t\t$i18n.Common.time_a_2,\n\t\t\t\t\t)\n\t\t\t\t}}\n\n\t\t\t\t<!-- В неделю / месяц-->\n\t\t\t\t{{ mode === 'dayOfWeek' ? $i18n.Common.a_week : $i18n.Common.a_month }}\n\t\t\t</template>\n\t\t</span>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","<script setup lang=\"ts\">\nimport type { Props } from '@/components/schedule/schedule/components/calendar/types';\nimport { useDaysByCalendarMode } from './composables/useDaysByCalendarMode';\nimport { numberEnding } from '@/core/utils/string';\nimport { computed } from 'vue';\nimport TopScheduleTimeSelector from '@/components/schedule/schedule/components/timeSelector/timeSelector.vue';\n\nconst props = defineProps<Props>();\n\nconst selectedDays = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\nconst times = defineModel<Props['times']>('times', {\n\trequired: true,\n});\n\nconst days = useDaysByCalendarMode(() => props.mode);\n\nconst isAllDaysSelected = computed(() => selectedDays.value.includes('ALL') || selectedDays.value.length === days.value.length);\n\nconst toggleDay = (day: Props['modelValue'][number]) => {\n\tconst nextDays = selectedDays.value.includes('ALL') ? days.value.map(item => item.value) : [...selectedDays.value];\n\tconst dayIndex = nextDays.indexOf(day);\n\n\tif (dayIndex === -1) {\n\t\tnextDays.push(day);\n\t} else {\n\t\tnextDays.splice(dayIndex, 1);\n\t}\n\n\tselectedDays.value = nextDays.length === days.value.length ? ['ALL'] : nextDays;\n};\n\nconst toggleSelectAll = () => {\n\tselectedDays.value = isAllDaysSelected.value ? [] : ['ALL'];\n};\n</script>\n\n<template>\n\t<div class=\"top-scheduleCalendar\">\n\t\t<div class=\"top-scheduleCalendar_header\">\n\t\t\t<TopScheduleTimeSelector v-model=\"times\" :multipleTimes />\n\n\t\t\t<TopButton\n\t\t\t\t@click=\"toggleSelectAll()\"\n\t\t\t\tcolor=\"theme\"\n\t\t\t\ttabindex=\"0\"\n\t\t\t>\n\t\t\t\t{{ isAllDaysSelected ? $i18n.Common.Clear : $i18n.Common.Select_all }}\n\t\t\t</TopButton>\n\t\t</div>\n\n\t\t<div class=\"top-scheduleCalendar_calendar\">\n\t\t\t<label\n\t\t\t\tclass=\"top-scheduleCalendar_calendarDay\"\n\t\t\t\tv-for=\"day in days\"\n\t\t\t\t:key=\"day.value\"\n\t\t\t>\n\t\t\t\t<input\n\t\t\t\t\tclass=\"top-scheduleCalendar_calendarDayCheckbox\"\n\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t:value=\"day.value\"\n\t\t\t\t\t:checked=\"selectedDays.includes('ALL') || selectedDays.includes(day.value)\"\n\t\t\t\t\t@change=\"toggleDay(day.value)\"\n\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t>\n\n\t\t\t\t<span :data-top-icon=\"day.isIcon ? day.title : undefined\">\n\t\t\t\t\t<template v-if=\"!day.isIcon\">\n\t\t\t\t\t\t{{ day.title }}\n\t\t\t\t\t</template>\n\t\t\t\t</span>\n\t\t\t</label>\n\t\t</div>\n\n\t\t<span\n\t\t\t:class=\"{\n\t\t\t\t'top-scheduleCalendar_selectionSummary': true,\n\t\t\t'top-error': !selectedDays.length\n\t\t\t}\"\n\t\t>\n\t\t\t<!-- Каждый день или Число проверок в неделю / месяц-->\n\t\t\t{{\n\t\t\t\tisAllDaysSelected ?\n\t\t\t\t\t$i18n.Common.Every_day :\n\t\t\t\t\tselectedDays.length\n\t\t\t}}\n\n\t\t\t<template v-if=\"times.length > 1 || !isAllDaysSelected\">\n\t\t\t\t<!-- Добавить число временных слотов, если их несколько -->\n\t\t\t\t{{ times.length > 1 ? ` × ${times.length}` : '' }}\n\n\t\t\t\t<!-- Суффикс \"раз\" -->\n\t\t\t\t{{\n\t\t\t\t\tnumberEnding(\n\t\t\t\t\t\ttimes.length === 1 ? selectedDays.length : times.length,\n\t\t\t\t\t\t$i18n.Common.time_a_0,\n\t\t\t\t\t\t$i18n.Common.time_a_0,\n\t\t\t\t\t\t$i18n.Common.time_a_2,\n\t\t\t\t\t)\n\t\t\t\t}}\n\n\t\t\t\t<!-- В неделю / месяц-->\n\t\t\t\t{{ mode === 'dayOfWeek' ? $i18n.Common.a_week : $i18n.Common.a_month }}\n\t\t\t</template>\n\t\t</span>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","import type { Props as CalendarProps } from '@/components/schedule/schedule/components/calendar/types';\nimport type { Mode, Props } from './types';\nimport type { Option as TopSelectOption } from '@/components/forms/select/types';\nimport { useI18n } from '@/core/plugins/i18n';\n\n/**\n * Генерирует варианты задержки запуска после апдейта Яндекса.\n *\n * См. Апометр\n */\nexport const genAfterYandexUpdatedOptions = (): TopSelectOption[] => {\n\tconst i18n = useI18n();\n\n\treturn [\n\t\t{\n\t\t\tvalue: '0',\n\t\t\ttitle: i18n.Projects.immediately,\n\t\t},\n\t\t...Array.from({ length: 24 }, (_, index) => ({\n\t\t\tvalue: String(index + 1),\n\t\t\ttitle: i18n('Projects', 'in_hour', { hour: index + 1 }),\n\t\t})),\n\t];\n};\n\n/**\n * Проверяет, относится ли режим к календарным режимам.\n *\n * Календарный режим, это режим с выбором дней недели или месяца.\n */\nexport const isCalendarMode = (value: Mode): value is CalendarProps['mode'] => value === 'dayOfWeek' || value === 'dayOfMonth';\n\n/**\n * Определяет режим расписания по выбранным дням.\n */\nexport const getModeByDays = (days: Props['modelValue']['days'], currentMode: Mode = 'onDemand'): Mode => {\n\tif (days.includes('YANDEX_UPDATE')) return 'afterYandexUpdated';\n\tif (days.includes('CHECK_POSITIONS')) return 'afterCheck';\n\tif (days.includes('LAST_OF_MONTH') || days.some(day => /^\\d+$/.test(day))) return 'dayOfMonth';\n\n\tif (days.length) {\n\t\t// Сохраняем текущий календарный режим\n\t\tif (isCalendarMode(currentMode)) return currentMode;\n\n\t\t// Режим по умолчанию для `ALL`\n\t\treturn 'dayOfWeek';\n\t}\n\n\treturn currentMode;\n};\n","import { computed, type Ref } from 'vue';\nimport type { Option as TopSelectOption } from '@/components/forms/select/types';\nimport { useI18n } from '@/core/plugins/i18n';\nimport type { Mode, Props } from '../types';\n\nconst defaultModsGo: readonly Mode[] = ['onDemand', 'dayOfWeek', 'dayOfMonth'];\nconst defaultModsReport: readonly Mode[] = ['onDemand', 'afterCheck'];\n\n/**\n * Формирует реактивный список режимов расписания с учетом дополнительных режимов.\n */\nexport const useModeOptions = (props: Props, mode: Ref<Mode>) => {\n\tconst i18n = useI18n();\n\n\treturn computed<TopSelectOption[]>(() => {\n\t\tconst modes: Mode[] = props.type === 'go' ? [...defaultModsGo] : [...defaultModsReport];\n\n\t\tif (props.extraMods) {\n\t\t\tmodes.push(...props.extraMods);\n\t\t}\n\n\t\t// Всегда отображать выбранный режим.\n\t\tif (!modes.includes(mode.value)) modes.push(mode.value);\n\n\t\t// Словарь Dynamics нужен только потребителям режима afterCheck.\n\t\tconst titles: Record<Mode, string> = {\n\t\t\tonDemand: i18n.Projects.Settings_on_demand,\n\t\t\tdayOfWeek: i18n.Projects.Report_on_weekdays,\n\t\t\tdayOfMonth: i18n.Projects.Settings_particular_days,\n\t\t\tafterYandexUpdated: i18n.Projects.After_updates,\n\t\t\tafterCheck: modes.includes('afterCheck') ? i18n.Dynamics.Report_after_tracking_30min_1 : '',\n\t\t};\n\n\t\treturn modes.map(value => ({ value, title: titles[value] }));\n\t});\n};\n","import { watch, type Ref } from 'vue';\nimport type { Mode, Props } from '../types';\nimport { isCalendarMode } from '../utils';\n\n/**\n * Создаёт независимую копию модели расписания.\n */\nconst cloneModel = (model: Props['modelValue']): Props['modelValue'] => ({\n\tdays: [...model.days],\n\ttimes: model.times.map(time => ({ ...time })),\n});\n\n/**\n * Сохраняет дни и временные слоты модели по режимам расписания.\n */\nexport const useModelByModeCache = (model: Ref<Props['modelValue']>, mode: Ref<Mode>) => {\n\ttype TimeCacheMode = Mode | 'calendar';\n\n\tconst cache = {\n\t\t// Дни календарных режимов кэшируем отдельно.\n\t\tdaysByMode: {} as Partial<Record<Mode, Props['modelValue']['days']>>,\n\n\t\t// Временные слоты храним по режимам, используя общий ключ `calendar` для недели и месяца.\n\t\ttimesByMode: {} as Partial<Record<TimeCacheMode, Props['modelValue']['times']>>,\n\t};\n\n\t// Сохранять настройки выбранного режима\n\twatch(model, () => {\n\t\tconst modelCached = cloneModel(model.value);\n\n\t\tcache.daysByMode[mode.value] = modelCached.days;\n\t\tcache.timesByMode[isCalendarMode(mode.value) ? 'calendar' : mode.value] = modelCached.times;\n\t}, { deep: true, immediate: true });\n\n\treturn cache;\n};\n","<script setup lang=\"ts\">\nimport { ref, watch } from 'vue';\nimport TopSelect from '@/components/forms/select/select.vue';\nimport TopScheduleCalendar from '@/components/schedule/schedule/components/calendar/calendar.vue';\nimport type { Mode, Props, Slots } from './types';\nimport { genAfterYandexUpdatedOptions, getModeByDays, isCalendarMode } from './utils';\nimport { useModeOptions } from './composables/useModeOptions';\nimport { useModelByModeCache } from './composables/useModelByModeCache';\n\n/**\n * Используется для размытия нагрузка на разное время\n */\nconst randomHour = String(Math.floor(Math.random() * 7) + 1) as Props['modelValue']['times'][number]['hour'];\n\nconst props = withDefaults(defineProps<Props>(), {\n\t// Тип `go` соответствует запуску инструмента по расписанию.\n\ttype: 'go',\n});\n\ndefineSlots<Slots>();\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\n// Выбранный режим\nconst mode = ref<Mode>(getModeByDays(model.value.days));\n\n// Список режимов\nconst modeOptions = useModeOptions(props, mode);\n\nconst afterYandexUpdatedOptions = genAfterYandexUpdatedOptions();\n\n// Кэш дней по режимам и временных слотов по группам расписания.\nconst cache = useModelByModeCache(model, mode);\n\n/**\n * При смене `days` сразу проверяем доступное значение режима и обновляем его, если надо.\n *\n * @note 1 в цепочке перед `watch(mode)`, цепочки не цикличны\n */\nwatch(\n\t() => model.value.days,\n\t() => mode.value = getModeByDays(model.value.days, mode.value),\n\t{ deep: true, immediate: true },\n);\n\n/**\n * При смене режима устанавливаем соответствующие `days` и `times`.\n *\n * Для календарных режимов восстанавливаем ранее сохранённый выбор дней.\n *\n * @note 2 в цепочке после `watch(() => model.value.days)`, цепочки не цикличны\n */\nwatch(mode, (newMode, oldMode) => {\n\t// Для недели и месяца временные слоты берём из общего кэша `calendar`.\n\tconst daysCached = cache.daysByMode[newMode];\n\tconst timesCached = cache.timesByMode[isCalendarMode(newMode) ? 'calendar' : newMode];\n\n\tconst modelPath: Partial<Props['modelValue']> = {};\n\tconst modeChaged = oldMode;\n\n\tswitch (newMode) {\n\t\tcase 'onDemand':\n\t\t\tif (modeChaged || model.value.days.length) modelPath.days = [];\n\t\t\tif (modeChaged || model.value.times.length) modelPath.times = [];\n\n\t\t\tbreak;\n\t\tcase 'dayOfWeek':\n\t\tcase 'dayOfMonth': {\n\t\t\tif (modeChaged || !model.value.days.length) modelPath.days = daysCached ?? ['ALL'];\n\t\t\tif (modeChaged || !model.value.times.length) modelPath.times = timesCached?.length ? timesCached : [{ hour: randomHour, minute: '0' }];\n\n\t\t\tbreak;\n\t\t}\n\t\tcase 'afterYandexUpdated':\n\t\t\tif (modeChaged || model.value.days[0] !== 'YANDEX_UPDATE') modelPath.days = ['YANDEX_UPDATE'];\n\t\t\tif (modeChaged || !model.value.times.length) modelPath.times = timesCached?.length ? timesCached : [{ hour: '1', minute: '0' }];\n\n\t\t\tbreak;\n\t\tcase 'afterCheck':\n\t\t\tif (modeChaged || model.value.days[0] !== 'CHECK_POSITIONS') modelPath.days = ['CHECK_POSITIONS'];\n\t\t\tif (modeChaged || !model.value.times.length) modelPath.times = timesCached?.length ? timesCached : [{ hour: '0', minute: '0' }];\n\n\t\t\tbreak;\n\t}\n\n\t// Отправляем новое значение только тогда, когда хотя бы одно поле требует изменения.\n\tif (Object.keys(modelPath).length) model.value = { ...model.value, ...modelPath };\n}, { immediate: true });\n</script>\n\n<template>\n\t<div :class=\"['top-schedule', 'top-schedule-type_' + type]\">\n\t\t<div class=\"top-schedule_header\">\n\t\t\t<div class=\"top-schedule_headerTitle\">\n\t\t\t\t{{ title ?? (type === 'go' ? $i18n.Projects.Checks : $i18n.Projects.Reports) }}\n\t\t\t</div>\n\n\t\t\t<TopSelect\n\t\t\t\tclass=\"top-schedule_headerMods\"\n\t\t\t\tv-model=\"mode\"\n\t\t\t\t:options=\"modeOptions\"\n\t\t\t\tsize=\"s\"\n\t\t\t/>\n\t\t</div>\n\n\t\t<div v-if=\"mode !== 'onDemand' && (isCalendarMode(mode) || mode === 'afterYandexUpdated' || $slots.default)\" class=\"top-schedule_body\">\n\t\t\t<TopScheduleCalendar\n\t\t\t\tv-if=\"isCalendarMode(mode)\"\n\t\t\t\tv-model=\"model.days\"\n\t\t\t\tv-model:times=\"model.times\"\n\t\t\t\t:mode\n\t\t\t\t:multipleTimes\n\t\t\t/>\n\n\t\t\t<TopSelect\n\t\t\t\tv-if=\"mode === 'afterYandexUpdated' && model.times[0]\"\n\t\t\t\tclass=\"top-schedule_afterYandexUpdatedDelay\"\n\t\t\t\tv-model=\"model.times[0].hour\"\n\t\t\t\t:options=\"afterYandexUpdatedOptions\"\n\t\t\t\tsize=\"s\"\n\t\t\t/>\n\n\t\t\t<hr v-if=\"(isCalendarMode(mode) || mode === 'afterYandexUpdated') && $slots.default\">\n\n\t\t\t<slot :mode></slot>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","<script setup lang=\"ts\">\nimport { ref, watch } from 'vue';\nimport TopSelect from '@/components/forms/select/select.vue';\nimport TopScheduleCalendar from '@/components/schedule/schedule/components/calendar/calendar.vue';\nimport type { Mode, Props, Slots } from './types';\nimport { genAfterYandexUpdatedOptions, getModeByDays, isCalendarMode } from './utils';\nimport { useModeOptions } from './composables/useModeOptions';\nimport { useModelByModeCache } from './composables/useModelByModeCache';\n\n/**\n * Используется для размытия нагрузка на разное время\n */\nconst randomHour = String(Math.floor(Math.random() * 7) + 1) as Props['modelValue']['times'][number]['hour'];\n\nconst props = withDefaults(defineProps<Props>(), {\n\t// Тип `go` соответствует запуску инструмента по расписанию.\n\ttype: 'go',\n});\n\ndefineSlots<Slots>();\n\nconst model = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\n// Выбранный режим\nconst mode = ref<Mode>(getModeByDays(model.value.days));\n\n// Список режимов\nconst modeOptions = useModeOptions(props, mode);\n\nconst afterYandexUpdatedOptions = genAfterYandexUpdatedOptions();\n\n// Кэш дней по режимам и временных слотов по группам расписания.\nconst cache = useModelByModeCache(model, mode);\n\n/**\n * При смене `days` сразу проверяем доступное значение режима и обновляем его, если надо.\n *\n * @note 1 в цепочке перед `watch(mode)`, цепочки не цикличны\n */\nwatch(\n\t() => model.value.days,\n\t() => mode.value = getModeByDays(model.value.days, mode.value),\n\t{ deep: true, immediate: true },\n);\n\n/**\n * При смене режима устанавливаем соответствующие `days` и `times`.\n *\n * Для календарных режимов восстанавливаем ранее сохранённый выбор дней.\n *\n * @note 2 в цепочке после `watch(() => model.value.days)`, цепочки не цикличны\n */\nwatch(mode, (newMode, oldMode) => {\n\t// Для недели и месяца временные слоты берём из общего кэша `calendar`.\n\tconst daysCached = cache.daysByMode[newMode];\n\tconst timesCached = cache.timesByMode[isCalendarMode(newMode) ? 'calendar' : newMode];\n\n\tconst modelPath: Partial<Props['modelValue']> = {};\n\tconst modeChaged = oldMode;\n\n\tswitch (newMode) {\n\t\tcase 'onDemand':\n\t\t\tif (modeChaged || model.value.days.length) modelPath.days = [];\n\t\t\tif (modeChaged || model.value.times.length) modelPath.times = [];\n\n\t\t\tbreak;\n\t\tcase 'dayOfWeek':\n\t\tcase 'dayOfMonth': {\n\t\t\tif (modeChaged || !model.value.days.length) modelPath.days = daysCached ?? ['ALL'];\n\t\t\tif (modeChaged || !model.value.times.length) modelPath.times = timesCached?.length ? timesCached : [{ hour: randomHour, minute: '0' }];\n\n\t\t\tbreak;\n\t\t}\n\t\tcase 'afterYandexUpdated':\n\t\t\tif (modeChaged || model.value.days[0] !== 'YANDEX_UPDATE') modelPath.days = ['YANDEX_UPDATE'];\n\t\t\tif (modeChaged || !model.value.times.length) modelPath.times = timesCached?.length ? timesCached : [{ hour: '1', minute: '0' }];\n\n\t\t\tbreak;\n\t\tcase 'afterCheck':\n\t\t\tif (modeChaged || model.value.days[0] !== 'CHECK_POSITIONS') modelPath.days = ['CHECK_POSITIONS'];\n\t\t\tif (modeChaged || !model.value.times.length) modelPath.times = timesCached?.length ? timesCached : [{ hour: '0', minute: '0' }];\n\n\t\t\tbreak;\n\t}\n\n\t// Отправляем новое значение только тогда, когда хотя бы одно поле требует изменения.\n\tif (Object.keys(modelPath).length) model.value = { ...model.value, ...modelPath };\n}, { immediate: true });\n</script>\n\n<template>\n\t<div :class=\"['top-schedule', 'top-schedule-type_' + type]\">\n\t\t<div class=\"top-schedule_header\">\n\t\t\t<div class=\"top-schedule_headerTitle\">\n\t\t\t\t{{ title ?? (type === 'go' ? $i18n.Projects.Checks : $i18n.Projects.Reports) }}\n\t\t\t</div>\n\n\t\t\t<TopSelect\n\t\t\t\tclass=\"top-schedule_headerMods\"\n\t\t\t\tv-model=\"mode\"\n\t\t\t\t:options=\"modeOptions\"\n\t\t\t\tsize=\"s\"\n\t\t\t/>\n\t\t</div>\n\n\t\t<div v-if=\"mode !== 'onDemand' && (isCalendarMode(mode) || mode === 'afterYandexUpdated' || $slots.default)\" class=\"top-schedule_body\">\n\t\t\t<TopScheduleCalendar\n\t\t\t\tv-if=\"isCalendarMode(mode)\"\n\t\t\t\tv-model=\"model.days\"\n\t\t\t\tv-model:times=\"model.times\"\n\t\t\t\t:mode\n\t\t\t\t:multipleTimes\n\t\t\t/>\n\n\t\t\t<TopSelect\n\t\t\t\tv-if=\"mode === 'afterYandexUpdated' && model.times[0]\"\n\t\t\t\tclass=\"top-schedule_afterYandexUpdatedDelay\"\n\t\t\t\tv-model=\"model.times[0].hour\"\n\t\t\t\t:options=\"afterYandexUpdatedOptions\"\n\t\t\t\tsize=\"s\"\n\t\t\t/>\n\n\t\t\t<hr v-if=\"(isCalendarMode(mode) || mode === 'afterYandexUpdated') && $slots.default\">\n\n\t\t\t<slot :mode></slot>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref } from 'vue';\nimport TopInput from '@/components/forms/input/input.vue';\nimport TopButton from '@/components/forms/button/button.vue';\nimport Core from '@/core/core/core';\nimport { isEmail } from '@/core/utils/check';\nimport { useI18n } from '@/core/plugins/i18n';\nimport type { Props, Emits } from '@/components/schedule/schedule/components/emails/selector/types';\n\nconst props = withDefaults(defineProps<Props>(), {\n\temails: () => [],\n\tgetEmailSuggestions: () => [],\n});\n\nconst model = defineModel<Props['modelValue']>({ required: true });\n\nconst emit = defineEmits<Emits>();\n\nconst i18n = useI18n();\nconst $ = Core.$;\n\nconst elRootRef = ref<HTMLElement>();\nconst elInputRef = ref<InstanceType<typeof TopInput>>();\nlet elInput: HTMLInputElement | null = null;\nconst autocompleteCache: Record<string, string[]> = {};\n\n// При достижении лимита отключаем поле ввода и скрываем кнопку добавления.\nconst isLimitReached = computed(() => !!props.maxEmailsCount && props.emails.length >= props.maxEmailsCount);\n\nconst filterEmails = (emails: string[]) => emails.filter(email => !props.emails.includes(email));\n\nconst submit = (value: unknown = model.value) => {\n\tconst email = String(value).trim();\n\tif (!email) return;\n\n\tif (!isEmail(email)) {\n\t\tvoid Core.notice(i18n.Common.Enter_valid_email_notice, 'error');\n\n\t\treturn;\n\t}\n\n\temit('submit', email);\n};\n\nconst initAutocomplete = async () => {\n\tawait nextTick();\n\n\telInput = elInputRef.value?.$el.querySelector('input') ?? null;\n\tif (!elInput) return;\n\n\tif (!$?.ui?.autocomplete) {\n\t\tconsole.info('Для работы autocomplete требуется глобальная загрузка jQuery UI Autocomplete');\n\n\t\treturn;\n\t}\n\n\t$(elInput).autocomplete({\n\t\tappendTo: elRootRef.value,\n\t\tminLength: 0,\n\t\tsource: async (request: { term: string }, response: (items: Array<{ label: string, value: string }>) => void) => {\n\t\t\tconst term = request.term;\n\n\t\t\tif (!(term in autocompleteCache)) {\n\t\t\t\tautocompleteCache[term] = await props.getEmailSuggestions(term);\n\t\t\t}\n\n\t\t\tresponse(filterEmails(autocompleteCache[term]).map(email => ({\n\t\t\t\tlabel: email,\n\t\t\t\tvalue: email,\n\t\t\t})));\n\t\t},\n\t\tselect: (event: Event, ui: { item?: { value: string } }) => {\n\t\t\tif (!ui.item || !elInput) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tsubmit(ui.item.value);\n\t\t\tmodel.value = '';\n\n\t\t\t$(elInput).trigger('focus');\n\t\t},\n\t});\n\n\t$(elInput).attr('autocomplete', 'disabled');\n\t$(elInput).on('focus.scheduleEmailSelector', () => {\n\t\tif (!elInput) return;\n\n\t\t$(elInput).trigger('input');\n\t});\n};\n\nonMounted(() => {\n\tvoid initAutocomplete();\n});\n\nonBeforeUnmount(() => {\n\tif (!$?.ui?.autocomplete || !elInput) return;\n\n\t$(elInput).off('focus.scheduleEmailSelector');\n\t$(elInput).autocomplete('destroy');\n});\n</script>\n\n<template>\n\t<div\n\t\tclass=\"top-scheduleEmailSelector\"\n\t\tref=\"elRootRef\"\n\t>\n\t\t<!-- UX: Компонент не должен скраываться, это приведет к CLS -->\n\t\t<TopInput\n\t\t\tref=\"elInputRef\"\n\t\t\tv-model=\"model\"\n\t\t\t@keydown.enter.prevent=\"submit()\"\n\t\t\t:title=\"$i18n.Common.Enter_email\"\n\t\t\ttype=\"email\"\n\t\t\tsize=\"m\"\n\t\t\t:disabled=\"isLimitReached\"\n\t\t>\n\t\t\t<TopButton\n\t\t\t\tv-if=\"!isLimitReached\"\n\t\t\t\tclass=\"top-scheduleEmailSelector_submit\"\n\t\t\t\tcolor=\"theme\"\n\t\t\t\ticon=\"\"\n\t\t\t\t@click.prevent=\"submit()\"\n\t\t\t/>\n\t\t</TopInput>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref } from 'vue';\nimport TopInput from '@/components/forms/input/input.vue';\nimport TopButton from '@/components/forms/button/button.vue';\nimport Core from '@/core/core/core';\nimport { isEmail } from '@/core/utils/check';\nimport { useI18n } from '@/core/plugins/i18n';\nimport type { Props, Emits } from '@/components/schedule/schedule/components/emails/selector/types';\n\nconst props = withDefaults(defineProps<Props>(), {\n\temails: () => [],\n\tgetEmailSuggestions: () => [],\n});\n\nconst model = defineModel<Props['modelValue']>({ required: true });\n\nconst emit = defineEmits<Emits>();\n\nconst i18n = useI18n();\nconst $ = Core.$;\n\nconst elRootRef = ref<HTMLElement>();\nconst elInputRef = ref<InstanceType<typeof TopInput>>();\nlet elInput: HTMLInputElement | null = null;\nconst autocompleteCache: Record<string, string[]> = {};\n\n// При достижении лимита отключаем поле ввода и скрываем кнопку добавления.\nconst isLimitReached = computed(() => !!props.maxEmailsCount && props.emails.length >= props.maxEmailsCount);\n\nconst filterEmails = (emails: string[]) => emails.filter(email => !props.emails.includes(email));\n\nconst submit = (value: unknown = model.value) => {\n\tconst email = String(value).trim();\n\tif (!email) return;\n\n\tif (!isEmail(email)) {\n\t\tvoid Core.notice(i18n.Common.Enter_valid_email_notice, 'error');\n\n\t\treturn;\n\t}\n\n\temit('submit', email);\n};\n\nconst initAutocomplete = async () => {\n\tawait nextTick();\n\n\telInput = elInputRef.value?.$el.querySelector('input') ?? null;\n\tif (!elInput) return;\n\n\tif (!$?.ui?.autocomplete) {\n\t\tconsole.info('Для работы autocomplete требуется глобальная загрузка jQuery UI Autocomplete');\n\n\t\treturn;\n\t}\n\n\t$(elInput).autocomplete({\n\t\tappendTo: elRootRef.value,\n\t\tminLength: 0,\n\t\tsource: async (request: { term: string }, response: (items: Array<{ label: string, value: string }>) => void) => {\n\t\t\tconst term = request.term;\n\n\t\t\tif (!(term in autocompleteCache)) {\n\t\t\t\tautocompleteCache[term] = await props.getEmailSuggestions(term);\n\t\t\t}\n\n\t\t\tresponse(filterEmails(autocompleteCache[term]).map(email => ({\n\t\t\t\tlabel: email,\n\t\t\t\tvalue: email,\n\t\t\t})));\n\t\t},\n\t\tselect: (event: Event, ui: { item?: { value: string } }) => {\n\t\t\tif (!ui.item || !elInput) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tsubmit(ui.item.value);\n\t\t\tmodel.value = '';\n\n\t\t\t$(elInput).trigger('focus');\n\t\t},\n\t});\n\n\t$(elInput).attr('autocomplete', 'disabled');\n\t$(elInput).on('focus.scheduleEmailSelector', () => {\n\t\tif (!elInput) return;\n\n\t\t$(elInput).trigger('input');\n\t});\n};\n\nonMounted(() => {\n\tvoid initAutocomplete();\n});\n\nonBeforeUnmount(() => {\n\tif (!$?.ui?.autocomplete || !elInput) return;\n\n\t$(elInput).off('focus.scheduleEmailSelector');\n\t$(elInput).autocomplete('destroy');\n});\n</script>\n\n<template>\n\t<div\n\t\tclass=\"top-scheduleEmailSelector\"\n\t\tref=\"elRootRef\"\n\t>\n\t\t<!-- UX: Компонент не должен скраываться, это приведет к CLS -->\n\t\t<TopInput\n\t\t\tref=\"elInputRef\"\n\t\t\tv-model=\"model\"\n\t\t\t@keydown.enter.prevent=\"submit()\"\n\t\t\t:title=\"$i18n.Common.Enter_email\"\n\t\t\ttype=\"email\"\n\t\t\tsize=\"m\"\n\t\t\t:disabled=\"isLimitReached\"\n\t\t>\n\t\t\t<TopButton\n\t\t\t\tv-if=\"!isLimitReached\"\n\t\t\t\tclass=\"top-scheduleEmailSelector_submit\"\n\t\t\t\tcolor=\"theme\"\n\t\t\t\ticon=\"\"\n\t\t\t\t@click.prevent=\"submit()\"\n\t\t\t/>\n\t\t</TopInput>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport type { Emits, Props } from '@/components/schedule/schedule/components/emails/types';\nimport ScheduleEmailSelector from '@/components/schedule/schedule/components/emails/selector/selector.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\temails: () => [],\n\tgetEmailSuggestions: () => [],\n});\n\nconst emit = defineEmits<Emits>();\n\nconst value = ref('');\n\nconst addEmail = (email: string) => {\n\tconst preparedEmail = email.trim();\n\n\tif (!preparedEmail || props.emails.includes(preparedEmail)) {\n\t\tvalue.value = '';\n\n\t\treturn;\n\t}\n\n\temit('add:email', preparedEmail);\n\n\tvalue.value = '';\n};\n</script>\n\n<template>\n\t<div class=\"top-scheduleEmail\">\n\t\t<div class=\"top-scheduleEmail_title\">\n\t\t\t{{ $i18n.Projects.Reports_send_to_address }} E-mail:\n\t\t</div>\n\n\t\t<ScheduleEmailSelector\n\t\t\tv-model=\"value\"\n\t\t\t:emails\n\t\t\t:maxEmailsCount\n\t\t\t:getEmailSuggestions\n\t\t\t@submit=\"addEmail\"\n\t\t/>\n\n\t\t<div\n\t\t\tv-if=\"emails.length\"\n\t\t\tclass=\"top-scheduleEmail_emails\"\n\t\t>\n\t\t\t<div\n\t\t\t\tclass=\"top-scheduleEmail_emailsItem\"\n\t\t\t\tv-for=\"email in emails\"\n\t\t\t\t:key=\"email\"\n\t\t\t>\n\t\t\t\t<span class=\"top-ellipsis1\">{{ email }}</span>\n\n\t\t\t\t<TopButton\n\t\t\t\t\t@click=\"emit('remove:email', email)\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\ticon=\"\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport type { Emits, Props } from '@/components/schedule/schedule/components/emails/types';\nimport ScheduleEmailSelector from '@/components/schedule/schedule/components/emails/selector/selector.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\temails: () => [],\n\tgetEmailSuggestions: () => [],\n});\n\nconst emit = defineEmits<Emits>();\n\nconst value = ref('');\n\nconst addEmail = (email: string) => {\n\tconst preparedEmail = email.trim();\n\n\tif (!preparedEmail || props.emails.includes(preparedEmail)) {\n\t\tvalue.value = '';\n\n\t\treturn;\n\t}\n\n\temit('add:email', preparedEmail);\n\n\tvalue.value = '';\n};\n</script>\n\n<template>\n\t<div class=\"top-scheduleEmail\">\n\t\t<div class=\"top-scheduleEmail_title\">\n\t\t\t{{ $i18n.Projects.Reports_send_to_address }} E-mail:\n\t\t</div>\n\n\t\t<ScheduleEmailSelector\n\t\t\tv-model=\"value\"\n\t\t\t:emails\n\t\t\t:maxEmailsCount\n\t\t\t:getEmailSuggestions\n\t\t\t@submit=\"addEmail\"\n\t\t/>\n\n\t\t<div\n\t\t\tv-if=\"emails.length\"\n\t\t\tclass=\"top-scheduleEmail_emails\"\n\t\t>\n\t\t\t<div\n\t\t\t\tclass=\"top-scheduleEmail_emailsItem\"\n\t\t\t\tv-for=\"email in emails\"\n\t\t\t\t:key=\"email\"\n\t\t\t>\n\t\t\t\t<span class=\"top-ellipsis1\">{{ email }}</span>\n\n\t\t\t\t<TopButton\n\t\t\t\t\t@click=\"emit('remove:email', email)\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\ticon=\"\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","<script setup lang=\"ts\">\nimport type { Emits, Props } from '@/components/schedule/schedule/components/socials/types';\n\nconst props = defineProps<Props>();\ndefineEmits<Emits>();\n\ntype ReportChannelSource = Props['channels'][number]['source'];\n\nconst hasChannel = (source: ReportChannelSource) => props.channels.some(channel => channel.source === source);\n\nconst sourceIconBySource: Record<ReportChannelSource, string> = {\n\tinformer: '',\n\ttelegram: '',\n};\n</script>\n\n<template>\n\t<div class=\"top-scheduleSocials\">\n\t\t<div class=\"top-scheduleSocials_title\">\n\t\t\t{{ $i18n.Projects.Reports_send_to_address }}\n\t\t</div>\n\n\t\t<div class=\"top-scheduleSocials_channels\">\n\t\t\t<div\n\t\t\t\tclass=\"top-scheduleSocials_channel\"\n\t\t\t\tv-for=\"channel in channels\"\n\t\t\t\t:key=\"`${channel.source}-${channel.id}`\"\n\t\t\t>\n\t\t\t\t<span\n\t\t\t\t\tclass=\"top-scheduleSocials_channelIcon\"\n\t\t\t\t\t:data-top-icon=\"sourceIconBySource[channel.source]\"\n\t\t\t\t></span>\n\n\t\t\t\t<span class=\"top-scheduleSocials_channelLabel top-ellipsis1\">\n\t\t\t\t\t{{ channel.label }}\n\t\t\t\t</span>\n\n\t\t\t\t<TopButton\n\t\t\t\t\tv-if=\"channel.settingLink\"\n\t\t\t\t\tclass=\"top-scheduleSocials_channelSettings\"\n\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t:href=\"channel.settingLink\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\ticon=\"\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t></TopButton>\n\n\t\t\t\t<TopSwitcher\n\t\t\t\t\tclass=\"top-scheduleSocials_channelSwitcher\"\n\t\t\t\t\t:modelValue=\"channel.selected\"\n\t\t\t\t\t@update:modelValue=\"$emit('update:channelSelected', {\n\t\t\t\t\t\tid: channel.id,\n\t\t\t\t\t\tsource: channel.source,\n\t\t\t\t\t\tselected: $event as boolean,\n\t\t\t\t\t})\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<template\n\t\t\t\tv-for=\"connector in connectors\"\n\t\t\t\t:key=\"connector.source\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"!hasChannel(connector.source)\"\n\t\t\t\tclass=\"top-scheduleSocials_channel\"\n\t\t\t\t>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"top-scheduleSocials_channelIcon\"\n\t\t\t\t\t\t:data-top-icon=\"sourceIconBySource[connector.source]\"\n\t\t\t\t\t></span>\n\n\t\t\t\t\t<a\n\t\t\t\t\t\tclass=\"top-scheduleSocials_channelLabel top-ellipsis1\"\n\t\t\t\t\t\t:href=\"connector.connectLink\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ connector.connectLabel }}\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n","<script setup lang=\"ts\">\nimport type { Emits, Props } from '@/components/schedule/schedule/components/socials/types';\n\nconst props = defineProps<Props>();\ndefineEmits<Emits>();\n\ntype ReportChannelSource = Props['channels'][number]['source'];\n\nconst hasChannel = (source: ReportChannelSource) => props.channels.some(channel => channel.source === source);\n\nconst sourceIconBySource: Record<ReportChannelSource, string> = {\n\tinformer: '',\n\ttelegram: '',\n};\n</script>\n\n<template>\n\t<div class=\"top-scheduleSocials\">\n\t\t<div class=\"top-scheduleSocials_title\">\n\t\t\t{{ $i18n.Projects.Reports_send_to_address }}\n\t\t</div>\n\n\t\t<div class=\"top-scheduleSocials_channels\">\n\t\t\t<div\n\t\t\t\tclass=\"top-scheduleSocials_channel\"\n\t\t\t\tv-for=\"channel in channels\"\n\t\t\t\t:key=\"`${channel.source}-${channel.id}`\"\n\t\t\t>\n\t\t\t\t<span\n\t\t\t\t\tclass=\"top-scheduleSocials_channelIcon\"\n\t\t\t\t\t:data-top-icon=\"sourceIconBySource[channel.source]\"\n\t\t\t\t></span>\n\n\t\t\t\t<span class=\"top-scheduleSocials_channelLabel top-ellipsis1\">\n\t\t\t\t\t{{ channel.label }}\n\t\t\t\t</span>\n\n\t\t\t\t<TopButton\n\t\t\t\t\tv-if=\"channel.settingLink\"\n\t\t\t\t\tclass=\"top-scheduleSocials_channelSettings\"\n\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t:href=\"channel.settingLink\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\ticon=\"\"\n\t\t\t\t\tcolor=\"theme\"\n\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t></TopButton>\n\n\t\t\t\t<TopSwitcher\n\t\t\t\t\tclass=\"top-scheduleSocials_channelSwitcher\"\n\t\t\t\t\t:modelValue=\"channel.selected\"\n\t\t\t\t\t@update:modelValue=\"$emit('update:channelSelected', {\n\t\t\t\t\t\tid: channel.id,\n\t\t\t\t\t\tsource: channel.source,\n\t\t\t\t\t\tselected: $event as boolean,\n\t\t\t\t\t})\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<template\n\t\t\t\tv-for=\"connector in connectors\"\n\t\t\t\t:key=\"connector.source\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"!hasChannel(connector.source)\"\n\t\t\t\tclass=\"top-scheduleSocials_channel\"\n\t\t\t\t>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"top-scheduleSocials_channelIcon\"\n\t\t\t\t\t\t:data-top-icon=\"sourceIconBySource[connector.source]\"\n\t\t\t\t\t></span>\n\n\t\t\t\t\t<a\n\t\t\t\t\t\tclass=\"top-scheduleSocials_channelLabel top-ellipsis1\"\n\t\t\t\t\t\t:href=\"connector.connectLink\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ connector.connectLabel }}\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n@import \"./style.css\";\n</style>\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- define([`require`,`exports`,`../.chunks/forms-Ch1q0UUt.es.amd`,`../utils/system.amd`,`../utils/route.amd`,`../.chunks/store-DjQAOnrn.es.amd`,`../.chunks/popup-DA17NrM5.es.amd`,`vue`,`../require/css.amd!../assets/tabsView.css`],function(e,t,n,r,i,a,o,s){"use strict";if(c===void 0)var c=window.Vue;Object.defineProperty(t,"__esModule",{value:!0}),t.TopTabsViewMenuTitle=t.TopTabsViewMenuItem=t.TopTabsView=void 0;var l=(e,t)=>`top:${String(e)}:${t}`,u={loadLocalStorge:(e,t)=>{if(!t.$id)return;let n=l(e,t.$id);try{let r=JSON.parse(localStorage.getItem(n));typeof r==typeof t[e]&&(t[e]=r)}catch{console.warn(Error(`В localStorage[${n}] не корректный json`))}},addSaverLocalStorge:(e,t)=>{if(!t.$id)return;let n=l(e,t.$id);(0,s.watch)(()=>t[e],()=>{localStorage.setItem(n,JSON.stringify(t[e]))},{immediate:!0})}},d=new Set;addEventListener(`popstate`,e=>{d.forEach(t=>t(e))});var f=Symbol(),p=(e,t)=>{let r=(0,a.t)(f,()=>({showMenuInPopup:(0,s.computed)(()=>e.showMenuInPopup??n.O.state.isMobile),pageMod:(0,s.computed)(()=>e.pageMod),isShort:(0,s.ref)(!1),activeItemName:t,component:(0,s.ref)(void 0),scrollable:(0,s.ref)(!0)}),e.idState);if(e.isShortable){let e=`isShort`;u.loadLocalStorge(e,r),u.addSaverLocalStorge(e,r)}return r.$id&&d.add(e=>{t.value=(0,i.getHash)(r.$id)}),r},m=()=>(0,a.r)(f),h={key:1,class:`top-ellipsis`},g=(0,s.defineComponent)({__name:`menuItem`,props:{name:{},href:{},icon:{},disabled:{type:Boolean},component:{default:void 0},scrollable:{type:Boolean,default:!0}},setup(e,{slots:t}){let n=e,r=m(),a=(0,s.computed)(()=>n.name&&r.$id?(0,i.genHash)(r.$id,n.name):n.href),c=(0,s.computed)(()=>r.showMenuInPopup?o.o:a.value?`a`:`button`),l=e=>{!n.href&&a.value&&e.preventDefault(),n.name&&(r.activeItemName=n.name)};return(n,i)=>((0,s.openBlock)(),(0,s.createBlock)((0,s.resolveDynamicComponent)(c.value),{target:`_self`,class:(0,s.normalizeClass)({"top-tabsView_menuItem":!(0,s.unref)(r).showMenuInPopup,"top-active":e.name&&(0,s.unref)(r).activeItemName===e.name,"top-disabled":e.disabled,"top-spa-disabled":!0}),href:a.value,"data-top-icon":e.icon||void 0,disabled:e.disabled||void 0,onClick:l},{default:(0,s.withCtx)(()=>[(0,s.unref)(r).showMenuInPopup?(0,s.renderSlot)(n.$slots,`default`,{},void 0,void 0,0):t.default&&!(0,s.unref)(r).isShort?((0,s.openBlock)(),(0,s.createElementBlock)(`span`,h,[(0,s.renderSlot)(n.$slots,`default`)])):(0,s.createCommentVNode)(``,!0)]),_:3},8,[`class`,`href`,`data-top-icon`,`disabled`]))}}),_=e=>e?.name===`AsyncComponentWrapper`&&!e?.__asyncResolved,v=async(e,t)=>{e?.name===`AsyncComponentWrapper`&&(e?.__asyncResolved||(e.__asyncLoader(),await(0,r.sleepWhile)(()=>t()&&_(e),200)))},y={class:`top-tabsView_menuOpener`},b=[`data-top-icon`],x={class:`top-ellipsis`},S={class:`top-tabsView_menuList`},C={key:0,class:`top-tabsView_menuFooter`},w=(0,s.defineComponent)({__name:`menu`,props:(0,s.mergeModels)({isShortable:{type:Boolean},isLoading:{type:Boolean}},{isLoading:{},isLoadingModifiers:{}}),emits:[`update:isLoading`],setup(e){let t=(0,s.useModel)(e,`isLoading`),n=m(),r=(0,s.useSlots)(),a=new Map,c=()=>{if(!r.default)return;let e=r.default({}).find(e=>e.key===`_menu`);e&&l(e.children)},l=e=>{e.forEach(e=>{if(e.type.__name&&e.type.__name!==g.__name)return;if(!e.type.__name&&typeof e.children==`object`){l(e.children);return}if(!e.props?.name||e.props?.disabled)return;let t={title:(e.children.default?.()[0].children).trim(),icon:e.props.icon,component:e.props.component?(0,s.markRaw)(e.props.component):g.props.component.default,scrollable:e.props.scrollable??g.props.scrollable.default};a.set(e.props.name,t)})},u=(0,s.ref)(null),d=0;return(0,s.watch)(()=>n.activeItemName,async()=>{let e=++d;if(a.size===0&&c(),a.size===0){n.activeItemName=``;return}if(u.value=a.get(n.activeItemName)??null,!u.value&&n.$id){let e=(0,i.getHash)(n.$id);if(u.value=a.get(e)??null,u.value){n.activeItemName=e;return}}if(!u.value){n.activeItemName=a.keys().next().value;return}if(u.value.component===n.component){t.value=!1;return}n.$id&&(0,i.setHash)(n.$id,n.activeItemName,!1),t.value=!0,await v(u.value.component,()=>e===d),e===d&&(n.scrollable=u.value.scrollable,n.component=u.value.component,u.value&&!n.component&&console.warn(`Компонент вкладки ${n.activeItemName} не найден. Добавьте props.component для пункта меню ${n.activeItemName}.`))},{immediate:!0}),(t,r)=>((0,s.openBlock)(),(0,s.createElementBlock)(`div`,{class:(0,s.normalizeClass)({"top-tabsView_menu":!0,"top-tabsView_menu-inPopup_0":!(0,s.unref)(n).showMenuInPopup,"top-tabsView_menu-inPopup_1":(0,s.unref)(n).showMenuInPopup,"top-tabsView_menu-short":(0,s.unref)(n).isShort&&!(0,s.unref)(n).showMenuInPopup})},[(0,s.unref)(n).showMenuInPopup?((0,s.openBlock)(),(0,s.createBlock)((0,s.unref)(o.s),{key:0},{opener:(0,s.withCtx)(()=>[(0,s.createElementVNode)(`div`,y,[u.value?((0,s.openBlock)(),(0,s.createElementBlock)(`div`,{key:0,class:`top-tabsView_menuOpenerActiveItem`,"data-top-icon":u.value.icon},[(0,s.createElementVNode)(`span`,x,(0,s.toDisplayString)(u.value.title),1)],8,b)):(0,s.createCommentVNode)(``,!0),r[1]||=(0,s.createElementVNode)(`div`,{class:`top-tabsView_menuOpenerIcon`,"data-top-icon":``},null,-1)])]),contentList:(0,s.withCtx)(()=>[(0,s.renderSlot)(t.$slots,`default`)]),_:3})):((0,s.openBlock)(),(0,s.createElementBlock)(s.Fragment,{key:1},[(0,s.createElementVNode)(`div`,S,[(0,s.renderSlot)(t.$slots,`default`)]),e.isShortable?((0,s.openBlock)(),(0,s.createElementBlock)(`div`,C,[e.isShortable?((0,s.openBlock)(),(0,s.createBlock)(g,{key:0,icon:(0,s.unref)(n).isShort?``:``,onClick:r[0]||=e=>(0,s.unref)(n).isShort=!(0,s.unref)(n).isShort},{default:(0,s.withCtx)(()=>[(0,s.createTextVNode)((0,s.toDisplayString)((0,s.unref)(n).isShort?``:`Свернуть`),1)]),_:1},8,[`icon`])):(0,s.createCommentVNode)(``,!0)])):(0,s.createCommentVNode)(``,!0)],64))],2))}}),T=(0,s.defineComponent)({__name:`tabsView`,props:(0,s.mergeModels)({modelValue:{},pageMod:{type:Boolean},showMenuInPopup:{type:Boolean,default:void 0},isShortable:{type:Boolean,default:!1},idState:{}},{modelValue:{},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let t=e,r=p(t,(0,s.useModel)(e,`modelValue`)),a=Math.random();t.pageMod&&n.O.state.documentClassModificators.set(a,`top-hasTabsViewPageMod`),(0,s.onUnmounted)(()=>{t.pageMod&&n.O.state.documentClassModificators.delete(a),r.$id&&(0,i.delHash)(r.$id,!0)});let o=(0,s.ref)(),c=(0,s.ref)(!1);return(0,s.watch)([o,()=>r.component],()=>{c.value=_(r.component)},{immediate:!0}),(i,a)=>((0,s.openBlock)(),(0,s.createElementBlock)(`div`,{class:(0,s.normalizeClass)({"top-tabsView":!0,"top-tabsView-pageMod":t.pageMod,"top-tabsView-inPopup":(0,s.unref)(r).showMenuInPopup})},[(0,s.createVNode)(w,{isShortable:e.isShortable,isLoading:c.value,"onUpdate:isLoading":a[0]||=e=>c.value=e},{default:(0,s.withCtx)(()=>[(0,s.renderSlot)(i.$slots,`menu`)]),_:3},8,[`isShortable`,`isLoading`]),(0,s.createElementVNode)(`div`,{class:(0,s.normalizeClass)({"top-tabsView_contents":!0,"top-tabsView_contents-isLoading":c.value,"top-tabsView_contents-noScrollable":!(0,s.unref)(r).scrollable})},[c.value?((0,s.openBlock)(),(0,s.createBlock)(n.l,{key:0})):(0,s.createCommentVNode)(``,!0),((0,s.openBlock)(),(0,s.createBlock)(s.KeepAlive,null,[((0,s.openBlock)(),(0,s.createBlock)((0,s.resolveDynamicComponent)((0,s.unref)(r).component),{ref_key:`componentRef`,ref:o},null,512))],1024))],2)],2))}}),E={},D={class:`top-tabsView_menuDelimeter`};t.TopTabsViewMenuItem=g,t.TopTabsView=T;function O(e,t){return(0,s.openBlock)(),(0,s.createElementBlock)(`div`,D)}var k=(0,n.u)(E,[[`render`,O]]);t.TopTabsViewMenuTitle=(0,s.defineComponent)({__name:`menuTitle`,props:{isSubtitle:{type:Boolean}},setup(e){let t=m();return(n,r)=>(0,s.unref)(t).showMenuInPopup?((0,s.openBlock)(),(0,s.createBlock)((0,s.unref)(o.o),{key:0,type:`title`},{default:(0,s.withCtx)(()=>[(0,s.renderSlot)(n.$slots,`default`)]),_:3})):(0,s.unref)(t).isShort?((0,s.openBlock)(),(0,s.createBlock)(k,{key:1})):((0,s.openBlock)(),(0,s.createElementBlock)(`div`,{key:2,class:(0,s.normalizeClass)({"top-tabsView_menuTitle":!0,"top-tabsView_menuTitle-subtitle":e.isSubtitle})},[(0,s.renderSlot)(n.$slots,`default`)],2))}})});
1
+ define([`require`,`exports`,`../.chunks/forms-CjJD60m3.es.amd`,`../utils/system.amd`,`../utils/route.amd`,`../.chunks/store-DjQAOnrn.es.amd`,`../.chunks/popup-q1PRZblX.es.amd`,`vue`,`../require/css.amd!../assets/tabsView.css`],function(e,t,n,r,i,a,o,s){"use strict";if(c===void 0)var c=window.Vue;Object.defineProperty(t,"__esModule",{value:!0}),t.TopTabsViewMenuTitle=t.TopTabsViewMenuItem=t.TopTabsView=void 0;var l=(e,t)=>`top:${String(e)}:${t}`,u={loadLocalStorge:(e,t)=>{if(!t.$id)return;let n=l(e,t.$id);try{let r=JSON.parse(localStorage.getItem(n));typeof r==typeof t[e]&&(t[e]=r)}catch{console.warn(Error(`В localStorage[${n}] не корректный json`))}},addSaverLocalStorge:(e,t)=>{if(!t.$id)return;let n=l(e,t.$id);(0,s.watch)(()=>t[e],()=>{localStorage.setItem(n,JSON.stringify(t[e]))},{immediate:!0})}},d=new Set;addEventListener(`popstate`,e=>{d.forEach(t=>t(e))});var f=Symbol(),p=(e,t)=>{let r=(0,a.t)(f,()=>({showMenuInPopup:(0,s.computed)(()=>e.showMenuInPopup??n.O.state.isMobile),pageMod:(0,s.computed)(()=>e.pageMod),isShort:(0,s.ref)(!1),activeItemName:t,component:(0,s.ref)(void 0),scrollable:(0,s.ref)(!0)}),e.idState);if(e.isShortable){let e=`isShort`;u.loadLocalStorge(e,r),u.addSaverLocalStorge(e,r)}return r.$id&&d.add(e=>{t.value=(0,i.getHash)(r.$id)}),r},m=()=>(0,a.r)(f),h={key:1,class:`top-ellipsis`},g=(0,s.defineComponent)({__name:`menuItem`,props:{name:{},href:{},icon:{},disabled:{type:Boolean},component:{default:void 0},scrollable:{type:Boolean,default:!0}},setup(e,{slots:t}){let n=e,r=m(),a=(0,s.computed)(()=>n.name&&r.$id?(0,i.genHash)(r.$id,n.name):n.href),c=(0,s.computed)(()=>r.showMenuInPopup?o.o:a.value?`a`:`button`),l=e=>{!n.href&&a.value&&e.preventDefault(),n.name&&(r.activeItemName=n.name)};return(n,i)=>((0,s.openBlock)(),(0,s.createBlock)((0,s.resolveDynamicComponent)(c.value),{target:`_self`,class:(0,s.normalizeClass)({"top-tabsView_menuItem":!(0,s.unref)(r).showMenuInPopup,"top-active":e.name&&(0,s.unref)(r).activeItemName===e.name,"top-disabled":e.disabled,"top-spa-disabled":!0}),href:a.value,"data-top-icon":e.icon||void 0,disabled:e.disabled||void 0,onClick:l},{default:(0,s.withCtx)(()=>[(0,s.unref)(r).showMenuInPopup?(0,s.renderSlot)(n.$slots,`default`,{},void 0,void 0,0):t.default&&!(0,s.unref)(r).isShort?((0,s.openBlock)(),(0,s.createElementBlock)(`span`,h,[(0,s.renderSlot)(n.$slots,`default`)])):(0,s.createCommentVNode)(``,!0)]),_:3},8,[`class`,`href`,`data-top-icon`,`disabled`]))}}),_=e=>e?.name===`AsyncComponentWrapper`&&!e?.__asyncResolved,v=async(e,t)=>{e?.name===`AsyncComponentWrapper`&&(e?.__asyncResolved||(e.__asyncLoader(),await(0,r.sleepWhile)(()=>t()&&_(e),200)))},y={class:`top-tabsView_menuOpener`},b=[`data-top-icon`],x={class:`top-ellipsis`},S={class:`top-tabsView_menuList`},C={key:0,class:`top-tabsView_menuFooter`},w=(0,s.defineComponent)({__name:`menu`,props:(0,s.mergeModels)({isShortable:{type:Boolean},isLoading:{type:Boolean}},{isLoading:{},isLoadingModifiers:{}}),emits:[`update:isLoading`],setup(e){let t=(0,s.useModel)(e,`isLoading`),n=m(),r=(0,s.useSlots)(),a=new Map,c=()=>{if(!r.default)return;let e=r.default({}).find(e=>e.key===`_menu`);e&&l(e.children)},l=e=>{e.forEach(e=>{if(e.type.__name&&e.type.__name!==g.__name)return;if(!e.type.__name&&typeof e.children==`object`){l(e.children);return}if(!e.props?.name||e.props?.disabled)return;let t={title:(e.children.default?.()[0].children).trim(),icon:e.props.icon,component:e.props.component?(0,s.markRaw)(e.props.component):g.props.component.default,scrollable:e.props.scrollable??g.props.scrollable.default};a.set(e.props.name,t)})},u=(0,s.ref)(null),d=0;return(0,s.watch)(()=>n.activeItemName,async()=>{let e=++d;if(a.size===0&&c(),a.size===0){n.activeItemName=``;return}if(u.value=a.get(n.activeItemName)??null,!u.value&&n.$id){let e=(0,i.getHash)(n.$id);if(u.value=a.get(e)??null,u.value){n.activeItemName=e;return}}if(!u.value){n.activeItemName=a.keys().next().value;return}if(u.value.component===n.component){t.value=!1;return}n.$id&&(0,i.setHash)(n.$id,n.activeItemName,!1),t.value=!0,await v(u.value.component,()=>e===d),e===d&&(n.scrollable=u.value.scrollable,n.component=u.value.component,u.value&&!n.component&&console.warn(`Компонент вкладки ${n.activeItemName} не найден. Добавьте props.component для пункта меню ${n.activeItemName}.`))},{immediate:!0}),(t,r)=>((0,s.openBlock)(),(0,s.createElementBlock)(`div`,{class:(0,s.normalizeClass)({"top-tabsView_menu":!0,"top-tabsView_menu-inPopup_0":!(0,s.unref)(n).showMenuInPopup,"top-tabsView_menu-inPopup_1":(0,s.unref)(n).showMenuInPopup,"top-tabsView_menu-short":(0,s.unref)(n).isShort&&!(0,s.unref)(n).showMenuInPopup})},[(0,s.unref)(n).showMenuInPopup?((0,s.openBlock)(),(0,s.createBlock)((0,s.unref)(o.s),{key:0},{opener:(0,s.withCtx)(()=>[(0,s.createElementVNode)(`div`,y,[u.value?((0,s.openBlock)(),(0,s.createElementBlock)(`div`,{key:0,class:`top-tabsView_menuOpenerActiveItem`,"data-top-icon":u.value.icon},[(0,s.createElementVNode)(`span`,x,(0,s.toDisplayString)(u.value.title),1)],8,b)):(0,s.createCommentVNode)(``,!0),r[1]||=(0,s.createElementVNode)(`div`,{class:`top-tabsView_menuOpenerIcon`,"data-top-icon":``},null,-1)])]),contentList:(0,s.withCtx)(()=>[(0,s.renderSlot)(t.$slots,`default`)]),_:3})):((0,s.openBlock)(),(0,s.createElementBlock)(s.Fragment,{key:1},[(0,s.createElementVNode)(`div`,S,[(0,s.renderSlot)(t.$slots,`default`)]),e.isShortable?((0,s.openBlock)(),(0,s.createElementBlock)(`div`,C,[e.isShortable?((0,s.openBlock)(),(0,s.createBlock)(g,{key:0,icon:(0,s.unref)(n).isShort?``:``,onClick:r[0]||=e=>(0,s.unref)(n).isShort=!(0,s.unref)(n).isShort},{default:(0,s.withCtx)(()=>[(0,s.createTextVNode)((0,s.toDisplayString)((0,s.unref)(n).isShort?``:`Свернуть`),1)]),_:1},8,[`icon`])):(0,s.createCommentVNode)(``,!0)])):(0,s.createCommentVNode)(``,!0)],64))],2))}}),T=(0,s.defineComponent)({__name:`tabsView`,props:(0,s.mergeModels)({modelValue:{},pageMod:{type:Boolean},showMenuInPopup:{type:Boolean,default:void 0},isShortable:{type:Boolean,default:!1},idState:{}},{modelValue:{},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let t=e,r=p(t,(0,s.useModel)(e,`modelValue`)),a=Math.random();t.pageMod&&n.O.state.documentClassModificators.set(a,`top-hasTabsViewPageMod`),(0,s.onUnmounted)(()=>{t.pageMod&&n.O.state.documentClassModificators.delete(a),r.$id&&(0,i.delHash)(r.$id,!0)});let o=(0,s.ref)(),c=(0,s.ref)(!1);return(0,s.watch)([o,()=>r.component],()=>{c.value=_(r.component)},{immediate:!0}),(i,a)=>((0,s.openBlock)(),(0,s.createElementBlock)(`div`,{class:(0,s.normalizeClass)({"top-tabsView":!0,"top-tabsView-pageMod":t.pageMod,"top-tabsView-inPopup":(0,s.unref)(r).showMenuInPopup})},[(0,s.createVNode)(w,{isShortable:e.isShortable,isLoading:c.value,"onUpdate:isLoading":a[0]||=e=>c.value=e},{default:(0,s.withCtx)(()=>[(0,s.renderSlot)(i.$slots,`menu`)]),_:3},8,[`isShortable`,`isLoading`]),(0,s.createElementVNode)(`div`,{class:(0,s.normalizeClass)({"top-tabsView_contents":!0,"top-tabsView_contents-isLoading":c.value,"top-tabsView_contents-noScrollable":!(0,s.unref)(r).scrollable})},[c.value?((0,s.openBlock)(),(0,s.createBlock)(n.l,{key:0})):(0,s.createCommentVNode)(``,!0),((0,s.openBlock)(),(0,s.createBlock)(s.KeepAlive,null,[((0,s.openBlock)(),(0,s.createBlock)((0,s.resolveDynamicComponent)((0,s.unref)(r).component),{ref_key:`componentRef`,ref:o},null,512))],1024))],2)],2))}}),E={},D={class:`top-tabsView_menuDelimeter`};t.TopTabsViewMenuItem=g,t.TopTabsView=T;function O(e,t){return(0,s.openBlock)(),(0,s.createElementBlock)(`div`,D)}var k=(0,n.u)(E,[[`render`,O]]);t.TopTabsViewMenuTitle=(0,s.defineComponent)({__name:`menuTitle`,props:{isSubtitle:{type:Boolean}},setup(e){let t=m();return(n,r)=>(0,s.unref)(t).showMenuInPopup?((0,s.openBlock)(),(0,s.createBlock)((0,s.unref)(o.o),{key:0,type:`title`},{default:(0,s.withCtx)(()=>[(0,s.renderSlot)(n.$slots,`default`)]),_:3})):(0,s.unref)(t).isShort?((0,s.openBlock)(),(0,s.createBlock)(k,{key:1})):((0,s.openBlock)(),(0,s.createElementBlock)(`div`,{key:2,class:(0,s.normalizeClass)({"top-tabsView_menuTitle":!0,"top-tabsView_menuTitle-subtitle":e.isSubtitle})},[(0,s.renderSlot)(n.$slots,`default`)],2))}})});
2
2
  //# sourceMappingURL=tabsView.amd.js.map