@yinuo-ngm/server 1.0.23 → 1.0.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/modules/agent-connections/agent-connections.schema.d.ts +4 -0
- package/lib/modules/agent-connections/agent-connections.schema.js +112 -0
- package/lib/modules/agent-connections/agent-connections.service.d.ts +18 -0
- package/lib/modules/agent-connections/agent-connections.service.js +209 -0
- package/lib/modules/agent-connections/agent-connections.types.d.ts +57 -0
- package/lib/modules/agent-connections/agent-connections.types.js +2 -0
- package/lib/modules/agent-connections/atomic-json-file.d.ts +8 -0
- package/lib/modules/agent-connections/atomic-json-file.js +44 -0
- package/lib/modules/agent-connections/token-mask.d.ts +1 -0
- package/lib/modules/agent-connections/token-mask.js +12 -0
- package/lib/routes/agent-connections.routes.d.ts +3 -0
- package/lib/routes/agent-connections.routes.js +28 -0
- package/lib/routes/index.js +2 -0
- package/package.json +4 -3
- package/www/3rdpartylicenses.txt +5 -5
- package/www/browser/chunk-2EB7UV3S.js +15 -0
- package/www/browser/{chunk-3I7BQCXS.js → chunk-2S6Y2RQI.js} +1 -1
- package/www/browser/{chunk-U3EUR236.js → chunk-2SYBXRWK.js} +1 -1
- package/www/browser/{chunk-OUGN4APK.js → chunk-365ZCRSD.js} +1 -1
- package/www/browser/{chunk-6UFDNETG.js → chunk-3MPEGFKP.js} +1 -1
- package/www/browser/{chunk-WCHN62X6.js → chunk-4PSSTE76.js} +1 -1
- package/www/browser/{chunk-DENFXXOY.js → chunk-5HVK6MON.js} +1 -1
- package/www/browser/{chunk-TXAXE73U.js → chunk-5Y7KNVNN.js} +1 -1
- package/www/browser/chunk-6L2CHHFV.js +1 -0
- package/www/browser/{chunk-NNOWADVM.js → chunk-6ZXQKFRQ.js} +1 -1
- package/www/browser/chunk-735SLX4X.js +1 -0
- package/www/browser/chunk-7KLACOZT.js +2 -0
- package/www/browser/chunk-7VJKEZTT.js +20 -0
- package/www/browser/{chunk-CO3CQHKV.js → chunk-7X4X4YHI.js} +1 -1
- package/www/browser/chunk-ACYCDF6M.js +1 -0
- package/www/browser/{chunk-UJKK4A7Y.js → chunk-AQYHNHJ3.js} +1 -1
- package/www/browser/chunk-BHKSOTOM.js +1 -0
- package/www/browser/{chunk-3ODVU46S.js → chunk-BXZVX5KD.js} +1 -1
- package/www/browser/{chunk-TCBOC5FF.js → chunk-C5DOE7UG.js} +1 -1
- package/www/browser/{chunk-7AKVG375.js → chunk-C6GC5OOE.js} +1 -1
- package/www/browser/{chunk-SSCUT2GF.js → chunk-D5W7J3FS.js} +1 -1
- package/www/browser/chunk-DPGKZHEW.js +1 -0
- package/www/browser/chunk-DRV2KPHO.js +1 -0
- package/www/browser/chunk-E2WRB7KQ.js +2 -0
- package/www/browser/{chunk-MPLGMTLT.js → chunk-EAFAHVBG.js} +1 -1
- package/www/browser/{chunk-WWIPELAV.js → chunk-ERH36Q6S.js} +1 -1
- package/www/browser/chunk-GSUKZOEV.js +1 -0
- package/www/browser/chunk-GYXK6ZZT.js +1 -0
- package/www/browser/{chunk-PDI3HSSH.js → chunk-H27FQ6OP.js} +3 -3
- package/www/browser/chunk-I7RTVSMK.js +1 -0
- package/www/browser/{chunk-SD2HFD54.js → chunk-IVX3LVU4.js} +1 -1
- package/www/browser/{chunk-U2YWR3HF.js → chunk-IX6UZA7J.js} +1 -1
- package/www/browser/{chunk-CPJTSA6E.js → chunk-JFR7U5DE.js} +1 -1
- package/www/browser/chunk-JIVQNGBJ.js +1 -0
- package/www/browser/{chunk-PY3AUTHC.js → chunk-KDMWEV46.js} +1 -1
- package/www/browser/{chunk-JM6DCZP6.js → chunk-LRHJZDWY.js} +1 -1
- package/www/browser/chunk-NVN2P466.js +1 -0
- package/www/browser/{chunk-NREWZQVN.js → chunk-O64FT2TA.js} +1 -1
- package/www/browser/{chunk-YVRGRFK2.js → chunk-OZONPLGN.js} +1 -1
- package/www/browser/chunk-PC7TJLCL.js +2 -0
- package/www/browser/{chunk-7GLWEFTM.js → chunk-PNFC3J4Z.js} +1 -1
- package/www/browser/chunk-PRKDURHI.js +1 -0
- package/www/browser/{chunk-RMIYLAEM.js → chunk-PUHSNEN6.js} +1 -1
- package/www/browser/{chunk-442QFABJ.js → chunk-RKKAY5CD.js} +1 -1
- package/www/browser/{chunk-M6NZ6C2R.js → chunk-RLH7DAA2.js} +1 -1
- package/www/browser/chunk-S6BY2OTR.js +1 -0
- package/www/browser/{chunk-KRYMOHYF.js → chunk-SIKDYQOR.js} +1 -1
- package/www/browser/{chunk-RKK4I2RT.js → chunk-SVRGVAFE.js} +1 -1
- package/www/browser/chunk-TPVKLECM.js +1 -0
- package/www/browser/{chunk-UPOORT3S.js → chunk-VBMHQZWH.js} +1 -1
- package/www/browser/chunk-WVRMU265.js +1 -0
- package/www/browser/chunk-X6PRUZ5G.js +1 -0
- package/www/browser/{chunk-PUG3VNTI.js → chunk-XQQ6PT2E.js} +1 -1
- package/www/browser/chunk-XUUNCF53.js +1 -0
- package/www/browser/{chunk-4BRW6LCZ.js → chunk-YGWA6NUS.js} +1 -1
- package/www/browser/{chunk-2VJVGBXG.js → chunk-YNYWN7QI.js} +1 -1
- package/www/browser/chunk-Z4T3LTE2.js +1 -0
- package/www/browser/chunk-Z7GYTPTP.js +1 -0
- package/www/browser/chunk-ZZN3NP7F.js +1 -0
- package/www/browser/index.html +1 -1
- package/www/browser/main-HMOP3OWL.js +38 -0
- package/www/browser/chunk-6J6G7JEP.js +0 -1
- package/www/browser/chunk-7QR6RHLA.js +0 -1
- package/www/browser/chunk-H2USFIYR.js +0 -1
- package/www/browser/chunk-HC5KLPHD.js +0 -1
- package/www/browser/chunk-HJAP6WBI.js +0 -1
- package/www/browser/chunk-K6C5ZIV2.js +0 -20
- package/www/browser/chunk-MBPB43C6.js +0 -1
- package/www/browser/chunk-PB2LGZNW.js +0 -1
- package/www/browser/chunk-R4HSZU2J.js +0 -1
- package/www/browser/chunk-RZA3IFQV.js +0 -2
- package/www/browser/chunk-SEJGGBE2.js +0 -1
- package/www/browser/chunk-TS5ZQYYY.js +0 -1
- package/www/browser/chunk-TVJHI463.js +0 -1
- package/www/browser/chunk-UKCMUTYL.js +0 -1
- package/www/browser/chunk-VW3S7C2Z.js +0 -1
- package/www/browser/chunk-VZYJ3MSW.js +0 -15
- package/www/browser/chunk-WUA5JFDD.js +0 -1
- package/www/browser/chunk-WYNERG74.js +0 -2
- package/www/browser/chunk-XJDJL3TQ.js +0 -1
- package/www/browser/chunk-YV6QPLF5.js +0 -1
- package/www/browser/main-7GYUOEJY.js +0 -38
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as Vn,b as Bn}from"./chunk-YVRGRFK2.js";import{a as Tn,e as Pn,f as En}from"./chunk-XJDJL3TQ.js";import{a as yt,b as Ye}from"./chunk-HC5KLPHD.js";import{b as Ln,c as In,d as Rn}from"./chunk-HJAP6WBI.js";import{a as Ze,b as Xe,c as Je,d as et,e as tt}from"./chunk-7QR6RHLA.js";import{a as Me,b as xe}from"./chunk-PY3AUTHC.js";import{a as We,b as Ue,c as $e}from"./chunk-6J6G7JEP.js";import{a as Fn,b as kn,c as On}from"./chunk-7AKVG375.js";import{a as St,b as wt}from"./chunk-2VJVGBXG.js";import{a as Ge,b as ze}from"./chunk-WCHN62X6.js";import"./chunk-NNOWADVM.js";import"./chunk-RMIYLAEM.js";import{a as Nn,c as Dn,d as ge,e as fe,f as he}from"./chunk-CPJTSA6E.js";import{b as je,c as qe,e as wn}from"./chunk-TXAXE73U.js";import{g as Re,h as Ve,k as Be,l as Ae}from"./chunk-U2YWR3HF.js";import{a as Mn}from"./chunk-PB2LGZNW.js";import{d as $,k as zn}from"./chunk-K6C5ZIV2.js";import{Ab as Sn,Db as Q,Ea as V,Fa as k,Fb as j,Gb as He,Ia as xn,Ib as Ke,Ja as _n,Jb as q,Ka as Cn,Kb as Qe,L as qt,Lb as Ct,M as hn,Na as B,Oa as A,Pb as vt,Qa as W,Ra as U,Tb as H,U as ht,V as rt,Vb as Ht,Wb as Kt,Xb as Qt,Yb as Yt,Za as vn,Zb as re,a as fn,ac as ae,dc as bt,fc as we,oa as xt,qa as _t,xb as bn,zb as yn}from"./chunk-VZYJ3MSW.js";import"./chunk-HFZLJHYR.js";import"./chunk-WUA5JFDD.js";import{g as gt,i as gn,n as E,u as ft}from"./chunk-KRYMOHYF.js";import{$b as L,Ac as Le,Ba as rn,Bc as it,Cc as At,Da as an,Dc as Wt,Ec as oe,Fb as T,Fc as ct,Gb as ln,Gc as F,Ha as g,Ic as Ie,Jc as d,Kb as dn,Kc as y,Lb as O,Lc as J,M as en,Mc as mt,Nc as mn,Oa as Fe,Oc as z,Pc as M,Qc as N,Ra as sn,Ub as ye,Wb as v,Xc as pn,Yb as b,Yc as Te,Zb as pe,_b as De,a as S,ac as I,b as P,bc as u,cc as a,dc as s,dd as Se,ec as x,fc as Z,gc as X,hc as cn,hd as Ut,ic as te,id as K,jc as ne,kb as Vt,kd as $t,lc as D,ma as tn,na as lt,nb as l,nd as pt,oa as nn,od as R,pd as jt,qd as ot,ra as on,rc as p,sa as w,sb as me,uc as c,ud as un,vb as Bt,vc as dt,wc as ue,ya as f,yc as ke,yd as Pe,z as ce,za as h,zc as Oe,zd as ut}from"./chunk-4BRW6LCZ.js";function An(){let r=window;if(!r.monaco)return;let t=r.monaco;t.languages.getLanguages().some(e=>e.id==="nginx")||(t.languages.register({id:"nginx",extensions:[".conf"],aliases:["Nginx"]}),t.languages.setMonarchTokensProvider("nginx",{tokenizer:{root:[[/#.*$/,"comment"],[/^\s*(http|server|events|stream|upstream|location|map|geo|types|if|in|limit_except|split_clients|match)\b/,"keyword.control"],[/\b(root|index|try_files|alias|return|rewrite|proxy_pass|fastcgi_pass|scgi_pass|uwsgi_pass|include|set|add_header|expires|proxy_set_header|fastcgi_param|listen|server_name|error_page|default_server|upstream|zone|least_conn|ip_hash|keepalive|keepalive_requests|keepalive_timeout|worker_processes|worker_connections|use|multi_accept|accept_mutex|sendfile|tcp_nopush|tcp_nodelay|reset_timedout|resolver|resolver_timeout|client_max_body_size|client_body_buffer|gzip|gunzip|gzip_types|gzip_comp_level|gzip_vary|open_file_cache|open_file_cache_valid|open_file_cache_min_uses|log_format|access_log|error_log|pid|user|group|daemon|master_process|worker_rlimit_nofile|worker_rlimit_core|worker_shutdown|load_module|types|default_type|server_tokens|aio|directio|sendfile_max_chunk|proxy_buffering|proxy_buffer_size|proxy_buffers|proxy_busy_buffers_size|proxy_temp_path|proxy_temp_file_write_size|fastcgi_buffer_size|fastcgi_buffers|fastcgi_busy_buffers_size|fastcgi_temp_path|fastcgi_temp_file_write_size|fastcgi_cache|fastcgi_cache_key|fastcgi_cache_path|fastcgi_cache_valid|fastcgi_cache_use_stale|fastcgi_no_cache|fastcgi_cache_bypass|fastcgi_ignore_headers|fastcgi_intercept_errors|fastcgi_next_upstream|fastcgi_next_upstream_tries|fastcgi_connect_timeout|fastcgi_send_timeout|fastcgi_read_timeout|proxy_connect_timeout|proxy_send_timeout|proxy_read_timeout|proxy_ignore_client_abort|proxy_hide_header|proxy_pass_header|proxy_redirect|proxy_cookie_domain|proxy_cookie_path|proxy_set_header|proxy_http_version|proxy_force_ranges|proxy_cache|proxy_cache_key|proxy_cache_path|proxy_cache_valid|proxy_cache_use_stale|proxy_cache_background_update|proxy_cache_lock|proxy_cache_lock_timeout|proxy_no_cache|proxy_cache_bypass|proxy_ignore_headers|proxy_intercept_errors|proxy_next_upstream|proxy_next_upstream_tries|proxy_next_upstream_timeout|proxy_store|proxy_store_access|auth_basic|auth_basic_user_file|satisfy|allow|deny|limit_req|limit_req_zone|limit_req_status|limit_conn|limit_conn_zone|limit_conn_status|return|rewrite|break|set|if|set_by_lua|access_by_lua|content_by_lua|header_filter_by_lua|body_filter_by_lua|log_by_lua|rewrite_by_lua|init_by_lua|init_worker_by_lua|ssl_certificate|ssl_certificate_key|ssl_session_cache|ssl_session_timeout|ssl_protocols|ssl_ciphers|ssl_prefer_server_ciphers|ssl_verify_client|ssl_client_certificate|ssl_trusted_certificate|ssl_crl|real_ip_header|set_real_ip_from|geo|geoip_country|geoip_city|memcached_pass|memcached_connect_timeout|memcached_send_timeout|memcached_read_timeout|grpc_pass|grpc_connect_timeout|grpc_send_timeout|grpc_read_timeout|grpc_buffer_size|websocket|websocket_connect_timeout|websocket_send_timeout|websocket_read_timeout|websocket_ping_interval|websocket_ping_timeout|concat|concat_types|secure_link|secure_link_md5|add_before_body|add_after_body|addition_types|image_filter|xslt_stylesheet|xslt_types|random_index|geo|map|perl|perl_modules|perl_require|perl_handler|slice|mp4|mp4_buffer_size|mp4_max_buffer_size|flv|ogmp|status|status_format|check|check_http_send|check_http_expect_alive|check_shm_size|check_status|upstream_conf|js_set|js_content|js_header_filter_by_lua|js_body_filter_by_lua|js_log_by_lua|js_access_by_lua|js_content_by_lua|js_rewrite_by_lua|js_preread_by_lua|influxdb|set_|add_|proxy_|fastcgi_|uwsgi_|scgi_|grpc_|limit_|auth_|secure_|websocket_|ssl_|real_|memcached_|grpc_|proxy_next_upstream_tries|proxy_next_upstream_timeout)\b/,"keyword.directive"],[/\b(on|off|yes|no|true|false|default|none|any|auto|inline|upstream|down|backup|weight|max_fails|fail_timeout)\b/,"keyword.value"],[/\b\d+[kKmMgG]?\b/,"number"],[/"[^"]*"/,"string"],[/'[^']*'/,"string"],[/\$[a-zA-Z_][a-zA-Z0-9_]*/,"variable"],[/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d+)?\b/,"number"],[/\b\d{1,5}\b/,"number"]]}}),t.editor.defineTheme("nginx-theme",{base:"vs",inherit:!0,rules:[{token:"comment",foreground:"6A9955",fontStyle:"italic"},{token:"keyword.control",foreground:"0000FF",fontStyle:"bold"},{token:"keyword.directive",foreground:"795E26"},{token:"keyword.value",foreground:"0000FF"},{token:"string",foreground:"A31515"},{token:"number",foreground:"098658"},{token:"variable",foreground:"001188"}]}))}var ee=class r{http=w(zn);baseUrl="/api/nginx";statusCache=null;async getStatus(){let t=await this.getData(`${this.baseUrl}/status`);return this.statusCache={instance:t.instance||null,status:t.status},t}async getStats(){let t=await this.getData(`${this.baseUrl}/stats`);return t.status&&(this.statusCache={instance:t.instance||null,status:t.status}),t}async bind(t){let e={path:t};return await this.postData(`${this.baseUrl}/bind`,e)}async unbind(){await this.postAction(`${this.baseUrl}/unbind`,{}),this.statusCache=null}getCachedStatusSnapshot(){return this.statusCache?{instance:this.statusCache.instance?S({},this.statusCache.instance):null,status:S({},this.statusCache.status)}:null}async getLocalIp(){return await this.getData(`${this.baseUrl}/local-ip`)}async start(){return this.executeWithRetry(()=>this.postData(`${this.baseUrl}/start`,{}))}async stop(){return this.executeWithRetry(()=>this.postData(`${this.baseUrl}/stop`,{}))}async reload(){return this.executeWithRetry(()=>this.postData(`${this.baseUrl}/reload`,{}))}async test(){return await ce(this.http.post(`${this.baseUrl}/test`,{}))}async getConfig(){return await this.getData(`${this.baseUrl}/config`)}async updateConfig(t){let e={content:t};await this.putAction(`${this.baseUrl}/config`,e)}async validateConfig(t){let e={content:t};return await ce(this.http.post(`${this.baseUrl}/config/validate`,e))}async getConfigFiles(){return await this.getData(`${this.baseUrl}/config/files`)}async getConfigFile(t){let e=new ft().set("filePath",t);return await this.getData(`${this.baseUrl}/config/file`,e)}async updateConfigFile(t,e){let n={filePath:t,content:e};await this.putAction(`${this.baseUrl}/config/file`,n)}async getServers(){return await this.getData(`${this.baseUrl}/servers`)}async getServer(t){return await this.getData(`${this.baseUrl}/servers/${t}`)}async createServer(t){return await this.postData(`${this.baseUrl}/servers`,t)}async updateServer(t,e){return await this.putData(`${this.baseUrl}/servers/${t}`,e)}async deleteServer(t){return await this.deleteData(`${this.baseUrl}/servers/${t}`)}async restoreDeletedServer(t){return await this.postData(`${this.baseUrl}/servers/restore-deleted`,{snapshotId:t})}async enableServer(t){await this.patchAction(`${this.baseUrl}/servers/${t}/enable`,{})}async disableServer(t){await this.patchAction(`${this.baseUrl}/servers/${t}/disable`,{})}async validateSslPaths(t,e){let n={sslCert:t,sslKey:e};return await this.postData(`${this.baseUrl}/servers/validate-ssl-paths`,n)}async parseImportServers(t){let e={content:t};return await this.postData(`${this.baseUrl}/servers/import/parse`,e)}async analyzeImportServers(t){let e={requests:t};return await this.postData(`${this.baseUrl}/servers/import/analyze`,e)}async getUpstreams(){return await this.getData(`${this.baseUrl}/upstreams`)}async saveUpstreams(t){let e={upstreams:t};await this.putAction(`${this.baseUrl}/upstreams`,e)}async getSslCertificates(){return await this.getData(`${this.baseUrl}/ssl/certificates`)}async saveSslCertificates(t){let e={certificates:t};await this.putAction(`${this.baseUrl}/ssl/certificates`,e)}async getTrafficConfig(){return await this.getData(`${this.baseUrl}/traffic`)}async saveTrafficConfig(t){let e=t;await this.putAction(`${this.baseUrl}/traffic`,e)}async getPerformanceConfig(){return await this.getData(`${this.baseUrl}/performance`)}async savePerformanceConfig(t){let e=t;await this.putAction(`${this.baseUrl}/performance`,e)}async getModuleSettings(){return await this.getData(`${this.baseUrl}/module/settings`)}async saveModuleSettings(t){let e=t;return await this.putData(`${this.baseUrl}/module/settings`,e)}async getErrorLogs(t=100){let e=new ft().set("tail",t.toString());return await this.getData(`${this.baseUrl}/logs/error`,e)}async getAccessLogs(t=100){let e=new ft().set("tail",t.toString());return await this.getData(`${this.baseUrl}/logs/access`,e)}async getLogsInfo(){return await this.getData(`${this.baseUrl}/logs/info`)}async executeWithRetry(t,e={}){let n=Math.max(0,e.retries??1),i=Math.max(0,e.delayMs??500),o;for(let m=0;m<=n;m++)try{return await t()}catch(_){if(o=_,m>=n)throw _;i>0&&await new Promise(C=>setTimeout(C,i))}throw o}async getData(t,e){return await ce(this.http.get(t,e))}async postData(t,e){return await ce(this.http.post(t,e))}async putData(t,e){return await ce(this.http.put(t,e))}async deleteData(t){return await ce(this.http.delete(t))}async postAction(t,e){await ce(this.http.post(t,e))}async putAction(t,e){await ce(this.http.put(t,e))}async patchAction(t,e){await ce(this.http.patch(t,e))}static \u0275fac=function(e){return new(e||r)};static \u0275prov=lt({token:r,factory:r.\u0275fac,providedIn:"root"})};var ni=["editorShell"];function ii(r,t){r&1&&x(0,"nz-icon",7)}function oi(r,t){if(r&1&&x(0,"nz-option",9),r&2){let e=t.$implicit,n=c();u("nzValue",e)("nzLabel",n.getFileLabel(e))}}function ri(r,t){r&1&&(x(0,"nz-icon",25),a(1,"span"),d(2,"\u914D\u7F6E\u9A8C\u8BC1\u901A\u8FC7"),s())}function ai(r,t){r&1&&(x(0,"nz-icon",26),a(1,"span"),d(2,"\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25"),s())}function si(r,t){if(r&1&&(a(0,"div",27),d(1),s()),r&2){let e=t.$implicit;l(),y(e)}}function li(r,t){if(r&1&&(a(0,"div",23),L(1,si,2,1,"div",27,pe),s()),r&2){let e,n=c(2);l(),I((e=n.validationResult())==null?null:e.errors)}}function di(r,t){if(r&1&&(a(0,"div",28),d(1),s()),r&2){let e=t.$implicit;l(),y(e)}}function ci(r,t){if(r&1&&(a(0,"div",24),L(1,di,2,1,"div",28,pe),s()),r&2){let e,n=c(2);l(),I((e=n.validationResult())==null?null:e.warnings)}}function mi(r,t){if(r&1&&(a(0,"div",22),v(1,ri,3,0)(2,ai,3,0),v(3,li,3,0,"div",23),v(4,ci,3,0,"div",24),s()),r&2){let e,n,i,o,m=c();F("error",!((e=m.validationResult())!=null&&e.valid)),l(),b((n=m.validationResult())!=null&&n.valid?1:2),l(2),b(!((i=m.validationResult())==null||i.errors==null)&&i.errors.length?3:-1),l(),b(!((o=m.validationResult())==null||o.warnings==null)&&o.warnings.length?4:-1)}}var zt=class r{refreshToken=0;editorShellRef;nginxService=w(ee);message=w($);config=g(null);configFiles=g([]);selectedFilePath=g("");originalContent=g("");editorContent=g("");filesLoading=g(!1);loading=g(!0);saving=g(!1);validating=g(!1);validationResult=g(null);editorHeight=g(520);editorOptions={language:"nginx"};mainConfigPath="";diffEditor=null;resizeObserver=null;async ngOnInit(){await this.loadConfig(!0),await this.loadConfigFiles()}ngAfterViewInit(){this.setupEditorHeightObserver(),this.updateEditorHeight()}ngOnChanges(t){let e=t.refreshToken;e&&!e.firstChange&&this.loadConfigFiles()}ngOnDestroy(){this.resizeObserver?.disconnect(),this.resizeObserver=null}onCodeEditorInitialized(t){An(),this.isDiffEditor(t)&&(this.diffEditor=t),this.scheduleLayout()}onEditorContentChange(t){this.editorContent.set(String(t??""))}async loadConfig(t=!1){this.loading.set(!0);try{let e=this.selectedFilePath(),n=t||!e||this.isSamePath(e,this.mainConfigPath||e),i=n?await this.nginxService.getConfig():await this.nginxService.getConfigFile(e);if(i.config){let o=i.config.content||"";this.config.set(i.config),this.originalContent.set(o),this.editorContent.set(o),this.validationResult.set(null),this.selectedFilePath.set(i.config.mainConfigPath||e),(n||!this.mainConfigPath)&&(this.mainConfigPath=i.config.mainConfigPath),this.mergeConfigFiles([i.config.mainConfigPath]),this.updateEditorHeight(),this.scheduleLayout()}}catch(e){this.message.error("\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25: "+e.message)}finally{this.loading.set(!1)}}async saveConfig(){let t=this.selectedFilePath()||this.config()?.mainConfigPath||"";if(!t){this.message.error("\u672A\u9009\u62E9\u914D\u7F6E\u6587\u4EF6");return}this.saving.set(!0);try{let e=this.getCurrentEditorContent();this.isSamePath(t,this.mainConfigPath||t)?await this.nginxService.updateConfig(e):await this.nginxService.updateConfigFile(t,e),this.message.success("\u4FDD\u5B58\u6210\u529F"),await this.loadConfig(),await this.loadConfigFiles()}catch(e){this.message.error("\u4FDD\u5B58\u5931\u8D25: "+e.message)}finally{this.saving.set(!1)}}async validateConfig(){this.validating.set(!0);try{let t=await this.nginxService.validateConfig(this.getCurrentEditorContent());this.validationResult.set(t),t.valid?this.message.success("\u914D\u7F6E\u9A8C\u8BC1\u901A\u8FC7"):this.message.error("\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25")}catch(t){this.message.error("\u9A8C\u8BC1\u5931\u8D25: "+t.message)}finally{this.validating.set(!1)}}async loadConfigFiles(){this.filesLoading.set(!0);try{let e=(await this.nginxService.getConfigFiles()).files||[],n=this.buildFileList(e);this.configFiles.set(n);let i=this.selectedFilePath();i&&n.length&&!n.some(o=>this.isSamePath(o,i))&&(this.selectedFilePath.set(n[0]),await this.loadConfig())}catch(t){this.message.error("\u52A0\u8F7D\u6587\u4EF6\u5217\u8868\u5931\u8D25: "+t.message)}finally{this.filesLoading.set(!1)}}async onSelectConfigFile(t){let e=String(t||"").trim();!e||this.isSamePath(e,this.selectedFilePath())||(this.selectedFilePath.set(e),await this.loadConfig())}getFileLabel(t){let n=String(t||"").replace(/\\/g,"/").split("/");return n[n.length-1]||t}hasUnsavedChanges(){return this.getCurrentEditorContent()!==this.originalContent()}restoreFromOriginal(){let t=this.originalContent(),e=this.diffEditor?.getModel()?.modified;e&&e.setValue(t),this.editorContent.set(t),this.validationResult.set(null),this.scheduleLayout(),this.message.success("\u5DF2\u8FD8\u539F\u5230\u5DF2\u52A0\u8F7D\u7248\u672C")}getCurrentEditorContent(){let t=this.diffEditor?.getModel()?.modified;return t?t.getValue():this.editorContent()}mergeConfigFiles(t){let e=this.buildFileList([...this.configFiles(),...t]);this.configFiles.set(e)}buildFileList(t){let e=new Map;for(let i of t){let o=this.normalizePath(i);o&&(e.has(o)||e.set(o,i))}let n=Array.from(e.values());if(n.sort((i,o)=>i.localeCompare(o)),this.mainConfigPath){let i=n.findIndex(o=>this.isSamePath(o,this.mainConfigPath));if(i>0){let[o]=n.splice(i,1);n.unshift(o)}i<0&&n.unshift(this.mainConfigPath)}return n}isSamePath(t,e){return this.normalizePath(t)===this.normalizePath(e)}normalizePath(t){return String(t||"").trim().replace(/\\/g,"/").toLowerCase()}scheduleLayout(){setTimeout(()=>{try{this.updateEditorHeight(),this.syncDiffEditorHeight(),this.diffEditor?.layout()}catch{}},0)}setupEditorHeightObserver(){let t=this.editorShellRef?.nativeElement;!t||typeof ResizeObserver>"u"||(this.resizeObserver?.disconnect(),this.resizeObserver=new ResizeObserver(()=>{this.updateEditorHeight(),setTimeout(()=>{this.syncDiffEditorHeight(),this.diffEditor?.layout()},0)}),this.resizeObserver.observe(t))}updateEditorHeight(){let t=this.editorShellRef?.nativeElement;if(!t){this.editorHeight.set(520);return}let e=t.clientHeight>0?t.clientHeight:0,n=Math.max(520,e);this.editorHeight()!==n&&this.editorHeight.set(n)}syncDiffEditorHeight(){let t=this.diffEditor?.getContainerDomNode();if(!t)return;let e=`${this.editorHeight()}px`;t.style.height=e;let n=t.querySelector(".monaco-diff-editor");n&&(n.style.height=e,n.style.minHeight="520px")}isDiffEditor(t){return typeof t.getOriginalEditor=="function"}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=T({type:r,selectors:[["app-nginx-config-editor"]],viewQuery:function(e,n){if(e&1&&ke(ni,7),e&2){let i;Oe(i=Le())&&(n.editorShellRef=i.first)}},inputs:{refreshToken:"refreshToken"},features:[Fe],decls:31,vars:17,consts:[["editorShell",""],[1,"config-editor"],[1,"editor-toolbar"],[1,"toolbar-left"],[1,"file-info"],["nzType","file-text","nzTheme","outline"],[1,"file-path"],["nzType","lock","nzTheme","outline","nz-tooltip","","nzTooltipTitle","\u914D\u7F6E\u6587\u4EF6\u53EA\u8BFB\uFF0C\u53EF\u80FD\u9700\u8981\u7BA1\u7406\u5458\u6743\u9650"],["nzPlaceHolder","\u9009\u62E9\u914D\u7F6E\u6587\u4EF6",1,"file-selector",3,"ngModelChange","ngModel","nzDisabled"],[3,"nzValue","nzLabel"],["nz-button","","nzType","default",3,"click","nzLoading"],["nzType","reload","nzTheme","outline"],[1,"editor-actions"],["nz-button","",3,"click","nzLoading"],["nz-button","","nzType","default","nz-popconfirm","","nzPopconfirmTitle","\u786E\u8BA4\u8FD8\u539F\u4E3A\u5F53\u524D\u5DF2\u52A0\u8F7D\u7248\u672C\uFF1F","nzPopconfirmPlacement","top",3,"nzOnConfirm","disabled"],["nzType","rollback","nzTheme","outline"],["nzType","check-circle","nzTheme","outline"],["nz-button","","nzType","primary",3,"click","nzLoading","disabled"],["nzType","save","nzTheme","outline"],[1,"editor-container"],["nzEditorMode","diff",1,"code-editor",3,"ngModelChange","nzEditorInitialized","ngModel","nzOriginalText","nzEditorOption","nzLoading"],[1,"validation-result",3,"error"],[1,"validation-result"],[1,"error-list"],[1,"warning-list"],["nzType","check-circle","nzTheme","outline",1,"success-icon"],["nzType","close-circle","nzTheme","outline",1,"error-icon"],[1,"error-item"],[1,"warning-item"]],template:function(e,n){if(e&1){let i=D();a(0,"div",1)(1,"div",2)(2,"div",3)(3,"div",4),x(4,"nz-icon",5),a(5,"span",6),d(6),s(),v(7,ii,1,0,"nz-icon",7),s(),a(8,"nz-select",8),p("ngModelChange",function(m){return f(i),h(n.onSelectConfigFile(m))}),L(9,oi,1,2,"nz-option",9,De),s(),a(11,"button",10),p("click",function(){return f(i),h(n.loadConfigFiles())}),x(12,"nz-icon",11),d(13," \u5237\u65B0\u6587\u4EF6\u5217\u8868 "),s()(),a(14,"div",12)(15,"button",13),p("click",function(){return f(i),h(n.loadConfig())}),x(16,"nz-icon",11),d(17," \u5237\u65B0 "),s(),a(18,"button",14),p("nzOnConfirm",function(){return f(i),h(n.restoreFromOriginal())}),x(19,"nz-icon",15),d(20," \u8FD8\u539F "),s(),a(21,"button",13),p("click",function(){return f(i),h(n.validateConfig())}),x(22,"nz-icon",16),d(23," \u9A8C\u8BC1 "),s(),a(24,"button",17),p("click",function(){return f(i),h(n.saveConfig())}),x(25,"nz-icon",18),d(26," \u4FDD\u5B58 "),s()()(),a(27,"div",19,0)(29,"nz-code-editor",20),p("ngModelChange",function(m){return f(i),h(n.onEditorContentChange(m))})("nzEditorInitialized",function(m){return f(i),h(n.onCodeEditorInitialized(m))}),s()(),v(30,mi,5,5,"div",21),s()}if(e&2){let i,o,m;l(6),y(((i=n.config())==null?null:i.mainConfigPath)||"\u672A\u52A0\u8F7D"),l(),b(((o=n.config())==null?null:o.isWritable)===!1?7:-1),l(),u("ngModel",n.selectedFilePath())("nzDisabled",n.loading()||!n.configFiles().length),l(),I(n.configFiles()),l(2),u("nzLoading",n.filesLoading()),l(4),u("nzLoading",n.loading()),l(3),u("disabled",!n.hasUnsavedChanges()),l(3),u("nzLoading",n.validating()),l(3),u("nzLoading",n.saving())("disabled",!((m=n.config())!=null&&m.isWritable)),l(5),ct("height",n.editorHeight(),"px"),u("ngModel",n.editorContent())("nzOriginalText",n.originalContent())("nzEditorOption",n.editorOptions)("nzLoading",n.loading()),l(),b(n.validationResult()?30:-1)}},dependencies:[E,H,j,q,U,W,B,A,Bn,Vn,k,V,Ye,yt,he,ge,fe,we,bt],styles:['.config-editor[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;border:1px solid #f0f0f0;border-radius:8px;overflow:hidden}.editor-toolbar[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;padding:12px 16px;background:#fafafa;border-bottom:1px solid #f0f0f0}.editor-toolbar[_ngcontent-%COMP%] .toolbar-left[_ngcontent-%COMP%]{min-width:0;flex:1;display:flex;flex-direction:row;align-items:center;flex-wrap:wrap;gap:10px}.editor-toolbar[_ngcontent-%COMP%] .file-info[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;font-size:var(--nginx-font-size-base, 14px);min-width:0}.editor-toolbar[_ngcontent-%COMP%] .file-info[_ngcontent-%COMP%] .file-path[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);color:#000000a6;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.editor-toolbar[_ngcontent-%COMP%] .file-selector[_ngcontent-%COMP%]{width:min(560px,100%)}.editor-toolbar[_ngcontent-%COMP%] .editor-actions[_ngcontent-%COMP%]{display:flex;gap:8px;flex-shrink:0}.editor-container[_ngcontent-%COMP%]{flex:1;min-height:520px;position:relative}.code-editor[_ngcontent-%COMP%]{display:block;min-height:520px;width:100%;border:1px solid #d9d9d9}.validation-result[_ngcontent-%COMP%]{padding:12px 16px;background:#f6ffed;border-top:1px solid #b7eb8f;display:flex;align-items:center;gap:8px}.validation-result.error[_ngcontent-%COMP%]{background:#fff2f0;border-top-color:#ffccc7}.validation-result[_ngcontent-%COMP%] .success-icon[_ngcontent-%COMP%]{color:#52c41a}.validation-result[_ngcontent-%COMP%] .error-icon[_ngcontent-%COMP%]{color:#ff4d4f}.validation-result[_ngcontent-%COMP%] .error-list[_ngcontent-%COMP%], .validation-result[_ngcontent-%COMP%] .warning-list[_ngcontent-%COMP%]{margin-top:8px;width:100%}.validation-result[_ngcontent-%COMP%] .error-list[_ngcontent-%COMP%] .error-item[_ngcontent-%COMP%], .validation-result[_ngcontent-%COMP%] .warning-list[_ngcontent-%COMP%] .error-item[_ngcontent-%COMP%]{color:#ff4d4f;font-size:var(--nginx-font-size-sm, 12px);padding:4px 0;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}.validation-result[_ngcontent-%COMP%] .error-list[_ngcontent-%COMP%] .warning-item[_ngcontent-%COMP%], .validation-result[_ngcontent-%COMP%] .warning-list[_ngcontent-%COMP%] .warning-item[_ngcontent-%COMP%]{color:#faad14;font-size:var(--nginx-font-size-sm, 12px);padding:4px 0;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}[_nghost-%COMP%] nz-code-editor.code-editor.ant-code-editor{width:100%;min-height:520px!important;display:block}[_nghost-%COMP%] nz-code-editor.code-editor .monaco-diff-editor{min-height:520px}']})};var pi=["logBody"];function ui(r,t){r&1&&(cn(0,"span",8),d(1," \u5B9E\u65F6 "))}function gi(r,t){if(r&1&&d(0),r&2){let e=c();J(" ",e.status," ")}}function fi(r,t){r&1&&(Z(0,"div",6),d(1,"\u6682\u65E0\u65E5\u5FD7"),X())}function hi(r,t){if(r&1&&(Z(0,"div",7)(1,"span",9),d(2),X(),Z(3,"span",10),d(4),X(),Z(5,"span",11),d(6),X()()),r&2){let e=t.$implicit,n=c();l(2),y(e.time),l(),Ie(n.getLevelClass(e.level)),l(),J(" ",n.getLevelLabel(e.level)," "),l(2),y(e.msg)}}var Ee=class r{title="error.log";status="";statusTone="default";showRealtime=!1;maxHeight=0;logs=[];logBody;scrollToBottom(){this.logBody&&(this.logBody.nativeElement.scrollTop=this.logBody.nativeElement.scrollHeight)}getLevelClass(t){return t}getLevelLabel(t){return{info:"INFO",warn:"WARN",error:"ERR",ok:"OK"}[t]??t.toUpperCase()}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=T({type:r,selectors:[["app-nginx-log-viewer"]],viewQuery:function(e,n){if(e&1&&ke(pi,5),e&2){let i;Oe(i=Le())&&(n.logBody=i.first)}},inputs:{title:"title",status:"status",statusTone:"statusTone",showRealtime:"showRealtime",maxHeight:"maxHeight",logs:"logs"},decls:12,vars:13,consts:[["logBody",""],[1,"log-panel"],[1,"log-header"],[1,"log-header-title"],[1,"log-header-status"],[1,"log-body"],[1,"log-empty"],[1,"log-line"],[1,"realtime-dot"],[1,"log-time"],[1,"log-level"],[1,"log-msg"]],template:function(e,n){e&1&&(Z(0,"div",1)(1,"div",2)(2,"span",3),d(3),X(),Z(4,"span",4),v(5,ui,2,0)(6,gi,1,1),X()(),Z(7,"div",5,0),v(9,fi,2,0,"div",6),L(10,hi,7,5,"div",7,pe),X()()),e&2&&(l(3),y(n.title),l(),F("realtime",n.showRealtime)("status-ok",n.statusTone==="ok")("status-warn",n.statusTone==="warn")("status-error",n.statusTone==="error"),l(),b(n.showRealtime?5:6),l(2),ct("max-height",n.maxHeight,"px"),l(2),b(n.logs.length===0?9:-1),l(),I(n.logs))},dependencies:[E,k],styles:['[_nghost-%COMP%]{display:block}.log-panel[_ngcontent-%COMP%]{background:#1b2332;border-radius:6px;overflow:hidden}.log-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;background:#00000026}.log-header-title[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:#fff6}.log-header-status[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:#ffffff80;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);font-weight:600;display:flex;align-items:center;gap:5px}.log-header-status.realtime[_ngcontent-%COMP%], .log-header-status.status-ok[_ngcontent-%COMP%]{color:#3dd68c}.log-header-status.status-warn[_ngcontent-%COMP%]{color:#f7ba1e}.log-header-status.status-error[_ngcontent-%COMP%]{color:#ef5350}.realtime-dot[_ngcontent-%COMP%]{width:6px;height:6px;border-radius:50%;background:#3dd68c;animation:_ngcontent-%COMP%_pulse 2s ease-in-out infinite}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:1}50%{opacity:.4}}.log-body[_ngcontent-%COMP%]{padding:10px 14px;max-height:180px;overflow-y:auto;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);font-size:var(--nginx-font-size-sm, 12px);line-height:1.8}.log-body[_ngcontent-%COMP%]::-webkit-scrollbar{width:6px}.log-body[_ngcontent-%COMP%]::-webkit-scrollbar-track{background:transparent}.log-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background:#333944;border-radius:3px}.log-empty[_ngcontent-%COMP%]{padding:16px 0;font-size:var(--nginx-font-size-sm, 12px);color:#ffffff59;text-align:center;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}.log-line[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:10px;cursor:default}.log-time[_ngcontent-%COMP%]{color:#ffffff80;flex-shrink:0;min-width:46px}.log-level[_ngcontent-%COMP%]{font-weight:700;flex-shrink:0;width:32px}.log-level.info[_ngcontent-%COMP%]{color:#165dff}.log-level.warn[_ngcontent-%COMP%]{color:#ff7d00}.log-level.error[_ngcontent-%COMP%]{color:#ef5350}.log-level.ok[_ngcontent-%COMP%]{color:#3dd68c}.log-msg[_ngcontent-%COMP%]{color:#ffffff8c;flex:1;word-break:break-all;white-space:pre-wrap}']})};var Nt=class r{nginxService=w(ee);wsClient=w(Mn);message=w($);wsSub;logViewerComponent;activeLogTab=g("error");isConnected=g(!1);loading=g(!1);errorLogs=g([]);accessLogs=g([]);currentLogs=g([]);maxLogLines=500;statusText=g("\u672A\u8FDE\u63A5");statusTone=g("default");ngOnInit(){this.setupWsSubscription(),this.loadInitialLogs()}ngOnDestroy(){this.unsubscribeWs(),this.wsSub?.unsubscribe()}switchLogTab(t){this.activeLogTab.set(t),this.updateCurrentLogs(),this.isConnected()&&(this.unsubscribeWs(),this.subscribeWs(t))}scrollToBottom(){this.logViewerComponent?.scrollToBottom()}async refreshLogs(){await this.loadInitialLogs(),this.message.success("\u65E5\u5FD7\u5DF2\u5237\u65B0")}clearLogs(){this.activeLogTab()==="error"?this.errorLogs.set([]):this.accessLogs.set([]),this.updateCurrentLogs()}setupWsSubscription(){this.wsClient.stateChanges().subscribe(t=>{let e=t==="open";this.isConnected.set(e),this.statusText.set(e?"\u5DF2\u8FDE\u63A5":t==="connecting"?"\u8FDE\u63A5\u4E2D...":"\u672A\u8FDE\u63A5"),this.statusTone.set(e?"ok":"default"),e&&this.subscribeWs(this.activeLogTab())}),this.wsSub=this.wsClient.messages().pipe(en(t=>t.op==="nginx.log.append"||t.op==="nginx.log.tail")).subscribe(t=>{t.op==="nginx.log.tail"?(this.handleLogTail(t),setTimeout(()=>{this.scrollToBottom()},100)):t.op==="nginx.log.append"&&this.handleLogAppend(t)}),this.wsClient.connect()}subscribeWs(t){this.wsClient.send({op:"sub",topic:"nginx",logType:t,tail:50})}unsubscribeWs(){this.wsClient.send({op:"unsub",topic:"nginx"})}handleLogTail(t){let e=t.lines.map(n=>this.parseLogLine(n));t.logType==="error"?this.errorLogs.set(e):this.accessLogs.set(e),this.updateCurrentLogs()}handleLogAppend(t){let e=this.parseLogLine(t.line),n=t.logType===this.activeLogTab();t.logType==="error"?this.errorLogs.update(i=>{let o=[...i,e];return o.length>this.maxLogLines?o.slice(-this.maxLogLines):o}):this.accessLogs.update(i=>{let o=[...i,e];return o.length>this.maxLogLines?o.slice(-this.maxLogLines):o}),n&&this.updateCurrentLogs()}updateCurrentLogs(){let e=this.activeLogTab()==="error"?this.errorLogs():this.accessLogs();this.currentLogs.set(e)}async loadInitialLogs(){this.loading.set(!0);try{let[t,e]=await Promise.all([this.nginxService.getErrorLogs(100),this.nginxService.getAccessLogs(100)]);t.lines&&this.errorLogs.set(t.lines.map(n=>this.parseLogLine(n))),e.lines&&this.accessLogs.set(e.lines.map(n=>this.parseLogLine(n))),this.updateCurrentLogs()}catch(t){this.message.error("\u52A0\u8F7D\u65E5\u5FD7\u5931\u8D25: "+t.message)}finally{this.loading.set(!1)}}parseLogLine(t){let e=t.match(/^(\d{4}\/\d{2}\/\d{2}\s+\d{2}:\d{2}:\d{2})/),n=t.match(/\[(error|warn|notice|info|crit|alert|emerg)\]/i),i="";if(e)i=e[1].split(/\s+/)[1]||e[1];else{let m=t.match(/(\d{2}:\d{2}:\d{2})/);i=m?m[1]:new Date().toLocaleTimeString("zh-CN",{hour12:!1})}let o="info";if(n){let m=n[1].toLowerCase();m==="error"||m==="crit"||m==="alert"||m==="emerg"?o="error":m==="warn"&&(o="warn")}return{time:i,level:o,msg:t}}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=T({type:r,selectors:[["app-nginx-secondary-logs-tab"]],viewQuery:function(e,n){if(e&1&&ke(Ee,5),e&2){let i;Oe(i=Le())&&(n.logViewerComponent=i.first)}},decls:14,vars:10,consts:[[1,"panel-header-row","compact"],[1,"log-tabs"],[1,"log-tab",3,"click"],[1,"log-actions"],["nz-button","","nzType","default",1,"log-action-btn",3,"click"],["nzType","vertical-align-bottom","nzTheme","outline"],["nz-button","","nzType","default",3,"click"],["nzType","reload","nzTheme","outline"],["nzType","delete","nzTheme","outline"],[3,"title","showRealtime","status","statusTone","logs","maxHeight"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"div",1)(2,"button",2),p("click",function(){return n.switchLogTab("error")}),d(3," error.log "),s(),a(4,"button",2),p("click",function(){return n.switchLogTab("access")}),d(5," access.log "),s()(),a(6,"div",3)(7,"button",4),p("click",function(){return n.scrollToBottom()}),x(8,"nz-icon",5),s(),a(9,"button",6),p("click",function(){return n.refreshLogs()}),x(10,"nz-icon",7),s(),a(11,"button",4),p("click",function(){return n.clearLogs()}),x(12,"nz-icon",8),s()()(),x(13,"app-nginx-log-viewer",9)),e&2&&(l(2),F("active",n.activeLogTab()==="error"),l(2),F("active",n.activeLogTab()==="access"),l(9),u("title",n.activeLogTab()==="error"?"error.log":"access.log")("showRealtime",n.isConnected())("status",n.statusText())("statusTone",n.statusTone())("logs",n.currentLogs())("maxHeight",400))},dependencies:[E,U,W,B,A,k,V,Ee],styles:["[_nghost-%COMP%]{display:block}.panel-header-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:12px}.panel-header-row.compact[_ngcontent-%COMP%]{margin-bottom:10px}.log-tabs[_ngcontent-%COMP%]{display:flex;gap:0}.log-tab[_ngcontent-%COMP%]{background:transparent;color:var(--text-3);font-size:var(--nginx-font-size-sm, 12px);font-weight:500;padding:6px 12px;cursor:pointer;transition:all .12s ease;border:none;border-bottom:2px solid transparent;margin-bottom:-1px}.log-tab[_ngcontent-%COMP%]:hover{color:var(--text-2)}.log-tab.active[_ngcontent-%COMP%]{color:var(--blue);border-bottom-color:var(--blue);font-weight:600}.log-actions[_ngcontent-%COMP%]{display:flex;gap:4px}.log-action-btn[_ngcontent-%COMP%] nz-icon[_ngcontent-%COMP%]{font-size:12px}"]})};var se=class r{constructor(t){this.nginxService=t}upstreams=g([]);sslCertificates=g([]);trafficConfig=g({rateLimitEnabled:!1,rateLimit:"",connLimitEnabled:!1,connLimit:0,blacklistIps:[]});performanceConfig=g({gzipEnabled:!1,gzipTypes:"",keepaliveTimeout:"",workerProcesses:"",sendfile:!1,tcpNopush:!1});moduleSettings=g({backupRetention:5,configBackupRetention:20});upstreamsLoading=g(!1);sslLoading=g(!1);trafficLoading=g(!1);performanceLoading=g(!1);settingsLoading=g(!1);async loadUpstreams(){this.upstreamsLoading.set(!0);try{let t=await this.nginxService.getUpstreams();return t.upstreams&&this.upstreams.set(t.upstreams),t}finally{this.upstreamsLoading.set(!1)}}async saveUpstreams(t){await this.nginxService.saveUpstreams(t),this.upstreams.set(t.map(e=>S({},e)))}async loadSslCertificates(){this.sslLoading.set(!0);try{let t=await this.nginxService.getSslCertificates();return t.certificates&&this.sslCertificates.set(t.certificates.map(e=>S({},e))),t}finally{this.sslLoading.set(!1)}}async saveSslCertificates(t){await this.nginxService.saveSslCertificates(t),this.sslCertificates.set(t.map(e=>S({},e)))}async loadTrafficConfig(){this.trafficLoading.set(!0);try{let t=await this.nginxService.getTrafficConfig();return t.traffic&&this.trafficConfig.set(P(S({},t.traffic),{connLimit:Math.max(0,Number(t.traffic.connLimit??0))})),t}finally{this.trafficLoading.set(!1)}}async saveTrafficConfig(t){await this.nginxService.saveTrafficConfig(t),this.trafficConfig.set(S({},t))}async loadPerformanceConfig(){this.performanceLoading.set(!0);try{let t=await this.nginxService.getPerformanceConfig();return t.performance&&this.performanceConfig.set(S({},t.performance)),t}finally{this.performanceLoading.set(!1)}}async savePerformanceConfig(t){await this.nginxService.savePerformanceConfig(t),this.performanceConfig.set(S({},t))}async loadModuleSettings(){this.settingsLoading.set(!0);try{let t=await this.nginxService.getModuleSettings();return t.settings&&this.moduleSettings.set({backupRetention:Math.max(1,Number(t.settings.backupRetention??5)),configBackupRetention:Math.max(1,Number(t.settings.configBackupRetention??20))}),t}finally{this.settingsLoading.set(!1)}}async saveModuleSettings(t){let e=await this.nginxService.saveModuleSettings(t);return e.settings&&this.moduleSettings.set({backupRetention:Math.max(1,Number(e.settings.backupRetention??5)),configBackupRetention:Math.max(1,Number(e.settings.configBackupRetention??20))}),e}static \u0275fac=function(e){return new(e||r)(on(ee))};static \u0275prov=lt({token:r,factory:r.\u0275fac,providedIn:"root"})};var Dt=class r{moduleStore=w(se);message=w($);saving=g(!1);dirty=g(!1);config=g({gzipEnabled:!1,gzipTypes:"",keepaliveTimeout:"",workerProcesses:"",sendfile:!1,tcpNopush:!1});async ngOnInit(){await this.load()}async load(){try{(await this.moduleStore.loadPerformanceConfig()).performance&&(this.config.set(S({},this.moduleStore.performanceConfig())),this.dirty.set(!1))}catch(t){this.message.error("\u52A0\u8F7D\u6027\u80FD\u914D\u7F6E\u5931\u8D25: "+t.message)}}setBoolean(t,e){this.config.update(n=>P(S({},n),{[t]:e})),this.markDirty()}markDirty(){this.dirty.set(!0)}async save(){let t=P(S({},this.config()),{gzipTypes:this.config().gzipTypes.trim(),keepaliveTimeout:this.config().keepaliveTimeout.trim(),workerProcesses:this.config().workerProcesses.trim()});this.saving.set(!0);try{await this.moduleStore.savePerformanceConfig(t),this.message.success("\u6027\u80FD\u4F18\u5316\u914D\u7F6E\u5DF2\u4FDD\u5B58"),this.dirty.set(!1),await this.load()}catch(e){this.message.error("\u4FDD\u5B58\u6027\u80FD\u914D\u7F6E\u5931\u8D25: "+e.message)}finally{this.saving.set(!1)}}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=T({type:r,selectors:[["app-nginx-secondary-perf-tab"]],decls:53,vars:8,consts:[[1,"panel-header-row"],[1,"panel-tip"],["nz-button","","nzType","primary",3,"click","nzLoading","disabled"],["nzType","save","nzTheme","outline"],[1,"setting-row"],[1,"setting-label"],[1,"setting-desc"],[1,"setting-ctrl"],["nzSize","small","name","gzipEnabled",3,"ngModelChange","ngModel"],["placeholder","65s",1,"setting-input",3,"ngModelChange","ngModel"],["placeholder","auto",1,"setting-input",3,"ngModelChange","ngModel"],["nzSize","small","name","sendfile",3,"ngModelChange","ngModel"],["nzSize","small","name","tcpNopush",3,"ngModelChange","ngModel"],[1,"setting-row","no-border"],[1,"full-width"],["rows","3",1,"setting-textarea","mono",3,"ngModelChange","ngModel"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"span",1),d(2,"\u6027\u80FD\u4F18\u5316\u914D\u7F6E"),s(),a(3,"button",2),p("click",function(){return n.save()}),x(4,"nz-icon",3),d(5," \u4FDD\u5B58 "),s()(),a(6,"div",4)(7,"div")(8,"div",5),d(9,"Gzip \u538B\u7F29"),s(),a(10,"div",6),d(11,"\u662F\u5426\u542F\u7528 gzip"),s()(),a(12,"div",7)(13,"nz-switch",8),p("ngModelChange",function(o){return n.setBoolean("gzipEnabled",o)}),s()()(),a(14,"div",4)(15,"div")(16,"div",5),d(17,"Keepalive \u8D85\u65F6"),s(),a(18,"div",6),d(19,"keepalive_timeout"),s()(),a(20,"div",7)(21,"input",9),N("ngModelChange",function(o){return M(n.config().keepaliveTimeout,o)||(n.config().keepaliveTimeout=o),o}),p("ngModelChange",function(){return n.markDirty()}),s()()(),a(22,"div",4)(23,"div")(24,"div",5),d(25,"Worker \u8FDB\u7A0B"),s(),a(26,"div",6),d(27,"worker_processes"),s()(),a(28,"div",7)(29,"input",10),N("ngModelChange",function(o){return M(n.config().workerProcesses,o)||(n.config().workerProcesses=o),o}),p("ngModelChange",function(){return n.markDirty()}),s()()(),a(30,"div",4)(31,"div")(32,"div",5),d(33,"sendfile"),s(),a(34,"div",6),d(35,"\u9759\u6001\u6587\u4EF6\u96F6\u62F7\u8D1D"),s()(),a(36,"div",7)(37,"nz-switch",11),p("ngModelChange",function(o){return n.setBoolean("sendfile",o)}),s()()(),a(38,"div",4)(39,"div")(40,"div",5),d(41,"tcp_nopush"),s(),a(42,"div",6),d(43,"\u4F18\u5316\u5927\u6587\u4EF6\u4F20\u8F93"),s()(),a(44,"div",7)(45,"nz-switch",12),p("ngModelChange",function(o){return n.setBoolean("tcpNopush",o)}),s()()(),a(46,"div",13)(47,"div",14)(48,"div",5),d(49,"Gzip Types"),s(),a(50,"div",6),d(51,"\u7A7A\u683C\u5206\u9694 MIME \u5217\u8868"),s(),a(52,"textarea",15),N("ngModelChange",function(o){return M(n.config().gzipTypes,o)||(n.config().gzipTypes=o),o}),p("ngModelChange",function(){return n.markDirty()}),s()()()),e&2&&(l(3),u("nzLoading",n.saving())("disabled",!n.dirty()),l(10),u("ngModel",n.config().gzipEnabled),l(8),z("ngModel",n.config().keepaliveTimeout),l(8),z("ngModel",n.config().workerProcesses),l(8),u("ngModel",n.config().sendfile),l(8),u("ngModel",n.config().tcpNopush),l(7),z("ngModel",n.config().gzipTypes))},dependencies:[E,H,Q,j,q,U,W,B,A,k,V,xe,Me],styles:['[_nghost-%COMP%]{display:block}.panel-header-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:12px}.panel-tip[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3)}.setting-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:10px 0;border-bottom:1px solid var(--border-light)}.setting-row.no-border[_ngcontent-%COMP%]{border-bottom:none}.setting-label[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);font-weight:600;color:var(--text-1)}.setting-desc[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3);margin-top:2px}.setting-ctrl[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.setting-input[_ngcontent-%COMP%]{width:110px;padding:5px 8px;border-radius:4px;border:1px solid var(--border);background:var(--bg-input);color:var(--text-2);font-size:var(--nginx-font-size-sm, 12px);text-align:center;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);outline:none}.setting-input[_ngcontent-%COMP%]:focus, .setting-textarea[_ngcontent-%COMP%]:focus{border-color:var(--blue);box-shadow:0 0 0 2px var(--blue-border)}.setting-textarea[_ngcontent-%COMP%]{width:100%;margin-top:8px;border:1px solid var(--border);border-radius:6px;background:var(--bg-input);color:var(--text-2);font-size:var(--nginx-font-size-sm, 12px);padding:8px 10px;resize:vertical;outline:none}.mono[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}']})};var Tt=class r{moduleStore=w(se);message=w($);instance=null;configFileCount=0;unbind=new me;backupRetention=g(5);configBackupRetention=g(20);settingsDirty=g(!1);saving=g(!1);async ngOnInit(){try{let t=await this.moduleStore.loadModuleSettings();t.settings&&this.patchSettingsFromResponse(t.settings)}catch{}}setBackupRetention(t){let e=Number(t),n=Number.isFinite(e)?Math.max(1,Math.trunc(e)):1;this.backupRetention.set(n),this.settingsDirty.set(!0)}setConfigBackupRetention(t){let e=Number(t),n=Number.isFinite(e)?Math.max(1,Math.trunc(e)):1;this.configBackupRetention.set(n),this.settingsDirty.set(!0)}async saveSettings(){this.saving.set(!0);try{let t=await this.moduleStore.saveModuleSettings({backupRetention:this.backupRetention(),configBackupRetention:this.configBackupRetention()});t.settings&&(this.patchSettingsFromResponse(t.settings),this.settingsDirty.set(!1),this.message.success("\u8BBE\u7F6E\u5DF2\u4FDD\u5B58"))}catch(t){this.message.error("\u4FDD\u5B58\u8BBE\u7F6E\u5931\u8D25: "+t.message)}finally{this.saving.set(!1)}}patchSettingsFromResponse(t){this.backupRetention.set(Math.max(1,Number(t.backupRetention??5))),this.configBackupRetention.set(Math.max(1,Number(t.configBackupRetention??20)))}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=T({type:r,selectors:[["app-nginx-secondary-settings-tab"]],inputs:{instance:"instance",configFileCount:"configFileCount"},outputs:{unbind:"unbind"},decls:58,vars:7,consts:[[1,"setting-row"],[1,"setting-label"],[1,"setting-desc"],[1,"setting-ctrl"],[1,"mono","strong"],["nz-input","","type","number","min","1",1,"retention-input","mono",3,"ngModelChange","ngModel"],["nz-button","","nzType","default",3,"click","disabled"],[1,"danger-box"],[1,"setting-label","danger"],[1,"setting-row","danger-row"],["nz-button","","nzDanger","","nzType","default",3,"click"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"div")(2,"div",1),d(3,"Nginx \u8DEF\u5F84"),s(),a(4,"div",2),d(5,"\u53EF\u6267\u884C\u6587\u4EF6\u4F4D\u7F6E"),s()(),a(6,"div",3)(7,"span",4),d(8),s()()(),a(9,"div",0)(10,"div")(11,"div",1),d(12,"\u914D\u7F6E\u6587\u4EF6"),s(),a(13,"div",2),d(14,"\u4E3B\u914D\u7F6E\u8DEF\u5F84"),s()(),a(15,"div",3)(16,"span",4),d(17),s()()(),a(18,"div",0)(19,"div")(20,"div",1),d(21,"\u914D\u7F6E\u6587\u4EF6\u6570"),s(),a(22,"div",2),d(23,"\u6839\u636E include \u6307\u4EE4\u89E3\u6790"),s()(),a(24,"div",3)(25,"span",4),d(26),s()()(),a(27,"div",0)(28,"div")(29,"div",1),d(30,"\u72B6\u6001\u5907\u4EFD\u4FDD\u7559\u6570"),s(),a(31,"div",2),d(32,".ngm-nginx-module.json.backup-* \u6700\u591A\u4FDD\u7559\u6570\u91CF"),s()(),a(33,"div",3)(34,"input",5),p("ngModelChange",function(o){return n.setBackupRetention(o)}),s(),a(35,"button",6),p("click",function(){return n.saveSettings()}),d(36," \u4FDD\u5B58 "),s()()(),a(37,"div",0)(38,"div")(39,"div",1),d(40,"\u914D\u7F6E\u5907\u4EFD\u4FDD\u7559\u6570"),s(),a(41,"div",2),d(42,"*.conf.backup-* \u6700\u591A\u4FDD\u7559\u6570\u91CF"),s()(),a(43,"div",3)(44,"input",5),p("ngModelChange",function(o){return n.setConfigBackupRetention(o)}),s(),a(45,"button",6),p("click",function(){return n.saveSettings()}),d(46," \u4FDD\u5B58 "),s()()(),a(47,"div",7)(48,"div",8),d(49,"\u5371\u9669\u64CD\u4F5C"),s(),a(50,"div",9)(51,"div")(52,"div",1),d(53,"\u89E3\u7ED1\u5B9E\u4F8B"),s(),a(54,"div",2),d(55,"\u4E0D\u5F71\u54CD Nginx \u670D\u52A1\u672C\u8EAB"),s()(),a(56,"button",10),p("click",function(){return n.unbind.emit()}),d(57," \u89E3\u7ED1 "),s()()()),e&2&&(l(8),y((n.instance==null?null:n.instance.path)||"-"),l(9),y((n.instance==null?null:n.instance.configPath)||"-"),l(9),y(n.configFileCount),l(8),u("ngModel",n.backupRetention()),l(),u("disabled",!n.settingsDirty()||n.saving()),l(9),u("ngModel",n.configBackupRetention()),l(),u("disabled",!n.settingsDirty()||n.saving()))},dependencies:[E,H,Q,Ct,j,vt,q,U,W,B,A,ae,re],styles:['.setting-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:10px 0;border-bottom:1px solid var(--border-light)}.setting-row[_ngcontent-%COMP%]:last-child{border-bottom:none}.setting-row.danger-row[_ngcontent-%COMP%]{padding:6px 0 0;border-bottom:none}.setting-label[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);font-weight:600;color:var(--text-1)}.setting-label.danger[_ngcontent-%COMP%]{color:var(--red);margin-bottom:4px}.setting-desc[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3);margin-top:2px}.setting-ctrl[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.retention-input[_ngcontent-%COMP%]{width:92px}.mono[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}.mono.strong[_ngcontent-%COMP%]{color:var(--text-1);font-weight:600}.danger-box[_ngcontent-%COMP%]{margin-top:8px;padding:10px 12px;border:1px solid rgba(245,63,63,.2);background:var(--red-bg);border-radius:6px}@media (max-width: 768px){.setting-row[_ngcontent-%COMP%]{flex-direction:column;align-items:flex-start}}']})};var _i=(r,t)=>t.id;function Ci(r,t){r&1&&(a(0,"div",9),d(1,"\u6682\u65E0 SSL \u8BC1\u4E66\u914D\u7F6E\uFF0C\u70B9\u51FB\u201C\u65B0\u589E\u8BC1\u4E66\u201D\u5F00\u59CB\u7EF4\u62A4"),s())}function vi(r,t){if(r&1){let e=D();a(0,"div",12)(1,"div",13)(2,"div",14),d(3),s(),a(4,"span",15),d(5),s()(),a(6,"div",16)(7,"div",17)(8,"span",18),d(9,"\u5230\u671F\u65F6\u95F4"),s(),a(10,"span",19),d(11),s()(),a(12,"div",17)(13,"span",18),d(14,"\u81EA\u52A8\u7EED\u671F"),s(),a(15,"span",20),d(16),s()(),a(17,"div",21)(18,"span",18),d(19,"\u8BC1\u4E66\u8DEF\u5F84"),s(),a(20,"span",19),d(21),s()(),a(22,"div",21)(23,"span",18),d(24,"\u79C1\u94A5\u8DEF\u5F84"),s(),a(25,"span",19),d(26),s()()(),a(27,"div",22)(28,"button",23),p("click",function(){let i=f(e).$implicit,o=c(2);return h(o.openEditDrawer(i))}),d(29,"\u7F16\u8F91"),s(),a(30,"button",24),p("click",function(){let i=f(e).$implicit,o=c(2);return h(o.removeRow(i.id))}),d(31,"\u5220\u9664"),s()()()}if(r&2){let e=t.$implicit,n=c(2);l(3),y(e.domain),l(),u("ngClass",e.status),l(),y(n.statusText(e.status)),l(6),y(e.expireAt||"-"),l(5),y(e.autoRenew?"\u5DF2\u542F\u7528":"\u672A\u542F\u7528"),l(5),y(e.certPath||"-"),l(5),y(e.keyPath||"-")}}function bi(r,t){if(r&1&&L(0,vi,32,7,"div",12,_i),r&2){let e=c();I(e.rows())}}function yi(r,t){if(r&1){let e=D();te(0),a(1,"div",25)(2,"form",26)(3,"nz-form-item")(4,"nz-form-label",27),d(5,"\u57DF\u540D"),s(),a(6,"nz-form-control")(7,"input",28),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.domain,i)||(o.drawerForm.domain=i),h(i)}),s()()(),a(8,"div",29)(9,"nz-form-item")(10,"nz-form-label"),d(11,"\u72B6\u6001"),s(),a(12,"nz-form-control")(13,"nz-select",30),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.status,i)||(o.drawerForm.status=i),h(i)}),x(14,"nz-option",31)(15,"nz-option",32)(16,"nz-option",33)(17,"nz-option",34),s()()(),a(18,"nz-form-item")(19,"nz-form-label"),d(20,"\u5230\u671F\u65F6\u95F4"),s(),a(21,"nz-form-control")(22,"input",35),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.expireAt,i)||(o.drawerForm.expireAt=i),h(i)}),s()()()(),a(23,"nz-form-item")(24,"nz-form-label"),d(25,"\u81EA\u52A8\u7EED\u671F"),s(),a(26,"nz-form-control")(27,"nz-switch",36),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.autoRenew,i)||(o.drawerForm.autoRenew=i),h(i)}),s()()(),a(28,"nz-form-item")(29,"nz-form-label",27),d(30,"\u8BC1\u4E66\u8DEF\u5F84"),s(),a(31,"nz-form-control")(32,"input",37),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.certPath,i)||(o.drawerForm.certPath=i),h(i)}),s()()(),a(33,"nz-form-item")(34,"nz-form-label",27),d(35,"\u79C1\u94A5\u8DEF\u5F84"),s(),a(36,"nz-form-control")(37,"input",38),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.keyPath,i)||(o.drawerForm.keyPath=i),h(i)}),s()()()()(),a(38,"div",39)(39,"button",3),p("click",function(){f(e);let i=c();return h(i.closeDrawer())}),d(40,"\u53D6\u6D88"),s(),a(41,"button",40),p("click",function(){f(e);let i=c();return h(i.submitDrawer())}),d(42,"\u786E\u5B9A"),s()(),ne()}if(r&2){let e=c();l(7),z("ngModel",e.drawerForm.domain),l(6),z("ngModel",e.drawerForm.status),l(9),z("ngModel",e.drawerForm.expireAt),l(5),z("ngModel",e.drawerForm.autoRenew),l(5),z("ngModel",e.drawerForm.certPath),l(5),z("ngModel",e.drawerForm.keyPath)}}var Pt=class r{moduleStore=w(se);message=w($);loading=g(!1);saving=g(!1);dirty=g(!1);rows=g([]);drawerVisible=g(!1);editingId=g(null);drawerForm=this.createEmptyForm();async ngOnInit(){await this.loadData()}async loadData(){this.loading.set(!0);try{(await this.moduleStore.loadSslCertificates()).certificates&&(this.rows.set(this.moduleStore.sslCertificates().map(e=>S({},e))),this.dirty.set(!1))}catch(t){this.message.error("\u52A0\u8F7D SSL \u914D\u7F6E\u5931\u8D25: "+t.message)}finally{this.loading.set(!1)}}openCreateDrawer(){this.editingId.set(null),this.drawerForm=this.createEmptyForm(),this.drawerVisible.set(!0)}openEditDrawer(t){this.editingId.set(t.id),this.drawerForm={domain:t.domain,certPath:t.certPath,keyPath:t.keyPath,expireAt:t.expireAt,status:t.status,autoRenew:t.autoRenew},this.drawerVisible.set(!0)}closeDrawer(){this.drawerVisible.set(!1)}submitDrawer(){let t=this.drawerForm.domain.trim();if(!t){this.message.warning("\u8BC1\u4E66\u57DF\u540D\u4E0D\u80FD\u4E3A\u7A7A");return}if(!this.drawerForm.certPath.trim()){this.message.warning("\u8BC1\u4E66\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A");return}if(!this.drawerForm.keyPath.trim()){this.message.warning("\u79C1\u94A5\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A");return}if(this.drawerForm.expireAt.trim()&&!this.isValidDateString(this.drawerForm.expireAt.trim())){this.message.warning("\u5230\u671F\u65F6\u95F4\u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u4F7F\u7528 YYYY-MM-DD");return}let e={id:this.editingId()||this.makeId(),domain:t,certPath:this.drawerForm.certPath.trim(),keyPath:this.drawerForm.keyPath.trim(),expireAt:this.drawerForm.expireAt.trim(),status:this.normalizeStatus(this.drawerForm.status),autoRenew:this.drawerForm.autoRenew};if(this.rows().find(i=>this.editingId()&&i.id===this.editingId()?!1:this.buildSslUniqueKey(i)===this.buildSslUniqueKey(e))){this.message.warning("\u8BC1\u4E66\u57DF\u540D + \u8BC1\u4E66\u8DEF\u5F84 + \u79C1\u94A5\u8DEF\u5F84\u91CD\u590D");return}this.editingId()?this.rows.update(i=>i.map(o=>o.id===e.id?e:o)):this.rows.update(i=>[...i,e]),this.markDirty(),this.closeDrawer()}removeRow(t){this.rows.update(e=>e.filter(n=>n.id!==t)),this.markDirty()}markDirty(){this.dirty.set(!0)}statusText(t){switch(t){case"valid":return"\u6709\u6548";case"expiring":return"\u5373\u5C06\u8FC7\u671F";case"expired":return"\u5DF2\u8FC7\u671F";default:return"\u5F85\u63A5\u5165"}}async saveAll(){let t=[],e=new Set;for(let n of this.rows()){let i=n.domain.trim();if(!i){this.message.warning("\u8BC1\u4E66\u57DF\u540D\u4E0D\u80FD\u4E3A\u7A7A");return}let o=n.certPath.trim(),m=n.keyPath.trim();if(!o){this.message.warning(`\u57DF\u540D "${i}" \u7684\u8BC1\u4E66\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A`);return}if(!m){this.message.warning(`\u57DF\u540D "${i}" \u7684\u79C1\u94A5\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A`);return}let _=n.expireAt.trim();if(_&&!this.isValidDateString(_)){this.message.warning(`\u57DF\u540D "${i}" \u7684\u5230\u671F\u65F6\u95F4\u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u4F7F\u7528 YYYY-MM-DD`);return}let C=this.buildSslUniqueKey({domain:i,certPath:o,keyPath:m});if(e.has(C)){this.message.warning(`\u68C0\u6D4B\u5230\u91CD\u590D\u8BC1\u4E66\u8BB0\u5F55: ${i}`);return}e.add(C),t.push(P(S({},n),{id:n.id||this.makeId(),domain:i,certPath:o,keyPath:m,expireAt:_,status:this.normalizeStatus(n.status)}))}this.saving.set(!0);try{await this.moduleStore.saveSslCertificates(t),this.message.success("SSL \u914D\u7F6E\u5DF2\u4FDD\u5B58"),this.dirty.set(!1),await this.loadData()}catch(n){this.message.error("\u4FDD\u5B58 SSL \u914D\u7F6E\u5931\u8D25: "+n.message)}finally{this.saving.set(!1)}}normalizeStatus(t){return t==="valid"||t==="expiring"||t==="expired"||t==="pending"?t:"pending"}makeId(){return`ssl-${Date.now()}-${Math.random().toString(16).slice(2,8)}`}isValidDateString(t){if(!/^\d{4}-\d{2}-\d{2}$/.test(t))return!1;let[e,n,i]=t.split("-").map(m=>Number(m));if(!Number.isInteger(e)||!Number.isInteger(n)||!Number.isInteger(i))return!1;let o=new Date(Date.UTC(e,n-1,i));return o.getUTCFullYear()===e&&o.getUTCMonth()===n-1&&o.getUTCDate()===i}buildSslUniqueKey(t){return`${t.domain.trim().toLowerCase()}|${t.certPath.trim().toLowerCase()}|${t.keyPath.trim().toLowerCase()}`}createEmptyForm(){return{domain:"",certPath:"",keyPath:"",expireAt:"",status:"pending",autoRenew:!1}}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=T({type:r,selectors:[["app-nginx-secondary-ssl-tab"]],decls:16,vars:8,consts:[[1,"panel-header-row"],[1,"panel-tip"],[1,"header-actions"],["nz-button","","nzType","default",3,"click"],["nzType","plus","nzTheme","outline"],["nz-button","","nzType","primary",3,"click","nzLoading","disabled"],["nzType","save","nzTheme","outline"],[3,"nzSpinning"],[1,"ssl-cards"],[1,"empty-row"],[3,"nzOnClose","nzVisible","nzTitle","nzWidth","nzPlacement"],[4,"nzDrawerContent"],[1,"ssl-card"],[1,"card-head"],[1,"card-domain","mono"],[1,"status-badge",3,"ngClass"],[1,"meta-list"],[1,"meta-item"],[1,"meta-label"],[1,"meta-value","mono"],[1,"meta-value"],[1,"meta-item","block"],[1,"card-actions"],["nz-button","","nzType","default","nzSize","small",3,"click"],["nz-button","","nzType","default","nzDanger","","nzSize","small",3,"click"],[1,"drawer-body"],["nz-form","","nzLayout","vertical"],["nzRequired",""],["nz-input","","name","sslDomain","placeholder","example.com",1,"mono",3,"ngModelChange","ngModel"],[1,"form-grid"],["name","sslStatus",3,"ngModelChange","ngModel"],["nzValue","valid","nzLabel","\u6709\u6548"],["nzValue","expiring","nzLabel","\u5373\u5C06\u8FC7\u671F"],["nzValue","expired","nzLabel","\u5DF2\u8FC7\u671F"],["nzValue","pending","nzLabel","\u5F85\u63A5\u5165"],["nz-input","","name","sslExpireAt","placeholder","YYYY-MM-DD",1,"mono",3,"ngModelChange","ngModel"],["name","sslAutoRenew",3,"ngModelChange","ngModel"],["nz-input","","name","sslCertPath","placeholder","/etc/nginx/ssl/fullchain.pem",1,"mono",3,"ngModelChange","ngModel"],["nz-input","","name","sslKeyPath","placeholder","/etc/nginx/ssl/privkey.pem",1,"mono",3,"ngModelChange","ngModel"],[1,"drawer-footer"],["nz-button","","nzType","primary",3,"click"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"span",1),d(2,"\u7BA1\u7406 SSL \u8BC1\u4E66\u4E0E\u5230\u671F\u72B6\u6001"),s(),a(3,"div",2)(4,"button",3),p("click",function(){return n.openCreateDrawer()}),x(5,"nz-icon",4),d(6," \u65B0\u589E\u8BC1\u4E66 "),s(),a(7,"button",5),p("click",function(){return n.saveAll()}),x(8,"nz-icon",6),d(9," \u4FDD\u5B58 "),s()()(),a(10,"nz-spin",7)(11,"div",8),v(12,Ci,2,0,"div",9)(13,bi,2,0),s()(),a(14,"nz-drawer",10),p("nzOnClose",function(){return n.closeDrawer()}),O(15,yi,43,6,"ng-container",11),s()),e&2&&(l(7),u("nzLoading",n.saving())("disabled",!n.dirty()),l(3),u("nzSpinning",n.loading()),l(2),b(n.rows().length?13:12),l(2),u("nzVisible",n.drawerVisible())("nzTitle",n.editingId()?"\u7F16\u8F91\u8BC1\u4E66":"\u65B0\u589E\u8BC1\u4E66")("nzWidth",500)("nzPlacement","right"))},dependencies:[E,gt,H,Qe,Q,j,He,q,Ke,U,W,B,A,$e,Ue,We,tt,qe,je,Xe,Ze,et,Je,k,V,ae,re,he,ge,fe,ze,Ge,xe,Me],styles:['[_nghost-%COMP%]{display:block}.panel-header-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:12px}.panel-tip[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3)}.header-actions[_ngcontent-%COMP%]{display:flex;gap:8px}.ssl-cards[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:10px}.ssl-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:10px;border:1px solid var(--border-light);border-radius:6px;padding:10px;background:#fff}.card-head[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:10px;border-bottom:1px solid var(--border-light);padding-bottom:8px}.card-domain[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-base, 14px);color:var(--text-1);font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-badge[_ngcontent-%COMP%]{display:inline-flex;align-items:center;height:24px;border-radius:12px;padding:0 10px;font-size:var(--nginx-font-size-sm, 12px);line-height:24px;border:1px solid transparent;white-space:nowrap}.status-badge.valid[_ngcontent-%COMP%]{color:var(--green);border-color:#00b42a33;background:var(--green-bg)}.status-badge.expiring[_ngcontent-%COMP%]{color:var(--orange);border-color:#ff7d0033;background:var(--orange-bg)}.status-badge.expired[_ngcontent-%COMP%]{color:var(--red);border-color:#f53f3f33;background:var(--red-bg)}.status-badge.pending[_ngcontent-%COMP%]{color:var(--text-2);border-color:var(--border);background:var(--bg-input)}.meta-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;flex:1}.meta-item[_ngcontent-%COMP%]{display:grid;grid-template-columns:80px 1fr;gap:8px;min-width:0}.meta-item.block[_ngcontent-%COMP%]{grid-template-columns:1fr}.meta-label[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3);font-weight:600}.meta-value[_ngcontent-%COMP%]{color:var(--text-1);font-size:var(--nginx-font-size-sm, 12px);min-width:0;word-break:break-all}.mono[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}.card-actions[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;gap:8px}.drawer-body[_ngcontent-%COMP%]{padding:0 24px 16px}.form-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:12px}.drawer-footer[_ngcontent-%COMP%]{position:absolute;bottom:0;left:0;right:0;padding:12px 24px;border-top:1px solid rgba(0,0,0,.06);display:flex;justify-content:flex-end;gap:8px;background:#fff}.empty-row[_ngcontent-%COMP%]{grid-column:1 / -1;border:1px dashed var(--border);border-radius:6px;color:var(--text-3);font-size:var(--nginx-font-size-sm, 12px);text-align:center;padding:20px 12px;background:#fff}@media (max-width: 992px){.panel-header-row[_ngcontent-%COMP%]{flex-direction:column;align-items:flex-start}.header-actions[_ngcontent-%COMP%]{width:100%}.form-grid[_ngcontent-%COMP%]{grid-template-columns:1fr}}']})};var Et=class r{loading=!1;logs=[];runTest=new me;static \u0275fac=function(e){return new(e||r)};static \u0275cmp=T({type:r,selectors:[["app-nginx-secondary-test-tab"]],inputs:{loading:"loading",logs:"logs"},outputs:{runTest:"runTest"},decls:7,vars:5,consts:[[1,"panel-header-row"],[1,"panel-tip"],["nz-button","","nzType","default","nzSize","small",1,"run-test-btn",3,"click","nzLoading"],["nzType","check-circle","nzTheme","outline"],["statusTone","ok",3,"title","status","logs","maxHeight"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"span",1),d(2,"\u9A8C\u8BC1 Nginx \u914D\u7F6E\u6587\u4EF6\u8BED\u6CD5\u6B63\u786E\u6027"),s(),a(3,"button",2),p("click",function(){return n.runTest.emit()}),x(4,"nz-icon",3),d(5," \u6267\u884C\u68C0\u6D4B "),s()(),x(6,"app-nginx-log-viewer",4)),e&2&&(l(3),u("nzLoading",n.loading),l(3),u("title","\u7ED3\u679C")("status","\u2713 syntax is ok")("logs",n.logs)("maxHeight",180))},dependencies:[E,U,W,B,A,k,V,Ee],styles:["[_nghost-%COMP%]{display:block}.panel-header-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:12px}.panel-tip[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-base, 14px);color:var(--text-2)}.run-test-btn[_ngcontent-%COMP%]{background:var(--green);color:#fff;border-color:var(--green);font-weight:600;min-height:28px;padding-inline:10px}.run-test-btn[_ngcontent-%COMP%]:hover, .run-test-btn[_ngcontent-%COMP%]:focus{background:#00a122;border-color:#00a122;color:#fff}@media (max-width: 992px){.panel-header-row[_ngcontent-%COMP%]{flex-direction:column;align-items:flex-start}}"]})};var Ft=class r{moduleStore=w(se);message=w($);saving=g(!1);dirty=g(!1);config=g({rateLimitEnabled:!1,rateLimit:"",connLimitEnabled:!1,connLimit:0,blacklistIps:[]});blacklistText=g("");async ngOnInit(){await this.load()}async load(){try{if((await this.moduleStore.loadTrafficConfig()).traffic){let e=this.moduleStore.trafficConfig();this.config.set(P(S({},e),{connLimit:Math.max(0,Number(e.connLimit??0))})),this.blacklistText.set((e.blacklistIps||[]).join(`
|
|
1
|
+
import{a as Vn,b as Bn}from"./chunk-OZONPLGN.js";import{a as Tn,e as Pn,f as En}from"./chunk-NVN2P466.js";import{a as yt,b as Ye}from"./chunk-DRV2KPHO.js";import{b as Ln,c as In,d as Rn}from"./chunk-Z4T3LTE2.js";import{a as Ze,b as Xe,c as Je,d as et,e as tt}from"./chunk-Z7GYTPTP.js";import{a as Me,b as xe}from"./chunk-KDMWEV46.js";import{a as We,b as Ue,c as $e}from"./chunk-TPVKLECM.js";import{a as Fn,b as kn,c as On}from"./chunk-C6GC5OOE.js";import{a as St,b as wt}from"./chunk-YNYWN7QI.js";import{a as Ge,b as ze}from"./chunk-4PSSTE76.js";import"./chunk-6ZXQKFRQ.js";import"./chunk-PUHSNEN6.js";import{a as Nn,c as Dn,d as ge,e as fe,f as he}from"./chunk-JFR7U5DE.js";import{b as je,c as qe,e as wn}from"./chunk-5Y7KNVNN.js";import{g as Re,h as Ve,k as Be,l as Ae}from"./chunk-IX6UZA7J.js";import{a as Mn}from"./chunk-GYXK6ZZT.js";import"./chunk-7VJKEZTT.js";import{c as bt,e as we}from"./chunk-S6BY2OTR.js";import{d as $,k as zn}from"./chunk-JIVQNGBJ.js";import{$b as Kt,Cb as bn,Eb as yn,Fb as Sn,Ia as V,Ib as Q,Ja as k,Kb as j,Lb as He,M as qt,Ma as xn,N as hn,Na as _n,Nb as Ke,Oa as Cn,Ob as q,Pb as Qe,Qb as Ct,Ra as B,Sa as A,Ua as W,Ub as vt,V as ht,Va as U,W as rt,Yb as H,_b as Ht,a as fn,ac as Qt,bb as vn,bc as Yt,cc as re,fc as ae,qa as xt,sa as _t}from"./chunk-2EB7UV3S.js";import"./chunk-HFZLJHYR.js";import"./chunk-X6PRUZ5G.js";import{g as gt,i as gn,n as E,u as ft}from"./chunk-SIKDYQOR.js";import{$b as De,Ac as Oe,Ad as ut,Ba as rn,Bc as Le,Cc as it,Da as an,Dc as At,Ec as Wt,Fc as oe,Gb as T,Gc as ct,Ha as g,Hb as ln,Hc as F,Jc as Ie,Kc as d,Lb as dn,Lc as y,M as en,Mb as O,Mc as J,Nc as mt,Oa as Fe,Oc as mn,Pc as z,Qc as M,Ra as sn,Rc as N,Vb as ye,Xb as v,Yc as pn,Zb as b,Zc as Te,_b as pe,a as S,ac as L,b as P,bc as I,cc as u,dc as a,ec as s,ed as Se,fc as x,gc as Z,hc as X,ic as cn,id as Ut,jc as te,jd as K,kb as Vt,kc as ne,ld as $t,ma as tn,mc as D,na as lt,oa as nn,ob as l,od as pt,pd as R,qd as jt,ra as on,rd as ot,sa as w,sc as p,tb as me,vc as c,vd as un,wb as Bt,wc as dt,xc as ue,ya as f,z as ce,za as h,zc as ke,zd as Pe}from"./chunk-YGWA6NUS.js";function An(){let r=window;if(!r.monaco)return;let t=r.monaco;t.languages.getLanguages().some(e=>e.id==="nginx")||(t.languages.register({id:"nginx",extensions:[".conf"],aliases:["Nginx"]}),t.languages.setMonarchTokensProvider("nginx",{tokenizer:{root:[[/#.*$/,"comment"],[/^\s*(http|server|events|stream|upstream|location|map|geo|types|if|in|limit_except|split_clients|match)\b/,"keyword.control"],[/\b(root|index|try_files|alias|return|rewrite|proxy_pass|fastcgi_pass|scgi_pass|uwsgi_pass|include|set|add_header|expires|proxy_set_header|fastcgi_param|listen|server_name|error_page|default_server|upstream|zone|least_conn|ip_hash|keepalive|keepalive_requests|keepalive_timeout|worker_processes|worker_connections|use|multi_accept|accept_mutex|sendfile|tcp_nopush|tcp_nodelay|reset_timedout|resolver|resolver_timeout|client_max_body_size|client_body_buffer|gzip|gunzip|gzip_types|gzip_comp_level|gzip_vary|open_file_cache|open_file_cache_valid|open_file_cache_min_uses|log_format|access_log|error_log|pid|user|group|daemon|master_process|worker_rlimit_nofile|worker_rlimit_core|worker_shutdown|load_module|types|default_type|server_tokens|aio|directio|sendfile_max_chunk|proxy_buffering|proxy_buffer_size|proxy_buffers|proxy_busy_buffers_size|proxy_temp_path|proxy_temp_file_write_size|fastcgi_buffer_size|fastcgi_buffers|fastcgi_busy_buffers_size|fastcgi_temp_path|fastcgi_temp_file_write_size|fastcgi_cache|fastcgi_cache_key|fastcgi_cache_path|fastcgi_cache_valid|fastcgi_cache_use_stale|fastcgi_no_cache|fastcgi_cache_bypass|fastcgi_ignore_headers|fastcgi_intercept_errors|fastcgi_next_upstream|fastcgi_next_upstream_tries|fastcgi_connect_timeout|fastcgi_send_timeout|fastcgi_read_timeout|proxy_connect_timeout|proxy_send_timeout|proxy_read_timeout|proxy_ignore_client_abort|proxy_hide_header|proxy_pass_header|proxy_redirect|proxy_cookie_domain|proxy_cookie_path|proxy_set_header|proxy_http_version|proxy_force_ranges|proxy_cache|proxy_cache_key|proxy_cache_path|proxy_cache_valid|proxy_cache_use_stale|proxy_cache_background_update|proxy_cache_lock|proxy_cache_lock_timeout|proxy_no_cache|proxy_cache_bypass|proxy_ignore_headers|proxy_intercept_errors|proxy_next_upstream|proxy_next_upstream_tries|proxy_next_upstream_timeout|proxy_store|proxy_store_access|auth_basic|auth_basic_user_file|satisfy|allow|deny|limit_req|limit_req_zone|limit_req_status|limit_conn|limit_conn_zone|limit_conn_status|return|rewrite|break|set|if|set_by_lua|access_by_lua|content_by_lua|header_filter_by_lua|body_filter_by_lua|log_by_lua|rewrite_by_lua|init_by_lua|init_worker_by_lua|ssl_certificate|ssl_certificate_key|ssl_session_cache|ssl_session_timeout|ssl_protocols|ssl_ciphers|ssl_prefer_server_ciphers|ssl_verify_client|ssl_client_certificate|ssl_trusted_certificate|ssl_crl|real_ip_header|set_real_ip_from|geo|geoip_country|geoip_city|memcached_pass|memcached_connect_timeout|memcached_send_timeout|memcached_read_timeout|grpc_pass|grpc_connect_timeout|grpc_send_timeout|grpc_read_timeout|grpc_buffer_size|websocket|websocket_connect_timeout|websocket_send_timeout|websocket_read_timeout|websocket_ping_interval|websocket_ping_timeout|concat|concat_types|secure_link|secure_link_md5|add_before_body|add_after_body|addition_types|image_filter|xslt_stylesheet|xslt_types|random_index|geo|map|perl|perl_modules|perl_require|perl_handler|slice|mp4|mp4_buffer_size|mp4_max_buffer_size|flv|ogmp|status|status_format|check|check_http_send|check_http_expect_alive|check_shm_size|check_status|upstream_conf|js_set|js_content|js_header_filter_by_lua|js_body_filter_by_lua|js_log_by_lua|js_access_by_lua|js_content_by_lua|js_rewrite_by_lua|js_preread_by_lua|influxdb|set_|add_|proxy_|fastcgi_|uwsgi_|scgi_|grpc_|limit_|auth_|secure_|websocket_|ssl_|real_|memcached_|grpc_|proxy_next_upstream_tries|proxy_next_upstream_timeout)\b/,"keyword.directive"],[/\b(on|off|yes|no|true|false|default|none|any|auto|inline|upstream|down|backup|weight|max_fails|fail_timeout)\b/,"keyword.value"],[/\b\d+[kKmMgG]?\b/,"number"],[/"[^"]*"/,"string"],[/'[^']*'/,"string"],[/\$[a-zA-Z_][a-zA-Z0-9_]*/,"variable"],[/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d+)?\b/,"number"],[/\b\d{1,5}\b/,"number"]]}}),t.editor.defineTheme("nginx-theme",{base:"vs",inherit:!0,rules:[{token:"comment",foreground:"6A9955",fontStyle:"italic"},{token:"keyword.control",foreground:"0000FF",fontStyle:"bold"},{token:"keyword.directive",foreground:"795E26"},{token:"keyword.value",foreground:"0000FF"},{token:"string",foreground:"A31515"},{token:"number",foreground:"098658"},{token:"variable",foreground:"001188"}]}))}var ee=class r{http=w(zn);baseUrl="/api/nginx";statusCache=null;async getStatus(){let t=await this.getData(`${this.baseUrl}/status`);return this.statusCache={instance:t.instance||null,status:t.status},t}async getStats(){let t=await this.getData(`${this.baseUrl}/stats`);return t.status&&(this.statusCache={instance:t.instance||null,status:t.status}),t}async bind(t){let e={path:t};return await this.postData(`${this.baseUrl}/bind`,e)}async unbind(){await this.postAction(`${this.baseUrl}/unbind`,{}),this.statusCache=null}getCachedStatusSnapshot(){return this.statusCache?{instance:this.statusCache.instance?S({},this.statusCache.instance):null,status:S({},this.statusCache.status)}:null}async getLocalIp(){return await this.getData(`${this.baseUrl}/local-ip`)}async start(){return this.executeWithRetry(()=>this.postData(`${this.baseUrl}/start`,{}))}async stop(){return this.executeWithRetry(()=>this.postData(`${this.baseUrl}/stop`,{}))}async reload(){return this.executeWithRetry(()=>this.postData(`${this.baseUrl}/reload`,{}))}async test(){return await ce(this.http.post(`${this.baseUrl}/test`,{}))}async getConfig(){return await this.getData(`${this.baseUrl}/config`)}async updateConfig(t){let e={content:t};await this.putAction(`${this.baseUrl}/config`,e)}async validateConfig(t){let e={content:t};return await ce(this.http.post(`${this.baseUrl}/config/validate`,e))}async getConfigFiles(){return await this.getData(`${this.baseUrl}/config/files`)}async getConfigFile(t){let e=new ft().set("filePath",t);return await this.getData(`${this.baseUrl}/config/file`,e)}async updateConfigFile(t,e){let n={filePath:t,content:e};await this.putAction(`${this.baseUrl}/config/file`,n)}async getServers(){return await this.getData(`${this.baseUrl}/servers`)}async getServer(t){return await this.getData(`${this.baseUrl}/servers/${t}`)}async createServer(t){return await this.postData(`${this.baseUrl}/servers`,t)}async updateServer(t,e){return await this.putData(`${this.baseUrl}/servers/${t}`,e)}async deleteServer(t){return await this.deleteData(`${this.baseUrl}/servers/${t}`)}async restoreDeletedServer(t){return await this.postData(`${this.baseUrl}/servers/restore-deleted`,{snapshotId:t})}async enableServer(t){await this.patchAction(`${this.baseUrl}/servers/${t}/enable`,{})}async disableServer(t){await this.patchAction(`${this.baseUrl}/servers/${t}/disable`,{})}async validateSslPaths(t,e){let n={sslCert:t,sslKey:e};return await this.postData(`${this.baseUrl}/servers/validate-ssl-paths`,n)}async parseImportServers(t){let e={content:t};return await this.postData(`${this.baseUrl}/servers/import/parse`,e)}async analyzeImportServers(t){let e={requests:t};return await this.postData(`${this.baseUrl}/servers/import/analyze`,e)}async getUpstreams(){return await this.getData(`${this.baseUrl}/upstreams`)}async saveUpstreams(t){let e={upstreams:t};await this.putAction(`${this.baseUrl}/upstreams`,e)}async getSslCertificates(){return await this.getData(`${this.baseUrl}/ssl/certificates`)}async saveSslCertificates(t){let e={certificates:t};await this.putAction(`${this.baseUrl}/ssl/certificates`,e)}async getTrafficConfig(){return await this.getData(`${this.baseUrl}/traffic`)}async saveTrafficConfig(t){let e=t;await this.putAction(`${this.baseUrl}/traffic`,e)}async getPerformanceConfig(){return await this.getData(`${this.baseUrl}/performance`)}async savePerformanceConfig(t){let e=t;await this.putAction(`${this.baseUrl}/performance`,e)}async getModuleSettings(){return await this.getData(`${this.baseUrl}/module/settings`)}async saveModuleSettings(t){let e=t;return await this.putData(`${this.baseUrl}/module/settings`,e)}async getErrorLogs(t=100){let e=new ft().set("tail",t.toString());return await this.getData(`${this.baseUrl}/logs/error`,e)}async getAccessLogs(t=100){let e=new ft().set("tail",t.toString());return await this.getData(`${this.baseUrl}/logs/access`,e)}async getLogsInfo(){return await this.getData(`${this.baseUrl}/logs/info`)}async executeWithRetry(t,e={}){let n=Math.max(0,e.retries??1),i=Math.max(0,e.delayMs??500),o;for(let m=0;m<=n;m++)try{return await t()}catch(_){if(o=_,m>=n)throw _;i>0&&await new Promise(C=>setTimeout(C,i))}throw o}async getData(t,e){return await ce(this.http.get(t,e))}async postData(t,e){return await ce(this.http.post(t,e))}async putData(t,e){return await ce(this.http.put(t,e))}async deleteData(t){return await ce(this.http.delete(t))}async postAction(t,e){await ce(this.http.post(t,e))}async putAction(t,e){await ce(this.http.put(t,e))}async patchAction(t,e){await ce(this.http.patch(t,e))}static \u0275fac=function(e){return new(e||r)};static \u0275prov=lt({token:r,factory:r.\u0275fac,providedIn:"root"})};var ni=["editorShell"];function ii(r,t){r&1&&x(0,"nz-icon",7)}function oi(r,t){if(r&1&&x(0,"nz-option",9),r&2){let e=t.$implicit,n=c();u("nzValue",e)("nzLabel",n.getFileLabel(e))}}function ri(r,t){r&1&&(x(0,"nz-icon",25),a(1,"span"),d(2,"\u914D\u7F6E\u9A8C\u8BC1\u901A\u8FC7"),s())}function ai(r,t){r&1&&(x(0,"nz-icon",26),a(1,"span"),d(2,"\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25"),s())}function si(r,t){if(r&1&&(a(0,"div",27),d(1),s()),r&2){let e=t.$implicit;l(),y(e)}}function li(r,t){if(r&1&&(a(0,"div",23),L(1,si,2,1,"div",27,pe),s()),r&2){let e,n=c(2);l(),I((e=n.validationResult())==null?null:e.errors)}}function di(r,t){if(r&1&&(a(0,"div",28),d(1),s()),r&2){let e=t.$implicit;l(),y(e)}}function ci(r,t){if(r&1&&(a(0,"div",24),L(1,di,2,1,"div",28,pe),s()),r&2){let e,n=c(2);l(),I((e=n.validationResult())==null?null:e.warnings)}}function mi(r,t){if(r&1&&(a(0,"div",22),v(1,ri,3,0)(2,ai,3,0),v(3,li,3,0,"div",23),v(4,ci,3,0,"div",24),s()),r&2){let e,n,i,o,m=c();F("error",!((e=m.validationResult())!=null&&e.valid)),l(),b((n=m.validationResult())!=null&&n.valid?1:2),l(2),b(!((i=m.validationResult())==null||i.errors==null)&&i.errors.length?3:-1),l(),b(!((o=m.validationResult())==null||o.warnings==null)&&o.warnings.length?4:-1)}}var zt=class r{refreshToken=0;editorShellRef;nginxService=w(ee);message=w($);config=g(null);configFiles=g([]);selectedFilePath=g("");originalContent=g("");editorContent=g("");filesLoading=g(!1);loading=g(!0);saving=g(!1);validating=g(!1);validationResult=g(null);editorHeight=g(520);editorOptions={language:"nginx"};mainConfigPath="";diffEditor=null;resizeObserver=null;async ngOnInit(){await this.loadConfig(!0),await this.loadConfigFiles()}ngAfterViewInit(){this.setupEditorHeightObserver(),this.updateEditorHeight()}ngOnChanges(t){let e=t.refreshToken;e&&!e.firstChange&&this.loadConfigFiles()}ngOnDestroy(){this.resizeObserver?.disconnect(),this.resizeObserver=null}onCodeEditorInitialized(t){An(),this.isDiffEditor(t)&&(this.diffEditor=t),this.scheduleLayout()}onEditorContentChange(t){this.editorContent.set(String(t??""))}async loadConfig(t=!1){this.loading.set(!0);try{let e=this.selectedFilePath(),n=t||!e||this.isSamePath(e,this.mainConfigPath||e),i=n?await this.nginxService.getConfig():await this.nginxService.getConfigFile(e);if(i.config){let o=i.config.content||"";this.config.set(i.config),this.originalContent.set(o),this.editorContent.set(o),this.validationResult.set(null),this.selectedFilePath.set(i.config.mainConfigPath||e),(n||!this.mainConfigPath)&&(this.mainConfigPath=i.config.mainConfigPath),this.mergeConfigFiles([i.config.mainConfigPath]),this.updateEditorHeight(),this.scheduleLayout()}}catch(e){this.message.error("\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25: "+e.message)}finally{this.loading.set(!1)}}async saveConfig(){let t=this.selectedFilePath()||this.config()?.mainConfigPath||"";if(!t){this.message.error("\u672A\u9009\u62E9\u914D\u7F6E\u6587\u4EF6");return}this.saving.set(!0);try{let e=this.getCurrentEditorContent();this.isSamePath(t,this.mainConfigPath||t)?await this.nginxService.updateConfig(e):await this.nginxService.updateConfigFile(t,e),this.message.success("\u4FDD\u5B58\u6210\u529F"),await this.loadConfig(),await this.loadConfigFiles()}catch(e){this.message.error("\u4FDD\u5B58\u5931\u8D25: "+e.message)}finally{this.saving.set(!1)}}async validateConfig(){this.validating.set(!0);try{let t=await this.nginxService.validateConfig(this.getCurrentEditorContent());this.validationResult.set(t),t.valid?this.message.success("\u914D\u7F6E\u9A8C\u8BC1\u901A\u8FC7"):this.message.error("\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25")}catch(t){this.message.error("\u9A8C\u8BC1\u5931\u8D25: "+t.message)}finally{this.validating.set(!1)}}async loadConfigFiles(){this.filesLoading.set(!0);try{let e=(await this.nginxService.getConfigFiles()).files||[],n=this.buildFileList(e);this.configFiles.set(n);let i=this.selectedFilePath();i&&n.length&&!n.some(o=>this.isSamePath(o,i))&&(this.selectedFilePath.set(n[0]),await this.loadConfig())}catch(t){this.message.error("\u52A0\u8F7D\u6587\u4EF6\u5217\u8868\u5931\u8D25: "+t.message)}finally{this.filesLoading.set(!1)}}async onSelectConfigFile(t){let e=String(t||"").trim();!e||this.isSamePath(e,this.selectedFilePath())||(this.selectedFilePath.set(e),await this.loadConfig())}getFileLabel(t){let n=String(t||"").replace(/\\/g,"/").split("/");return n[n.length-1]||t}hasUnsavedChanges(){return this.getCurrentEditorContent()!==this.originalContent()}restoreFromOriginal(){let t=this.originalContent(),e=this.diffEditor?.getModel()?.modified;e&&e.setValue(t),this.editorContent.set(t),this.validationResult.set(null),this.scheduleLayout(),this.message.success("\u5DF2\u8FD8\u539F\u5230\u5DF2\u52A0\u8F7D\u7248\u672C")}getCurrentEditorContent(){let t=this.diffEditor?.getModel()?.modified;return t?t.getValue():this.editorContent()}mergeConfigFiles(t){let e=this.buildFileList([...this.configFiles(),...t]);this.configFiles.set(e)}buildFileList(t){let e=new Map;for(let i of t){let o=this.normalizePath(i);o&&(e.has(o)||e.set(o,i))}let n=Array.from(e.values());if(n.sort((i,o)=>i.localeCompare(o)),this.mainConfigPath){let i=n.findIndex(o=>this.isSamePath(o,this.mainConfigPath));if(i>0){let[o]=n.splice(i,1);n.unshift(o)}i<0&&n.unshift(this.mainConfigPath)}return n}isSamePath(t,e){return this.normalizePath(t)===this.normalizePath(e)}normalizePath(t){return String(t||"").trim().replace(/\\/g,"/").toLowerCase()}scheduleLayout(){setTimeout(()=>{try{this.updateEditorHeight(),this.syncDiffEditorHeight(),this.diffEditor?.layout()}catch{}},0)}setupEditorHeightObserver(){let t=this.editorShellRef?.nativeElement;!t||typeof ResizeObserver>"u"||(this.resizeObserver?.disconnect(),this.resizeObserver=new ResizeObserver(()=>{this.updateEditorHeight(),setTimeout(()=>{this.syncDiffEditorHeight(),this.diffEditor?.layout()},0)}),this.resizeObserver.observe(t))}updateEditorHeight(){let t=this.editorShellRef?.nativeElement;if(!t){this.editorHeight.set(520);return}let e=t.clientHeight>0?t.clientHeight:0,n=Math.max(520,e);this.editorHeight()!==n&&this.editorHeight.set(n)}syncDiffEditorHeight(){let t=this.diffEditor?.getContainerDomNode();if(!t)return;let e=`${this.editorHeight()}px`;t.style.height=e;let n=t.querySelector(".monaco-diff-editor");n&&(n.style.height=e,n.style.minHeight="520px")}isDiffEditor(t){return typeof t.getOriginalEditor=="function"}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=T({type:r,selectors:[["app-nginx-config-editor"]],viewQuery:function(e,n){if(e&1&&ke(ni,7),e&2){let i;Oe(i=Le())&&(n.editorShellRef=i.first)}},inputs:{refreshToken:"refreshToken"},features:[Fe],decls:31,vars:17,consts:[["editorShell",""],[1,"config-editor"],[1,"editor-toolbar"],[1,"toolbar-left"],[1,"file-info"],["nzType","file-text","nzTheme","outline"],[1,"file-path"],["nzType","lock","nzTheme","outline","nz-tooltip","","nzTooltipTitle","\u914D\u7F6E\u6587\u4EF6\u53EA\u8BFB\uFF0C\u53EF\u80FD\u9700\u8981\u7BA1\u7406\u5458\u6743\u9650"],["nzPlaceHolder","\u9009\u62E9\u914D\u7F6E\u6587\u4EF6",1,"file-selector",3,"ngModelChange","ngModel","nzDisabled"],[3,"nzValue","nzLabel"],["nz-button","","nzType","default",3,"click","nzLoading"],["nzType","reload","nzTheme","outline"],[1,"editor-actions"],["nz-button","",3,"click","nzLoading"],["nz-button","","nzType","default","nz-popconfirm","","nzPopconfirmTitle","\u786E\u8BA4\u8FD8\u539F\u4E3A\u5F53\u524D\u5DF2\u52A0\u8F7D\u7248\u672C\uFF1F","nzPopconfirmPlacement","top",3,"nzOnConfirm","disabled"],["nzType","rollback","nzTheme","outline"],["nzType","check-circle","nzTheme","outline"],["nz-button","","nzType","primary",3,"click","nzLoading","disabled"],["nzType","save","nzTheme","outline"],[1,"editor-container"],["nzEditorMode","diff",1,"code-editor",3,"ngModelChange","nzEditorInitialized","ngModel","nzOriginalText","nzEditorOption","nzLoading"],[1,"validation-result",3,"error"],[1,"validation-result"],[1,"error-list"],[1,"warning-list"],["nzType","check-circle","nzTheme","outline",1,"success-icon"],["nzType","close-circle","nzTheme","outline",1,"error-icon"],[1,"error-item"],[1,"warning-item"]],template:function(e,n){if(e&1){let i=D();a(0,"div",1)(1,"div",2)(2,"div",3)(3,"div",4),x(4,"nz-icon",5),a(5,"span",6),d(6),s(),v(7,ii,1,0,"nz-icon",7),s(),a(8,"nz-select",8),p("ngModelChange",function(m){return f(i),h(n.onSelectConfigFile(m))}),L(9,oi,1,2,"nz-option",9,De),s(),a(11,"button",10),p("click",function(){return f(i),h(n.loadConfigFiles())}),x(12,"nz-icon",11),d(13," \u5237\u65B0\u6587\u4EF6\u5217\u8868 "),s()(),a(14,"div",12)(15,"button",13),p("click",function(){return f(i),h(n.loadConfig())}),x(16,"nz-icon",11),d(17," \u5237\u65B0 "),s(),a(18,"button",14),p("nzOnConfirm",function(){return f(i),h(n.restoreFromOriginal())}),x(19,"nz-icon",15),d(20," \u8FD8\u539F "),s(),a(21,"button",13),p("click",function(){return f(i),h(n.validateConfig())}),x(22,"nz-icon",16),d(23," \u9A8C\u8BC1 "),s(),a(24,"button",17),p("click",function(){return f(i),h(n.saveConfig())}),x(25,"nz-icon",18),d(26," \u4FDD\u5B58 "),s()()(),a(27,"div",19,0)(29,"nz-code-editor",20),p("ngModelChange",function(m){return f(i),h(n.onEditorContentChange(m))})("nzEditorInitialized",function(m){return f(i),h(n.onCodeEditorInitialized(m))}),s()(),v(30,mi,5,5,"div",21),s()}if(e&2){let i,o,m;l(6),y(((i=n.config())==null?null:i.mainConfigPath)||"\u672A\u52A0\u8F7D"),l(),b(((o=n.config())==null?null:o.isWritable)===!1?7:-1),l(),u("ngModel",n.selectedFilePath())("nzDisabled",n.loading()||!n.configFiles().length),l(),I(n.configFiles()),l(2),u("nzLoading",n.filesLoading()),l(4),u("nzLoading",n.loading()),l(3),u("disabled",!n.hasUnsavedChanges()),l(3),u("nzLoading",n.validating()),l(3),u("nzLoading",n.saving())("disabled",!((m=n.config())!=null&&m.isWritable)),l(5),ct("height",n.editorHeight(),"px"),u("ngModel",n.editorContent())("nzOriginalText",n.originalContent())("nzEditorOption",n.editorOptions)("nzLoading",n.loading()),l(),b(n.validationResult()?30:-1)}},dependencies:[E,H,j,q,U,W,B,A,Bn,Vn,k,V,Ye,yt,he,ge,fe,we,bt],styles:['.config-editor[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;border:1px solid #f0f0f0;border-radius:8px;overflow:hidden}.editor-toolbar[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;padding:12px 16px;background:#fafafa;border-bottom:1px solid #f0f0f0}.editor-toolbar[_ngcontent-%COMP%] .toolbar-left[_ngcontent-%COMP%]{min-width:0;flex:1;display:flex;flex-direction:row;align-items:center;flex-wrap:wrap;gap:10px}.editor-toolbar[_ngcontent-%COMP%] .file-info[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;font-size:var(--nginx-font-size-base, 14px);min-width:0}.editor-toolbar[_ngcontent-%COMP%] .file-info[_ngcontent-%COMP%] .file-path[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);color:#000000a6;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.editor-toolbar[_ngcontent-%COMP%] .file-selector[_ngcontent-%COMP%]{width:min(560px,100%)}.editor-toolbar[_ngcontent-%COMP%] .editor-actions[_ngcontent-%COMP%]{display:flex;gap:8px;flex-shrink:0}.editor-container[_ngcontent-%COMP%]{flex:1;min-height:520px;position:relative}.code-editor[_ngcontent-%COMP%]{display:block;min-height:520px;width:100%;border:1px solid #d9d9d9}.validation-result[_ngcontent-%COMP%]{padding:12px 16px;background:#f6ffed;border-top:1px solid #b7eb8f;display:flex;align-items:center;gap:8px}.validation-result.error[_ngcontent-%COMP%]{background:#fff2f0;border-top-color:#ffccc7}.validation-result[_ngcontent-%COMP%] .success-icon[_ngcontent-%COMP%]{color:#52c41a}.validation-result[_ngcontent-%COMP%] .error-icon[_ngcontent-%COMP%]{color:#ff4d4f}.validation-result[_ngcontent-%COMP%] .error-list[_ngcontent-%COMP%], .validation-result[_ngcontent-%COMP%] .warning-list[_ngcontent-%COMP%]{margin-top:8px;width:100%}.validation-result[_ngcontent-%COMP%] .error-list[_ngcontent-%COMP%] .error-item[_ngcontent-%COMP%], .validation-result[_ngcontent-%COMP%] .warning-list[_ngcontent-%COMP%] .error-item[_ngcontent-%COMP%]{color:#ff4d4f;font-size:var(--nginx-font-size-sm, 12px);padding:4px 0;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}.validation-result[_ngcontent-%COMP%] .error-list[_ngcontent-%COMP%] .warning-item[_ngcontent-%COMP%], .validation-result[_ngcontent-%COMP%] .warning-list[_ngcontent-%COMP%] .warning-item[_ngcontent-%COMP%]{color:#faad14;font-size:var(--nginx-font-size-sm, 12px);padding:4px 0;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}[_nghost-%COMP%] nz-code-editor.code-editor.ant-code-editor{width:100%;min-height:520px!important;display:block}[_nghost-%COMP%] nz-code-editor.code-editor .monaco-diff-editor{min-height:520px}']})};var pi=["logBody"];function ui(r,t){r&1&&(cn(0,"span",8),d(1," \u5B9E\u65F6 "))}function gi(r,t){if(r&1&&d(0),r&2){let e=c();J(" ",e.status," ")}}function fi(r,t){r&1&&(Z(0,"div",6),d(1,"\u6682\u65E0\u65E5\u5FD7"),X())}function hi(r,t){if(r&1&&(Z(0,"div",7)(1,"span",9),d(2),X(),Z(3,"span",10),d(4),X(),Z(5,"span",11),d(6),X()()),r&2){let e=t.$implicit,n=c();l(2),y(e.time),l(),Ie(n.getLevelClass(e.level)),l(),J(" ",n.getLevelLabel(e.level)," "),l(2),y(e.msg)}}var Ee=class r{title="error.log";status="";statusTone="default";showRealtime=!1;maxHeight=0;logs=[];logBody;scrollToBottom(){this.logBody&&(this.logBody.nativeElement.scrollTop=this.logBody.nativeElement.scrollHeight)}getLevelClass(t){return t}getLevelLabel(t){return{info:"INFO",warn:"WARN",error:"ERR",ok:"OK"}[t]??t.toUpperCase()}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=T({type:r,selectors:[["app-nginx-log-viewer"]],viewQuery:function(e,n){if(e&1&&ke(pi,5),e&2){let i;Oe(i=Le())&&(n.logBody=i.first)}},inputs:{title:"title",status:"status",statusTone:"statusTone",showRealtime:"showRealtime",maxHeight:"maxHeight",logs:"logs"},decls:12,vars:13,consts:[["logBody",""],[1,"log-panel"],[1,"log-header"],[1,"log-header-title"],[1,"log-header-status"],[1,"log-body"],[1,"log-empty"],[1,"log-line"],[1,"realtime-dot"],[1,"log-time"],[1,"log-level"],[1,"log-msg"]],template:function(e,n){e&1&&(Z(0,"div",1)(1,"div",2)(2,"span",3),d(3),X(),Z(4,"span",4),v(5,ui,2,0)(6,gi,1,1),X()(),Z(7,"div",5,0),v(9,fi,2,0,"div",6),L(10,hi,7,5,"div",7,pe),X()()),e&2&&(l(3),y(n.title),l(),F("realtime",n.showRealtime)("status-ok",n.statusTone==="ok")("status-warn",n.statusTone==="warn")("status-error",n.statusTone==="error"),l(),b(n.showRealtime?5:6),l(2),ct("max-height",n.maxHeight,"px"),l(2),b(n.logs.length===0?9:-1),l(),I(n.logs))},dependencies:[E,k],styles:['[_nghost-%COMP%]{display:block}.log-panel[_ngcontent-%COMP%]{background:#1b2332;border-radius:6px;overflow:hidden}.log-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;background:#00000026}.log-header-title[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:#fff6}.log-header-status[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:#ffffff80;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);font-weight:600;display:flex;align-items:center;gap:5px}.log-header-status.realtime[_ngcontent-%COMP%], .log-header-status.status-ok[_ngcontent-%COMP%]{color:#3dd68c}.log-header-status.status-warn[_ngcontent-%COMP%]{color:#f7ba1e}.log-header-status.status-error[_ngcontent-%COMP%]{color:#ef5350}.realtime-dot[_ngcontent-%COMP%]{width:6px;height:6px;border-radius:50%;background:#3dd68c;animation:_ngcontent-%COMP%_pulse 2s ease-in-out infinite}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:1}50%{opacity:.4}}.log-body[_ngcontent-%COMP%]{padding:10px 14px;max-height:180px;overflow-y:auto;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);font-size:var(--nginx-font-size-sm, 12px);line-height:1.8}.log-body[_ngcontent-%COMP%]::-webkit-scrollbar{width:6px}.log-body[_ngcontent-%COMP%]::-webkit-scrollbar-track{background:transparent}.log-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background:#333944;border-radius:3px}.log-empty[_ngcontent-%COMP%]{padding:16px 0;font-size:var(--nginx-font-size-sm, 12px);color:#ffffff59;text-align:center;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}.log-line[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:10px;cursor:default}.log-time[_ngcontent-%COMP%]{color:#ffffff80;flex-shrink:0;min-width:46px}.log-level[_ngcontent-%COMP%]{font-weight:700;flex-shrink:0;width:32px}.log-level.info[_ngcontent-%COMP%]{color:#165dff}.log-level.warn[_ngcontent-%COMP%]{color:#ff7d00}.log-level.error[_ngcontent-%COMP%]{color:#ef5350}.log-level.ok[_ngcontent-%COMP%]{color:#3dd68c}.log-msg[_ngcontent-%COMP%]{color:#ffffff8c;flex:1;word-break:break-all;white-space:pre-wrap}']})};var Nt=class r{nginxService=w(ee);wsClient=w(Mn);message=w($);wsSub;logViewerComponent;activeLogTab=g("error");isConnected=g(!1);loading=g(!1);errorLogs=g([]);accessLogs=g([]);currentLogs=g([]);maxLogLines=500;statusText=g("\u672A\u8FDE\u63A5");statusTone=g("default");ngOnInit(){this.setupWsSubscription(),this.loadInitialLogs()}ngOnDestroy(){this.unsubscribeWs(),this.wsSub?.unsubscribe()}switchLogTab(t){this.activeLogTab.set(t),this.updateCurrentLogs(),this.isConnected()&&(this.unsubscribeWs(),this.subscribeWs(t))}scrollToBottom(){this.logViewerComponent?.scrollToBottom()}async refreshLogs(){await this.loadInitialLogs(),this.message.success("\u65E5\u5FD7\u5DF2\u5237\u65B0")}clearLogs(){this.activeLogTab()==="error"?this.errorLogs.set([]):this.accessLogs.set([]),this.updateCurrentLogs()}setupWsSubscription(){this.wsClient.stateChanges().subscribe(t=>{let e=t==="open";this.isConnected.set(e),this.statusText.set(e?"\u5DF2\u8FDE\u63A5":t==="connecting"?"\u8FDE\u63A5\u4E2D...":"\u672A\u8FDE\u63A5"),this.statusTone.set(e?"ok":"default"),e&&this.subscribeWs(this.activeLogTab())}),this.wsSub=this.wsClient.messages().pipe(en(t=>t.op==="nginx.log.append"||t.op==="nginx.log.tail")).subscribe(t=>{t.op==="nginx.log.tail"?(this.handleLogTail(t),setTimeout(()=>{this.scrollToBottom()},100)):t.op==="nginx.log.append"&&this.handleLogAppend(t)}),this.wsClient.connect()}subscribeWs(t){this.wsClient.send({op:"sub",topic:"nginx",logType:t,tail:50})}unsubscribeWs(){this.wsClient.send({op:"unsub",topic:"nginx"})}handleLogTail(t){let e=t.lines.map(n=>this.parseLogLine(n));t.logType==="error"?this.errorLogs.set(e):this.accessLogs.set(e),this.updateCurrentLogs()}handleLogAppend(t){let e=this.parseLogLine(t.line),n=t.logType===this.activeLogTab();t.logType==="error"?this.errorLogs.update(i=>{let o=[...i,e];return o.length>this.maxLogLines?o.slice(-this.maxLogLines):o}):this.accessLogs.update(i=>{let o=[...i,e];return o.length>this.maxLogLines?o.slice(-this.maxLogLines):o}),n&&this.updateCurrentLogs()}updateCurrentLogs(){let e=this.activeLogTab()==="error"?this.errorLogs():this.accessLogs();this.currentLogs.set(e)}async loadInitialLogs(){this.loading.set(!0);try{let[t,e]=await Promise.all([this.nginxService.getErrorLogs(100),this.nginxService.getAccessLogs(100)]);t.lines&&this.errorLogs.set(t.lines.map(n=>this.parseLogLine(n))),e.lines&&this.accessLogs.set(e.lines.map(n=>this.parseLogLine(n))),this.updateCurrentLogs()}catch(t){this.message.error("\u52A0\u8F7D\u65E5\u5FD7\u5931\u8D25: "+t.message)}finally{this.loading.set(!1)}}parseLogLine(t){let e=t.match(/^(\d{4}\/\d{2}\/\d{2}\s+\d{2}:\d{2}:\d{2})/),n=t.match(/\[(error|warn|notice|info|crit|alert|emerg)\]/i),i="";if(e)i=e[1].split(/\s+/)[1]||e[1];else{let m=t.match(/(\d{2}:\d{2}:\d{2})/);i=m?m[1]:new Date().toLocaleTimeString("zh-CN",{hour12:!1})}let o="info";if(n){let m=n[1].toLowerCase();m==="error"||m==="crit"||m==="alert"||m==="emerg"?o="error":m==="warn"&&(o="warn")}return{time:i,level:o,msg:t}}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=T({type:r,selectors:[["app-nginx-secondary-logs-tab"]],viewQuery:function(e,n){if(e&1&&ke(Ee,5),e&2){let i;Oe(i=Le())&&(n.logViewerComponent=i.first)}},decls:14,vars:10,consts:[[1,"panel-header-row","compact"],[1,"log-tabs"],[1,"log-tab",3,"click"],[1,"log-actions"],["nz-button","","nzType","default",1,"log-action-btn",3,"click"],["nzType","vertical-align-bottom","nzTheme","outline"],["nz-button","","nzType","default",3,"click"],["nzType","reload","nzTheme","outline"],["nzType","delete","nzTheme","outline"],[3,"title","showRealtime","status","statusTone","logs","maxHeight"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"div",1)(2,"button",2),p("click",function(){return n.switchLogTab("error")}),d(3," error.log "),s(),a(4,"button",2),p("click",function(){return n.switchLogTab("access")}),d(5," access.log "),s()(),a(6,"div",3)(7,"button",4),p("click",function(){return n.scrollToBottom()}),x(8,"nz-icon",5),s(),a(9,"button",6),p("click",function(){return n.refreshLogs()}),x(10,"nz-icon",7),s(),a(11,"button",4),p("click",function(){return n.clearLogs()}),x(12,"nz-icon",8),s()()(),x(13,"app-nginx-log-viewer",9)),e&2&&(l(2),F("active",n.activeLogTab()==="error"),l(2),F("active",n.activeLogTab()==="access"),l(9),u("title",n.activeLogTab()==="error"?"error.log":"access.log")("showRealtime",n.isConnected())("status",n.statusText())("statusTone",n.statusTone())("logs",n.currentLogs())("maxHeight",400))},dependencies:[E,U,W,B,A,k,V,Ee],styles:["[_nghost-%COMP%]{display:block}.panel-header-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:12px}.panel-header-row.compact[_ngcontent-%COMP%]{margin-bottom:10px}.log-tabs[_ngcontent-%COMP%]{display:flex;gap:0}.log-tab[_ngcontent-%COMP%]{background:transparent;color:var(--text-3);font-size:var(--nginx-font-size-sm, 12px);font-weight:500;padding:6px 12px;cursor:pointer;transition:all .12s ease;border:none;border-bottom:2px solid transparent;margin-bottom:-1px}.log-tab[_ngcontent-%COMP%]:hover{color:var(--text-2)}.log-tab.active[_ngcontent-%COMP%]{color:var(--blue);border-bottom-color:var(--blue);font-weight:600}.log-actions[_ngcontent-%COMP%]{display:flex;gap:4px}.log-action-btn[_ngcontent-%COMP%] nz-icon[_ngcontent-%COMP%]{font-size:12px}"]})};var se=class r{constructor(t){this.nginxService=t}upstreams=g([]);sslCertificates=g([]);trafficConfig=g({rateLimitEnabled:!1,rateLimit:"",connLimitEnabled:!1,connLimit:0,blacklistIps:[]});performanceConfig=g({gzipEnabled:!1,gzipTypes:"",keepaliveTimeout:"",workerProcesses:"",sendfile:!1,tcpNopush:!1});moduleSettings=g({backupRetention:5,configBackupRetention:20});upstreamsLoading=g(!1);sslLoading=g(!1);trafficLoading=g(!1);performanceLoading=g(!1);settingsLoading=g(!1);async loadUpstreams(){this.upstreamsLoading.set(!0);try{let t=await this.nginxService.getUpstreams();return t.upstreams&&this.upstreams.set(t.upstreams),t}finally{this.upstreamsLoading.set(!1)}}async saveUpstreams(t){await this.nginxService.saveUpstreams(t),this.upstreams.set(t.map(e=>S({},e)))}async loadSslCertificates(){this.sslLoading.set(!0);try{let t=await this.nginxService.getSslCertificates();return t.certificates&&this.sslCertificates.set(t.certificates.map(e=>S({},e))),t}finally{this.sslLoading.set(!1)}}async saveSslCertificates(t){await this.nginxService.saveSslCertificates(t),this.sslCertificates.set(t.map(e=>S({},e)))}async loadTrafficConfig(){this.trafficLoading.set(!0);try{let t=await this.nginxService.getTrafficConfig();return t.traffic&&this.trafficConfig.set(P(S({},t.traffic),{connLimit:Math.max(0,Number(t.traffic.connLimit??0))})),t}finally{this.trafficLoading.set(!1)}}async saveTrafficConfig(t){await this.nginxService.saveTrafficConfig(t),this.trafficConfig.set(S({},t))}async loadPerformanceConfig(){this.performanceLoading.set(!0);try{let t=await this.nginxService.getPerformanceConfig();return t.performance&&this.performanceConfig.set(S({},t.performance)),t}finally{this.performanceLoading.set(!1)}}async savePerformanceConfig(t){await this.nginxService.savePerformanceConfig(t),this.performanceConfig.set(S({},t))}async loadModuleSettings(){this.settingsLoading.set(!0);try{let t=await this.nginxService.getModuleSettings();return t.settings&&this.moduleSettings.set({backupRetention:Math.max(1,Number(t.settings.backupRetention??5)),configBackupRetention:Math.max(1,Number(t.settings.configBackupRetention??20))}),t}finally{this.settingsLoading.set(!1)}}async saveModuleSettings(t){let e=await this.nginxService.saveModuleSettings(t);return e.settings&&this.moduleSettings.set({backupRetention:Math.max(1,Number(e.settings.backupRetention??5)),configBackupRetention:Math.max(1,Number(e.settings.configBackupRetention??20))}),e}static \u0275fac=function(e){return new(e||r)(on(ee))};static \u0275prov=lt({token:r,factory:r.\u0275fac,providedIn:"root"})};var Dt=class r{moduleStore=w(se);message=w($);saving=g(!1);dirty=g(!1);config=g({gzipEnabled:!1,gzipTypes:"",keepaliveTimeout:"",workerProcesses:"",sendfile:!1,tcpNopush:!1});async ngOnInit(){await this.load()}async load(){try{(await this.moduleStore.loadPerformanceConfig()).performance&&(this.config.set(S({},this.moduleStore.performanceConfig())),this.dirty.set(!1))}catch(t){this.message.error("\u52A0\u8F7D\u6027\u80FD\u914D\u7F6E\u5931\u8D25: "+t.message)}}setBoolean(t,e){this.config.update(n=>P(S({},n),{[t]:e})),this.markDirty()}markDirty(){this.dirty.set(!0)}async save(){let t=P(S({},this.config()),{gzipTypes:this.config().gzipTypes.trim(),keepaliveTimeout:this.config().keepaliveTimeout.trim(),workerProcesses:this.config().workerProcesses.trim()});this.saving.set(!0);try{await this.moduleStore.savePerformanceConfig(t),this.message.success("\u6027\u80FD\u4F18\u5316\u914D\u7F6E\u5DF2\u4FDD\u5B58"),this.dirty.set(!1),await this.load()}catch(e){this.message.error("\u4FDD\u5B58\u6027\u80FD\u914D\u7F6E\u5931\u8D25: "+e.message)}finally{this.saving.set(!1)}}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=T({type:r,selectors:[["app-nginx-secondary-perf-tab"]],decls:53,vars:8,consts:[[1,"panel-header-row"],[1,"panel-tip"],["nz-button","","nzType","primary",3,"click","nzLoading","disabled"],["nzType","save","nzTheme","outline"],[1,"setting-row"],[1,"setting-label"],[1,"setting-desc"],[1,"setting-ctrl"],["nzSize","small","name","gzipEnabled",3,"ngModelChange","ngModel"],["placeholder","65s",1,"setting-input",3,"ngModelChange","ngModel"],["placeholder","auto",1,"setting-input",3,"ngModelChange","ngModel"],["nzSize","small","name","sendfile",3,"ngModelChange","ngModel"],["nzSize","small","name","tcpNopush",3,"ngModelChange","ngModel"],[1,"setting-row","no-border"],[1,"full-width"],["rows","3",1,"setting-textarea","mono",3,"ngModelChange","ngModel"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"span",1),d(2,"\u6027\u80FD\u4F18\u5316\u914D\u7F6E"),s(),a(3,"button",2),p("click",function(){return n.save()}),x(4,"nz-icon",3),d(5," \u4FDD\u5B58 "),s()(),a(6,"div",4)(7,"div")(8,"div",5),d(9,"Gzip \u538B\u7F29"),s(),a(10,"div",6),d(11,"\u662F\u5426\u542F\u7528 gzip"),s()(),a(12,"div",7)(13,"nz-switch",8),p("ngModelChange",function(o){return n.setBoolean("gzipEnabled",o)}),s()()(),a(14,"div",4)(15,"div")(16,"div",5),d(17,"Keepalive \u8D85\u65F6"),s(),a(18,"div",6),d(19,"keepalive_timeout"),s()(),a(20,"div",7)(21,"input",9),N("ngModelChange",function(o){return M(n.config().keepaliveTimeout,o)||(n.config().keepaliveTimeout=o),o}),p("ngModelChange",function(){return n.markDirty()}),s()()(),a(22,"div",4)(23,"div")(24,"div",5),d(25,"Worker \u8FDB\u7A0B"),s(),a(26,"div",6),d(27,"worker_processes"),s()(),a(28,"div",7)(29,"input",10),N("ngModelChange",function(o){return M(n.config().workerProcesses,o)||(n.config().workerProcesses=o),o}),p("ngModelChange",function(){return n.markDirty()}),s()()(),a(30,"div",4)(31,"div")(32,"div",5),d(33,"sendfile"),s(),a(34,"div",6),d(35,"\u9759\u6001\u6587\u4EF6\u96F6\u62F7\u8D1D"),s()(),a(36,"div",7)(37,"nz-switch",11),p("ngModelChange",function(o){return n.setBoolean("sendfile",o)}),s()()(),a(38,"div",4)(39,"div")(40,"div",5),d(41,"tcp_nopush"),s(),a(42,"div",6),d(43,"\u4F18\u5316\u5927\u6587\u4EF6\u4F20\u8F93"),s()(),a(44,"div",7)(45,"nz-switch",12),p("ngModelChange",function(o){return n.setBoolean("tcpNopush",o)}),s()()(),a(46,"div",13)(47,"div",14)(48,"div",5),d(49,"Gzip Types"),s(),a(50,"div",6),d(51,"\u7A7A\u683C\u5206\u9694 MIME \u5217\u8868"),s(),a(52,"textarea",15),N("ngModelChange",function(o){return M(n.config().gzipTypes,o)||(n.config().gzipTypes=o),o}),p("ngModelChange",function(){return n.markDirty()}),s()()()),e&2&&(l(3),u("nzLoading",n.saving())("disabled",!n.dirty()),l(10),u("ngModel",n.config().gzipEnabled),l(8),z("ngModel",n.config().keepaliveTimeout),l(8),z("ngModel",n.config().workerProcesses),l(8),u("ngModel",n.config().sendfile),l(8),u("ngModel",n.config().tcpNopush),l(7),z("ngModel",n.config().gzipTypes))},dependencies:[E,H,Q,j,q,U,W,B,A,k,V,xe,Me],styles:['[_nghost-%COMP%]{display:block}.panel-header-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:12px}.panel-tip[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3)}.setting-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:10px 0;border-bottom:1px solid var(--border-light)}.setting-row.no-border[_ngcontent-%COMP%]{border-bottom:none}.setting-label[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);font-weight:600;color:var(--text-1)}.setting-desc[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3);margin-top:2px}.setting-ctrl[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.setting-input[_ngcontent-%COMP%]{width:110px;padding:5px 8px;border-radius:4px;border:1px solid var(--border);background:var(--bg-input);color:var(--text-2);font-size:var(--nginx-font-size-sm, 12px);text-align:center;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);outline:none}.setting-input[_ngcontent-%COMP%]:focus, .setting-textarea[_ngcontent-%COMP%]:focus{border-color:var(--blue);box-shadow:0 0 0 2px var(--blue-border)}.setting-textarea[_ngcontent-%COMP%]{width:100%;margin-top:8px;border:1px solid var(--border);border-radius:6px;background:var(--bg-input);color:var(--text-2);font-size:var(--nginx-font-size-sm, 12px);padding:8px 10px;resize:vertical;outline:none}.mono[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}']})};var Tt=class r{moduleStore=w(se);message=w($);instance=null;configFileCount=0;unbind=new me;backupRetention=g(5);configBackupRetention=g(20);settingsDirty=g(!1);saving=g(!1);async ngOnInit(){try{let t=await this.moduleStore.loadModuleSettings();t.settings&&this.patchSettingsFromResponse(t.settings)}catch{}}setBackupRetention(t){let e=Number(t),n=Number.isFinite(e)?Math.max(1,Math.trunc(e)):1;this.backupRetention.set(n),this.settingsDirty.set(!0)}setConfigBackupRetention(t){let e=Number(t),n=Number.isFinite(e)?Math.max(1,Math.trunc(e)):1;this.configBackupRetention.set(n),this.settingsDirty.set(!0)}async saveSettings(){this.saving.set(!0);try{let t=await this.moduleStore.saveModuleSettings({backupRetention:this.backupRetention(),configBackupRetention:this.configBackupRetention()});t.settings&&(this.patchSettingsFromResponse(t.settings),this.settingsDirty.set(!1),this.message.success("\u8BBE\u7F6E\u5DF2\u4FDD\u5B58"))}catch(t){this.message.error("\u4FDD\u5B58\u8BBE\u7F6E\u5931\u8D25: "+t.message)}finally{this.saving.set(!1)}}patchSettingsFromResponse(t){this.backupRetention.set(Math.max(1,Number(t.backupRetention??5))),this.configBackupRetention.set(Math.max(1,Number(t.configBackupRetention??20)))}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=T({type:r,selectors:[["app-nginx-secondary-settings-tab"]],inputs:{instance:"instance",configFileCount:"configFileCount"},outputs:{unbind:"unbind"},decls:58,vars:7,consts:[[1,"setting-row"],[1,"setting-label"],[1,"setting-desc"],[1,"setting-ctrl"],[1,"mono","strong"],["nz-input","","type","number","min","1",1,"retention-input","mono",3,"ngModelChange","ngModel"],["nz-button","","nzType","default",3,"click","disabled"],[1,"danger-box"],[1,"setting-label","danger"],[1,"setting-row","danger-row"],["nz-button","","nzDanger","","nzType","default",3,"click"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"div")(2,"div",1),d(3,"Nginx \u8DEF\u5F84"),s(),a(4,"div",2),d(5,"\u53EF\u6267\u884C\u6587\u4EF6\u4F4D\u7F6E"),s()(),a(6,"div",3)(7,"span",4),d(8),s()()(),a(9,"div",0)(10,"div")(11,"div",1),d(12,"\u914D\u7F6E\u6587\u4EF6"),s(),a(13,"div",2),d(14,"\u4E3B\u914D\u7F6E\u8DEF\u5F84"),s()(),a(15,"div",3)(16,"span",4),d(17),s()()(),a(18,"div",0)(19,"div")(20,"div",1),d(21,"\u914D\u7F6E\u6587\u4EF6\u6570"),s(),a(22,"div",2),d(23,"\u6839\u636E include \u6307\u4EE4\u89E3\u6790"),s()(),a(24,"div",3)(25,"span",4),d(26),s()()(),a(27,"div",0)(28,"div")(29,"div",1),d(30,"\u72B6\u6001\u5907\u4EFD\u4FDD\u7559\u6570"),s(),a(31,"div",2),d(32,".ngm-nginx-module.json.backup-* \u6700\u591A\u4FDD\u7559\u6570\u91CF"),s()(),a(33,"div",3)(34,"input",5),p("ngModelChange",function(o){return n.setBackupRetention(o)}),s(),a(35,"button",6),p("click",function(){return n.saveSettings()}),d(36," \u4FDD\u5B58 "),s()()(),a(37,"div",0)(38,"div")(39,"div",1),d(40,"\u914D\u7F6E\u5907\u4EFD\u4FDD\u7559\u6570"),s(),a(41,"div",2),d(42,"*.conf.backup-* \u6700\u591A\u4FDD\u7559\u6570\u91CF"),s()(),a(43,"div",3)(44,"input",5),p("ngModelChange",function(o){return n.setConfigBackupRetention(o)}),s(),a(45,"button",6),p("click",function(){return n.saveSettings()}),d(46," \u4FDD\u5B58 "),s()()(),a(47,"div",7)(48,"div",8),d(49,"\u5371\u9669\u64CD\u4F5C"),s(),a(50,"div",9)(51,"div")(52,"div",1),d(53,"\u89E3\u7ED1\u5B9E\u4F8B"),s(),a(54,"div",2),d(55,"\u4E0D\u5F71\u54CD Nginx \u670D\u52A1\u672C\u8EAB"),s()(),a(56,"button",10),p("click",function(){return n.unbind.emit()}),d(57," \u89E3\u7ED1 "),s()()()),e&2&&(l(8),y((n.instance==null?null:n.instance.path)||"-"),l(9),y((n.instance==null?null:n.instance.configPath)||"-"),l(9),y(n.configFileCount),l(8),u("ngModel",n.backupRetention()),l(),u("disabled",!n.settingsDirty()||n.saving()),l(9),u("ngModel",n.configBackupRetention()),l(),u("disabled",!n.settingsDirty()||n.saving()))},dependencies:[E,H,Q,Ct,j,vt,q,U,W,B,A,ae,re],styles:['.setting-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:10px 0;border-bottom:1px solid var(--border-light)}.setting-row[_ngcontent-%COMP%]:last-child{border-bottom:none}.setting-row.danger-row[_ngcontent-%COMP%]{padding:6px 0 0;border-bottom:none}.setting-label[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);font-weight:600;color:var(--text-1)}.setting-label.danger[_ngcontent-%COMP%]{color:var(--red);margin-bottom:4px}.setting-desc[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3);margin-top:2px}.setting-ctrl[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.retention-input[_ngcontent-%COMP%]{width:92px}.mono[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}.mono.strong[_ngcontent-%COMP%]{color:var(--text-1);font-weight:600}.danger-box[_ngcontent-%COMP%]{margin-top:8px;padding:10px 12px;border:1px solid rgba(245,63,63,.2);background:var(--red-bg);border-radius:6px}@media (max-width: 768px){.setting-row[_ngcontent-%COMP%]{flex-direction:column;align-items:flex-start}}']})};var _i=(r,t)=>t.id;function Ci(r,t){r&1&&(a(0,"div",9),d(1,"\u6682\u65E0 SSL \u8BC1\u4E66\u914D\u7F6E\uFF0C\u70B9\u51FB\u201C\u65B0\u589E\u8BC1\u4E66\u201D\u5F00\u59CB\u7EF4\u62A4"),s())}function vi(r,t){if(r&1){let e=D();a(0,"div",12)(1,"div",13)(2,"div",14),d(3),s(),a(4,"span",15),d(5),s()(),a(6,"div",16)(7,"div",17)(8,"span",18),d(9,"\u5230\u671F\u65F6\u95F4"),s(),a(10,"span",19),d(11),s()(),a(12,"div",17)(13,"span",18),d(14,"\u81EA\u52A8\u7EED\u671F"),s(),a(15,"span",20),d(16),s()(),a(17,"div",21)(18,"span",18),d(19,"\u8BC1\u4E66\u8DEF\u5F84"),s(),a(20,"span",19),d(21),s()(),a(22,"div",21)(23,"span",18),d(24,"\u79C1\u94A5\u8DEF\u5F84"),s(),a(25,"span",19),d(26),s()()(),a(27,"div",22)(28,"button",23),p("click",function(){let i=f(e).$implicit,o=c(2);return h(o.openEditDrawer(i))}),d(29,"\u7F16\u8F91"),s(),a(30,"button",24),p("click",function(){let i=f(e).$implicit,o=c(2);return h(o.removeRow(i.id))}),d(31,"\u5220\u9664"),s()()()}if(r&2){let e=t.$implicit,n=c(2);l(3),y(e.domain),l(),u("ngClass",e.status),l(),y(n.statusText(e.status)),l(6),y(e.expireAt||"-"),l(5),y(e.autoRenew?"\u5DF2\u542F\u7528":"\u672A\u542F\u7528"),l(5),y(e.certPath||"-"),l(5),y(e.keyPath||"-")}}function bi(r,t){if(r&1&&L(0,vi,32,7,"div",12,_i),r&2){let e=c();I(e.rows())}}function yi(r,t){if(r&1){let e=D();te(0),a(1,"div",25)(2,"form",26)(3,"nz-form-item")(4,"nz-form-label",27),d(5,"\u57DF\u540D"),s(),a(6,"nz-form-control")(7,"input",28),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.domain,i)||(o.drawerForm.domain=i),h(i)}),s()()(),a(8,"div",29)(9,"nz-form-item")(10,"nz-form-label"),d(11,"\u72B6\u6001"),s(),a(12,"nz-form-control")(13,"nz-select",30),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.status,i)||(o.drawerForm.status=i),h(i)}),x(14,"nz-option",31)(15,"nz-option",32)(16,"nz-option",33)(17,"nz-option",34),s()()(),a(18,"nz-form-item")(19,"nz-form-label"),d(20,"\u5230\u671F\u65F6\u95F4"),s(),a(21,"nz-form-control")(22,"input",35),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.expireAt,i)||(o.drawerForm.expireAt=i),h(i)}),s()()()(),a(23,"nz-form-item")(24,"nz-form-label"),d(25,"\u81EA\u52A8\u7EED\u671F"),s(),a(26,"nz-form-control")(27,"nz-switch",36),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.autoRenew,i)||(o.drawerForm.autoRenew=i),h(i)}),s()()(),a(28,"nz-form-item")(29,"nz-form-label",27),d(30,"\u8BC1\u4E66\u8DEF\u5F84"),s(),a(31,"nz-form-control")(32,"input",37),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.certPath,i)||(o.drawerForm.certPath=i),h(i)}),s()()(),a(33,"nz-form-item")(34,"nz-form-label",27),d(35,"\u79C1\u94A5\u8DEF\u5F84"),s(),a(36,"nz-form-control")(37,"input",38),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.keyPath,i)||(o.drawerForm.keyPath=i),h(i)}),s()()()()(),a(38,"div",39)(39,"button",3),p("click",function(){f(e);let i=c();return h(i.closeDrawer())}),d(40,"\u53D6\u6D88"),s(),a(41,"button",40),p("click",function(){f(e);let i=c();return h(i.submitDrawer())}),d(42,"\u786E\u5B9A"),s()(),ne()}if(r&2){let e=c();l(7),z("ngModel",e.drawerForm.domain),l(6),z("ngModel",e.drawerForm.status),l(9),z("ngModel",e.drawerForm.expireAt),l(5),z("ngModel",e.drawerForm.autoRenew),l(5),z("ngModel",e.drawerForm.certPath),l(5),z("ngModel",e.drawerForm.keyPath)}}var Pt=class r{moduleStore=w(se);message=w($);loading=g(!1);saving=g(!1);dirty=g(!1);rows=g([]);drawerVisible=g(!1);editingId=g(null);drawerForm=this.createEmptyForm();async ngOnInit(){await this.loadData()}async loadData(){this.loading.set(!0);try{(await this.moduleStore.loadSslCertificates()).certificates&&(this.rows.set(this.moduleStore.sslCertificates().map(e=>S({},e))),this.dirty.set(!1))}catch(t){this.message.error("\u52A0\u8F7D SSL \u914D\u7F6E\u5931\u8D25: "+t.message)}finally{this.loading.set(!1)}}openCreateDrawer(){this.editingId.set(null),this.drawerForm=this.createEmptyForm(),this.drawerVisible.set(!0)}openEditDrawer(t){this.editingId.set(t.id),this.drawerForm={domain:t.domain,certPath:t.certPath,keyPath:t.keyPath,expireAt:t.expireAt,status:t.status,autoRenew:t.autoRenew},this.drawerVisible.set(!0)}closeDrawer(){this.drawerVisible.set(!1)}submitDrawer(){let t=this.drawerForm.domain.trim();if(!t){this.message.warning("\u8BC1\u4E66\u57DF\u540D\u4E0D\u80FD\u4E3A\u7A7A");return}if(!this.drawerForm.certPath.trim()){this.message.warning("\u8BC1\u4E66\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A");return}if(!this.drawerForm.keyPath.trim()){this.message.warning("\u79C1\u94A5\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A");return}if(this.drawerForm.expireAt.trim()&&!this.isValidDateString(this.drawerForm.expireAt.trim())){this.message.warning("\u5230\u671F\u65F6\u95F4\u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u4F7F\u7528 YYYY-MM-DD");return}let e={id:this.editingId()||this.makeId(),domain:t,certPath:this.drawerForm.certPath.trim(),keyPath:this.drawerForm.keyPath.trim(),expireAt:this.drawerForm.expireAt.trim(),status:this.normalizeStatus(this.drawerForm.status),autoRenew:this.drawerForm.autoRenew};if(this.rows().find(i=>this.editingId()&&i.id===this.editingId()?!1:this.buildSslUniqueKey(i)===this.buildSslUniqueKey(e))){this.message.warning("\u8BC1\u4E66\u57DF\u540D + \u8BC1\u4E66\u8DEF\u5F84 + \u79C1\u94A5\u8DEF\u5F84\u91CD\u590D");return}this.editingId()?this.rows.update(i=>i.map(o=>o.id===e.id?e:o)):this.rows.update(i=>[...i,e]),this.markDirty(),this.closeDrawer()}removeRow(t){this.rows.update(e=>e.filter(n=>n.id!==t)),this.markDirty()}markDirty(){this.dirty.set(!0)}statusText(t){switch(t){case"valid":return"\u6709\u6548";case"expiring":return"\u5373\u5C06\u8FC7\u671F";case"expired":return"\u5DF2\u8FC7\u671F";default:return"\u5F85\u63A5\u5165"}}async saveAll(){let t=[],e=new Set;for(let n of this.rows()){let i=n.domain.trim();if(!i){this.message.warning("\u8BC1\u4E66\u57DF\u540D\u4E0D\u80FD\u4E3A\u7A7A");return}let o=n.certPath.trim(),m=n.keyPath.trim();if(!o){this.message.warning(`\u57DF\u540D "${i}" \u7684\u8BC1\u4E66\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A`);return}if(!m){this.message.warning(`\u57DF\u540D "${i}" \u7684\u79C1\u94A5\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A`);return}let _=n.expireAt.trim();if(_&&!this.isValidDateString(_)){this.message.warning(`\u57DF\u540D "${i}" \u7684\u5230\u671F\u65F6\u95F4\u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u4F7F\u7528 YYYY-MM-DD`);return}let C=this.buildSslUniqueKey({domain:i,certPath:o,keyPath:m});if(e.has(C)){this.message.warning(`\u68C0\u6D4B\u5230\u91CD\u590D\u8BC1\u4E66\u8BB0\u5F55: ${i}`);return}e.add(C),t.push(P(S({},n),{id:n.id||this.makeId(),domain:i,certPath:o,keyPath:m,expireAt:_,status:this.normalizeStatus(n.status)}))}this.saving.set(!0);try{await this.moduleStore.saveSslCertificates(t),this.message.success("SSL \u914D\u7F6E\u5DF2\u4FDD\u5B58"),this.dirty.set(!1),await this.loadData()}catch(n){this.message.error("\u4FDD\u5B58 SSL \u914D\u7F6E\u5931\u8D25: "+n.message)}finally{this.saving.set(!1)}}normalizeStatus(t){return t==="valid"||t==="expiring"||t==="expired"||t==="pending"?t:"pending"}makeId(){return`ssl-${Date.now()}-${Math.random().toString(16).slice(2,8)}`}isValidDateString(t){if(!/^\d{4}-\d{2}-\d{2}$/.test(t))return!1;let[e,n,i]=t.split("-").map(m=>Number(m));if(!Number.isInteger(e)||!Number.isInteger(n)||!Number.isInteger(i))return!1;let o=new Date(Date.UTC(e,n-1,i));return o.getUTCFullYear()===e&&o.getUTCMonth()===n-1&&o.getUTCDate()===i}buildSslUniqueKey(t){return`${t.domain.trim().toLowerCase()}|${t.certPath.trim().toLowerCase()}|${t.keyPath.trim().toLowerCase()}`}createEmptyForm(){return{domain:"",certPath:"",keyPath:"",expireAt:"",status:"pending",autoRenew:!1}}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=T({type:r,selectors:[["app-nginx-secondary-ssl-tab"]],decls:16,vars:8,consts:[[1,"panel-header-row"],[1,"panel-tip"],[1,"header-actions"],["nz-button","","nzType","default",3,"click"],["nzType","plus","nzTheme","outline"],["nz-button","","nzType","primary",3,"click","nzLoading","disabled"],["nzType","save","nzTheme","outline"],[3,"nzSpinning"],[1,"ssl-cards"],[1,"empty-row"],[3,"nzOnClose","nzVisible","nzTitle","nzWidth","nzPlacement"],[4,"nzDrawerContent"],[1,"ssl-card"],[1,"card-head"],[1,"card-domain","mono"],[1,"status-badge",3,"ngClass"],[1,"meta-list"],[1,"meta-item"],[1,"meta-label"],[1,"meta-value","mono"],[1,"meta-value"],[1,"meta-item","block"],[1,"card-actions"],["nz-button","","nzType","default","nzSize","small",3,"click"],["nz-button","","nzType","default","nzDanger","","nzSize","small",3,"click"],[1,"drawer-body"],["nz-form","","nzLayout","vertical"],["nzRequired",""],["nz-input","","name","sslDomain","placeholder","example.com",1,"mono",3,"ngModelChange","ngModel"],[1,"form-grid"],["name","sslStatus",3,"ngModelChange","ngModel"],["nzValue","valid","nzLabel","\u6709\u6548"],["nzValue","expiring","nzLabel","\u5373\u5C06\u8FC7\u671F"],["nzValue","expired","nzLabel","\u5DF2\u8FC7\u671F"],["nzValue","pending","nzLabel","\u5F85\u63A5\u5165"],["nz-input","","name","sslExpireAt","placeholder","YYYY-MM-DD",1,"mono",3,"ngModelChange","ngModel"],["name","sslAutoRenew",3,"ngModelChange","ngModel"],["nz-input","","name","sslCertPath","placeholder","/etc/nginx/ssl/fullchain.pem",1,"mono",3,"ngModelChange","ngModel"],["nz-input","","name","sslKeyPath","placeholder","/etc/nginx/ssl/privkey.pem",1,"mono",3,"ngModelChange","ngModel"],[1,"drawer-footer"],["nz-button","","nzType","primary",3,"click"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"span",1),d(2,"\u7BA1\u7406 SSL \u8BC1\u4E66\u4E0E\u5230\u671F\u72B6\u6001"),s(),a(3,"div",2)(4,"button",3),p("click",function(){return n.openCreateDrawer()}),x(5,"nz-icon",4),d(6," \u65B0\u589E\u8BC1\u4E66 "),s(),a(7,"button",5),p("click",function(){return n.saveAll()}),x(8,"nz-icon",6),d(9," \u4FDD\u5B58 "),s()()(),a(10,"nz-spin",7)(11,"div",8),v(12,Ci,2,0,"div",9)(13,bi,2,0),s()(),a(14,"nz-drawer",10),p("nzOnClose",function(){return n.closeDrawer()}),O(15,yi,43,6,"ng-container",11),s()),e&2&&(l(7),u("nzLoading",n.saving())("disabled",!n.dirty()),l(3),u("nzSpinning",n.loading()),l(2),b(n.rows().length?13:12),l(2),u("nzVisible",n.drawerVisible())("nzTitle",n.editingId()?"\u7F16\u8F91\u8BC1\u4E66":"\u65B0\u589E\u8BC1\u4E66")("nzWidth",500)("nzPlacement","right"))},dependencies:[E,gt,H,Qe,Q,j,He,q,Ke,U,W,B,A,$e,Ue,We,tt,qe,je,Xe,Ze,et,Je,k,V,ae,re,he,ge,fe,ze,Ge,xe,Me],styles:['[_nghost-%COMP%]{display:block}.panel-header-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:12px}.panel-tip[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3)}.header-actions[_ngcontent-%COMP%]{display:flex;gap:8px}.ssl-cards[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:10px}.ssl-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:10px;border:1px solid var(--border-light);border-radius:6px;padding:10px;background:#fff}.card-head[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:10px;border-bottom:1px solid var(--border-light);padding-bottom:8px}.card-domain[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-base, 14px);color:var(--text-1);font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-badge[_ngcontent-%COMP%]{display:inline-flex;align-items:center;height:24px;border-radius:12px;padding:0 10px;font-size:var(--nginx-font-size-sm, 12px);line-height:24px;border:1px solid transparent;white-space:nowrap}.status-badge.valid[_ngcontent-%COMP%]{color:var(--green);border-color:#00b42a33;background:var(--green-bg)}.status-badge.expiring[_ngcontent-%COMP%]{color:var(--orange);border-color:#ff7d0033;background:var(--orange-bg)}.status-badge.expired[_ngcontent-%COMP%]{color:var(--red);border-color:#f53f3f33;background:var(--red-bg)}.status-badge.pending[_ngcontent-%COMP%]{color:var(--text-2);border-color:var(--border);background:var(--bg-input)}.meta-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;flex:1}.meta-item[_ngcontent-%COMP%]{display:grid;grid-template-columns:80px 1fr;gap:8px;min-width:0}.meta-item.block[_ngcontent-%COMP%]{grid-template-columns:1fr}.meta-label[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3);font-weight:600}.meta-value[_ngcontent-%COMP%]{color:var(--text-1);font-size:var(--nginx-font-size-sm, 12px);min-width:0;word-break:break-all}.mono[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}.card-actions[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;gap:8px}.drawer-body[_ngcontent-%COMP%]{padding:0 24px 16px}.form-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:12px}.drawer-footer[_ngcontent-%COMP%]{position:absolute;bottom:0;left:0;right:0;padding:12px 24px;border-top:1px solid rgba(0,0,0,.06);display:flex;justify-content:flex-end;gap:8px;background:#fff}.empty-row[_ngcontent-%COMP%]{grid-column:1 / -1;border:1px dashed var(--border);border-radius:6px;color:var(--text-3);font-size:var(--nginx-font-size-sm, 12px);text-align:center;padding:20px 12px;background:#fff}@media (max-width: 992px){.panel-header-row[_ngcontent-%COMP%]{flex-direction:column;align-items:flex-start}.header-actions[_ngcontent-%COMP%]{width:100%}.form-grid[_ngcontent-%COMP%]{grid-template-columns:1fr}}']})};var Et=class r{loading=!1;logs=[];runTest=new me;static \u0275fac=function(e){return new(e||r)};static \u0275cmp=T({type:r,selectors:[["app-nginx-secondary-test-tab"]],inputs:{loading:"loading",logs:"logs"},outputs:{runTest:"runTest"},decls:7,vars:5,consts:[[1,"panel-header-row"],[1,"panel-tip"],["nz-button","","nzType","default","nzSize","small",1,"run-test-btn",3,"click","nzLoading"],["nzType","check-circle","nzTheme","outline"],["statusTone","ok",3,"title","status","logs","maxHeight"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"span",1),d(2,"\u9A8C\u8BC1 Nginx \u914D\u7F6E\u6587\u4EF6\u8BED\u6CD5\u6B63\u786E\u6027"),s(),a(3,"button",2),p("click",function(){return n.runTest.emit()}),x(4,"nz-icon",3),d(5," \u6267\u884C\u68C0\u6D4B "),s()(),x(6,"app-nginx-log-viewer",4)),e&2&&(l(3),u("nzLoading",n.loading),l(3),u("title","\u7ED3\u679C")("status","\u2713 syntax is ok")("logs",n.logs)("maxHeight",180))},dependencies:[E,U,W,B,A,k,V,Ee],styles:["[_nghost-%COMP%]{display:block}.panel-header-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:12px}.panel-tip[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-base, 14px);color:var(--text-2)}.run-test-btn[_ngcontent-%COMP%]{background:var(--green);color:#fff;border-color:var(--green);font-weight:600;min-height:28px;padding-inline:10px}.run-test-btn[_ngcontent-%COMP%]:hover, .run-test-btn[_ngcontent-%COMP%]:focus{background:#00a122;border-color:#00a122;color:#fff}@media (max-width: 992px){.panel-header-row[_ngcontent-%COMP%]{flex-direction:column;align-items:flex-start}}"]})};var Ft=class r{moduleStore=w(se);message=w($);saving=g(!1);dirty=g(!1);config=g({rateLimitEnabled:!1,rateLimit:"",connLimitEnabled:!1,connLimit:0,blacklistIps:[]});blacklistText=g("");async ngOnInit(){await this.load()}async load(){try{if((await this.moduleStore.loadTrafficConfig()).traffic){let e=this.moduleStore.trafficConfig();this.config.set(P(S({},e),{connLimit:Math.max(0,Number(e.connLimit??0))})),this.blacklistText.set((e.blacklistIps||[]).join(`
|
|
2
2
|
`)),this.dirty.set(!1)}}catch(t){this.message.error("\u52A0\u8F7D\u6D41\u91CF\u914D\u7F6E\u5931\u8D25: "+t.message)}}setRateLimitEnabled(t){this.config.update(e=>P(S({},e),{rateLimitEnabled:t})),this.markDirty()}setConnLimitEnabled(t){this.config.update(e=>P(S({},e),{connLimitEnabled:t})),this.markDirty()}setBlacklistText(t){this.blacklistText.set(t||""),this.markDirty()}markDirty(){this.dirty.set(!0)}async save(){let t=P(S({},this.config()),{rateLimit:this.config().rateLimit.trim(),connLimit:this.config().connLimitEnabled?Math.max(1,Number(this.config().connLimit||1)):Math.max(0,Number(this.config().connLimit||0)),blacklistIps:this.blacklistText().split(/[\n,]/).map(e=>e.trim()).filter(Boolean)});this.saving.set(!0);try{await this.moduleStore.saveTrafficConfig(t),this.message.success("\u6D41\u91CF\u63A7\u5236\u914D\u7F6E\u5DF2\u4FDD\u5B58"),this.dirty.set(!1),await this.load()}catch(e){this.message.error("\u4FDD\u5B58\u6D41\u91CF\u63A7\u5236\u914D\u7F6E\u5931\u8D25: "+e.message)}finally{this.saving.set(!1)}}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=T({type:r,selectors:[["app-nginx-secondary-traffic-tab"]],decls:31,vars:7,consts:[[1,"panel-header-row"],[1,"panel-tip"],["nz-button","","nzType","primary",3,"click","nzLoading","disabled"],["nzType","save","nzTheme","outline"],[1,"setting-row"],[1,"setting-label"],[1,"setting-desc"],[1,"setting-ctrl"],["placeholder","20r/s",1,"setting-input",3,"ngModelChange","ngModel"],["name","rateLimitEnabled","nzSize","small",3,"ngModelChange","ngModel"],["type","number","min","1",1,"setting-input",3,"ngModelChange","ngModel"],["name","connLimitEnabled","nzSize","small",3,"ngModelChange","ngModel"],[1,"setting-row","no-border"],[1,"full-width"],["rows","4","placeholder",`192.168.1.10
|
|
3
3
|
10.10.10.5`,1,"setting-textarea","mono",3,"ngModelChange","ngModel"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"span",1),d(2,"\u6D41\u91CF\u63A7\u5236\u7B56\u7565"),s(),a(3,"button",2),p("click",function(){return n.save()}),x(4,"nz-icon",3),d(5," \u4FDD\u5B58 "),s()(),a(6,"div",4)(7,"div")(8,"div",5),d(9,"\u8BF7\u6C42\u9650\u6D41"),s(),a(10,"div",6),d(11,"\u6BCF\u4E2A IP \u6BCF\u79D2\u6700\u5927\u8BF7\u6C42\u6570"),s()(),a(12,"div",7)(13,"input",8),N("ngModelChange",function(o){return M(n.config().rateLimit,o)||(n.config().rateLimit=o),o}),p("ngModelChange",function(){return n.markDirty()}),s(),a(14,"nz-switch",9),p("ngModelChange",function(o){return n.setRateLimitEnabled(o)}),s()()(),a(15,"div",4)(16,"div")(17,"div",5),d(18,"\u8FDE\u63A5\u9650\u5236"),s(),a(19,"div",6),d(20,"\u5355 IP \u6700\u5927\u5E76\u53D1\u8FDE\u63A5\u6570"),s()(),a(21,"div",7)(22,"input",10),N("ngModelChange",function(o){return M(n.config().connLimit,o)||(n.config().connLimit=o),o}),p("ngModelChange",function(){return n.markDirty()}),s(),a(23,"nz-switch",11),p("ngModelChange",function(o){return n.setConnLimitEnabled(o)}),s()()(),a(24,"div",12)(25,"div",13)(26,"div",5),d(27,"\u9ED1\u540D\u5355 IP"),s(),a(28,"div",6),d(29,"\u9017\u53F7\u6216\u6362\u884C\u5206\u9694"),s(),a(30,"textarea",14),p("ngModelChange",function(o){return n.setBlacklistText(o)}),s()()()),e&2&&(l(3),u("nzLoading",n.saving())("disabled",!n.dirty()),l(10),z("ngModel",n.config().rateLimit),l(),u("ngModel",n.config().rateLimitEnabled),l(8),z("ngModel",n.config().connLimit),l(),u("ngModel",n.config().connLimitEnabled),l(7),u("ngModel",n.blacklistText()))},dependencies:[E,H,Q,Ct,j,vt,q,U,W,B,A,k,V,xe,Me],styles:['[_nghost-%COMP%]{display:block}.panel-header-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:12px}.panel-tip[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3)}.setting-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:10px 0;border-bottom:1px solid var(--border-light)}.setting-row.no-border[_ngcontent-%COMP%]{border-bottom:none}.setting-label[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);font-weight:600;color:var(--text-1)}.setting-desc[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3);margin-top:2px}.setting-ctrl[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.setting-input[_ngcontent-%COMP%]{width:110px;padding:5px 8px;border-radius:4px;border:1px solid var(--border);background:var(--bg-input);color:var(--text-2);font-size:var(--nginx-font-size-sm, 12px);text-align:center;font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace);outline:none}.setting-input[_ngcontent-%COMP%]:focus, .setting-textarea[_ngcontent-%COMP%]:focus{border-color:var(--blue);box-shadow:0 0 0 2px var(--blue-border)}.setting-textarea[_ngcontent-%COMP%]{width:100%;margin-top:8px;border:1px solid var(--border);border-radius:6px;background:var(--bg-input);color:var(--text-2);font-size:var(--nginx-font-size-sm, 12px);padding:8px 10px;resize:vertical;outline:none}.mono[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}']})};var Si=(r,t)=>t.id,wi=(r,t)=>t+"-"+r;function zi(r,t){r&1&&(a(0,"div",17),x(1,"nz-icon",20),a(2,"p"),d(3,"\u6682\u65E0 Upstream \u914D\u7F6E"),s()())}function Mi(r,t){if(r&1&&(a(0,"span",27),d(1),s()),r&2){let e=t.$implicit;l(),y(e)}}function Ni(r,t){if(r&1){let e=D();a(0,"div",22)(1,"div",9)(2,"span",23),d(3),s()(),a(4,"div",10)(5,"span",24),d(6),s()(),a(7,"div",11)(8,"span",25),d(9),s()(),a(10,"div",12)(11,"div",26),L(12,Mi,2,1,"span",27,wi),s()(),a(14,"div",13)(15,"span",28),d(16),s()(),a(17,"div",14)(18,"div",29)(19,"button",30),p("click",function(){let i=f(e).$implicit,o=c(2);return h(o.openEditDrawer(i))}),x(20,"nz-icon",31),s(),a(21,"button",32),p("click",function(){let i=f(e).$implicit,o=c(2);return h(o.removeRow(i.id))}),x(22,"nz-icon",33),s()()()()}if(r&2){let e=t.$implicit,n=c(2);F("readonly-row",e.readonly),l(3),y(e.name),l(2),F("managed",e.managed),u("title",n.sourceHint(e)),l(),J(" ",n.sourceLabel(e)," "),l(3),y(e.strategy),l(3),I(e.nodes),l(4),y(e.nodes.length),l(3),u("disabled",e.readonly),l(2),u("disabled",e.readonly)}}function Di(r,t){if(r&1&&L(0,Ni,23,11,"div",21,Si),r&2){let e=c();I(e.rows())}}function Ti(r,t){if(r&1){let e=D();te(0),a(1,"div",34)(2,"form",35)(3,"nz-form-item")(4,"nz-form-label",36),d(5,"\u540D\u79F0"),s(),a(6,"nz-form-control")(7,"input",37),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.name,i)||(o.drawerForm.name=i),h(i)}),s()()(),a(8,"nz-form-item")(9,"nz-form-label",36),d(10,"\u7B56\u7565"),s(),a(11,"nz-form-control")(12,"nz-select",38),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.strategy,i)||(o.drawerForm.strategy=i),h(i)}),x(13,"nz-option",39)(14,"nz-option",40)(15,"nz-option",41)(16,"nz-option",42),s()()(),a(17,"nz-form-item")(18,"nz-form-label",36),d(19,"\u8282\u70B9\uFF08\u9017\u53F7\u6216\u6362\u884C\u5206\u9694\uFF09"),s(),a(20,"nz-form-control")(21,"textarea",43),N("ngModelChange",function(i){f(e);let o=c();return M(o.drawerForm.nodesText,i)||(o.drawerForm.nodesText=i),h(i)}),s()()()()(),a(22,"div",44)(23,"button",3),p("click",function(){f(e);let i=c();return h(i.closeDrawer())}),d(24,"\u53D6\u6D88"),s(),a(25,"button",45),p("click",function(){f(e);let i=c();return h(i.submitDrawer())}),d(26,"\u786E\u5B9A"),s()(),ne()}if(r&2){let e=c();l(7),z("ngModel",e.drawerForm.name),l(5),z("ngModel",e.drawerForm.strategy),l(9),z("ngModel",e.drawerForm.nodesText)}}var kt=class r{moduleStore=w(se);message=w($);loading=g(!1);saving=g(!1);dirty=g(!1);rows=g([]);drawerVisible=g(!1);editingId=g(null);drawerForm=this.createEmptyForm();async ngOnInit(){await this.loadData()}async loadData(){this.loading.set(!0);try{(await this.moduleStore.loadUpstreams()).upstreams&&(this.rows.set(this.moduleStore.upstreams().map(e=>({id:e.id,name:e.name,strategy:e.strategy,nodes:(e.nodes||[]).map(n=>n.trim()).filter(Boolean),sourceFile:e.sourceFile||"",managed:e.managed!==!1,readonly:e.readonly===!0||e.managed===!1}))),this.dirty.set(!1))}catch(t){this.message.error("\u52A0\u8F7D Upstream \u5931\u8D25: "+t.message)}finally{this.loading.set(!1)}}openCreateDrawer(){this.editingId.set(null),this.drawerForm=this.createEmptyForm(),this.drawerVisible.set(!0)}openEditDrawer(t){if(t.readonly){this.message.info("\u8BE5 Upstream \u6765\u81EA\u5916\u90E8\u914D\u7F6E\u6587\u4EF6\uFF0C\u5F53\u524D\u4E3A\u53EA\u8BFB\u5C55\u793A");return}this.editingId.set(t.id),this.drawerForm={name:t.name,strategy:t.strategy,nodesText:t.nodes.join(", ")},this.drawerVisible.set(!0)}closeDrawer(){this.drawerVisible.set(!1)}submitDrawer(){let t=this.drawerForm.name.trim();if(!t){this.message.warning("Upstream \u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");return}let e=this.parseNodes(this.drawerForm.nodesText);if(!e.length){this.message.warning(`Upstream "${t}" \u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u8282\u70B9`);return}let n={id:this.editingId()||this.makeId(),name:t,strategy:this.drawerForm.strategy,nodes:e,sourceFile:"",managed:!0,readonly:!1};this.editingId()?this.rows.update(i=>i.map(o=>o.id===n.id?P(S({},n),{sourceFile:o.sourceFile,managed:o.managed,readonly:o.readonly}):o)):this.rows.update(i=>[...i,n]),this.markDirty(),this.closeDrawer()}removeRow(t){if(this.rows().find(n=>n.id===t)?.readonly){this.message.info("\u8BE5 Upstream \u6765\u81EA\u5916\u90E8\u914D\u7F6E\u6587\u4EF6\uFF0C\u5F53\u524D\u4E0D\u53EF\u5220\u9664");return}this.rows.update(n=>n.filter(i=>i.id!==t)),this.markDirty()}markDirty(){this.dirty.set(!0)}async saveAll(){let t=[];for(let e of this.rows()){if(e.readonly)continue;let n=e.name.trim();if(!n){this.message.warning("Upstream \u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");return}if(!/^[a-zA-Z0-9._-]+$/.test(n)){this.message.warning(`Upstream \u540D\u79F0\u4E0D\u5408\u6CD5: ${n}`);return}let i=(e.nodes||[]).map(o=>o.trim()).filter(Boolean);if(!i.length){this.message.warning(`Upstream "${n}" \u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u8282\u70B9`);return}t.push({id:e.id,name:n,strategy:e.strategy,nodes:i,sourceFile:e.sourceFile,managed:!0,readonly:!1})}this.saving.set(!0);try{await this.moduleStore.saveUpstreams(t),this.message.success("Upstream \u914D\u7F6E\u5DF2\u4FDD\u5B58"),this.dirty.set(!1),await this.loadData()}catch(e){this.message.error("\u4FDD\u5B58 Upstream \u5931\u8D25: "+e.message)}finally{this.saving.set(!1)}}makeId(){return`upstream-${Date.now()}-${Math.random().toString(16).slice(2,8)}`}parseNodes(t){return t.split(/[,;\n]/).map(e=>e.trim()).filter(Boolean)}createEmptyForm(){return{name:"",strategy:"round-robin",nodesText:""}}sourceLabel(t){let n=(t.sourceFile||"").replace(/\\/g,"/");return n.split("/").pop()||n||(t.managed?"\u6258\u7BA1\u6587\u4EF6":"\u5916\u90E8\u6587\u4EF6")}sourceHint(t){return t.sourceFile?`${t.managed?"\u6258\u7BA1":"\u5916\u90E8"}: ${t.sourceFile}`:t.managed?"\u6258\u7BA1 upstream\uFF08\u6765\u6E90\u672A\u89E3\u6790\uFF09":"\u5916\u90E8 upstream\uFF08\u6765\u6E90\u672A\u89E3\u6790\uFF09"}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=T({type:r,selectors:[["app-nginx-secondary-upstream-tab"]],decls:30,vars:8,consts:[[1,"list-header"],[1,"panel-tip"],[1,"header-actions"],["nz-button","","nzType","default",3,"click"],["nzType","plus","nzTheme","outline"],["nz-button","","nzType","primary",3,"click","nzLoading","disabled"],["nzType","save","nzTheme","outline"],[1,"upstream-grid-shell"],[1,"upstream-grid-head"],[1,"cell","name-col"],[1,"cell","source-col"],[1,"cell","strategy-col"],[1,"cell","nodes-col"],[1,"cell","count-col"],[1,"cell","action-col"],[3,"nzSpinning"],[1,"upstream-grid-body"],[1,"empty-state"],[3,"nzOnClose","nzVisible","nzTitle","nzWidth","nzPlacement"],[4,"nzDrawerContent"],["nzType","cluster","nzTheme","outline",1,"empty-icon"],[1,"upstream-grid-row",3,"readonly-row"],[1,"upstream-grid-row"],[1,"upstream-name","mono"],[1,"source-badge",3,"title"],[1,"strategy-pill","mono"],[1,"nodes-wrap"],[1,"node-chip","mono"],[1,"node-count"],[1,"row-actions"],["nz-button","","nzSize","small","nzType","link",3,"click","disabled"],["nzType","edit","nzTheme","outline"],["nz-button","","nzSize","small","nzType","link","nzDanger","",3,"click","disabled"],["nzType","delete","nzTheme","outline"],[1,"drawer-body"],["nz-form","","nzLayout","vertical"],["nzRequired",""],["nz-input","","name","upstreamName","placeholder","\u4F8B\u5982 backend_cluster",1,"mono",3,"ngModelChange","ngModel"],["name","upstreamStrategy",3,"ngModelChange","ngModel"],["nzValue","round-robin","nzLabel","round-robin"],["nzValue","least_conn","nzLabel","least_conn"],["nzValue","ip_hash","nzLabel","ip_hash"],["nzValue","hash","nzLabel","hash"],["nz-input","","rows","5","name","upstreamNodes","placeholder","127.0.0.1:3001, 127.0.0.1:3002",1,"mono",3,"ngModelChange","ngModel"],[1,"drawer-footer"],["nz-button","","nzType","primary",3,"click"]],template:function(e,n){e&1&&(a(0,"div",0)(1,"span",1),d(2,"\u7BA1\u7406\u540E\u7AEF\u670D\u52A1\u96C6\u7FA4\u7684\u8D1F\u8F7D\u5747\u8861\u914D\u7F6E"),s(),a(3,"div",2)(4,"button",3),p("click",function(){return n.openCreateDrawer()}),x(5,"nz-icon",4),d(6," \u65B0\u589E Upstream "),s(),a(7,"button",5),p("click",function(){return n.saveAll()}),x(8,"nz-icon",6),d(9," \u4FDD\u5B58 "),s()()(),a(10,"div",7)(11,"div",8)(12,"div",9),d(13,"UPSTREAM \u540D\u79F0"),s(),a(14,"div",10),d(15,"\u6765\u6E90"),s(),a(16,"div",11),d(17,"\u7B56\u7565"),s(),a(18,"div",12),d(19,"\u8282\u70B9"),s(),a(20,"div",13),d(21,"\u8282\u70B9\u6570"),s(),a(22,"div",14),d(23,"\u64CD\u4F5C"),s()(),a(24,"nz-spin",15)(25,"div",16),v(26,zi,4,0,"div",17)(27,Di,2,0),s()()(),a(28,"nz-drawer",18),p("nzOnClose",function(){return n.closeDrawer()}),O(29,Ti,27,3,"ng-container",19),s()),e&2&&(l(7),u("nzLoading",n.saving())("disabled",!n.dirty()),l(17),u("nzSpinning",n.loading()),l(2),b(!n.loading()&&!n.rows().length?26:27),l(2),u("nzVisible",n.drawerVisible())("nzTitle",n.editingId()?"\u7F16\u8F91 Upstream":"\u65B0\u589E Upstream")("nzWidth",460)("nzPlacement","right"))},dependencies:[E,H,Qe,Q,j,He,q,Ke,U,W,B,A,$e,Ue,We,tt,qe,je,Xe,Ze,et,Je,k,V,ae,re,he,ge,fe,ze,Ge],styles:['[_nghost-%COMP%]{display:block}.list-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:12px}.panel-tip[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3)}.header-actions[_ngcontent-%COMP%]{display:flex;gap:8px;flex-shrink:0}.upstream-grid-shell[_ngcontent-%COMP%]{border:none;border-radius:0;overflow:hidden}.upstream-grid-head[_ngcontent-%COMP%], .upstream-grid-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(180px,1fr) minmax(150px,.9fr) minmax(130px,.7fr) minmax(220px,1.6fr) 88px 116px;align-items:center;column-gap:8px;padding:0 12px}.upstream-grid-head[_ngcontent-%COMP%]{min-height:42px;background:#fafafa;border-bottom:1px solid rgba(0,0,0,.06)}.upstream-grid-head[_ngcontent-%COMP%] .cell[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:#00000073;text-transform:uppercase;letter-spacing:.4px;font-weight:700}.upstream-grid-body[_ngcontent-%COMP%]{background:#fff}.upstream-grid-row[_ngcontent-%COMP%]{min-height:58px;border-bottom:1px solid rgba(0,0,0,.05);transition:background .12s ease}.upstream-grid-row[_ngcontent-%COMP%]:last-child{border-bottom:none}.upstream-grid-row[_ngcontent-%COMP%]:hover{background:#00000005}.readonly-row[_ngcontent-%COMP%]{background:#00000004}.cell[_ngcontent-%COMP%]{min-width:0}.row-actions[_ngcontent-%COMP%]{display:flex;gap:4px;justify-content:flex-end}.upstream-name[_ngcontent-%COMP%]{display:inline-block;font-size:var(--nginx-font-size-base, 14px);font-weight:600;color:var(--text-1);word-break:break-all}.strategy-pill[_ngcontent-%COMP%]{display:inline-flex;align-items:center;height:22px;border-radius:11px;padding:0 10px;font-size:var(--nginx-font-size-sm, 12px);line-height:22px;color:var(--text-2);background:var(--bg-input);border:1px solid var(--border-light)}.source-badge[_ngcontent-%COMP%]{display:inline-flex;align-items:center;max-width:100%;height:22px;padding:0 8px;border-radius:4px;background:#0000000a;color:var(--text-3);border:1px solid rgba(0,0,0,.08);font-size:var(--nginx-font-size-sm, 12px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.source-badge.managed[_ngcontent-%COMP%]{background:#165dff14;color:#165dff;border-color:#165dff33}.nodes-wrap[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:6px;padding:8px 0}.node-chip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;height:22px;padding:0 8px;border-radius:4px;border:1px solid rgba(22,93,255,.2);background:#165dff14;color:#165dff;font-size:var(--nginx-font-size-sm, 12px);max-width:100%;word-break:break-all}.node-count[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-base, 14px);color:var(--text-2);font-weight:600}.action-col[_ngcontent-%COMP%]{justify-self:end}.empty-state[_ngcontent-%COMP%]{text-align:center;padding:48px 0}.empty-state[_ngcontent-%COMP%] .empty-icon[_ngcontent-%COMP%]{font-size:48px;color:#0003;margin-bottom:16px}.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:#0006;margin:0}.mono[_ngcontent-%COMP%]{font-family:var(--nginx-font-family-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace)}.drawer-body[_ngcontent-%COMP%]{padding:0 24px 16px}.drawer-footer[_ngcontent-%COMP%]{position:absolute;bottom:0;left:0;right:0;padding:12px 24px;border-top:1px solid rgba(0,0,0,.06);display:flex;justify-content:flex-end;gap:8px;background:#fff}']})};var Pi=["*",[["","nginxCardActions",""]]],Ei=["*","[nginxCardActions]"];function Fi(r,t){if(r&1&&(Z(0,"span",5),d(1),X()),r&2){let e=c(2);l(),y(e.subtitle)}}function ki(r,t){if(r&1&&(Z(0,"div",1)(1,"div",3)(2,"span",4),d(3),X(),v(4,Fi,2,1,"span",5),X(),Z(5,"div",6),ue(6,1),X()()),r&2){let e=c();l(3),y(e.title),l(),b(e.subtitle?4:-1)}}var Ot=class r{accent="blue";showHeader=!1;title="";subtitle="";noBodyPadding=!1;static \u0275fac=function(e){return new(e||r)};static \u0275cmp=T({type:r,selectors:[["app-nginx-section-card"]],inputs:{accent:"accent",showHeader:"showHeader",title:"title",subtitle:"subtitle",noBodyPadding:"noBodyPadding"},ngContentSelectors:Ei,decls:4,vars:9,consts:[[1,"card"],[1,"card-header"],[1,"card-body"],[1,"card-header-left"],[1,"card-title"],[1,"card-subtitle"],[1,"card-actions"]],template:function(e,n){e&1&&(dt(Pi),Z(0,"section",0),v(1,ki,7,2,"div",1),Z(2,"div",2),ue(3),X()()),e&2&&(F("card-blue",n.accent==="blue")("card-green",n.accent==="green")("card-orange",n.accent==="orange"),l(),b(n.showHeader?1:-1),l(),F("no-padding",n.noBodyPadding))},styles:["[_nghost-%COMP%]{display:block}.card[_ngcontent-%COMP%]{background:var(--bg-white);border:1px solid var(--border);border-left-width:3px;border-radius:8px;box-shadow:var(--shadow-card);margin-bottom:14px;overflow:hidden;border-left-color:transparent}.card.card-blue[_ngcontent-%COMP%]{border-left-color:var(--blue)}.card.card-green[_ngcontent-%COMP%]{border-left-color:var(--green)}.card.card-orange[_ngcontent-%COMP%]{border-left-color:var(--orange)}.card-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:12px 16px 12px 20px;border-bottom:1px solid var(--border-light);gap:10px}.card-header-left[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;min-width:0}.card-title[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-base, 14px);font-weight:700;color:var(--text-1)}.card-subtitle[_ngcontent-%COMP%]{font-size:var(--nginx-font-size-sm, 12px);color:var(--text-3)}.card-actions[_ngcontent-%COMP%]{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end}.card-body[_ngcontent-%COMP%]{padding:14px 18px}.card-body.no-padding[_ngcontent-%COMP%]{padding:0}@media (max-width: 768px){.card-header[_ngcontent-%COMP%]{flex-direction:column;align-items:flex-start}.card-actions[_ngcontent-%COMP%]{width:100%}}"]})};var Oi=["input"],Li=["inputNumberHost"],Ii=[[["","nzInputAddonBefore",""]],[["","nzInputAddonAfter",""]],[["","nzInputPrefix",""]],[["","nzInputSuffix",""]],[["","nzInputNumberUpIcon",""]],[["","nzInputNumberDownIcon",""]]],Ri=["[nzInputAddonBefore]","[nzInputAddonAfter]","[nzInputPrefix]","[nzInputSuffix]","[nzInputNumberUpIcon]","[nzInputNumberDownIcon]"];function Vi(r,t){}function Bi(r,t){if(r&1&&O(0,Vi,0,0,"ng-template",8),r&2){c();let e=oe(4);u("ngTemplateOutlet",e)}}function Ai(r,t){}function Wi(r,t){if(r&1&&O(0,Ai,0,0,"ng-template",8),r&2){c();let e=oe(8);u("ngTemplateOutlet",e)}}function Ui(r,t){}function $i(r,t){if(r&1&&O(0,Ui,0,0,"ng-template",8),r&2){c();let e=oe(12);u("ngTemplateOutlet",e)}}function ji(r,t){if(r&1&&d(0),r&2){let e=c(3);y(e.nzAddonBefore())}}function qi(r,t){r&1&&(a(0,"div",10),ue(1,0,null,ji,1,1),s())}function Hi(r,t){}function Ki(r,t){if(r&1&&O(0,Hi,0,0,"ng-template",8),r&2){c(2);let e=oe(6);u("ngTemplateOutlet",e)}}function Qi(r,t){}function Yi(r,t){if(r&1&&O(0,Qi,0,0,"ng-template",8),r&2){c(2);let e=oe(10);u("ngTemplateOutlet",e)}}function Gi(r,t){if(r&1&&d(0),r&2){let e=c(3);y(e.nzAddonAfter())}}function Zi(r,t){r&1&&(a(0,"div",10),ue(1,1,null,Gi,1,1),s())}function Xi(r,t){if(r&1&&(a(0,"div",9),v(1,qi,3,0,"div",10),v(2,Ki,1,1,null,8)(3,Yi,1,1,null,8),v(4,Zi,3,0,"div",10),s()),r&2){let e=c();l(),b(e.hasAddonBefore()?1:-1),l(),b(e.hasAffix()?2:3),l(2),b(e.hasAddonAfter()?4:-1)}}function Ji(r,t){}function eo(r,t){if(r&1&&(a(0,"div"),O(1,Ji,0,0,"ng-template",8),s()),r&2){let e=c(),n=oe(8);Ie(e.affixWrapperClass()),l(),u("ngTemplateOutlet",n)}}function to(r,t){if(r&1&&d(0),r&2){let e=c(3);y(e.nzPrefix())}}function no(r,t){r&1&&(a(0,"span",11),ue(1,2,null,to,1,1),s())}function io(r,t){}function oo(r,t){if(r&1&&d(0),r&2){let e=c(3);y(e.nzSuffix())}}function ro(r,t){if(r&1&&x(0,"nz-form-item-feedback-icon",13),r&2){let e=c(3);u("status",e.finalStatus())}}function ao(r,t){if(r&1&&(a(0,"span",12),ue(1,3,null,oo,1,1),v(3,ro,1,1,"nz-form-item-feedback-icon",13),s()),r&2){let e=c(2);l(3),b(e.hasFeedback()&&e.finalStatus()?3:-1)}}function so(r,t){if(r&1&&(v(0,no,3,0,"span",11),O(1,io,0,0,"ng-template",8),v(2,ao,4,1,"span",12)),r&2){let e=c(),n=oe(10);b(e.hasPrefix()?0:-1),l(),u("ngTemplateOutlet",n),l(),b(e.hasSuffix()?2:-1)}}function lo(r,t){}function co(r,t){if(r&1&&(a(0,"div",null,5),O(2,lo,0,0,"ng-template",8),s()),r&2){let e=c(),n=oe(12);Ie(e.inputNumberClass()),l(2),u("ngTemplateOutlet",n)}}function mo(r,t){r&1&&x(0,"nz-icon",20)}function po(r,t){r&1&&x(0,"nz-icon",21)}function uo(r,t){if(r&1){let e=D();a(0,"div",17,7),p("mouseup",function(){f(e);let i=c(2);return h(i.stopAutoStep())})("mouseleave",function(){f(e);let i=c(2);return h(i.stopAutoStep())}),a(2,"span",18),p("mousedown",function(i){f(e);let o=c(2);return h(o.onStepMouseDown(i,!0))}),ue(3,4,null,mo,1,0),s(),a(5,"span",19),p("mousedown",function(i){f(e);let o=c(2);return h(o.onStepMouseDown(i,!1))}),ue(6,5,null,po,1,0),s()()}if(r&2){let e=c(2);l(2),F("ant-input-number-handler-up-disabled",e.upDisabled()),ye("aria-disabled",e.upDisabled()),l(3),F("ant-input-number-handler-down-disabled",e.downDisabled()),ye("aria-disabled",e.downDisabled())}}function go(r,t){if(r&1){let e=D();v(0,uo,8,6,"div",14),a(1,"div",15)(2,"input",16,6),p("input",function(){f(e);let i=oe(3),o=c();return h(o.onInput(i.value))}),s()()}if(r&2){let e=c();b(e.nzControls()?0:-1),l(2),u("value",e.displayValue())("placeholder",e.nzPlaceHolder()??"")("disabled",e.finalDisabled())("readOnly",e.nzReadOnly()),ye("aria-valuemin",e.nzMin())("aria-valuemax",e.nzMax())("id",e.nzId())("step",e.nzStep())("value",e.displayValue())}}var Xt=(()=>{class r{nzId=R(null);nzSize=R("default");nzPlaceHolder=R(null);nzStatus=R("");nzVariant=R("outlined");nzStep=R(1,{transform:ut});nzMin=R(Number.MIN_SAFE_INTEGER,{transform:ut});nzMax=R(Number.MAX_SAFE_INTEGER,{transform:ut});nzPrecision=R(null);nzParser=R();nzFormatter=R();nzDisabled=R(!1,{transform:Pe});nzReadOnly=R(!1,{transform:Pe});nzAutoFocus=R(!1,{transform:Pe});nzBordered=R(!0,{transform:Pe});nzKeyboard=R(!0,{transform:Pe});nzControls=R(!0,{transform:Pe});nzPrefix=R();nzSuffix=R();nzAddonBefore=R();nzAddonAfter=R();nzBlur=pt();nzFocus=pt();nzOnStep=pt();onChange=()=>{};onTouched=()=>{};isDisabledFirstChange=!0;compactSize=w(xn,{optional:!0});inputRef=jt.required("input");hostRef=jt("inputNumberHost");elementRef=w(sn);injector=w(rn);focusMonitor=w(vn);directionality=w(fn);nzFormStatusService=w(bn,{optional:!0});autoStepTimer=null;defaultFormatter=e=>{let n=this.nzPrecision();return ht(n)?e.toFixed(n):e.toString()};value=g(null);displayValue=g("");dir=hn(this.directionality.change,{initialValue:this.directionality.value});focused=g(!1);hasFeedback=g(!1);finalStatus=$t(()=>this.nzStatus());finalDisabled=$t(()=>this.nzDisabled());prefix=ot(Qt);suffix=ot(Yt);addonBefore=ot(Ht);addonAfter=ot(Kt);hasPrefix=K(()=>!!this.nzPrefix()||!!this.prefix());hasSuffix=K(()=>!!this.nzSuffix()||!!this.suffix()||this.hasFeedback());hasAffix=K(()=>this.hasPrefix()||this.hasSuffix());hasAddonBefore=K(()=>!!this.nzAddonBefore()||!!this.addonBefore());hasAddonAfter=K(()=>!!this.nzAddonAfter()||!!this.addonAfter());hasAddon=K(()=>this.hasAddonBefore()||this.hasAddonAfter());class=K(()=>this.hasAddon()?this.groupWrapperClass():this.hasAffix()?this.affixWrapperClass():this.inputNumberClass());inputNumberClass=K(()=>S(S({"ant-input-number":!0,"ant-input-number-lg":this.finalSize()==="large","ant-input-number-sm":this.finalSize()==="small","ant-input-number-disabled":this.finalDisabled(),"ant-input-number-readonly":this.nzReadOnly(),"ant-input-number-focused":this.focused(),"ant-input-number-rtl":this.dir()==="rtl","ant-input-number-in-form-item":!!this.nzFormStatusService,"ant-input-number-out-of-range":this.value()!==null&&!Zt(this.value(),this.nzMin(),this.nzMax())},_t("ant-input-number",this.nzVariant(),!this.nzBordered())),xt("ant-input-number",this.finalStatus(),this.hasFeedback())));affixWrapperClass=K(()=>S(S({"ant-input-number-affix-wrapper":!0,"ant-input-number-affix-wrapper-disabled":this.finalDisabled(),"ant-input-number-affix-wrapper-readonly":this.nzReadOnly(),"ant-input-number-affix-wrapper-focused":this.focused(),"ant-input-number-affix-wrapper-rtl":this.dir()==="rtl"},xt("ant-input-number-affix-wrapper",this.finalStatus(),this.hasFeedback())),_t("ant-input-number-affix-wrapper",this.nzVariant(),!this.nzBordered())));groupWrapperClass=K(()=>S(S({"ant-input-number-group-wrapper":!0,"ant-input-number-group-wrapper-rtl":this.dir()==="rtl"},xt("ant-input-number-group-wrapper",this.finalStatus(),this.hasFeedback())),_t("ant-input-number-group-wrapper",this.nzVariant(),!this.nzBordered())));finalSize=K(()=>this.compactSize?this.compactSize():this.nzSize());upDisabled=K(()=>!rt(this.value())&&this.value()>=this.nzMax());downDisabled=K(()=>!rt(this.value())&&this.value()<=this.nzMin());constructor(){let e=w(an);Bt(()=>{let n=this.hostRef(),i=n||this.elementRef;this.focusMonitor.monitor(i,!0).pipe(qt(e)).subscribe(o=>{this.focused.set(!!o),o?this.nzFocus.emit():(this.fixValue(),this.onTouched(),this.nzBlur.emit())}),e.onDestroy(()=>{this.focusMonitor.stopMonitoring(i)})}),this.nzFormStatusService?.formStatusChanges.pipe(qt()).subscribe(({status:n,hasFeedback:i})=>{this.finalStatus.set(n),this.hasFeedback.set(i)})}ngOnInit(){this.nzAutoFocus()&&Bt(()=>this.focus(),{injector:this.injector})}writeValue(e){rt(e)&&(e=null),Ut(()=>{this.value.set(e),this.setValue(e)})}registerOnChange(e){this.onChange=e}registerOnTouched(e){this.onTouched=e}setDisabledState(e){Ut(()=>{this.finalDisabled.set(this.isDisabledFirstChange&&this.nzDisabled()||e)}),this.isDisabledFirstChange=!1}focus(){this.inputRef().nativeElement.focus()}blur(){this.inputRef().nativeElement.blur()}step(e,n){if(n&&this.upDisabled()||!n&&this.downDisabled())return;let i=e.shiftKey?this.nzStep()*10:this.nzStep();n||(i=-i);let m=10**Kn(i),_=Hn((Math.round((this.value()||0)*m)+Math.round(i*m))/m,this.nzMin(),this.nzMax(),this.nzPrecision());this.setValue(_),this.nzOnStep.emit({type:n?"up":"down",value:this.value(),offset:this.nzStep()}),this.focus()}setValue(e){let n=this.nzFormatter()??this.defaultFormatter,i=this.nzPrecision();ht(i)&&(e&&=+e.toFixed(i));let o=rt(e)?"":n(e);this.displayValue.set(o),this.updateValue(e)}setValueByTyping(e){if(this.displayValue.set(e),e===""){this.updateValue(null);return}let i=(this.nzParser()??qn)(e);if(xo(e)||Number.isNaN(i))return;let o=this.nzFormatter();if(o){let m=o(i);this.displayValue.set(m)}Zt(i,this.nzMin(),this.nzMax())&&this.updateValue(i)}updateValue(e){this.value()!==e&&(this.value.set(e),this.onChange(e))}fixValue(){let e=this.displayValue();if(e==="")return;let i=(this.nzParser()??qn)(e);if(Number.isNaN(i))i=this.value();else{let o=this.nzPrecision();ht(o)&&Kn(i)!==o&&(i=+i.toFixed(o)),Zt(i,this.nzMin(),this.nzMax())||(i=Hn(i,this.nzMin(),this.nzMax(),o))}this.setValue(i)}stopAutoStep(){this.autoStepTimer!==null&&(clearTimeout(this.autoStepTimer),this.autoStepTimer=null)}onStepMouseDown(e,n){e.preventDefault(),this.stopAutoStep(),this.step(e,n);let i=()=>{this.step(e,n),this.autoStepTimer=setTimeout(i,fo)};this.autoStepTimer=setTimeout(i,ho)}onKeyDown(e){switch(e.keyCode){case 38:e.preventDefault(),this.nzKeyboard()&&this.step(e,!0);break;case 40:e.preventDefault(),this.nzKeyboard()&&this.step(e,!1);break;case 13:this.fixValue();break}}onInput(e){this.setValueByTyping(e)}static \u0275fac=function(n){return new(n||r)};static \u0275cmp=T({type:r,selectors:[["nz-input-number"]],contentQueries:function(n,i,o){n&1&&(it(o,i.prefix,Qt,5),it(o,i.suffix,Yt,5),it(o,i.addonBefore,Ht,5),it(o,i.addonAfter,Kt,5)),n&2&&Wt(4)},viewQuery:function(n,i){n&1&&(At(i.inputRef,Oi,5),At(i.hostRef,Li,5)),n&2&&Wt(2)},hostVars:2,hostBindings:function(n,i){n&1&&p("keydown",function(m){return i.onKeyDown(m)}),n&2&&Ie(i.class())},inputs:{nzId:[1,"nzId"],nzSize:[1,"nzSize"],nzPlaceHolder:[1,"nzPlaceHolder"],nzStatus:[1,"nzStatus"],nzVariant:[1,"nzVariant"],nzStep:[1,"nzStep"],nzMin:[1,"nzMin"],nzMax:[1,"nzMax"],nzPrecision:[1,"nzPrecision"],nzParser:[1,"nzParser"],nzFormatter:[1,"nzFormatter"],nzDisabled:[1,"nzDisabled"],nzReadOnly:[1,"nzReadOnly"],nzAutoFocus:[1,"nzAutoFocus"],nzBordered:[1,"nzBordered"],nzKeyboard:[1,"nzKeyboard"],nzControls:[1,"nzControls"],nzPrefix:[1,"nzPrefix"],nzSuffix:[1,"nzSuffix"],nzAddonBefore:[1,"nzAddonBefore"],nzAddonAfter:[1,"nzAddonAfter"]},outputs:{nzBlur:"nzBlur",nzFocus:"nzFocus",nzOnStep:"nzOnStep"},exportAs:["nzInputNumber"],features:[pn([{provide:Sn,useExisting:tn(()=>r),multi:!0},{provide:_n,useValue:"input-number"}]),dn([Cn])],ngContentSelectors:Ri,decls:13,vars:1,consts:[["inputNumberWithAddonInner",""],["inputNumberWithAffix",""],["inputNumberWithAffixInner",""],["inputNumber",""],["inputNumberInner",""],["inputNumberHost",""],["input",""],["handlers",""],[3,"ngTemplateOutlet"],[1,"ant-input-number-wrapper","ant-input-number-group"],[1,"ant-input-number-group-addon"],[1,"ant-input-number-prefix"],[1,"ant-input-number-suffix"],[3,"status"],[1,"ant-input-number-handler-wrap"],[1,"ant-input-number-input-wrap"],["autocomplete","off","role","spinbutton",1,"ant-input-number-input",3,"input","value","placeholder","disabled","readOnly"],[1,"ant-input-number-handler-wrap",3,"mouseup","mouseleave"],["role","button","unselectable","on",1,"ant-input-number-handler","ant-input-number-handler-up",3,"mousedown"],["role","button","unselectable","on",1,"ant-input-number-handler","ant-input-number-handler-down",3,"mousedown"],["nzType","up",1,"ant-input-number-handler-up-inner"],["nzType","down",1,"ant-input-number-handler-down-inner"]],template:function(n,i){n&1&&(dt(Ii),v(0,Bi,1,1,null,8)(1,Wi,1,1,null,8)(2,$i,1,1,null,8),O(3,Xi,5,3,"ng-template",null,0,Se)(5,eo,2,3,"ng-template",null,1,Se)(7,so,3,3,"ng-template",null,2,Se)(9,co,3,3,"ng-template",null,3,Se)(11,go,4,10,"ng-template",null,4,Se)),n&2&&b(i.hasAddon()?0:i.hasAffix()?1:2)},dependencies:[k,V,yn,gn],encapsulation:2,changeDetection:0})}return r})(),fo=200,ho=600;function qn(r){let t=r.trim().replace(/,/g,"").replace(/。/g,".");return t.length?+t:NaN}function Zt(r,t,e){return r>=t&&r<=e}function Hn(r,t,e,n=null){if(n===null)return r<t?t:r>e?e:r;let i=+r.toFixed(n),o=Math.pow(10,n);return i<t?Math.ceil(t*o)/o:i>e?Math.floor(e*o)/o:i}function Kn(r){return r.toString().split(".")[1]?.length||0}function xo(r){return/[.。](\d*0)?$/.test(r.toString())}var Qn=(()=>{class r{static \u0275fac=function(n){return new(n||r)};static \u0275mod=ln({type:r});static \u0275inj=nn({imports:[Xt]})}return r})();var vo=()=>[","," "];function bo(r,t){if(r&1&&x(0,"nz-option",14),r&2){let e=t.$implicit;u("nzValue",e)("nzLabel",e)}}function yo(r,t){if(r&1){let e=D();a(0,"div",30)(1,"input",31),N("ngModelChange",function(i){f(e);let o=c(2);return M(o.frontendStaticRoot,i)||(o.frontendStaticRoot=i),h(i)}),s(),a(2,"input",32),N("ngModelChange",function(i){f(e);let o=c(2);return M(o.indexFile,i)||(o.indexFile=i),h(i)}),s()(),a(3,"div",16),d(4,"\u9759\u6001\u76EE\u5F55\u7528\u4E8E\u76F4\u63A5\u6258\u7BA1\u524D\u7AEF\u4EA7\u7269"),s()}if(r&2){let e=c(2);l(),z("ngModel",e.frontendStaticRoot),l(),z("ngModel",e.indexFile)}}function So(r,t){if(r&1){let e=D();a(0,"div",30)(1,"input",33),N("ngModelChange",function(i){f(e);let o=c(2);return M(o.frontendWebService,i)||(o.frontendWebService=i),h(i)}),s()(),a(2,"div",16),d(3,"\u9002\u5408\u672C\u5730\u5F00\u53D1\u670D\u52A1\u6216\u53CD\u5411\u4EE3\u7406\u524D\u7AEF\u7F51\u5173"),s()}if(r&2){let e=c(2);l(),z("ngModel",e.frontendWebService)}}function wo(r,t){if(r&1){let e=D();a(0,"div",22)(1,"div",34)(2,"span"),d(3),s(),a(4,"button",35),p("click",function(){let i=f(e).$index,o=c(2);return h(o.removeApiProxy(i))}),x(5,"span",36),s()(),a(6,"div",37)(7,"input",38),N("ngModelChange",function(i){let o=f(e).$implicit;return M(o.pathPrefix,i)||(o.pathPrefix=i),h(i)}),s(),a(8,"input",39),N("ngModelChange",function(i){let o=f(e).$implicit;return M(o.backendService,i)||(o.backendService=i),h(i)}),s(),a(9,"label",40),N("ngModelChange",function(i){let o=f(e).$implicit;return M(o.isWebSocket,i)||(o.isWebSocket=i),h(i)}),d(10," WS "),s()()()}if(r&2){let e=t.$implicit,n=t.$index;l(3),J("\u8F6C\u53D1\u89C4\u5219 ",n+1),l(4),z("ngModel",e.pathPrefix),u("name","apiPathPrefix"+n),l(),z("ngModel",e.backendService),u("name","apiBackendService"+n),l(),z("ngModel",e.isWebSocket),u("name","apiIsWs"+n)}}function zo(r,t){if(r&1){let e=D();a(0,"nz-form-item")(1,"nz-form-label",6),d(2,"SSL \u8BC1\u4E66\u8DEF\u5F84"),s(),a(3,"nz-form-control",41)(4,"input",42),N("ngModelChange",function(i){f(e);let o=c(2);return M(o.formData.sslCert,i)||(o.formData.sslCert=i),h(i)}),s()()(),a(5,"nz-form-item")(6,"nz-form-label",6),d(7,"SSL \u79C1\u94A5\u8DEF\u5F84"),s(),a(8,"nz-form-control",43)(9,"input",44),N("ngModelChange",function(i){f(e);let o=c(2);return M(o.formData.sslKey,i)||(o.formData.sslKey=i),h(i)}),s()()()}if(r&2){let e=c(2);l(4),z("ngModel",e.formData.sslCert),l(5),z("ngModel",e.formData.sslKey)}}function Mo(r,t){if(r&1){let e=D();te(0),a(1,"div",4)(2,"form",5)(3,"nz-form-item")(4,"nz-form-label",6),d(5,"Server \u540D\u79F0"),s(),a(6,"nz-form-control",7)(7,"input",8),N("ngModelChange",function(i){f(e);let o=c();return M(o.formData.name,i)||(o.formData.name=i),h(i)}),s()()(),a(8,"nz-form-item")(9,"nz-form-label",6),d(10,"\u8BBF\u95EE\u5730\u5740"),s(),a(11,"nz-form-control")(12,"div",9)(13,"nz-select",10),N("ngModelChange",function(i){f(e);let o=c();return M(o.formData.protocol,i)||(o.formData.protocol=i),h(i)}),x(14,"nz-option",11)(15,"nz-option",12),s(),a(16,"nz-select",13),N("ngModelChange",function(i){f(e);let o=c();return M(o.domainValues,i)||(o.domainValues=i),h(i)}),p("ngModelChange",function(){f(e);let i=c();return h(i.syncDomains())}),L(17,bo,1,2,"nz-option",14,De),s(),a(19,"nz-input-number",15),N("ngModelChange",function(i){f(e);let o=c();return M(o.listenPort,i)||(o.listenPort=i),h(i)}),s()()(),a(20,"div",16),d(21,"\u57DF\u540D\u652F\u6301\u591A\u4E2A\u503C\uFF0C\u7AEF\u53E3\u4E3A\u5355\u4E2A\u503C\uFF0C\u4F8B\u5982\uFF1Alocalhost, 192.168.1.100 / 8080"),s()(),a(22,"nz-form-item")(23,"nz-form-label",6),d(24,"\u524D\u7AEF\u670D\u52A1"),s(),a(25,"nz-form-control")(26,"nz-radio-group",17),N("ngModelChange",function(i){f(e);let o=c();return M(o.frontendServiceType,i)||(o.frontendServiceType=i),h(i)}),p("ngModelChange",function(i){f(e);let o=c();return h(o.onFrontendServiceTypeChange(i))}),a(27,"label",18),d(28,"Web\u670D\u52A1\u5730\u5740"),s(),a(29,"label",19),d(30,"\u9759\u6001\u6587\u4EF6\u76EE\u5F55"),s()(),v(31,yo,5,2)(32,So,4,1),s()(),a(33,"nz-form-item")(34,"nz-form-label",20),d(35,"\u4EE3\u7406\u8F6C\u53D1"),s(),a(36,"nz-form-control")(37,"div",21),L(38,wo,11,7,"div",22,pe),a(40,"button",23),p("click",function(){f(e);let i=c();return h(i.addApiProxy())}),x(41,"span",24),d(42," \u6DFB\u52A0\u4EE3\u7406\u89C4\u5219 "),s()(),a(43,"div",16),d(44,"\u53EF\u914D\u7F6E\u591A\u4E2A\u4E0D\u540C\u8DEF\u5F84\u7684\u4EE3\u7406\u89C4\u5219\uFF0C\u5982 /api\u3001/ws \u7B49"),s()()(),v(45,zo,10,2),a(46,"nz-form-item")(47,"nz-form-label"),d(48,"\u81EA\u5B9A\u4E49\u914D\u7F6E\u7247\u6BB5"),s(),a(49,"nz-form-control")(50,"textarea",25),N("ngModelChange",function(i){f(e);let o=c();return M(o.formData.extraConfig,i)||(o.formData.extraConfig=i),h(i)}),s()(),a(51,"div",16),d(52," \u7528\u4E8E\u8865\u5145\u9AD8\u7EA7\u6307\u4EE4\uFF08`location` \u5E38\u89C4\u573A\u666F\u5EFA\u8BAE\u5728\u4E0A\u9762\u7684 \u4EE3\u7406\u8F6C\u53D1 \u4E2D\u914D\u7F6E\uFF09 "),s()()()(),a(53,"div",26)(54,"button",27),p("click",function(){f(e);let i=c();return h(i.onClose())}),d(55,"\u53D6\u6D88"),s(),a(56,"button",27),p("click",function(){f(e);let i=c();return h(i.previewConfig())}),d(57,"\u9884\u89C8\u914D\u7F6E"),s(),a(58,"button",28),p("click",function(){f(e);let i=c();return h(i.runConfigTest())}),d(59," \u6D4B\u8BD5\u914D\u7F6E "),s(),a(60,"button",29),p("click",function(){f(e);let i=c();return h(i.save())}),d(61,"\u4FDD\u5B58"),s()(),ne()}if(r&2){let e=c();l(7),z("ngModel",e.formData.name),l(6),z("ngModel",e.formData.protocol),l(3),u("nzMaxTagCount",1),z("ngModel",e.domainValues),u("nzTokenSeparators",Te(13,vo)),l(),I(e.commonDomainOptions),l(2),z("ngModel",e.listenPort),l(7),z("ngModel",e.frontendServiceType),l(5),b(e.frontendServiceType==="static"?31:32),l(3),u("nzTooltipIcon","question-circle"),l(4),I(e.apiProxies),l(7),b(e.formData.protocol==="https"?45:-1),l(5),z("ngModel",e.formData.extraConfig),l(8),u("nzLoading",e.validatingConfig()),l(2),u("nzLoading",e.saving())}}function No(r,t){if(r&1&&(te(0),a(1,"pre",45),d(2),s(),ne()),r&2){let e=c();l(2),y(e.previewContent())}}var Lt=class r{visible=!1;mode="create";editingServer=null;duplicateSourceServer=null;visibleChange=new me;saved=new me;nginxService=w(ee);message=w($);modal=w(Re);cdr=w(un);resetTimer=null;visibleEmitTimer=null;saving=g(!1);validatingConfig=g(!1);previewVisible=g(!1);previewContent=g("");commonDomainOptions=["127.0.0.1"];localIp=null;hasFetchedLocalIp=!1;commonIndexOptions=["index.html"];listenPort=null;domainValues=["127.0.0.1"];indexFile="index.html";frontendServiceType="web";frontendStaticRoot="";frontendWebService="";apiProxies=[];formData={name:"",listen:[],domains:["127.0.0.1"],root:"",index:["index.html"],locations:[],ssl:!1,protocol:"http",enabled:!0,sslCert:"",sslKey:"",extraConfig:""};get drawerTitle(){return this.mode==="copy"?"\u590D\u5236 Server ":this.mode==="edit"?"\u7F16\u8F91 Server ":"\u65B0\u589E Server "}ngOnChanges(t){let e="visible"in t,n="mode"in t,i="editingServer"in t,o="duplicateSourceServer"in t;(e&&this.visible||n&&this.visible&&!t.mode?.firstChange||i&&this.visible&&!t.editingServer?.firstChange||o&&this.visible&&!t.duplicateSourceServer?.firstChange)&&(this.scheduleResetForm(),this.visible&&!this.hasFetchedLocalIp&&(this.hasFetchedLocalIp=!0,this.getLocalIp()))}ngOnDestroy(){this.resetTimer&&(clearTimeout(this.resetTimer),this.resetTimer=null),this.visibleEmitTimer&&(clearTimeout(this.visibleEmitTimer),this.visibleEmitTimer=null)}scheduleResetForm(){this.resetTimer&&clearTimeout(this.resetTimer),this.resetTimer=setTimeout(()=>{this.resetTimer=null,this.resetForm(),this.cdr.detectChanges()},0)}emitVisibleChange(t){this.visibleEmitTimer&&clearTimeout(this.visibleEmitTimer),this.visibleEmitTimer=setTimeout(()=>{this.visibleEmitTimer=null,this.visibleChange.emit(t)},0)}resetForm(){if(this.editingServer){let t=this.parseListenPort(this.editingServer.listen);this.formData={name:this.editingServer.name,listen:t?[String(t)]:["8080"],domains:[...this.editingServer.domains||[]],root:this.editingServer.root||"",index:[...this.editingServer.index?.length?this.editingServer.index:["index.html"]],locations:this.editingServer.locations.map(e=>S({},e)),ssl:this.editingServer.ssl,protocol:this.editingServer.ssl?"https":"http",enabled:this.editingServer.enabled,sslCert:this.editingServer.sslCert||"",sslKey:this.editingServer.sslKey||"",extraConfig:this.editingServer.extraConfig||""},this.listenPort=t||8080,this.domainValues=[...this.formData.domains||[]],this.indexFile=(this.formData.index||["index.html"])[0]||"index.html",this.initScenarioFromFormData()}else if(this.duplicateSourceServer){let t=this.parseListenPort(this.duplicateSourceServer.listen);this.formData={name:this.makeCopyName(this.duplicateSourceServer.name),listen:t?[String(t)]:[],domains:[...this.duplicateSourceServer.domains||["127.0.0.1"]],root:this.duplicateSourceServer.root||"",index:[...this.duplicateSourceServer.index?.length?this.duplicateSourceServer.index:["index.html"]],locations:this.duplicateSourceServer.locations.map(e=>S({},e)),ssl:this.duplicateSourceServer.ssl,protocol:this.duplicateSourceServer.ssl?"https":"http",enabled:this.duplicateSourceServer.enabled,sslCert:this.duplicateSourceServer.sslCert||"",sslKey:this.duplicateSourceServer.sslKey||"",extraConfig:this.duplicateSourceServer.extraConfig||""},this.listenPort=t,this.domainValues=[...this.formData.domains||[]],this.indexFile=(this.formData.index||["index.html"])[0]||"index.html",this.initScenarioFromFormData()}else this.formData={name:"",listen:["8080"],domains:["127.0.0.1"],root:"",index:["index.html"],locations:[],ssl:!1,protocol:"http",enabled:!0,sslCert:"",sslKey:"",extraConfig:""},this.listenPort=8080,this.domainValues=["127.0.0.1"],this.indexFile="index.html",this.frontendServiceType="web",this.frontendStaticRoot="",this.frontendWebService="",this.apiProxies=[]}makeCopyName(t){let e=String(t||"").trim();return e?`${e}-copy`:"server-copy"}syncDomains(){this.formData.domains=(this.domainValues||[]).flatMap(t=>t.split(/[,\s]+/)).map(t=>t.trim()).filter(t=>t.length>0).filter((t,e,n)=>n.indexOf(t)===e)}onClose(){this.emitVisibleChange(!1)}onFrontendServiceTypeChange(t){this.frontendServiceType=t,t==="static"?(this.frontendWebService="",this.frontendStaticRoot=this.frontendStaticRoot||String(this.formData.root||"").trim(),this.indexFile||(this.indexFile="index.html")):(this.frontendStaticRoot="",this.indexFile="index.html")}async getLocalIp(){try{let t=await this.nginxService.getLocalIp();if(t.ip){this.localIp=t.ip,this.commonDomainOptions.includes(t.ip)||(this.commonDomainOptions=[...this.commonDomainOptions,t.ip]);let e=this.domainValues||[];e.includes(t.ip)||(this.domainValues=[...e,t.ip],this.syncDomains())}}catch{}}addApiProxy(){this.apiProxies=[...this.apiProxies,{pathPrefix:"/api",backendService:"",isWebSocket:!1}]}removeApiProxy(t){let e=[...this.apiProxies];e.splice(t,1),this.apiProxies=e}previewConfig(){this.syncListen(),this.syncDomains(),this.syncScenarioToFormData();let t=this.toComparableRequestFromForm();this.previewContent.set(this.generatePreviewConfig(t)),this.previewVisible.set(!0)}async save(){if(!this.formData.name.trim()){this.message.warning("\u8BF7\u8F93\u5165 Server \u540D\u79F0");return}if(this.syncDomains(),!this.formData.domains?.length){this.message.warning("\u8BF7\u81F3\u5C11\u586B\u5199\u4E00\u4E2A\u57DF\u540D");return}let t=this.getInvalidDomains(this.formData.domains);if(t.length){this.message.warning(`\u57DF\u540D\u683C\u5F0F\u65E0\u6548: ${t.join(", ")}`);return}if(this.syncListen(),!this.formData.listen.length){this.message.warning("\u8BF7\u586B\u5199\u76D1\u542C\u7AEF\u53E3");return}if(this.frontendServiceType==="static"){let o=String(this.frontendStaticRoot||"").trim();if(!o){this.message.warning("\u9009\u62E9\u201C\u9759\u6001\u6587\u4EF6\u76EE\u5F55\u201D\u65F6\uFF0C\u8BF7\u586B\u5199\u524D\u7AEF\u9759\u6001\u76EE\u5F55");return}if(!this.isValidFilePath(o)){this.message.warning("\u524D\u7AEF\u9759\u6001\u76EE\u5F55\u8DEF\u5F84\u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u586B\u5199\u7EDD\u5BF9\u8DEF\u5F84");return}}else{let o=String(this.frontendWebService||"").trim();if(!o){this.message.warning("\u9009\u62E9\u201CWeb\u670D\u52A1\u5730\u5740\u201D\u65F6\uFF0C\u8BF7\u586B\u5199\u524D\u7AEF\u670D\u52A1\u5730\u5740");return}if(!this.isValidHttpUrl(o)){this.message.warning("\u524D\u7AEF\u670D\u52A1\u5730\u5740\u65E0\u6548\uFF0C\u8BF7\u586B\u5199 http:// \u6216 https:// \u5F00\u5934\u7684\u5B8C\u6574\u5730\u5740");return}}for(let o=0;o<this.apiProxies.length;o++){let m=this.apiProxies[o],_=this.normalizeApiPathPrefix(m.pathPrefix);m.pathPrefix=_;let C=String(m.backendService||"").trim();if(C&&!this.isValidHttpUrl(C)){this.message.warning(`\u7B2C ${o+1} \u4E2A API \u4EE3\u7406\u7684\u540E\u7AEF\u670D\u52A1\u5730\u5740\u65E0\u6548\uFF0C\u8BF7\u586B\u5199 http:// \u6216 https:// \u5F00\u5934\u7684\u5B8C\u6574\u5730\u5740`);return}}if(this.formData.protocol==="https"){if(!this.formData.sslCert?.trim()){this.message.warning("\u8BF7\u586B\u5199 SSL \u8BC1\u4E66\u8DEF\u5F84");return}if(!this.formData.sslKey?.trim()){this.message.warning("\u8BF7\u586B\u5199 SSL \u79C1\u94A5\u8DEF\u5F84");return}if(!this.isValidFilePath(this.formData.sslCert)){this.message.warning("SSL \u8BC1\u4E66\u8DEF\u5F84\u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u586B\u5199\u7EDD\u5BF9\u8DEF\u5F84");return}if(!this.isValidFilePath(this.formData.sslKey)){this.message.warning("SSL \u79C1\u94A5\u8DEF\u5F84\u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u586B\u5199\u7EDD\u5BF9\u8DEF\u5F84");return}if(!await this.validateSslReadable())return}if(this.syncScenarioToFormData(),!(!await this.confirmDiffBeforeSave()||await this.detectPortConflict()||!await this.validateBeforeSave())){this.saving.set(!0);try{let o=this.mode==="edit"&&!!this.editingServer,m;o&&this.editingServer?m=await this.nginxService.updateServer(this.editingServer.id,this.formData):m=await this.nginxService.createServer(this.formData),this.message.success(o?"Server \u5DF2\u66F4\u65B0\uFF0C\u8BF7\u70B9\u51FB\u201C\u91CD\u8F7D\u201D\u4F7F\u53D8\u66F4\u751F\u6548":"Server \u5DF2\u521B\u5EFA\uFF0C\u8BF7\u70B9\u51FB\u201C\u91CD\u8F7D\u201D\u4F7F\u53D8\u66F4\u751F\u6548"),this.saved.emit(),this.emitVisibleChange(!1)}catch(o){this.message.error("\u64CD\u4F5C\u5931\u8D25: "+this.extractErrorMessage(o))}finally{this.saving.set(!1)}}}async runConfigTest(){this.syncListen(),this.syncDomains(),this.syncScenarioToFormData(),await this.validateBeforeSave(!0)}syncListen(){if(this.listenPort===null||this.listenPort===void 0){this.formData.listen=[];return}let t=Math.floor(this.listenPort);if(t<1||t>65535){this.message.warning(`\u76D1\u542C\u7AEF\u53E3 ${this.listenPort} \u65E0\u6548\uFF0C\u8BF7\u8F93\u5165 1-65535 \u7684\u6574\u6570`),this.formData.listen=[];return}this.formData.listen=[String(t)]}parseListenPort(t){if(!t||t.length===0)return null;for(let e of t){let n=String(e||"").match(/\d+/);if(!n)continue;let i=Number(n[0]);if(Number.isInteger(i)&&i>=1&&i<=65535)return i}return null}initScenarioFromFormData(){let t=[...this.formData.locations||[]],e=t.find(i=>String(i.path||"").trim()==="/");if(e?.proxyPass)this.frontendServiceType="web",this.frontendWebService=String(e.proxyPass||"").trim(),this.frontendStaticRoot="";else{this.frontendServiceType="static",this.frontendStaticRoot=String(e?.root||this.formData.root||"").trim(),this.frontendWebService="";let i=e?.index?.length?e.index:this.formData.index||[];this.indexFile=i[0]||"index.html"}let n=t.filter(i=>{let o=String(i.path||"").trim();return!!o&&o!=="/"&&!!i.proxyPass});n.length>0?this.apiProxies=n.map(i=>({pathPrefix:this.normalizeApiPathPrefix(String(i.path||"/api")),backendService:String(i.proxyPass||"").trim(),isWebSocket:!1})):this.apiProxies=[]}syncScenarioToFormData(){let t=[],e=String(this.frontendStaticRoot||"").trim(),n=String(this.frontendWebService||"").trim();if(this.frontendServiceType==="static"?(this.formData.root=e,this.formData.index=this.indexFile?[this.indexFile]:[]):(this.formData.root="",this.formData.index=[],n&&t.push({path:"/",proxyPass:n})),this.apiProxies.length>0)for(let i of this.apiProxies){let o=this.normalizeApiPathPrefix(i.pathPrefix),m=String(i.backendService||"").trim();if(o&&m){let _=i.isWebSocket?["proxy_http_version 1.1;","proxy_set_header Upgrade $http_upgrade;",'proxy_set_header Connection "upgrade";'].join(`
|
|
4
4
|
`):void 0;t.push({path:o,proxyPass:m,rawConfig:_})}}this.formData.locations=t}normalizeApiPathPrefix(t){let e=String(t||"").trim();return e?(e.startsWith("/")||(e=`/${e}`),e):"/api"}extractErrorMessage(t){let e=t;return e?.error?.error?.message||e?.error?.message||e?.message||"\u8BF7\u6C42\u5931\u8D25"}getInvalidDomains(t){return(t||[]).filter(e=>!this.isValidDomain(e))}isValidDomain(t){let e=String(t||"").trim();return e?e==="_"||e==="*"||e==="localhost"?!0:/^(\d{1,3}\.){3}\d{1,3}$/.test(e)?e.split(".").every(i=>Number(i)>=0&&Number(i)<=255):/^(?=.{1,253}$)(?!-)(?:[a-zA-Z0-9-]{1,63}\.)+[a-zA-Z]{2,63}$/.test(e):!1}isValidFilePath(t){let e=String(t||"").trim();return e?!!(/^[a-zA-Z]:\\/.test(e)||e.startsWith("/")):!1}isValidHttpUrl(t){let e=String(t||"").trim();if(!e)return!1;try{let n=new URL(e);return n.protocol==="http:"||n.protocol==="https:"}catch{return!1}}async validateSslReadable(){try{let t=String(this.formData.sslCert||"").trim(),e=String(this.formData.sslKey||"").trim(),n=await this.nginxService.validateSslPaths(t,e);return n.valid?!0:(n.cert?.exists?n.cert?.readable||this.message.warning(`SSL \u8BC1\u4E66\u4E0D\u53EF\u8BFB: ${t}`):this.message.warning(`SSL \u8BC1\u4E66\u4E0D\u5B58\u5728: ${t}`),n.key?.exists?n.key?.readable||this.message.warning(`SSL \u79C1\u94A5\u4E0D\u53EF\u8BFB: ${e}`):this.message.warning(`SSL \u79C1\u94A5\u4E0D\u5B58\u5728: ${e}`),!1)}catch(t){return this.message.warning("SSL \u6587\u4EF6\u6821\u9A8C\u5931\u8D25: "+this.extractErrorMessage(t)),!1}}async detectPortConflict(){try{let t=await this.nginxService.getServers();if(!t.servers?.length)return!1;let e=this.mode==="edit"?this.editingServer:null,n=new Set((this.formData.listen||[]).map(o=>this.extractListenPort(o)).filter(Boolean));if(!n.size)return!1;let i=t.servers.find(o=>{if(!o.enabled||e&&this.isSameEditingServer(o,e))return!1;let m=new Set((o.listen||[]).map(_=>this.extractListenPort(_)).filter(Boolean));for(let _ of n)if(m.has(_))return!0;return!1});return i?(this.message.warning(`\u68C0\u6D4B\u5230\u7AEF\u53E3\u53EF\u80FD\u51B2\u7A81\uFF1A${i.name}`),!0):!1}catch(t){return this.message.warning("\u7AEF\u53E3\u51B2\u7A81\u6821\u9A8C\u5931\u8D25\uFF0C\u5DF2\u963B\u6B62\u4FDD\u5B58: "+this.extractErrorMessage(t)),!0}}isSameEditingServer(t,e){if(t.id&&e.id&&t.id===e.id)return!0;let n=String(t.configText||"").trim(),i=String(e.configText||"").trim();return!!(n&&i&&n===i)}extractListenPort(t){let e=String(t||"").trim();if(!e||/^unix:/i.test(e))return"";let n=e.split(/\s+/)[0]||"",i=n;/^\[[^\]]+\]:\d+$/.test(n)?i=n.replace(/^.*\]:/,""):n.includes(":")&&(i=n.slice(n.lastIndexOf(":")+1));let o=Number(i);return!Number.isInteger(o)||o<1||o>65535?"":String(o)}async validateBeforeSave(t=!1){this.validatingConfig.set(!0);try{let e=await this.nginxService.validateConfig();return e.valid?(t&&this.message.success("\u914D\u7F6E\u68C0\u6D4B\u901A\u8FC7"),!0):(this.message.error("\u914D\u7F6E\u68C0\u6D4B\u5931\u8D25\uFF0C\u8BF7\u5148\u4FEE\u590D\u5168\u5C40\u914D\u7F6E\u9519\u8BEF\u540E\u518D\u4FDD\u5B58"),(e.errors||[]).slice(0,3).forEach(n=>this.message.error(n)),!1)}catch(e){return this.message.error("\u914D\u7F6E\u68C0\u6D4B\u5931\u8D25: "+this.extractErrorMessage(e)),!1}finally{this.validatingConfig.set(!1)}}async confirmDiffBeforeSave(){if(this.mode!=="edit"||!this.editingServer)return!0;let t=this.toComparableRequestFromServer(this.editingServer),e=this.toComparableRequestFromForm(),n=this.buildDiffRows(t,e);if(!n.length)return this.message.info("\u672A\u68C0\u6D4B\u5230\u914D\u7F6E\u53D8\u66F4"),!1;let i=n.slice(0,12),o=this.renderDiffHtml(i,n.length-i.length);return await new Promise(m=>{this.modal.confirm({nzTitle:"\u786E\u8BA4\u4FDD\u5B58\u4EE5\u4E0B\u53D8\u66F4",nzContent:o,nzWidth:860,nzOkText:"\u786E\u8BA4\u4FDD\u5B58",nzCancelText:"\u53D6\u6D88",nzOnOk:()=>m(!0),nzOnCancel:()=>m(!1)})})}toComparableRequestFromServer(t){return{name:String(t.name||"").trim(),listen:this.normalizeStringArray(t.listen||[]),domains:this.normalizeStringArray(t.domains||[]),root:String(t.root||"").trim(),index:this.normalizeStringArray(t.index||[]),locations:this.normalizeLocationsForCompare(t.locations||[]),ssl:!!t.ssl,protocol:t.ssl?"https":"http",sslCert:String(t.sslCert||"").trim(),sslKey:String(t.sslKey||"").trim(),enabled:!!t.enabled,extraConfig:String(t.extraConfig||"").trim()}}toComparableRequestFromForm(){return{name:String(this.formData.name||"").trim(),listen:this.normalizeStringArray(this.formData.listen||[]),domains:this.normalizeStringArray(this.formData.domains||[]),root:String(this.formData.root||"").trim(),index:this.normalizeStringArray(this.formData.index||[]),locations:this.normalizeLocationsForCompare(this.formData.locations||[]),ssl:this.formData.protocol==="https",protocol:this.formData.protocol==="https"?"https":"http",sslCert:String(this.formData.sslCert||"").trim(),sslKey:String(this.formData.sslKey||"").trim(),enabled:this.formData.enabled!==!1,extraConfig:String(this.formData.extraConfig||"").trim()}}buildDiffRows(t,e){let n=[];return this.pushDiff(n,"\u540D\u79F0",t.name,e.name),this.pushDiff(n,"\u76D1\u542C\u7AEF\u53E3",(t.listen||[]).join(", "),(e.listen||[]).join(", ")),this.pushDiff(n,"\u57DF\u540D",(t.domains||[]).join(", "),(e.domains||[]).join(", ")),this.pushDiff(n,"\u6839\u76EE\u5F55",t.root||"",e.root||""),this.pushDiff(n,"\u9ED8\u8BA4\u9996\u9875",(t.index||[]).join(", "),(e.index||[]).join(", ")),this.pushDiff(n,"\u534F\u8BAE",t.protocol||"",e.protocol||""),this.pushDiff(n,"SSL\u8BC1\u4E66",t.sslCert||"",e.sslCert||""),this.pushDiff(n,"SSL\u79C1\u94A5",t.sslKey||"",e.sslKey||""),this.pushDiff(n,"\u542F\u7528\u72B6\u6001",String(!!t.enabled),String(!!e.enabled)),this.pushDiff(n,"\u81EA\u5B9A\u4E49\u914D\u7F6E",t.extraConfig||"",e.extraConfig||""),this.pushDiff(n,"Location \u89C4\u5219",this.serializeLocations(t.locations||[]),this.serializeLocations(e.locations||[])),n}pushDiff(t,e,n,i){let o=String(n||"").trim(),m=String(i||"").trim();o!==m&&t.push({label:e,before:o||"\u7A7A",after:m||"\u7A7A"})}normalizeStringArray(t){return Array.from(new Set((t||[]).map(e=>String(e||"").trim()).filter(Boolean))).sort((e,n)=>e.localeCompare(n,"zh-CN"))}normalizeLocationsForCompare(t){return(t||[]).map(e=>({path:String(e.path||"").trim(),proxyPass:String(e.proxyPass||"").trim()||void 0,root:String(e.root||"").trim()||void 0,index:this.normalizeStringArray(e.index||[]),tryFiles:this.normalizeStringArray(e.tryFiles||[]),rawConfig:String(e.rawConfig||"").trim()||void 0}))}serializeLocations(t){return(t||[]).map(n=>{let i=String(n.path||"/").trim()||"/",o=String(n.proxyPass||"").trim(),m=String(n.root||"").trim(),_=(n.index||[]).join(", "),C=(n.tryFiles||[]).join(" "),G=String(n.rawConfig||"").trim(),de=/proxy_set_header\s+upgrade\s+\$http_upgrade/i.test(G)||/proxy_set_header\s+connection\s+"?upgrade"?/i.test(G);return[`path=${i}`,o?`proxy=${o}`:"",m?`root=${m}`:"",_?`index=${_}`:"",C?`try_files=${C}`:"",de?"ws=on":"ws=off",G?`raw=${G.replace(/\s+/g," ")}`:""].filter(Boolean).join(" | ")}).sort((n,i)=>n.localeCompare(i,"zh-CN")).join(`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e as G}from"./chunk-PUHSNEN6.js";import{Ab as U,Ia as L,Ja as q,M as W,a as Q,aa as V,c as E,oa as H,zb as $}from"./chunk-2EB7UV3S.js";import{i as I}from"./chunk-SIKDYQOR.js";import{Ac as w,Bc as D,Da as y,Fc as M,Gb as l,Gc as B,Hb as P,Hc as C,Mb as m,Oa as _,Xb as z,Zb as u,cc as s,dc as S,ec as N,ed as x,fc as f,mc as F,oa as A,ob as v,sa as a,sc as O,tb as Z,vc as r,vd as j,wc as d,xc as p,ya as R,yc as k,za as b,zd as T}from"./chunk-YGWA6NUS.js";var h=["*"],X=["nz-sider-trigger",""];function Y(e,o){}function ee(e,o){if(e&1&&m(0,Y,0,0,"ng-template",2),e&2){let n=r(),t=M(5);s("ngTemplateOutlet",n.nzZeroTrigger||t)}}function te(e,o){}function ne(e,o){if(e&1&&m(0,te,0,0,"ng-template",2),e&2){let n=r(),t=M(3);s("ngTemplateOutlet",n.nzTrigger||t)}}function ie(e,o){if(e&1&&f(0,"nz-icon",3),e&2){let n=r(2);s("nzType",n.nzCollapsed?"left":"right")}}function oe(e,o){if(e&1&&f(0,"nz-icon",3),e&2){let n=r(2);s("nzType",n.nzCollapsed?"right":"left")}}function re(e,o){if(e&1&&z(0,ie,1,1,"nz-icon",3)(1,oe,1,1,"nz-icon",3),e&2){let n=r();u(n.nzReverseArrow?0:1)}}function ae(e,o){e&1&&f(0,"nz-icon",4)}function le(e,o){if(e&1){let n=F();S(0,"div",2),O("click",function(){R(n);let i=r();return b(i.setCollapsed(!i.nzCollapsed))}),N()}if(e&2){let n=r();s("matchBreakPoint",n.matchBreakPoint)("nzCollapsedWidth",n.nzCollapsedWidth)("nzCollapsed",n.nzCollapsed)("nzBreakpoint",n.nzBreakpoint)("nzReverseArrow",n.nzReverseArrow)("nzTrigger",n.nzTrigger)("nzZeroTrigger",n.nzZeroTrigger)("siderWidth",n.widthSetting)}}var De=(()=>{class e{static \u0275fac=function(t){return new(t||e)};static \u0275cmp=l({type:e,selectors:[["nz-content"]],hostAttrs:[1,"ant-layout-content"],exportAs:["nzContent"],ngContentSelectors:h,decls:1,vars:0,template:function(t,i){t&1&&(d(),p(0))},encapsulation:2,changeDetection:0})}return e})(),Me=(()=>{class e{static \u0275fac=function(t){return new(t||e)};static \u0275cmp=l({type:e,selectors:[["nz-footer"]],hostAttrs:[1,"ant-layout-footer"],exportAs:["nzFooter"],ngContentSelectors:h,decls:1,vars:0,template:function(t,i){t&1&&(d(),p(0))},encapsulation:2,changeDetection:0})}return e})(),Be=(()=>{class e{static \u0275fac=function(t){return new(t||e)};static \u0275cmp=l({type:e,selectors:[["nz-header"]],hostAttrs:[1,"ant-layout-header"],exportAs:["nzHeader"],ngContentSelectors:h,decls:1,vars:0,template:function(t,i){t&1&&(d(),p(0))},encapsulation:2,changeDetection:0})}return e})(),J=(()=>{class e{nzCollapsed=!1;nzReverseArrow=!1;nzZeroTrigger=null;nzTrigger=void 0;matchBreakPoint=!1;nzCollapsedWidth=null;siderWidth=null;nzBreakpoint=null;isZeroTrigger=!1;isNormalTrigger=!1;updateTriggerType(){this.isZeroTrigger=this.nzCollapsedWidth===0&&(this.nzBreakpoint&&this.matchBreakPoint||!this.nzBreakpoint),this.isNormalTrigger=this.nzCollapsedWidth!==0}ngOnInit(){this.updateTriggerType()}ngOnChanges(){this.updateTriggerType()}static \u0275fac=function(t){return new(t||e)};static \u0275cmp=l({type:e,selectors:[["","nz-sider-trigger",""]],hostVars:10,hostBindings:function(t,i){t&2&&(B("width",i.isNormalTrigger?i.siderWidth:null),C("ant-layout-sider-trigger",i.isNormalTrigger)("ant-layout-sider-zero-width-trigger",i.isZeroTrigger)("ant-layout-sider-zero-width-trigger-right",i.isZeroTrigger&&i.nzReverseArrow)("ant-layout-sider-zero-width-trigger-left",i.isZeroTrigger&&!i.nzReverseArrow))},inputs:{nzCollapsed:"nzCollapsed",nzReverseArrow:"nzReverseArrow",nzZeroTrigger:"nzZeroTrigger",nzTrigger:"nzTrigger",matchBreakPoint:"matchBreakPoint",nzCollapsedWidth:"nzCollapsedWidth",siderWidth:"siderWidth",nzBreakpoint:"nzBreakpoint"},exportAs:["nzSiderTrigger"],features:[_],attrs:X,decls:6,vars:2,consts:[["defaultTrigger",""],["defaultZeroTrigger",""],[3,"ngTemplateOutlet"],[3,"nzType"],["nzType","bars"]],template:function(t,i){t&1&&(z(0,ee,1,1,null,2),z(1,ne,1,1,null,2),m(2,re,2,1,"ng-template",null,0,x)(4,ae,1,0,"ng-template",null,1,x)),t&2&&(u(i.isZeroTrigger?0:-1),v(),u(i.isNormalTrigger?1:-1))},dependencies:[I,q,L],encapsulation:2,changeDetection:0})}return e})(),K=(()=>{class e{destroyRef=a(y);platform=a(E);cdr=a(j);breakpointService=a(U);nzMenuDirective=null;nzCollapsedChange=new Z;nzWidth=200;nzTheme="dark";nzCollapsedWidth=80;nzBreakpoint=null;nzZeroTrigger=null;nzTrigger=void 0;nzReverseArrow=!1;nzCollapsible=!1;nzCollapsed=!1;matchBreakPoint=!1;flexSetting=null;widthSetting=null;updateStyleMap(){this.widthSetting=this.nzCollapsed?`${this.nzCollapsedWidth}px`:V(this.nzWidth),this.flexSetting=`0 0 ${this.widthSetting}`,this.cdr.markForCheck()}updateMenuInlineCollapsed(){this.nzMenuDirective&&this.nzMenuDirective.nzMode==="inline"&&this.nzCollapsedWidth!==0&&this.nzMenuDirective.setInlineCollapsed(this.nzCollapsed)}setCollapsed(n){n!==this.nzCollapsed&&(this.nzCollapsed=n,this.nzCollapsedChange.emit(n),this.updateMenuInlineCollapsed(),this.updateStyleMap(),this.cdr.markForCheck())}ngOnInit(){this.updateStyleMap(),this.platform.isBrowser&&this.breakpointService.subscribe($,!0).pipe(W(this.destroyRef)).subscribe(n=>{let t=this.nzBreakpoint;t&&H().subscribe(()=>{this.matchBreakPoint=!n[t],this.setCollapsed(this.matchBreakPoint),this.cdr.markForCheck()})})}ngOnChanges(n){let{nzCollapsed:t,nzCollapsedWidth:i,nzWidth:c}=n;(t||i||c)&&this.updateStyleMap(),t&&this.updateMenuInlineCollapsed()}ngAfterContentInit(){this.updateMenuInlineCollapsed()}static \u0275fac=function(t){return new(t||e)};static \u0275cmp=l({type:e,selectors:[["nz-sider"]],contentQueries:function(t,i,c){if(t&1&&k(c,G,5),t&2){let g;w(g=D())&&(i.nzMenuDirective=g.first)}},hostAttrs:[1,"ant-layout-sider"],hostVars:18,hostBindings:function(t,i){t&2&&(B("flex",i.flexSetting)("max-width",i.widthSetting)("min-width",i.widthSetting)("width",i.widthSetting),C("ant-layout-sider-zero-width",i.nzCollapsed&&i.nzCollapsedWidth===0)("ant-layout-sider-light",i.nzTheme==="light")("ant-layout-sider-dark",i.nzTheme==="dark")("ant-layout-sider-collapsed",i.nzCollapsed)("ant-layout-sider-has-trigger",i.nzCollapsible&&i.nzTrigger!==null))},inputs:{nzWidth:"nzWidth",nzTheme:"nzTheme",nzCollapsedWidth:"nzCollapsedWidth",nzBreakpoint:"nzBreakpoint",nzZeroTrigger:"nzZeroTrigger",nzTrigger:"nzTrigger",nzReverseArrow:[2,"nzReverseArrow","nzReverseArrow",T],nzCollapsible:[2,"nzCollapsible","nzCollapsible",T],nzCollapsed:[2,"nzCollapsed","nzCollapsed",T]},outputs:{nzCollapsedChange:"nzCollapsedChange"},exportAs:["nzSider"],features:[_],ngContentSelectors:h,decls:3,vars:1,consts:[[1,"ant-layout-sider-children"],["nz-sider-trigger","",3,"matchBreakPoint","nzCollapsedWidth","nzCollapsed","nzBreakpoint","nzReverseArrow","nzTrigger","nzZeroTrigger","siderWidth"],["nz-sider-trigger","",3,"click","matchBreakPoint","nzCollapsedWidth","nzCollapsed","nzBreakpoint","nzReverseArrow","nzTrigger","nzZeroTrigger","siderWidth"]],template:function(t,i){t&1&&(d(),S(0,"div",0),p(1),N(),z(2,le,1,8,"div",1)),t&2&&(v(2),u(i.nzCollapsible&&i.nzTrigger!==null?2:-1))},dependencies:[J],encapsulation:2,changeDetection:0})}return e})(),xe=(()=>{class e{destroyRef=a(y);directionality=a(Q);listOfNzSiderComponent;dir="ltr";ngOnInit(){this.dir=this.directionality.value,this.directionality.change?.pipe(W(this.destroyRef)).subscribe(n=>{this.dir=n})}static \u0275fac=function(t){return new(t||e)};static \u0275cmp=l({type:e,selectors:[["nz-layout"]],contentQueries:function(t,i,c){if(t&1&&k(c,K,4),t&2){let g;w(g=D())&&(i.listOfNzSiderComponent=g)}},hostAttrs:[1,"ant-layout"],hostVars:4,hostBindings:function(t,i){t&2&&C("ant-layout-rtl",i.dir==="rtl")("ant-layout-has-sider",i.listOfNzSiderComponent.length>0)},exportAs:["nzLayout"],ngContentSelectors:h,decls:1,vars:0,template:function(t,i){t&1&&(d(),p(0))},encapsulation:2,changeDetection:0})}return e})(),We=(()=>{class e{static \u0275fac=function(t){return new(t||e)};static \u0275mod=P({type:e});static \u0275inj=A({imports:[K,J]})}return e})();export{De as a,Me as b,Be as c,K as d,xe as e,We as f};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{i as n}from"./chunk-X6PRUZ5G.js";import{n as m}from"./chunk-SIKDYQOR.js";import{Hb as e,oa as t}from"./chunk-YGWA6NUS.js";var p=[{path:"",loadComponent:()=>import("./chunk-XQQ6PT2E.js").then(o=>o.TasksComponent)}],i=class o{static \u0275fac=function(r){return new(r||o)};static \u0275mod=e({type:o});static \u0275inj=t({imports:[n.forChild(p),n]})};var s=class o{static \u0275fac=function(r){return new(r||o)};static \u0275mod=e({type:o});static \u0275inj=t({imports:[m,i]})};export{s as TasksModule};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as ot}from"./chunk-
|
|
1
|
+
import{a as ot}from"./chunk-4PSSTE76.js";import{Fb as it,M as d,S as J,T as v,c as Y,oa as K,ra as Q,ta as tt,ua as et}from"./chunk-2EB7UV3S.js";import{i as X}from"./chunk-SIKDYQOR.js";import{B as u,C as T,Ca as V,Da as $,Gb as U,Hb as Z,M as A,Mb as G,Q as p,Ra as j,V as N,Xb as g,Yc as W,Zb as m,a as o,cc as q,dc as C,ec as E,fc as B,ha as x,l as S,m as h,ma as F,n as y,na as R,oa as _,ob as f,sa as r,tb as k,u as b,ub as P,vc as H,zd as z}from"./chunk-YGWA6NUS.js";function nt(e,c){e&1&&(C(0,"div",0),B(1,"nz-spin"),E())}function st(e,c){}function rt(e,c){if(e&1&&(C(0,"div",1),G(1,st,0,0,"ng-template",2),E()),e&2){let t=H();f(),q("ngTemplateOutlet",t.nzToolkit)}}var a={UNLOAD:"unload",LOADING:"loading",LOADED:"LOADED"},O="codeEditor";function I(e){return(...c)=>{e&&e(...c)}}var D=new y(1),l=a.UNLOAD,dt=(()=>{class e{nzConfigService=r(tt);document=r(V);firstEditorInitialized=!1;option={};config;option$=new h(this.option);constructor(){let t=this.nzConfigService.getConfigForComponent(O);this.config=o({},t),this.config.monacoEnvironment&&(window.MonacoEnvironment=o({},this.config.monacoEnvironment)),this.option=this.config.defaultEditorOption||{},et(O,()=>{let i=this.nzConfigService.getConfigForComponent(O);i&&this._updateDefaultOption(i.defaultEditorOption)})}_updateDefaultOption(t){this.option=o(o({},this.option),t),this.option$.next(this.option),"theme"in t&&t.theme&&monaco.editor.setTheme(t.theme)}requestToInit(){return l===a.LOADED?(this.onInit(),b(this.getLatestOption())):(l===a.UNLOAD&&(this.config.useStaticLoading&&typeof monaco>"u"?v("You choose to use static loading but it seems that you forget to config webpack plugin correctly. Please refer to our official websitefor more details about static loading."):this.loadMonacoScript()),D.pipe(x(()=>this.onInit()),u(()=>this.getLatestOption())))}loadMonacoScript(){if(this.config.useStaticLoading){Promise.resolve().then(()=>this.onLoad());return}if(l===a.LOADING)return;l=a.LOADING;let t=this.config.assetsRoot,i=t?`${t}/vs`:"assets/vs",n=window,s=this.document.createElement("script");s.type="text/javascript",s.src=`${i}/loader.js`;let L=()=>{w(),n.require.config(o({paths:{vs:i}},this.config.extraConfig)),n.require(["vs/editor/editor.main"],()=>{this.onLoad()})},M=()=>{throw w(),new Error(`${J} cannot load assets of monaco editor from source "${i}".`)},w=()=>{s.removeEventListener("load",L),s.removeEventListener("error",M),this.document.documentElement.removeChild(s)};s.addEventListener("load",L),s.addEventListener("error",M),this.document.documentElement.appendChild(s)}onLoad(){l=a.LOADED,D.next(!0),D.complete(),I(this.config.onLoad)()}onInit(){this.firstEditorInitialized||(this.firstEditorInitialized=!0,I(this.config.onFirstEditorInit)()),I(this.config.onInit)()}getLatestOption(){return o({},this.option)}static \u0275fac=function(i){return new(i||e)};static \u0275prov=R({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),at=(()=>{class e{nzCodeEditorService=r(dt);ngZone=r(P);platform=r(Y);destroyRef=r($);nzEditorMode="normal";nzOriginalText="";nzLoading=!1;nzFullControl=!1;nzToolkit;set nzEditorOption(t){this.editorOption$.next(t)}nzEditorInitialized=new k;editorOptionCached={};el=r(j).nativeElement;resize$=new S;editorOption$=new h({});editorInstance=null;value="";modelSet=!1;onDidChangeContentDisposable=null;constructor(){this.el.classList.add("ant-code-editor"),this.destroyRef.onDestroy(()=>{this.onDidChangeContentDisposable&&(this.onDidChangeContentDisposable.dispose(),this.onDidChangeContentDisposable=null),this.editorInstance&&(this.editorInstance.dispose(),this.editorInstance=null)})}ngAfterViewInit(){this.platform.isBrowser&&this.nzCodeEditorService.requestToInit().pipe(d(this.destroyRef)).subscribe(t=>this.setup(t))}writeValue(t){this.value=t,this.setValue()}registerOnChange(t){this.onChange=t}registerOnTouched(t){this.onTouch=t}onChange=t=>{};onTouch=()=>{};layout(){this.resize$.next()}setup(t){this.ngZone.runOutsideAngular(()=>K().pipe(d(this.destroyRef)).subscribe(()=>{this.editorOptionCached=t,this.registerOptionChanges(),this.initMonacoEditorInstance(),this.registerResizeChange(),this.setValue(),this.nzFullControl||this.setValueEmitter(),this.nzEditorInitialized.observers.length&&this.ngZone.run(()=>this.nzEditorInitialized.emit(this.editorInstance))}))}registerOptionChanges(){T([this.editorOption$,this.nzCodeEditorService.option$]).pipe(d(this.destroyRef)).subscribe(([t,i])=>{this.editorOptionCached=o(o(o({},this.editorOptionCached),i),t),this.updateOptionToMonaco()})}initMonacoEditorInstance(){this.ngZone.runOutsideAngular(()=>{this.editorInstance=this.nzEditorMode==="normal"?monaco.editor.create(this.el,o({},this.editorOptionCached)):monaco.editor.createDiffEditor(this.el,o({},this.editorOptionCached))})}registerResizeChange(){Q(window,"resize").pipe(p(300),d(this.destroyRef)).subscribe(()=>{this.layout()}),this.resize$.pipe(d(this.destroyRef),A(()=>!!this.editorInstance),u(()=>({width:this.el.clientWidth,height:this.el.clientHeight})),N((t,i)=>t.width===i.width&&t.height===i.height),p(50)).subscribe(()=>{this.editorInstance.layout()})}setValue(){if(this.editorInstance){if(this.nzFullControl&&this.value){v("should not set value when you are using full control mode! It would result in ambiguous data flow!");return}if(this.nzEditorMode==="normal")if(this.modelSet){let t=this.editorInstance.getModel();this.preservePositionAndSelections(()=>t.setValue(this.value))}else this.editorInstance.setModel(monaco.editor.createModel(this.value,this.editorOptionCached.language)),this.modelSet=!0;else if(this.modelSet){let t=this.editorInstance.getModel();this.preservePositionAndSelections(()=>{t.modified.setValue(this.value),t.original.setValue(this.nzOriginalText)})}else{let t=this.editorOptionCached.language;this.editorInstance.setModel({original:monaco.editor.createModel(this.nzOriginalText,t),modified:monaco.editor.createModel(this.value,t)}),this.modelSet=!0}}}preservePositionAndSelections(t){if(!this.editorInstance){t();return}let i=this.editorInstance.getPosition(),n=this.editorInstance.getSelections();t(),i&&this.editorInstance.setPosition(i),n&&this.editorInstance.setSelections(n)}setValueEmitter(){let t=this.nzEditorMode==="normal"?this.editorInstance.getModel():this.editorInstance.getModel().modified;this.onDidChangeContentDisposable=t.onDidChangeContent(()=>{this.emitValue(t.getValue())})}emitValue(t){this.value!==t&&(this.value=t,this.ngZone.run(()=>{this.onChange(t)}))}updateOptionToMonaco(){this.editorInstance&&this.editorInstance.updateOptions(o({},this.editorOptionCached))}static \u0275fac=function(i){return new(i||e)};static \u0275cmp=U({type:e,selectors:[["nz-code-editor"]],inputs:{nzEditorMode:"nzEditorMode",nzOriginalText:"nzOriginalText",nzLoading:[2,"nzLoading","nzLoading",z],nzFullControl:[2,"nzFullControl","nzFullControl",z],nzToolkit:"nzToolkit",nzEditorOption:"nzEditorOption"},outputs:{nzEditorInitialized:"nzEditorInitialized"},exportAs:["nzCodeEditor"],features:[W([{provide:it,useExisting:F(()=>e),multi:!0}])],decls:2,vars:2,consts:[[1,"ant-code-editor-loading"],[1,"ant-code-editor-toolkit"],[3,"ngTemplateOutlet"]],template:function(i,n){i&1&&(g(0,nt,2,0,"div",0),g(1,rt,2,1,"div",1)),i&2&&(m(n.nzLoading?0:-1),f(),m(n.nzToolkit?1:-1))},dependencies:[ot,X],encapsulation:2,changeDetection:0})}return e})(),yt=(()=>{class e{static \u0275fac=function(i){return new(i||e)};static \u0275mod=Z({type:e});static \u0275inj=_({imports:[at]})}return e})();export{at as a,yt as b};
|