PageSourceSearch

https://podster.fm/build/assets/GhostCleanupView-73307d78.js

js podster.fm collected 2026-10-01 10:22:17 UTC 24,079 bytes, 6 lines download raw bytes

1import{K as W,f as y,D as X,C as B,s as Y,e as D,w as T,o as r,a as F,u as b,Z as K,b as t,c as o,j as N,q as tt,z as et,d as n,t as s,F as f,g as w,A as $,v as st,h as i,O as z}from"./app-f96b9a38.js";import{u as at}from"./useTabState-7a595df1.js";import rt from"./Layout-6142b859.js";import{_ as V}from"./Modal-046c4c5e.js";import{c as lt}from"./createLucideIcon-23d060b2.js";import{L as ot}from"./list-checks-42544f53.js";import{A as dt}from"./archive-24f1f5ec.js";import"./Sidebar-1f9c9aee.js";import"./useDarkMode-eb5341a5.js";import"./chevron-down-7de84f01.js";import"./sparkles-2d5fa576.js";import"./switch-97e49124.js";import"./dom-cadfdd7e.js";import"./description-9a269291.js";import"./use-resolve-button-type-e81962cc.js";import"./hidden-e39bbb26.js";import"./useAuthStore-bd281680.js";import"./isObject-a1be2107.js";import"./MainAuthUserMenu-64843d4c.js";import"./FavoriteIcon-d21876e3.js";import"./_plugin-vue_export-helper-c27b6911.js";import"./SettingsIcon-17514e01.js";import"./menu-6e48567b.js";import"./focus-management-dccaee5f.js";import"./use-outside-click-f54ccb8d.js";import"./ChevronLeftIcon-ff15d7a3.js";import"./CabinetMainNavMobile-cc0ad8f4.js";import"./vue-composable.esm-bundler-11aa148c.js";import"./MainNavMobileMenu-8fcb8fd4.js";import"./RecommendationIcon-375aa968.js";import"./StatsIcon-2edff3fb.js";import"./CloseIcon-82975fa5.js";import"./KnowledgebaseIcon-e039e069.js";import"./EpisodeIcon-bc94c554.js";import"./ReportBugButton-3cf539b2.js";import"./FormTextarea-aff24f0e.js";import"./FormInputLabel-5489c904.js";import"./v4-a960c1f4.js";import"./FormTextInput-85d75d75.js";import"./FormPrimaryButton-0c835555.js";import"./LoadingIcon-9ac274f8.js";import"./transition-d5d1ed5a.js";import"./micro-task-89dcd6af.js";/**
2 * @license lucide-vue-next v1.0.0 - ISC
3 *
4 * This source code is licensed under the ISC license.
5 * See the LICENSE file in the root directory of this source tree.
6 */const nt=lt("layout-dashboard",[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]]),it=t("title",null,"Очистка призраков",-1),ut=t("meta",{name:"robots",content:"noindex"},null,-1),ct={class:"mb-6 flex flex-wrap gap-2 border-b border-neutral-200 dark:border-neutral-700"},xt=["onClick"],bt={class:"mb-6"},pt=t("h5",{class:"mb-3 text-lg font-semibold text-brand-300 dark:text-neutral-100"},"Сводка",-1),_t={class:"grid grid-cols-2 gap-3 sm:grid-cols-3 md:grid-cols-5"},mt={class:"rounded-lg bg-emerald-50 p-3 text-center text-sm dark:bg-emerald-900"},ht=t("div",{class:"text-xs uppercase tracking-wide text-emerald-700 dark:text-emerald-200"},"Подтверждённых",-1),kt={class:"text-xl font-semibold text-emerald-800 dark:text-emerald-100"},gt={class:"rounded-lg bg-amber-50 p-3 text-center text-sm dark:bg-amber-900"},vt=t("div",{class:"text-xs uppercase tracking-wide text-amber-700 dark:text-amber-200"},"Неподтверждённых",-1),yt={class:"text-xl font-semibold text-amber-800 dark:text-amber-100"},ft={class:"rounded-lg bg-sky-50 p-3 text-center text-sm dark:bg-sky-900"},wt=t("div",{class:"text-xs uppercase tracking-wide text-sky-700 dark:text-sky-200"},"Слушателей",-1),Ct={class:"text-xl font-semibold text-sky-800 dark:text-sky-100"},St={class:"rounded-lg bg-violet-50 p-3 text-center text-sm dark:bg-violet-900"},$t=t("div",{class:"text-xs uppercase tracking-wide text-violet-700 dark:text-violet-200"},"Авторов",-1),Tt={class:"text-xl font-semibold text-violet-800 dark:text-violet-100"},Nt={class:"rounded-lg bg-rose-50 p-3 text-center text-sm dark:bg-rose-900"},zt=t("div",{class:"text-xs uppercase tracking-wide text-rose-700 dark:text-rose-200"},"Призраков",-1),At={class:"text-xl font-semibold text-rose-800 dark:text-rose-100"},Ft={class:"mt-2 text-xs text-neutral-500 dark:text-neutral-400"},Lt={class:"mb-8 flex flex-wrap items-center gap-3"},Ot=["disabled"],jt={class:"flex items-center gap-2 text-sm text-brand-300 dark:text-neutral-100"},Bt=t("span",null,"Размер порции:",-1),Dt=t("span",{class:"text-xs text-neutral-500 dark:text-neutral-300"}," Кнопка «Удалить порцию» в категории берёт первые N кандидатов (по правилу сортировки категории) и переводит их в корзин
6у одной операцией с бэкапом. ",-1),Vt={key:0,class:"ml-3 text-sm text-neutral-500 dark:text-neutral-300"},Rt={key:0},Mt=t("h5",{class:"mb-3 text-lg font-semibold text-brand-300 dark:text-neutral-100"},"Категории",-1),Ut={class:"mb-4 text-xs text-neutral-500 dark:text-neutral-400"},qt={class:"flex flex-wrap items-baseline gap-x-4 gap-y-1 bg-neutral-100 px-4 py-2 dark:bg-neutral-800"},Et={class:"font-semibold text-brand-300 dark:text-neutral-100"},Gt={class:"text-sm text-neutral-500 dark:text-neutral-300"},It={class:"text-xs text-neutral-400"},Jt={class:"rounded bg-neutral-200 px-1 dark:bg-neutral-600"},Zt={key:0,class:"rounded bg-emerald-100 px-2 py-0.5 text-xs text-emerald-700 dark:bg-emerald-900 dark:text-emerald-200"},Ht={key:0,class:"border-b border-neutral-200 bg-neutral-50 px-4 py-2 text-xs text-neutral-600 dark:border-neutral-600 dark:bg-neutral-800 dark:text-neutral-300"},Pt={key:1,class:"border-b border-neutral-200 px-4 py-3 dark:border-neutral-600"},Qt=t("div",{class:"mb-2 text-xs font-semibold uppercase tracking-wide text-neutral-500 dark:text-neutral-300"}," Возраст подкастов ",-1),Wt={class:"grid grid-cols-2 gap-2 text-xs sm:grid-cols-4"},Xt={class:"rounded bg-emerald-50 p-2 dark:bg-emerald-900"},Yt=t("div",{class:"text-emerald-700 dark:text-emerald-200"},"за 30 дней",-1),Kt={class:"text-base font-semibold text-emerald-800 dark:text-emerald-100"},te={class:"rounded bg-sky-50 p-2 dark:bg-sky-900"},ee=t("div",{class:"text-sky-700 dark:text-sky-200"},"30–180 дней",-1),se={class:"text-base font-semibold text-sky-800 dark:text-sky-100"},ae={class:"rounded bg-amber-50 p-2 dark:bg-amber-900"},re=t("div",{class:"text-amber-700 dark:text-amber-200"},"180–365 дней",-1),le={class:"text-base font-semibold text-amber-800 dark:text-amber-100"},oe={class:"rounded bg-rose-50 p-2 dark:bg-rose-900"},de=t("div",{class:"text-rose-700 dark:text-rose-200"},"старше года",-1),ne={class:"text-base font-semibold text-rose-800 dark:text-rose-100"},ie={key:2,class:"overflow-x-auto"},ue={class:"w-full text-sm"},ce={class:"bg-neutral-50 text-left text-xs uppercase text-neutral-500 dark:bg-neutral-700 dark:text-neutral-300"},xe={key:0,class:"w-8 px-3 py-2"},be=t("th",{class:"px-3 py-2"},"id",-1),pe=t("th",{class:"px-3 py-2"},"данные",-1),_e=t("th",{class:"px-3 py-2"},"created_at",-1),me={class:"divide-y divide-neutral-200 dark:divide-neutral-600"},he={key:0,class:"px-3 py-2"},ke=["checked","onChange"],ge={class:"px-3 py-2 font-mono text-xs"},ve={class:"px-3 py-2 text-brand-300 dark:text-neutral-100"},ye={key:0,class:"text-xs text-neutral-500 dark:text-neutral-300"},fe={key:0},we={key:1,class:"ml-2"},Ce={key:2,class:"ml-2"},Se={key:1,class:"font-medium"},$e={key:2,class:"text-xs text-neutral-500"}
6,Te={key:3,class:"mt-1 text-xs text-neutral-600 dark:text-neutral-300"},Ne={key:4,class:"mt-1 text-xs text-neutral-600 dark:text-neutral-300"},ze={key:5,class:"text-xs text-neutral-500"},Ae={class:"px-3 py-2 text-xs text-neutral-500"},Fe={key:3,class:"px-4 py-3 text-sm text-neutral-500 dark:text-neutral-300"},Le={key:4,class:"flex flex-wrap items-center gap-2 border-t border-neutral-200 bg-neutral-50 px-4 py-2 text-xs dark:border-neutral-600 dark:bg-neutral-800"},Oe=["onClick"],je=["onClick"],Be={class:"ml-auto text-neutral-400"},De=["disabled","onClick"],Ve=["disabled","title","onClick"],Re={class:"mb-10"},Me=t("h5",{class:"mb-3 text-lg font-semibold text-brand-300 dark:text-neutral-100"},"Корзина — прошлые ghost-операции",-1),Ue={key:0,class:"rounded-lg border border-dashed border-neutral-300 bg-white p-5 text-sm text-neutral-500 dark:border-neutral-600 dark:bg-neutral-700 dark:text-neutral-300"},qe={key:1,class:"overflow-hidden rounded-lg border border-neutral-200 bg-white dark:border-neutral-600 dar
6k:bg-neutral-700"},Ee={class:"w-full text-sm"},Ge=t("thead",{class:"bg-neutral-100 text-left text-xs uppercase text-neutral-500 dark:bg-neutral-800 dark:text-neutral-300"},[t("tr",null,[t("th",{class:"px-4 py-2"},"когда"),t("th",{class:"px-4 py-2"},"метка"),t("th",{class:"px-4 py-2"},"категория"),t("th",{class:"px-4 py-2 text-right"},"строк"),t("th",{class:"px-4 py-2"},"статус"),t("th",{class:"px-4 py-2 text-right"},"действия")])],-1),Ie={class:"divide-y divide-neutral-200 dark:divide-neutral-600"},Je={class:"px-4 py-2 whitespace-nowrap"},Ze={class:"px-4 py-2 whitespace-nowrap font-mono text-xs"},He={class:"px-4 py-2 text-xs"},Pe={class:"px-4 py-2 text-right"},Qe={class:"px-4 py-2"},We={key:0,class:"inline-block rounded bg-amber-100 px-2 py-0.5 text-xs font-semibold text-amber-700 dark:bg-amber-900 dark:text-amber-200"},Xe={key:1,class:"inline-block rounded bg-emerald-100 px-2 py-0.5 text-xs font-semibold text-emerald-700 dark:bg-emerald-900 dark:text-emerald-200"},Ye={class:"px-4 py-2 text-right"},Ke=["disabled","onClick"],ts={key:1,class:"text-xs text-neutral-400"},es={key:1,class:"mb-10"},ss=t("h5",{class:"mb-3 text-lg font-semibold text-brand-300 dark:text-neutral-100"},"Результат последнего действия",-1),as={key:0,class:"mb-3 rounded bg-rose-50 p-3 text-sm text-rose-700 dark:bg-rose-900 dark:text-rose-100"},rs={key:1,class:"mb-3 rounded bg-amber-50 p-3 text-sm text-amber-800 dark:bg-amber-900 dark:text-amber-100"},ls={key:2,class:"mb-3 rounded bg-emerald-50 p-3 text-sm text-emerald-800 dark:bg-emerald-900 dark:text-emerald-100"},os={key:3,class:"mb-3 rounded bg-emerald-50 p-3 text-sm text-emerald-800 dark:bg-emerald-900 dark:text-emerald-100"},ds={key:0},ns={key:4,class:"mb-3 rounded bg-emerald-50 p-3 text-sm text-emerald-800 dark:bg-emerald-900 dark:text-emerald-100"},is={class:"overflow-x-auto rounded-lg bg-neutral-900 p-4 text-xs text-neutral-100"},us={class:"text-sm text-brand-300 dark:text-neutral-100"},cs={class:"mt-2 text-sm text-brand-300 dark:text-neutral-100"},xs=t("p",{class:"mt-2 text-xs text-neutral-500 dark:text-neutral-300"},[n(" Soft-delete: проставится "),t("code",null,"deleted_at"),n(" (для ps_users) или "),t("code",null,"is_deleted=1"),n(" (для ps_programs / ps_podcasts). Откатить можно кнопкой «Восстановить» в таблице ниже. ")],-1),bs={class:"mt-6 flex justify-end gap-2"},ps=["disabled"],_s={class:"text-sm text-brand-300 dark:text-neutral-100"},ms={class:"mt-2 text-sm text-brand-300 dark:text-neutral-100"},hs=t("p",{class:"mt-2 text-xs text-neutral-500 dark:text-neutral-300"}," Сортировка: для «неподтверждённых старше 30 дней» — сначала самые старые; для остальных категорий — по убыванию id (новые сверху). Один бэкап-файл на всю порцию, восстанавливается одной кнопкой «Восстановить». ",-1),ks={class:"mt-6 flex justify-end gap-2"},gs=["disabled"],vs=t("section",{class:"mt-10 rounded-lg border border-neutral-300 bg-white p-5 text-sm text-brand-300 dark:border-neutral-600 dar
6k:bg-neutral-700 dark:text-neutral-100"},[t("h5",{class:"mb-2 text-base font-semibold"},"Что значит каждая категория"),t("ul",{class:"list-disc space-y-1 pl-5"},[t("li",null,[t("b",null,"Неподтверждённые > 30 дней"),n(" — пользователи, не подтвердившие email и старше месяца. Безопасный кандидат.")]),t("li",null,[t("b",null,"Слушатели со спам-словами"),n(" — подтверждённые юзеры без авторских подкастов, с дефолтными спам-словами в описании (word-boundary regex).")]),t("li",null,[t("b",null,"Слушатели"),n(" — то же самое, но без спам-слов. Это нормальные слушатели, не удалять.")]),t("li",null,[t("b",null,"Подкасты без активных эпизодов"),n(" — программы с is_deleted=0 без подвешенных эпизодов. Может включать только что созданные подкасты — фильтруйте по дате.")]),t("li",null,[t("b",null,"Эпизоды с битой ссылкой на аудио"),n(" — idfile указывает на отсутствующий или удалённый ps_files.")])])],-1),ua={__name:"GhostCleanupView",props:{summary:{type:Object,required:!0},backups:{type:Array,default:()=>[]}},setup(A){const R=A,k=at(["summary","results","history"],"summary"),M=[{value:"summary",label:"Сводка",icon:nt},{value:"results",label:"Результаты",icon:ot},{value:"history",label:"Корзина",icon:dt}],U=a=>{const l="inline-flex items-center gap-1.5 rounded-t-md px-4 py-2 text-sm font-medium transition-colors";return a?`${l} border-b-2 border-brand-300 text-brand-300 dark:border-neutral-100 dark:text-neutral-100`:`${l} text-neutral-500 hover:text-brand-300 dark:text-neutral-400 dark:hover:text-neutral-100`},L=W(),c=y(!1),C=y(null),u=y(null),h=y(null),_=y(null),g=y(1e3),p=X({});B(()=>{var a;return(a=L.props.flash)==null?void 0:a.ghostScanResult},a=>{if(a){C.value=a;for(const l of Object.keys(p))delete p[l];for(const l of Object.keys(a.categories??{}))p[l]=new Set}},{immediate:!0}),B(()=>{var a;return(a=L.props.flash)==null?void 0:a.ghostCleanupOutput},a=>{a&&(u.value=a)},{immediate:!0});const v=Y(()=>{var a,l;return{...R.summary,ghosts:(l=(a=C.value)==null?void 0:a.summary)==null?void 0:l.ghosts}});function q(a,l){var e;return((e=p[a])==null?void 0:e.has(l))??!1}function E(a,l,e){p[a]||(p[a]=new Set),e?p[a].add(l):p[a].delete(l)}function O(a,l,e){const x=new Set;if(e)for(const d of l.rows)x.add(d.id);p[a]=x}function S(a){var l;return((l=p[a])==null?void 0:l.size)??0}function G(){c.value||(c.value=!0,z.post("/admin/ghost-cleanup/scan",{},{preserveScroll:!0,onFinish:()=>{c.value=!1}}))}function I(a,l){S(a)!==0&&(h.value={key:a,cat:l})}function J(){if(!h.value)return;const{key:a,cat:l}=h.value,e=Array.from(p[a]??[]);h.value=null,c.value=!0,z.post("/admin/ghost-cleanup/trash",{category:a,selections:{[l.table]:e}},{preserveScroll:!0,onSuccess:()=>{p[a]=new Set},onFinish:()=>{c.value=!1}})}function Z(a,l){!l.trashable||l.count===0||(_.value={key:a,cat:l})}function H(){if(!_.value)return;const{key:a}=_.value;_.value=null,c.value=!0,z.post("/admin/ghost-cleanup/trash-batch",{category:a,batch_size:g.value},{preserveScroll:!0,onFinish:()=>{c.value=!1}})}function P(a){c.value||(c.value=!0,z.post(`/admin/ghost-cleanup/rollback/${a}`,{},{preserveScroll:!0,onFinish:()=>{c.value=!1}}))}function m(a){return typeof a!="number"?a??"—":a.toLocaleString("ru-RU")}function j(a){if(!a)return"—";const l=new Date(a);return Number.isNaN(l.getTime())?a:l.toLocaleString("ru-RU",{dateStyle:"short",timeStyle:"short"})}return(a,l)=>(r(),D(rt,{heading:"Очистка призраков"},{default:T(()=>[F(b(K),null,{default:T(()=>[it,ut]),_:1}),t("div",ct,[(r(),o(f,null,N(M,e=>t("button",{key:e.value,type:"button",class:tt(U(b(k)===e.value)),onClick:x=>k.value=e.value},[(r(),D(et(e.icon),{class:"h-4 w-4","stroke-width":2})),n(" "+s(e.label),1)],10,xt)),64))]),w(t("section",bt,[pt,t("div",_t,[t("div",mt,[ht,t("div",kt,s(m(b(v).confirmed)),1)]),t("div",gt,[vt,t("div",yt,s(m(b(v).unconfirmed)),1)]),t("div",ft,[wt,t("div",Ct,s(m(b(v).listeners)),1)]),t("div",St,[$t,t("div",Tt,s(m(b(v).authors)),1)]),t("div",Nt,[zt,t("div",At,s(m(b(v).ghosts??"—")),1)])]),t("p",Ft," В корзине пользователей: "+s(m(b(v).trashed_users))+". Сводка считается всегда; категории призраков — после нажатия «Сканировать» (полное сканирование занимает ~30 секунд). ",1)],512),[[$,b(k)==="summary"]]),w(t("section",Lt,[t("button",{type:"button",disabled:c.value,class:"rounded-lg bg-brand-300 px-5 py-2 text-sm text-white transition disabled:cursor-not-allowed disabled:opacity-60 dark:bg-neutral-600 dar
6k:text-neutral-100",onClick:G}," Сканировать ",8,Ot),t("label",jt,[Bt,w(t("input",{"onUpdate:modelValue":l[0]||(l[0]=e=>g.value=e),type:"number",min:"100",max:"10000",step:"100",class:"w-24 rounded border border-neutral-300 bg-white px-2 py-1 text-sm dark:border-neutral-500 dark:bg-neutral-800 dark:text-neutral-100"},null,512),[[st,g.value,void 0,{number:!0}]])]),Dt,c.value?(r(),o("span",Vt,"Выполняется…")):i("",!0)],512),[[$,b(k)==="summary"]]),C.value?w((r(),o("section",Rt,[Mt,t("p",Ut," Сканирование от "+s(C.value.generated_at)+". «Переместить в корзину» — soft-delete (deleted_at / is_deleted=1) с бэкапом. «Удалить навсегда» доступно только для уже отправленных в корзину строк и проходит через тот же FK-cascade-pipeline, что и spam-cleanup. ",1),(r(!0),o(f,null,N(C.value.categories,(e,x)=>(r(),o("div",{key:x,class:"mb-5 overflow-hidden rounded-lg border border-neutral-200 bg-white dark:border-neutral-600 dar
6k:bg-neutral-700"},[t("header",qt,[t("span",Et,s(e.display),1),t("span",Gt,s(m(e.count))+" строк",1),t("span",It,[n("таблица "),t("code",Jt,s(e.table),1)]),e.trashable?i("",!0):(r(),o("span",Zt," не удалять "))]),e.note?(r(),o("div",Ht,s(e.note),1)):i("",!0),e.age_breakdown?(r(),o("div",Pt,[Qt,t("div",Wt,[t("div",Xt,[Yt,t("div",Kt,s(m(e.age_breakdown.last_30d)),1)]),t("div",te,[ee,t("div",se,s(m(e.age_breakdown.d30_180)),1)]),t("div",ae,[re,t("div",le,s(m(e.age_breakdown.d180_365)),1)]),t("div",oe,[de,t("div",ne,s(m(e.age_breakdown.over_1y)),1)])])])):i("",!0),e.rows.length?(r(),o("div",ie,[t("table",ue,[t("thead",ce,[t("tr",null,[e.trashable?(r(),o("th",xe)):i("",!0),be,pe,_e])]),t("tbody",me,[(r(!0),o(f,null,N(e.rows,d=>(r(),o("tr",{key:`${e.table}-${d.id}`,class:"align-top"},[e.trashable?(r(),o("td",he,[t("input",{type:"checkbox",checked:q(x,d.id),class:"h-4 w-4",onChange:Q=>E(x,d.id,Q.target.checked)},null,40,ke)])):i("",!0),t("td",ge,s(d.id),1),t("td",ve,[d.login||d.email?(r(),o("div",ye,[d.login?(r(),o("span",fe,"login="+s(d.login),1)):i("",!0),d.email?(r(),o("span",we,s(d.email),1)):i("",!0),d.role__?(r(),o("span",Ce,"role="+s(d.role__),1)):i("",!0)])):i("",!0),d.name||d.title?(r(),o("div",Se,s(d.name||d.title),1)):i("",!0),d.slug?(r(),o("div",$e,"slug: "+s(d.slug),1)):i("",!0),d.about_preview?(r(),o("div",Te,s(d.about_preview),1)):i("",!0),d.descr_preview?(r(),o("div",Ne,s(d.descr_preview),1)):i("",!0),d.idprogram!==void 0?(r(),o("div",ze,"idprogram="+s(d.idprogram)+" idfile="+s(d.idfile),1)):i("",!0)]),t("td",Ae,s(d.created_at),1)]))),128))])])])):(r(),o("div",Fe," Совпадений нет. ")),e.trashable?(r(),o("footer",Le,[t("button",{type:"button",class:"rounded bg-neutral-200 px-2 py-0.5 text-brand-300 hover:bg-neutral-300 dark:bg-neutral-600 dar
6k:text-neutral-100 dark:hover:bg-neutral-500",onClick:d=>O(x,e,!0)}," Выделить показанные ",8,Oe),t("button",{type:"button",class:"rounded bg-neutral-200 px-2 py-0.5 text-brand-300 hover:bg-neutral-300 dark:bg-neutral-600 dark:text-neutral-100 dark:hover:bg-neutral-500",onClick:d=>O(x,e,!1)}," Снять ",8,je),t("span",Be,"выбрано "+s(S(x))+" из показанных "+s(e.rows.length),1),t("button",{type:"button",disabled:c.value||S(x)===0,class:"rounded-lg bg-amber-600 px-3 py-1 text-xs text-white disabled:opacity-50 hover:bg-amber-700",onClick:d=>I(x,e)}," Переместить в корзину ("+s(S(x))+") ",9,De),t("button",{type:"button",disabled:c.value||e.count===0,title:`Возьмёт первые ${g.value} кандидатов из категории и переместит в корзину одной операцией`,class:"rounded-lg bg-rose-600 px-3 py-1 text-xs text-white disabled:opacity-50 hover:bg-rose-700",onClick:d=>Z(x,e)}," Удалить порцию ("+s(Math.min(g.value,e.count))+") ",9,Ve)])):i("",!0)]))),128))],512)),[[$,b(k)==="results"]]):i("",!0),w(t("section",Re,[Me,A.backups.length?(r(),o("div",qe,[t("table",Ee,[Ge,t("tbody",Ie,[(r(!0),o(f,null,N(A.backups,e=>{var x;return r(),o("tr",{key:e.timestamp},[t("td",Je,s(j(e.ran_at)),1),t("td",Ze,s(e.timestamp),1),t("td",He,s(((x=e.context)==null?void 0:x.category)??"—"),1),t("td",Pe,s(e.total),1),t("td",Qe,[e.rolled_back?(r(),o("span",We," Восстановили "+s(j(e.rolled_back.rolled_back_at)),1)):(r(),o("span",Xe," В корзине "))]),t("td",Ye,[!e.rolled_back&&e.backup_exists?(r(),o("button",{key:0,type:"button",disabled:c.value,class:"rounded-lg bg-emerald-600 px-3 py-1 text-xs text-white disabled:opacity-60 hover:bg-emerald-700",onClick:d=>P(e.timestamp)}," Восстановить ",8,Ke)):(r(),o("span",ts,"—"))])])}),128))])])])):(r(),o("div",Ue," Пока ни одной soft-delete операции не было. "))],512),[[$,b(k)==="history"]]),u.value?w((r(),o("section",es,[ss,u.value.error?(r(),o("p",as,s(u.value.error),1)):u.value.note?(r(),o("p",rs,s(u.value.note),1)):u.value.action==="trash"?(r(),o("p",ls,[n(" Перемещено в корзину: "),t("b",null,s(u.value.total_affected),1),n(". Бэкап "),t("code",null,s(u.value.timestamp),1),n(". ")])):u.value.action==="trash-batch"?(r(),o("p",os,[n(" Порция «"+s(u.value.category)+"» обработана: ",1),t("b",null,s(u.value.total_affected),1),n(" строк в корзину. Бэкап "),t("code",null,s(u.value.timestamp),1),n(". "),u.value.batch_size?(r(),o("span",ds,"· batch_size="+s(u.value.batch_size),1)):i("",!0)])):u.value.action==="rollback"?(r(),o("p",ns,[n(" Восстановлено: "),t("b",null,s(u.value.total_restored),1),n(". ")])):i("",!0),t("pre",is,s(JSON.stringify(u.value,null,2)),1)],512)),[[$,b(k)==="results"]]):i("",!0),F(V,{"show-initial":h.value!==null,title:"Переместить в корзину?",onClose:l[2]||(l[2]=e=>h.value=null)},{default:T(()=>[h.value?(r(),o(f,{key:0},[t("p",us,[n(" Категория: "),t("b",null,s(h.value.cat.display),1),n(". ")]),t("p",cs,[n(" Будет переведено в корзину: "),t("b",null,s(S(h.value.key)),1),n(" строк. ")]),xs,t("div",bs,[t("button",{class:"rounded-lg bg-neutral-200 px-4 py-2 text-sm dark:bg-neutral-600 dar
6k:text-neutral-100",onClick:l[1]||(l[1]=e=>h.value=null)}," Отмена "),t("button",{class:"rounded-lg bg-amber-600 px-4 py-2 text-sm text-white disabled:opacity-50",disabled:c.value,onClick:J}," Да, в корзину ",8,ps)])],64)):i("",!0)]),_:1},8,["show-initial"]),F(V,{"show-initial":_.value!==null,title:"Удалить порцию?",onClose:l[4]||(l[4]=e=>_.value=null)},{default:T(()=>[_.value?(r(),o(f,{key:0},[t("p",_s,[n(" Категория: "),t("b",null,s(_.value.cat.display),1),n(". ")]),t("p",ms,[n(" Сервер возьмёт первые "),t("b",null,s(Math.min(g.value,_.value.cat.count)),1),n(" кандидатов из "),t("b",null,s(_.value.cat.count),1),n(" и переместит их в корзину одной операцией. ")]),hs,t("div",ks,[t("button",{class:"rounded-lg bg-neutral-200 px-4 py-2 text-sm dark:bg-neutral-600 dark:text-neutral-100",onClick:l[3]||(l[3]=e=>_.value=null)}," Отмена "),t("button",{class:"rounded-lg bg-rose-600 px-4 py-2 text-sm text-white disabled:opacity-50",disabled:c.value,onClick:H}," Да, удалить порцию ",8,gs)])],64)):i("",!0)]),_:1},8,["show-initial"]),vs]),_:1}))}};export{ua as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.