161161 }
162162 });
163163 }
164+
165+ // Toggle dependency enforcement
166+ // AgentEnabled requires FtpEnabled AND RconEnabled
167+ // BanFileSyncEnabled requires FtpEnabled AND AgentEnabled
168+ function enforceToggleDependencies () {
169+ var ftp = document .getElementById (' GameServer_FtpEnabled' );
170+ var rcon = document .getElementById (' GameServer_RconEnabled' );
171+ var agent = document .getElementById (' GameServer_AgentEnabled' );
172+ var banSync = document .getElementById (' GameServer_BanFileSyncEnabled' );
173+
174+ if (! ftp || ! rcon || ! agent || ! banSync) return ;
175+
176+ // If Agent is checked but prerequisites aren't met, uncheck it
177+ if (agent .checked && (! ftp .checked || ! rcon .checked )) {
178+ agent .checked = false ;
179+ agent .dispatchEvent (new Event (' change' ));
180+ }
181+
182+ // If BanFileSync is checked but prerequisites aren't met, uncheck it
183+ if (banSync .checked && (! ftp .checked || ! agent .checked )) {
184+ banSync .checked = false ;
185+ banSync .dispatchEvent (new Event (' change' ));
186+ }
187+
188+ // Visual state for Agent
189+ var agentSwitch = agent .closest (' .form-check' );
190+ if (agentSwitch) {
191+ agentSwitch .classList .toggle (' opacity-50' , ! ftp .checked || ! rcon .checked );
192+ }
193+
194+ // Visual state for BanFileSync
195+ var banSyncSwitch = banSync .closest (' .form-check' );
196+ if (banSyncSwitch) {
197+ banSyncSwitch .classList .toggle (' opacity-50' , ! ftp .checked || ! agent .checked );
198+ }
199+ }
200+
201+ enforceToggleDependencies ();
202+
203+ [' GameServer_FtpEnabled' , ' GameServer_RconEnabled' , ' GameServer_AgentEnabled' ].forEach (function (id ) {
204+ var el = document .getElementById (id);
205+ if (el) el .addEventListener (' change' , enforceToggleDependencies);
206+ });
164207 < / script>
165208}
0 commit comments