@topvisor/ui 1.5.9-pnpm.6 → 1.5.9

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.
@@ -1 +1 @@
1
- {"version":3,"file":"schedule.js","names":[],"sources":["../../src/components/schedule/schedule/compoents/calendar/composables/useDaysByCalendarMode.ts","../../src/components/schedule/schedule/compoents/timeSelector/timeSelector.vue","../../src/components/schedule/schedule/compoents/timeSelector/timeSelector.vue","../../src/components/schedule/schedule/compoents/calendar/calendar.vue","../../src/components/schedule/schedule/compoents/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/compoents/emails/selector/selector.vue","../../src/components/schedule/schedule/compoents/emails/selector/selector.vue","../../src/components/schedule/schedule/compoents/emails/emails.vue","../../src/components/schedule/schedule/compoents/emails/emails.vue","../../src/components/schedule/schedule/compoents/socials/socials.vue","../../src/components/schedule/schedule/compoents/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/compoents/timeSelector/types';\n\nconst props = defineProps<Props>();\n\nconst times = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\n/**\n * Варианты выбора часа от 00 до 23.\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\nconst addTime = () => {\n\ttimes.value = [\n\t\t{\n\t\t\thour: '0',\n\t\t\tminute: '0',\n\t\t},\n\t\t...times.value,\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\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/compoents/timeSelector/types';\n\nconst props = defineProps<Props>();\n\nconst times = defineModel<Props['modelValue']>({\n\trequired: true,\n});\n\n/**\n * Варианты выбора часа от 00 до 23.\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\nconst addTime = () => {\n\ttimes.value = [\n\t\t{\n\t\t\thour: '0',\n\t\t\tminute: '0',\n\t\t},\n\t\t...times.value,\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\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/compoents/calendar/types';\nimport { useDaysByCalendarMode } from './composables/useDaysByCalendarMode';\nimport { numberEnding } from '@/core/utils/string';\nimport { computed } from 'vue';\nimport TopScheduleTimeSelector from '@/components/schedule/schedule/compoents/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\n\t\t\t\t\tclass=\"top-scheduleCalendar_calendarDayTitle\"\n\t\t\t\t\t:data-top-icon=\"day.isIcon ? day.title : undefined\"\n\t\t\t\t>\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/compoents/calendar/types';\nimport { useDaysByCalendarMode } from './composables/useDaysByCalendarMode';\nimport { numberEnding } from '@/core/utils/string';\nimport { computed } from 'vue';\nimport TopScheduleTimeSelector from '@/components/schedule/schedule/compoents/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\n\t\t\t\t\tclass=\"top-scheduleCalendar_calendarDayTitle\"\n\t\t\t\t\t:data-top-icon=\"day.isIcon ? day.title : undefined\"\n\t\t\t\t>\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 './compoents/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\nexport const defaultMods: Mode[] = ['onDemand', 'dayOfWeek', 'dayOfMonth'];\n\n/**\n * Формирует реактивный список режимов расписания с учетом дополнительных режимов.\n */\nexport const useModeOptions = (props: Props, mode: Ref<Mode>) => {\n\tconst i18n = useI18n();\n\n\treturn computed<TopSelectOption[]>(() => {\n\t\t// Режим afterCheck доступен только для расписания отчёта.\n\t\tconst modes: Mode[] = props.type === 'report' ? [...defaultMods, 'afterCheck'] : [...defaultMods];\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 './compoents/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\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, (nextMode) => {\n\t// Для недели и месяца временные слоты берём из общего кэша `calendar`.\n\tconst daysCached = cache.daysByMode[nextMode];\n\tconst timesCached = cache.timesByMode[isCalendarMode(nextMode) ? 'calendar' : nextMode];\n\n\tswitch (nextMode) {\n\t\tcase 'onDemand':\n\t\t\tmodel.value = {\n\t\t\t\tdays: [],\n\t\t\t\ttimes: [],\n\t\t\t};\n\n\t\t\tbreak;\n\n\t\tcase 'dayOfWeek':\n\t\tcase 'dayOfMonth': {\n\t\t\tmodel.value = {\n\t\t\t\t...model.value,\n\t\t\t\tdays: daysCached ?? ['ALL'],\n\t\t\t\ttimes: timesCached?.length ? timesCached : [{ hour: randomHour, minute: '30' }],\n\t\t\t};\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 'afterYandexUpdated':\n\t\t\tmodel.value = {\n\t\t\t\tdays: ['YANDEX_UPDATE'],\n\t\t\t\ttimes: timesCached?.length ? timesCached : [{ hour: '1', minute: '0' }],\n\t\t\t};\n\n\t\t\tbreak;\n\n\t\tcase 'afterCheck':\n\t\t\tmodel.value = {\n\t\t\t\tdays: ['CHECK_POSITIONS'],\n\t\t\t\ttimes: timesCached?.length ? timesCached : [{ hour: '0', minute: '30' }],\n\t\t\t};\n\n\t\t\tbreak;\n\t}\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\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.settings)\" 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.settings\">\n\n\t\t\t<slot name=\"settings\" :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 './compoents/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\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, (nextMode) => {\n\t// Для недели и месяца временные слоты берём из общего кэша `calendar`.\n\tconst daysCached = cache.daysByMode[nextMode];\n\tconst timesCached = cache.timesByMode[isCalendarMode(nextMode) ? 'calendar' : nextMode];\n\n\tswitch (nextMode) {\n\t\tcase 'onDemand':\n\t\t\tmodel.value = {\n\t\t\t\tdays: [],\n\t\t\t\ttimes: [],\n\t\t\t};\n\n\t\t\tbreak;\n\n\t\tcase 'dayOfWeek':\n\t\tcase 'dayOfMonth': {\n\t\t\tmodel.value = {\n\t\t\t\t...model.value,\n\t\t\t\tdays: daysCached ?? ['ALL'],\n\t\t\t\ttimes: timesCached?.length ? timesCached : [{ hour: randomHour, minute: '30' }],\n\t\t\t};\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 'afterYandexUpdated':\n\t\t\tmodel.value = {\n\t\t\t\tdays: ['YANDEX_UPDATE'],\n\t\t\t\ttimes: timesCached?.length ? timesCached : [{ hour: '1', minute: '0' }],\n\t\t\t};\n\n\t\t\tbreak;\n\n\t\tcase 'afterCheck':\n\t\t\tmodel.value = {\n\t\t\t\tdays: ['CHECK_POSITIONS'],\n\t\t\t\ttimes: timesCached?.length ? timesCached : [{ hour: '0', minute: '30' }],\n\t\t\t};\n\n\t\t\tbreak;\n\t}\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\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.settings)\" 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.settings\">\n\n\t\t\t<slot name=\"settings\" :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 { 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/compoents/emails/selector/types';\n\nconst props = withDefaults(defineProps<Props>(), {\n\temails: () => [],\n\tgetEmailSuggestions: () => [],\n});\n\nconst emit = defineEmits<Emits>();\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\nconst filterEmails = (emails: string[]) => emails.filter(email => !props.emails.includes(email));\n\nconst submit = (value: unknown = props.modelValue) => {\n\tconst email = String(value).trim();\n\tif (!email) return;\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\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\temit('update:modelValue', '');\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<TopInput\n\t\t\tref=\"elInputRef\"\n\t\t\t:modelValue\n\t\t\t@update:modelValue=\"$emit('update:modelValue', $event)\"\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=\"l\"\n\t\t>\n\t\t\t<TopButton\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 { 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/compoents/emails/selector/types';\n\nconst props = withDefaults(defineProps<Props>(), {\n\temails: () => [],\n\tgetEmailSuggestions: () => [],\n});\n\nconst emit = defineEmits<Emits>();\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\nconst filterEmails = (emails: string[]) => emails.filter(email => !props.emails.includes(email));\n\nconst submit = (value: unknown = props.modelValue) => {\n\tconst email = String(value).trim();\n\tif (!email) return;\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\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\temit('update:modelValue', '');\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<TopInput\n\t\t\tref=\"elInputRef\"\n\t\t\t:modelValue\n\t\t\t@update:modelValue=\"$emit('update:modelValue', $event)\"\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=\"l\"\n\t\t>\n\t\t\t<TopButton\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 { Props, Emits } from '@/components/schedule/schedule/compoents/emails/types';\nimport ScheduleEmailSelector from '@/components/schedule/schedule/compoents/emails/selector/selector.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\temails: () => [],\n\tgetEmailSuggestions: () => [],\n\tmaxEmailsCount: -1,\n});\n\nconst emit = defineEmits<Emits>();\n\nconst value = ref('');\n\nconst addEmail = (email: string) => {\n\tconst preparedEmail = email.trim();\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-if=\"!(maxEmailsCount && emails.length === maxEmailsCount)\"\n\t\t\tv-model=\"value\"\n\t\t\t:getEmailSuggestions\n\t\t\t:emails\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 { Props, Emits } from '@/components/schedule/schedule/compoents/emails/types';\nimport ScheduleEmailSelector from '@/components/schedule/schedule/compoents/emails/selector/selector.vue';\n\nconst props = withDefaults(defineProps<Props>(), {\n\temails: () => [],\n\tgetEmailSuggestions: () => [],\n\tmaxEmailsCount: -1,\n});\n\nconst emit = defineEmits<Emits>();\n\nconst value = ref('');\n\nconst addEmail = (email: string) => {\n\tconst preparedEmail = email.trim();\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-if=\"!(maxEmailsCount && emails.length === maxEmailsCount)\"\n\t\t\tv-model=\"value\"\n\t\t\t:getEmailSuggestions\n\t\t\t:emails\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/compoents/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/compoents/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,9 +1,13 @@
1
1
  import { Props as EmailsProps } from '../types';
2
2
  export interface Props {
3
3
  modelValue: string;
4
- emails?: string[];
5
4
  /**
6
- * Получение поисковых подсказок при вводе Email
5
+ * Уже добавленные email.
6
+ */
7
+ emails: string[];
8
+ maxEmailsCount?: number;
9
+ /**
10
+ * Получение поисковых подсказок при вводе Email.
7
11
  */
8
12
  getEmailSuggestions?: EmailsProps['getEmailSuggestions'];
9
13
  }
@@ -1,7 +1,6 @@
1
1
  import { Ref, ComputedRef } from 'vue';
2
2
  import { Option as TopSelectOption } from '../../../forms/select/types';
3
3
  import { Mode, Props } from '../types';
4
- export declare const defaultMods: Mode[];
5
4
  /**
6
5
  * Формирует реактивный список режимов расписания с учетом дополнительных режимов.
7
6
  */
@@ -0,0 +1,5 @@
1
+ import { Story } from '../../schedule.stories';
2
+ /**
3
+ * Проверяет выбор расписания и восстановление настроек после ручного режима.
4
+ */
5
+ export declare const playSchedule: NonNullable<Story['play']>;
@@ -1,5 +1,5 @@
1
- import { Props as CalendarProps } from './compoents/calendar/types';
2
- import { Props as TimeSelectorProps } from './compoents/timeSelector/types';
1
+ import { Props as CalendarProps } from './components/calendar/types';
2
+ import { Props as TimeSelectorProps } from './components/timeSelector/types';
3
3
  import { components as TypeMethodComponents } from 'topvisor-openapi/src/ts/Schedule_2/Types/TypeMethod';
4
4
  /**
5
5
  * Режим вывода календаря
@@ -47,7 +47,7 @@ export interface Slots {
47
47
  *
48
48
  * Для разделения секция используйте `<hr>`
49
49
  */
50
- settings?(props: {
50
+ default?(props: {
51
51
  mode: Mode;
52
52
  }): any;
53
53
  }
@@ -1,4 +1,4 @@
1
- import { Props as CalendarProps } from './compoents/calendar/types';
1
+ import { Props as CalendarProps } from './components/calendar/types';
2
2
  import { Mode, Props } from './types';
3
3
  import { Option as TopSelectOption } from '../../forms/select/types';
4
4
  /**
@@ -1,3 +1,3 @@
1
1
  export { default as TopSchedule } from './schedule/schedule.vue';
2
- export { default as TopScheduleEmails } from './schedule/compoents/emails/emails.vue';
3
- export { default as TopScheduleSocials } from './schedule/compoents/socials/socials.vue';
2
+ export { default as TopScheduleEmails } from './schedule/components/emails/emails.vue';
3
+ export { default as TopScheduleSocials } from './schedule/components/socials/socials.vue';