Merge pull request #731 from zanllp/feature/custom-tag-color

Add support for custom tag colors
pull/732/head
zanllp 2024-09-28 20:36:34 +08:00 committed by GitHub
commit 9370eb31b0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
51 changed files with 246 additions and 104 deletions

View File

@ -13,7 +13,7 @@ Promise.resolve().then(async () => {
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Infinite Image Browsing</title>
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-a0a34372.js"></script>
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-ee40c384.js"></script>
<link rel="stylesheet" href="/infinite_image_browsing/fe-static/assets/index-c05ac913.css">
</head>

View File

@ -939,6 +939,25 @@ def infinite_image_browsing_api(app: FastAPI, **kwargs):
async def get_img_tags(req: PathsReq):
conn = DataBase.get_conn()
return ImageTag.batch_get_tags_by_path(conn, req.paths)
# update tag
class UpdateTagReq(BaseModel):
id: int
color: str
@app.post(
db_api_base + "/update_tag",
dependencies=[Depends(verify_secret), Depends(write_permission_required)],
)
async def update_tag(req: UpdateTagReq):
conn = DataBase.get_conn()
tag = Tag.get(conn, req.id)
if tag:
tag.color = req.color
tag.save(conn)
conn.commit()
class ToggleCustomTagToImgReq(BaseModel):
img_path: str

View File

@ -257,19 +257,20 @@ class Image:
class Tag:
def __init__(self, name: str, score: int, type: str, count=0):
def __init__(self, name: str, score: int, type: str, count=0, color = ""):
self.name = name
self.score = score
self.type = type
self.count = count
self.id = None
self.color = color
self.display_name = tags_translate.get(name)
def save(self, conn):
with closing(conn.cursor()) as cur:
cur.execute(
"INSERT OR REPLACE INTO tag (id, name, score, type, count) VALUES (?, ?, ?, ?, ?)",
(self.id, self.name, self.score, self.type, self.count),
"INSERT OR REPLACE INTO tag (id, name, score, type, count, color) VALUES (?, ?, ?, ?, ?, ?)",
(self.id, self.name, self.score, self.type, self.count, self.color),
)
self.id = cur.lastrowid
@ -326,7 +327,7 @@ class Tag:
@classmethod
def from_row(cls, row: tuple):
tag = cls(name=row[1], score=row[2], type=row[3], count=row[4])
tag = cls(name=row[1], score=row[2], type=row[3], count=row[4], color=row[5])
tag.id = row[0]
return tag
@ -350,6 +351,13 @@ class Tag:
VALUES ("like", 0, "custom", 0);
"""
)
try:
cur.execute(
"""ALTER TABLE tag
ADD COLUMN color TEXT DEFAULT ''"""
)
except sqlite3.OperationalError as e:
pass
class ImageTag:

3
vue/dist/assets/FileItem-a74cdf88.js 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

View File

@ -1 +1 @@
import{d as a,S as t,T as s,c as n,cx as _,Z as o}from"./index-a0a34372.js";const c={class:"img-sli-container"},i=a({__name:"ImgSliPagePane",props:{paneIdx:{},tabIdx:{},left:{},right:{}},setup(l){return(e,r)=>(t(),s("div",c,[n(_,{left:e.left,right:e.right},null,8,["left","right"])]))}});const d=o(i,[["__scopeId","data-v-ae3fb9a8"]]);export{d as default};
import{d as a,S as t,T as s,c as n,cV as _,Z as o}from"./index-ee40c384.js";const c={class:"img-sli-container"},i=a({__name:"ImgSliPagePane",props:{paneIdx:{},tabIdx:{},left:{},right:{}},setup(l){return(e,r)=>(t(),s("div",c,[n(_,{left:e.left,right:e.right},null,8,["left","right"])]))}});const d=o(i,[["__scopeId","data-v-ae3fb9a8"]]);export{d as default};

View File

@ -0,0 +1 @@
import{d as ce,m as F,ax as re,$ as pe,S as p,T as I,c as s,a2 as e,a1 as n,a4 as R,U as d,J as ue,W as o,V as m,a0 as V,ad as me,Y as k,ae as z,ag as ge,R as fe,ai as G,aN as ve,aO as he,bz as Ie,Z as ke}from"./index-ee40c384.js";import{S as _e}from"./index-a8f6d7d9.js";import{L as Ce,R as we,f as Se,M as be}from"./MultiSelectKeep-28b76528.js";import{c as xe,d as ye,F as Me}from"./FileItem-a74cdf88.js";import{c as Ae,u as Te}from"./hook-50aaef2c.js";import{a as $e}from"./functionalCallableComp-cec4e075.js";import"./shortcut-a1deafe7.js";import"./index-fc1e034d.js";/* empty css */import"./index-920e6a91.js";import"./_isIterateeCall-ae159f74.js";const De=c=>(ve("data-v-caebce58"),c=c(),he(),c),Fe={class:"hint"},Re={class:"action-bar"},Ve=De(()=>d("div",{style:{padding:"16px 0 512px"}},null,-1)),ze={key:1},Ge={class:"no-res-hint"},Be={class:"hint"},Ne={key:2,class:"preview-switch"},Ue=ce({__name:"MatchedImageGrid",props:{tabIdx:{},paneIdx:{},selectedTagIds:{},id:{}},setup(c){const g=c,f=Ae(t=>Ie(g.selectedTagIds,t)),{queue:B,images:i,onContextMenuClickU:_,stackViewEl:N,previewIdx:r,previewing:C,onPreviewVisibleChange:U,previewImgMove:w,canPreview:S,itemSize:b,gridItems:J,showGenInfo:u,imageGenInfo:x,q:E,multiSelectedIdxs:v,onFileItemClick:L,scroller:y,showMenuIdx:h,onFileDragStart:O,onFileDragEnd:P,cellWidth:K,onScroll:M,saveAllFileAsJson:W,props:q,saveLoadedFileAsJson:Q,changeIndchecked:Y,seedChangeChecked:Z,getGenDiff:j,getGenDiffWatchDep:H}=Te(f);F(()=>g.selectedTagIds,async()=>{var t;await f.reset(),await re(),(t=y.value)==null||t.scrollToItem(0),M()},{immediate:!0}),F(()=>g,async t=>{q.value=t},{deep:!0,immediate:!0});const X=pe(),{onClearAllSelected:ee,onSelectAll:te,onReverseSelect:le}=xe();return(t,l)=>{const se=be,ne=ge,ae=fe,A=G,ie=G,oe=_e;return p(),I("div",{class:"container",ref_key:"stackViewEl",ref:N},[s(se,{show:!!e(v).length||e(X).keepMultiSelect,onClearAllSelected:e(ee),onSelectAll:e(te),onReverseSelect:e(le)},null,8,["show","onClearAllSelected","onSelectAll","onReverseSelect"]),s(oe,{size:"large",spinning:!e(B).isIdle},{default:n(()=>{var T,$;return[s(ae,{visible:e(u),"onUpdate:visible":l[1]||(l[1]=a=>R(u)?u.value=a:null),width:"70vw","mask-closable":"",onOk:l[2]||(l[2]=a=>u.value=!1)},{cancelText:n(()=>[]),default:n(()=>[s(ne,{active:"",loading:!e(E).isIdle},{default:n(()=>[d("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:l[0]||(l[0]=a=>e(ue)(e(x)))},[d("div",Fe,o(t.$t("doubleClickToCopy")),1),m(" "+o(e(x)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),d("div",Re,[s(A,{onClick:e(Q)},{default:n(()=>[m(o(t.$t("saveLoadedImageAsJson")),1)]),_:1},8,["onClick"]),s(A,{onClick:e(W)},{default:n(()=>[m(o(t.$t("saveAllAsJson")),1)]),_:1},8,["onClick"])]),(T=e(i))!=null&&T.length?(p(),V(e(ye),{key:0,ref_key:"scroller",ref:y,class:"file-list",items:e(i),"item-size":e(b).first,"key-field":"fullpath","item-secondary-size":e(b).second,gridItems:e(J),onScroll:e(M)},{after:n(()=>[Ve]),default:n(({item:a,index:D})=>[s(Me,{idx:D,file:a,"cell-width":e(K),"show-menu-idx":e(h),"onUpdate:showMenuIdx":l[3]||(l[3]=de=>R(h)?h.value=de:null),onDragstart:e(O),onDragend:e(P),onFileItemClick:e(L),"full-screen-preview-image-url":e(i)[e(r)]?e(me)(e(i)[e(r)]):"",selected:e(v).includes(D),onContextMenuClick:e(_),onPreviewVisibleChange:e(U),"is-selected-mutil-files":e(v).length>1,"enable-change-indicator":e(Y),"seed-change-checked":e(Z),"get-gen-diff":e(j),"get-gen-diff-watch-dep":e(H)},null,8,["idx","file","cell-width","show-menu-idx","onDragstart","onDragend","onFileItemClick","full-screen-preview-image-url","selected","onContextMenuClick","onPreviewVisibleChange","is-selected-mutil-files","enable-change-indicator","seed-change-checked","get-gen-diff","get-gen-diff-watch-dep"])]),_:1},8,["items","item-size","item-secondary-size","gridItems","onScroll"])):e(f).load&&t.selectedTagIds.and_tags.length===1&&!(($=t.selectedTagIds.folder_paths_str)!=null&&$.trim())?(p(),I("div",ze,[d("div",Ge,[d("p",Be,o(t.$t("tagSearchNoResultsMessage")),1),s(ie,{onClick:l[4]||(l[4]=a=>e($e)()),type:"primary"},{default:n(()=>[m(o(t.$t("rebuildImageIndex")),1)]),_:1})])])):k("",!0),e(C)?(p(),I("div",Ne,[s(e(Ce),{onClick:l[5]||(l[5]=a=>e(w)("prev")),class:z({disable:!e(S)("prev")})},null,8,["class"]),s(e(we),{onClick:l[6]||(l[6]=a=>e(w)("next")),class:z({disable:!e(S)("next")})},null,8,["class"])])):k("",!0)]}),_:1},8,["spinning"]),e(C)&&e(i)&&e(i)[e(r)]?(p(),V(Se,{key:0,file:e(i)[e(r)],idx:e(r),onContextMenuClick:e(_)},null,8,["file","idx","onContextMenuClick"])):k("",!0)],512)}}});const je=ke(Ue,[["__scopeId","data-v-caebce58"]]);export{je as default};

View File

@ -1 +0,0 @@
import{d as ce,m as F,ax as re,$ as pe,S as p,T as I,c as s,a2 as e,a1 as n,a4 as R,U as d,J as ue,W as o,V as m,a0 as V,ad as me,Y as k,ae as G,ag as ge,R as fe,ai as z,aN as ve,aO as he,bD as Ie,Z as ke}from"./index-a0a34372.js";import{S as _e}from"./index-767a4492.js";import{L as Ce,R as we,f as Se,M as be}from"./MultiSelectKeep-4f8b7fe4.js";import{c as xe,d as ye,F as Me}from"./FileItem-bc5ed3c6.js";import{c as Ae,u as De}from"./hook-2c60a92b.js";import{a as Te}from"./functionalCallableComp-dd44afea.js";import"./shortcut-148c4bf5.js";import"./index-ecf61b1a.js";/* empty css */import"./index-76dd5c79.js";const $e=c=>(ve("data-v-caebce58"),c=c(),he(),c),Fe={class:"hint"},Re={class:"action-bar"},Ve=$e(()=>d("div",{style:{padding:"16px 0 512px"}},null,-1)),Ge={key:1},ze={class:"no-res-hint"},Be={class:"hint"},Ne={key:2,class:"preview-switch"},Ue=ce({__name:"MatchedImageGrid",props:{tabIdx:{},paneIdx:{},selectedTagIds:{},id:{}},setup(c){const g=c,f=Ae(t=>Ie(g.selectedTagIds,t)),{queue:B,images:i,onContextMenuClickU:_,stackViewEl:N,previewIdx:r,previewing:C,onPreviewVisibleChange:U,previewImgMove:w,canPreview:S,itemSize:b,gridItems:J,showGenInfo:u,imageGenInfo:x,q:E,multiSelectedIdxs:v,onFileItemClick:L,scroller:y,showMenuIdx:h,onFileDragStart:O,onFileDragEnd:P,cellWidth:K,onScroll:M,saveAllFileAsJson:W,props:q,saveLoadedFileAsJson:Q,changeIndchecked:Y,seedChangeChecked:Z,getGenDiff:j,getGenDiffWatchDep:H}=De(f);F(()=>g.selectedTagIds,async()=>{var t;await f.reset(),await re(),(t=y.value)==null||t.scrollToItem(0),M()},{immediate:!0}),F(()=>g,async t=>{q.value=t},{deep:!0,immediate:!0});const X=pe(),{onClearAllSelected:ee,onSelectAll:te,onReverseSelect:le}=xe();return(t,l)=>{const se=be,ne=ge,ae=fe,A=z,ie=z,oe=_e;return p(),I("div",{class:"container",ref_key:"stackViewEl",ref:N},[s(se,{show:!!e(v).length||e(X).keepMultiSelect,onClearAllSelected:e(ee),onSelectAll:e(te),onReverseSelect:e(le)},null,8,["show","onClearAllSelected","onSelectAll","onReverseSelect"]),s(oe,{size:"large",spinning:!e(B).isIdle},{default:n(()=>{var D,T;return[s(ae,{visible:e(u),"onUpdate:visible":l[1]||(l[1]=a=>R(u)?u.value=a:null),width:"70vw","mask-closable":"",onOk:l[2]||(l[2]=a=>u.value=!1)},{cancelText:n(()=>[]),default:n(()=>[s(ne,{active:"",loading:!e(E).isIdle},{default:n(()=>[d("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:l[0]||(l[0]=a=>e(ue)(e(x)))},[d("div",Fe,o(t.$t("doubleClickToCopy")),1),m(" "+o(e(x)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),d("div",Re,[s(A,{onClick:e(Q)},{default:n(()=>[m(o(t.$t("saveLoadedImageAsJson")),1)]),_:1},8,["onClick"]),s(A,{onClick:e(W)},{default:n(()=>[m(o(t.$t("saveAllAsJson")),1)]),_:1},8,["onClick"])]),(D=e(i))!=null&&D.length?(p(),V(e(ye),{key:0,ref_key:"scroller",ref:y,class:"file-list",items:e(i),"item-size":e(b).first,"key-field":"fullpath","item-secondary-size":e(b).second,gridItems:e(J),onScroll:e(M)},{after:n(()=>[Ve]),default:n(({item:a,index:$})=>[s(Me,{idx:$,file:a,"cell-width":e(K),"show-menu-idx":e(h),"onUpdate:showMenuIdx":l[3]||(l[3]=de=>R(h)?h.value=de:null),onDragstart:e(O),onDragend:e(P),onFileItemClick:e(L),"full-screen-preview-image-url":e(i)[e(r)]?e(me)(e(i)[e(r)]):"",selected:e(v).includes($),onContextMenuClick:e(_),onPreviewVisibleChange:e(U),"is-selected-mutil-files":e(v).length>1,"enable-change-indicator":e(Y),"seed-change-checked":e(Z),"get-gen-diff":e(j),"get-gen-diff-watch-dep":e(H)},null,8,["idx","file","cell-width","show-menu-idx","onDragstart","onDragend","onFileItemClick","full-screen-preview-image-url","selected","onContextMenuClick","onPreviewVisibleChange","is-selected-mutil-files","enable-change-indicator","seed-change-checked","get-gen-diff","get-gen-diff-watch-dep"])]),_:1},8,["items","item-size","item-secondary-size","gridItems","onScroll"])):e(f).load&&t.selectedTagIds.and_tags.length===1&&!((T=t.selectedTagIds.folder_paths_str)!=null&&T.trim())?(p(),I("div",Ge,[d("div",ze,[d("p",Be,o(t.$t("tagSearchNoResultsMessage")),1),s(ie,{onClick:l[4]||(l[4]=a=>e(Te)()),type:"primary"},{default:n(()=>[m(o(t.$t("rebuildImageIndex")),1)]),_:1})])])):k("",!0),e(C)?(p(),I("div",Ne,[s(e(Ce),{onClick:l[5]||(l[5]=a=>e(w)("prev")),class:G({disable:!e(S)("prev")})},null,8,["class"]),s(e(we),{onClick:l[6]||(l[6]=a=>e(w)("next")),class:G({disable:!e(S)("next")})},null,8,["class"])])):k("",!0)]}),_:1},8,["spinning"]),e(C)&&e(i)&&e(i)[e(r)]?(p(),V(Se,{key:0,file:e(i)[e(r)],idx:e(r),onContextMenuClick:e(_)},null,8,["file","idx","onContextMenuClick"])):k("",!0)],512)}}});const Ze=ke(Ue,[["__scopeId","data-v-caebce58"]]);export{Ze 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

@ -0,0 +1 @@
.full-screen-menu[data-v-49490da6]{position:fixed;z-index:9999;background:var(--zp-primary-background);padding:8px 16px;box-shadow:0 0 4px var(--zp-secondary);border-radius:4px}.full-screen-menu .tags-container[data-v-49490da6]{margin:4px 0}.full-screen-menu .tags-container .tag[data-v-49490da6]{margin-right:4px;margin-bottom:4px;padding:2px 16px;border-radius:4px;display:inline-block;cursor:pointer;font-weight:700;transition:.5s all ease;border:2px solid var(--tag-color);color:var(--tag-color);background:var(--zp-primary-background);user-select:none}.full-screen-menu .tags-container .tag.selected[data-v-49490da6]{background:var(--tag-color);color:#fff}.full-screen-menu .container[data-v-49490da6]{height:100%;display:flex;overflow:hidden;flex-direction:column}.full-screen-menu .gen-info[data-v-49490da6]{flex:1;word-break:break-all;white-space:pre-line;overflow:auto;z-index:1;padding-top:4px;position:relative}.full-screen-menu .gen-info code[data-v-49490da6]{font-size:.9em;display:block;padding:4px;background:var(--zp-primary-background);border-radius:4px;margin-right:20px;white-space:pre-wrap;word-break:break-word;line-height:1.78em}.full-screen-menu .gen-info code[data-v-49490da6] .short-tag{word-break:break-all;white-space:nowrap}.full-screen-menu .gen-info code[data-v-49490da6] span.tag{background:var(--zp-secondary-variant-background);color:var(--zp-primary);padding:2px 4px;border-radius:6px;margin-right:6px;margin-top:4px;line-height:1.3em;display:inline-block}.full-screen-menu .gen-info code[data-v-49490da6] .has-parentheses.tag{background:rgba(255,100,100,.14)}.full-screen-menu .gen-info code[data-v-49490da6] span.tag:hover{background:rgba(120,0,0,.15)}.full-screen-menu .gen-info table[data-v-49490da6]{font-size:1em;border-radius:4px;border-collapse:separate;margin-bottom:3em}.full-screen-menu .gen-info table tr td[data-v-49490da6]:first-child{white-space:nowrap}.full-screen-menu .gen-info table td[data-v-49490da6]{padding-right:14px;padding-left:4px;border-bottom:1px solid var(--zp-secondary);border-collapse:collapse}.full-screen-menu .gen-info .info-tags .info-tag[data-v-49490da6]{display:inline-block;overflow:hidden;border-radius:4px;margin-right:8px;border:2px solid var(--zp-primary)}.full-screen-menu .gen-info .info-tags .name[data-v-49490da6]{background-color:var(--zp-primary);color:var(--zp-primary-background);padding:4px;border-bottom-right-radius:4px}.full-screen-menu .gen-info .info-tags .value[data-v-49490da6]{padding:4px}.full-screen-menu.unset-size[data-v-49490da6]{width:unset!important;height:unset!important}.full-screen-menu .mouse-sensor[data-v-49490da6]{position:absolute;bottom:0;right:0;transform:rotate(90deg);cursor:se-resize;z-index:1;background:var(--zp-primary-background);border-radius:2px}.full-screen-menu .mouse-sensor>*[data-v-49490da6]{font-size:18px;padding:4px}.full-screen-menu .action-bar[data-v-49490da6]{display:flex;align-items:center;user-select:none;gap:4px}.full-screen-menu .action-bar .icon[data-v-49490da6]{font-size:1.5em;padding:2px 4px;border-radius:4px}.full-screen-menu .action-bar .icon[data-v-49490da6]:hover{background:var(--zp-secondary-variant-background)}.full-screen-menu .action-bar>*[data-v-49490da6]{flex-wrap:wrap}.full-screen-menu.lr[data-v-49490da6]{top:var(--4544969e)!important;right:0!important;bottom:0!important;left:100vw!important;height:unset!important;width:var(--07bc3d64)!important;transition:left ease .3s}.full-screen-menu.lr.always-on[data-v-49490da6],.full-screen-menu.lr.mouse-in[data-v-49490da6]{left:var(--422cec28)!important}.lr-layout-control[data-v-49490da6]{display:flex;align-items:center;gap:16px;padding:4px 8px;flex-wrap:wrap;border-radius:2px;border-left:3px solid var(--zp-luminous);background-color:var(--zp-secondary-background)}.lr-layout-control .ctrl-item[data-v-49490da6]{display:flex;align-items:center;gap:4px;flex-wrap:nowrap}.select-actions[data-v-b04c3508]>:not(:last-child){margin-right:4px}.float-panel[data-v-b04c3508]{position:absolute;bottom:32px;right:32px;background:var(--zp-primary-background);border-radius:4px;z-index:1000;padding:8px;box-shadow:0 0 4px var(--zp-secondary)}

View File

@ -1 +0,0 @@
.full-screen-menu[data-v-6d84d348]{position:fixed;z-index:9999;background:var(--zp-primary-background);padding:8px 16px;box-shadow:0 0 4px var(--zp-secondary);border-radius:4px}.full-screen-menu .tags-container[data-v-6d84d348]{margin:4px 0}.full-screen-menu .tags-container .tag[data-v-6d84d348]{margin-right:4px;margin-bottom:4px;padding:2px 16px;border-radius:4px;display:inline-block;cursor:pointer;font-weight:700;transition:.5s all ease;border:2px solid var(--tag-color);color:var(--tag-color);background:var(--zp-primary-background);user-select:none}.full-screen-menu .tags-container .tag.selected[data-v-6d84d348]{background:var(--tag-color);color:#fff}.full-screen-menu .container[data-v-6d84d348]{height:100%;display:flex;overflow:hidden;flex-direction:column}.full-screen-menu .gen-info[data-v-6d84d348]{flex:1;word-break:break-all;white-space:pre-line;overflow:auto;z-index:1;padding-top:4px;position:relative}.full-screen-menu .gen-info code[data-v-6d84d348]{font-size:.9em;display:block;padding:4px;background:var(--zp-primary-background);border-radius:4px;margin-right:20px;white-space:pre-wrap;word-break:break-word;line-height:1.78em}.full-screen-menu .gen-info code[data-v-6d84d348] .short-tag{word-break:break-all;white-space:nowrap}.full-screen-menu .gen-info code[data-v-6d84d348] span.tag{background:var(--zp-secondary-variant-background);color:var(--zp-primary);padding:2px 4px;border-radius:6px;margin-right:6px;margin-top:4px;line-height:1.3em;display:inline-block}.full-screen-menu .gen-info code[data-v-6d84d348] .has-parentheses.tag{background:rgba(255,100,100,.14)}.full-screen-menu .gen-info code[data-v-6d84d348] span.tag:hover{background:rgba(120,0,0,.15)}.full-screen-menu .gen-info table[data-v-6d84d348]{font-size:1em;border-radius:4px;border-collapse:separate;margin-bottom:3em}.full-screen-menu .gen-info table tr td[data-v-6d84d348]:first-child{white-space:nowrap}.full-screen-menu .gen-info table td[data-v-6d84d348]{padding-right:14px;padding-left:4px;border-bottom:1px solid var(--zp-secondary);border-collapse:collapse}.full-screen-menu .gen-info .info-tags .info-tag[data-v-6d84d348]{display:inline-block;overflow:hidden;border-radius:4px;margin-right:8px;border:2px solid var(--zp-primary)}.full-screen-menu .gen-info .info-tags .name[data-v-6d84d348]{background-color:var(--zp-primary);color:var(--zp-primary-background);padding:4px;border-bottom-right-radius:4px}.full-screen-menu .gen-info .info-tags .value[data-v-6d84d348]{padding:4px}.full-screen-menu.unset-size[data-v-6d84d348]{width:unset!important;height:unset!important}.full-screen-menu .mouse-sensor[data-v-6d84d348]{position:absolute;bottom:0;right:0;transform:rotate(90deg);cursor:se-resize;z-index:1;background:var(--zp-primary-background);border-radius:2px}.full-screen-menu .mouse-sensor>*[data-v-6d84d348]{font-size:18px;padding:4px}.full-screen-menu .action-bar[data-v-6d84d348]{display:flex;align-items:center;user-select:none;gap:4px}.full-screen-menu .action-bar .icon[data-v-6d84d348]{font-size:1.5em;padding:2px 4px;border-radius:4px}.full-screen-menu .action-bar .icon[data-v-6d84d348]:hover{background:var(--zp-secondary-variant-background)}.full-screen-menu .action-bar>*[data-v-6d84d348]{flex-wrap:wrap}.full-screen-menu.lr[data-v-6d84d348]{top:var(--0ab4e432)!important;right:0!important;bottom:0!important;left:100vw!important;height:unset!important;width:var(--1b1abdcc)!important;transition:left ease .3s}.full-screen-menu.lr.always-on[data-v-6d84d348],.full-screen-menu.lr.mouse-in[data-v-6d84d348]{left:var(--1b10cd44)!important}.lr-layout-control[data-v-6d84d348]{display:flex;align-items:center;gap:16px;padding:4px 8px;flex-wrap:wrap;border-radius:2px;border-left:3px solid var(--zp-luminous);background-color:var(--zp-secondary-background)}.lr-layout-control .ctrl-item[data-v-6d84d348]{display:flex;align-items:center;gap:4px;flex-wrap:nowrap}.select-actions[data-v-b04c3508]>:not(:last-child){margin-right:4px}.float-panel[data-v-b04c3508]{position:absolute;bottom:32px;right:32px;background:var(--zp-primary-background);border-radius:4px;z-index:1000;padding:8px;box-shadow:0 0 4px var(--zp-secondary)}

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

15
vue/dist/assets/TagSearch-5b28e55a.js 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

View File

@ -0,0 +1 @@
import{bP as i,aY as t,dE as f,bG as n}from"./index-ee40c384.js";function u(e,a,r){if(!i(r))return!1;var s=typeof a;return(s=="number"?t(r)&&f(a,r.length):s=="string"&&a in r)?n(r[a],e):!1}export{u as i};

View File

@ -0,0 +1 @@
import{d as v,cW as C,c6 as I,S as l,T as _,U as f,c,a1 as r,V as h,W as d,a2 as e,a0 as F,ad as z,co as B,cX as x,ai as S,Z as $}from"./index-ee40c384.js";import{u as R,a as V,k as E,F as T,d as A}from"./FileItem-a74cdf88.js";import"./functionalCallableComp-cec4e075.js";/* empty css */import"./_isIterateeCall-ae159f74.js";import"./index-920e6a91.js";const U={class:"actions-panel actions"},L={key:0,class:"file-list"},N={class:"hint"},W=v({__name:"batchDownload",props:{tabIdx:{},paneIdx:{},id:{}},setup(H){const{stackViewEl:w}=R().toRefs(),{itemSize:p,gridItems:k,cellWidth:y}=V(),n=E(),{selectdFiles:i}=C(n),m=I(),D=async t=>{const s=B(t);s&&n.addFiles(s.nodes)},b=async()=>{m.pushAction(async()=>{const t=await x.value.post("/zip",{paths:i.value.map(o=>o.fullpath)},{responseType:"blob"}),s=window.URL.createObjectURL(new Blob([t.data])),a=document.createElement("a");a.href=s,a.setAttribute("download",`iib_${new Date().toLocaleString()}.zip`),document.body.appendChild(a),a.click()})},g=t=>{i.value.splice(t,1)};return(t,s)=>{const a=S;return l(),_("div",{class:"container",ref_key:"stackViewEl",ref:w,onDrop:D},[f("div",U,[c(a,{onClick:s[0]||(s[0]=o=>e(n).selectdFiles=[])},{default:r(()=>[h(d(t.$t("clear")),1)]),_:1}),c(a,{onClick:b,type:"primary",loading:!e(m).isIdle},{default:r(()=>[h(d(t.$t("zipDownload")),1)]),_:1},8,["loading"])]),e(i).length?(l(),F(e(A),{key:1,ref:"scroller",class:"file-list",items:e(i).slice(),"item-size":e(p).first,"key-field":"fullpath","item-secondary-size":e(p).second,gridItems:e(k)},{default:r(({item:o,index:u})=>[c(T,{idx:u,file:o,"cell-width":e(y),"enable-close-icon":"",onCloseIconClick:j=>g(u),"full-screen-preview-image-url":e(z)(o),"enable-right-click-menu":!1},null,8,["idx","file","cell-width","onCloseIconClick","full-screen-preview-image-url"])]),_:1},8,["items","item-size","item-secondary-size","gridItems"])):(l(),_("div",L,[f("p",N,d(t.$t("batchDownloaDDragAndDropHint")),1)]))],544)}}});const J=$(W,[["__scopeId","data-v-aab31da2"]]);export{J as default};

View File

@ -1 +0,0 @@
import{d as v,cy as C,bN as I,S as l,T as _,U as f,c,a1 as r,V as h,W as d,a2 as e,a0 as z,ad as F,b$ as B,cz as $,ai as x,Z as S}from"./index-a0a34372.js";import{u as R,a as V,k as E,F as T,d as A}from"./FileItem-bc5ed3c6.js";import"./functionalCallableComp-dd44afea.js";/* empty css */import"./index-76dd5c79.js";const N={class:"actions-panel actions"},U={key:0,class:"file-list"},L={class:"hint"},H=v({__name:"batchDownload",props:{tabIdx:{},paneIdx:{},id:{}},setup(W){const{stackViewEl:w}=R().toRefs(),{itemSize:p,gridItems:k,cellWidth:b}=V(),n=E(),{selectdFiles:i}=C(n),u=I(),y=async t=>{const s=B(t);s&&n.addFiles(s.nodes)},D=async()=>{u.pushAction(async()=>{const t=await $.value.post("/zip",{paths:i.value.map(o=>o.fullpath)},{responseType:"blob"}),s=window.URL.createObjectURL(new Blob([t.data])),a=document.createElement("a");a.href=s,a.setAttribute("download",`iib_${new Date().toLocaleString()}.zip`),document.body.appendChild(a),a.click()})},g=t=>{i.value.splice(t,1)};return(t,s)=>{const a=x;return l(),_("div",{class:"container",ref_key:"stackViewEl",ref:w,onDrop:y},[f("div",N,[c(a,{onClick:s[0]||(s[0]=o=>e(n).selectdFiles=[])},{default:r(()=>[h(d(t.$t("clear")),1)]),_:1}),c(a,{onClick:D,type:"primary",loading:!e(u).isIdle},{default:r(()=>[h(d(t.$t("zipDownload")),1)]),_:1},8,["loading"])]),e(i).length?(l(),z(e(A),{key:1,ref:"scroller",class:"file-list",items:e(i).slice(),"item-size":e(p).first,"key-field":"fullpath","item-secondary-size":e(p).second,gridItems:e(k)},{default:r(({item:o,index:m})=>[c(T,{idx:m,file:o,"cell-width":e(b),"enable-close-icon":"",onCloseIconClick:j=>g(m),"full-screen-preview-image-url":e(F)(o),"enable-right-click-menu":!1},null,8,["idx","file","cell-width","onCloseIconClick","full-screen-preview-image-url"])]),_:1},8,["items","item-size","item-secondary-size","gridItems"])):(l(),_("div",U,[f("p",L,d(t.$t("batchDownloaDDragAndDropHint")),1)]))],544)}}});const J=S(H,[["__scopeId","data-v-aab31da2"]]);export{J as default};

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/gridView-7ab44d9c.js vendored Normal file
View File

@ -0,0 +1 @@
import{u as w,a as y,F as k,d as x}from"./FileItem-a74cdf88.js";import{d as F,$ as b,c3 as h,r as D,bc as I,bg as C,S as E,T as S,c as n,a1 as V,a2 as e,ad as z,co as B,cY as R,Z as T}from"./index-ee40c384.js";import"./functionalCallableComp-cec4e075.js";/* empty css */import"./_isIterateeCall-ae159f74.js";import"./index-920e6a91.js";const $=F({__name:"gridView",props:{tabIdx:{},paneIdx:{},id:{},removable:{type:Boolean},allowDragAndDrop:{type:Boolean},files:{},paneKey:{}},setup(p){const o=p,d=b(),{stackViewEl:m}=w().toRefs(),{itemSize:i,gridItems:u,cellWidth:f}=y(),g=h(),a=D(o.files??[]),_=async s=>{const l=B(s);o.allowDragAndDrop&&l&&(a.value=R([...a.value,...l.nodes]))},v=s=>{a.value.splice(s,1)};return I(()=>{d.pageFuncExportMap.set(o.paneKey,{getFiles:()=>C(a.value),setFiles:s=>a.value=s})}),(s,l)=>(E(),S("div",{class:"container",ref_key:"stackViewEl",ref:m,onDrop:_},[n(e(x),{ref:"scroller",class:"file-list",items:a.value.slice(),"item-size":e(i).first,"key-field":"fullpath","item-secondary-size":e(i).second,gridItems:e(u)},{default:V(({item:t,index:r})=>{var c;return[n(k,{idx:r,file:t,"cell-width":e(f),"enable-close-icon":o.removable,onCloseIconClick:A=>v(r),"full-screen-preview-image-url":e(z)(t),"extra-tags":(c=t==null?void 0:t.tags)==null?void 0:c.map(e(g).tagConvert),"enable-right-click-menu":!1},null,8,["idx","file","cell-width","enable-close-icon","onCloseIconClick","full-screen-preview-image-url","extra-tags"])]}),_:1},8,["items","item-size","item-secondary-size","gridItems"])],544))}});const U=T($,[["__scopeId","data-v-f35f4802"]]);export{U as default};

View File

@ -1 +0,0 @@
import{u as w,a as y,F as k,d as x}from"./FileItem-bc5ed3c6.js";import{d as b,$ as F,cf as h,r as D,bc as I,bg as C,S as E,T as S,c,a1 as V,a2 as e,ad as z,b$ as B,cA as $,Z as A}from"./index-a0a34372.js";import"./functionalCallableComp-dd44afea.js";/* empty css */import"./index-76dd5c79.js";const R=b({__name:"gridView",props:{tabIdx:{},paneIdx:{},id:{},removable:{type:Boolean},allowDragAndDrop:{type:Boolean},files:{},paneKey:{}},setup(p){const o=p,d=F(),{stackViewEl:m}=w().toRefs(),{itemSize:i,gridItems:u,cellWidth:f}=y(),g=h(),a=D(o.files??[]),_=async s=>{const l=B(s);o.allowDragAndDrop&&l&&(a.value=$([...a.value,...l.nodes]))},v=s=>{a.value.splice(s,1)};return I(()=>{d.pageFuncExportMap.set(o.paneKey,{getFiles:()=>C(a.value),setFiles:s=>a.value=s})}),(s,l)=>(E(),S("div",{class:"container",ref_key:"stackViewEl",ref:m,onDrop:_},[c(e(x),{ref:"scroller",class:"file-list",items:a.value.slice(),"item-size":e(i).first,"key-field":"fullpath","item-secondary-size":e(i).second,gridItems:e(u)},{default:V(({item:t,index:r})=>{var n;return[c(k,{idx:r,file:t,"cell-width":e(f),"enable-close-icon":o.removable,onCloseIconClick:T=>v(r),"full-screen-preview-image-url":e(z)(t),"extra-tags":(n=t==null?void 0:t.tags)==null?void 0:n.map(e(g).tagConvert),"enable-right-click-menu":!1},null,8,["idx","file","cell-width","enable-close-icon","onCloseIconClick","full-screen-preview-image-url","extra-tags"])]}),_:1},8,["items","item-size","item-secondary-size","gridItems"])],544))}});const N=A(R,[["__scopeId","data-v-f35f4802"]]);export{N as default};

View File

@ -1 +0,0 @@
import{ak as k,r as g,l as R,k as b,L as A,E as q,bN as G,bp as L,bX as z}from"./index-a0a34372.js";import{u as O,a as Q,b as j,e as H}from"./FileItem-bc5ed3c6.js";import{a as T,b as U,c as W,d as X}from"./MultiSelectKeep-4f8b7fe4.js";let B=0;const K=()=>++B,V=(n,i,{dataUpdateStrategy:l="replace"}={})=>{const a=k([""]),c=g(!1),t=g(),o=g(!1);let f=g(-1);const v=new Set,w=e=>{var s;l==="replace"?t.value=e:l==="merge"&&(A((Array.isArray(t.value)||typeof t.value>"u")&&Array.isArray(e),"数据更新策略为合并时仅可用于值为数组的情况"),t.value=[...(s=t==null?void 0:t.value)!==null&&s!==void 0?s:[],...e])},d=e=>b(void 0,void 0,void 0,function*(){if(o.value||c.value&&typeof e>"u")return!1;o.value=!0;const s=K();f.value=s;try{let r;if(typeof e=="number"){if(r=a[e],typeof r!="string")return!1}else r=a[a.length-1];const h=yield n(r);if(v.has(s))return v.delete(s),!1;w(i(h));const u=h.cursor;if((e===a.length-1||typeof e!="number")&&(c.value=!u.has_next,u.has_next)){const y=u.next_cursor||u.next;A(typeof y=="string"),a.push(y)}}finally{f.value===s&&(o.value=!1)}return!0}),m=()=>{v.add(f.value),o.value=!1},x=(e=!1)=>b(void 0,void 0,void 0,function*(){const{refetch:s,force:r}=typeof e=="object"?e:{refetch:e};r&&m(),A(!o.value),a.splice(0,a.length,""),o.value=!1,t.value=void 0,c.value=!1,s&&(yield d())}),I=()=>({next:()=>b(void 0,void 0,void 0,function*(){if(o.value)throw new Error("不允许同时迭代");return{done:!(yield d()),value:t.value}})});return R({abort:m,load:c,next:d,res:t,loading:o,cursorStack:a,reset:x,[Symbol.asyncIterator]:I,iter:{[Symbol.asyncIterator]:I}})},te=n=>k(V(n,i=>i.files,{dataUpdateStrategy:"merge"})),se=n=>{const i=k(new Set),l=q(()=>(n.res??[]).filter(p=>!i.has(p.fullpath))),a=G(),{stackViewEl:c,multiSelectedIdxs:t,stack:o,scroller:f,props:v}=O({images:l}).toRefs(),{itemSize:w,gridItems:d,cellWidth:m,onScroll:x}=Q({fetchNext:()=>n.next()}),{showMenuIdx:I}=j(),{onFileDragStart:e,onFileDragEnd:s}=T(),{showGenInfo:r,imageGenInfo:h,q:u,onContextMenuClick:y,onFileItemClick:C}=U({openNext:L}),{previewIdx:E,previewing:_,onPreviewVisibleChange:M,previewImgMove:N,canPreview:D}=W({loadNext:()=>n.next()}),J=async(p,S,P)=>{o.value=[{curr:"",files:l.value}],await y(p,S,P)};H("removeFiles",async({paths:p})=>{p.forEach(S=>i.add(S))});const F=()=>{z(l.value)};return{images:l,scroller:f,queue:a,iter:n,onContextMenuClickU:J,stackViewEl:c,previewIdx:E,previewing:_,onPreviewVisibleChange:M,previewImgMove:N,canPreview:D,itemSize:w,gridItems:d,showGenInfo:r,imageGenInfo:h,q:u,onContextMenuClick:y,onFileItemClick:C,showMenuIdx:I,multiSelectedIdxs:t,onFileDragStart:e,onFileDragEnd:s,cellWidth:m,onScroll:x,saveLoadedFileAsJson:F,saveAllFileAsJson:async()=>{for(;!n.load;)await n.next();F()},props:v,...X()}};export{te as c,se as u};

1
vue/dist/assets/hook-50aaef2c.js vendored Normal file
View File

@ -0,0 +1 @@
import{ak as k,r as g,l as R,k as A,L as b,E as q,c6 as G,ch as L,cl as z}from"./index-ee40c384.js";import{u as O,a as Q,b as j,e as H}from"./FileItem-a74cdf88.js";import{a as T,b as U,c as W,d as B}from"./MultiSelectKeep-28b76528.js";let K=0;const V=()=>++K,X=(n,i,{dataUpdateStrategy:l="replace"}={})=>{const a=k([""]),c=g(!1),t=g(),o=g(!1);let f=g(-1);const v=new Set,w=e=>{var s;l==="replace"?t.value=e:l==="merge"&&(b((Array.isArray(t.value)||typeof t.value>"u")&&Array.isArray(e),"数据更新策略为合并时仅可用于值为数组的情况"),t.value=[...(s=t==null?void 0:t.value)!==null&&s!==void 0?s:[],...e])},d=e=>A(void 0,void 0,void 0,function*(){if(o.value||c.value&&typeof e>"u")return!1;o.value=!0;const s=V();f.value=s;try{let r;if(typeof e=="number"){if(r=a[e],typeof r!="string")return!1}else r=a[a.length-1];const I=yield n(r);if(v.has(s))return v.delete(s),!1;w(i(I));const u=I.cursor;if((e===a.length-1||typeof e!="number")&&(c.value=!u.has_next,u.has_next)){const y=u.next_cursor||u.next;b(typeof y=="string"),a.push(y)}}finally{f.value===s&&(o.value=!1)}return!0}),h=()=>{v.add(f.value),o.value=!1},x=(e=!1)=>A(void 0,void 0,void 0,function*(){const{refetch:s,force:r}=typeof e=="object"?e:{refetch:e};r&&h(),b(!o.value),a.splice(0,a.length,""),o.value=!1,t.value=void 0,c.value=!1,s&&(yield d())}),m=()=>({next:()=>A(void 0,void 0,void 0,function*(){if(o.value)throw new Error("不允许同时迭代");return{done:!(yield d()),value:t.value}})});return R({abort:h,load:c,next:d,res:t,loading:o,cursorStack:a,reset:x,[Symbol.asyncIterator]:m,iter:{[Symbol.asyncIterator]:m}})},te=n=>k(X(n,i=>i.files,{dataUpdateStrategy:"merge"})),se=n=>{const i=k(new Set),l=q(()=>(n.res??[]).filter(p=>!i.has(p.fullpath))),a=G(),{stackViewEl:c,multiSelectedIdxs:t,stack:o,scroller:f,props:v}=O({images:l}).toRefs(),{itemSize:w,gridItems:d,cellWidth:h,onScroll:x}=Q({fetchNext:()=>n.next()}),{showMenuIdx:m}=j(),{onFileDragStart:e,onFileDragEnd:s}=T(),{showGenInfo:r,imageGenInfo:I,q:u,onContextMenuClick:y,onFileItemClick:C}=U({openNext:L}),{previewIdx:E,previewing:_,onPreviewVisibleChange:M,previewImgMove:D,canPreview:J}=W({loadNext:()=>n.next()}),N=async(p,S,P)=>{o.value=[{curr:"",files:l.value}],await y(p,S,P)};H("removeFiles",async({paths:p})=>{p.forEach(S=>i.add(S))});const F=()=>{z(l.value)};return{images:l,scroller:f,queue:a,iter:n,onContextMenuClickU:N,stackViewEl:c,previewIdx:E,previewing:_,onPreviewVisibleChange:M,previewImgMove:D,canPreview:J,itemSize:w,gridItems:d,showGenInfo:r,imageGenInfo:I,q:u,onContextMenuClick:y,onFileItemClick:C,showMenuIdx:m,multiSelectedIdxs:t,onFileDragStart:e,onFileDragEnd:s,cellWidth:h,onScroll:x,saveLoadedFileAsJson:F,saveAllFileAsJson:async()=>{for(;!n.load;)await n.next();F()},props:v,...B()}};export{te as c,se as u};

1
vue/dist/assets/index-1a8b45e5.js vendored Normal file
View File

@ -0,0 +1 @@
import{cf as t,cg as e,ch as r,ci as n,aY as a}from"./index-ee40c384.js";function o(i,s){return t(e(i,s,r),i+"")}function b(i){return n(i)&&a(i)}export{o as b,b as i};

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{d as z,bB as D,at as A,cu as j,ax as k,n as B,cv as V,c0 as y,e as $,c as a,_ as T,h as r,a as P,cw as M,P as b}from"./index-a0a34372.js";var O=["class","style"],W=function(){return{prefixCls:String,spinning:{type:Boolean,default:void 0},size:String,wrapperClassName:String,tip:b.any,delay:Number,indicator:b.any}},p=null;function q(t,n){return!!t&&!!n&&!isNaN(Number(n))}function G(t){var n=t.indicator;p=typeof n=="function"?n:function(){return a(n,null,null)}}const H=z({compatConfig:{MODE:3},name:"ASpin",inheritAttrs:!1,props:D(W(),{size:"default",spinning:!0,wrapperClassName:""}),setup:function(){return{originalUpdateSpinning:null,configProvider:A("configProvider",j)}},data:function(){var n=this.spinning,e=this.delay,i=q(n,e);return{sSpinning:n&&!i}},created:function(){this.originalUpdateSpinning=this.updateSpinning,this.debouncifyUpdateSpinning(this.$props)},mounted:function(){this.updateSpinning()},updated:function(){var n=this;k(function(){n.debouncifyUpdateSpinning(),n.updateSpinning()})},beforeUnmount:function(){this.cancelExistingSpin()},methods:{debouncifyUpdateSpinning:function(n){var e=n||this.$props,i=e.delay;i&&(this.cancelExistingSpin(),this.updateSpinning=B(this.originalUpdateSpinning,i))},updateSpinning:function(){var n=this.spinning,e=this.sSpinning;e!==n&&(this.sSpinning=n)},cancelExistingSpin:function(){var n=this.updateSpinning;n&&n.cancel&&n.cancel()},renderIndicator:function(n){var e="".concat(n,"-dot"),i=V(this,"indicator");return i===null?null:(Array.isArray(i)&&(i=i.length===1?i[0]:i),y(i)?$(i,{class:e}):p&&y(p())?$(p(),{class:e}):a("span",{class:"".concat(e," ").concat(n,"-dot-spin")},[a("i",{class:"".concat(n,"-dot-item")},null),a("i",{class:"".concat(n,"-dot-item")},null),a("i",{class:"".concat(n,"-dot-item")},null),a("i",{class:"".concat(n,"-dot-item")},null)]))}},render:function(){var n,e,i,o=this.$props,f=o.size,x=o.prefixCls,h=o.tip,d=h===void 0?(n=(e=this.$slots).tip)===null||n===void 0?void 0:n.call(e):h,N=o.wrapperClassName,l=this.$attrs,v=l.class,_=l.style,C=T(l,O),S=this.configProvider,U=S.getPrefixCls,w=S.direction,s=U("spin",x),u=this.sSpinning,E=(i={},r(i,s,!0),r(i,"".concat(s,"-sm"),f==="small"),r(i,"".concat(s,"-lg"),f==="large"),r(i,"".concat(s,"-spinning"),u),r(i,"".concat(s,"-show-text"),!!d),r(i,"".concat(s,"-rtl"),w==="rtl"),r(i,v,!!v),i),m=a("div",P(P({},C),{},{style:_,class:E}),[this.renderIndicator(s),d?a("div",{class:"".concat(s,"-text")},[d]):null]),g=M(this);if(g&&g.length){var c,I=(c={},r(c,"".concat(s,"-container"),!0),r(c,"".concat(s,"-blur"),u),c);return a("div",{class:["".concat(s,"-nested-loading"),N]},[u&&a("div",{key:"loading"},[m]),a("div",{class:I,key:"container"},[g])])}return m}});export{H as S,G as s};
import{d as z,bx as D,at as A,cS as j,ax as k,n as T,cT as V,cp as y,e as $,c as a,_ as B,h as r,a as P,cU as M,P as b}from"./index-ee40c384.js";var O=["class","style"],W=function(){return{prefixCls:String,spinning:{type:Boolean,default:void 0},size:String,wrapperClassName:String,tip:b.any,delay:Number,indicator:b.any}},p=null;function q(t,n){return!!t&&!!n&&!isNaN(Number(n))}function G(t){var n=t.indicator;p=typeof n=="function"?n:function(){return a(n,null,null)}}const H=z({compatConfig:{MODE:3},name:"ASpin",inheritAttrs:!1,props:D(W(),{size:"default",spinning:!0,wrapperClassName:""}),setup:function(){return{originalUpdateSpinning:null,configProvider:A("configProvider",j)}},data:function(){var n=this.spinning,e=this.delay,i=q(n,e);return{sSpinning:n&&!i}},created:function(){this.originalUpdateSpinning=this.updateSpinning,this.debouncifyUpdateSpinning(this.$props)},mounted:function(){this.updateSpinning()},updated:function(){var n=this;k(function(){n.debouncifyUpdateSpinning(),n.updateSpinning()})},beforeUnmount:function(){this.cancelExistingSpin()},methods:{debouncifyUpdateSpinning:function(n){var e=n||this.$props,i=e.delay;i&&(this.cancelExistingSpin(),this.updateSpinning=T(this.originalUpdateSpinning,i))},updateSpinning:function(){var n=this.spinning,e=this.sSpinning;e!==n&&(this.sSpinning=n)},cancelExistingSpin:function(){var n=this.updateSpinning;n&&n.cancel&&n.cancel()},renderIndicator:function(n){var e="".concat(n,"-dot"),i=V(this,"indicator");return i===null?null:(Array.isArray(i)&&(i=i.length===1?i[0]:i),y(i)?$(i,{class:e}):p&&y(p())?$(p(),{class:e}):a("span",{class:"".concat(e," ").concat(n,"-dot-spin")},[a("i",{class:"".concat(n,"-dot-item")},null),a("i",{class:"".concat(n,"-dot-item")},null),a("i",{class:"".concat(n,"-dot-item")},null),a("i",{class:"".concat(n,"-dot-item")},null)]))}},render:function(){var n,e,i,o=this.$props,f=o.size,x=o.prefixCls,h=o.tip,d=h===void 0?(n=(e=this.$slots).tip)===null||n===void 0?void 0:n.call(e):h,N=o.wrapperClassName,l=this.$attrs,v=l.class,_=l.style,U=B(l,O),S=this.configProvider,C=S.getPrefixCls,E=S.direction,s=C("spin",x),u=this.sSpinning,I=(i={},r(i,s,!0),r(i,"".concat(s,"-sm"),f==="small"),r(i,"".concat(s,"-lg"),f==="large"),r(i,"".concat(s,"-spinning"),u),r(i,"".concat(s,"-show-text"),!!d),r(i,"".concat(s,"-rtl"),E==="rtl"),r(i,v,!!v),i),m=a("div",P(P({},U),{},{style:_,class:I}),[this.renderIndicator(s),d?a("div",{class:"".concat(s,"-text")},[d]):null]),g=M(this);if(g&&g.length){var c,w=(c={},r(c,"".concat(s,"-container"),!0),r(c,"".concat(s,"-blur"),u),c);return a("div",{class:["".concat(s,"-nested-loading"),N]},[u&&a("div",{key:"loading"},[m]),a("div",{class:w,key:"container"},[g])])}return m}});export{H as S,G as s};

View File

@ -1 +1 @@
import{r as F,o as P,cr as K,at as L,E as i,av as T,aw as I,d as E,u as $,cs as _,b as y,bf as V,ct as A,al as B,h as c,c as M,a as G}from"./index-a0a34372.js";const W=function(){var o=F(!1);return P(function(){o.value=K()}),o};var D=Symbol("rowContextKey"),U=function(r){T(D,r)},k=function(){return L(D,{gutter:i(function(){}),wrap:i(function(){}),supportFlexGap:i(function(){})})};I("top","middle","bottom","stretch");I("start","end","center","space-around","space-between");var q=function(){return{align:String,justify:String,prefixCls:String,gutter:{type:[Number,Array,Object],default:0},wrap:{type:Boolean,default:void 0}}},H=E({compatConfig:{MODE:3},name:"ARow",props:q(),setup:function(r,N){var m=N.slots,v=$("row",r),d=v.prefixCls,h=v.direction,j,x=F({xs:!0,sm:!0,md:!0,lg:!0,xl:!0,xxl:!0,xxxl:!0}),w=W();P(function(){j=_.subscribe(function(e){var t=r.gutter||0;(!Array.isArray(t)&&y(t)==="object"||Array.isArray(t)&&(y(t[0])==="object"||y(t[1])==="object"))&&(x.value=e)})}),V(function(){_.unsubscribe(j)});var S=i(function(){var e=[0,0],t=r.gutter,n=t===void 0?0:t,s=Array.isArray(n)?n:[n,0];return s.forEach(function(l,b){if(y(l)==="object")for(var a=0;a<A.length;a++){var p=A[a];if(x.value[p]&&l[p]!==void 0){e[b]=l[p];break}}else e[b]=l||0}),e});U({gutter:S,supportFlexGap:w,wrap:i(function(){return r.wrap})});var R=i(function(){var e;return B(d.value,(e={},c(e,"".concat(d.value,"-no-wrap"),r.wrap===!1),c(e,"".concat(d.value,"-").concat(r.justify),r.justify),c(e,"".concat(d.value,"-").concat(r.align),r.align),c(e,"".concat(d.value,"-rtl"),h.value==="rtl"),e))}),O=i(function(){var e=S.value,t={},n=e[0]>0?"".concat(e[0]/-2,"px"):void 0,s=e[1]>0?"".concat(e[1]/-2,"px"):void 0;return n&&(t.marginLeft=n,t.marginRight=n),w.value?t.rowGap="".concat(e[1],"px"):s&&(t.marginTop=s,t.marginBottom=s),t});return function(){var e;return M("div",{class:R.value,style:O.value},[(e=m.default)===null||e===void 0?void 0:e.call(m)])}}});const Y=H;function J(o){return typeof o=="number"?"".concat(o," ").concat(o," auto"):/^\d+(\.\d+)?(px|em|rem|%)$/.test(o)?"0 0 ".concat(o):o}var Q=function(){return{span:[String,Number],order:[String,Number],offset:[String,Number],push:[String,Number],pull:[String,Number],xs:{type:[String,Number,Object],default:void 0},sm:{type:[String,Number,Object],default:void 0},md:{type:[String,Number,Object],default:void 0},lg:{type:[String,Number,Object],default:void 0},xl:{type:[String,Number,Object],default:void 0},xxl:{type:[String,Number,Object],default:void 0},xxxl:{type:[String,Number,Object],default:void 0},prefixCls:String,flex:[String,Number]}};const Z=E({compatConfig:{MODE:3},name:"ACol",props:Q(),setup:function(r,N){var m=N.slots,v=k(),d=v.gutter,h=v.supportFlexGap,j=v.wrap,x=$("col",r),w=x.prefixCls,S=x.direction,R=i(function(){var e,t=r.span,n=r.order,s=r.offset,l=r.push,b=r.pull,a=w.value,p={};return["xs","sm","md","lg","xl","xxl","xxxl"].forEach(function(g){var f,u={},C=r[g];typeof C=="number"?u.span=C:y(C)==="object"&&(u=C||{}),p=G(G({},p),{},(f={},c(f,"".concat(a,"-").concat(g,"-").concat(u.span),u.span!==void 0),c(f,"".concat(a,"-").concat(g,"-order-").concat(u.order),u.order||u.order===0),c(f,"".concat(a,"-").concat(g,"-offset-").concat(u.offset),u.offset||u.offset===0),c(f,"".concat(a,"-").concat(g,"-push-").concat(u.push),u.push||u.push===0),c(f,"".concat(a,"-").concat(g,"-pull-").concat(u.pull),u.pull||u.pull===0),c(f,"".concat(a,"-rtl"),S.value==="rtl"),f))}),B(a,(e={},c(e,"".concat(a,"-").concat(t),t!==void 0),c(e,"".concat(a,"-order-").concat(n),n),c(e,"".concat(a,"-offset-").concat(s),s),c(e,"".concat(a,"-push-").concat(l),l),c(e,"".concat(a,"-pull-").concat(b),b),e),p)}),O=i(function(){var e=r.flex,t=d.value,n={};if(t&&t[0]>0){var s="".concat(t[0]/2,"px");n.paddingLeft=s,n.paddingRight=s}if(t&&t[1]>0&&!h.value){var l="".concat(t[1]/2,"px");n.paddingTop=l,n.paddingBottom=l}return e&&(n.flex=J(e),j.value===!1&&!n.minWidth&&(n.minWidth=0)),n});return function(){var e;return M("div",{class:R.value,style:O.value},[(e=m.default)===null||e===void 0?void 0:e.call(m)])}}});export{Z as C,Y as R};
import{r as P,o as F,cP as K,at as L,E as i,av as T,aw as I,d as E,u as $,cQ as _,b as y,bf as V,cR as A,al as B,h as c,c as M,a as G}from"./index-ee40c384.js";const W=function(){var o=P(!1);return F(function(){o.value=K()}),o};var D=Symbol("rowContextKey"),Q=function(r){T(D,r)},U=function(){return L(D,{gutter:i(function(){}),wrap:i(function(){}),supportFlexGap:i(function(){})})};I("top","middle","bottom","stretch");I("start","end","center","space-around","space-between");var k=function(){return{align:String,justify:String,prefixCls:String,gutter:{type:[Number,Array,Object],default:0},wrap:{type:Boolean,default:void 0}}},q=E({compatConfig:{MODE:3},name:"ARow",props:k(),setup:function(r,N){var m=N.slots,v=$("row",r),d=v.prefixCls,h=v.direction,j,x=P({xs:!0,sm:!0,md:!0,lg:!0,xl:!0,xxl:!0,xxxl:!0}),w=W();F(function(){j=_.subscribe(function(e){var t=r.gutter||0;(!Array.isArray(t)&&y(t)==="object"||Array.isArray(t)&&(y(t[0])==="object"||y(t[1])==="object"))&&(x.value=e)})}),V(function(){_.unsubscribe(j)});var S=i(function(){var e=[0,0],t=r.gutter,n=t===void 0?0:t,s=Array.isArray(n)?n:[n,0];return s.forEach(function(l,b){if(y(l)==="object")for(var a=0;a<A.length;a++){var p=A[a];if(x.value[p]&&l[p]!==void 0){e[b]=l[p];break}}else e[b]=l||0}),e});Q({gutter:S,supportFlexGap:w,wrap:i(function(){return r.wrap})});var R=i(function(){var e;return B(d.value,(e={},c(e,"".concat(d.value,"-no-wrap"),r.wrap===!1),c(e,"".concat(d.value,"-").concat(r.justify),r.justify),c(e,"".concat(d.value,"-").concat(r.align),r.align),c(e,"".concat(d.value,"-rtl"),h.value==="rtl"),e))}),O=i(function(){var e=S.value,t={},n=e[0]>0?"".concat(e[0]/-2,"px"):void 0,s=e[1]>0?"".concat(e[1]/-2,"px"):void 0;return n&&(t.marginLeft=n,t.marginRight=n),w.value?t.rowGap="".concat(e[1],"px"):s&&(t.marginTop=s,t.marginBottom=s),t});return function(){var e;return M("div",{class:R.value,style:O.value},[(e=m.default)===null||e===void 0?void 0:e.call(m)])}}});const Y=q;function H(o){return typeof o=="number"?"".concat(o," ").concat(o," auto"):/^\d+(\.\d+)?(px|em|rem|%)$/.test(o)?"0 0 ".concat(o):o}var J=function(){return{span:[String,Number],order:[String,Number],offset:[String,Number],push:[String,Number],pull:[String,Number],xs:{type:[String,Number,Object],default:void 0},sm:{type:[String,Number,Object],default:void 0},md:{type:[String,Number,Object],default:void 0},lg:{type:[String,Number,Object],default:void 0},xl:{type:[String,Number,Object],default:void 0},xxl:{type:[String,Number,Object],default:void 0},xxxl:{type:[String,Number,Object],default:void 0},prefixCls:String,flex:[String,Number]}};const Z=E({compatConfig:{MODE:3},name:"ACol",props:J(),setup:function(r,N){var m=N.slots,v=U(),d=v.gutter,h=v.supportFlexGap,j=v.wrap,x=$("col",r),w=x.prefixCls,S=x.direction,R=i(function(){var e,t=r.span,n=r.order,s=r.offset,l=r.push,b=r.pull,a=w.value,p={};return["xs","sm","md","lg","xl","xxl","xxxl"].forEach(function(g){var f,u={},C=r[g];typeof C=="number"?u.span=C:y(C)==="object"&&(u=C||{}),p=G(G({},p),{},(f={},c(f,"".concat(a,"-").concat(g,"-").concat(u.span),u.span!==void 0),c(f,"".concat(a,"-").concat(g,"-order-").concat(u.order),u.order||u.order===0),c(f,"".concat(a,"-").concat(g,"-offset-").concat(u.offset),u.offset||u.offset===0),c(f,"".concat(a,"-").concat(g,"-push-").concat(u.push),u.push||u.push===0),c(f,"".concat(a,"-").concat(g,"-pull-").concat(u.pull),u.pull||u.pull===0),c(f,"".concat(a,"-rtl"),S.value==="rtl"),f))}),B(a,(e={},c(e,"".concat(a,"-").concat(t),t!==void 0),c(e,"".concat(a,"-order-").concat(n),n),c(e,"".concat(a,"-offset-").concat(s),s),c(e,"".concat(a,"-push-").concat(l),l),c(e,"".concat(a,"-pull-").concat(b),b),e),p)}),O=i(function(){var e=r.flex,t=d.value,n={};if(t&&t[0]>0){var s="".concat(t[0]/2,"px");n.paddingLeft=s,n.paddingRight=s}if(t&&t[1]>0&&!h.value){var l="".concat(t[1]/2,"px");n.paddingTop=l,n.paddingBottom=l}return e&&(n.flex=H(e),j.value===!1&&!n.minWidth&&(n.minWidth=0)),n});return function(){var e;return M("div",{class:R.value,style:O.value},[(e=m.default)===null||e===void 0?void 0:e.call(m)])}}});export{Z as C,Y as R};

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{d as x,$,aI as g,dl as b,r as w,S as p,T as d,U as a,c as r,a1 as i,V as u,W as n,X as I,a6 as B,a2 as m,x as V,y as _,z as v,ah as W,ai as D,dm as N,Z as R}from"./index-a0a34372.js";/* empty css */const F={class:"container"},L={class:"actions"},T={class:"uni-desc"},U={class:"snapshot"},q=x({__name:"index",props:{tabIdx:{},paneIdx:{},id:{},paneKey:{}},setup(z){const h=$(),t=g(),f=e=>{h.tabList=V(e.tabs)},k=b(async e=>{await N(`workspace_snapshot_${e.id}`),t.snapshots=t.snapshots.filter(c=>c.id!==e.id),_.success(v("deleteSuccess"))}),o=w(""),y=async()=>{if(!o.value){_.error(v("nameRequired"));return}const e=t.createSnapshot(o.value);await t.addSnapshot(e),_.success(v("saveCompleted"))};return(e,c)=>{const C=W,l=D;return p(),d("div",F,[a("div",L,[r(C,{value:o.value,"onUpdate:value":c[0]||(c[0]=s=>o.value=s),placeholder:e.$t("name"),style:{"max-width":"300px"}},null,8,["value","placeholder"]),r(l,{type:"primary",onClick:y},{default:i(()=>[u(n(e.$t("saveWorkspaceSnapshot")),1)]),_:1})]),a("p",T,n(e.$t("WorkspaceSnapshotDesc")),1),a("ul",U,[(p(!0),d(I,null,B(m(t).snapshots,s=>(p(),d("li",{key:s.id},[a("div",null,[a("span",null,n(s.name),1)]),a("div",null,[r(l,{onClick:S=>f(s)},{default:i(()=>[u(n(e.$t("restore")),1)]),_:2},1032,["onClick"]),r(l,{onClick:S=>m(k)(s)},{default:i(()=>[u(n(e.$t("remove")),1)]),_:2},1032,["onClick"])])]))),128))])])}}});const G=R(q,[["__scopeId","data-v-2c44013c"]]);export{G as default};
import{d as x,$,aI as g,dF as b,r as w,S as p,T as d,U as a,c as r,a1 as i,V as u,W as n,X as I,a6 as B,a2 as m,x as V,y as _,z as v,ah as W,ai as D,dG as F,Z as N}from"./index-ee40c384.js";/* empty css */const R={class:"container"},G={class:"actions"},L={class:"uni-desc"},T={class:"snapshot"},U=x({__name:"index",props:{tabIdx:{},paneIdx:{},id:{},paneKey:{}},setup(q){const h=$(),t=g(),f=e=>{h.tabList=V(e.tabs)},k=b(async e=>{await F(`workspace_snapshot_${e.id}`),t.snapshots=t.snapshots.filter(c=>c.id!==e.id),_.success(v("deleteSuccess"))}),o=w(""),y=async()=>{if(!o.value){_.error(v("nameRequired"));return}const e=t.createSnapshot(o.value);await t.addSnapshot(e),_.success(v("saveCompleted"))};return(e,c)=>{const C=W,l=D;return p(),d("div",R,[a("div",G,[r(C,{value:o.value,"onUpdate:value":c[0]||(c[0]=s=>o.value=s),placeholder:e.$t("name"),style:{"max-width":"300px"}},null,8,["value","placeholder"]),r(l,{type:"primary",onClick:y},{default:i(()=>[u(n(e.$t("saveWorkspaceSnapshot")),1)]),_:1})]),a("p",L,n(e.$t("WorkspaceSnapshotDesc")),1),a("ul",T,[(p(!0),d(I,null,B(m(t).snapshots,s=>(p(),d("li",{key:s.id},[a("div",null,[a("span",null,n(s.name),1)]),a("div",null,[r(l,{onClick:S=>f(s)},{default:i(()=>[u(n(e.$t("restore")),1)]),_:2},1032,["onClick"]),r(l,{onClick:S=>m(k)(s)},{default:i(()=>[u(n(e.$t("remove")),1)]),_:2},1032,["onClick"])])]))),128))])])}}});const E=N(U,[["__scopeId","data-v-2c44013c"]]);export{E 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{R as y,C as v}from"./index-cf912194.js";import{cn as f,c as d,A as P,d as w,S as o,T as c,U as r,X as S,a6 as O,aE as V,a1 as b,V as u,W as p,a2 as R,ai as $,Z as x,O as H,I as _,Q as m}from"./index-a0a34372.js";const A=f(y),E=f(v);var L={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M878.3 392.1L631.9 145.7c-6.5-6.5-15-9.7-23.5-9.7s-17 3.2-23.5 9.7L423.8 306.9c-12.2-1.4-24.5-2-36.8-2-73.2 0-146.4 24.1-206.5 72.3-15.4 12.3-16.6 35.4-2.7 49.4l181.7 181.7-215.4 215.2a15.8 15.8 0 00-4.6 9.8l-3.4 37.2c-.9 9.4 6.6 17.4 15.9 17.4.5 0 1 0 1.5-.1l37.2-3.4c3.7-.3 7.2-2 9.8-4.6l215.4-215.4 181.7 181.7c6.5 6.5 15 9.7 23.5 9.7 9.7 0 19.3-4.2 25.9-12.4 56.3-70.3 79.7-158.3 70.2-243.4l161.1-161.1c12.9-12.8 12.9-33.8 0-46.8z"}}]},name:"pushpin",theme:"filled"};const C=L;function h(t){for(var e=1;e<arguments.length;e++){var s=arguments[e]!=null?Object(arguments[e]):{},n=Object.keys(s);typeof Object.getOwnPropertySymbols=="function"&&(n=n.concat(Object.getOwnPropertySymbols(s).filter(function(i){return Object.getOwnPropertyDescriptor(s,i).enumerable}))),n.forEach(function(i){N(t,i,s[i])})}return t}function N(t,e,s){return e in t?Object.defineProperty(t,e,{value:s,enumerable:!0,configurable:!0,writable:!0}):t[e]=s,t}var l=function(e,s){var n=h({},e,s.attrs);return d(P,h({},n,{icon:C}),null)};l.displayName="PushpinFilled";l.inheritAttrs=!1;const z=l,F={class:"record-container"},I={style:{flex:"1"}},k={class:"rec-actions"},B=["onClick"],j=w({__name:"HistoryRecord",props:{records:{}},emits:["reuseRecord"],setup(t){return(e,s)=>{const n=$;return o(),c("div",null,[r("ul",F,[(o(!0),c(S,null,O(e.records.getRecords(),i=>(o(),c("li",{key:i.id,class:"record"},[r("div",I,[V(e.$slots,"default",{record:i},void 0,!0)]),r("div",k,[d(n,{onClick:g=>e.$emit("reuseRecord",i),type:"primary"},{default:b(()=>[u(p(e.$t("restore")),1)]),_:2},1032,["onClick"]),r("div",{class:"pin",onClick:g=>e.records.switchPin(i)},[d(R(z)),u(" "+p(e.records.isPinned(i)?e.$t("unpin"):e.$t("pin")),1)],8,B)])]))),128))])])}}});const T=x(j,[["__scopeId","data-v-834a248f"]]);class a{constructor(e=128,s=[],n=[]){this.maxLength=e,this.records=s,this.pinnedValues=n}isPinned(e){return this.pinnedValues.some(s=>s.id===e.id)}add(e){this.records.length>=this.maxLength&&this.records.pop(),this.records.unshift({...e,id:H()+Date.now(),time:new Date().toLocaleString()})}pin(e){const s=this.records.findIndex(n=>n.id===e.id);s!==-1&&this.records.splice(s,1),this.pinnedValues.push(e)}unpin(e){const s=this.pinnedValues.findIndex(n=>n.id===e.id);s!==-1&&this.pinnedValues.splice(s,1),this.records.unshift(e)}switchPin(e){this.isPinned(e)?this.unpin(e):this.pin(e)}getRecords(){return[...this.pinnedValues,...this.records]}getPinnedValues(){return this.pinnedValues}}const q=_(`${m}fuzzy-search-HistoryRecord`,new a,{serializer:{read:t=>{const e=JSON.parse(t);return new a(e.maxLength,e.records,e.pinnedValues)},write:JSON.stringify}}),M=_(`${m}tag-search-HistoryRecord`,new a,{serializer:{read:t=>{const e=JSON.parse(t);return new a(e.maxLength,e.records,e.pinnedValues)},write:JSON.stringify}});export{T as H,E as _,A as a,q as f,M as t};
import{R as y,C as v}from"./index-c6d986b5.js";import{cL as f,c as d,A as P,d as w,S as o,T as c,U as r,X as S,a6 as O,aE as V,a1 as b,V as u,W as p,a2 as R,ai as $,Z as L,O as x,I as _,Q as m}from"./index-ee40c384.js";const A=f(y),E=f(v);var H={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M878.3 392.1L631.9 145.7c-6.5-6.5-15-9.7-23.5-9.7s-17 3.2-23.5 9.7L423.8 306.9c-12.2-1.4-24.5-2-36.8-2-73.2 0-146.4 24.1-206.5 72.3-15.4 12.3-16.6 35.4-2.7 49.4l181.7 181.7-215.4 215.2a15.8 15.8 0 00-4.6 9.8l-3.4 37.2c-.9 9.4 6.6 17.4 15.9 17.4.5 0 1 0 1.5-.1l37.2-3.4c3.7-.3 7.2-2 9.8-4.6l215.4-215.4 181.7 181.7c6.5 6.5 15 9.7 23.5 9.7 9.7 0 19.3-4.2 25.9-12.4 56.3-70.3 79.7-158.3 70.2-243.4l161.1-161.1c12.9-12.8 12.9-33.8 0-46.8z"}}]},name:"pushpin",theme:"filled"};const C=H;function h(t){for(var e=1;e<arguments.length;e++){var s=arguments[e]!=null?Object(arguments[e]):{},n=Object.keys(s);typeof Object.getOwnPropertySymbols=="function"&&(n=n.concat(Object.getOwnPropertySymbols(s).filter(function(i){return Object.getOwnPropertyDescriptor(s,i).enumerable}))),n.forEach(function(i){N(t,i,s[i])})}return t}function N(t,e,s){return e in t?Object.defineProperty(t,e,{value:s,enumerable:!0,configurable:!0,writable:!0}):t[e]=s,t}var l=function(e,s){var n=h({},e,s.attrs);return d(P,h({},n,{icon:C}),null)};l.displayName="PushpinFilled";l.inheritAttrs=!1;const z=l,F={class:"record-container"},I={style:{flex:"1"}},k={class:"rec-actions"},B=["onClick"],j=w({__name:"HistoryRecord",props:{records:{}},emits:["reuseRecord"],setup(t){return(e,s)=>{const n=$;return o(),c("div",null,[r("ul",F,[(o(!0),c(S,null,O(e.records.getRecords(),i=>(o(),c("li",{key:i.id,class:"record"},[r("div",I,[V(e.$slots,"default",{record:i},void 0,!0)]),r("div",k,[d(n,{onClick:g=>e.$emit("reuseRecord",i),type:"primary"},{default:b(()=>[u(p(e.$t("restore")),1)]),_:2},1032,["onClick"]),r("div",{class:"pin",onClick:g=>e.records.switchPin(i)},[d(R(z)),u(" "+p(e.records.isPinned(i)?e.$t("unpin"):e.$t("pin")),1)],8,B)])]))),128))])])}}});const T=L(j,[["__scopeId","data-v-834a248f"]]);class a{constructor(e=128,s=[],n=[]){this.maxLength=e,this.records=s,this.pinnedValues=n}isPinned(e){return this.pinnedValues.some(s=>s.id===e.id)}add(e){this.records.length>=this.maxLength&&this.records.pop(),this.records.unshift({...e,id:x()+Date.now(),time:new Date().toLocaleString()})}pin(e){const s=this.records.findIndex(n=>n.id===e.id);s!==-1&&this.records.splice(s,1),this.pinnedValues.push(e)}unpin(e){const s=this.pinnedValues.findIndex(n=>n.id===e.id);s!==-1&&this.pinnedValues.splice(s,1),this.records.unshift(e)}switchPin(e){this.isPinned(e)?this.unpin(e):this.pin(e)}getRecords(){return[...this.pinnedValues,...this.records]}getPinnedValues(){return this.pinnedValues}}const q=_(`${m}fuzzy-search-HistoryRecord`,new a,{serializer:{read:t=>{const e=JSON.parse(t);return new a(e.maxLength,e.records,e.pinnedValues)},write:JSON.stringify}}),M=_(`${m}tag-search-HistoryRecord`,new a,{serializer:{read:t=>{const e=JSON.parse(t);return new a(e.maxLength,e.records,e.pinnedValues)},write:JSON.stringify}});export{T as H,E as _,A as a,q as f,M as t};

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/stackView-ac967506.js vendored Normal file

File diff suppressed because one or more lines are too long

2
vue/dist/index.html vendored
View File

@ -7,7 +7,7 @@
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Infinite Image Browsing</title>
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-a0a34372.js"></script>
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-ee40c384.js"></script>
<link rel="stylesheet" href="/infinite_image_browsing/fe-static/assets/index-c05ac913.css">
</head>

View File

@ -28,6 +28,7 @@
"vue": "^3.3.4",
"vue-diff": "^1.2.4",
"vue-i18n": "^9.3.0-beta.19",
"vue3-colorpicker": "^2.3.0",
"vue3-ts-util": "^1.0.4"
},
"devDependencies": {

View File

@ -8,6 +8,7 @@ export interface Tag {
id: number | string
display_name: string | null
type: string
color: string
count: number
}
@ -31,6 +32,11 @@ export const getExpiredDirs = async () => {
export const updateImageData = async () => {
await axiosInst.value.post('/db/update_image_data', {}, { timeout: Infinity })
}
export const updateTag = async (tag: Tag) => {
await axiosInst.value.post('/db/update_tag', tag)
}
export type TagId = number | string
export interface MatchImageByTagsReq {
folder_paths_str?: string

View File

@ -145,7 +145,7 @@ const minShowDetailWidth = 160
onVisibleChange: (v: boolean, lv: boolean) => emit('previewVisibleChange', v, lv)
}" />
<div class="tags-container" v-if="customTags && cellWidth > minShowDetailWidth">
<a-tag v-for="tag in extraTags ?? customTags" :key="tag.id" :color="tagStore.getColor(tag.name)">
<a-tag v-for="tag in extraTags ?? customTags" :key="tag.id" :color="tagStore.getColor(tag)">
{{ tag.name }}
</a-tag>
</div>
@ -158,7 +158,7 @@ const minShowDetailWidth = 160
<img :src="play" style="width: 40px;height: 40px;">
</div>
<div class="tags-container" v-if="customTags && cellWidth > minShowDetailWidth">
<a-tag v-for="tag in customTags" :key="tag.id" :color="tagStore.getColor(tag.name)">
<a-tag v-for="tag in customTags" :key="tag.id" :color="tagStore.getColor(tag)">
{{ tag.name }}
</a-tag>
</div>

View File

@ -95,9 +95,9 @@ export const openVideoModal = (file: FileNodeInfo, onTagClick?: (id: string| num
</div>
{global.conf!.all_custom_tags.map((tag) =>
<div key={tag.id} onClick={() => onTagClick?.(tag.id)} style={{
background: isSelected(tag.id) ? tagStore.getColor(tag.name) : 'var(--zp-primary-background)',
color: !isSelected(tag.id) ? tagStore.getColor(tag.name) : 'white',
border: `2px solid ${tagStore.getColor(tag.name)}`,
background: isSelected(tag.id) ? tagStore.getColor(tag) : 'var(--zp-primary-background)',
color: !isSelected(tag.id) ? tagStore.getColor(tag) : 'white',
border: `2px solid ${tagStore.getColor(tag)}`,
...tagBaseStyle
}}>
{ tag.name }

View File

@ -9,7 +9,8 @@ import {
removeCustomTag,
getExpiredDirs,
type MatchImageByTagsReq,
type TagId
type TagId,
updateTag
} from '@/api/db'
import { SearchSelect, delay } from 'vue3-ts-util'
import { PlusOutlined, ArrowRightOutlined } from '@/icon'
@ -23,9 +24,11 @@ import TagSearchItem from './TagSearchItem.vue'
import { reactive, nextTick } from 'vue'
import { watch } from 'vue'
import { tagSearchHistory } from '@/store/searchHistory'
import { useTagStore } from '@/store/useTagStore'
const props = defineProps<{ tabIdx: number; paneIdx: number, searchScope?: string }>()
const global = useGlobalStore()
const tagStore = useTagStore()
const queue = createReactiveQueue()
const loading = computed(() => !queue.isIdle)
const info = ref<DataBaseBasicInfo>()
@ -181,6 +184,13 @@ const toggleTag = (tag_id: TagId, taglist: TagId[]) => {
} else {
taglist.splice(idx, 1)
}
}
const onTagColorChange = async (tag: Tag, color: string) => {
tag.color = color
tagStore.notifyCacheUpdate(tag)
await updateTag(tag)
}
const tagListFilter = (list: Tag[], name: string) => {
@ -286,6 +296,7 @@ const tagIdsToString = (tagIds: TagId[]) => {
<template #expandIcon></template>
<a-collapse-panel :key="name">
<tag-search-item @click="onTagClick(tag)" @remove="onTagRemoveClick(tag.id)"
@TagColorChange="onTagColorChange(tag, $event)"
@toggle-and="toggleTag(tag.id, matchIds.and_tags)" @toggle-or="toggleTag(tag.id, matchIds.or_tags)"
@toggle-not="toggleTag(tag.id, matchIds.not_tags)" v-for="(tag, idx) in tagListFilter(list, name)"
:key="tag.id" :idx="idx" :name="name" :tag="tag" :selected="selectedTagIds.has(tag.id)" />

View File

@ -8,12 +8,17 @@
<div @click="$emit('toggleNot')">{{ $t('exclude')
}}</div>
</div>
<li class="tag" :title="toTagDisplayName(tag)" :class="{ selected }" @click="$emit('click')">
<li class="tag" :title="toTagDisplayName(tag)"
:class="{ selected }" @click="$emit('click')">
<div style="width: 24px;height: 24px;overflow: hidden;border-radius: 6px; margin-right: 8px;" @click.stop>
<ColorPicker v-if="isCustomTag" :pureColor="tagStore.getColor(tag)" @update:pureColor="onTagColorChange" />
</div>
<CheckOutlined v-if="selected" />
<div class="tag-name">
{{ toTagDisplayName(tag) }}
</div>
<span v-if="name === 'custom' && idx !== 0" class="remove" @click.capture.stop="$emit('remove')">
<span v-if="isCustomTag && idx !== 0" class="remove" @click.capture.stop="$emit('remove')">
<CloseOutlined />
</span>
</li>
@ -25,15 +30,29 @@ import { CheckOutlined, CloseOutlined } from '@/icon'
import {
type Tag,
} from '@/api/db'
defineProps<{
import { ColorPicker } from 'vue3-colorpicker'
import 'vue3-colorpicker/style.css'
import { useTagStore } from '@/store/useTagStore'
import { computed } from 'vue'
const tagStore = useTagStore()
const onTagColorChange = (color: string) => {
emit('tagColorChange', color)
}
const props = defineProps<{
tag: Tag,
name: string,
selected: boolean,
idx: number
}>()
defineEmits(['remove', 'toggleAnd', 'toggleNot', 'toggleOr', 'click'])
const isCustomTag = computed(() => props.name === 'custom')
const emit = defineEmits(['remove', 'toggleAnd', 'toggleNot', 'toggleOr', 'click', 'tagColorChange'])
const toTagDisplayName = (v: Tag, withType = false) =>
(withType ? `[${v.type}] ` : '') + (v.display_name ? `${v.display_name} : ${v.name}` : v.name)
</script>
<style lang="scss" scoped>
.tag-wrap {
@ -61,7 +80,8 @@ const toTagDisplayName = (v: Tag, withType = false) =>
align-items: center;
justify-content: space-between;
flex-direction: row;
gap: 4px ;
gap: 4px;
&.selected {
color: var(--primary-color);
border: 2px solid var(--primary-color);

View File

@ -307,7 +307,7 @@ const showFullContent = computed(() => lr.value || state.value.expanded)
<div class="tag" v-for="tag in global.conf.all_custom_tags"
@click="emit('contextMenuClick', { key: `toggle-tag-${tag.id}` } as any, file, idx)"
:class="{ selected: selectedTag.some(v => v.id === tag.id) }" :key="tag.id"
:style="{ '--tag-color': tagStore.getColor(tag.name) }">
:style="{ '--tag-color': tagStore.getColor(tag) }">
{{ tag.name }}
</div>
</div>

View File

@ -1,7 +1,7 @@
import { Tag, batchGetTagsByPath } from '@/api/db'
import { defineStore } from 'pinia'
import sjcl from 'sjcl'
import { reactive } from 'vue'
import { reactive, ref } from 'vue'
import type { GridViewFileTag } from './useGlobalStore'
function generateColors() {
const colors = []
@ -36,14 +36,28 @@ export const useTagStore = defineStore('useTagStore', () => {
paths.forEach((v) => tagMap.delete(v))
}
}
const colorCache = new Map<string, string>()
const getColor = (tag: string) => {
let color = colorCache.get(tag)
const colorCache = ref(new Map<string, string>())
const notifyCacheUpdate = (updateTag?: Tag) => {
// colorCache.value = cloneDeep(colorCache.value)
if (updateTag) {
colorCache.value.set(updateTag.id.toString(), updateTag.color)
}
}
const getColor = (tag: Tag) => {
const idStr = tag.id.toString()
let color = colorCache.value.get(idStr)
if (color) {
return color
}
if (!color && tag.color) {
colorCache.value.set(idStr, tag.color)
return tag.color
}
if (!color) {
const hash = sjcl.hash.sha256.hash(tag)
const hash = sjcl.hash.sha256.hash(idStr)
const num = parseInt(sjcl.codec.hex.fromBits(hash), 16) % tagColors.length
color = tagColors[num]
colorCache.set(tag, color)
colorCache.value.set(idStr, color)
}
return color
}
@ -56,6 +70,7 @@ export const useTagStore = defineStore('useTagStore', () => {
count: 0,
display_name: null,
type: 'temp',
color: '',
...tag
})
const set = (path: string, tags: (string|Tag| GridViewFileTag)[]) => {
@ -69,6 +84,7 @@ export const useTagStore = defineStore('useTagStore', () => {
getColor,
fetchImageTags,
refreshTags,
tagConvert
tagConvert,
notifyCacheUpdate
}
})

View File

@ -2,6 +2,11 @@
# yarn lockfile v1
"@aesoper/normal-utils@^0.1.5":
version "0.1.5"
resolved "https://registry.yarnpkg.com/@aesoper/normal-utils/-/normal-utils-0.1.5.tgz#82b7c899ab9670c55515f949a3766d24260b8039"
integrity sha512-LFF/6y6h5mfwhnJaWqqxuC8zzDaHCG62kMRkd8xhDtq62TQj9dM17A9DhE87W7DhiARJsHLgcina/9P4eNCN1w==
"@ampproject/remapping@^2.2.0":
version "2.2.1"
resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630"
@ -698,6 +703,11 @@
dependencies:
"@octokit/openapi-types" "^22.2.0"
"@popperjs/core@^2.11.8":
version "2.11.8"
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f"
integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
"@rollup/pluginutils@^5.0.2":
version "5.0.2"
resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz"
@ -1871,6 +1881,11 @@ graceful-fs@^4.1.2:
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
gradient-parser@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/gradient-parser/-/gradient-parser-1.0.2.tgz#d283b80390386e2613c992bb0e5abb259aedf25f"
integrity sha512-gR6nY33xC9yJoH4wGLQtZQMXDi6RI3H37ERu7kQCVUzlXjNedpZM7xcA489Opwbq0BSGohtWGsWsntupmxelMg==
grapheme-splitter@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
@ -2002,6 +2017,11 @@ is-plain-object@3.0.1:
resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz"
integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==
is-plain-object@5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344"
integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
is-what@^3.14.1:
version "3.14.1"
resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1"
@ -2598,6 +2618,11 @@ text-table@^0.2.0:
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
tinycolor2@^1.4.2:
version "1.6.0"
resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e"
integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==
to-fast-properties@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
@ -2800,6 +2825,26 @@ vue-types@^3.0.0:
dependencies:
is-plain-object "3.0.1"
vue-types@^4.1.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/vue-types/-/vue-types-4.2.1.tgz#f8f7e5fb42d4a6acda6d92c9736b510e5534c753"
integrity sha512-DNQZmJuOvovLUIp0BENRkdnZHbI0V4e2mNvjAZOAXKD56YGvRchtUYOXA/XqTxdv7Ng5SJLZqRKRpAhm5NLaPQ==
dependencies:
is-plain-object "5.0.0"
vue3-colorpicker@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/vue3-colorpicker/-/vue3-colorpicker-2.3.0.tgz#3b81a9254f69db054f54780e0394faa6156e1653"
integrity sha512-e3lLmBcy7mkRrNQVeUny1DjOd6E11L8H5ok5Bx4MdXmrG+RzyacRF7KkhrEWmRYPhKAsaoUrWsFkmpPAaYnE5A==
dependencies:
"@aesoper/normal-utils" "^0.1.5"
"@popperjs/core" "^2.11.8"
"@vueuse/core" "^10.1.2"
gradient-parser "^1.0.2"
lodash-es "^4.17.21"
tinycolor2 "^1.4.2"
vue-types "^4.1.0"
vue3-ts-util@^1.0.4:
version "1.0.4"
resolved "https://registry.npmjs.org/vue3-ts-util/-/vue3-ts-util-1.0.4.tgz"