feat: implement auto-tagging feature with custom tag rules

- Add AutoTagMatcher singleton class for automatic tag application
- Support filtering by multiple fields (prompt, model, sampler, etc.)
- Add frontend UI for managing auto-tag rules in global settings
- Support AND logic for multiple conditions within a rule
- Integrate with image indexing process
- Add natural language vs tag-style prompt detection and rendering
- Include rule descriptions and usage guidance in UI
- Auto-reload rules when updated via API
pull/852/head
zanllp 2025-11-30 19:00:24 +08:00
parent 2e560e9486
commit d8ed522996
55 changed files with 568 additions and 124 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-a7581aec.js"></script>
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-6c47ee34.js"></script>
<link rel="stylesheet" href="/infinite_image_browsing/fe-static/assets/index-a44325c7.css">
</head>

View File

@ -313,6 +313,10 @@ def infinite_image_browsing_api(app: FastAPI, **kwargs):
async def app_fe_setting(req: AppFeSettingReq):
conn = DataBase.get_conn()
GlobalSetting.save_setting(conn, req.name, req.value)
# 如果更新的是自动标签规则,重新加载
if req.name == "auto_tag_rules":
from scripts.iib.auto_tag import AutoTagMatcher
AutoTagMatcher.reload_rules(conn)
class AppFeSettingDelReq(BaseModel):
name: str

101
scripts/iib/auto_tag.py Normal file
View File

@ -0,0 +1,101 @@
from typing import List, Dict, Any, Optional
import re
from scripts.iib.db.datamodel import GlobalSetting, Tag, ImageTag, DataBase
from scripts.iib.logger import logger
from scripts.iib.parsers.model import ImageGenerationParams
class AutoTagMatcher:
_instance: Optional['AutoTagMatcher'] = None
def __init__(self, conn):
self.conn = conn
self.rules = self.load_rules()
@classmethod
def get_instance(cls, conn) -> 'AutoTagMatcher':
"""获取全局单例实例"""
if cls._instance is None:
cls._instance = cls(conn)
else:
# 更新连接
cls._instance.conn = conn
return cls._instance
@classmethod
def reload_rules(cls, conn) -> None:
"""重新加载规则"""
if cls._instance is not None:
cls._instance.conn = conn
cls._instance.rules = cls._instance.load_rules()
def load_rules(self) -> List[Dict[str, Any]]:
try:
setting = GlobalSetting.get_setting(self.conn, "auto_tag_rules")
print("Loaded auto tag rules:", setting)
if setting:
return setting
except Exception as e:
logger.error(f"Error loading auto tag rules: {e}")
return []
def match(self, params: ImageGenerationParams, rule: Dict[str, Any]) -> bool:
# params is ImageGenerationParams
# rule structure: { "tag": "TagName", "filters": [...] }
# filter structure: { "field": "pos_prompt", "operator": "contains", "value": "foo" }
filters = rule.get("filters", [])
if not filters:
return False
for filter in filters:
field = filter.get("field")
operator = filter.get("operator")
value = filter.get("value")
target_value = ""
if field == "pos_prompt":
target_value = ",".join(params.pos_prompt) if isinstance(params.pos_prompt, list) else str(params.pos_prompt)
elif field == "neg_prompt":
# Assuming neg_prompt might be in meta or extra, but params usually has pos_prompt.
# Let's check where negative prompt is usually stored.
# In api.py: params = parse_generation_parameters(content)
# parse_generation_parameters returns dict with "meta", "pos_prompt".
# "meta" usually contains "Negative prompt".
target_value = params.meta.get("Negative prompt", "")
else:
# Try to find in meta
target_value = params.meta.get(field, "")
if not target_value and field in params.extra:
target_value = params.extra.get(field, "")
target_value = str(target_value)
if operator == "contains":
if value.lower() not in target_value.lower():
return False
elif operator == "equals":
if value.lower() != target_value.lower():
return False
elif operator == "regex":
try:
if not re.search(value, target_value, re.IGNORECASE):
return False
except:
return False
# Add more operators if needed
return True
def apply(self, img_id: int, params: Any):
if not self.rules:
return
for rule in self.rules:
try:
if self.match(params, rule):
tag_name = rule.get("tag")
if tag_name:
tag = Tag.get_or_create(self.conn, tag_name, "custom")
ImageTag(img_id, tag.id).save_or_ignore(self.conn)
except Exception as e:
logger.error(f"Error applying auto tag rule {rule}: {e}")

View File

@ -908,7 +908,7 @@ class DirCoverCache:
else:
return []
# Global settings storage, also use as key-value store
class GlobalSetting:
@classmethod
def create_table(cls, conn):

View File

@ -17,6 +17,7 @@ from scripts.iib.parsers.model import ImageGenerationInfo, ImageGenerationParams
from scripts.iib.logger import logger
from scripts.iib.parsers.index import parse_image_info
from scripts.iib.plugin import plugin_inst_map
from scripts.iib.auto_tag import AutoTagMatcher
# 定义一个函数来获取图片文件的EXIF数据
def get_exif_data(file_path):
@ -222,4 +223,6 @@ def build_single_img_idx(conn, file_path, is_rebuild, safe_save_img_tag):
safe_save_img_tag(ImageTag(img.id, tag.id))
for k in pos:
tag = Tag.get_or_create(conn, k, "pos")
safe_save_img_tag(ImageTag(img.id, tag.id))
safe_save_img_tag(ImageTag(img.id, tag.id))
AutoTagMatcher.get_instance(conn).apply(img.id, parsed_params)

View File

