diff --git a/admin/security_roles.php b/admin/security_roles.php index 4b438091f..1c110eb7b 100644 --- a/admin/security_roles.php +++ b/admin/security_roles.php @@ -177,7 +177,6 @@ function clear_data() check_cells(_("Show inactive:"), 'show_inactive', null, true); end_row(); end_table(); -echo "
"; if (get_post('_show_inactive_update')) { $Ajax->activate('role'); diff --git a/gl/includes/ui/gl_bank_ui.inc b/gl/includes/ui/gl_bank_ui.inc index b5a0932bc..3dde67332 100644 --- a/gl/includes/ui/gl_bank_ui.inc +++ b/gl/includes/ui/gl_bank_ui.inc @@ -248,7 +248,7 @@ function gl_edit_item_controls(&$order, $dim, $Index=null) $_POST['code_id'] = get_company_pref($payment ? 'default_cogs_act':'default_inv_sales_act'); } - echo gl_all_accounts_list('code_id', null, true, true); + ControlRenderer::get()->table_add_cells(gl_all_accounts_list('code_id', null, true, true)); if ($dim >= 1) dimensions_list_cells(null, 'dimension_id', null, true, " ", false, 1); if ($dim > 1) diff --git a/includes/ui/ControlRenderer.inc b/includes/ui/ControlRenderer.inc new file mode 100644 index 000000000..26f39aa51 --- /dev/null +++ b/includes/ui/ControlRenderer.inc @@ -0,0 +1,708 @@ +. +***********************************************************************/ + +include_once('InputRenderer.inc'); + +// --------------------------------------------------------------------------------- +class ControlRenderer +{ + /** + * + * @param ControlRenderer $controlRenderer + * @return ControlRenderer + */ + public static function get($controlRenderer = null) + { + global $path_to_root; + static $instance = null; + if ($controlRenderer != null) { + $instance = $controlRenderer; + } + if ($instance == null) { + // Give the theme an opportunity to register a custom renderer + $themeName = user_theme(); + if ($themeName) { + include_once($path_to_root . "/themes/".$themeName."/renderer.php"); + } + // Otherwise create the default renderer + if ($instance == null) { + $instance = new ControlRenderer(); + } + } + return $instance; + } + + private $form_nested; + + function ControlRenderer() { + $this->form_nested = -1; + } + + function start_form($multi = false, $dummy = false, $action = "", $name = "") + { + // $dummy - leaved for compatibility with 2.0 API + + if (++$this->form_nested) return; + + if ($name != "") + $name = "name='$name'"; + if ($action == "") + $action = $_SERVER['PHP_SELF']; + + if ($multi) + echo "
\n"; + else + echo "\n"; + } + + private function output_hidden() + { + InputRenderer::get()->output_hidden(); + } + + // --------------------------------------------------------------------------------- + function end_form($breaks = 0) + { + global $Ajax; + + if ($this->form_nested-- > 0) return; + + $_SESSION['csrf_token'] = hash('sha256', uniqid(mt_rand(), true)); + if ($breaks) + br($breaks); + hidden('_focus'); + hidden('_modified', get_post('_modified', 0)); + hidden('_confirmed'); // helper for final form confirmation + hidden('_token', $_SESSION['csrf_token']); + + $this->output_hidden(); + echo "
\n"; + $Ajax->activate('_token'); + $Ajax->activate('_confirmed'); + } + + function check_csrf_token() + { + if ($_SESSION['csrf_token'] != @$_POST['_token']) + { + display_error(_("Request from outside of this page is forbidden.")); + error_log(_("CSRF attack detected from: ") . @$_SERVER['HTTP_HOST'] . ' (' . @$_SERVER['HTTP_REFERER'] . ')'); + return false; + } + return true; + } + + function start_table($class = false, $extra = "", $padding = '2', $spacing = '0') + { + echo "
\n"; + } + + function end_table($breaks = 0) + { + echo "
\n"; + $this->output_hidden(); + if ($breaks) + br($breaks); + } + + function start_outer_table($class = false, $extra = "", $padding = '2', $spacing = '0', $br = false) + { + if ($br) + br(); + start_table($class, $extra, $padding, $spacing); + echo "\n"; // outer table + } + + function table_section($number = 1, $width = false) + { + if ($number > 1) + { + echo "\n"; + $this->output_hidden(); + $width = ($width ? "width='$width'" : ""); + echo "\n"; // outer table + } + echo "\n"; + } + + function end_outer_table($breaks = 0, $close_table = true) + { + if ($close_table) + { + echo "
\n"; + $this->output_hidden(); + } + echo "\n"; + end_table($breaks); + } + // + // outer table spacer + // + function vertical_space($params = '') + { + echo ""; + } + + function meta_forward($forward_to, $params = "", $timeout=0) + { + global $Ajax; + echo "\n"; + echo "

" . _("You should automatically be forwarded."); + echo " " . _("If this does not happen") . " " . "" . _("click here") . " " . _("to continue") . ".

