@@ -102,10 +102,10 @@ protected function _renderContent() {
102102 $ gemini_key = get_option ( 'visualizer_gemini_api_key ' , '' );
103103 $ claude_key = get_option ( 'visualizer_claude_api_key ' , '' );
104104
105- // Mask the keys for display (but allow full editing )
106- $ openai_key_display = $ this -> _maskAPIKey ( $ openai_key );
107- $ gemini_key_display = $ this -> _maskAPIKey ( $ gemini_key );
108- $ claude_key_display = $ this -> _maskAPIKey ( $ claude_key );
105+ // Check if keys exist (for placeholder text )
106+ $ has_openai_key = ! empty ( $ openai_key );
107+ $ has_gemini_key = ! empty ( $ gemini_key );
108+ $ has_claude_key = ! empty ( $ claude_key );
109109
110110 echo '<form method="post" action=""> ' ;
111111 wp_nonce_field ( 'visualizer_ai_settings ' , 'visualizer_ai_settings_nonce ' );
@@ -116,7 +116,12 @@ protected function _renderContent() {
116116 echo '<tr> ' ;
117117 echo '<th scope="row"><label for="visualizer_openai_api_key"> ' . esc_html__ ( 'OpenAI API Key (ChatGPT) ' , 'visualizer ' ) . '</label></th> ' ;
118118 echo '<td> ' ;
119- echo '<input type="text" id="visualizer_openai_api_key" name="visualizer_openai_api_key" value=" ' . esc_attr ( $ openai_key ) . '" class="regular-text visualizer-api-key-input" data-masked=" ' . esc_attr ( $ openai_key_display ) . '" data-full=" ' . esc_attr ( $ openai_key ) . '" /> ' ;
119+ echo '<div style="position: relative; display: inline-block; width: 100%;"> ' ;
120+ echo '<input type="password" id="visualizer_openai_api_key" name="visualizer_openai_api_key" value=" ' . esc_attr ( $ openai_key ) . '" class="regular-text visualizer-api-key-input" placeholder=" ' . ( $ has_openai_key ? esc_attr__ ( 'API key is set (enter new key to replace) ' , 'visualizer ' ) : '' ) . '" autocomplete="off" /> ' ;
121+ echo '<button type="button" class="button visualizer-toggle-key" data-target="visualizer_openai_api_key" style="margin-left: 5px; vertical-align: top;"> ' ;
122+ echo '<span class="dashicons dashicons-visibility" style="margin-top: 3px;"></span> ' ;
123+ echo '</button> ' ;
124+ echo '</div> ' ;
120125 echo '<p class="description"> ' . esc_html__ ( 'Enter your OpenAI API key to enable ChatGPT integration. ' , 'visualizer ' ) . ' <a href="https://platform.openai.com/api-keys" target="_blank"> ' . esc_html__ ( 'Get API Key ' , 'visualizer ' ) . '</a></p> ' ;
121126 echo '</td> ' ;
122127 echo '</tr> ' ;
@@ -125,7 +130,12 @@ protected function _renderContent() {
125130 echo '<tr> ' ;
126131 echo '<th scope="row"><label for="visualizer_gemini_api_key"> ' . esc_html__ ( 'Google Gemini API Key ' , 'visualizer ' ) . '</label></th> ' ;
127132 echo '<td> ' ;
128- echo '<input type="text" id="visualizer_gemini_api_key" name="visualizer_gemini_api_key" value=" ' . esc_attr ( $ gemini_key ) . '" class="regular-text visualizer-api-key-input" data-masked=" ' . esc_attr ( $ gemini_key_display ) . '" data-full=" ' . esc_attr ( $ gemini_key ) . '" /> ' ;
133+ echo '<div style="position: relative; display: inline-block; width: 100%;"> ' ;
134+ echo '<input type="password" id="visualizer_gemini_api_key" name="visualizer_gemini_api_key" value=" ' . esc_attr ( $ gemini_key ) . '" class="regular-text visualizer-api-key-input" placeholder=" ' . ( $ has_gemini_key ? esc_attr__ ( 'API key is set (enter new key to replace) ' , 'visualizer ' ) : '' ) . '" autocomplete="off" /> ' ;
135+ echo '<button type="button" class="button visualizer-toggle-key" data-target="visualizer_gemini_api_key" style="margin-left: 5px; vertical-align: top;"> ' ;
136+ echo '<span class="dashicons dashicons-visibility" style="margin-top: 3px;"></span> ' ;
137+ echo '</button> ' ;
138+ echo '</div> ' ;
129139 echo '<p class="description"> ' . esc_html__ ( 'Enter your Google Gemini API key. ' , 'visualizer ' ) . ' <a href="https://makersuite.google.com/app/apikey" target="_blank"> ' . esc_html__ ( 'Get API Key ' , 'visualizer ' ) . '</a></p> ' ;
130140 echo '</td> ' ;
131141 echo '</tr> ' ;
@@ -134,7 +144,12 @@ protected function _renderContent() {
134144 echo '<tr> ' ;
135145 echo '<th scope="row"><label for="visualizer_claude_api_key"> ' . esc_html__ ( 'Anthropic Claude API Key ' , 'visualizer ' ) . '</label></th> ' ;
136146 echo '<td> ' ;
137- echo '<input type="text" id="visualizer_claude_api_key" name="visualizer_claude_api_key" value=" ' . esc_attr ( $ claude_key ) . '" class="regular-text visualizer-api-key-input" data-masked=" ' . esc_attr ( $ claude_key_display ) . '" data-full=" ' . esc_attr ( $ claude_key ) . '" /> ' ;
147+ echo '<div style="position: relative; display: inline-block; width: 100%;"> ' ;
148+ echo '<input type="password" id="visualizer_claude_api_key" name="visualizer_claude_api_key" value=" ' . esc_attr ( $ claude_key ) . '" class="regular-text visualizer-api-key-input" placeholder=" ' . ( $ has_claude_key ? esc_attr__ ( 'API key is set (enter new key to replace) ' , 'visualizer ' ) : '' ) . '" autocomplete="off" /> ' ;
149+ echo '<button type="button" class="button visualizer-toggle-key" data-target="visualizer_claude_api_key" style="margin-left: 5px; vertical-align: top;"> ' ;
150+ echo '<span class="dashicons dashicons-visibility" style="margin-top: 3px;"></span> ' ;
151+ echo '</button> ' ;
152+ echo '</div> ' ;
138153 echo '<p class="description"> ' . esc_html__ ( 'Enter your Anthropic Claude API key. ' , 'visualizer ' ) . ' <a href="https://console.anthropic.com/account/keys" target="_blank"> ' . esc_html__ ( 'Get API Key ' , 'visualizer ' ) . '</a></p> ' ;
139154 echo '</td> ' ;
140155 echo '</tr> ' ;
@@ -147,39 +162,23 @@ protected function _renderContent() {
147162
148163 echo '</form> ' ;
149164
150- // Add JavaScript to handle API key masking
165+ // Add JavaScript to handle show/hide toggle
151166 ?>
152167 <script type="text/javascript">
153168 jQuery(document).ready(function($) {
154- $('.visualizer-api-key-input').each(function() {
155- var $input = $(this);
156- var masked = $input.attr('data-masked');
157- var full = $input.attr('data-full');
158-
159- // Show masked value initially if key exists
160- if (full && masked) {
161- $input.val(masked);
169+ $('.visualizer-toggle-key').on('click', function() {
170+ var $button = $(this);
171+ var targetId = $button.attr('data-target');
172+ var $input = $('#' + targetId);
173+ var $icon = $button.find('.dashicons');
174+
175+ if ($input.attr('type') === 'password') {
162176 $input.attr('type', 'text');
177+ $icon.removeClass('dashicons-visibility').addClass('dashicons-hidden');
178+ } else {
179+ $input.attr('type', 'password');
180+ $icon.removeClass('dashicons-hidden').addClass('dashicons-visibility');
163181 }
164-
165- // On focus, show full key for editing
166- $input.on('focus', function() {
167- if ($input.val() === masked && full) {
168- $input.val(full);
169- $input.select();
170- }
171- });
172-
173- // On blur, mask again if unchanged
174- $input.on('blur', function() {
175- var currentVal = $input.val();
176- if (currentVal === full && masked) {
177- $input.val(masked);
178- } else if (currentVal !== full && currentVal !== masked && currentVal !== '') {
179- // New value entered, update full value
180- $input.attr('data-full', currentVal);
181- }
182- });
183182 });
184183 });
185184 </script>
0 commit comments