feat: add tips carousel component with 10 multilingual tips
- Add TipsCarousel component with random shuffling (Fisher-Yates) - Display 10 tips in 4 languages (zh-hans, en, zh-hant, de) - Tips include filename uniqueness, batch operations, shortcuts, AI clustering, fuzzy search regex, walk mode, workspace snapshots, auto-tagging, performance optimization, and AI agent integration - Integrate TipsCarousel into TagSearch and SubstrSearch pages - Auto-rotate every 10 seconds with smooth fade transitions - Support dismissing warning tips via localStorage - Compact horizontal layout for minimal space usage Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>pull/926/head
parent
6a98bcb429
commit
5e061010b8
|
|
@ -13,7 +13,7 @@ Promise.resolve().then(async () => {
|
||||||
<link rel="icon" href="/favicon.ico" />
|
<link rel="icon" href="/favicon.ico" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Infinite Image Browsing</title>
|
<title>Infinite Image Browsing</title>
|
||||||
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-5573ae38.js"></script>
|
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-32743103.js"></script>
|
||||||
<link rel="stylesheet" href="/infinite_image_browsing/fe-static/assets/index-dd273d5b.css">
|
<link rel="stylesheet" href="/infinite_image_browsing/fe-static/assets/index-dd273d5b.css">
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -62,5 +62,6 @@ declare module '@vue/runtime-core' {
|
||||||
RouterLink: typeof import('vue-router')['RouterLink']
|
RouterLink: typeof import('vue-router')['RouterLink']
|
||||||
RouterView: typeof import('vue-router')['RouterView']
|
RouterView: typeof import('vue-router')['RouterView']
|
||||||
SmartOrganizeConfigModal: typeof import('./src/components/SmartOrganizeConfigModal.vue')['default']
|
SmartOrganizeConfigModal: typeof import('./src/components/SmartOrganizeConfigModal.vue')['default']
|
||||||
|
TipsCarousel: typeof import('./src/components/TipsCarousel.vue')['default']
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1 +1 @@
|
||||||
import{d as a,o as t,j as n,c as s,c0 as _,n as o}from"./index-5573ae38.js";const c={class:"img-sli-container"},i=a({__name:"ImgSliPagePane",props:{paneIdx:{},tabIdx:{},left:{},right:{}},setup(l){return(e,r)=>(t(),n("div",c,[s(_,{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,o as t,j as n,c as s,c1 as _,n as o}from"./index-32743103.js";const c={class:"img-sli-container"},i=a({__name:"ImgSliPagePane",props:{paneIdx:{},tabIdx:{},left:{},right:{}},setup(l){return(e,r)=>(t(),n("div",c,[s(_,{left:e.left,right:e.right},null,8,["left","right"])]))}});const d=o(i,[["__scopeId","data-v-ae3fb9a8"]]);export{d as default};
|
||||||
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
|
|
@ -0,0 +1 @@
|
||||||
|
[data-v-4584136c] .float-panel{position:fixed}.regex-icon[data-v-4584136c]{user-select:none;padding:4px;margin:0 4px;cursor:pointer;border:1px solid var(--zp-border);border-radius:4px}.regex-icon img[data-v-4584136c]{height:1.5em}.regex-icon[data-v-4584136c]:hover{background:var(--zp-border)}.regex-icon.selected[data-v-4584136c]{background:var(--primary-color-1);border:1px solid var(--primary-color)}.search-bar[data-v-4584136c]{padding:8px 8px 0;display:flex}.search-bar.last[data-v-4584136c]{padding-bottom:8px}.search-bar .form-name[data-v-4584136c]{flex-shrink:0;padding:4px 8px}.search-bar .actions>*[data-v-4584136c]{margin-right:4px}.tips-wrapper[data-v-4584136c]{padding:0 8px}.container[data-v-4584136c]{background:var(--zp-secondary-background);position:relative}.container .file-list[data-v-4584136c]{list-style:none;padding:8px;height:100%;overflow:auto;height:var(--pane-max-height);width:100%}
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
||||||
[data-v-3d50503a] .float-panel{position:fixed}.regex-icon[data-v-3d50503a]{user-select:none;padding:4px;margin:0 4px;cursor:pointer;border:1px solid var(--zp-border);border-radius:4px}.regex-icon img[data-v-3d50503a]{height:1.5em}.regex-icon[data-v-3d50503a]:hover{background:var(--zp-border)}.regex-icon.selected[data-v-3d50503a]{background:var(--primary-color-1);border:1px solid var(--primary-color)}.search-bar[data-v-3d50503a]{padding:8px 8px 0;display:flex}.search-bar.last[data-v-3d50503a]{padding-bottom:8px}.search-bar .form-name[data-v-3d50503a]{flex-shrink:0;padding:4px 8px}.search-bar .actions>*[data-v-3d50503a]{margin-right:4px}.container[data-v-3d50503a]{background:var(--zp-secondary-background);position:relative}.container .file-list[data-v-3d50503a]{list-style:none;padding:8px;height:100%;overflow:auto;height:var(--pane-max-height);width:100%}
|
|
||||||
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
|
|
@ -0,0 +1 @@
|
||||||
|
[data-v-834a248f] .ant-row .ant-col:nth-child(1){font-weight:700}.record-container[data-v-834a248f]{list-style:none;padding:8px;margin:16px;max-height:50vh;overflow:auto}.record[data-v-834a248f]{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:10px;border-bottom:1px solid var(--zp-tertiary);position:relative;flex-wrap:nowrap;transition:all .3s ease}.record[data-v-834a248f]:hover{background:var(--zp-secondary-background)}.record .rec-actions[data-v-834a248f]{user-select:none;display:flex;gap:8px}.record .pin[data-v-834a248f]{cursor:pointer;padding:4px 8px;border-radius:4px;transition:all .3s ease}.record .pin[data-v-834a248f]:hover{background:var(--zp-primary-background)}.tips-carousel[data-v-3b5692ee]{padding:6px 10px;border-radius:6px;background:rgba(0,0,0,.02);border:1px solid rgba(0,0,0,.06)}.tip-content[data-v-3b5692ee]{display:flex;flex-direction:row;gap:6px;align-items:flex-start;text-align:left}.tip-tag[data-v-3b5692ee]{font-weight:500;flex-shrink:0;font-size:11px;padding:0 4px;line-height:18px}.tip-text[data-v-3b5692ee]{margin:0;font-size:12px;line-height:18px;color:#000000a6;flex:1}.tip-actions[data-v-3b5692ee]{align-self:flex-start;margin-top:0;margin-left:auto}.tip-actions[data-v-3b5692ee] .ant-btn{padding:0 4px;font-size:11px;height:20px}.tip-fade-enter-active[data-v-3b5692ee],.tip-fade-leave-active[data-v-3b5692ee]{transition:all .3s cubic-bezier(.4,0,.2,1)}.tip-fade-enter-from[data-v-3b5692ee]{opacity:0;transform:translateY(5px)}.tip-fade-leave-to[data-v-3b5692ee]{opacity:0;transform:translateY(-5px)}html.dark .tips-carousel[data-v-3b5692ee]{background:rgba(255,255,255,.05);border-color:#ffffff1a}html.dark .tip-text[data-v-3b5692ee]{color:#ffffffa6}
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
import{bJ as N,bK as E,bL as q,c as u,A as U,d as R,o as d,j as p,k as _,F as X,K as G,ah as K,C as f,l as g,t as h,E as L,a3 as H,n as z,aq as Q,aC as C,aD as F,r as W,aj as I,X as V,v as Y,bM as Z,m as T,bN as ee,bO as te}from"./index-32743103.js";const ge=N(E),me=N(q);var ne={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 se=ne;function k(i){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?Object(arguments[e]):{},n=Object.keys(t);typeof Object.getOwnPropertySymbols=="function"&&(n=n.concat(Object.getOwnPropertySymbols(t).filter(function(s){return Object.getOwnPropertyDescriptor(t,s).enumerable}))),n.forEach(function(s){ie(i,s,t[s])})}return i}function ie(i,e,t){return e in i?Object.defineProperty(i,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):i[e]=t,i}var P=function(e,t){var n=k({},e,t.attrs);return u(U,k({},n,{icon:se}),null)};P.displayName="PushpinFilled";P.inheritAttrs=!1;const re=P,ae={class:"record-container"},oe={style:{flex:"1"}},ce={class:"rec-actions"},le=["onClick"],ue=R({__name:"HistoryRecord",props:{records:{}},emits:["reuseRecord"],setup(i){return(e,t)=>{const n=H;return d(),p("div",null,[_("ul",ae,[(d(!0),p(X,null,G(e.records.getRecords(),s=>(d(),p("li",{key:s.id,class:"record"},[_("div",oe,[K(e.$slots,"default",{record:s},void 0,!0)]),_("div",ce,[u(n,{onClick:o=>e.$emit("reuseRecord",s),type:"primary"},{default:f(()=>[g(h(e.$t("restore")),1)]),_:2},1032,["onClick"]),_("div",{class:"pin",onClick:o=>e.records.switchPin(s)},[u(L(re)),g(" "+h(e.records.isPinned(s)?e.$t("unpin"):e.$t("pin")),1)],8,le)])]))),128))])])}}});const ve=z(ue,[["__scopeId","data-v-834a248f"]]);class m{constructor(e=128,t=[],n=[]){this.maxLength=e,this.records=t,this.pinnedValues=n}isPinned(e){return this.pinnedValues.some(t=>t.id===e.id)}add(e){this.records.length>=this.maxLength&&this.records.pop(),this.records.unshift({...e,id:Q()+Date.now(),time:new Date().toLocaleString()})}pin(e){const t=this.records.findIndex(n=>n.id===e.id);t!==-1&&this.records.splice(t,1),this.pinnedValues.push(e)}unpin(e){const t=this.pinnedValues.findIndex(n=>n.id===e.id);t!==-1&&this.pinnedValues.splice(t,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 ye=C(`${F}fuzzy-search-HistoryRecord`,new m,{serializer:{read:i=>{const e=JSON.parse(i);return new m(e.maxLength,e.records,e.pinnedValues)},write:JSON.stringify}}),be=C(`${F}tag-search-HistoryRecord`,new m,{serializer:{read:i=>{const e=JSON.parse(i);return new m(e.maxLength,e.records,e.pinnedValues)},write:JSON.stringify}}),de={key:0,class:"tips-carousel"},pe={class:"tip-text"},_e={key:0,class:"tip-actions"},he=R({__name:"TipsCarousel",props:{interval:{type:Number,default:1e4}},setup(i){const e=i,t=C("iib-dismissed-tips-v2",{}),n=W(0);let s=null;const o=I(()=>{var v;const r=[];for(let a=1;a<=10;a++){const l=`loadingTip${a}`,y=V(l);if(!y||typeof y!="string")continue;const $=y.split("|"),b=$[0],M=((v=$[1])==null?void 0:v.trim())||"info",S=`
|
||||||
|
|
||||||
|
`,w=b.indexOf(S);if(w===-1)continue;const x=b.substring(0,w).trim(),A=b.substring(w+S.length).trim(),O={title:x,content:A,type:M};O.type==="warning"&&t.value[x]||r.push(O)}for(let a=r.length-1;a>0;a--){const l=Math.floor(Math.random()*(a+1));[r[a],r[l]]=[r[l],r[a]]}return r}),c=I(()=>{const r=o.value;return r.length===0?{title:"",content:"",type:"info"}:r[n.value%r.length]}),j=r=>{switch(r){case"warning":return"warning";case"info":return"blue";case"tip":return"green";default:return"default"}},B=()=>{c.value.type==="warning"&&(t.value={...t.value,[c.value.title]:!0})},D=()=>{s&&clearInterval(s),s=setInterval(()=>{o.value.length>1&&(n.value=(n.value+1)%o.value.length)},e.interval)},J=()=>{s&&(clearInterval(s),s=null)};return Y(()=>{D()}),Z(()=>{J()}),(r,v)=>{const a=te,l=H;return o.value.length>0?(d(),p("div",de,[u(ee,{name:"tip-fade",mode:"out-in"},{default:f(()=>[(d(),p("div",{key:n.value,class:"tip-content"},[u(a,{color:j(c.value.type),class:"tip-tag"},{default:f(()=>[g(h(c.value.title),1)]),_:1},8,["color"]),_("span",pe,h(c.value.content),1),c.value.type==="warning"?(d(),p("div",_e,[u(l,{size:"small",type:"link",onClick:B},{default:f(()=>[g(h(L(V)("dontShowAgain")),1)]),_:1})])):T("",!0)]))]),_:1})])):T("",!0)}}});const we=z(he,[["__scopeId","data-v-3b5692ee"]]);export{ve as H,we as T,me as _,ge as a,ye as f,be as t};
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import{d as LA,r as Kt,aj as Rr,X as Ut,s as gs,x as Dh,v as IA,bM as zk,o as te,j as Ce,c as Ht,k as Mt,t as Vt,E as ve,C as le,l as ze,bC as PA,B as Ka,bN as Vk,bO as Gk,m as fr,W as Jr,bP as Fk,a8 as RA,av as kA,bQ as EA,bR as Hk,a0 as OA,a2 as NA,bS as BA,a3 as zA,aw as VA,ax as GA,bT as Wk,n as FA,p as $k,aC as H_,bU as Uk,T as Yk,F as W_,K as Zk,bV as Xk,bW as qk,bX as Kk,bt as jk,bY as Jk,bZ as Qk,aq as Ro,b_ as tE,a6 as eE,Z as rE,b$ as aE}from"./index-5573ae38.js";/* empty css *//* empty css *//*! *****************************************************************************
|
import{d as LA,r as Kt,aj as Rr,X as Ut,s as gs,x as Dh,v as IA,bM as zk,o as te,j as Ce,c as Ht,k as Mt,t as Vt,E as ve,C as le,l as ze,bC as PA,B as Ka,bP as Vk,bQ as Gk,m as fr,W as Jr,bR as Fk,a8 as RA,av as kA,bO as EA,bS as Hk,a0 as OA,a2 as NA,bT as BA,a3 as zA,aw as VA,ax as GA,bU as Wk,n as FA,p as $k,aC as H_,bV as Uk,T as Yk,F as W_,K as Zk,bW as Xk,bX as qk,bY as Kk,bt as jk,bZ as Jk,b_ as Qk,aq as Ro,b$ as tE,a6 as eE,Z as rE,c0 as aE}from"./index-32743103.js";/* empty css *//* empty css *//*! *****************************************************************************
|
||||||
Copyright (c) Microsoft Corporation.
|
Copyright (c) Microsoft Corporation.
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
|
@ -1 +1 @@
|
||||||
import{b2 as i,aO as t,dI as f,aS as n}from"./index-5573ae38.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};
|
import{b2 as i,aO as t,dJ as f,aS as n}from"./index-32743103.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};
|
||||||
|
|
@ -1 +1 @@
|
||||||
import{d as z,p as B,c1 as $,bp as S,o as _,j as w,k as f,c as l,C as d,l as p,t as c,E as s,B as A,U as E,c2 as R,c3 as y,W as x,X as T,a3 as U,a6 as V,n as N}from"./index-5573ae38.js";import{F as j,s as L}from"./FileItem-ab6bf09c.js";import{u as H,b as O,j as W}from"./index-de6cda7b.js";import"./index-5e569728.js";import"./shortcut-f44c6c9d.js";import"./_isIterateeCall-bb321415.js";const q={class:"actions-panel actions"},G={class:"item"},P={key:0,class:"file-list"},Q={class:"hint"},X=z({__name:"batchDownload",props:{tabIdx:{},paneIdx:{},id:{}},setup(J){const{stackViewEl:b}=H().toRefs(),{itemSize:h,gridItems:D,cellWidth:g}=O(),i=B(),m=W(),{selectdFiles:a}=$(m),r=S(),v=async e=>{const t=R(e);t&&m.addFiles(t.nodes)},C=async()=>{r.pushAction(async()=>{const e=await y.value.post("/zip",{paths:a.value.map(u=>u.fullpath),compress:i.batchDownloadCompress,pack_only:!1},{responseType:"blob"}),t=window.URL.createObjectURL(new Blob([e.data])),o=document.createElement("a");o.href=t,o.setAttribute("download",`iib_${new Date().toLocaleString()}.zip`),document.body.appendChild(o),o.click()})},I=async()=>{r.pushAction(async()=>{await y.value.post("/zip",{paths:a.value.map(e=>e.fullpath),compress:i.batchDownloadCompress,pack_only:!0},{responseType:"blob"}),x.success(T("success"))})},F=e=>{a.value.splice(e,1)};return(e,t)=>{const o=U,u=V;return _(),w("div",{class:"container",ref_key:"stackViewEl",ref:b,onDrop:v},[f("div",q,[l(o,{onClick:t[0]||(t[0]=n=>s(m).selectdFiles=[])},{default:d(()=>[p(c(e.$t("clear")),1)]),_:1}),f("div",G,[p(c(e.$t("compressFile"))+": ",1),l(u,{checked:s(i).batchDownloadCompress,"onUpdate:checked":t[1]||(t[1]=n=>s(i).batchDownloadCompress=n)},null,8,["checked"])]),l(o,{onClick:I,type:"primary",loading:!s(r).isIdle},{default:d(()=>[p(c(e.$t("packOnlyNotDownload")),1)]),_:1},8,["loading"]),l(o,{onClick:C,type:"primary",loading:!s(r).isIdle},{default:d(()=>[p(c(e.$t("zipDownload")),1)]),_:1},8,["loading"])]),s(a).length?(_(),A(s(L),{key:1,ref:"scroller",class:"file-list",items:s(a).slice(),"item-size":s(h).first,"key-field":"fullpath","item-secondary-size":s(h).second,gridItems:s(D)},{default:d(({item:n,index:k})=>[l(j,{idx:k,file:n,"cell-width":s(g),"enable-close-icon":"",onCloseIconClick:K=>F(k),"full-screen-preview-image-url":s(E)(n),"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"])):(_(),w("div",P,[f("p",Q,c(e.$t("batchDownloaDDragAndDropHint")),1)]))],544)}}});const oe=N(X,[["__scopeId","data-v-a2642a17"]]);export{oe as default};
|
import{d as z,p as B,c2 as $,bp as S,o as _,j as w,k as f,c as l,C as d,l as p,t as c,E as s,B as A,U as E,c3 as R,c4 as y,W as x,X as T,a3 as U,a6 as V,n as N}from"./index-32743103.js";import{F as j,s as L}from"./FileItem-aa47825a.js";import{u as H,b as O,j as W}from"./index-c80754a2.js";import"./index-e1a70e12.js";import"./shortcut-3129f75b.js";import"./_isIterateeCall-16c5cf9c.js";const q={class:"actions-panel actions"},G={class:"item"},P={key:0,class:"file-list"},Q={class:"hint"},X=z({__name:"batchDownload",props:{tabIdx:{},paneIdx:{},id:{}},setup(J){const{stackViewEl:b}=H().toRefs(),{itemSize:h,gridItems:D,cellWidth:g}=O(),i=B(),m=W(),{selectdFiles:a}=$(m),r=S(),v=async e=>{const t=R(e);t&&m.addFiles(t.nodes)},C=async()=>{r.pushAction(async()=>{const e=await y.value.post("/zip",{paths:a.value.map(u=>u.fullpath),compress:i.batchDownloadCompress,pack_only:!1},{responseType:"blob"}),t=window.URL.createObjectURL(new Blob([e.data])),o=document.createElement("a");o.href=t,o.setAttribute("download",`iib_${new Date().toLocaleString()}.zip`),document.body.appendChild(o),o.click()})},I=async()=>{r.pushAction(async()=>{await y.value.post("/zip",{paths:a.value.map(e=>e.fullpath),compress:i.batchDownloadCompress,pack_only:!0},{responseType:"blob"}),x.success(T("success"))})},F=e=>{a.value.splice(e,1)};return(e,t)=>{const o=U,u=V;return _(),w("div",{class:"container",ref_key:"stackViewEl",ref:b,onDrop:v},[f("div",q,[l(o,{onClick:t[0]||(t[0]=n=>s(m).selectdFiles=[])},{default:d(()=>[p(c(e.$t("clear")),1)]),_:1}),f("div",G,[p(c(e.$t("compressFile"))+": ",1),l(u,{checked:s(i).batchDownloadCompress,"onUpdate:checked":t[1]||(t[1]=n=>s(i).batchDownloadCompress=n)},null,8,["checked"])]),l(o,{onClick:I,type:"primary",loading:!s(r).isIdle},{default:d(()=>[p(c(e.$t("packOnlyNotDownload")),1)]),_:1},8,["loading"]),l(o,{onClick:C,type:"primary",loading:!s(r).isIdle},{default:d(()=>[p(c(e.$t("zipDownload")),1)]),_:1},8,["loading"])]),s(a).length?(_(),A(s(L),{key:1,ref:"scroller",class:"file-list",items:s(a).slice(),"item-size":s(h).first,"key-field":"fullpath","item-secondary-size":s(h).second,gridItems:s(D)},{default:d(({item:n,index:k})=>[l(j,{idx:k,file:n,"cell-width":s(g),"enable-close-icon":"",onCloseIconClick:K=>F(k),"full-screen-preview-image-url":s(E)(n),"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"])):(_(),w("div",P,[f("p",Q,c(e.$t("batchDownloaDDragAndDropHint")),1)]))],544)}}});const oe=N(X,[["__scopeId","data-v-a2642a17"]]);export{oe 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 +1 @@
|
||||||
import{F as w,s as y}from"./FileItem-ab6bf09c.js";import{u as k,b as x}from"./index-de6cda7b.js";import{d as F,p as b,bm as h,r as C,c4 as D,c5 as I,o as E,j as V,c,C as z,E as e,U as S,c2 as B,c6 as R,n as A}from"./index-5573ae38.js";import"./index-5e569728.js";import"./shortcut-f44c6c9d.js";import"./_isIterateeCall-bb321415.js";const K=F({__name:"gridView",props:{tabIdx:{},paneIdx:{},id:{},removable:{type:Boolean},allowDragAndDrop:{type:Boolean},files:{},paneKey:{}},setup(p){const o=p,m=b(),{stackViewEl:d}=k().toRefs(),{itemSize:i,gridItems:u,cellWidth:f}=x(),g=h(),s=C(o.files??[]),_=async t=>{const l=B(t);o.allowDragAndDrop&&l&&(s.value=R([...s.value,...l.nodes]))},v=t=>{s.value.splice(t,1)};return D(()=>{m.pageFuncExportMap.set(o.paneKey,{getFiles:()=>I(s.value),setFiles:t=>s.value=t})}),(t,l)=>(E(),V("div",{class:"container",ref_key:"stackViewEl",ref:d,onDrop:_},[c(e(y),{ref:"scroller",class:"file-list",items:s.value.slice(),"item-size":e(i).first,"key-field":"fullpath","item-secondary-size":e(i).second,gridItems:e(u)},{default:z(({item:a,index:r})=>{var n;return[c(w,{idx:r,file:a,"cell-width":e(f),"enable-close-icon":o.removable,onCloseIconClick:T=>v(r),"full-screen-preview-image-url":e(S)(a),"extra-tags":(n=a==null?void 0:a.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 M=A(K,[["__scopeId","data-v-f35f4802"]]);export{M as default};
|
import{F as w,s as y}from"./FileItem-aa47825a.js";import{u as k,b as x}from"./index-c80754a2.js";import{d as F,p as b,bm as h,r as C,c5 as D,c6 as I,o as E,j as V,c,C as z,E as e,U as S,c3 as B,c7 as R,n as A}from"./index-32743103.js";import"./index-e1a70e12.js";import"./shortcut-3129f75b.js";import"./_isIterateeCall-16c5cf9c.js";const K=F({__name:"gridView",props:{tabIdx:{},paneIdx:{},id:{},removable:{type:Boolean},allowDragAndDrop:{type:Boolean},files:{},paneKey:{}},setup(p){const o=p,m=b(),{stackViewEl:d}=k().toRefs(),{itemSize:i,gridItems:u,cellWidth:f}=x(),g=h(),s=C(o.files??[]),_=async t=>{const l=B(t);o.allowDragAndDrop&&l&&(s.value=R([...s.value,...l.nodes]))},v=t=>{s.value.splice(t,1)};return D(()=>{m.pageFuncExportMap.set(o.paneKey,{getFiles:()=>I(s.value),setFiles:t=>s.value=t})}),(t,l)=>(E(),V("div",{class:"container",ref_key:"stackViewEl",ref:d,onDrop:_},[c(e(y),{ref:"scroller",class:"file-list",items:s.value.slice(),"item-size":e(i).first,"key-field":"fullpath","item-secondary-size":e(i).second,gridItems:e(u)},{default:z(({item:a,index:r})=>{var n;return[c(w,{idx:r,file:a,"cell-width":e(f),"enable-close-icon":o.removable,onCloseIconClick:T=>v(r),"full-screen-preview-image-url":e(S)(a),"extra-tags":(n=a==null?void 0:a.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 M=A(K,[["__scopeId","data-v-f35f4802"]]);export{M as default};
|
||||||
|
|
@ -1 +1 @@
|
||||||
import{aL as F,r as g,bF as P,bG as S,ar as A,aj as R,bp as q,bH as L,bI as j}from"./index-5573ae38.js";import{u as z,b as H,f as O,c as Q,d as T,e as U,i as W,h as B}from"./index-de6cda7b.js";let K=0;const V=()=>++K,X=(n,i,{dataUpdateStrategy:l="replace"}={})=>{const a=F([""]),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=>S(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 m=yield n(r);if(v.has(s))return v.delete(s),!1;w(i(m));const u=m.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}),I=()=>{v.add(f.value),o.value=!1},x=(e=!1)=>S(void 0,void 0,void 0,function*(){const{refetch:s,force:r}=typeof e=="object"?e:{refetch:e};r&&I(),A(!o.value),a.splice(0,a.length,""),o.value=!1,t.value=void 0,c.value=!1,s&&(yield d())}),h=()=>({next:()=>S(void 0,void 0,void 0,function*(){if(o.value)throw new Error("不允许同时迭代");return{done:!(yield d()),value:t.value}})});return P({abort:I,load:c,next:d,res:t,loading:o,cursorStack:a,reset:x,[Symbol.asyncIterator]:h,iter:{[Symbol.asyncIterator]:h}})},ee=n=>F(X(n,i=>i.files,{dataUpdateStrategy:"merge"})),te=n=>{const i=F(new Set),l=R(()=>(n.res??[]).filter(p=>!i.has(p.fullpath))),a=q(),{stackViewEl:c,multiSelectedIdxs:t,stack:o,scroller:f,props:v}=z({images:l}).toRefs(),{itemSize:w,gridItems:d,cellWidth:I,onScroll:x}=H({fetchNext:()=>n.next()}),{showMenuIdx:h}=O(),{onFileDragStart:e,onFileDragEnd:s}=Q(),{showGenInfo:r,imageGenInfo:m,q:u,onContextMenuClick:y,onFileItemClick:C}=T({openNext:L}),{previewIdx:_,previewing:E,onPreviewVisibleChange:M,previewImgMove:D,canPreview:G}=U({loadNext:()=>n.next()}),J=async(p,b,N)=>{o.value=[{curr:"",files:l.value}],await y(p,b,N)};W("removeFiles",async({paths:p})=>{p.forEach(b=>i.add(b))});const k=()=>{j(l.value)};return{images:l,scroller:f,queue:a,iter:n,onContextMenuClickU:J,stackViewEl:c,previewIdx:_,previewing:E,onPreviewVisibleChange:M,previewImgMove:D,canPreview:G,itemSize:w,gridItems:d,showGenInfo:r,imageGenInfo:m,q:u,onContextMenuClick:y,onFileItemClick:C,showMenuIdx:h,multiSelectedIdxs:t,onFileDragStart:e,onFileDragEnd:s,cellWidth:I,onScroll:x,saveLoadedFileAsJson:k,saveAllFileAsJson:async()=>{for(;!n.load;)await n.next();k()},props:v,...B()}};export{ee as c,te as u};
|
import{aL as F,r as g,bF as P,bG as S,ar as A,aj as R,bp as q,bH as L,bI as j}from"./index-32743103.js";import{u as z,b as H,f as O,c as Q,d as T,e as U,i as W,h as B}from"./index-c80754a2.js";let K=0;const V=()=>++K,X=(n,i,{dataUpdateStrategy:l="replace"}={})=>{const a=F([""]),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=>S(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 m=yield n(r);if(v.has(s))return v.delete(s),!1;w(i(m));const u=m.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}),I=()=>{v.add(f.value),o.value=!1},x=(e=!1)=>S(void 0,void 0,void 0,function*(){const{refetch:s,force:r}=typeof e=="object"?e:{refetch:e};r&&I(),A(!o.value),a.splice(0,a.length,""),o.value=!1,t.value=void 0,c.value=!1,s&&(yield d())}),h=()=>({next:()=>S(void 0,void 0,void 0,function*(){if(o.value)throw new Error("不允许同时迭代");return{done:!(yield d()),value:t.value}})});return P({abort:I,load:c,next:d,res:t,loading:o,cursorStack:a,reset:x,[Symbol.asyncIterator]:h,iter:{[Symbol.asyncIterator]:h}})},ee=n=>F(X(n,i=>i.files,{dataUpdateStrategy:"merge"})),te=n=>{const i=F(new Set),l=R(()=>(n.res??[]).filter(p=>!i.has(p.fullpath))),a=q(),{stackViewEl:c,multiSelectedIdxs:t,stack:o,scroller:f,props:v}=z({images:l}).toRefs(),{itemSize:w,gridItems:d,cellWidth:I,onScroll:x}=H({fetchNext:()=>n.next()}),{showMenuIdx:h}=O(),{onFileDragStart:e,onFileDragEnd:s}=Q(),{showGenInfo:r,imageGenInfo:m,q:u,onContextMenuClick:y,onFileItemClick:C}=T({openNext:L}),{previewIdx:_,previewing:E,onPreviewVisibleChange:M,previewImgMove:D,canPreview:G}=U({loadNext:()=>n.next()}),J=async(p,b,N)=>{o.value=[{curr:"",files:l.value}],await y(p,b,N)};W("removeFiles",async({paths:p})=>{p.forEach(b=>i.add(b))});const k=()=>{j(l.value)};return{images:l,scroller:f,queue:a,iter:n,onContextMenuClickU:J,stackViewEl:c,previewIdx:_,previewing:E,onPreviewVisibleChange:M,previewImgMove:D,canPreview:G,itemSize:w,gridItems:d,showGenInfo:r,imageGenInfo:m,q:u,onContextMenuClick:y,onFileItemClick:C,showMenuIdx:h,multiSelectedIdxs:t,onFileDragStart:e,onFileDragEnd:s,cellWidth:I,onScroll:x,saveLoadedFileAsJson:k,saveAllFileAsJson:async()=>{for(;!n.load;)await n.next();k()},props:v,...B()}};export{ee as c,te as u};
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1 +1 @@
|
||||||
import{d as x,p as $,an as g,c7 as b,r as w,o as p,j as d,k as a,c as l,C as i,l as u,t as n,F as B,K as I,E as m,as as W,W as _,X as v,a2 as D,a3 as F,c8 as N,n as R}from"./index-5573ae38.js";const V={class:"container"},E={class:"actions"},K={class:"uni-desc"},L={class:"snapshot"},j=x({__name:"index",props:{tabIdx:{},paneIdx:{},id:{},paneKey:{}},setup(q){const h=$(),t=g(),f=e=>{h.tabList=W(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(""),C=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 y=D,r=F;return p(),d("div",V,[a("div",E,[l(y,{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"]),l(r,{type:"primary",onClick:C},{default:i(()=>[u(n(e.$t("saveWorkspaceSnapshot")),1)]),_:1})]),a("p",K,n(e.$t("WorkspaceSnapshotDesc")),1),a("ul",L,[(p(!0),d(B,null,I(m(t).snapshots,s=>(p(),d("li",{key:s.id},[a("div",null,[a("span",null,n(s.name),1)]),a("div",null,[l(r,{onClick:S=>f(s)},{default:i(()=>[u(n(e.$t("restore")),1)]),_:2},1032,["onClick"]),l(r,{onClick:S=>m(k)(s)},{default:i(()=>[u(n(e.$t("remove")),1)]),_:2},1032,["onClick"])])]))),128))])])}}});const G=R(j,[["__scopeId","data-v-2c44013c"]]);export{G as default};
|
import{d as x,p as $,an as g,c8 as b,r as w,o as p,j as d,k as a,c as l,C as i,l as u,t as n,F as B,K as I,E as m,as as W,W as _,X as v,a2 as D,a3 as F,c9 as N,n as R}from"./index-32743103.js";const V={class:"container"},E={class:"actions"},K={class:"uni-desc"},L={class:"snapshot"},j=x({__name:"index",props:{tabIdx:{},paneIdx:{},id:{},paneKey:{}},setup(q){const h=$(),t=g(),f=e=>{h.tabList=W(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(""),C=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 y=D,r=F;return p(),d("div",V,[a("div",E,[l(y,{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"]),l(r,{type:"primary",onClick:C},{default:i(()=>[u(n(e.$t("saveWorkspaceSnapshot")),1)]),_:1})]),a("p",K,n(e.$t("WorkspaceSnapshotDesc")),1),a("ul",L,[(p(!0),d(B,null,I(m(t).snapshots,s=>(p(),d("li",{key:s.id},[a("div",null,[a("span",null,n(s.name),1)]),a("div",null,[l(r,{onClick:S=>f(s)},{default:i(()=>[u(n(e.$t("restore")),1)]),_:2},1032,["onClick"]),l(r,{onClick:S=>m(k)(s)},{default:i(()=>[u(n(e.$t("remove")),1)]),_:2},1032,["onClick"])])]))),128))])])}}});const G=R(j,[["__scopeId","data-v-2c44013c"]]);export{G 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 +1 @@
|
||||||
import{d as Y,p as ee,r as F,aC as te,aD as le,v as se,c9 as ie,o as v,j as N,c as s,E as e,k as g,C as n,l as k,t as u,G as R,I as oe,H as ae,U as ne,V as A,m as $,B as re,W as w,X as ce,ca as de,a3 as ue,a1 as me,Z as fe,n as pe}from"./index-5573ae38.js";import{F as ve,s as ge}from"./FileItem-ab6bf09c.js";import{u as ke,g as we,c as he,b as Ce,d as Se,e as _e,o as z}from"./index-de6cda7b.js";import{M as Ie,L as ye,R as xe,f as be}from"./MultiSelectKeep-e448072f.js";import"./index-5e569728.js";import"./shortcut-f44c6c9d.js";import"./_isIterateeCall-bb321415.js";/* empty css */const Ve={class:"refresh-button"},Me={class:"hint"},Te={key:0,class:"preview-switch"},Fe=Y({__name:"randomImage",props:{tabIdx:{},paneIdx:{},id:{},paneKey:{}},setup(Ne){const B=ee(),m=F(!1),l=F([]),r=l,h=te(`${le}randomImageSettingNotificationShown`,!1),P=()=>{h.value||(w.info({content:ce("randomImageSettingNotification"),duration:6,key:"randomImageSetting"}),h.value=!0)},f=async()=>{try{m.value=!0;const i=await de();i.length===0&&w.warn("No data, please generate index in image search page first"),l.value=i}finally{m.value=!1,_()}},C=()=>{if(l.value.length===0){w.warn("没有图片可以浏览");return}z(l.value,a.value||0)};se(()=>{f(),setTimeout(()=>{P()},2e3)});const{stackViewEl:D,multiSelectedIdxs:p,stack:E,scroller:G}=ke({images:l}).toRefs(),{onClearAllSelected:U,onSelectAll:K,onReverseSelect:L}=we();he();const{itemSize:S,gridItems:O,cellWidth:W,onScroll:_}=Ce(),{showGenInfo:c,imageGenInfo:I,q:H,onContextMenuClick:j,onFileItemClick:q}=Se({openNext:ie}),{previewIdx:a,previewing:y,onPreviewVisibleChange:Q,previewImgMove:x,canPreview:b}=_e(),V=async(i,t,d)=>{E.value=[{curr:"",files:l.value}],await j(i,t,d)};return(i,t)=>{var M;const d=ue,X=me,Z=fe;return v(),N("div",{class:"container",ref_key:"stackViewEl",ref:D},[s(Ie,{show:!!e(p).length||e(B).keepMultiSelect,onClearAllSelected:e(U),onSelectAll:e(K),onReverseSelect:e(L)},null,8,["show","onClearAllSelected","onSelectAll","onReverseSelect"]),g("div",Ve,[s(d,{onClick:f,onTouchstart:R(f,["prevent"]),type:"primary",loading:m.value,shape:"round"},{default:n(()=>[k(u(i.$t("shuffle")),1)]),_:1},8,["onTouchstart","loading"]),s(d,{onClick:C,onTouchstart:R(C,["prevent"]),type:"default",disabled:!((M=l.value)!=null&&M.length),shape:"round"},{default:n(()=>[k(u(i.$t("tiktokView")),1)]),_:1},8,["onTouchstart","disabled"])]),s(Z,{visible:e(c),"onUpdate:visible":t[1]||(t[1]=o=>ae(c)?c.value=o:null),width:"70vw","mask-closable":"",onOk:t[2]||(t[2]=o=>c.value=!1)},{cancelText:n(()=>[]),default:n(()=>[s(X,{active:"",loading:!e(H).isIdle},{default:n(()=>[g("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:t[0]||(t[0]=o=>e(oe)(e(I)))},[g("div",Me,u(i.$t("doubleClickToCopy")),1),k(" "+u(e(I)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),s(e(ge),{ref_key:"scroller",ref:G,class:"file-list",items:l.value.slice(),"item-size":e(S).first,"key-field":"fullpath","item-secondary-size":e(S).second,gridItems:e(O),onScroll:e(_)},{default:n(({item:o,index:T})=>[s(ve,{idx:T,file:o,"cell-width":e(W),"full-screen-preview-image-url":e(r)[e(a)]?e(ne)(e(r)[e(a)]):"",onContextMenuClick:V,onPreviewVisibleChange:e(Q),"is-selected-mutil-files":e(p).length>1,selected:e(p).includes(T),onFileItemClick:e(q),onTiktokView:(Re,J)=>e(z)(l.value,J)},null,8,["idx","file","cell-width","full-screen-preview-image-url","onPreviewVisibleChange","is-selected-mutil-files","selected","onFileItemClick","onTiktokView"])]),_:1},8,["items","item-size","item-secondary-size","gridItems","onScroll"]),e(y)?(v(),N("div",Te,[s(e(ye),{onClick:t[3]||(t[3]=o=>e(x)("prev")),class:A({disable:!e(b)("prev")})},null,8,["class"]),s(e(xe),{onClick:t[4]||(t[4]=o=>e(x)("next")),class:A({disable:!e(b)("next")})},null,8,["class"])])):$("",!0),e(y)&&e(r)&&e(r)[e(a)]?(v(),re(be,{key:1,file:e(r)[e(a)],idx:e(a),onContextMenuClick:V},null,8,["file","idx"])):$("",!0)],512)}}});const Ue=pe(Fe,[["__scopeId","data-v-49082269"]]);export{Ue as default};
|
import{d as Y,p as ee,r as F,aC as te,aD as le,v as se,ca as ie,o as v,j as N,c as s,E as e,k as g,C as n,l as k,t as u,G as R,I as oe,H as ae,U as ne,V as A,m as $,B as re,W as w,X as ce,cb as de,a3 as ue,a1 as me,Z as fe,n as pe}from"./index-32743103.js";import{F as ve,s as ge}from"./FileItem-aa47825a.js";import{u as ke,g as we,c as he,b as Ce,d as Se,e as _e,o as z}from"./index-c80754a2.js";import{M as Ie,L as ye,R as be,f as xe}from"./MultiSelectKeep-56b94e1f.js";import"./index-e1a70e12.js";import"./shortcut-3129f75b.js";import"./_isIterateeCall-16c5cf9c.js";/* empty css */const Ve={class:"refresh-button"},Me={class:"hint"},Te={key:0,class:"preview-switch"},Fe=Y({__name:"randomImage",props:{tabIdx:{},paneIdx:{},id:{},paneKey:{}},setup(Ne){const B=ee(),m=F(!1),l=F([]),r=l,h=te(`${le}randomImageSettingNotificationShown`,!1),P=()=>{h.value||(w.info({content:ce("randomImageSettingNotification"),duration:6,key:"randomImageSetting"}),h.value=!0)},f=async()=>{try{m.value=!0;const i=await de();i.length===0&&w.warn("No data, please generate index in image search page first"),l.value=i}finally{m.value=!1,_()}},C=()=>{if(l.value.length===0){w.warn("没有图片可以浏览");return}z(l.value,a.value||0)};se(()=>{f(),setTimeout(()=>{P()},2e3)});const{stackViewEl:D,multiSelectedIdxs:p,stack:E,scroller:G}=ke({images:l}).toRefs(),{onClearAllSelected:U,onSelectAll:K,onReverseSelect:L}=we();he();const{itemSize:S,gridItems:O,cellWidth:W,onScroll:_}=Ce(),{showGenInfo:c,imageGenInfo:I,q:H,onContextMenuClick:j,onFileItemClick:q}=Se({openNext:ie}),{previewIdx:a,previewing:y,onPreviewVisibleChange:Q,previewImgMove:b,canPreview:x}=_e(),V=async(i,t,d)=>{E.value=[{curr:"",files:l.value}],await j(i,t,d)};return(i,t)=>{var M;const d=ue,X=me,Z=fe;return v(),N("div",{class:"container",ref_key:"stackViewEl",ref:D},[s(Ie,{show:!!e(p).length||e(B).keepMultiSelect,onClearAllSelected:e(U),onSelectAll:e(K),onReverseSelect:e(L)},null,8,["show","onClearAllSelected","onSelectAll","onReverseSelect"]),g("div",Ve,[s(d,{onClick:f,onTouchstart:R(f,["prevent"]),type:"primary",loading:m.value,shape:"round"},{default:n(()=>[k(u(i.$t("shuffle")),1)]),_:1},8,["onTouchstart","loading"]),s(d,{onClick:C,onTouchstart:R(C,["prevent"]),type:"default",disabled:!((M=l.value)!=null&&M.length),shape:"round"},{default:n(()=>[k(u(i.$t("tiktokView")),1)]),_:1},8,["onTouchstart","disabled"])]),s(Z,{visible:e(c),"onUpdate:visible":t[1]||(t[1]=o=>ae(c)?c.value=o:null),width:"70vw","mask-closable":"",onOk:t[2]||(t[2]=o=>c.value=!1)},{cancelText:n(()=>[]),default:n(()=>[s(X,{active:"",loading:!e(H).isIdle},{default:n(()=>[g("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:t[0]||(t[0]=o=>e(oe)(e(I)))},[g("div",Me,u(i.$t("doubleClickToCopy")),1),k(" "+u(e(I)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),s(e(ge),{ref_key:"scroller",ref:G,class:"file-list",items:l.value.slice(),"item-size":e(S).first,"key-field":"fullpath","item-secondary-size":e(S).second,gridItems:e(O),onScroll:e(_)},{default:n(({item:o,index:T})=>[s(ve,{idx:T,file:o,"cell-width":e(W),"full-screen-preview-image-url":e(r)[e(a)]?e(ne)(e(r)[e(a)]):"",onContextMenuClick:V,onPreviewVisibleChange:e(Q),"is-selected-mutil-files":e(p).length>1,selected:e(p).includes(T),onFileItemClick:e(q),onTiktokView:(Re,J)=>e(z)(l.value,J)},null,8,["idx","file","cell-width","full-screen-preview-image-url","onPreviewVisibleChange","is-selected-mutil-files","selected","onFileItemClick","onTiktokView"])]),_:1},8,["items","item-size","item-secondary-size","gridItems","onScroll"]),e(y)?(v(),N("div",Te,[s(e(ye),{onClick:t[3]||(t[3]=o=>e(b)("prev")),class:A({disable:!e(x)("prev")})},null,8,["class"]),s(e(be),{onClick:t[4]||(t[4]=o=>e(b)("next")),class:A({disable:!e(x)("next")})},null,8,["class"])])):$("",!0),e(y)&&e(r)&&e(r)[e(a)]?(v(),re(xe,{key:1,file:e(r)[e(a)],idx:e(a),onContextMenuClick:V},null,8,["file","idx"])):$("",!0)],512)}}});const Ue=pe(Fe,[["__scopeId","data-v-49082269"]]);export{Ue as default};
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
import{bJ as f,bK as y,bL as v,c as d,A as P,d as w,o,j as c,k as r,F as b,K as S,ah as O,C as V,l as u,t as p,E as $,a3 as R,n as L,aq as x,aC as _,aD as g}from"./index-5573ae38.js";const J=f(y),A=f(v);var C={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 H=C;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){F(t,i,s[i])})}return t}function F(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:H}),null)};l.displayName="PushpinFilled";l.inheritAttrs=!1;const N=l,z={class:"record-container"},k={style:{flex:"1"}},I={class:"rec-actions"},j=["onClick"],B=w({__name:"HistoryRecord",props:{records:{}},emits:["reuseRecord"],setup(t){return(e,s)=>{const n=R;return o(),c("div",null,[r("ul",z,[(o(!0),c(b,null,S(e.records.getRecords(),i=>(o(),c("li",{key:i.id,class:"record"},[r("div",k,[O(e.$slots,"default",{record:i},void 0,!0)]),r("div",I,[d(n,{onClick:m=>e.$emit("reuseRecord",i),type:"primary"},{default:V(()=>[u(p(e.$t("restore")),1)]),_:2},1032,["onClick"]),r("div",{class:"pin",onClick:m=>e.records.switchPin(i)},[d($(N)),u(" "+p(e.records.isPinned(i)?e.$t("unpin"):e.$t("pin")),1)],8,j)])]))),128))])])}}});const E=L(B,[["__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=_(`${g}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=_(`${g}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{E as H,A as _,J as a,q as f,M as t};
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
[data-v-834a248f] .ant-row .ant-col:nth-child(1){font-weight:700}.record-container[data-v-834a248f]{list-style:none;padding:8px;margin:16px;max-height:50vh;overflow:auto}.record[data-v-834a248f]{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:10px;border-bottom:1px solid var(--zp-tertiary);position:relative;flex-wrap:nowrap;transition:all .3s ease}.record[data-v-834a248f]:hover{background:var(--zp-secondary-background)}.record .rec-actions[data-v-834a248f]{user-select:none;display:flex;gap:8px}.record .pin[data-v-834a248f]{cursor:pointer;padding:4px 8px;border-radius:4px;transition:all .3s ease}.record .pin[data-v-834a248f]:hover{background:var(--zp-primary-background)}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -7,7 +7,7 @@
|
||||||
<link rel="icon" href="/favicon.ico" />
|
<link rel="icon" href="/favicon.ico" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Infinite Image Browsing</title>
|
<title>Infinite Image Browsing</title>
|
||||||
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-5573ae38.js"></script>
|
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-32743103.js"></script>
|
||||||
<link rel="stylesheet" href="/infinite_image_browsing/fe-static/assets/index-dd273d5b.css">
|
<link rel="stylesheet" href="/infinite_image_browsing/fe-static/assets/index-dd273d5b.css">
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,227 @@
|
||||||
|
<template>
|
||||||
|
<div v-if="availableTips.length > 0" class="tips-carousel">
|
||||||
|
<transition name="tip-fade" mode="out-in">
|
||||||
|
<div :key="currentIndex" class="tip-content">
|
||||||
|
<a-tag :color="getTipColor(currentTip.type)" class="tip-tag">
|
||||||
|
{{ currentTip.title }}
|
||||||
|
</a-tag>
|
||||||
|
<span class="tip-text">{{ currentTip.content }}</span>
|
||||||
|
<div v-if="currentTip.type === 'warning'" class="tip-actions">
|
||||||
|
<a-button size="small" type="link" @click="dismissCurrentTip">
|
||||||
|
{{ t('dontShowAgain') }}
|
||||||
|
</a-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</transition>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, computed, onMounted, onUnmounted } from 'vue'
|
||||||
|
import { useLocalStorage } from '@vueuse/core'
|
||||||
|
import { t } from '@/i18n'
|
||||||
|
|
||||||
|
interface LoadingTip {
|
||||||
|
title: string
|
||||||
|
content: string
|
||||||
|
type: 'warning' | 'info' | 'tip'
|
||||||
|
}
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
interval: {
|
||||||
|
type: Number,
|
||||||
|
default: 10000 // 10秒切换一次
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// 存储用户已关闭的提示
|
||||||
|
const dismissedTips = useLocalStorage<Record<string, boolean>>('iib-dismissed-tips-v2', {})
|
||||||
|
|
||||||
|
// 当前提示索引
|
||||||
|
const currentIndex = ref(0)
|
||||||
|
let tipIntervalId: ReturnType<typeof setInterval> | null = null
|
||||||
|
|
||||||
|
// 获取所有可用的提示
|
||||||
|
const availableTips = computed<LoadingTip[]>(() => {
|
||||||
|
const tips: LoadingTip[] = []
|
||||||
|
|
||||||
|
// 遍历 loadingTip1 到 loadingTip10
|
||||||
|
for (let i = 1; i <= 10; i++) {
|
||||||
|
const key = `loadingTip${i}` as const
|
||||||
|
const rawTip = t(key) as string
|
||||||
|
|
||||||
|
if (!rawTip || typeof rawTip !== 'string') continue
|
||||||
|
|
||||||
|
// 解析格式: "标题\n\n内容|类型"
|
||||||
|
const parts = rawTip.split('|')
|
||||||
|
const contentPart = parts[0]
|
||||||
|
const typePart = parts[1]?.trim() || 'info'
|
||||||
|
|
||||||
|
// 分离标题和内容
|
||||||
|
const titleContentSeparator = '\n\n'
|
||||||
|
const separatorIndex = contentPart.indexOf(titleContentSeparator)
|
||||||
|
|
||||||
|
if (separatorIndex === -1) continue
|
||||||
|
|
||||||
|
const title = contentPart.substring(0, separatorIndex).trim()
|
||||||
|
const content = contentPart.substring(separatorIndex + titleContentSeparator.length).trim()
|
||||||
|
|
||||||
|
const tip: LoadingTip = {
|
||||||
|
title,
|
||||||
|
content,
|
||||||
|
type: typePart as 'warning' | 'info' | 'tip'
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果是警告类型且用户已关闭,则跳过
|
||||||
|
if (tip.type === 'warning' && dismissedTips.value[title]) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
tips.push(tip)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fisher-Yates 洗牌算法随机打乱顺序
|
||||||
|
for (let i = tips.length - 1; i > 0; i--) {
|
||||||
|
const j = Math.floor(Math.random() * (i + 1));
|
||||||
|
[tips[i], tips[j]] = [tips[j], tips[i]]
|
||||||
|
}
|
||||||
|
|
||||||
|
return tips
|
||||||
|
})
|
||||||
|
|
||||||
|
// 当前显示的提示
|
||||||
|
const currentTip = computed<LoadingTip>(() => {
|
||||||
|
const tips = availableTips.value
|
||||||
|
if (tips.length === 0) {
|
||||||
|
return {
|
||||||
|
title: '',
|
||||||
|
content: '',
|
||||||
|
type: 'info'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tips[currentIndex.value % tips.length]
|
||||||
|
})
|
||||||
|
|
||||||
|
// 获取提示颜色
|
||||||
|
const getTipColor = (type: string) => {
|
||||||
|
switch (type) {
|
||||||
|
case 'warning':
|
||||||
|
return 'warning'
|
||||||
|
case 'info':
|
||||||
|
return 'blue'
|
||||||
|
case 'tip':
|
||||||
|
return 'green'
|
||||||
|
default:
|
||||||
|
return 'default'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 关闭当前提示
|
||||||
|
const dismissCurrentTip = () => {
|
||||||
|
if (currentTip.value.type === 'warning') {
|
||||||
|
dismissedTips.value = {
|
||||||
|
...dismissedTips.value,
|
||||||
|
[currentTip.value.title]: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 启动轮播
|
||||||
|
const startCarousel = () => {
|
||||||
|
if (tipIntervalId) {
|
||||||
|
clearInterval(tipIntervalId)
|
||||||
|
}
|
||||||
|
tipIntervalId = setInterval(() => {
|
||||||
|
if (availableTips.value.length > 1) {
|
||||||
|
currentIndex.value = (currentIndex.value + 1) % availableTips.value.length
|
||||||
|
}
|
||||||
|
}, props.interval)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 停止轮播
|
||||||
|
const stopCarousel = () => {
|
||||||
|
if (tipIntervalId) {
|
||||||
|
clearInterval(tipIntervalId)
|
||||||
|
tipIntervalId = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
startCarousel()
|
||||||
|
})
|
||||||
|
|
||||||
|
onUnmounted(() => {
|
||||||
|
stopCarousel()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.tips-carousel {
|
||||||
|
padding: 6px 10px;
|
||||||
|
border-radius: 6px;
|
||||||
|
background: rgba(0, 0, 0, 0.02);
|
||||||
|
border: 1px solid rgba(0, 0, 0, 0.06);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tip-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
gap: 6px;
|
||||||
|
align-items: flex-start;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tip-tag {
|
||||||
|
font-weight: 500;
|
||||||
|
flex-shrink: 0;
|
||||||
|
font-size: 11px;
|
||||||
|
padding: 0 4px;
|
||||||
|
line-height: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tip-text {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 18px;
|
||||||
|
color: rgba(0, 0, 0, 0.65);
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tip-actions {
|
||||||
|
align-self: flex-start;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tip-actions :deep(.ant-btn) {
|
||||||
|
padding: 0 4px;
|
||||||
|
font-size: 11px;
|
||||||
|
height: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 提示切换动画 */
|
||||||
|
.tip-fade-enter-active,
|
||||||
|
.tip-fade-leave-active {
|
||||||
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tip-fade-enter-from {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(5px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tip-fade-leave-to {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(-5px);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 暗色主题适配 */
|
||||||
|
html.dark .tips-carousel {
|
||||||
|
background: rgba(255, 255, 255, 0.05);
|
||||||
|
border-color: rgba(255, 255, 255, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
html.dark .tip-text {
|
||||||
|
color: rgba(255, 255, 255, 0.65);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -304,5 +304,17 @@ export const de: Partial<IIBI18nMap> = {
|
||||||
flattenFolderConfirm: '{count} Dateien abflachen bestätigen?',
|
flattenFolderConfirm: '{count} Dateien abflachen bestätigen?',
|
||||||
flattenFolderExecuting: 'Ordner wird abgeflacht...',
|
flattenFolderExecuting: 'Ordner wird abgeflacht...',
|
||||||
flattenFolderSuccess: 'Abflachung abgeschlossen, {count} Dateien verschoben',
|
flattenFolderSuccess: 'Abflachung abgeschlossen, {count} Dateien verschoben',
|
||||||
flattenFolderNoFiles: 'Keine Dateien zum Verschieben'
|
flattenFolderNoFiles: 'Keine Dateien zum Verschieben',
|
||||||
|
|
||||||
|
// ===== Loading Tips (Format: Titel\n\nInhalt|Typ) =====
|
||||||
|
loadingTip1: '💡 Dateinamens-Eindeutigkeit-Tipp\n\nWenn Sie einfache numerische Benennung verwenden (z. B. 001.png), kann das Löschen und erneute Erstellen von Dateien mit demselben Namen zu Tag- und Cache-Datenverwirrung führen. Es wird empfohlen, Zeitstempel-Dateinamen in Ihrer Generierungs-Software zu aktivieren, um sicherzustellen, dass jeder Dateiname einen Zeitstempel enthält (z. B. [time][prompt])|warning',
|
||||||
|
loadingTip2: '⌨️ Batch-Operationen-Tipp\n\nHalten Sie Ctrl/Cmd gedrückt, um mehrere Dateien auszuwählen. Das Rechtsklick-Menü unterstützt Batch-Tag-Bearbeitung, Verschieben und Löschen. Shift+Klick wählt einen Bereich von Dateien aus.|info',
|
||||||
|
loadingTip3: '🎹 Tastaturkürzel\n\nTikTok-Ansicht: Pfeiltaste hoch/runter zum Navigieren, Esc zum Beenden. Vollbildvorschau: Benutzerdefinierte Lösch-/Download-Kürzel in globalen Einstellungen konfigurieren. Dateiliste: PageUp/Down zum Scrollen, Home/End zum Springen, Backspace für übergeordneten Ordner.|info',
|
||||||
|
loadingTip4: '🤖 AI-Clustering-Hinweis\n\nDie erste Verwendung von AI-Clustering erfordert den Aufruf der Embedding-API. Testen Sie zuerst mit kleinen Chargen. Clustering-Ergebnisse werden zwischengespeichert, das spätere Anzeigen geht schnell.|info',
|
||||||
|
loadingTip5: '🔍 Fuzzy-Suche-Tipps\n\nDie Fuzzy-Suche unterstützt Regex! Klicken Sie auf das Regex-Symbol rechts, um es zu aktivieren. Verwenden Sie ^ am Anfang für exakte Übereinstimmung von Tagnamen oder Dateinamen.|info',
|
||||||
|
loadingTip6: '🚶 Walk-Modus\n\nDer Walk-Modus verwendet unendliches Scrollen, um alle Dateien in Unterordnern zu durchsuchen, ohne manuell zu blättern. Ideal zum schnellen Durchsuchen großer Bildersammlungen.|info',
|
||||||
|
loadingTip7: '📸 Workspace-Snapshots\n\nSie können Ihren aktuellen Workspace-Status (offene Ordner, Sortierung, etc.) speichern, um ihn beim nächsten Öffnen von IIB schnell wiederherzustellen. In den globalen Einstellungen kann automatische Wiederherstellung beim Start eingestellt werden.|info',
|
||||||
|
loadingTip8: '🏷️ Auto-Tagging-Funktion\n\nKonfigurieren Sie Auto-Tagging-Regeln in den globalen Einstellungen. Tags werden automatisch angewendet, wenn Bilder indexiert werden, unterstützt Bedingungen wie Prompt, Modell, Sampler, etc.|info',
|
||||||
|
loadingTip9: '⚡ Leistungstipp\n\nWenn Sie beim schnellen Scrollen durch viele Bilder Verzögerungen bemerken, können Sie "Change Indicators" in den globalen Einstellungen deaktivieren für deutlich bessere Leistung.|info',
|
||||||
|
loadingTip10: '🤖 KI-Agenten-Integration\n\nSie können jetzt KI-Agenten IIB nutzen lassen, um bei Bildverwaltung, Tag-Organisation und intelligenter Suche zu helfen. Über die API-Schnittstelle kann die KI auf alle IIB-Funktionen zugreifen und automatisierte Workflows erstellen.|info'
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -564,5 +564,17 @@ You can specify which snapshot to restore to when starting IIB in the global set
|
||||||
flattenFolderConfirm: 'Confirm flattening {count} files?',
|
flattenFolderConfirm: 'Confirm flattening {count} files?',
|
||||||
flattenFolderExecuting: 'Flattening folder...',
|
flattenFolderExecuting: 'Flattening folder...',
|
||||||
flattenFolderSuccess: 'Flatten complete, moved {count} files',
|
flattenFolderSuccess: 'Flatten complete, moved {count} files',
|
||||||
flattenFolderNoFiles: 'No files to move'
|
flattenFolderNoFiles: 'No files to move',
|
||||||
|
|
||||||
|
// ===== Loading Tips (format: title\n\ncontent|type) =====
|
||||||
|
loadingTip1: '💡 Filename Uniqueness Tip\n\nIf you use simple numeric naming (e.g., 001.png), deleting and regenerating files with the same name can cause tag and cache data confusion. It\'s recommended to enable timestamp filenames in your generation software, ensuring each filename includes a timestamp (e.g., [time][prompt])|warning',
|
||||||
|
loadingTip2: '⌨️ Batch Operations Tip\n\nHold Ctrl/Cmd to multi-select files. Right-click menu supports batch tag editing, moving, and deletion. Shift+click to select a range of files.|info',
|
||||||
|
loadingTip3: '🎹 Keyboard Shortcuts\n\nTikTok view: Arrow Up/Down to navigate, Esc to exit. Fullscreen preview: configure custom delete/download shortcuts in global settings. File list: PageUp/Down to scroll, Home/End to jump, Backspace for parent folder.|info',
|
||||||
|
loadingTip4: '🤖 AI Clustering Note\n\nFirst-time AI clustering requires calling the embedding API. Test with small batches first. Clustering results are cached for faster subsequent viewing.|info',
|
||||||
|
loadingTip5: '🔍 Fuzzy Search Tips\n\nFuzzy search supports regex! Click the regex icon on the right to enable. Use ^ at the start to match tag names or filenames exactly.|info',
|
||||||
|
loadingTip6: '🚶 Walk Mode\n\nWalk mode uses infinite scrolling to browse all files in subfolders without manual pagination. Great for quickly browsing large image collections.|info',
|
||||||
|
loadingTip7: '📸 Workspace Snapshots\n\nSave your current workspace state (open folders, sorting, etc.) for quick restoration later. In global settings, set it to auto-restore on startup.|info',
|
||||||
|
loadingTip8: '🏷️ Auto Tagging Feature\n\nConfigure auto-tagging rules in global settings. Tags are automatically applied when images are indexed, supporting conditions like prompt, model, sampler, etc.|info',
|
||||||
|
loadingTip9: '⚡ Performance Tip\n\nIf you experience lag when scrolling through a large number of images quickly, you can disable "Change Indicators" in global settings for significantly better performance.|info',
|
||||||
|
loadingTip10: '🤖 AI Agent Integration\n\nYou can now let AI agents use IIB to help with image management, tag organization, and smart search. Through the API interface, AI can access all IIB features for automated workflows.|info'
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -542,5 +542,17 @@ export const zhHans = {
|
||||||
flattenFolderConfirm: '确认压平 {count} 个文件?',
|
flattenFolderConfirm: '确认压平 {count} 个文件?',
|
||||||
flattenFolderExecuting: '正在压平文件夹...',
|
flattenFolderExecuting: '正在压平文件夹...',
|
||||||
flattenFolderSuccess: '压平完成,已移动 {count} 个文件',
|
flattenFolderSuccess: '压平完成,已移动 {count} 个文件',
|
||||||
flattenFolderNoFiles: '没有需要移动的文件'
|
flattenFolderNoFiles: '没有需要移动的文件',
|
||||||
|
|
||||||
|
// ===== Loading Tips (格式: 标题\n\n内容|类型) =====
|
||||||
|
loadingTip1: '💡 文件名唯一性提示\n\n如果使用简单数字命名(如 001.png),删除后重新生成同名文件会导致标签和缓存数据混乱。建议在生成软件中启用时间戳文件名,确保每个文件名都包含时间戳(如 [time][prompt])|warning',
|
||||||
|
loadingTip2: '⌨️ 批量操作小技巧\n\n按住 Ctrl/Cmd 可以多选文件,右键菜单支持批量标签编辑、移动和删除。Shift+点击可以连续选择多个文件。|info',
|
||||||
|
loadingTip3: '🎹 快捷键\n\nTikTok 视图下:方向键上下切换图片,Esc 退出。全屏预览时可在全局设置中自定义删除和下载快捷键。文件列表区:PageUp/Down 滚动,Home/End 跳转,Backspace 返回上级。|info',
|
||||||
|
loadingTip4: '🤖 AI 聚类说明\n\n首次使用 AI 聚类需要调用 embedding API,建议先用小批量测试。聚类结果会缓存,再次查看会很快。|info',
|
||||||
|
loadingTip5: '🔍 模糊搜索技巧\n\n模糊搜索支持正则表达式!点击右侧的正则图标可以启用。使用 ^ 开头可以完全匹配标签名或文件名。|info',
|
||||||
|
loadingTip6: '🚶 Walk 模式\n\nWalk 模式使用无限滚动浏览所有子文件夹的文件,无需手动翻页。适合快速浏览大量图片。|info',
|
||||||
|
loadingTip7: '📸 工作区快照\n\n你可以保存当前的工作区状态(打开的文件夹、排序方式等),下次打开 IIB 时快速恢复。在全局设置中可以设为启动时自动恢复。|info',
|
||||||
|
loadingTip8: '🏷️ 自动标签功能\n\n在全局设置中配置自动标签规则,当图片被索引时会自动添加标签。支持根据 prompt、模型、采样器等条件自动分类。|info',
|
||||||
|
loadingTip9: '⚡ 性能优化提示\n\n如果在快速滚动大量图片时感到卡顿,可以在全局设置中关闭"变更指示器"功能,这可以显著提升浏览性能。|info',
|
||||||
|
loadingTip10: '🤖 AI Agent 集成\n\n现在你可以让 AI agent 来使用 IIB 帮助进行图像管理、标签整理和智能搜索。通过 API 接口,AI 可以访问所有 IIB 功能,实现自动化工作流程。|info'
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -544,5 +544,17 @@ export const zhHant: Partial<IIBI18nMap> = {
|
||||||
flattenFolderConfirm: '確認壓平 {count} 個檔案?',
|
flattenFolderConfirm: '確認壓平 {count} 個檔案?',
|
||||||
flattenFolderExecuting: '正在壓平資料夾...',
|
flattenFolderExecuting: '正在壓平資料夾...',
|
||||||
flattenFolderSuccess: '壓平完成,已移動 {count} 個檔案',
|
flattenFolderSuccess: '壓平完成,已移動 {count} 個檔案',
|
||||||
flattenFolderNoFiles: '沒有需要移動的檔案'
|
flattenFolderNoFiles: '沒有需要移動的檔案',
|
||||||
|
|
||||||
|
// ===== Loading Tips (格式: 標題\n\n內容|類型) =====
|
||||||
|
loadingTip1: '💡 檔案名唯一性提示\n\n如果使用簡單數字命名(如 001.png),刪除後重新生成同名檔案會導致標籤和快取資料混亂。建議在生成軟體中啟用時間戳檔案名,確保每個檔案名都包含時間戳(如 [time][prompt])|warning',
|
||||||
|
loadingTip2: '⌨️ 批量操作小技巧\n\n按住 Ctrl/Cmd 可以多選檔案,右鍵功能表支持批量標籤編輯、移動和刪除。Shift+點擊可以連續選擇多個檔案。|info',
|
||||||
|
loadingTip3: '🎹 快捷鍵\n\nTikTok 視圖下:方向鍵上下切換圖片,Esc 退出。全螢幕預覽時可在全域設定中自訂刪除和下載快捷鍵。檔案列表區:PageUp/Down 滾動,Home/End 跳轉,Backspace 返回上層。|info',
|
||||||
|
loadingTip4: '🤖 AI 聚類說明\n\n首次使用 AI 聚類需要呼叫 embedding API,建議先用小批量測試。聚類結果會快取,再次查看會很快。|info',
|
||||||
|
loadingTip5: '🔍 模糊搜尋技巧\n\n模糊搜尋支援正則表達式!點擊右側的正則圖標可以啟用。使用 ^ 開頭可以完全匹配標籤名或檔案名。|info',
|
||||||
|
loadingTip6: '🚶 Walk 模式\n\nWalk 模式使用無限滾動瀏覽所有子資料夾的檔案,無需手動翻頁。適合快速瀏覽大量圖片。|info',
|
||||||
|
loadingTip7: '📸 工作區快照\n\n你可以儲存目前的工作區狀態(打開的資料夾、排序方式等),下次打開 IIB 時快速還原。在全域設定中可以設為啟動時自動還原。|info',
|
||||||
|
loadingTip8: '🏷️ 自動標籤功能\n\n在全域設定中配置自動標籤規則,當圖片被索引時會自動添加標籤。支援根據 prompt、模型、採樣器等條件自動分類。|info',
|
||||||
|
loadingTip9: '⚡ 效能優化提示\n\n如果在快速滾動大量圖片時感到卡頓,可以在全域設定中關閉「變更指示器」功能,這可以顯著提升瀏覽效能。|info',
|
||||||
|
loadingTip10: '🤖 AI Agent 整合\n\n現在您可以讓 AI agent 使用 IIB 來協助進行圖片管理、標籤整理和智慧搜尋。透過 API 介面,AI 可以存取所有 IIB 功能,實現自動化工作流程。|info'
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ import { useKeepMultiSelect } from '../fileTransfer/hook'
|
||||||
import MultiSelectKeep from '@/components/MultiSelectKeep.vue'
|
import MultiSelectKeep from '@/components/MultiSelectKeep.vue'
|
||||||
import { useGlobalStore } from '@/store/useGlobalStore'
|
import { useGlobalStore } from '@/store/useGlobalStore'
|
||||||
import HistoryRecord from '@/components/HistoryRecord.vue'
|
import HistoryRecord from '@/components/HistoryRecord.vue'
|
||||||
|
import TipsCarousel from '@/components/TipsCarousel.vue'
|
||||||
import { fuzzySearchHistory, FuzzySearchHistoryRecord } from '@/store/searchHistory'
|
import { fuzzySearchHistory, FuzzySearchHistoryRecord } from '@/store/searchHistory'
|
||||||
import { openTiktokViewWithFiles } from '@/util/tiktokHelper'
|
import { openTiktokViewWithFiles } from '@/util/tiktokHelper'
|
||||||
import { useTagStore } from '@/store/useTagStore'
|
import { useTagStore } from '@/store/useTagStore'
|
||||||
|
|
@ -272,6 +273,9 @@ const { onClearAllSelected, onSelectAll, onReverseSelect } = useKeepMultiSelect(
|
||||||
<a-button @click="saveLoadedFileAsJson" v-if="images.length">{{ $t('saveLoadedImageAsJson') }}</a-button>
|
<a-button @click="saveLoadedFileAsJson" v-if="images.length">{{ $t('saveLoadedImageAsJson') }}</a-button>
|
||||||
<a-button @click="saveAllFileAsJson" v-if="images.length">{{ $t('saveAllAsJson') }}</a-button>
|
<a-button @click="saveAllFileAsJson" v-if="images.length">{{ $t('saveAllAsJson') }}</a-button>
|
||||||
<a-button @click="showHistoryRecord = true">{{ $t('history') }}</a-button>
|
<a-button @click="showHistoryRecord = true">{{ $t('history') }}</a-button>
|
||||||
|
<div class="tips-wrapper">
|
||||||
|
<TipsCarousel :interval="10000" />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<ASpin size="large" :spinning="!queue.isIdle">
|
<ASpin size="large" :spinning="!queue.isIdle">
|
||||||
<AModal v-model:visible="showGenInfo" width="70vw" mask-closable @ok="showGenInfo = false">
|
<AModal v-model:visible="showGenInfo" width="70vw" mask-closable @ok="showGenInfo = false">
|
||||||
|
|
@ -399,6 +403,9 @@ const { onClearAllSelected, onSelectAll, onReverseSelect } = useKeepMultiSelect(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tips-wrapper {
|
||||||
|
padding: 0 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ import { watch } from 'vue'
|
||||||
import { tagSearchHistory } from '@/store/searchHistory'
|
import { tagSearchHistory } from '@/store/searchHistory'
|
||||||
import { useTagStore } from '@/store/useTagStore'
|
import { useTagStore } from '@/store/useTagStore'
|
||||||
import { useLocalStorage } from '@vueuse/core'
|
import { useLocalStorage } from '@vueuse/core'
|
||||||
|
import TipsCarousel from '@/components/TipsCarousel.vue'
|
||||||
|
|
||||||
const props = defineProps<{ tabIdx: number; paneIdx: number, searchScope?: string }>()
|
const props = defineProps<{ tabIdx: number; paneIdx: number, searchScope?: string }>()
|
||||||
const global = useGlobalStore()
|
const global = useGlobalStore()
|
||||||
|
|
@ -315,7 +316,7 @@ const tagIdsToString = (tagIds: TagId[]) => {
|
||||||
</p>
|
</p>
|
||||||
<div class="list-container">
|
<div class="list-container">
|
||||||
<div class="pinned-search">
|
<div class="pinned-search">
|
||||||
Tips: {{ $t('pinnedSearchHistoryDesc') }}
|
<TipsCarousel :interval="10000" />
|
||||||
</div>
|
</div>
|
||||||
<template :key="name" v-for="[name, list] in classifyTags">
|
<template :key="name" v-for="[name, list] in classifyTags">
|
||||||
<ul class="tag-list" v-if="name !== 'Media Type' || list.length > 1">
|
<ul class="tag-list" v-if="name !== 'Media Type' || list.length > 1">
|
||||||
|
|
@ -469,10 +470,9 @@ const tagIdsToString = (tagIds: TagId[]) => {
|
||||||
|
|
||||||
.pinned-search {
|
.pinned-search {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 16px;
|
margin: 8px 16px;
|
||||||
border-radius: 16px;
|
border-radius: 16px;
|
||||||
background: var(--zp-primary-background);
|
background: var(--zp-primary-background);
|
||||||
padding: 8px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.tag-list {
|
.tag-list {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue