@@ -87,40 +87,47 @@ function showFormModal(modelSelector, formID, URL, getData) {
8787 }
8888 form . children ( ".message" ) . remove ( ) ;
8989 btn . toggleClass ( "loading" ) ;
90- // 1) 用 Dropdown API 写回隐藏 input 的实时值
90+ // 1) 写回隐藏 input 的实时值
91+ // 兼容当前实现:标签是手动添加到 DOM 的,dropdown API 可能拿不到值
9192 $ ( formID ) . find ( '.ui.multiple.dropdown' ) . each ( function ( ) {
9293 const $dropdown = $ ( this ) ;
9394 const $hidden = $dropdown . find ( 'input[type="hidden"]' ) ;
9495 const name = $hidden . attr ( 'name' ) ;
9596 if ( ! name || ! name . endsWith ( 'Raw' ) ) return ;
96- let values = $dropdown . dropdown ( 'get values' ) || [ ] ;
97- values = values . map ( v => { const n = parseInt ( v ) ; return isNaN ( n ) ? v : n ; } ) ;
97+ // 优先从可见标签读取 data-value
98+ let values = [ ] ;
99+ $dropdown . find ( 'a.ui.label' ) . each ( function ( ) {
100+ const v = $ ( this ) . attr ( 'data-value' ) ;
101+ if ( v !== undefined && v !== null && v !== '' ) {
102+ const n = parseInt ( v ) ;
103+ values . push ( isNaN ( n ) ? v : n ) ;
104+ }
105+ } ) ;
106+ // 若未读到标签,再回退使用 dropdown API
107+ if ( values . length === 0 ) {
108+ const apiVals = $dropdown . dropdown ( 'get values' ) || [ ] ;
109+ for ( let i = 0 ; i < apiVals . length ; i ++ ) {
110+ const n = parseInt ( apiVals [ i ] ) ;
111+ values . push ( isNaN ( n ) ? apiVals [ i ] : n ) ;
112+ }
113+ }
98114 $hidden . val ( JSON . stringify ( values ) ) ;
99115 } ) ;
100116
101- // 2) serialize 生成标准 x-www-form-urlencoded 字符串
102- const serialized = $ ( formID ) . serialize ( ) ;
117+ // 2) 使用 serializeArray 获取键值对,便于补齐未选中的 checkbox
118+ let arr = $ ( formID ) . serializeArray ( ) ;
103119
104- // 特殊处理checkbox字段,确保未选中的checkbox也被包含在数据中
105- // 检查所有checkbox,如果没有在数据中,则设置为空字符串(表示未选中)
120+ // 3) 补齐未选中的 checkbox(用空字符串表示未选中)
106121 $ ( formID ) . find ( 'input[type="checkbox"]' ) . each ( function ( ) {
107- const checkboxName = $ ( this ) . attr ( 'name' ) ;
108- if ( checkboxName && ! ( checkboxName in data ) ) {
109- data [ checkboxName ] = "" ;
122+ const name = $ ( this ) . attr ( 'name' ) ;
123+ if ( ! name ) return ;
124+ if ( ! arr . find ( p => p . name === name ) ) {
125+ arr . push ( { name, value : '' } ) ;
110126 }
111127 } ) ;
112128
113- // 更优雅:使用 Semantic UI Dropdown API 获取多选值,避免依赖 onChange 或标签扫描
114- $ ( formID ) . find ( '.ui.multiple.dropdown' ) . each ( function ( ) {
115- const $dropdown = $ ( this ) ;
116- const $hidden = $dropdown . find ( 'input[type="hidden"]' ) ;
117- const name = $hidden . attr ( 'name' ) ;
118- if ( ! name || ! name . endsWith ( 'Raw' ) ) return ;
119- let values = $dropdown . dropdown ( 'get values' ) || [ ] ;
120- // 统一为数字(若能转换),再序列化为 JSON 数组字符串
121- values = values . map ( v => { const n = parseInt ( v ) ; return isNaN ( n ) ? v : n ; } ) ;
122- data [ name ] = JSON . stringify ( values ) ;
123- } ) ;
129+ // 4) 序列化为标准 x-www-form-urlencoded 字符串
130+ const serialized = $ . param ( arr ) ;
124131
125132 // 按标准表单方式提交
126133 $ . post ( URL , serialized )
@@ -169,7 +176,7 @@ function addOrEditAlertRule(rule) {
169176 } else {
170177 modal . find ( ".ui.rule-enable.checkbox" ) . checkbox ( "set unchecked" ) ;
171178 }
172- modal . find ( "a.ui.label.visible " ) . each ( ( i , el ) => {
179+ modal . find ( "a.ui.label" ) . each ( ( i , el ) => {
173180 el . remove ( ) ;
174181 } ) ;
175182
@@ -397,7 +404,7 @@ function addOrEditServer(server, conf) {
397404 modal . find ( "input[name=id]" ) . val ( server ? server . ID : null ) ;
398405 modal . find ( "input[name=name]" ) . val ( server ? server . Name : null ) ;
399406 modal . find ( "input[name=Tag]" ) . val ( server ? server . Tag : null ) ;
400- modal . find ( "a.ui.label.visible " ) . each ( ( i , el ) => {
407+ modal . find ( "a.ui.label" ) . each ( ( i , el ) => {
401408 el . remove ( ) ;
402409 } ) ;
403410
@@ -537,7 +544,7 @@ function addOrEditMonitor(monitor) {
537544 } else {
538545 modal . find ( ".ui.nb-lt-notify.checkbox" ) . checkbox ( "set unchecked" ) ;
539546 }
540- modal . find ( "a.ui.label.visible " ) . each ( ( i , el ) => {
547+ modal . find ( "a.ui.label" ) . each ( ( i , el ) => {
541548 el . remove ( ) ;
542549 } ) ;
543550 if ( monitor && monitor . EnableTriggerTask ) {
@@ -656,7 +663,7 @@ function addOrEditCron(cron) {
656663 modal . find ( "select[name=Cover]" ) . val ( cron ? cron . Cover : 0 ) ;
657664 modal . find ( "input[name=NotificationTag]" ) . val ( cron ? cron . NotificationTag : null ) ;
658665 modal . find ( "input[name=Scheduler]" ) . val ( cron ? cron . Scheduler : null ) ;
659- modal . find ( "a.ui.label.visible " ) . each ( ( i , el ) => {
666+ modal . find ( "a.ui.label" ) . each ( ( i , el ) => {
660667 el . remove ( ) ;
661668 } ) ;
662669
@@ -731,7 +738,28 @@ function addOrEditCron(cron) {
731738 } ,
732739 // 禁用onChange事件,避免干扰现有标签
733740 onChange : function ( value , text , $choice ) {
734- // 不做任何操作,保持现有标签不变
741+ // 同步隐藏域,保持与标签一致
742+ var dropdown = $ ( this ) ;
743+ var hiddenInput = dropdown . find ( 'input[type="hidden"][name="ServersRaw"]' ) ;
744+ if ( hiddenInput . length ) {
745+ var currentValues = [ ] ;
746+ dropdown . find ( 'a.ui.label' ) . each ( function ( ) {
747+ var labelValue = $ ( this ) . attr ( 'data-value' ) ;
748+ if ( labelValue !== undefined && labelValue !== null && labelValue !== '' ) {
749+ var n = parseInt ( labelValue ) ;
750+ currentValues . push ( isNaN ( n ) ? labelValue : n ) ;
751+ }
752+ } ) ;
753+ // 若标签为空,回退到 API 获取值
754+ if ( currentValues . length === 0 ) {
755+ var apiVals = dropdown . dropdown ( 'get values' ) || [ ] ;
756+ for ( var i = 0 ; i < apiVals . length ; i ++ ) {
757+ var n2 = parseInt ( apiVals [ i ] ) ;
758+ currentValues . push ( isNaN ( n2 ) ? apiVals [ i ] : n2 ) ;
759+ }
760+ }
761+ hiddenInput . val ( JSON . stringify ( currentValues ) ) ;
762+ }
735763 }
736764 } ) ;
737765 } , 500 ) ; // 延迟500ms确保标签已经创建完成
@@ -847,7 +875,7 @@ function initializeServersDropdown() {
847875
848876 // 获取当前所有可见的标签
849877 var currentValues = [ ] ;
850- dropdown . find ( 'a.ui.label.visible ' ) . each ( function ( ) {
878+ dropdown . find ( 'a.ui.label' ) . each ( function ( ) {
851879 var labelValue = $ ( this ) . attr ( 'data-value' ) ;
852880 if ( labelValue ) {
853881 currentValues . push ( parseInt ( labelValue ) ) ;
@@ -871,7 +899,7 @@ function initializeServersDropdown() {
871899 // 更新隐藏的input值
872900 var hiddenInput = dropdown . find ( 'input[type="hidden"]' ) ;
873901 var currentValues = [ ] ;
874- dropdown . find ( 'a.ui.label.visible ' ) . each ( function ( ) {
902+ dropdown . find ( 'a.ui.label' ) . each ( function ( ) {
875903 var labelValue = $ ( this ) . attr ( 'data-value' ) ;
876904 if ( labelValue && $ ( this ) [ 0 ] !== $label [ 0 ] ) {
877905 currentValues . push ( parseInt ( labelValue ) ) ;
@@ -918,7 +946,7 @@ function initializeTasksDropdown() {
918946
919947 // 获取当前所有可见的标签
920948 var currentValues = [ ] ;
921- dropdown . find ( 'a.ui.label.visible ' ) . each ( function ( ) {
949+ dropdown . find ( 'a.ui.label' ) . each ( function ( ) {
922950 var labelValue = $ ( this ) . attr ( 'data-value' ) ;
923951 if ( labelValue ) {
924952 currentValues . push ( parseInt ( labelValue ) ) ;
@@ -942,7 +970,7 @@ function initializeTasksDropdown() {
942970 // 更新隐藏的input值
943971 var hiddenInput = dropdown . find ( 'input[type="hidden"]' ) ;
944972 var currentValues = [ ] ;
945- dropdown . find ( 'a.ui.label.visible ' ) . each ( function ( ) {
973+ dropdown . find ( 'a.ui.label' ) . each ( function ( ) {
946974 var labelValue = $ ( this ) . attr ( 'data-value' ) ;
947975 if ( labelValue && $ ( this ) [ 0 ] !== $label [ 0 ] ) {
948976 currentValues . push ( parseInt ( labelValue ) ) ;
@@ -989,7 +1017,7 @@ function initializeDDNSDropdown() {
9891017
9901018 // 获取当前所有可见的标签
9911019 var currentValues = [ ] ;
992- dropdown . find ( 'a.ui.label.visible ' ) . each ( function ( ) {
1020+ dropdown . find ( 'a.ui.label' ) . each ( function ( ) {
9931021 var labelValue = $ ( this ) . attr ( 'data-value' ) ;
9941022 if ( labelValue ) {
9951023 currentValues . push ( parseInt ( labelValue ) ) ;
@@ -1013,7 +1041,7 @@ function initializeDDNSDropdown() {
10131041 // 更新隐藏的input值
10141042 var hiddenInput = dropdown . find ( 'input[type="hidden"]' ) ;
10151043 var currentValues = [ ] ;
1016- dropdown . find ( 'a.ui.label.visible ' ) . each ( function ( ) {
1044+ dropdown . find ( 'a.ui.label' ) . each ( function ( ) {
10171045 var labelValue = $ ( this ) . attr ( 'data-value' ) ;
10181046 if ( labelValue && $ ( this ) [ 0 ] !== $label [ 0 ] ) {
10191047 currentValues . push ( parseInt ( labelValue ) ) ;
0 commit comments