Files
server-configs/siyuan/data/plugins/sy-plugin-tab-close/index.js
2026-02-13 22:24:27 +08:00

7 lines
9.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use strict";var D=Object.defineProperty;var S=(c,e,t)=>e in c?D(c,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):c[e]=t;var u=(c,e,t)=>S(c,typeof e!="symbol"?e+"":e,t);const g=require("siyuan"),V=c=>{let e;switch(c){case"checkbox":e=t=>t.checked;break;case"select":case"slider":case"textinput":case"textarea":e=t=>t.value;break;case"number":e=t=>parseInt(t.value);break;default:e=()=>null;break}return e},N=c=>{let e;switch(c){case"checkbox":e=(t,n)=>{t.checked=n};break;case"select":case"slider":case"textinput":case"textarea":case"number":e=(t,n)=>{t.value=n};break;default:e=()=>{};break}return e};class A{constructor(e){u(this,"plugin");u(this,"name");u(this,"file");u(this,"settings",new Map);u(this,"elements",new Map);this.name=e.name??"settings",this.plugin=e.plugin,this.file=this.name.endsWith(".json")?this.name:`${this.name}.json`,this.plugin.setting=new g.Setting({width:e.width,height:e.height,confirmCallback:()=>{for(let n of this.settings.keys())this.updateValueFromElement(n);let t=this.dump();e.callback!==void 0&&e.callback(t),this.plugin.data[this.name]=t,this.save(t)},destroyCallback:()=>{for(let t of this.settings.keys())this.updateElementFromValue(t)}})}async load(){let e=await this.plugin.loadData(this.file);if(console.debug("Load config:",e),e)for(let[t,n]of this.settings)n.value=(e==null?void 0:e[t])??n.value;return this.plugin.data[this.name]=this.dump(),e}async save(e){return e=e??this.dump(),await this.plugin.saveData(this.file,this.dump()),console.debug("Save config:",e),e}get(e){var t;return(t=this.settings.get(e))==null?void 0:t.value}set(e,t){let n=this.settings.get(e);n&&(n.value=t,this.updateElementFromValue(e))}async setAndSave(e,t){let n=this.settings.get(e);n&&(n.value=t,this.updateElementFromValue(e),await this.save())}take(e,t=!1){let n=this.settings.get(e),l=this.elements.get(e);if(l)return t&&this.updateValueFromElement(e),n.getEleVal(l)}async takeAndSave(e){let t=this.take(e,!0);return await this.save(),t}disable(e){let t=this.elements.get(e);t&&(t.disabled=!0)}enable(e){let t=this.elements.get(e);t&&(t.disabled=!1)}dump(){let e={};for(let[t,n]of this.settings)n.type!=="button"&&(e[t]=n.value);return e}addItem(e){if(this.settings.set(e.key,e),e.type==="custom"&&(e.createElement===void 0||e.getEleVal===void 0||e.setEleVal===void 0)){console.error("The custom setting item must have createElement, getEleVal and setEleVal methods");return}if(e.getEleVal===void 0&&(e.getEleVal=V(e.type)),e.setEleVal===void 0&&(e.setEleVal=N(e.type)),e.createElement===void 0){let l=this.createDefaultElement(e);this.elements.set(e.key,l),this.plugin.setting.addItem({title:e.title,description:e==null?void 0:e.description,direction:e==null?void 0:e.direction,createActionElement:()=>(this.updateElementFromValue(e.key),this.getElement(e.key))})}else this.plugin.setting.addItem({title:e.title,description:e==null?void 0:e.description,direction:e==null?void 0:e.direction,createActionElement:()=>{let l=this.get(e.key),h=e.createElement(l);return this.elements.set(e.key,h),h}})}createDefaultElement(e){var l,h,k,v,y,p,_,r,s;let t;const n=a=>{a.key==="Enter"&&(a.preventDefault(),a.stopImmediatePropagation())};switch(e.type){case"checkbox":let a=document.createElement("input");a.type="checkbox",a.checked=e.value,a.className="b3-switch fn__flex-center",t=a,a.onchange=((l=e.action)==null?void 0:l.callback)??(()=>{});break;case"select":let d=document.createElement("select");d.className="b3-select fn__flex-center fn__size200";let b=(e==null?void 0:e.options)??{};for(let m in b){let I=document.createElement("option"),w=b[m];I.value=m,I.text=w,d.appendChild(I)}d.value=e.value,d.onchange=((h=e.action)==null?void 0:h.callback)??(()=>{}),t=d;break;case"slider":let i=document.createElement("input");i.type="range",i.className="b3-slider fn__size200 b3-tooltips b3-tooltips__n",i.ariaLabel=e.value,i.min=((k=e.slider)==null?void 0:k.min.toString())??"0",i.max=((v=e.slider)==null?void 0:v.max.toString())??"100",i.step=((y=e.slider)==null?void 0:y.step.toString())??"1",i.value=e.value,i.onchange=()=>{var m;i.ariaLabel=i.value,(m=e.action)==null||m.callback()},t=i;break;case"textinput":let o=document.createElement("input");o.className="b3-text-field fn__flex-center fn__size200",o.value=e.value,o.onchange=((p=e.action)==null?void 0:p.callback)??(()=>{}),t=o,o.addEventListener("keydown",n);break;case"textarea":let E=document.createElement("textarea");E.className="b3-text-field fn__block",E.value=e.value,E.onchange=((_=e.action)==null?void 0:_.callback)??(()=>{}),t=E;break;case"number":let f=document.createElement("input");f.type="number",f.className="b3-text-field fn__flex-center fn__size200",f.value=e.value,t=f,f.addEventListener("keydown",n);break;case"button":let x=document.createElement("button");x.className="b3-button b3-button--outline fn__flex-center fn__size200",x.innerText=((r=e.button)==null?void 0:r.label)??"Button",x.onclick=((s=e.button)==null?void 0:s.callback)??(()=>{}),t=x;break;case"hint":let U=document.createElement("div");U.className="b3-label fn__flex-center",t=U;break}return t}getElement(e){return this.elements.get(e)}updateValueFromElement(e){let t=this.settings.get(e);if(t.type==="button")return;let n=this.elements.get(e);t.value=t.getEleVal(n)}updateElementFromValue(e){let t=this.settings.get(e);if(t.type==="button")return;let n=this.elements.get(e);t.setEleVal(n,t.value)}}const C="menu-config";class F extends g.Plugin{constructor(){super(...arguments);u(this,"customTab");u(this,"isMobile");u(this,"settingUtils");u(this,"checkInterval");u(this,"tabInfo",[])}async onload(){this.data[C]={readonlyText:"Readonly"},console.log("loading plugin-sample",this.i18n);const t=g.getFrontend();this.isMobile=t==="mobile"||t==="browser-mobile",this.settingUtils=new A({plugin:this,name:C}),this.settingUtils.addItem({key:"Check",value:!1,type:"checkbox",title:"是否开启定时关闭页签功能",description:"开启后,超过设置时间未活跃的页签将被自动关闭(右下角一定记得保存设置)",action:{callback:()=>{let n=!this.settingUtils.get("Check");this.settingUtils.set("Check",n),console.log("Check",n)}}}),this.initAutoClose(),this.settingUtils.addItem({key:"stayOpen",value:"20",type:"textinput",title:"不活跃时间阈值(秒)",description:"超过此时间的标签页将被自动关闭,保存后生效",action:{callback:()=>{let n=this.settingUtils.takeAndSave("stayOpen");console.log("当前设置的 stayOpen 值:",n)}}}),this.settingUtils.addItem({key:"exception",value:"",type:"textinput",title:"包含如下字符串的标签页将不执行自动关闭:",description:"以|隔空",action:{callback:()=>{this.settingUtils.takeAndSave("exception")}}}),this.settingUtils.addItem({key:"Check_DN",value:!0,type:"checkbox",title:"是否排除今日Dailynote",description:"开启后今日Dailynote不会关闭",action:{callback:()=>{let n=!this.settingUtils.get("Check_DN");this.settingUtils.set("Check_DN",n),console.log("Check_DN",n)}}});try{this.settingUtils.load()}catch(n){console.error("Error loading settings storage, probably empty config json:",n)}console.log(this.i18n.helloPlugin)}onLayoutReady(){this.loadData(C),this.settingUtils.load(),console.log(`frontend: ${g.getFrontend()}; backend: ${g.getBackend()}`),console.log(`默认设置:
`+this.settingUtils.get("stayOpen")+`
`+this.settingUtils.get("exception")+`
`+this.settingUtils.get("Check")+`
`+this.settingUtils.get("Check_DN")+`
`)}async onunload(){console.log(this.i18n.byePlugin),g.showMessage("Goodbye Plugin"),console.log("onunload卸载"),this.checkInterval&&clearInterval(this.checkInterval)}uninstall(){console.log("插件已卸载")}eventBusLog({detail:t}){console.log(t)}initAutoClose(){console.log("初始化自动关闭功能"),this.checkInterval=window.setInterval(()=>{if(console.log("执行定时检查..."),!this.settingUtils.get("Check")){console.log("自动关闭功能已禁用");return}this.checkToClose()},5*1e3),console.log("定时器已设置ID:",this.checkInterval)}async checkToClose(){const t=parseInt(this.settingUtils.get("stayOpen"))||20;console.log("保持打开时间:",t);const n=document.querySelectorAll('li[data-type="tab-header"]');console.log("当前打开的标签页数量:",n.length),n.forEach(r=>{const s=r.getAttribute("data-id");if(r.classList.contains("item--pin")||r.classList.contains("item--focus")){console.log("标签页被固定或聚焦,不计入 tabInfo:",r);return}if(s){const a=this.tabInfo.find(d=>d.dataId===s);a?(a.count+=5,console.log(`标签 ${s} 重复出现,当前计数: ${a.count}`)):(console.log("不存在添加新记录初始计数为1"),this.tabInfo.push({dataId:s,count:1}),console.log("添加标签信息:",{"data-id":s,计数:1}))}}),console.log("所有标签信息数组:",this.tabInfo);let l=this.settingUtils.get("exception").split("|").map(r=>r.trim());const h=new Date,k=h.getFullYear(),v=String(h.getMonth()+1).padStart(2,"0"),y=String(h.getDate()).padStart(2,"0"),p=`${k}-${v}-${y}`;this.settingUtils.get("Check_DN")&&l.push(p),console.log("不关闭的标签页字符串:",l),console.log("今日日期:",p),n.forEach(r=>{var i;const s=r,a=s.getAttribute("data-id"),d=this.tabInfo.find(o=>o.dataId===a);if(s.classList.contains("item--pin")||s.classList.contains("item--focus")){console.log("标签页被固定或聚焦,不关闭:",s);return}const b=((i=s.querySelector(".item__text"))==null?void 0:i.textContent)||"";if(l&&l.length>0&&l.some(o=>o&&b.includes(o))){console.log("标签页包含在不关闭列表中:",b);return}if(d&&d.count>=t){const o=s.querySelector(".item__close");o&&(console.log("执行点击"),o.click())}})}}module.exports=F;