diff --git a/app/resources/js/api/autopodbor.ts b/app/resources/js/api/autopodbor.ts index 067f1369..0ba79f4a 100644 --- a/app/resources/js/api/autopodbor.ts +++ b/app/resources/js/api/autopodbor.ts @@ -45,6 +45,17 @@ export interface RunDto { finished_at: string | null; created_at: string | null; competitor_id: number | null; + /** Место в общей очереди (пока прогон ждёт запуска). null — если уже идёт/завершён. */ + queue_position: number | null; + /** Текущий этап работы (пока прогон идёт): «этап stage из total: label». null — если ждёт/завершён. */ + progress: RunProgress | null; +} + +/** Этап живого прогона для показа клиенту. */ +export interface RunProgress { + stage: number; + total: number; + label: string; } export type Box = 'proposal' | 'field' | 'archived'; diff --git a/app/resources/js/views/autopodbor/screens/FieldCompetitorScreen.vue b/app/resources/js/views/autopodbor/screens/FieldCompetitorScreen.vue index 7e19e064..c6adcdb6 100644 --- a/app/resources/js/views/autopodbor/screens/FieldCompetitorScreen.vue +++ b/app/resources/js/views/autopodbor/screens/FieldCompetitorScreen.vue @@ -4,6 +4,7 @@ import { useAutopodborStore } from '../../../stores/autopodborStore'; import { autopodborErrorMessage, type FieldSourceDto, type WhereFound } from '../../../api/autopodbor'; import { REGIONS, FEDERAL_DISTRICT_NAMES } from '../../../constants/regions'; import { useOverlayDismiss } from '../../../composables/useOverlayDismiss'; +import RunCollectStatus from './RunCollectStatus.vue'; interface AutopodborNav { go: (s: string) => void; @@ -302,17 +303,17 @@ async function saveAdd() { // ——— создать проект из источника ——— // regions=[] + vsyaRf=true → «Вся РФ» (как в обычных проектах: пустой массив = вся страна). -const create = reactive({ open: false, srcIds: [] as number[], srcLabel: '', regions: [] as number[], vsyaRf: true, limit: 5, mask: 127 }); +const create = reactive({ open: false, srcIds: [] as number[], srcLabel: '', regions: [] as number[], vsyaRf: false, limit: 5, mask: 127 }); function openCreate(s: FieldSourceDto) { regQuery.value = ''; - Object.assign(create, { open: true, srcIds: [s.id], srcLabel: sourceValue(s), regions: [], vsyaRf: true, limit: 5, mask: 127 }); + Object.assign(create, { open: true, srcIds: [s.id], srcLabel: sourceValue(s), regions: [], vsyaRf: false, limit: 5, mask: 127 }); } // Групповое создание: проекты для всех выбранных источников БЕЗ проекта — одним окном. function openBulkCreate() { const ids = selWork.value.filter((s) => !s.project).map((s) => s.id); if (!ids.length) return; regQuery.value = ''; - Object.assign(create, { open: true, srcIds: ids, srcLabel: `выбрано источников: ${ids.length}`, regions: [], vsyaRf: true, limit: 5, mask: 127 }); + Object.assign(create, { open: true, srcIds: ids, srcLabel: `выбрано источников: ${ids.length}`, regions: [], vsyaRf: false, limit: 5, mask: 127 }); } function onCreateVsyaRf() { if (create.vsyaRf) create.regions = []; @@ -328,7 +329,7 @@ const regOpen = ref(false); const regFiltered = computed(() => { const q = regQuery.value.trim().toLowerCase(); const chosen = new Set(create.regions); - return regions.filter((r) => !chosen.has(r.code) && (q === '' || r.name.toLowerCase().includes(q))).slice(0, 8); + return regions.filter((r) => !chosen.has(r.code) && (q === '' || r.name.toLowerCase().includes(q))); }); function pickRegion(code: number) { if (!create.regions.includes(code)) create.regions.push(code); @@ -343,7 +344,7 @@ const setQuery = ref(''); const setOpen = ref(false); const setFiltered = computed(() => { const q = setQuery.value.trim().toLowerCase(); - return regions.filter((r) => q === '' || r.name.toLowerCase().includes(q)).slice(0, 8); + return regions.filter((r) => q === '' || r.name.toLowerCase().includes(q)); }); function pickSetRegion(code: number) { psettings.regionCode = code; @@ -712,6 +713,7 @@ defineExpose({ ctab, selected, inWork, props: props, toast, create, switchTab, t diff --git a/app/resources/js/views/autopodbor/screens/FieldWorkspaceScreen.vue b/app/resources/js/views/autopodbor/screens/FieldWorkspaceScreen.vue index a82d0107..0528c2e5 100644 --- a/app/resources/js/views/autopodbor/screens/FieldWorkspaceScreen.vue +++ b/app/resources/js/views/autopodbor/screens/FieldWorkspaceScreen.vue @@ -5,6 +5,7 @@ import { autopodborErrorMessage, type FieldCompetitorDto, type DuplicateGroupDto import { REGIONS } from '../../../constants/regions'; import { useOverlayDismiss } from '../../../composables/useOverlayDismiss'; import CompetitorElementsEditor from './CompetitorElementsEditor.vue'; +import RunCollectStatus from './RunCollectStatus.vue'; interface AutopodborNav { go: (s: string) => void; @@ -459,6 +460,7 @@ defineExpose({ competitors, selected, toggle, toggleAll, bulkProjects, openColle diff --git a/app/resources/js/views/autopodbor/screens/LoadingScreen.vue b/app/resources/js/views/autopodbor/screens/LoadingScreen.vue index 9aa72d64..2f7ace77 100644 --- a/app/resources/js/views/autopodbor/screens/LoadingScreen.vue +++ b/app/resources/js/views/autopodbor/screens/LoadingScreen.vue @@ -1,7 +1,10 @@