From 5c26bf4de3e5ff8f2263793c0eb0477bb871faff Mon Sep 17 00:00:00 2001 From: iliajie Date: Sat, 7 Jan 2023 19:59:10 +0200 Subject: [PATCH] Fix to prevent forcing using tables in tabs --- WebminCore.pm | 2 +- gray-theme/unauthenticated/gray-theme.css | 24 +++++++++++++ mailboxes/reply_mail.cgi | 44 +++++++++++------------ ui-lib.pl | 16 +++++++++ 4 files changed, 62 insertions(+), 24 deletions(-) diff --git a/WebminCore.pm b/WebminCore.pm index 88fba6e8c..261a95635 100644 --- a/WebminCore.pm +++ b/WebminCore.pm @@ -23,7 +23,7 @@ $main::export_to_caller = 1; # Add functions in web-lib-funcs.pl # Generated with : # grep -h "^sub " web-lib-funcs.pl ui-lib.pl | sed -e 's/sub //' | xargs echo -@EXPORT = qw(read_file read_file_cached read_file_cached_with_stat write_file html_escape html_strip quote_escape quote_javascript tempname_dir tempname transname transname_timestamped trunc indexof indexoflc sysprint check_ipaddress check_ip6address generate_icon urlize un_urlize include copydata ReadParseMime ReadParse read_fully read_parse_mime_callback read_parse_mime_javascript PrintHeader header get_html_title get_html_framed_title get_html_status_line popup_header footer popup_footer load_module_preferences load_theme_library redirect kill_byname kill_byname_logged find_byname error popup_error register_error_handler call_error_handlers error_setup wait_for fast_wait_for has_command make_date file_chooser_button popup_window_button popup_window_link read_acl acl_filename acl_check get_miniserv_config_file get_miniserv_config put_miniserv_config restart_miniserv reload_miniserv check_os_support http_download complete_http_download http_post ftp_download ftp_upload no_proxy open_socket download_timeout ftp_command to_ipaddress to_ip6address to_hostname icons_table replace_meta replace_file_line read_file_lines flush_file_lines unflush_file_lines unix_user_input unix_group_input hlink user_chooser_button group_chooser_button foreign_check foreign_exists foreign_available foreign_require foreign_call foreign_config foreign_installed foreign_defined get_system_hostname get_webmin_version get_webmin_version_release get_webmin_full_version get_module_acl get_group_module_acl save_module_acl save_group_module_acl init_config load_language_auto load_language text_subs text encode_base64 decode_base64 encode_base32 decode_base32 get_module_info get_all_module_infos list_themes get_theme_info list_languages safe_language read_env_file write_env_file lock_file unlock_file test_lock unlock_all_files can_lock_file webmin_log additional_log var_dump webmin_debug_log system_logged backquote_logged backquote_with_timeout backquote_command kill_logged rename_logged rename_file symlink_logged symlink_file link_file make_dir make_dir_recursive set_ownership_permissions unlink_logged unlink_file copy_source_dest move_source_dest remote_session_name remote_foreign_require remote_foreign_call remote_foreign_check remote_foreign_config remote_eval remote_write remote_read remote_finished remote_error_setup remote_rpc_call remote_multi_callback remote_multi_callback_error serialise_variable unserialise_variable other_groups date_chooser_button help_file seed_random disk_usage_kb recursive_disk_usage help_search_link make_http_connection validate_ssl_connection read_http_connection write_http_connection close_http_connection clean_environment reset_environment clean_language progress_callback switch_to_remote_user switch_to_unix_user eval_as_unix_user create_user_config_dirs create_missing_homedir filter_javascript resolve_links simplify_path same_file flush_webmin_caches list_usermods available_usermods get_available_module_infos get_visible_module_infos get_visible_modules_categories is_under_directory parse_http_url check_clicks_function load_entities_map entities_to_ascii get_product_name get_charset get_display_hostname save_module_config save_user_module_config nice_size get_perl_path get_goto_module select_all_link select_invert_link select_rows_link check_pid_file get_mod_lib module_root_directory list_mime_types guess_mime_type open_tempfile close_tempfile print_tempfile is_selinux_enabled get_clear_file_attributes reset_file_attributes cleanup_tempnames open_lock_tempfile END month_to_number number_to_month get_rbac_module_acl supports_rbac supports_ipv6 use_rbac_module_acl execute_command open_readfile open_execute_command translate_filename translate_command register_filename_callback register_command_callback capture_function_output capture_function_output_tempfile modules_chooser_button substitute_template substitute_pattern running_in_zone running_in_vserver running_in_xen running_in_openvz list_categories is_readonly_mode command_as_user list_osdn_mirrors convert_osdn_url get_current_dir supports_users supports_symlinks quote_path get_windows_root read_file_contents write_file_contents read_file_contents_limit unix_crypt split_quoted_string write_to_http_cache check_in_http_cache supports_javascript get_module_name get_module_variable clear_time_locale reset_time_locale callers_package web_libs_package get_userdb_string connect_userdb disconnect_userdb split_userdb_string uniquelc list_combined_webmin_menu list_modules_webmin_menu module_to_menu_item list_combined_system_info shell_is_bash compare_version_numbers convert_to_json convert_from_json print_json get_referer_relative get_webmin_email_url get_webmin_browser_url trim ui_link ui_help ui_img ui_link_button ui_table_start ui_table_end ui_table_row ui_table_hr ui_table_span ui_columns_start ui_columns_row ui_columns_header ui_checked_columns_row ui_radio_columns_row ui_columns_end ui_columns_table ui_form_columns_table ui_form_start ui_form_end ui_textbox ui_filebox ui_bytesbox ui_upload ui_password ui_hidden ui_select ui_multi_select ui_multi_select_javascript ui_radio ui_yesno_radio ui_checkbox ui_oneradio ui_textarea ui_user_textbox ui_users_textbox ui_group_textbox ui_groups_textbox ui_opt_textbox ui_submit ui_reset ui_button ui_date_input ui_buttons_start ui_buttons_end ui_buttons_row ui_buttons_hr ui_post_header ui_pre_footer ui_print_header ui_print_unbuffered_header ui_print_footer ui_config_link ui_print_endpage ui_subheading ui_links_row ui_hidden_javascript ui_hidden_start ui_hidden_end ui_hidden_table_row_start ui_hidden_table_row_end ui_hidden_table_start ui_hidden_table_end ui_tabs_start ui_tabs_end ui_tabs_start_tab ui_tabs_start_tabletab ui_tabs_end_tab ui_tabs_end_tabletab ui_max_text_width ui_radio_selector ui_radio_selector_javascript ui_grid_table ui_radio_table ui_up_down_arrows ui_hr ui_nav_link ui_confirmation_form ui_text_color ui_alert_box js_disable_inputs ui_page_flipper js_checkbox_disable js_redirect ui_webmin_link ui_line_break_double ui_details ui_hide_outside_of_viewport ui_read_file_contents_limit get_python_cmd get_buffer_size get_buffer_size_binary get_webprefix get_sub_ref_name setvar getvar delvar print_call_stack webmin_user_can_rpc webmin_user_login_mode webmin_user_is_admin webmin_user_is get_current_theme_info_cached miniserv_using_default_cert is_int float is_float); +@EXPORT = qw(read_file read_file_cached read_file_cached_with_stat write_file html_escape html_strip quote_escape quote_javascript tempname_dir tempname transname transname_timestamped trunc indexof indexoflc sysprint check_ipaddress check_ip6address generate_icon urlize un_urlize include copydata ReadParseMime ReadParse read_fully read_parse_mime_callback read_parse_mime_javascript PrintHeader header get_html_title get_html_framed_title get_html_status_line popup_header footer popup_footer load_module_preferences load_theme_library redirect kill_byname kill_byname_logged find_byname error popup_error register_error_handler call_error_handlers error_setup wait_for fast_wait_for has_command make_date file_chooser_button popup_window_button popup_window_link read_acl acl_filename acl_check get_miniserv_config_file get_miniserv_config put_miniserv_config restart_miniserv reload_miniserv check_os_support http_download complete_http_download http_post ftp_download ftp_upload no_proxy open_socket download_timeout ftp_command to_ipaddress to_ip6address to_hostname icons_table replace_meta replace_file_line read_file_lines flush_file_lines unflush_file_lines unix_user_input unix_group_input hlink user_chooser_button group_chooser_button foreign_check foreign_exists foreign_available foreign_require foreign_call foreign_config foreign_installed foreign_defined get_system_hostname get_webmin_version get_webmin_version_release get_webmin_full_version get_module_acl get_group_module_acl save_module_acl save_group_module_acl init_config load_language_auto load_language text_subs text encode_base64 decode_base64 encode_base32 decode_base32 get_module_info get_all_module_infos list_themes get_theme_info list_languages safe_language read_env_file write_env_file lock_file unlock_file test_lock unlock_all_files can_lock_file webmin_log additional_log var_dump webmin_debug_log system_logged backquote_logged backquote_with_timeout backquote_command kill_logged rename_logged rename_file symlink_logged symlink_file link_file make_dir make_dir_recursive set_ownership_permissions unlink_logged unlink_file copy_source_dest move_source_dest remote_session_name remote_foreign_require remote_foreign_call remote_foreign_check remote_foreign_config remote_eval remote_write remote_read remote_finished remote_error_setup remote_rpc_call remote_multi_callback remote_multi_callback_error serialise_variable unserialise_variable other_groups date_chooser_button help_file seed_random disk_usage_kb recursive_disk_usage help_search_link make_http_connection validate_ssl_connection read_http_connection write_http_connection close_http_connection clean_environment reset_environment clean_language progress_callback switch_to_remote_user switch_to_unix_user eval_as_unix_user create_user_config_dirs create_missing_homedir filter_javascript resolve_links simplify_path same_file flush_webmin_caches list_usermods available_usermods get_available_module_infos get_visible_module_infos get_visible_modules_categories is_under_directory parse_http_url check_clicks_function load_entities_map entities_to_ascii get_product_name get_charset get_display_hostname save_module_config save_user_module_config nice_size get_perl_path get_goto_module select_all_link select_invert_link select_rows_link check_pid_file get_mod_lib module_root_directory list_mime_types guess_mime_type open_tempfile close_tempfile print_tempfile is_selinux_enabled get_clear_file_attributes reset_file_attributes cleanup_tempnames open_lock_tempfile END month_to_number number_to_month get_rbac_module_acl supports_rbac supports_ipv6 use_rbac_module_acl execute_command open_readfile open_execute_command translate_filename translate_command register_filename_callback register_command_callback capture_function_output capture_function_output_tempfile modules_chooser_button substitute_template substitute_pattern running_in_zone running_in_vserver running_in_xen running_in_openvz list_categories is_readonly_mode command_as_user list_osdn_mirrors convert_osdn_url get_current_dir supports_users supports_symlinks quote_path get_windows_root read_file_contents write_file_contents read_file_contents_limit unix_crypt split_quoted_string write_to_http_cache check_in_http_cache supports_javascript get_module_name get_module_variable clear_time_locale reset_time_locale callers_package web_libs_package get_userdb_string connect_userdb disconnect_userdb split_userdb_string uniquelc list_combined_webmin_menu list_modules_webmin_menu module_to_menu_item list_combined_system_info shell_is_bash compare_version_numbers convert_to_json convert_from_json print_json get_referer_relative get_webmin_email_url get_webmin_browser_url trim ui_link ui_help ui_img ui_link_button ui_table_start ui_table_end ui_table_row ui_table_hr ui_table_span ui_columns_start ui_columns_row ui_columns_header ui_checked_columns_row ui_radio_columns_row ui_columns_end ui_columns_table ui_form_columns_table ui_form_start ui_form_end ui_textbox ui_filebox ui_bytesbox ui_upload ui_password ui_hidden ui_select ui_multi_select ui_multi_select_javascript ui_radio ui_yesno_radio ui_checkbox ui_oneradio ui_textarea ui_user_textbox ui_users_textbox ui_group_textbox ui_groups_textbox ui_opt_textbox ui_submit ui_reset ui_button ui_date_input ui_buttons_start ui_buttons_end ui_buttons_row ui_buttons_hr ui_post_header ui_pre_footer ui_print_header ui_print_unbuffered_header ui_print_footer ui_config_link ui_print_endpage ui_subheading ui_links_row ui_hidden_javascript ui_hidden_start ui_hidden_end ui_hidden_table_row_start ui_hidden_table_row_end ui_hidden_table_start ui_hidden_table_end ui_tabs_start ui_tabs_end ui_tabs_start_tab ui_tabs_start_tabletab ui_tabs_end_tab ui_tabs_end_tabletab ui_max_text_width ui_radio_selector ui_radio_selector_javascript ui_grid_table ui_radio_table ui_up_down_arrows ui_hr ui_nav_link ui_confirmation_form ui_text_color ui_alert_box js_disable_inputs ui_page_flipper js_checkbox_disable js_redirect ui_webmin_link ui_line_break_double ui_details ui_div_row ui_hide_outside_of_viewport ui_read_file_contents_limit get_python_cmd get_buffer_size get_buffer_size_binary get_webprefix get_sub_ref_name setvar getvar delvar print_call_stack webmin_user_can_rpc webmin_user_login_mode webmin_user_is_admin webmin_user_is get_current_theme_info_cached miniserv_using_default_cert is_int float is_float); # Add global variables in web-lib.pl push(@EXPORT, qw(&unique)); diff --git a/gray-theme/unauthenticated/gray-theme.css b/gray-theme/unauthenticated/gray-theme.css index a342f0b79..f8b11812b 100644 --- a/gray-theme/unauthenticated/gray-theme.css +++ b/gray-theme/unauthenticated/gray-theme.css @@ -526,4 +526,28 @@ body > .mode > b:has(i.ff-usermin) > .ff-usermin { body > .mode > b:has(i.ff-cloudmin), body > .mode > b:has(i.ff-cloudmin) > .ff-cloudmin { color: #cb6d2f; +} + +/* ui_div_row */ +.ui_div_row { + margin: 4px 0; +} +.ui_div_row + .ui_div_row { + margin: 0 0 4px 0; +} +.ui_div_row span:first-child { + width: 100px; + min-width: 10%; + max-width: 15%; + display: inline-block; + vertical-align: top; + padding-top: 4px; + text-align: right; + padding-right: 8px; + font-weight: bold; +} +.ui_div_row span:last-child { + padding-top: 4px; + display: inline-block; + max-width: 80%; } \ No newline at end of file diff --git a/mailboxes/reply_mail.cgi b/mailboxes/reply_mail.cgi index 744e8fc71..a6c69ee89 100755 --- a/mailboxes/reply_mail.cgi +++ b/mailboxes/reply_mail.cgi @@ -353,13 +353,13 @@ print &ui_hidden("charset", $main::force_charset); # Start tabs for from / to / cc / bcc # Subject is separate print &ui_table_start($text{'reply_headers'}, "width=100%", 2); -@tds = ( "width=10%", "width=90% nowrap" ); +print ""; @tabs = ( [ "from", $text{'reply_tabfrom'} ], [ "to", $text{'reply_tabto'} ], [ "cc", $text{'reply_tabcc'} ], [ "bcc", $text{'reply_tabbcc'} ], [ "options", $text{'reply_taboptions'} ] ); -print &ui_table_row(undef, &ui_tabs_start(\@tabs, "tab", "to", 0), 2); +print &ui_tabs_start(\@tabs, "tab", "to", 0); # From address tab $from ||= &get_user_from_address(\@uinfo); @@ -391,45 +391,43 @@ elsif ($access{'fmode'} == 3) { $frominput = "$ouser\@$access{'from'}". &ui_hidden("from", "$ouser\@$access{'from'}"); } -print &ui_tabs_start_tabletab("tab", "from"); -print &ui_table_row($text{'mail_from'}, $frominput, 1, \@tds); -print &ui_tabs_end_tabletab(); +print &ui_tabs_start_tab("tab", "from"); +print &ui_div_row($text{'mail_from'}, $frominput); +print &ui_tabs_end_tab(); # Show To: field -print &ui_tabs_start_tabletab("tab", "to"); -print &ui_table_row($text{'mail_to'}, &ui_address_field("to", $to, 0, 1), - 1, \@tds); -print &ui_tabs_end_tabletab(); +print &ui_tabs_start_tab("tab", "to"); +print &ui_div_row($text{'mail_to'}, &ui_address_field("to", $to, 0, 1)); +print &ui_tabs_end_tab(); # Show Cc: field -print &ui_tabs_start_tabletab("tab", "cc"); -print &ui_table_row($text{'mail_cc'}, &ui_address_field("cc", $cc, 0, 1), - 1, \@tds); -print &ui_tabs_end_tabletab(); +print &ui_tabs_start_tab("tab", "cc"); +print &ui_div_row($text{'mail_cc'}, &ui_address_field("cc", $cc, 0, 1)); +print &ui_tabs_end_tab(); # Show Bcc: field $bcc ||= $config{'bcc_to'}; -print &ui_tabs_start_tabletab("tab", "bcc"); -print &ui_table_row($text{'mail_bcc'}, &ui_address_field("bcc", $bcc, 0, 1), - 1, \@tds); -print &ui_tabs_end_tabletab(); +print &ui_tabs_start_tab("tab", "bcc"); +print &ui_div_row($text{'mail_bcc'}, &ui_address_field("bcc", $bcc, 0, 1)); +print &ui_tabs_end_tab(); # Show tab for options -print &ui_tabs_start_tabletab("tab", "options"); -print &ui_table_row($text{'mail_pri'}, +print &ui_tabs_start_tab("tab", "options"); +print &ui_div_row($text{'mail_pri'}, &ui_select("pri", "", [ [ 1, $text{'mail_highest'} ], [ 2, $text{'mail_high'} ], [ "", $text{'mail_normal'} ], [ 4, $text{'mail_low'} ], - [ 5, $text{'mail_lowest'} ] ]), 1, \@tds); -print &ui_tabs_end_tabletab(); + [ 5, $text{'mail_lowest'} ] ])); +print &ui_tabs_end_tab(); print &ui_tabs_end(); # Subject field, outside tabs -print &ui_table_row($text{'mail_subject'}, +print &ui_div_row($text{'mail_subject'}, &ui_textbox("subject", $subject, 40, 0, undef, - "style='width:95%'"), 1, \@tds); + "style='width:95%'")); +print ""; print &ui_table_end(); # Create link for switching to HTML/text mode for new mail diff --git a/ui-lib.pl b/ui-lib.pl index becf1237f..95e361be9 100755 --- a/ui-lib.pl +++ b/ui-lib.pl @@ -2755,6 +2755,22 @@ $rv .= ""; return $rv; } +=head2 ui_div_row(label, content) + +Prints a row without using a table and +places label and content in a way +ui_table_row does + +=cut +sub ui_div_row +{ +if (defined(&theme_ui_div_row)) { + return &theme_ui_div_row(@_); + } +my ($label, $content) = @_; +return "
$label$content
"; +} + =head2 ui_hide_outside_of_viewport(elem) Prints element if not in viewport. Useful