disable search if no selected tags

pull/54/head
zanllp 2023-04-26 13:07:45 +08:00
parent 71d32b16ca
commit 035b2228bd
33 changed files with 65 additions and 62 deletions

2
.gitignore vendored
View File

@ -3,3 +3,5 @@ BaiduPCS-Go*
__pycache__
iib.db
tags-translate.csv
launch.sh
conf.json

View File

@ -8,8 +8,8 @@
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite App</title>
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-2373fa97.js"></script>
<link rel="stylesheet" href="/infinite_image_browsing/fe-static/assets/index-7059ac8b.css">
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-b71d8817.js"></script>
<link rel="stylesheet" href="/infinite_image_browsing/fe-static/assets/index-257c23ed.css">
</head>
<body>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
import{d as D,r as k,aW as F,a$ as G,n as N,K as U,L as V,c as n,N as o,O as s,Q as w,T as x,U as y,Y as $,aR as B,a6 as R,a8 as E}from"./index-2373fa97.js";import{u as O,b as Q,f as q,d as j,h as H,j as K,k as L,t as W,M as Y,S as J}from"./FileItem-0caab9f3.js";import{g as P}from"./db-965dc734.js";import"./index-b8c8219f.js";import"./button-bc78e5bf.js";const X={class:"hint"},Z=D({__name:"MatchedImageGrid",props:{tabIdx:null,paneIdx:null,selectedTagIds:null,id:null},setup(h){const u=h,d=k(),p=F(new G);N(()=>u.selectedTagIds,async()=>{var e;const{res:i}=p.pushAction(()=>P(u.selectedTagIds));d.value=(await i).sort((a,l)=>Date.parse(l.date)-Date.parse(a.date)),(e=m.value)==null||e.scrollToItem(0)},{immediate:!0});const m=k(),f={tabIdx:-1,target:"local",paneIdx:-1},{stackViewEl:b,multiSelectedIdxs:v}=O().toRefs(),{itemSize:g,gridItems:M}=Q(f),{showMenuIdx:c}=q(),{showGenInfo:r,imageGenInfo:I,q:C,onContextMenuClick:S}=j(f,{openNext:B}),T=async(i,e,a)=>{if(await S(i,e,a),i.key==="deleteFiles"){const l=v.value.includes(a)?v.value:[a];d.value=d.value.filter((_,t)=>!l.includes(t))}};return(i,e)=>{const a=R,l=Y,_=J;return U(),V("div",{class:"container",ref_key:"stackViewEl",ref:b},[n(_,{size:"large",spinning:!p.isIdle},{default:o(()=>[n(l,{visible:s(r),"onUpdate:visible":e[1]||(e[1]=t=>w(r)?r.value=t:null),width:"70vw","mask-closable":"",onOk:e[2]||(e[2]=t=>r.value=!1)},{cancelText:o(()=>[]),default:o(()=>[n(a,{active:"",loading:!s(C).isIdle},{default:o(()=>[x("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:e[0]||(e[0]=t=>s(H)(s(I),"copied"))},[x("div",X,y(i.$t("doubleClickToCopy")),1),$(" "+y(s(I)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),n(s(K),{ref_key:"scroller",ref:m,class:"file-list",items:d.value||[],"item-size":s(g).first,"key-field":"fullpath","item-secondary-size":s(g).second,gridItems:s(M)},{default:o(({item:t,index:z})=>[n(L,{idx:z,file:t,"show-menu-idx":s(c),"onUpdate:showMenuIdx":e[3]||(e[3]=A=>w(c)?c.value=A:null),"full-screen-preview-image-url":s(W)(t),onContextMenuClick:T},null,8,["idx","file","show-menu-idx","full-screen-preview-image-url"])]),_:1},8,["items","item-size","item-secondary-size","gridItems"])]),_:1},8,["spinning"])],512)}}});const le=E(Z,[["__scopeId","data-v-177376f3"]]);export{le as default};

View File

@ -0,0 +1 @@
import{d as D,r as k,aW as F,a$ as G,n as N,K as U,L as V,c as n,N as o,O as s,Q as w,T as x,U as h,Y as $,aR as B,a6 as R,a8 as E}from"./index-b71d8817.js";import{u as O,b as Q,f as q,d as j,h as H,j as K,k as L,t as W,M as Y,S as J}from"./FileItem-19f2123f.js";import{g as P}from"./db-a83020c3.js";import"./index-120d88ab.js";import"./button-71eab3c7.js";const X={class:"hint"},Z=D({__name:"MatchedImageGrid",props:{tabIdx:null,paneIdx:null,selectedTagIds:null,id:null},setup(y){const u=y,d=k(),p=F(new G(-1,0,-1,"throw"));N(()=>u.selectedTagIds,async()=>{var e;const{res:i}=p.pushAction(()=>P(u.selectedTagIds));d.value=(await i).sort((a,l)=>Date.parse(l.date)-Date.parse(a.date)),(e=m.value)==null||e.scrollToItem(0)},{immediate:!0});const m=k(),f={tabIdx:-1,target:"local",paneIdx:-1},{stackViewEl:b,multiSelectedIdxs:v}=O().toRefs(),{itemSize:g,gridItems:M}=Q(f),{showMenuIdx:r}=q(),{showGenInfo:c,imageGenInfo:I,q:C,onContextMenuClick:S}=j(f,{openNext:B}),T=async(i,e,a)=>{if(await S(i,e,a),i.key==="deleteFiles"){const l=v.value.includes(a)?v.value:[a];d.value=d.value.filter((_,t)=>!l.includes(t))}};return(i,e)=>{const a=R,l=Y,_=J;return U(),V("div",{class:"container",ref_key:"stackViewEl",ref:b},[n(_,{size:"large",spinning:!p.isIdle},{default:o(()=>[n(l,{visible:s(c),"onUpdate:visible":e[1]||(e[1]=t=>w(c)?c.value=t:null),width:"70vw","mask-closable":"",onOk:e[2]||(e[2]=t=>c.value=!1)},{cancelText:o(()=>[]),default:o(()=>[n(a,{active:"",loading:!s(C).isIdle},{default:o(()=>[x("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:e[0]||(e[0]=t=>s(H)(s(I),"copied"))},[x("div",X,h(i.$t("doubleClickToCopy")),1),$(" "+h(s(I)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),n(s(K),{ref_key:"scroller",ref:m,class:"file-list",items:d.value||[],"item-size":s(g).first,"key-field":"fullpath","item-secondary-size":s(g).second,gridItems:s(M)},{default:o(({item:t,index:z})=>[n(L,{idx:z,file:t,"show-menu-idx":s(r),"onUpdate:showMenuIdx":e[3]||(e[3]=A=>w(r)?r.value=A:null),"full-screen-preview-image-url":s(W)(t),onContextMenuClick:T},null,8,["idx","file","show-menu-idx","full-screen-preview-image-url"])]),_:1},8,["items","item-size","item-secondary-size","gridItems"])]),_:1},8,["spinning"])],512)}}});const le=E(Z,[["__scopeId","data-v-0becfdc7"]]);export{le as default};

View File

@ -1 +0,0 @@
.container[data-v-177376f3]{background:var(--zp-secondary-background)}.container .file-list[data-v-177376f3]{list-style:none;padding:8px;height:100%;overflow:auto;height:var(--pane-max-height);width:100%}

View File

@ -0,0 +1 @@
.container[data-v-0becfdc7]{background:var(--zp-secondary-background)}.container .file-list[data-v-0becfdc7]{list-style:none;padding:8px;height:100%;overflow:auto;height:var(--pane-max-height);width:100%}

View File

@ -1 +0,0 @@
.container[data-v-214b03ea]{height:var(--pane-max-height);overflow:auto;display:flex;flex-direction:column;align-items:stretch}.container .select[data-v-214b03ea]{padding:8px}.container .search-bar[data-v-214b03ea]{padding:8px;display:flex}.container .tag-list[data-v-214b03ea]{list-style:none;padding:0;overflow:scroll}.container .tag-list .tag[data-v-214b03ea]{border:2px solid var(--zp-secondary);color:var(--zp-primary);border-radius:999px;padding:4px 16px;margin:4px;display:inline-block;cursor:pointer}.container .tag-list .tag.selected[data-v-214b03ea]{color:var(--primary-color);border:2px solid var(--primary-color)}

1
vue/dist/assets/TagSearch-6b74845d.js vendored Normal file
View File

@ -0,0 +1 @@
import{d as B,V as T,aW as N,a$ as A,r as y,A as V,aa as $,p as D,K as o,L as l,$ as d,x as g,T as r,c as U,O as i,a2 as q,W as u,N as f,Y as p,U as x,Z as G,a4 as z,cj as F,a8 as L}from"./index-b71d8817.js";/* empty css */import{a as k,u as M}from"./db-a83020c3.js";import{B as O}from"./button-71eab3c7.js";const W={class:"container"},j={class:"search-bar"},E={class:"tag-list"},K=["onClick"],Q=B({__name:"TagSearch",props:{tabIdx:null,paneIdx:null},setup(I){const S=I,b=T(),c=N(new A(-1,0,-1,"throw")),a=y(),t=y(new Set),m=V(()=>a.value?a.value.tags.slice().sort((s,n)=>n.count-s.count):[]),C=$();D(async()=>{a.value=await k(),a.value.img_count&&a.value.expired&&_()});const _=async()=>{c.pushAction(async()=>{await M(),a.value=await k()})},w=()=>{b.openTagSearchMatchedImageGridInRight(S.tabIdx,C,Array.from(t.value))},v=s=>s.display_name?`${s.display_name} : ${s.name}`:s.name;return(s,n)=>{const h=O;return o(),l("div",W,[d("",!0),a.value?(o(),l(g,{key:1},[r("div",null,[r("div",j,[U(i(q),{conv:{value:e=>e.id,text:v},mode:"multiple",style:{width:"100%"},options:i(m),value:Array.from(t.value),placeholder:"Select tags to match images","onUpdate:value":n[0]||(n[0]=e=>t.value=new Set(e))},null,8,["conv","options","value"]),a.value.expired||!a.value.img_count?(o(),u(h,{key:0,onClick:_,loading:!c.isIdle,type:"primary"},{default:f(()=>[p(x(a.value.img_count===0?"Generate index for search image":"Update index"),1)]),_:1},8,["loading"])):(o(),u(h,{key:1,type:"primary",onClick:w,loading:!c.isIdle,disabled:!t.value.size},{default:f(()=>[p("Search ")]),_:1},8,["loading","disabled"]))])]),r("ul",E,[(o(!0),l(g,null,G(i(m),e=>(o(),l("li",{key:e.id,class:z(["tag",{selected:t.value.has(e.id)}]),onClick:R=>t.value.has(e.id)?t.value.delete(e.id):t.value.add(e.id)},[t.value.has(e.id)?(o(),u(i(F),{key:0})):d("",!0),p(" "+x(v(e)),1)],10,K))),128))])],64)):d("",!0)])}}});const P=L(Q,[["__scopeId","data-v-5ba545ae"]]);export{P as default};

View File

@ -0,0 +1 @@
.container[data-v-5ba545ae]{height:var(--pane-max-height);overflow:auto;display:flex;flex-direction:column;align-items:stretch}.container .select[data-v-5ba545ae]{padding:8px}.container .search-bar[data-v-5ba545ae]{padding:8px;display:flex}.container .tag-list[data-v-5ba545ae]{list-style:none;padding:0;overflow:scroll}.container .tag-list .tag[data-v-5ba545ae]{border:2px solid var(--zp-secondary);color:var(--zp-primary);border-radius:999px;padding:4px 16px;margin:4px;display:inline-block;cursor:pointer}.container .tag-list .tag.selected[data-v-5ba545ae]{color:var(--primary-color);border:2px solid var(--primary-color)}

View File

@ -1 +0,0 @@
import{d as w,V as T,aW as N,a$ as A,r as y,A as V,aa as $,p as D,K as o,L as l,$ as r,x as g,T as u,c as U,O as c,a2 as q,W as d,N as f,Y as p,U as x,Z as G,a4 as F,cj as L,a8 as M}from"./index-2373fa97.js";/* empty css */import{a as k,u as O}from"./db-965dc734.js";import{B as W}from"./button-bc78e5bf.js";const j={class:"container"},z={class:"search-bar"},E={class:"tag-list"},K=["onClick"],Q=w({__name:"TagSearch",props:{tabIdx:null,paneIdx:null},setup(I){const S=I,C=T(),i=N(new A),a=y(),t=y(new Set),m=V(()=>a.value?a.value.tags.slice().sort((s,n)=>n.count-s.count):[]),B=$();D(async()=>{a.value=await k(),a.value.img_count&&a.value.expired&&_()});const _=async()=>{i.pushAction(async()=>{await O(),a.value=await k()})},b=()=>{C.openTagSearchMatchedImageGridInRight(S.tabIdx,B,Array.from(t.value))},v=s=>s.display_name?`${s.display_name} : ${s.name}`:s.name;return(s,n)=>{const h=W;return o(),l("div",j,[r("",!0),a.value?(o(),l(g,{key:1},[u("div",null,[u("div",z,[U(c(q),{conv:{value:e=>e.id,text:v},mode:"multiple",style:{width:"100%"},options:c(m),value:Array.from(t.value),placeholder:"Select tags to match images","onUpdate:value":n[0]||(n[0]=e=>t.value=new Set(e))},null,8,["conv","options","value"]),a.value.expired||!a.value.img_count?(o(),d(h,{key:0,onClick:_,loading:!i.isIdle,type:"primary"},{default:f(()=>[p(x(a.value.img_count===0?"Generate index for search image":"Update index"),1)]),_:1},8,["loading"])):(o(),d(h,{key:1,type:"primary",onClick:b,loading:!i.isIdle},{default:f(()=>[p("Search")]),_:1},8,["loading"]))])]),u("ul",E,[(o(!0),l(g,null,G(c(m),e=>(o(),l("li",{key:e.id,class:F(["tag",{selected:t.value.has(e.id)}]),onClick:R=>t.value.has(e.id)?t.value.delete(e.id):t.value.add(e.id)},[t.value.has(e.id)?(o(),d(c(L),{key:0})):r("",!0),p(" "+x(v(e)),1)],10,K))),128))])],64)):r("",!0)])}}});const P=M(Q,[["__scopeId","data-v-214b03ea"]]);export{P as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{bC as a}from"./index-2373fa97.js";const n=async()=>(await a.get("/db/basic_info")).data,i=async()=>{await a.post("/db/update_image_data",{},{timeout:1/0})},o=async t=>(await a.get("/db/match_images_by_tags",{params:{tag_ids:t.join()}})).data;export{n as a,o as g,i as u};
import{bC as a}from"./index-b71d8817.js";const n=async()=>(await a.get("/db/basic_info")).data,i=async()=>{await a.post("/db/update_image_data",{},{timeout:1/0})},o=async t=>(await a.get("/db/match_images_by_tags",{params:{tag_ids:t.join()}})).data;export{n as a,o as g,i as u};

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
.container[data-v-7ecbd424]{padding:20px;background-color:var(--zp-secondary-background);height:100%;overflow:auto}.header[data-v-7ecbd424]{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.header h1[data-v-7ecbd424]{font-size:28px;font-weight:700;color:var(--zp-primary)}.last-record[data-v-7ecbd424]{margin-left:8px;font-size:14px;color:var(--zp-tertiary)}.last-record a[data-v-7ecbd424]{text-decoration:none;color:var(--zp-tertiary)}.last-record a[data-v-7ecbd424]:hover{color:var(--zp-primary)}.content[data-v-7ecbd424]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));grid-gap:20px}.quick-start[data-v-7ecbd424]{background-color:var(--zp-primary-background);border-radius:8px;box-shadow:0 1px 2px #0000001a;padding:20px}.quick-start ul[data-v-7ecbd424]{list-style:none;padding:4px}.quick-start h2[data-v-7ecbd424]{margin-top:0;margin-bottom:20px;font-size:20px;font-weight:700;color:var(--zp-primary)}.quick-start__item[data-v-7ecbd424]{margin-bottom:10px;padding:4px 8px;display:flex;align-items:center}.quick-start__item[data-v-7ecbd424]:hover{background:var(--zp-secondary-background);border-radius:4px;color:var(--primary-color);cursor:pointer}.quick-start__text[data-v-7ecbd424]{flex:1;font-size:16px}.quick-start__icon[data-v-7ecbd424]{margin-right:8px}

View File

@ -0,0 +1 @@
.container[data-v-e26d5f9e]{padding:20px;background-color:var(--zp-secondary-background);height:100%;overflow:auto}.header[data-v-e26d5f9e]{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.header h1[data-v-e26d5f9e]{font-size:28px;font-weight:700;color:var(--zp-primary)}.last-record[data-v-e26d5f9e]{margin-left:8px;font-size:14px;color:var(--zp-tertiary)}.last-record a[data-v-e26d5f9e]{text-decoration:none;color:var(--zp-tertiary)}.last-record a[data-v-e26d5f9e]:hover{color:var(--zp-primary)}.content[data-v-e26d5f9e]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));grid-gap:20px}.quick-start[data-v-e26d5f9e]{background-color:var(--zp-primary-background);border-radius:8px;box-shadow:0 1px 2px #0000001a;padding:20px}.quick-start ul[data-v-e26d5f9e]{list-style:none;padding:4px}.quick-start h2[data-v-e26d5f9e]{margin-top:0;margin-bottom:20px;font-size:20px;font-weight:700;color:var(--zp-primary)}.quick-start__item[data-v-e26d5f9e]{margin-bottom:10px;padding:4px 8px;display:flex;align-items:center}.quick-start__item[data-v-e26d5f9e]:hover{background:var(--zp-secondary-background);border-radius:4px;color:var(--primary-color);cursor:pointer}.quick-start__text[data-v-e26d5f9e]{flex:1;font-size:16px}.quick-start__icon[data-v-e26d5f9e]{margin-right:8px}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
vue/dist/assets/index-d623d990.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

4
vue/dist/index.html vendored
View File

@ -7,8 +7,8 @@
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite App</title>
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-2373fa97.js"></script>
<link rel="stylesheet" href="/infinite_image_browsing/fe-static/assets/index-7059ac8b.css">
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-b71d8817.js"></script>
<link rel="stylesheet" href="/infinite_image_browsing/fe-static/assets/index-257c23ed.css">
</head>
<body>

View File

@ -16,7 +16,7 @@ import { watch } from 'vue'
const images = ref<FileNodeInfo[]>()
const queue = reactive(new FetchQueue())
const queue = reactive(new FetchQueue(-1, 0, -1, 'throw'))
const props = defineProps<{ tabIdx: number, paneIdx: number, selectedTagIds: number[], id: string }>()
@ -81,4 +81,4 @@ const onContextMenuClickU: typeof onContextMenuClick = async (e, file, idx) => {
width: 100%;
}
}
</style>
</style>

View File

@ -8,7 +8,7 @@ import { uniqueId } from 'lodash-es'
const props = defineProps<{ tabIdx: number, paneIdx: number }>()
const global = useGlobalStore()
const queue = reactive(new FetchQueue())
const queue = reactive(new FetchQueue(-1, 0, -1, 'throw'))
const info = ref<DataBaseBasicInfo>()
const selectedId = ref(new Set<number>())
const tags = computed(() => info.value ? info.value.tags.slice().sort((a, b) => b.count - a.count) : [])
@ -42,13 +42,14 @@ const toTagDisplayName = (v: Tag) => v.display_name ? `${v.display_name} : ${v.n
<div>
<div class="search-bar">
<SearchSelect :conv="{ value: v => v.id, text: toTagDisplayName, }" mode="multiple" style="width: 100%;"
:options="tags" :value="Array.from(selectedId)" placeholder="Select tags to match images"
@update:value="v => selectedId = new Set(v)" />
:options="tags" :value="Array.from(selectedId)" placeholder="Select tags to match images"
@update:value="v => selectedId = new Set(v)" />
<AButton @click="onUpdateBtnClick" :loading="!queue.isIdle" type="primary"
v-if="info.expired || !info.img_count">
{{
info.img_count === 0 ? 'Generate index for search image' : 'Update index' }}</AButton>
<AButton v-else type="primary" @click="query" :loading="!queue.isIdle">Search</AButton>
<AButton v-else type="primary" @click="query" :loading="!queue.isIdle" :disabled="!selectedId.size">Search
</AButton>
</div>
</div>
<ul class="tag-list">
@ -101,4 +102,4 @@ const toTagDisplayName = (v: Tag) => v.display_name ? `${v.display_name} : ${v.n
}
}
</style>
</style>