@ -32,7 +32,7 @@ class ComfyUIParser:
params = get_comfyui_exif_data(img)
info = comfyui_exif_data_to_str(params)
except Exception as e:
logger.error("parse comfyui image failed. prompt:")
logger.error("parse comfyui image failed. prompt:", exc_info=e)
logger.error(img.info.get("prompt"))
return ImageGenerationInfo(
params=ImageGenerationParams(

View File

@ -460,11 +460,20 @@ def get_comfyui_exif_data(img: Image):
meta["Model"] = data[KSampler_entry["model"][0]]["inputs"].get("ckpt_name")
meta["Source Identifier"] = "ComfyUI"
def get_text_from_clip(idx: str) :
inputs = data[idx]["inputs"]
text = inputs["text"] if "text" in inputs else inputs["t5xxl"]
if isinstance(text, list): # type:CLIPTextEncode (NSP) mode:Wildcards
text = data[text[0]]["inputs"]["text"]
return text.strip()
try:
inputs = data[idx]["inputs"]
if "text" in inputs:
text = inputs["text"]
elif "t5xxl" in inputs:
text = inputs["t5xxl"]
else:
return ""
if isinstance(text, list): # type:CLIPTextEncode (NSP) mode:Wildcards
text = data[text[0]]["inputs"]["text"]
return text.strip()
except Exception as e:
print(e)
return ""
in_node = data[str(KSampler_entry["positive"][0])]
if in_node["class_type"] != "FluxGuidance":

View File

@ -1 +1 @@
import{d as E,bB as $,r as f,m as M,_ as T,a as c,an as W,h as m,c as v,P as z}from"./index-a7581aec.js";var G=["prefixCls","name","id","type","disabled","readonly","tabindex","autofocus","value","required"],H={prefixCls:String,name:String,id:String,type:String,defaultChecked:{type:[Boolean,Number],default:void 0},checked:{type:[Boolean,Number],default:void 0},disabled:Boolean,tabindex:{type:[Number,String]},readonly:Boolean,autofocus:Boolean,value:z.any,required:Boolean};const L=E({compatConfig:{MODE:3},name:"Checkbox",inheritAttrs:!1,props:$(H,{prefixCls:"rc-checkbox",type:"checkbox",defaultChecked:!1}),emits:["click","change"],setup:function(a,d){var t=d.attrs,h=d.emit,g=d.expose,o=f(a.checked===void 0?a.defaultChecked:a.checked),i=f();M(function(){return a.checked},function(){o.value=a.checked}),g({focus:function(){var e;(e=i.value)===null||e===void 0||e.focus()},blur:function(){var e;(e=i.value)===null||e===void 0||e.blur()}});var l=f(),x=function(e){if(!a.disabled){a.checked===void 0&&(o.value=e.target.checked),e.shiftKey=l.value;var r={target:c(c({},a),{},{checked:e.target.checked}),stopPropagation:function(){e.stopPropagation()},preventDefault:function(){e.preventDefault()},nativeEvent:e};a.checked!==void 0&&(i.value.checked=!!a.checked),h("change",r),l.value=!1}},C=function(e){h("click",e),l.value=e.shiftKey};return function(){var n,e=a.prefixCls,r=a.name,s=a.id,p=a.type,b=a.disabled,K=a.readonly,P=a.tabindex,B=a.autofocus,S=a.value,N=a.required,_=T(a,G),q=t.class,D=t.onFocus,j=t.onBlur,w=t.onKeydown,A=t.onKeypress,F=t.onKeyup,y=c(c({},_),t),O=Object.keys(y).reduce(function(k,u){return(u.substr(0,5)==="aria-"||u.substr(0,5)==="data-"||u==="role")&&(k[u]=y[u]),k},{}),R=W(e,q,(n={},m(n,"".concat(e,"-checked"),o.value),m(n,"".concat(e,"-disabled"),b),n)),V=c(c({name:r,id:s,type:p,readonly:K,disabled:b,tabindex:P,class:"".concat(e,"-input"),checked:!!o.value,autofocus:B,value:S},O),{},{onChange:x,onClick:C,onFocus:D,onBlur:j,onKeydown:w,onKeypress:A,onKeyup:F,required:N});return v("span",{class:R},[v("input",c({ref:i},V),null),v("span",{class:"".concat(e,"-inner")},null)])}}});export{L as V};
import{d as E,bC as $,r as f,m as M,_ as T,a as c,an as W,h as m,c as v,P as z}from"./index-6c47ee34.js";var G=["prefixCls","name","id","type","disabled","readonly","tabindex","autofocus","value","required"],H={prefixCls:String,name:String,id:String,type:String,defaultChecked:{type:[Boolean,Number],default:void 0},checked:{type:[Boolean,Number],default:void 0},disabled:Boolean,tabindex:{type:[Number,String]},readonly:Boolean,autofocus:Boolean,value:z.any,required:Boolean};const L=E({compatConfig:{MODE:3},name:"Checkbox",inheritAttrs:!1,props:$(H,{prefixCls:"rc-checkbox",type:"checkbox",defaultChecked:!1}),emits:["click","change"],setup:function(a,d){var t=d.attrs,h=d.emit,g=d.expose,o=f(a.checked===void 0?a.defaultChecked:a.checked),i=f();M(function(){return a.checked},function(){o.value=a.checked}),g({focus:function(){var e;(e=i.value)===null||e===void 0||e.focus()},blur:function(){var e;(e=i.value)===null||e===void 0||e.blur()}});var l=f(),x=function(e){if(!a.disabled){a.checked===void 0&&(o.value=e.target.checked),e.shiftKey=l.value;var r={target:c(c({},a),{},{checked:e.target.checked}),stopPropagation:function(){e.stopPropagation()},preventDefault:function(){e.preventDefault()},nativeEvent:e};a.checked!==void 0&&(i.value.checked=!!a.checked),h("change",r),l.value=!1}},C=function(e){h("click",e),l.value=e.shiftKey};return function(){var n,e=a.prefixCls,r=a.name,s=a.id,p=a.type,b=a.disabled,K=a.readonly,P=a.tabindex,B=a.autofocus,S=a.value,N=a.required,_=T(a,G),q=t.class,D=t.onFocus,j=t.onBlur,w=t.onKeydown,A=t.onKeypress,F=t.onKeyup,y=c(c({},_),t),O=Object.keys(y).reduce(function(k,u){return(u.substr(0,5)==="aria-"||u.substr(0,5)==="data-"||u==="role")&&(k[u]=y[u]),k},{}),R=W(e,q,(n={},m(n,"".concat(e,"-checked"),o.value),m(n,"".concat(e,"-disabled"),b),n)),V=c(c({name:r,id:s,type:p,readonly:K,disabled:b,tabindex:P,class:"".concat(e,"-input"),checked:!!o.value,autofocus:B,value:S},O),{},{onChange:x,onClick:C,onFocus:D,onBlur:j,onKeydown:w,onKeypress:A,onKeyup:F,required:N});return v("span",{class:R},[v("input",c({ref:i},V),null),v("span",{class:"".concat(e,"-inner")},null)])}}});export{L as V};

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{d as a,U as t,V as s,c as n,cC as _,a0 as o}from"./index-a7581aec.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,U as t,V as s,c as n,cD as _,a0 as o}from"./index-6c47ee34.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};

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.full-screen-menu[data-v-f13874c6]{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-f13874c6]{margin:4px 0}.full-screen-menu .tags-container .tag[data-v-f13874c6]{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-f13874c6]{background:var(--tag-color);color:#fff}.full-screen-menu .container[data-v-f13874c6]{height:100%;display:flex;overflow:hidden;flex-direction:column}.full-screen-menu .gen-info[data-v-f13874c6]{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-f13874c6]{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-f13874c6] .natural-text{margin:.5em 0;line-height:1.6em;text-align:justify;color:var(--zp-primary)}.full-screen-menu .gen-info code[data-v-f13874c6] .short-tag{word-break:break-all;white-space:nowrap}.full-screen-menu .gen-info code[data-v-f13874c6] 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-f13874c6] .has-parentheses.tag{background:rgba(255,100,100,.14)}.full-screen-menu .gen-info code[data-v-f13874c6] span.tag:hover{background:rgba(120,0,0,.15)}.full-screen-menu .gen-info table[data-v-f13874c6]{font-size:1em;border-radius:4px;border-collapse:separate;margin-bottom:3em}.full-screen-menu .gen-info table tr td[data-v-f13874c6]:first-child{white-space:nowrap}.full-screen-menu .gen-info table td[data-v-f13874c6]{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-f13874c6]{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-f13874c6]{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-f13874c6]{padding:4px}.full-screen-menu.unset-size[data-v-f13874c6]{width:unset!important;height:unset!important}.full-screen-menu .mouse-sensor[data-v-f13874c6]{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-f13874c6]{font-size:18px;padding:4px}.full-screen-menu .action-bar[data-v-f13874c6]{display:flex;align-items:center;user-select:none;gap:4px}.full-screen-menu .action-bar .icon[data-v-f13874c6]{font-size:1.5em;padding:2px 4px;border-radius:4px}.full-screen-menu .action-bar .icon[data-v-f13874c6]:hover{background:var(--zp-secondary-variant-background)}.full-screen-menu .action-bar>*[data-v-f13874c6]{flex-wrap:wrap}.full-screen-menu.lr[data-v-f13874c6]{top:var(--6d6bbef8)!important;right:0!important;bottom:0!important;left:100vw!important;height:unset!important;width:var(--ab85ff12)!important;transition:left ease .3s}.full-screen-menu.lr.always-on[data-v-f13874c6],.full-screen-menu.lr.mouse-in[data-v-f13874c6]{left:var(--51e551fb)!important}.tag-alpha-item[data-v-f13874c6]{display:flex;margin-top:4px}.tag-alpha-item h4[data-v-f13874c6]{width:32px;flex-shrink:0}.sort-tag-switch[data-v-f13874c6]{display:inline-block;padding-right:16px;padding-left:8px;cursor:pointer;user-select:none}.sort-tag-switch span[data-v-f13874c6]{transition:all ease .3s;transform:scale(1.2)}.sort-tag-switch:hover span[data-v-f13874c6]{transform:scale(1.3)}.lr-layout-control[data-v-f13874c6]{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-f13874c6]{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

View File

@ -1 +0,0 @@
.full-screen-menu[data-v-e9780c1d]{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-e9780c1d]{margin:4px 0}.full-screen-menu .tags-container .tag[data-v-e9780c1d]{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-e9780c1d]{background:var(--tag-color);color:#fff}.full-screen-menu .container[data-v-e9780c1d]{height:100%;display:flex;overflow:hidden;flex-direction:column}.full-screen-menu .gen-info[data-v-e9780c1d]{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-e9780c1d]{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-e9780c1d] .short-tag{word-break:break-all;white-space:nowrap}.full-screen-menu .gen-info code[data-v-e9780c1d] 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-e9780c1d] .has-parentheses.tag{background:rgba(255,100,100,.14)}.full-screen-menu .gen-info code[data-v-e9780c1d] span.tag:hover{background:rgba(120,0,0,.15)}.full-screen-menu .gen-info table[data-v-e9780c1d]{font-size:1em;border-radius:4px;border-collapse:separate;margin-bottom:3em}.full-screen-menu .gen-info table tr td[data-v-e9780c1d]:first-child{white-space:nowrap}.full-screen-menu .gen-info table td[data-v-e9780c1d]{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-e9780c1d]{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-e9780c1d]{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-e9780c1d]{padding:4px}.full-screen-menu.unset-size[data-v-e9780c1d]{width:unset!important;height:unset!important}.full-screen-menu .mouse-sensor[data-v-e9780c1d]{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-e9780c1d]{font-size:18px;padding:4px}.full-screen-menu .action-bar[data-v-e9780c1d]{display:flex;align-items:center;user-select:none;gap:4px}.full-screen-menu .action-bar .icon[data-v-e9780c1d]{font-size:1.5em;padding:2px 4px;border-radius:4px}.full-screen-menu .action-bar .icon[data-v-e9780c1d]:hover{background:var(--zp-secondary-variant-background)}.full-screen-menu .action-bar>*[data-v-e9780c1d]{flex-wrap:wrap}.full-screen-menu.lr[data-v-e9780c1d]{top:var(--04192c09)!important;right:0!important;bottom:0!important;left:100vw!important;height:unset!important;width:var(--6d773ebc)!important;transition:left ease .3s}.full-screen-menu.lr.always-on[data-v-e9780c1d],.full-screen-menu.lr.mouse-in[data-v-e9780c1d]{left:var(--437eb380)!important}.tag-alpha-item[data-v-e9780c1d]{display:flex;margin-top:4px}.tag-alpha-item h4[data-v-e9780c1d]{width:32px;flex-shrink:0}.sort-tag-switch[data-v-e9780c1d]{display:inline-block;padding-right:16px;padding-left:8px;cursor:pointer;user-select:none}.sort-tag-switch span[data-v-e9780c1d]{transition:all ease .3s;transform:scale(1.2)}.sort-tag-switch:hover span[data-v-e9780c1d]{transform:scale(1.3)}.lr-layout-control[data-v-e9780c1d]{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-e9780c1d]{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

View File

@ -0,0 +1 @@
[data-v-e1bd92bd] .float-panel{position:fixed}.regex-icon[data-v-e1bd92bd]{user-select:none;padding:4px;margin:0 4px;cursor:pointer;border:1px solid var(--zp-border);border-radius:4px}.regex-icon img[data-v-e1bd92bd]{height:1.5em}.regex-icon[data-v-e1bd92bd]:hover{background:var(--zp-border)}.regex-icon.selected[data-v-e1bd92bd]{background:var(--primary-color-1);border:1px solid var(--primary-color)}.search-bar[data-v-e1bd92bd]{padding:8px 8px 0;display:flex}.search-bar.last[data-v-e1bd92bd]{padding-bottom:8px}.search-bar .form-name[data-v-e1bd92bd]{flex-shrink:0;padding:4px 8px}.search-bar .actions>*[data-v-e1bd92bd]{margin-right:4px}.container[data-v-e1bd92bd]{background:var(--zp-secondary-background);position:relative}.container .file-list[data-v-e1bd92bd]{list-style:none;padding:8px;height:100%;overflow:auto;height:var(--pane-max-height);width:100%}

View File

@ -1 +0,0 @@
[data-v-af0b8c79] .float-panel{position:fixed}.regex-icon[data-v-af0b8c79]{user-select:none;padding:4px;margin:0 4px;cursor:pointer;border:1px solid var(--zp-border);border-radius:4px}.regex-icon img[data-v-af0b8c79]{height:1.5em}.regex-icon[data-v-af0b8c79]:hover{background:var(--zp-border)}.regex-icon.selected[data-v-af0b8c79]{background:var(--primary-color-1);border:1px solid var(--primary-color)}.search-bar[data-v-af0b8c79]{padding:8px 8px 0;display:flex}.search-bar.last[data-v-af0b8c79]{padding-bottom:8px}.search-bar .form-name[data-v-af0b8c79]{flex-shrink:0;padding:4px 8px}.search-bar .actions>*[data-v-af0b8c79]{margin-right:4px}.container[data-v-af0b8c79]{background:var(--zp-secondary-background);position:relative}.container .file-list[data-v-af0b8c79]{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

View File

@ -1 +1 @@
import{bT as i,b0 as t,dZ as f,bK as n}from"./index-a7581aec.js";function u(e,s,r){if(!i(r))return!1;var a=typeof s;return(a=="number"?t(r)&&f(s,r.length):a=="string"&&s in r)?n(r[s],e):!1}export{u as i};
import{bU as i,b1 as t,dZ as f,bL as n}from"./index-6c47ee34.js";function u(e,s,r){if(!i(r))return!1;var a=typeof s;return(a=="number"?t(r)&&f(s,r.length):a=="string"&&s in r)?n(r[s],e):!1}export{u as i};

View File

@ -1 +1 @@
import{d as z,a1 as B,cD as $,ca as S,U as _,V as w,W as f,c as l,a3 as d,X as p,Y as c,a4 as s,a2 as A,af as E,cE as R,cF as y,z as V,B as x,ak as T,a0 as U}from"./index-a7581aec.js";import{_ as N}from"./index-22733dc9.js";import{u as L,a as H,f as O,F as W,d as j}from"./FileItem-3fd7894f.js";import"./numInput.vue_vue_type_style_index_0_scoped_55978858_lang-561967bb.js";/* empty css */import"./_isIterateeCall-c7210029.js";import"./index-285022d6.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(Y){const{stackViewEl:D}=L().toRefs(),{itemSize:h,gridItems:b,cellWidth:g}=H(),i=B(),m=O(),{selectdFiles:o}=$(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:o.value.map(u=>u.fullpath),compress:i.batchDownloadCompress,pack_only:!1},{responseType:"blob"}),t=window.URL.createObjectURL(new Blob([e.data])),a=document.createElement("a");a.href=t,a.setAttribute("download",`iib_${new Date().toLocaleString()}.zip`),document.body.appendChild(a),a.click()})},I=async()=>{r.pushAction(async()=>{await y.value.post("/zip",{paths:o.value.map(e=>e.fullpath),compress:i.batchDownloadCompress,pack_only:!0},{responseType:"blob"}),V.success(x("success"))})},F=e=>{o.value.splice(e,1)};return(e,t)=>{const a=T,u=N;return _(),w("div",{class:"container",ref_key:"stackViewEl",ref:D,onDrop:v},[f("div",q,[l(a,{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(a,{onClick:I,type:"primary",loading:!s(r).isIdle},{default:d(()=>[p(c(e.$t("packOnlyNotDownload")),1)]),_:1},8,["loading"]),l(a,{onClick:C,type:"primary",loading:!s(r).isIdle},{default:d(()=>[p(c(e.$t("zipDownload")),1)]),_:1},8,["loading"])]),s(o).length?(_(),A(s(j),{key:1,ref:"scroller",class:"file-list",items:s(o).slice(),"item-size":s(h).first,"key-field":"fullpath","item-secondary-size":s(h).second,gridItems:s(b)},{default:d(({item:n,index:k})=>[l(W,{idx:k,file:n,"cell-width":s(g),"enable-close-icon":"",onCloseIconClick:J=>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=U(X,[["__scopeId","data-v-a2642a17"]]);export{oe as default};
import{d as z,a1 as B,cE as $,cb as S,U as _,V as w,W as f,c as l,a3 as d,X as p,Y as c,a4 as s,a2 as A,af as E,cF as R,cG as y,z as V,B as x,ak as T,a0 as U}from"./index-6c47ee34.js";import{_ as N}from"./index-60632a00.js";import{u as L,a as G,f as H,F as O,d as W}from"./FileItem-62bbdd6d.js";import"./numInput.vue_vue_type_style_index_0_scoped_55978858_lang-8b933f81.js";/* empty css */import"./_isIterateeCall-026674a9.js";import"./index-34c112d0.js";const j={class:"actions-panel actions"},q={class:"item"},P={key:0,class:"file-list"},Q={class:"hint"},X=z({__name:"batchDownload",props:{tabIdx:{},paneIdx:{},id:{}},setup(Y){const{stackViewEl:b}=L().toRefs(),{itemSize:h,gridItems:D,cellWidth:g}=G(),i=B(),m=H(),{selectdFiles:o}=$(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:o.value.map(u=>u.fullpath),compress:i.batchDownloadCompress,pack_only:!1},{responseType:"blob"}),t=window.URL.createObjectURL(new Blob([e.data])),a=document.createElement("a");a.href=t,a.setAttribute("download",`iib_${new Date().toLocaleString()}.zip`),document.body.appendChild(a),a.click()})},I=async()=>{r.pushAction(async()=>{await y.value.post("/zip",{paths:o.value.map(e=>e.fullpath),compress:i.batchDownloadCompress,pack_only:!0},{responseType:"blob"}),V.success(x("success"))})},F=e=>{o.value.splice(e,1)};return(e,t)=>{const a=T,u=N;return _(),w("div",{class:"container",ref_key:"stackViewEl",ref:b,onDrop:v},[f("div",j,[l(a,{onClick:t[0]||(t[0]=n=>s(m).selectdFiles=[])},{default:d(()=>[p(c(e.$t("clear")),1)]),_:1}),f("div",q,[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(a,{onClick:I,type:"primary",loading:!s(r).isIdle},{default:d(()=>[p(c(e.$t("packOnlyNotDownload")),1)]),_:1},8,["loading"]),l(a,{onClick:C,type:"primary",loading:!s(r).isIdle},{default:d(()=>[p(c(e.$t("zipDownload")),1)]),_:1},8,["loading"])]),s(o).length?(_(),A(s(W),{key:1,ref:"scroller",class:"file-list",items:s(o).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(O,{idx:k,file:n,"cell-width":s(g),"enable-close-icon":"",onCloseIconClick:J=>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=U(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

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-6b265587.js vendored Normal file
View File

@ -0,0 +1 @@
import{u as w,a as y,F as k,d as x}from"./FileItem-62bbdd6d.js";import{d as F,a1 as h,c8 as b,r as D,bh as I,bl as C,U as V,V as E,c,a3 as z,a4 as e,af as S,cF as B,cH as R,a0 as A}from"./index-6c47ee34.js";import"./numInput.vue_vue_type_style_index_0_scoped_55978858_lang-8b933f81.js";/* empty css */import"./_isIterateeCall-026674a9.js";import"./index-34c112d0.js";const H=F({__name:"gridView",props:{tabIdx:{},paneIdx:{},id:{},removable:{type:Boolean},allowDragAndDrop:{type:Boolean},files:{},paneKey:{}},setup(p){const o=p,d=h(),{stackViewEl:m}=w().toRefs(),{itemSize:i,gridItems:u,cellWidth:f}=y(),g=b(),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)=>(V(),E("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:z(({item:t,index:r})=>{var n;return[c(k,{idx:r,file:t,"cell-width":e(f),"enable-close-icon":o.removable,onCloseIconClick:K=>v(r),"full-screen-preview-image-url":e(S)(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(H,[["__scopeId","data-v-f35f4802"]]);export{N as default};

View File

@ -1 +0,0 @@
import{u as w,a as k,F as y,d as x}from"./FileItem-3fd7894f.js";import{d as F,a1 as b,c7 as h,r as D,bg as I,bk as C,U as E,V,c,a3 as z,a4 as e,af as S,cE as B,cG as R,a0 as A}from"./index-a7581aec.js";import"./numInput.vue_vue_type_style_index_0_scoped_55978858_lang-561967bb.js";/* empty css */import"./_isIterateeCall-c7210029.js";import"./index-285022d6.js";const G=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}=k(),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(),V("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:z(({item:t,index:r})=>{var n;return[c(y,{idx:r,file:t,"cell-width":e(f),"enable-close-icon":o.removable,onCloseIconClick:K=>v(r),"full-screen-preview-image-url":e(S)(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(G,[["__scopeId","data-v-f35f4802"]]);export{N as default};

View File

@ -1 +1 @@
import{am as F,r as g,l as N,k as A,O as b,G as P,ca as R,cl as O,cq as z}from"./index-a7581aec.js";import{u as L,a as Q,b as j,e as H}from"./FileItem-3fd7894f.js";import{a as T,b as U,c as W}from"./MultiSelectKeep-18d7b6cc.js";import{u as B}from"./useGenInfoDiff-1503a124.js";let K=0;const V=()=>++K,X=(n,i,{dataUpdateStrategy:l="replace"}={})=>{const o=F([""]),c=g(!1),t=g(),a=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(a.value||c.value&&typeof e>"u")return!1;a.value=!0;const s=V();f.value=s;try{let r;if(typeof e=="number"){if(r=o[e],typeof r!="string")return!1}else r=o[o.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===o.length-1||typeof e!="number")&&(c.value=!u.has_next,u.has_next)){const m=u.next_cursor||u.next;b(typeof m=="string"),o.push(m)}}finally{f.value===s&&(a.value=!1)}return!0}),p=()=>{v.add(f.value),a.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&&p(),b(!a.value),o.splice(0,o.length,""),a.value=!1,t.value=void 0,c.value=!1,s&&(yield d())}),I=()=>({next:()=>A(void 0,void 0,void 0,function*(){if(a.value)throw new Error("不允许同时迭代");return{done:!(yield d()),value:t.value}})});return N({abort:p,load:c,next:d,res:t,loading:a,cursorStack:o,reset:x,[Symbol.asyncIterator]:I,iter:{[Symbol.asyncIterator]:I}})},se=n=>F(X(n,i=>i.files,{dataUpdateStrategy:"merge"})),ne=n=>{const i=F(new Set),l=P(()=>(n.res??[]).filter(y=>!i.has(y.fullpath))),o=R(),{stackViewEl:c,multiSelectedIdxs:t,stack:a,scroller:f,props:v}=L({images:l}).toRefs(),{itemSize:w,gridItems:d,cellWidth:p,onScroll:x}=Q({fetchNext:()=>n.next()}),{showMenuIdx:I}=j(),{onFileDragStart:e,onFileDragEnd:s}=T(),{showGenInfo:r,imageGenInfo:h,q:u,onContextMenuClick:m,onFileItemClick:C}=U({openNext:O}),{previewIdx:_,previewing:E,onPreviewVisibleChange:M,previewImgMove:q,canPreview:D}=W({loadNext:()=>n.next()}),G=async(y,S,J)=>{a.value=[{curr:"",files:l.value}],await m(y,S,J)};H("removeFiles",async({paths:y})=>{y.forEach(S=>i.add(S))});const k=()=>{z(l.value)};return{images:l,scroller:f,queue:o,iter:n,onContextMenuClickU:G,stackViewEl:c,previewIdx:_,previewing:E,onPreviewVisibleChange:M,previewImgMove:q,canPreview:D,itemSize:w,gridItems:d,showGenInfo:r,imageGenInfo:h,q:u,onContextMenuClick:m,onFileItemClick:C,showMenuIdx:I,multiSelectedIdxs:t,onFileDragStart:e,onFileDragEnd:s,cellWidth:p,onScroll:x,saveLoadedFileAsJson:k,saveAllFileAsJson:async()=>{for(;!n.load;)await n.next();k()},props:v,...B()}};export{se as c,ne as u};
import{am as F,r as g,l as P,k as A,O as b,G as R,cb as q,cm as O,cr as z}from"./index-6c47ee34.js";import{u as L,a as Q,b as j,e as H}from"./FileItem-62bbdd6d.js";import{a as T,b as U,c as W}from"./MultiSelectKeep-44266caf.js";import{u as B}from"./useGenInfoDiff-e092c21c.js";let K=0;const V=()=>++K,X=(n,i,{dataUpdateStrategy:l="replace"}={})=>{const o=F([""]),c=g(!1),t=g(),a=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(a.value||c.value&&typeof e>"u")return!1;a.value=!0;const s=V();f.value=s;try{let r;if(typeof e=="number"){if(r=o[e],typeof r!="string")return!1}else r=o[o.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===o.length-1||typeof e!="number")&&(c.value=!u.has_next,u.has_next)){const m=u.next_cursor||u.next;b(typeof m=="string"),o.push(m)}}finally{f.value===s&&(a.value=!1)}return!0}),p=()=>{v.add(f.value),a.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&&p(),b(!a.value),o.splice(0,o.length,""),a.value=!1,t.value=void 0,c.value=!1,s&&(yield d())}),I=()=>({next:()=>A(void 0,void 0,void 0,function*(){if(a.value)throw new Error("不允许同时迭代");return{done:!(yield d()),value:t.value}})});return P({abort:p,load:c,next:d,res:t,loading:a,cursorStack:o,reset:x,[Symbol.asyncIterator]:I,iter:{[Symbol.asyncIterator]:I}})},se=n=>F(X(n,i=>i.files,{dataUpdateStrategy:"merge"})),ne=n=>{const i=F(new Set),l=R(()=>(n.res??[]).filter(y=>!i.has(y.fullpath))),o=q(),{stackViewEl:c,multiSelectedIdxs:t,stack:a,scroller:f,props:v}=L({images:l}).toRefs(),{itemSize:w,gridItems:d,cellWidth:p,onScroll:x}=Q({fetchNext:()=>n.next()}),{showMenuIdx:I}=j(),{onFileDragStart:e,onFileDragEnd:s}=T(),{showGenInfo:r,imageGenInfo:h,q:u,onContextMenuClick:m,onFileItemClick:C}=U({openNext:O}),{previewIdx:_,previewing:E,onPreviewVisibleChange:M,previewImgMove:D,canPreview:G}=W({loadNext:()=>n.next()}),J=async(y,S,N)=>{a.value=[{curr:"",files:l.value}],await m(y,S,N)};H("removeFiles",async({paths:y})=>{y.forEach(S=>i.add(S))});const k=()=>{z(l.value)};return{images:l,scroller:f,queue:o,iter:n,onContextMenuClickU:J,stackViewEl:c,previewIdx:_,previewing:E,onPreviewVisibleChange:M,previewImgMove:D,canPreview:G,itemSize:w,gridItems:d,showGenInfo:r,imageGenInfo:h,q:u,onContextMenuClick:m,onFileItemClick:C,showMenuIdx:I,multiSelectedIdxs:t,onFileDragStart:e,onFileDragEnd:s,cellWidth:p,onScroll:x,saveLoadedFileAsJson:k,saveAllFileAsJson:async()=>{for(;!n.load;)await n.next();k()},props:v,...B()}};export{se as c,ne as u};

View File

@ -1 +1 @@
import{r as F,o as P,cv as K,av as L,G as l,ax as T,ay as $,d as I,u as B,cw as _,b as y,bj as V,cx as A,an as E,h as c,c as M,a as G}from"./index-a7581aec.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:l(function(){}),wrap:l(function(){}),supportFlexGap:l(function(){})})};$("top","middle","bottom","stretch");$("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=I({compatConfig:{MODE:3},name:"ARow",props:q(),setup:function(r,N){var m=N.slots,v=B("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=l(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(i,b){if(y(i)==="object")for(var a=0;a<A.length;a++){var p=A[a];if(x.value[p]&&i[p]!==void 0){e[b]=i[p];break}}else e[b]=i||0}),e});U({gutter:S,supportFlexGap:w,wrap:l(function(){return r.wrap})});var R=l(function(){var e;return E(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=l(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=I({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=B("col",r),w=x.prefixCls,S=x.direction,R=l(function(){var e,t=r.span,n=r.order,s=r.offset,i=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))}),E(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(i),i),c(e,"".concat(a,"-pull-").concat(b),b),e),p)}),O=l(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 i="".concat(t[1]/2,"px");n.paddingTop=i,n.paddingBottom=i}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 F,o as P,cw as K,av as L,G as l,ax as T,ay as $,d as I,u as B,cx as _,b as y,bk as V,cy as A,an as E,h as c,c as M,a as G}from"./index-6c47ee34.js";const W=function(){var o=F(!1);return P(function(){o.value=K()}),o};var D=Symbol("rowContextKey"),k=function(r){T(D,r)},U=function(){return L(D,{gutter:l(function(){}),wrap:l(function(){}),supportFlexGap:l(function(){})})};$("top","middle","bottom","stretch");$("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=I({compatConfig:{MODE:3},name:"ARow",props:q(),setup:function(r,N){var m=N.slots,v=B("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=l(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(i,b){if(y(i)==="object")for(var a=0;a<A.length;a++){var p=A[a];if(x.value[p]&&i[p]!==void 0){e[b]=i[p];break}}else e[b]=i||0}),e});k({gutter:S,supportFlexGap:w,wrap:l(function(){return r.wrap})});var R=l(function(){var e;return E(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=l(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=I({compatConfig:{MODE:3},name:"ACol",props:Q(),setup:function(r,N){var m=N.slots,v=U(),d=v.gutter,h=v.supportFlexGap,j=v.wrap,x=B("col",r),w=x.prefixCls,S=x.direction,R=l(function(){var e,t=r.span,n=r.order,s=r.offset,i=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))}),E(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(i),i),c(e,"".concat(a,"-pull-").concat(b),b),e),p)}),O=l(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 i="".concat(t[1]/2,"px");n.paddingTop=i,n.paddingBottom=i}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};

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{d as x,a1 as $,aK as g,cH as b,r as w,U as p,V as i,W as a,c as r,a3 as d,X as u,Y as n,Z as B,a8 as I,a4 as m,y as V,z as _,B as v,aj as W,ak as D,cI as N,a0 as R}from"./index-a7581aec.js";/* empty css */const F={class:"container"},K={class:"actions"},L={class:"uni-desc"},U={class:"snapshot"},j=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 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(),i("div",F,[a("div",K,[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:d(()=>[u(n(e.$t("saveWorkspaceSnapshot")),1)]),_:1})]),a("p",L,n(e.$t("WorkspaceSnapshotDesc")),1),a("ul",U,[(p(!0),i(B,null,I(m(t).snapshots,s=>(p(),i("li",{key:s.id},[a("div",null,[a("span",null,n(s.name),1)]),a("div",null,[r(l,{onClick:S=>f(s)},{default:d(()=>[u(n(e.$t("restore")),1)]),_:2},1032,["onClick"]),r(l,{onClick:S=>m(k)(s)},{default:d(()=>[u(n(e.$t("remove")),1)]),_:2},1032,["onClick"])])]))),128))])])}}});const E=R(j,[["__scopeId","data-v-2c44013c"]]);export{E as default};
import{d as x,a1 as $,aK as g,cI as b,r as w,U as p,V as i,W as a,c as r,a3 as d,X as u,Y as n,Z as B,a8 as I,a4 as m,y as V,z as _,B as v,aj as W,ak as D,cJ as N,a0 as R}from"./index-6c47ee34.js";/* empty css */const F={class:"container"},K={class:"actions"},L={class:"uni-desc"},U={class:"snapshot"},j=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 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(),i("div",F,[a("div",K,[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:d(()=>[u(n(e.$t("saveWorkspaceSnapshot")),1)]),_:1})]),a("p",L,n(e.$t("WorkspaceSnapshotDesc")),1),a("ul",U,[(p(!0),i(B,null,I(m(t).snapshots,s=>(p(),i("li",{key:s.id},[a("div",null,[a("span",null,n(s.name),1)]),a("div",null,[r(l,{onClick:S=>f(s)},{default:d(()=>[u(n(e.$t("restore")),1)]),_:2},1032,["onClick"]),r(l,{onClick:S=>m(k)(s)},{default:d(()=>[u(n(e.$t("remove")),1)]),_:2},1032,["onClick"])])]))),128))])])}}});const E=R(j,[["__scopeId","data-v-2c44013c"]]);export{E as default};

View File

@ -1 +1 @@
import{cu as j,ay as z,d as K,j as U,dg as $,w,r as b,G as S,m as A,u as D,o as E,az as G,h as d,c as s,a as C,aw as H,be as L,g as _,dh as W,P as u,di as x}from"./index-a7581aec.js";var R=z("small","default"),q=function(){return{id:String,prefixCls:String,size:u.oneOf(R),disabled:{type:Boolean,default:void 0},checkedChildren:u.any,unCheckedChildren:u.any,tabindex:u.oneOfType([u.string,u.number]),autofocus:{type:Boolean,default:void 0},loading:{type:Boolean,default:void 0},checked:u.oneOfType([u.string,u.number,u.looseBool]),checkedValue:u.oneOfType([u.string,u.number,u.looseBool]).def(!0),unCheckedValue:u.oneOfType([u.string,u.number,u.looseBool]).def(!1),onChange:{type:Function},onClick:{type:Function},onKeydown:{type:Function},onMouseup:{type:Function},"onUpdate:checked":{type:Function},onBlur:Function,onFocus:Function}},J=K({compatConfig:{MODE:3},name:"ASwitch",__ANT_SWITCH:!0,inheritAttrs:!1,props:q(),slots:["checkedChildren","unCheckedChildren"],setup:function(n,r){var o=r.attrs,y=r.slots,B=r.expose,l=r.emit,m=U();$(function(){w(!("defaultChecked"in o),"Switch","'defaultChecked' is deprecated, please use 'v-model:checked'"),w(!("value"in o),"Switch","`value` is not validate prop, do you mean `checked`?")});var h=b(n.checked!==void 0?n.checked:o.defaultChecked),f=S(function(){return h.value===n.checkedValue});A(function(){return n.checked},function(){h.value=n.checked});var v=D("switch",n),c=v.prefixCls,F=v.direction,T=v.size,i=b(),g=function(){var e;(e=i.value)===null||e===void 0||e.focus()},V=function(){var e;(e=i.value)===null||e===void 0||e.blur()};B({focus:g,blur:V}),E(function(){G(function(){n.autofocus&&!n.disabled&&i.value.focus()})});var k=function(e,t){n.disabled||(l("update:checked",e),l("change",e,t),m.onFieldChange())},I=function(e){l("blur",e)},N=function(e){g();var t=f.value?n.unCheckedValue:n.checkedValue;k(t,e),l("click",t,e)},M=function(e){e.keyCode===x.LEFT?k(n.unCheckedValue,e):e.keyCode===x.RIGHT&&k(n.checkedValue,e),l("keydown",e)},O=function(e){var t;(t=i.value)===null||t===void 0||t.blur(),l("mouseup",e)},P=S(function(){var a;return a={},d(a,"".concat(c.value,"-small"),T.value==="small"),d(a,"".concat(c.value,"-loading"),n.loading),d(a,"".concat(c.value,"-checked"),f.value),d(a,"".concat(c.value,"-disabled"),n.disabled),d(a,c.value,!0),d(a,"".concat(c.value,"-rtl"),F.value==="rtl"),a});return function(){var a;return s(W,{insertExtraNode:!0},{default:function(){return[s("button",C(C(C({},H(n,["prefixCls","checkedChildren","unCheckedChildren","checked","autofocus","checkedValue","unCheckedValue","id","onChange","onUpdate:checked"])),o),{},{id:(a=n.id)!==null&&a!==void 0?a:m.id.value,onKeydown:M,onClick:N,onBlur:I,onMouseup:O,type:"button",role:"switch","aria-checked":h.value,disabled:n.disabled||n.loading,class:[o.class,P.value],ref:i}),[s("div",{class:"".concat(c.value,"-handle")},[n.loading?s(L,{class:"".concat(c.value,"-loading-icon")},null):null]),s("span",{class:"".concat(c.value,"-inner")},[f.value?_(y,n,"checkedChildren"):_(y,n,"unCheckedChildren")])])]}})}}});const X=j(J);export{X as _};
import{cv as j,ay as z,d as K,j as U,dg as $,w,r as b,G as S,m as A,u as D,o as E,az as G,h as d,c as s,a as C,aw as H,bf as L,g as _,dh as W,P as c,di as x}from"./index-6c47ee34.js";var R=z("small","default"),q=function(){return{id:String,prefixCls:String,size:c.oneOf(R),disabled:{type:Boolean,default:void 0},checkedChildren:c.any,unCheckedChildren:c.any,tabindex:c.oneOfType([c.string,c.number]),autofocus:{type:Boolean,default:void 0},loading:{type:Boolean,default:void 0},checked:c.oneOfType([c.string,c.number,c.looseBool]),checkedValue:c.oneOfType([c.string,c.number,c.looseBool]).def(!0),unCheckedValue:c.oneOfType([c.string,c.number,c.looseBool]).def(!1),onChange:{type:Function},onClick:{type:Function},onKeydown:{type:Function},onMouseup:{type:Function},"onUpdate:checked":{type:Function},onBlur:Function,onFocus:Function}},J=K({compatConfig:{MODE:3},name:"ASwitch",__ANT_SWITCH:!0,inheritAttrs:!1,props:q(),slots:["checkedChildren","unCheckedChildren"],setup:function(n,r){var o=r.attrs,y=r.slots,B=r.expose,l=r.emit,m=U();$(function(){w(!("defaultChecked"in o),"Switch","'defaultChecked' is deprecated, please use 'v-model:checked'"),w(!("value"in o),"Switch","`value` is not validate prop, do you mean `checked`?")});var h=b(n.checked!==void 0?n.checked:o.defaultChecked),f=S(function(){return h.value===n.checkedValue});A(function(){return n.checked},function(){h.value=n.checked});var v=D("switch",n),u=v.prefixCls,F=v.direction,T=v.size,i=b(),g=function(){var e;(e=i.value)===null||e===void 0||e.focus()},V=function(){var e;(e=i.value)===null||e===void 0||e.blur()};B({focus:g,blur:V}),E(function(){G(function(){n.autofocus&&!n.disabled&&i.value.focus()})});var k=function(e,t){n.disabled||(l("update:checked",e),l("change",e,t),m.onFieldChange())},I=function(e){l("blur",e)},N=function(e){g();var t=f.value?n.unCheckedValue:n.checkedValue;k(t,e),l("click",t,e)},M=function(e){e.keyCode===x.LEFT?k(n.unCheckedValue,e):e.keyCode===x.RIGHT&&k(n.checkedValue,e),l("keydown",e)},O=function(e){var t;(t=i.value)===null||t===void 0||t.blur(),l("mouseup",e)},P=S(function(){var a;return a={},d(a,"".concat(u.value,"-small"),T.value==="small"),d(a,"".concat(u.value,"-loading"),n.loading),d(a,"".concat(u.value,"-checked"),f.value),d(a,"".concat(u.value,"-disabled"),n.disabled),d(a,u.value,!0),d(a,"".concat(u.value,"-rtl"),F.value==="rtl"),a});return function(){var a;return s(W,{insertExtraNode:!0},{default:function(){return[s("button",C(C(C({},H(n,["prefixCls","checkedChildren","unCheckedChildren","checked","autofocus","checkedValue","unCheckedValue","id","onChange","onUpdate:checked"])),o),{},{id:(a=n.id)!==null&&a!==void 0?a:m.id.value,onKeydown:M,onClick:N,onBlur:I,onMouseup:O,type:"button",role:"switch","aria-checked":h.value,disabled:n.disabled||n.loading,class:[o.class,P.value],ref:i}),[s("div",{class:"".concat(u.value,"-handle")},[n.loading?s(L,{class:"".concat(u.value,"-loading-icon")},null):null]),s("span",{class:"".concat(u.value,"-inner")},[f.value?_(y,n,"checkedChildren"):_(y,n,"unCheckedChildren")])])]}})}}});const X=j(J);export{X as _};

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{d as w,bB as A,av as D,cy as B,az as j,n as k,cz as V,cA as y,e as $,c as a,_ as T,h as r,a as P,cB as M,P as b}from"./index-a7581aec.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=w({compatConfig:{MODE:3},name:"ASpin",inheritAttrs:!1,props:A(W(),{size:"default",spinning:!0,wrapperClassName:""}),setup:function(){return{originalUpdateSpinning:null,configProvider:D("configProvider",B)}},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;j(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=k(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,z=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"),z==="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 w,bC as A,av as D,cz as j,az as k,n as B,cA as V,cB as y,e as $,c as a,_ as T,h as r,a as P,cC as M,P as b}from"./index-6c47ee34.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=w({compatConfig:{MODE:3},name:"ASpin",inheritAttrs:!1,props:A(W(),{size:"default",spinning:!0,wrapperClassName:""}),setup:function(){return{originalUpdateSpinning:null,configProvider:D("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,C=o.wrapperClassName,l=this.$attrs,v=l.class,N=l.style,_=T(l,O),S=this.configProvider,U=S.getPrefixCls,z=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"),z==="rtl"),r(i,v,!!v),i),m=a("div",P(P({},_),{},{style:N,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"),C]},[u&&a("div",{key:"loading"},[m]),a("div",{class:I,key:"container"},[g])])}return m}});export{H as S,G as s};

View File

@ -1 +0,0 @@
import{cj as e,ck as i,cl as r,cm as a,b0 as c}from"./index-a7581aec.js";function o(s,t){return e(i(s,t,r),s+"")}function b(s){return a(s)&&c(s)}export{o as b,b as i};

View File

@ -0,0 +1 @@
import{ck as e,cl as i,cm as r,cn as a,b1 as n}from"./index-6c47ee34.js";function o(s,t){return e(i(s,t,r),s+"")}function b(s){return a(s)&&n(s)}export{o as b,b as i};

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
import{d as Z,a1 as ee,r as F,J as te,K as le,o as ie,U as v,V as N,c as i,a4 as e,W as g,a3 as n,X as k,Y as u,a5 as R,L as se,a6 as ae,af as oe,ag as $,$ as A,a2 as ne,z as w,B as re,cK as ce,cL as de,ak as ue,ai as me,T as fe,a0 as pe}from"./index-6c47ee34.js";import{u as ve,c as ge,a as ke,F as we,d as he}from"./FileItem-62bbdd6d.js";import{a as Ce,b as Se,c as _e,M as Ie,o as z,L as ye,R as xe,f as be}from"./MultiSelectKeep-44266caf.js";import"./numInput.vue_vue_type_style_index_0_scoped_55978858_lang-8b933f81.js";/* empty css */import"./_isIterateeCall-026674a9.js";import"./index-34c112d0.js";import"./shortcut-099a5f5f.js";import"./Checkbox-b2e83bba.js";import"./index-60632a00.js";const Ve={class:"refresh-button"},Me={class:"hint"},Te={key:0,class:"preview-switch"},Fe=Z({__name:"randomImage",props:{tabIdx:{},paneIdx:{},id:{},paneKey:{}},setup(Ne){const B=ee(),m=F(!1),l=F([]),r=l,h=te(`${le}randomImageSettingNotificationShown`,!1),K=()=>{h.value||(w.info({content:re("randomImageSettingNotification"),duration:6,key:"randomImageSetting"}),h.value=!0)},f=async()=>{try{m.value=!0;const s=await ce();s.length===0&&w.warn("No data, please generate index in image search page first"),l.value=s}finally{m.value=!1,_()}},C=()=>{if(l.value.length===0){w.warn("没有图片可以浏览");return}z(l.value,o.value||0)};ie(()=>{f(),setTimeout(()=>{K()},2e3)});const{stackViewEl:L,multiSelectedIdxs:p,stack:P,scroller:U}=ve({images:l}).toRefs(),{onClearAllSelected:D,onSelectAll:E,onReverseSelect:G}=ge();Ce();const{itemSize:S,gridItems:O,cellWidth:W,onScroll:_}=ke(),{showGenInfo:c,imageGenInfo:I,q,onContextMenuClick:H,onFileItemClick:J}=Se({openNext:de}),{previewIdx:o,previewing:y,onPreviewVisibleChange:Q,previewImgMove:x,canPreview:b}=_e(),V=async(s,t,d)=>{P.value=[{curr:"",files:l.value}],await H(s,t,d)};return(s,t)=>{var M;const d=ue,X=me,Y=fe;return v(),N("div",{class:"container",ref_key:"stackViewEl",ref:L},[i(Ie,{show:!!e(p).length||e(B).keepMultiSelect,onClearAllSelected:e(D),onSelectAll:e(E),onReverseSelect:e(G)},null,8,["show","onClearAllSelected","onSelectAll","onReverseSelect"]),g("div",Ve,[i(d,{onClick:f,onTouchstart:R(f,["prevent"]),type:"primary",loading:m.value,shape:"round"},{default:n(()=>[k(u(s.$t("shuffle")),1)]),_:1},8,["onTouchstart","loading"]),i(d,{onClick:C,onTouchstart:R(C,["prevent"]),type:"default",disabled:!((M=l.value)!=null&&M.length),shape:"round"},{default:n(()=>[k(u(s.$t("tiktokView")),1)]),_:1},8,["onTouchstart","disabled"])]),i(Y,{visible:e(c),"onUpdate:visible":t[1]||(t[1]=a=>ae(c)?c.value=a:null),width:"70vw","mask-closable":"",onOk:t[2]||(t[2]=a=>c.value=!1)},{cancelText:n(()=>[]),default:n(()=>[i(X,{active:"",loading:!e(q).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]=a=>e(se)(e(I)))},[g("div",Me,u(s.$t("doubleClickToCopy")),1),k(" "+u(e(I)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),i(e(he),{ref_key:"scroller",ref:U,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:a,index:T})=>[i(we,{idx:T,file:a,"cell-width":e(W),"full-screen-preview-image-url":e(r)[e(o)]?e(oe)(e(r)[e(o)]):"",onContextMenuClick:V,onPreviewVisibleChange:e(Q),"is-selected-mutil-files":e(p).length>1,selected:e(p).includes(T),onFileItemClick:e(J),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,[i(e(ye),{onClick:t[3]||(t[3]=a=>e(x)("prev")),class:$({disable:!e(b)("prev")})},null,8,["class"]),i(e(xe),{onClick:t[4]||(t[4]=a=>e(x)("next")),class:$({disable:!e(b)("next")})},null,8,["class"])])):A("",!0),e(y)&&e(r)&&e(r)[e(o)]?(v(),ne(be,{key:1,file:e(r)[e(o)],idx:e(o),onContextMenuClick:V},null,8,["file","idx"])):A("",!0)],512)}}});const Ge=pe(Fe,[["__scopeId","data-v-49082269"]]);export{Ge as default};

View File

@ -1 +0,0 @@
import{d as Z,a1 as ee,r as F,J as te,K as le,o as ie,U as v,V as N,c as i,a4 as e,W as g,a3 as n,X as k,Y as u,a5 as R,L as se,a6 as ae,af as oe,ag as $,$ as A,a2 as ne,z as w,B as re,cJ as ce,cK as de,ak as ue,ai as me,T as fe,a0 as pe}from"./index-a7581aec.js";import{u as ve,c as ge,a as ke,F as we,d as he}from"./FileItem-3fd7894f.js";import{a as Ce,b as Se,c as _e,M as Ie,o as z,L as ye,R as xe,f as be}from"./MultiSelectKeep-18d7b6cc.js";import"./numInput.vue_vue_type_style_index_0_scoped_55978858_lang-561967bb.js";/* empty css */import"./_isIterateeCall-c7210029.js";import"./index-285022d6.js";import"./shortcut-083d300d.js";import"./Checkbox-b89743db.js";import"./index-22733dc9.js";const Ve={class:"refresh-button"},Me={class:"hint"},Te={key:0,class:"preview-switch"},Fe=Z({__name:"randomImage",props:{tabIdx:{},paneIdx:{},id:{},paneKey:{}},setup(Ne){const B=ee(),m=F(!1),l=F([]),r=l,h=te(`${le}randomImageSettingNotificationShown`,!1),K=()=>{h.value||(w.info({content:re("randomImageSettingNotification"),duration:6,key:"randomImageSetting"}),h.value=!0)},f=async()=>{try{m.value=!0;const s=await ce();s.length===0&&w.warn("No data, please generate index in image search page first"),l.value=s}finally{m.value=!1,_()}},C=()=>{if(l.value.length===0){w.warn("没有图片可以浏览");return}z(l.value,o.value||0)};ie(()=>{f(),setTimeout(()=>{K()},2e3)});const{stackViewEl:P,multiSelectedIdxs:p,stack:L,scroller:U}=ve({images:l}).toRefs(),{onClearAllSelected:D,onSelectAll:E,onReverseSelect:G}=ge();Ce();const{itemSize:S,gridItems:O,cellWidth:W,onScroll:_}=ke(),{showGenInfo:c,imageGenInfo:I,q:J,onContextMenuClick:q,onFileItemClick:H}=Se({openNext:de}),{previewIdx:o,previewing:y,onPreviewVisibleChange:Q,previewImgMove:x,canPreview:b}=_e(),V=async(s,t,d)=>{L.value=[{curr:"",files:l.value}],await q(s,t,d)};return(s,t)=>{var M;const d=ue,X=me,Y=fe;return v(),N("div",{class:"container",ref_key:"stackViewEl",ref:P},[i(Ie,{show:!!e(p).length||e(B).keepMultiSelect,onClearAllSelected:e(D),onSelectAll:e(E),onReverseSelect:e(G)},null,8,["show","onClearAllSelected","onSelectAll","onReverseSelect"]),g("div",Ve,[i(d,{onClick:f,onTouchstart:R(f,["prevent"]),type:"primary",loading:m.value,shape:"round"},{default:n(()=>[k(u(s.$t("shuffle")),1)]),_:1},8,["onTouchstart","loading"]),i(d,{onClick:C,onTouchstart:R(C,["prevent"]),type:"default",disabled:!((M=l.value)!=null&&M.length),shape:"round"},{default:n(()=>[k(u(s.$t("tiktokView")),1)]),_:1},8,["onTouchstart","disabled"])]),i(Y,{visible:e(c),"onUpdate:visible":t[1]||(t[1]=a=>ae(c)?c.value=a:null),width:"70vw","mask-closable":"",onOk:t[2]||(t[2]=a=>c.value=!1)},{cancelText:n(()=>[]),default:n(()=>[i(X,{active:"",loading:!e(J).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]=a=>e(se)(e(I)))},[g("div",Me,u(s.$t("doubleClickToCopy")),1),k(" "+u(e(I)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),i(e(he),{ref_key:"scroller",ref:U,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:a,index:T})=>[i(we,{idx:T,file:a,"cell-width":e(W),"full-screen-preview-image-url":e(r)[e(o)]?e(oe)(e(r)[e(o)]):"",onContextMenuClick:V,onPreviewVisibleChange:e(Q),"is-selected-mutil-files":e(p).length>1,selected:e(p).includes(T),onFileItemClick:e(H),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,[i(e(ye),{onClick:t[3]||(t[3]=a=>e(x)("prev")),class:$({disable:!e(b)("prev")})},null,8,["class"]),i(e(xe),{onClick:t[4]||(t[4]=a=>e(x)("next")),class:$({disable:!e(b)("next")})},null,8,["class"])])):A("",!0),e(y)&&e(r)&&e(r)[e(o)]?(v(),ne(be,{key:1,file:e(r)[e(o)],idx:e(o),onContextMenuClick:V},null,8,["file","idx"])):A("",!0)],512)}}});const Ge=pe(Fe,[["__scopeId","data-v-49082269"]]);export{Ge as default};

View File

@ -1 +1 @@
import{R as y,C as v}from"./index-11479cb3.js";import{cu as f,c as d,A as P,d as w,U as o,V as c,W as r,Z as S,a8 as V,aG as O,a3 as R,X as u,Y as p,a4 as b,ak as $,a0 as x,R as H,J as _,K as m}from"./index-a7581aec.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"},k={style:{flex:"1"}},I={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,V(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:g=>e.$emit("reuseRecord",i),type:"primary"},{default:R(()=>[u(p(e.$t("restore")),1)]),_:2},1032,["onClick"]),r("div",{class:"pin",onClick:g=>e.records.switchPin(i)},[d(b(z)),u(" "+p(e.records.isPinned(i)?e.$t("unpin"):e.$t("pin")),1)],8,B)])]))),128))])])}}});const q=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 G=_(`${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{q as H,E as _,A as a,G as f,M as t};
import{R as y,C as v}from"./index-34432e2f.js";import{cv as f,c as d,A as P,d as w,U as o,V as c,W as r,Z as S,a8 as V,aG as O,a3 as R,X as u,Y as p,a4 as b,ak as $,a0 as x,R as H,J as _,K as m}from"./index-6c47ee34.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"},k={style:{flex:"1"}},I={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,V(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:g=>e.$emit("reuseRecord",i),type:"primary"},{default:R(()=>[u(p(e.$t("restore")),1)]),_:2},1032,["onClick"]),r("div",{class:"pin",onClick:g=>e.records.switchPin(i)},[d(b(z)),u(" "+p(e.records.isPinned(i)?e.$t("unpin"):e.$t("pin")),1)],8,B)])]))),128))])])}}});const q=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 G=_(`${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{q as H,E as _,A as a,G 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

View File

@ -1 +1 @@
import{u as G,g as d}from"./FileItem-3fd7894f.js";import{r as b,t as j,cr as m,cs as y,ct as D}from"./index-a7581aec.js";const r=new Map,A=()=>{const{useEventListen:k,sortedFiles:s,getViewableAreaFiles:w}=G().toRefs(),c=b(d.defaultChangeIndchecked),u=b(d.defaultSeedChangeChecked),g=async()=>{if(await j(100),!c.value)return;const o=w.value().filter(e=>m(e.fullpath)&&!e.gen_info_obj);if(!o.length)return;const t=await y(o.map(e=>e.fullpath).filter(e=>!r.has(e)));o.forEach(e=>{const i=t[e.fullpath]||r.get(e.fullpath)||"";r.set(e.fullpath,i),e.gen_info_obj=D(i),e.gen_info_raw=i})};k.value("viewableAreaFilesChange",g);const F=o=>{const t=s.value;return[o,u.value,t[o-1],t[o],t[o+1]]};function I(o,t,e,i){const a={diff:{},empty:!0,ownFile:"",otherFile:""};if(t+e<0||t+e>=s.value.length||s.value[t]==null||!("gen_info_obj"in s.value[t])||!("gen_info_obj"in s.value[t+e]))return a;const l=o,f=s.value[t+e].gen_info_obj;if(f==null)return a;const h=["hashes","resources"];a.diff={},a.ownFile=i.name,a.otherFile=s.value[t+e].name,a.empty=!1,u.value||h.push("seed");for(const n in l)if(!h.includes(n)){if(!(n in f)){a.diff[n]="+";continue}if(l[n]!=f[n])if(n.includes("rompt")&&l[n]!=""&&f[n]!=""){const p=l[n].split(","),C=f[n].split(",");let _=0;for(const v in p)p[v]!=C[v]&&_++;a.diff[n]=_}else a.diff[n]=[l[n],f[n]]}return a}return{getGenDiff:I,changeIndchecked:c,seedChangeChecked:u,getRawGenParams:()=>g(),getGenDiffWatchDep:F}};export{A as u};
import{u as G,g as d}from"./FileItem-62bbdd6d.js";import{r as b,t as j,cs as m,ct as y,cu as D}from"./index-6c47ee34.js";const r=new Map,A=()=>{const{useEventListen:k,sortedFiles:s,getViewableAreaFiles:w}=G().toRefs(),c=b(d.defaultChangeIndchecked),u=b(d.defaultSeedChangeChecked),g=async()=>{if(await j(100),!c.value)return;const o=w.value().filter(e=>m(e.fullpath)&&!e.gen_info_obj);if(!o.length)return;const t=await y(o.map(e=>e.fullpath).filter(e=>!r.has(e)));o.forEach(e=>{const i=t[e.fullpath]||r.get(e.fullpath)||"";r.set(e.fullpath,i),e.gen_info_obj=D(i),e.gen_info_raw=i})};k.value("viewableAreaFilesChange",g);const F=o=>{const t=s.value;return[o,u.value,t[o-1],t[o],t[o+1]]};function I(o,t,e,i){const a={diff:{},empty:!0,ownFile:"",otherFile:""};if(t+e<0||t+e>=s.value.length||s.value[t]==null||!("gen_info_obj"in s.value[t])||!("gen_info_obj"in s.value[t+e]))return a;const l=o,f=s.value[t+e].gen_info_obj;if(f==null)return a;const h=["hashes","resources"];a.diff={},a.ownFile=i.name,a.otherFile=s.value[t+e].name,a.empty=!1,u.value||h.push("seed");for(const n in l)if(!h.includes(n)){if(!(n in f)){a.diff[n]="+";continue}if(l[n]!=f[n])if(n.includes("rompt")&&l[n]!=""&&f[n]!=""){const p=l[n].split(","),C=f[n].split(",");let _=0;for(const v in p)p[v]!=C[v]&&_++;a.diff[n]=_}else a.diff[n]=[l[n],f[n]]}return a}return{getGenDiff:I,changeIndchecked:c,seedChangeChecked:u,getRawGenParams:()=>g(),getGenDiffWatchDep:F}};export{A as u};

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-a7581aec.js"></script>
<script type="module" crossorigin src="/infinite_image_browsing/fe-static/assets/index-6c47ee34.js"></script>
<link rel="stylesheet" href="/infinite_image_browsing/fe-static/assets/index-a44325c7.css">
</head>

View File

@ -39,7 +39,7 @@ const addInterceptor = (axiosInst: AxiosInstance) => {
'onUpdate:value': (v: string) => (key.value = v)
})
},
onOk() {
onOk () {
resolve(key.value)
}
})
@ -51,13 +51,13 @@ const addInterceptor = (axiosInst: AxiosInstance) => {
await delay(100)
location.reload()
}
switch (err.response?.data?.detail?.type) {
case 'secret_key_required':
Modal.error({
width: '60vw',
title: t('secretKeyMustBeConfigured'),
content: () => h('p', { style: 'white-space: pre-line;' } , t('secretKeyRequiredWarnMsg'))
content: () => h('p', { style: 'white-space: pre-line;' }, t('secretKeyRequiredWarnMsg'))
})
throw new Error(t('secretKeyRequiredWarnMsg'))
}
@ -67,9 +67,9 @@ const addInterceptor = (axiosInst: AxiosInstance) => {
errmsg = JSON.parse(await err.response?.data.text()).detail
}
} catch (e) {
console.error(err.response ,e)
console.error(err.response, e)
}
errmsg ??= t('errorOccurred')
errmsg ??= t('errorOccurred')
message.error(errmsg)
throw new Error(errmsg)
}
@ -101,7 +101,7 @@ export interface GlobalConf {
enable_access_control: boolean
launch_mode: 'server' | 'sd'
export_fe_fn: boolean
app_fe_setting: Record<'global'|'fullscreen_layout'| `workspace_snapshot_${string}`, any>
app_fe_setting: Record<'global' | 'fullscreen_layout' | 'auto_tag_rules' | `workspace_snapshot_${string}`, any>
is_readonly: boolean
}
@ -167,15 +167,15 @@ export const batchGetDirTop4MediaInfo = async (paths: string[]) => {
}
export const setAppFeSetting = async (name: keyof GlobalConf['app_fe_setting'], setting: Record<string, any>) => {
if (!isSync()) return
if (!isSync()) return
await axiosInst.value.post('/app_fe_setting', { name, value: JSON.stringify(setting) })
}
export const removeAppFeSetting = async (name: keyof GlobalConf['app_fe_setting']) => {
if (!isSync()) return
if (!isSync()) return
await axiosInst.value.delete('/app_fe_setting', { data: { name } })
}
export const setTargetFrameAsCover = async (body: {path: string, base64_img: string, updated_time: string}) => {
export const setTargetFrameAsCover = async (body: { path: string, base64_img: string, updated_time: string }) => {
await axiosInst.value.post('/set_target_frame_as_video_cover', body)
}

View File

@ -14,7 +14,7 @@ export const en: IIBI18nMap = {
compressFile: 'Compress File',
packOnlyNotDownload: 'Pack Only, Not Download',
notAllowSingleCtrlOrShiftAsShortcut: '不允許使用單獨的 Ctrl 或者 Shift 作為快速鍵',
conflictWithOtherShortcuts: 'Conflict with other shortcuts',
conflictWithOtherShortcuts: 'Conflict with other shortcuts',
pinnedSearchHistoryDesc: 'You can quickly restore to the previous search state by clicking the pinned search history.',
addNewCustomTag: 'Add New Custom Tag',
clearCacheIfNotTakeEffect: 'If the changes do not take effect, try clearing the page cache',
@ -36,7 +36,7 @@ export const en: IIBI18nMap = {
pollInterval: 'Poll Interval',
pollRefresh: 'Polling refresh',
pollRefreshTip: 'By default, IIB will automatically refresh when you return to IIB from other tabs or when the visibility of IIB changes. This feature is designed to keep IIB refreshed even when you stay in IIB all the time, please use it with caution',
stopPollRefresh: 'Stop Polling refresh',
restoreLastWorkspaceStateSuccess: 'Restore Last Workspace State Success',
restoreWorkspaceSnapshotSuccess: 'Restore Workspace Snapshot Success',
@ -62,7 +62,7 @@ You can specify which snapshot to restore to when starting IIB in the global set
moveSuccess: 'Move success',
copySuccess: 'Copy success',
copyFilePath: 'Copy file path',
previewMaskBackgroundOpacity: 'Preview Mask Background Opacity',
experimentalLRLayout: 'Side-by-Side Layout',
width: 'Width',
@ -73,7 +73,7 @@ You can specify which snapshot to restore to when starting IIB in the global set
unpin: 'Unpin',
restore: 'Restore',
restoreFromHistory: 'Restore from History',
history: 'History',
history: 'History',
historyRecordsSubstr: 'Input Value',
historyRecordsisRegex: 'Is Regex',
walkModeDoc: 'Browse all files in a specified folder without paging, using infinite scrolling to display them. DFS will be used to traverse all files. Note: Sorting is only performed within the same layer in this mode.',
@ -331,7 +331,7 @@ You can specify which snapshot to restore to when starting IIB in the global set
magicSwitchEnabled: '🎬 ON - Click media files to enter TikTok View',
magicSwitchDisabled: '📁 OFF - Click media files to open normally',
magicSwitchDetailDesc: 'Click images and videos to directly enter TikTok-style browsing experience',
// Auto play related
autoPlay: 'Auto Play',
autoPlayOff: 'Off',
@ -340,7 +340,7 @@ You can specify which snapshot to restore to when starting IIB in the global set
autoPlay20s: '20s',
autoPlayTooltip: 'Auto Play: {mode} (A to toggle)',
autoPlayStatus: 'Auto Play: {mode}',
// TikTok viewer controls
exitFullscreen: 'Exit Fullscreen',
fullscreen: 'Fullscreen',
@ -351,9 +351,35 @@ You can specify which snapshot to restore to when starting IIB in the global set
tags: 'Tags',
tag: 'Tag',
tagOperationFailed: 'Tag operation failed',
mediaType: 'Media Type',
all: 'All',
video: 'Video',
randomSort: 'Random Sort',
sortByDate: 'Sort by Date'
sortByDate: 'Sort by Date',
'autoTag.name': 'Auto Tagging',
'autoTag.description': 'These rules will be automatically applied when images are indexed, adding tags to matching images (Trigger timing: when updating index or rebuilding index on search page). Note: Multiple conditions within a rule use AND logic, all must be satisfied to apply the tag',
'autoTag.addRule': 'Add Rule',
'autoTag.saveConfig': 'Save Config',
'autoTag.tagName': 'Tag Name',
'autoTag.inputTagName': 'Select custom tag',
'autoTag.field': 'Field',
'autoTag.operator': 'Operator',
'autoTag.value': 'Value',
'autoTag.addFilter': 'Add Filter',
'autoTag.noRules': 'No rules, click button above to add',
'autoTag.saveSuccess': 'Saved successfully',
'autoTag.saveFail': 'Save failed',
'autoTag.fields.posPrompt': 'Pos Prompt',
'autoTag.fields.negPrompt': 'Neg Prompt',
'autoTag.fields.model': 'Model',
'autoTag.fields.sampler': 'Sampler',
'autoTag.fields.size': 'Size',
'autoTag.fields.cfgScale': 'CFG Scale',
'autoTag.fields.steps': 'Steps',
'autoTag.fields.seed': 'Seed',
'autoTag.operators.contains': 'Contains',
'autoTag.operators.equals': 'Equals',
'autoTag.operators.regex': 'Regex'
}

View File

@ -11,7 +11,7 @@ export const zhHans = {
disableMaximize: '禁用最大化',
compressFile: '对文件压缩',
packOnlyNotDownload: '仅打包不下载',
notAllowSingleCtrlOrShiftAsShortcut: '不允许使用单独的 Ctrl 或者 Shift 作为快捷键',
notAllowSingleCtrlOrShiftAsShortcut: '不允许使用单独的 Ctrl 或者 Shift 作为快捷键',
conflictWithOtherShortcuts: '与其他快捷键冲突',
pinnedSearchHistoryDesc: '你可以通过点击置顶的搜索历史来快速还原到之前的搜索状态',
addNewCustomTag: '添加新的自定义标签',
@ -37,7 +37,7 @@ export const zhHans = {
pollRefreshTip: '默认情况下你从其他TAB返回IIB时或者IIB的可见性发生改变时IIB都会自动刷新。这个功能是为了让你一直呆在IIB内时他也能自动刷新请慎重使用',
restoreLastWorkspaceStateSuccess: '成功恢复上次工作区状态',
restoreWorkspaceSnapshotSuccess: '成功恢复工作区快照',
openOnAppStart: '启动时打开',
openOnAppStart: '启动时打开',
confirmThisAction: '确认这个操作?',
saveWorkspaceSnapshot: '保存工作区快照',
WorkspaceSnapshot: '工作区快照',
@ -66,7 +66,7 @@ export const zhHans = {
alwaysOn: '常驻',
time: '时间',
pin: '置顶',
unpin: '取消置顶',
unpin: '取消置顶',
restore: '还原',
restoreFromHistory: '从历史记录中恢复',
history: '历史记录',
@ -310,7 +310,7 @@ export const zhHans = {
magicSwitchEnabled: '🎬 开启 - 点击媒体文件直接进入 TikTok 观看',
magicSwitchDisabled: '📁 关闭 - 点击媒体文件正常打开',
magicSwitchDetailDesc: '点击图片和视频文件时直接进入 TikTok 式浏览体验',
// 自动轮播相关
autoPlay: '自动轮播',
autoPlayOff: '关闭',
@ -319,7 +319,7 @@ export const zhHans = {
autoPlay20s: '20秒',
autoPlayTooltip: '自动轮播: {mode} (A键切换)',
autoPlayStatus: '自动轮播:{mode}',
// TikTok 查看器控制
exitFullscreen: '退出全屏',
fullscreen: '全屏',
@ -330,9 +330,34 @@ export const zhHans = {
tags: '标签',
tag: '标签',
tagOperationFailed: '标签操作失败',
mediaType: '媒体类型',
all: '全部',
video: '视频',
randomSort: '随机排序',
sortByDate: '按日期排序'
sortByDate: '按日期排序',
'autoTag.name': '自动标签 (Auto Tagging)',
'autoTag.description': '这些规则会在图像被索引时自动应用,为符合条件的图像添加标签触发时机在搜索页更新索引或重新构建索引时。注意同一规则内的多个条件是AND(且)关系,需全部满足才会应用标签',
'autoTag.addRule': '添加规则',
'autoTag.saveConfig': '保存配置',
'autoTag.tagName': '标签名称',
'autoTag.inputTagName': '选择自定义标签',
'autoTag.field': '字段',
'autoTag.operator': '操作符',
'autoTag.value': '值',
'autoTag.addFilter': '添加条件',
'autoTag.noRules': '暂无规则,点击上方按钮添加',
'autoTag.saveSuccess': '保存成功',
'autoTag.saveFail': '保存失败',
'autoTag.fields.posPrompt': '正向提示词 (Pos Prompt)',
'autoTag.fields.negPrompt': '负向提示词 (Neg Prompt)',
'autoTag.fields.model': '模型 (Model)',
'autoTag.fields.sampler': '采样器 (Sampler)',
'autoTag.fields.size': '尺寸 (Size)',
'autoTag.fields.cfgScale': 'CFG Scale',
'autoTag.fields.steps': 'Steps',
'autoTag.fields.seed': 'Seed',
'autoTag.operators.contains': '包含 (Contains)',
'autoTag.operators.equals': '等于 (Equals)',
'autoTag.operators.regex': '正则 (Regex)'
}

View File

@ -20,7 +20,7 @@ export const zhHant: Partial<IIBI18nMap> = {
addNewCustomTag: '添加新的自定義標籤',
showTiktokNavigator: '顯示導航按鈕',
showTiktokNavigatorDesc: '在 TikTok 視圖中顯示導航按鈕(上/下箭頭)',
clearCacheIfNotTakeEffect: '如果更改沒有生效,請嘗試清理頁面緩存',
clearCacheIfNotTakeEffect: '如果更改沒有生效,請嘗試清理頁面緩存',
success: '成功',
setCurrFrameAsVideoPoster: '設置當前幀為視頻封面',
sync: '同步',
@ -62,7 +62,7 @@ export const zhHant: Partial<IIBI18nMap> = {
moveSuccess: '移動成功',
copySuccess: '複製成功',
copyFilePath: '複製文件路徑',
previewMaskBackgroundOpacity: '預覽遮罩背景透明度',
experimentalLRLayout: '並列布局',
width: '寬度',
@ -162,7 +162,7 @@ export const zhHant: Partial<IIBI18nMap> = {
restoreLastRecord: '還原上次記錄',
launch: '啟動',
walkMode: '使用 Walk 模式瀏覽圖片',
launchFromNormalAndFixed: '使用 Normal / Fixed 模式瀏覽圖片',
recent: '最近',
emptyStartPage: '空啟動頁',
@ -315,7 +315,7 @@ export const zhHant: Partial<IIBI18nMap> = {
magicSwitchEnabled: '🎬 開啟 - 點擊媒體文件直接進入 TikTok 觀看',
magicSwitchDisabled: '📁 關閉 - 點擊媒體文件正常打開',
magicSwitchDetailDesc: '點擊圖片和視頻文件時直接進入 TikTok 式瀏覽體驗',
// 自動輪播相關
autoPlay: '自動輪播',
autoPlayOff: '關閉',
@ -324,7 +324,7 @@ export const zhHant: Partial<IIBI18nMap> = {
autoPlay20s: '20秒',
autoPlayTooltip: '自動輪播: {mode} (A鍵切換)',
autoPlayStatus: '自動輪播:{mode}',
// TikTok 查看器控制
exitFullscreen: '退出全螢幕',
fullscreen: '全螢幕',
@ -339,5 +339,29 @@ export const zhHant: Partial<IIBI18nMap> = {
all: '全部',
video: '視頻',
randomSort: '隨機排序',
sortByDate: '按日期排序'
sortByDate: '按日期排序',
'autoTag.name': '自動標籤 (Auto Tagging)',
'autoTag.description': '這些規則會在圖像被索引時自動應用,為符合條件的圖像添加標籤觸發時機在搜索頁更新索引或重新構建索引時。注意同一規則內的多個條件是AND(且)關係,需全部滿足才會應用標籤',
'autoTag.addRule': '添加規則',
'autoTag.saveConfig': '保存配置',
'autoTag.tagName': '標籤名稱',
'autoTag.inputTagName': '選擇自定義標籤',
'autoTag.field': '欄位',
'autoTag.operator': '運算符',
'autoTag.value': '值',
'autoTag.addFilter': '添加條件',
'autoTag.noRules': '暫無規則,點擊上方按鈕添加',
'autoTag.saveSuccess': '保存成功',
'autoTag.saveFail': '保存失敗',
'autoTag.fields.posPrompt': '正向提示詞 (Pos Prompt)',
'autoTag.fields.negPrompt': '負向提示詞 (Neg Prompt)',
'autoTag.fields.model': '模型 (Model)',
'autoTag.fields.sampler': '採樣器 (Sampler)',
'autoTag.fields.size': '尺寸 (Size)',
'autoTag.fields.cfgScale': 'CFG Scale',
'autoTag.fields.steps': 'Steps',
'autoTag.fields.seed': 'Seed',
'autoTag.operators.contains': '包含 (Contains)',
'autoTag.operators.equals': '等於 (Equals)',
'autoTag.operators.regex': '正則 (Regex)'
}

View File

@ -6,7 +6,7 @@ import '@zanllp/vue-virtual-scroller/dist/vue-virtual-scroller.css'
import { RecycleScroller } from '@zanllp/vue-virtual-scroller'
import { toRawFileUrl } from '@/util/file'
import { getDbBasicInfo, getExpiredDirs, getImagesBySubstr, updateImageData, type DataBaseBasicInfo, SearchBySubstrReq } from '@/api/db'
import { copy2clipboardI18n, makeAsyncFunctionSingle, useGlobalEventListen } from '@/util'
import { copy2clipboardI18n, makeAsyncFunctionSingle, useGlobalEventListen } from '@/util'
import fullScreenContextMenu from '@/page/fileTransfer/fullScreenContextMenu.vue'
import { LeftCircleOutlined, RightCircleOutlined, regex, AimOutlined } from '@/icon'
import { message } from 'ant-design-vue'
@ -18,7 +18,8 @@ import { useGlobalStore } from '@/store/useGlobalStore'
import HistoryRecord from '@/components/HistoryRecord.vue'
import { fuzzySearchHistory, FuzzySearchHistoryRecord } from '@/store/searchHistory'
import { openTiktokViewWithFiles } from '@/util/tiktokHelper'
import { useTagStore } from '@/store/useTagStore'
const tagStore = useTagStore()
const props = defineProps<{ tabIdx: number; paneIdx: number, searchScope?: string }>()
const isRegex = ref(false)
const substr = ref('')
@ -99,6 +100,7 @@ const onUpdateBtnClick = makeAsyncFunctionSingle(
queue.pushAction(async () => {
await updateImageData()
info.value = await getDbBasicInfo()
tagStore.tagMap.clear()
return info.value
}).res
)

View File

@ -102,6 +102,8 @@ const onUpdateBtnClick = makeAsyncFunctionSingle(
await updateImageData()
info.value = await getDbBasicInfo()
openedKeys.value = (classifyTags.value.map(v => v[0]))
tagStore.tagMap.clear()
return info.value
}).res
)

View File

@ -139,10 +139,34 @@ function getParNode (p: any) {
return p.parentNode as HTMLDivElement
}
function isTagStylePrompt(text: string): boolean {
if (!text) return false
// tag线
const commaCount = (text.match(/,/g) || []).length
const hasUnderscores = /_/.test(text)
const avgWordLength = text.replace(/[,\s]+/g, ' ').split(' ').filter(v => v).reduce((sum, word) => sum + word.length, 0) / Math.max(1, text.split(/[,\s]+/).filter(v => v).length)
// 线tag
return commaCount > 3 && hasUnderscores && avgWordLength < 20
}
function spanWrap (text: string) {
if (!text) {
return ''
}
// tag
if (!isTagStylePrompt(text)) {
//
return text
.split('\n')
.map(line => line.trim())
.filter(line => line)
.map(line => `<p class="natural-text">${line}</p>`)
.join('')
}
// Tag使
const frags = [] as string[]
const specBreakTag = 'BREAK'
const values = text.replace(/&gt;\s/g, '> ,').replace(/\sBREAK\s/g, ',' + specBreakTag + ',').split(/[\n,]+/).map(v => v.trim()).filter(v => v)
@ -517,6 +541,13 @@ const onTiktokViewClick = () => {
line-height: 1.78em;
:deep() {
.natural-text {
margin: 0.5em 0;
line-height: 1.6em;
text-align: justify;
color: var(--zp-primary);
}
.short-tag {
word-break: break-all;
white-space: nowrap;

View File

@ -0,0 +1,211 @@
<script setup lang="ts">
import { ref, onMounted, computed } from 'vue'
import { message } from 'ant-design-vue'
import { setAppFeSetting } from '@/api'
import { useGlobalStore } from '@/store/useGlobalStore'
import { PlusOutlined, DeleteOutlined } from '@ant-design/icons-vue'
import { t } from '@/i18n'
import { SearchSelect } from 'vue3-ts-util'
import type { Tag } from '@/api/db'
interface Filter {
field: string
operator: string
value: string
}
interface Rule {
tag: string
filters: Filter[]
}
const rules = ref<Rule[]>([])
const globalStore = useGlobalStore()
//
const customTags = computed(() => {
return globalStore.conf?.all_custom_tags?.filter(tag => tag.type === 'custom') || []
})
// SearchSelect
const tagConv = {
value: (v: Tag) => v.name,
text: (v: Tag) => v.display_name ? `${v.display_name} : ${v.name}` : v.name
}
onMounted(() => {
const savedRules = globalStore.conf?.app_fe_setting?.auto_tag_rules
if (savedRules) {
rules.value = savedRules
}
})
const addRule = () => {
rules.value.push({
tag: '',
filters: []
})
}
const removeRule = (index: number) => {
rules.value.splice(index, 1)
}
const addFilter = (rule: Rule) => {
rule.filters.push({
field: 'pos_prompt',
operator: 'contains',
value: ''
})
}
const removeFilter = (rule: Rule, index: number) => {
rule.filters.splice(index, 1)
}
const save = async () => {
try {
await setAppFeSetting('auto_tag_rules' as any, rules.value)
message.success(t('autoTag.saveSuccess'))
// Update local store
if (globalStore.conf && globalStore.conf.app_fe_setting) {
globalStore.conf.app_fe_setting.auto_tag_rules = rules.value
}
} catch (e) {
message.error(t('autoTag.saveFail') + ': ' + e)
}
}
const fieldOptions = computed(() => [
{ label: t('autoTag.fields.posPrompt'), value: 'pos_prompt' },
{ label: t('autoTag.fields.negPrompt'), value: 'neg_prompt' },
{ label: t('autoTag.fields.model'), value: 'Model' },
{ label: t('autoTag.fields.sampler'), value: 'Sampler' },
{ label: t('autoTag.fields.size'), value: 'Size' },
{ label: t('autoTag.fields.cfgScale'), value: 'CFG scale' },
{ label: t('autoTag.fields.steps'), value: 'Steps' },
{ label: t('autoTag.fields.seed'), value: 'Seed' }
])
const operatorOptions = computed(() => [
{ label: t('autoTag.operators.contains'), value: 'contains' },
{ label: t('autoTag.operators.equals'), value: 'equals' },
{ label: t('autoTag.operators.regex'), value: 'regex' }
])
</script>
<template>
<div class="auto-tag-settings">
<div class="header">
<div class="description">{{ t('autoTag.description') }}</div>
<div class="actions">
<a-button type="primary" @click="addRule">
<template #icon><PlusOutlined /></template>
{{ t('autoTag.addRule') }}
</a-button>
<a-button type="primary" @click="save" style="margin-left: 16px;">{{ t('autoTag.saveConfig') }}</a-button>
</div>
</div>
<div class="rules-list">
<div v-for="(rule, rIndex) in rules" :key="rIndex" class="rule-card">
<div class="rule-header">
<SearchSelect
:conv="tagConv"
style="width: 240px"
:options="customTags"
v-model:value="rule.tag"
:disabled="!customTags.length"
:placeholder="t('autoTag.inputTagName')"
/>
<a-button type="text" danger @click="removeRule(rIndex)">
<template #icon><DeleteOutlined /></template>
</a-button>
</div>
<div class="filters-list">
<div v-for="(filter, fIndex) in rule.filters" :key="fIndex" class="filter-row">
<a-select v-model:value="filter.field" style="width: 240px" :options="fieldOptions" />
<a-select v-model:value="filter.operator" style="width: 160px" :options="operatorOptions" />
<a-input v-model:value="filter.value" :placeholder="t('autoTag.value')" style="flex: 1" />
<a-button type="text" danger @click="removeFilter(rule, fIndex)">
<template #icon><DeleteOutlined /></template>
</a-button>
</div>
<a-button type="dashed" block @click="addFilter(rule)" style="margin-top: 8px">
<template #icon><PlusOutlined /></template>
{{ t('autoTag.addFilter') }}
</a-button>
</div>
</div>
</div>
<div v-if="rules.length === 0" class="empty-tip">
{{ t('autoTag.noRules') }}
</div>
</div>
</template>
<style scoped lang="scss">
.auto-tag-settings {
padding: 16px;
}
.header {
margin-bottom: 16px;
.description {
padding: 12px 16px;
margin-bottom: 12px;
background: var(--zp-secondary-background);
border-left: 4px solid var(--primary-color);
border-radius: 4px;
color: var(--zp-secondary-text);
font-size: 14px;
}
.actions {
display: flex;
}
}
.rules-list {
display: flex;
flex-direction: column;
gap: 16px;
}
.rule-card {
border: 1px solid var(--zp-border);
border-radius: 8px;
padding: 16px;
background: var(--zp-secondary-background);
}
.rule-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12px;
padding-bottom: 12px;
border-bottom: 1px solid var(--zp-border);
}
.filters-list {
display: flex;
flex-direction: column;
gap: 8px;
}
.filter-row {
display: flex;
gap: 8px;
align-items: center;
}
.empty-tip {
text-align: center;
color: var(--zp-secondary-text);
padding: 32px;
}
</style>

View File

@ -11,6 +11,7 @@ import { fs, invoke } from '@tauri-apps/api'
import { getShortcutStrFromEvent } from '@/util/shortcut'
import { isTauri } from '@/util/env'
import ImageSetting from './ImageSetting.vue'
import AutoTagSettings from './AutoTagSettings.vue'
import { openRebuildImageIndexModal } from '@/components/functionalCallableComp'
import { Dict } from '@/util'
import { message } from 'ant-design-vue'
@ -102,8 +103,19 @@ const disableMaximize = useLocalStorage(prefix+'disable_maximize', false)
<a-select v-if="false" />
<a-form>
<h2 style="margin-top: 0;">{{ t('ImageBrowsingSettings') }}</h2>
<a-form-item :label="$t('lang')">
<div class="lang-select-wrap">
<SearchSelect :options="langs" v-model:value="globalStore.lang" @change="langChanged = true" />
</div>
<a-button type="primary" @click="reload" v-if="langChanged" ghost>{{
t('langChangeReload')
}}</a-button>
</a-form-item>
<h2 style="margin-top: 64px;">{{ t('ImageBrowsingSettings') }}</h2>
<ImageSetting />
<h2 style="margin-top: 64px;">{{ t('autoTag.name') }}</h2>
<AutoTagSettings />
<h2>TikTok {{ t('view') }}</h2>
<a-form-item :label="$t('showTiktokNavigator')">
@ -126,15 +138,8 @@ const disableMaximize = useLocalStorage(prefix+'disable_maximize', false)
<a-form-item :label="t('autoRefreshWalkModePosLimit')">
<NumInput :min="0" :max="1024" :step="16" v-model="globalStore.autoRefreshWalkModePosLimit" />
</a-form-item>
<h2>{{ t('other') }}</h2>
<a-form-item :label="$t('lang')">
<div class="lang-select-wrap">
<SearchSelect :options="langs" v-model:value="globalStore.lang" @change="langChanged = true" />
</div>
<a-button type="primary" @click="reload" v-if="langChanged" ghost>{{
t('langChangeReload')
}}</a-button>
</a-form-item>
<h2 style="margin-top: 0;">{{ t('other') }}</h2>
<a-form-item :label="$t('onlyFoldersAndImages')">
<a-switch v-model:checked="globalStore.onlyFoldersAndImages" />
</a-form-item>