\n"; + if ($params !='') $params = '?'.$params; + + $Ajax->redirect($forward_to . $params); + exit(); + } + + // ----------------------------------------------------------------------------------- + // Find and replace hotkey marker. + // if $clean == true marker is removed and clean label is returned + // (for use in wiki help system), otherwise result is array of label + // with underlined hotkey letter and access property string. + // + function access_string($label, $clean = false) + { + $access = ''; + $slices = array(); + + if (preg_match('/(.*)&([a-zA-Z0-9])(.*)/', $label, $slices)) + { + $label = $clean ? $slices[1] . $slices[2] . $slices[3] : $slices[1] . '' . $slices[2] . '' . $slices[3]; + $access = " accesskey='" . strtoupper($slices[2]) . "'"; + } + + $label = str_replace('&&', '&', $label); + + return $clean ? $label : array($label, $access); + } + + function hyperlink_back($center = true, $no_menu = true, $type_no = 0, $trans_no = 0, $final = false) + { + global $path_to_root; + + if ($center) + echo "
"; + $id = 0; + if ($no_menu && $trans_no != 0) + { + include_once ($path_to_root . "/admin/db/attachments_db.inc"); + $id = has_attachment($type_no, $trans_no); + $attach = get_attachment_string($type_no, $trans_no); + echo $attach; + } + $width = ($id != 0 ? "30%" : "20%"); + start_table(false, "width=$width"); + start_row(); + if ($no_menu) + { + echo "" . _("Print") . "\n"; + } + echo "" . ($no_menu ? _("Close") : _("Back")) . "\n"; + end_row(); + end_table(); + if ($center) + echo "
"; + echo "
"; + } + + function hyperlink_no_params($target, $label, $center = true) + { + $id = default_focus(); + $pars = access_string($label); + if ($target == '') + $target = $_SERVER['PHP_SELF']; + if ($center) + echo "
"; + echo "$pars[0]\n"; + if ($center) + echo "
"; + } + + function hyperlink_no_params_td($target, $label) + { + echo ""; + hyperlink_no_params($target, $label); + echo "\n"; + } + + function viewer_link($label, $url = '', $class = '', $id = '', $icon = null) + { + global $path_to_root; + + if ($class != '') + $class = " class='$class'"; + + if ($id != '') + $class = " id='$id'"; + + if ($url != "") + { + $pars = access_string($label); + if (user_graphic_links() && $icon) + $pars[0] = set_icon($icon, $pars[0]); + $preview_str = "$pars[0]"; + } + else + $preview_str = $label; + return $preview_str; + } + + function menu_link($url, $label, $id = null) + { + global $path_to_root; + + $id = default_focus($id); + $pars = access_string($label); + + // REVIEW: The addition of $path_to_root to $url seems unnecessary or wrong CJP 2016-01 + if ($url[0] != '/') + $url = '/'.$url; + $url = $path_to_root.$url; + return "$pars[0]"; + } + + function submenu_option($title, $url, $id = null) + { + display_note(menu_link($url, $title, $id), 0, 1); + } + + function submenu_view($title, $type, $number, $id = null) + { + display_note(get_trans_view_str($type, $number, $title, false, 'viewlink', $id), 0, 1); + } + + function submenu_print($title, $type, $number, $id = null, $email = 0, $extra = 0) + { + display_note(print_document_link($number, $title, true, $type, false, 'printlink', $id, $email, $extra), 0, 1); + } + // ----------------------------------------------------------------------------------- + function hyperlink_params($target, $label, $params, $center = true) + { + $id = default_focus(); + + $pars = access_string($label); + if ($target == '') + $target = $_SERVER['PHP_SELF']; + if ($center) + echo "
"; + echo "$pars[0]\n"; + if ($center) + echo "
"; + } + + function hyperlink_params_td($target, $label, $params) + { + echo ""; + hyperlink_params($target, $label, $params, false); + echo "\n"; + } + + // ----------------------------------------------------------------------------------- + function hyperlink_params_separate($target, $label, $params, $center = false) + { + $id = default_focus(); + + $pars = access_string($label); + if ($center) + echo "
"; + echo "$pars[0]\n"; + if ($center) + echo "
"; + } + + function hyperlink_params_separate_td($target, $label, $params) + { + echo ""; + hyperlink_params_separate($target, $label, $params); + echo "\n"; + } + + // -------------------------------------------------------------------------------------------------- + function alt_table_row_color(&$k, $extra_class = null) + { + $classes = $extra_class ? array($extra_class) : array(); + if ($k == 1) + { + array_push($classes, 'oddrow'); + $k = 0; + } + else + { + array_push($classes, 'evenrow'); + $k ++; + } + echo "\n"; + } + + function table_section_title($msg, $colspan = 2) + { + echo "$msg\n"; + } + + function table_header($labels, $params = '') + { + start_row(); + foreach ($labels as $label) + labelheader_cell($label, $params); + end_row(); + } + // ----------------------------------------------------------------------------------- + function start_row($param = "") + { + if ($param != "") + echo "\n"; + else + echo "\n"; + } + + function end_row() + { + echo "\n"; + } + + /** + * @param array | string $cells + */ + function table_add_cells($cells) + { + if (is_array($cells)) { + foreach ($cells as $cell) { + echo $cell; + } + } else { + echo $cells; + } + } + + function br($num = 1) + { + for ($i = 0; $i < $num; $i ++) + echo "
"; + } + + var $ajax_divs = array(); + + function div_start($id = '', $trigger = null, $non_ajax = false) + { + if ($non_ajax) { // div for non-ajax elements + array_push($this->ajax_divs, array($id, null)); + echo "