diff --git a/_SQL/zmeny_3.4.5.655.sql.php b/_SQL/zmeny_3.4.5.655.sql.php index 9375ad0..8f044d1 100644 --- a/_SQL/zmeny_3.4.5.655.sql.php +++ b/_SQL/zmeny_3.4.5.655.sql.php @@ -16,6 +16,11 @@ # *** pridani sloupcu pro dopravu $sql[1] = 'ALTER TABLE `'.TBL_RACE.'` ADD `kapacita` SMALLINT NULL DEFAULT NULL AFTER `ubytovani`'; +$sql[2] = 'ALTER TABLE `'.TBL_RACE.'` ADD `prihlasenych` SMALLINT NOT NULL DEFAULT 0 AFTER `kapacita`'; +$sql[3] = 'ALTER TABLE `'.TBL_RACE.'` ENGINE=InnoDB;'; + +$sql[4] = 'UPDATE `'.TBL_RACE.'` r LEFT JOIN ( SELECT id_zavod, COUNT(*) AS cnt FROM `'.TBL_ZAVXUS. +'` GROUP BY id_zavod ) z ON z.id_zavod = r.id SET r.prihlasenych = COALESCE(z.cnt, 0);'; //############################################################################# diff --git a/_terminy_rg.php b/_terminy_rg.php deleted file mode 100644 index aa869a2..0000000 --- a/_terminy_rg.php +++ /dev/null @@ -1,134 +0,0 @@ - - - -
-
-

Přehled přihlášek pro přihlašovatele

-

-= '.$d1.' || datum2 >= '.$d1.' ORDER BY datum, datum2, id'; - -@$vysledek=query_db($query); - -if (mysqli_num_rows($vysledek) > 0) -{ - echo(''."\n"); - echo(''); - echo(''); - echo(''); - echo(''); - echo(''); - echo(''); - echo(''); - echo(''); - echo(''); - echo(''); - echo(''."\n"); - echo(''); - echo(''); - echo(''); - echo(''."\n"); - while ($zaznam=mysqli_fetch_array($vysledek)) - { - $termin_class = 'center'; - $termin2_class = 'center'; - echo(''); - if($zaznam['vicedenni']) - $datum=Date2StringFT($zaznam['datum'],$zaznam['datum2']); - else - $datum=Date2String($zaznam['datum']); - - //---------------------------- - if($zaznam['prihlasky'] > 0 && $zaznam['prihlasky1'] != 0) - { - $termin = _Reg2Str(_GetOldReg($zaznam,$curr_date)); - $termin2 = _Reg2Str(_GetNewReg($zaznam,$curr_date)); - $termin_class = _GetOldRegClass($zaznam,$curr_date); - $termin2_class = _GetNewRegClass($zaznam,$curr_date); - } - else - { - $termin_class = 'center_gray'; - $termin2_class = 'center_gray'; - $termin = '?'; - $termin2 = '?'; - } - //---------------------------- - - if($zaznam['send'] > 0) - { - if($zaznam['prihlasky'] > 1) - $send = $zaznam['send'].'.t.'; - else - $send = 'Ano'; - } - else - $send = 'Ne'; - $nazev = GetFormatedTextDel($zaznam['nazev'], $zaznam['cancelled']); - $oddil = $zaznam['oddil']; - $odkaz = GetRaceLinkHTML($zaznam['odkaz']); - echo(''); - echo(''); - echo(''); - echo(''); - echo(''); - echo(''); - echo(''); - echo(''); - echo(''); - echo(''); - echo(''."\n"); - } - echo('
DatumNázevPoř.TSWTermín přihlášekOPPomocný seznam termínů
bylbude
'.$datum.''.$nazev.''.$oddil.''.GetRaceType0($zaznam['typ0']).''.GetRaceTypeImg($zaznam['typ']).''.$odkaz.''.$termin.''.$termin2.''.$send.''.Term_list($zaznam).'
'."\n"); -} -else -{ - echo('V nejbližších '.GC_SHOW_REG_DAYS.' dnech není žádná přihláška na závod.'); -} -?> -
-
-'); -_print_global_RT_difference_TS(); -echo("


\n"); -?> -
- \ No newline at end of file diff --git a/api/race.php b/api/race.php index 892ab62..e906969 100644 --- a/api/race.php +++ b/api/race.php @@ -151,11 +151,13 @@ } // check whether the user is already signed in - $output = db_execute("SELECT * FROM " . TBL_ZAVXUS . " WHERE id_zavod = ? AND id_user = ? LIMIT 1", $race_id, $user_id);; + $output = db_execute("SELECT * FROM " . TBL_ZAVXUS . " WHERE id_zavod = ? AND id_user = ? LIMIT 1", $race_id, $user_id); $output = $output->fetch_assoc(); if ($output == null) { // if not, create a new row with given values db_execute("INSERT INTO " . TBL_ZAVXUS . " (id_user, id_zavod, kat, pozn, pozn_in, termin, transport, sedadel, ubytovani) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", $user_id, $race_id, $category, $note, $note_internal, $termin, $transport, $sedadel, $accommodation); + // db_execute zde patrne nema navratovou hodnotu + db_execute("UPDATE " .TBL_RACE . " SET prihlasenych = prihlasenych + 1 WHERE id = ?", $race_id); } else { // else, update the row $id = $output["id"]; db_execute("UPDATE " . TBL_ZAVXUS . " SET kat = ?, pozn = ?, pozn_in = ?, termin = ?, transport = ?, sedadel = ?, ubytovani = ? WHERE id = ?", $category, $note, $note_internal, $termin, $transport, $sedadel, $accommodation, $id); @@ -186,7 +188,9 @@ } db_execute("DELETE FROM " . TBL_ZAVXUS . " WHERE id_zavod = ? AND id_user = ?", $race_id, $user_id); - + // db_execute zde patrne nema navratovou hodnotu + db_execute("Update " . TBL_RACE . " SET prihlasenych = GREATEST(0, prihlasenych -1 ) WHERE id = ?", $race_id); + print_and_die(); case "past_races": $user_id = require_user_id(); diff --git a/api_race_entry.php b/api_race_entry.php index f55aadb..2bd3efd 100644 --- a/api_race_entry.php +++ b/api_race_entry.php @@ -56,6 +56,10 @@ $query="DELETE FROM ".TBL_ZAVXUS." WHERE id_user = (select id from ".TBL_USER." where id = '$id_user') and id_zavod = '$race_id' and add_by_fin = 1;"; @$result=$db_conn->query($query); $data = 'deleted:'.$db_conn->affected_rows; + if ($result !== false && mysqli_affected_rows($db_conn) > 0) { + query_db("UPDATE ".TBL_RACE." SET prihlasenych = GREATEST(0, prihlasenych - 1) WHERE id = '$race_id'"); + } + } else { $kat = isset($_GET['kat']) ? $_GET['kat'] : ''; $pozn = ''; @@ -68,6 +72,9 @@ $query="INSERT INTO ".TBL_ZAVXUS." (id_user, id_zavod, kat, pozn, pozn_in, termin, transport, ubytovani, participated, add_by_fin) VALUES ((select id from ".TBL_USER." where id = '$id_user'), '$race_id', '$kat', '$pozn', '$pozn2', '$termin', '$transport', '$ubytovani', '$participated', '$addByFin');"; @$result=$db_conn->query($query); $data = 'inserted:'.$db_conn->affected_rows; + if ($result !== false && mysqli_affected_rows($db_conn) > 0) { + $db_conn->query("UPDATE ".TBL_RACE." SET prihlasenych = prihlasenych + 1 WHERE id = '$race_id'"); + } } break; case 'detail': diff --git a/common.inc.php b/common.inc.php index 8bd7463..4bb0cfc 100644 --- a/common.inc.php +++ b/common.inc.php @@ -379,15 +379,20 @@ function DrawPageSubTitle($title, $id=null) echo("

".$title."

\n"); } -function DrawPageRaceTitle($title, $kapacita, $prihlaseno, $id=null) { - if (isset($kapacita) && $kapacita > 0) { - if ($prihlaseno > $kapacita) { - $title .= ' (náhradník)'; - } elseif ($prihlaseno < $kapacita) { - $zbyva = $kapacita - $prihlaseno; - $title .= " (ještě $zbyva míst)"; - } - } +function DrawPageRaceTitle($title, $kapacita, $prihlasenych, $id=null) { + if ($kapacita > 0) { + $zbyva = $kapacita - $prihlasenych; + + if ($zbyva <= 0) { + $title .= ' (náhradník)'; + } elseif ($zbyva === 1) { + $title .= ' (zbývá 1 volné místo)'; + } elseif ($zbyva <= 4) { + $title .= " (zbývá $zbyva volných míst)"; + } else { + $title .= " ($zbyva volných míst)"; + } + } DrawPageSubTitle($title,$id); } @@ -583,4 +588,62 @@ function Date2ISO($date) return $text; } +function countRaceStats(array $zaznamy, bool $is_sdil_dopr_on): array +{ + $stats = [ + 'category_counts' => [], + 'trans' => 0, + 'ubyt' => 0, + 'sedadel' => 0, + ]; + + foreach ($zaznamy as $zaznam) { + // category count + $kat = $zaznam['kat'] ?? null; + if ($kat !== null) { + $stats['category_counts'][$kat] = + ($stats['category_counts'][$kat] ?? 0) + 1; + } + + if (!empty($zaznam['transport'])) { + $stats['trans']++; + } + + if (!empty($zaznam['ubytovani'])) { + $stats['ubyt']++; + } + + if ($is_sdil_dopr_on) { + // fix when changing transport from Common to Shared + $stats['sedadel'] += + ($zaznam['sedadel'] === null) ? -1 : (int)$zaznam['sedadel']; + } + } + + return $stats; +} + +function RenderRaceStats( + array $stats, + bool $is_spol_dopr_on, + bool $is_sdil_dopr_on, + bool $is_spol_ubyt_on +): void { + if ($is_spol_dopr_on || $is_sdil_dopr_on) { + echo "
Počet přihlášených na dopravu: {$stats['trans']}"; + } + + if ($is_sdil_dopr_on) { + $warning = $stats['sedadel'] < 0 + ? ' (málo volných míst)' + : ''; + echo "
Počet volných sdílených míst: {$stats['sedadel']}{$warning}"; + } + + if ($is_spol_ubyt_on) { + echo "
Počet přihlášených na ubytování: {$stats['ubyt']}"; + } + + RenderCategoryCounts($stats['category_counts']); +} ?> diff --git a/common_race.inc.php b/common_race.inc.php index e8e02ab..4a2c653 100644 --- a/common_race.inc.php +++ b/common_race.inc.php @@ -2,6 +2,7 @@
"; + + // JavaScript to expand list and scroll + echo ''; +} + ?> diff --git a/ct_renderer.inc.php b/ct_renderer.inc.php new file mode 100644 index 0000000..583ea64 --- /dev/null +++ b/ct_renderer.inc.php @@ -0,0 +1,291 @@ +set_header_col($col, $this->label, $this->align); + } +} + +class HelpHeaderRenderer implements IColumnHeaderRenderer { + public function __construct( + public string $label, + public string $align, + public string $help + ) {} + + public function render(html_table_mc $tbl, int $col): void { + $tbl->set_header_col_with_help($col, $this->label, $this->align, $this->help); + } +} + +class NoRenderer implements IColumnContentRenderer { + public function __construct(private string $field) {} + + public function render(RowData $row, array $options = []): string { + return htmlspecialchars((string)($this->field ?? '')); + } +} + +class DefaultRenderer implements IColumnContentRenderer { + public function __construct(private string $field) {} + + public function render(RowData $row, array $options = []): string { + return htmlspecialchars((string)($row->rec[$this->field] ?? '')); + } +} + +// plain field renderer. Display direct value. +class FieldRenderer implements IColumnContentRenderer { + public function __construct(private string $field) {} + + public function render(RowData $row, array $options = []): string { + return htmlspecialchars((string)($row->rec[$this->field] ?? '')); + } +} + +// Field renderer with visualised cancelation +class CancelableRenderer extends FieldRenderer { + public function render(RowData $row, array $options = []): string { + $value = parent::render($row) ?? ''; + return GetFormatedTextDel ( $value, $row->rec['cancelled'] ); + } +} + +// formated by extern function, the function must ensure using htmlspecialchars +class FormatFieldRenderer implements IColumnContentRenderer { + private $fn; + private $field; + + public function __construct(string $field,callable $fn) { + $this->fn = $fn; + $this->field = $field; + } + + public function render(RowData $row, array $options = []): string { + $val = $row->rec[$this->field] ?? ''; + return ($this->fn)( $val ); + } +} + +// collected and formated by extern function, the function must ensure using htmlspecialchars +class CallbackRenderer implements IColumnContentRenderer { + private $fn; + + public function __construct(callable $fn) { + $this->fn = $fn; + } + + public function render(RowData $row, array $options = []): string { + return ($this->fn)( $row, $options ); + } +} + +// modifies plain texts on row, evaluated once per row +interface IRowTextPainter { + public function getPrefixSuffix(RowData $row, array $options = [] ): array; +} + +// Checks and creates table break +interface IBreakRowDetector { + public function needsBreak(array $prev, RowData $curr): bool; + public function renderBreak(html_table_mc $tbl, RowData $row): string; +} + +// table column descriptor, holds header and content rendered +class TableColumn { + public IColumnHeaderRenderer $header; + public IColumnContentRenderer $content; + + public function __construct( + public IColumnHeaderRenderer $headerDef, + public IColumnContentRenderer $contentDef + ) { + $this->header = $headerDef; + $this->content = $contentDef; + } +} + +// row information for renderig +class RowData { + public int $number;// current line + public int $count; // total count of lines + public array $rec; // record + + public function __construct(int $count) { + $this->number = 0; + $this->count = $count; + $this->rec = []; + } +} + +abstract class AColumnRendererFactory { + abstract public static function createColRenderer(string $column_name): IColumnContentRenderer; + abstract public static function createHeaderRenderer(string $column_name): IColumnHeaderRenderer; + + public static function createTable () : RenderedTable { + return new RenderedTable(static::class); + } + + public static function create(string $column_name) { + return [ + static::createHeaderRenderer($column_name), + static::createColRenderer($column_name) + ]; + } + + public static function createColumn( + string|IColumnHeaderRenderer $headerDef, + IColumnContentRenderer $contentDef + ): TableColumn { + if (is_string($headerDef)) { + $headerDef = static::createHeaderRenderer($headerDef); + } + + return new TableColumn($headerDef, $contentDef); + } +} + +class RenderedTable { + /** @var TableColumn[] */ + private array $columns = []; + /** @var IBreakRowDetector[] */ + private array $breakRowDetectors = []; + + // text painter add prefic=x and suffix to palin text in row + private ?IRowTextPainter $rowTextPainter = null; + + // row class/attributes extender function ( RowData row ) : array + private $rowAttrsExt = null; + + // row filter function ( RowData row ) : bool + private $rowFilter = null; + + // mandatory renderer factory for column creation + private string $rendererFactoryClass; + + public function __construct(string $rendererFactoryClass) { + $this->rendererFactoryClass = $rendererFactoryClass; + } + + public function addColumns(string|array ...$coldefs) { + foreach ($coldefs as $coldef) { + if (is_string($coldef)) { + $arr = call_user_func ( [$this->rendererFactoryClass, 'create'], $coldef); + $this->addColumn( call_user_func ( [$this->rendererFactoryClass, 'createColumn'], $arr[0], $arr[1] ) ); + } elseif (is_array($coldef)) { + if ( count ($coldef) > 1 ) + $this->addColumn( call_user_func ( [$this->rendererFactoryClass, 'createColumn'], $coldef[0], $coldef[1] ) ); + else + $this->addColumn( call_user_func ( [$this->rendererFactoryClass, 'createColumn'], + new DefaultHeaderRenderer('undef'), new NoRenderer('undef') ) ); + } + } + } + + public function addBreak(IBreakRowDetector $detector) { + $this->breakRowDetectors[] = $detector; + } + + public function addColumn(TableColumn $col): void { + $this->columns[] = $col; + } + + public function setRowTextPainter(IRowTextPainter $painter): void { + $this->rowTextPainter = $painter; + } + + // define row class/attr extender + // the function must return name/value pairs + public function setRowAttrsExt ( callable $fn ) { + $this->rowAttrsExt = $fn; + } + + public function setRowFilter ( callable $fn ) { + $this->rowFilter = $fn; + } + + + public function render( html_table_mc $tbl, array $records, array $options = []): string { + + // Render headers + $col = 0; + foreach ($this->columns as $column) { + // get all defined headers + $column->header->render ( $tbl, $col++ ); + } + + $rnd = $tbl->get_css()."\n"; + $rnd .= $tbl->get_header()."\n"; + $rnd .= $tbl->get_header_row()."\n"; + + $prev = null; + $row = new RowData( count($records) ); + foreach ($records as $record) { + $row->rec = $record; + + if ( $this->rowFilter !== null ) { + if ( ! ($this->rowFilter) ( $row ) ) { + // filtered + continue; + } + } + + if ($prev !== null) { + // create first break between $prev and $record + foreach ($this->breakRowDetectors as $detector) { + if ($detector->needsBreak($prev, $row)) { + $rnd .= $detector->renderBreak($tbl,$row) . "\n"; + break; // only first one + } + } + } + + if ( $this->rowTextPainter !== null ) { + // evaluate once per record + $ps = $this->rowTextPainter->getPrefixSuffix($row,$options); + $prefix = $ps[0] ?? ''; + $suffix = $ps[1] ?? ''; + } + + $rowCells = []; + foreach ($this->columns as $column) { + // get all defined cells + $rowValue = $column->content->render($row,$options); + + if ( $this->rowTextPainter !== null ) { + // apply on each value + $rowValue = preg_replace ( '/(\>|^)([^<]+)(\<|$)/', '${1}' . $prefix . '${2}' . $suffix . '${3}', $rowValue); + } + $rowCells[] = $rowValue; + } + + $row_add_attrs = ( $this->rowAttrsExt !== null ) ? ($this->rowAttrsExt) ( $row ) : []; + $rnd .= $tbl->get_new_row_arr($rowCells,$row_add_attrs) . "\n"; + $prev = $record; + $row->number++; + } + + return $rnd . $tbl->get_footer() . "\n"; + } +} + + +?> \ No newline at end of file diff --git a/ct_renderer_race.inc.php b/ct_renderer_race.inc.php new file mode 100644 index 0000000..93c51b6 --- /dev/null +++ b/ct_renderer_race.inc.php @@ -0,0 +1,105 @@ +limit = $limit; + } + + public function needsBreak(array $prev, RowData $curr): bool { + return $curr->number === $this->limit; + } + + public function renderBreak(html_table_mc $tbl, RowData $row): string { + return $tbl->get_break_row(true); + } +} + +// Break between termin +class TerminBreakDetector implements IBreakRowDetector { + public function needsBreak(array $prev, RowData $curr): bool { + return $prev['termin'] !== $curr->rec['termin']; + } + + public function renderBreak(html_table_mc $tbl, RowData $row): string { + return $tbl->get_break_row(false); + } +} + +class GreyLastNPainter implements IRowTextPainter { + private int $limit; + + public function __construct(int $limit) { + $this->limit = $limit; + } + + public function getPrefixSuffix(RowData $row, array $options = []): array { + $is_last = ($row->number >= $this->limit); + + return [ + $is_last ? '' : '', + $is_last ? '' : '' + ]; + } +} + +class KategoryHeadderRenderer extends HelpHeaderRenderer { + + public function render(html_table_mc $tbl, int $col): void { + parent::render( $tbl, $col); + $tbl->mod_header_col_onclick($col,'toggleCategoriesAndScroll()'); + } +} + +class RaceRendererFactory extends AColumnRendererFactory { + public static function createColRenderer(string $column_name): IColumnContentRenderer { + return match ($column_name) { + 'id' => new CallbackRenderer(function ( RowData $row, array $options ) : string { + return ($row->number + 1).''; }), + 'reg' => new FormatFieldRenderer($column_name, function($reg) { + global $g_shortcut ; return $g_shortcut.RegNumToStr($reg); + }), + 'si_chip' => new CallbackRenderer(function ( RowData $row, array $options ) : string { + if ($row->rec['t_si_chip'] != 0) + return ''.SINumToStr($row->rec['t_si_chip']).''; + if ($row->rec['si_chip'] != 0) + return SINumToStr($row->rec['si_chip']); + return ''; + }), + 'kat' => new FormatFieldRenderer($column_name, function($kat) { return ''.htmlspecialchars($kat).''; }), + 'transport', 'ubytovani' => new FormatFieldRenderer($column_name, function ( $bl ) : string { + return $bl ? '' : ''; } ), + 'sedadel' => new CallbackRenderer(function ( RowData $row, array $options ) : string { + $dummy = 0; + return GetSharedTransportValue($row->rec["transport"], $row->rec["sedadel"], $dummy ); + }), + default => new DefaultRenderer($column_name), + }; + } + public static function createHeaderRenderer(string $column_name): IColumnHeaderRenderer { + return match ($column_name) { + 'id' => new DefaultHeaderRenderer('Poř.',ALIGN_CENTER), + 'jmeno' => new DefaultHeaderRenderer('Jméno'), + 'prijmeni' => new DefaultHeaderRenderer('Příjmení'), + 'reg' => new HelpHeaderRenderer('Reg.č.',ALIGN_CENTER,"Registrační číslo"), + 'si_chip' => new DefaultHeaderRenderer('SI čip',ALIGN_RIGHT), + 'kat' => new KategoryHeadderRenderer('Kategorie',ALIGN_CENTER,"Zobrazí počet účastníků v jednotlivých kategoriích"), + 'transport' => new HelpHeaderRenderer('SD',ALIGN_CENTER,"Společná"), + 'sedadel' => new HelpHeaderRenderer('🚗',ALIGN_CENTER,'Nabízených sedadel'), + 'ubytovani' => new HelpHeaderRenderer('SU',ALIGN_CENTER,"Společné ubytování"), + 'termin' => new DefaultHeaderRenderer('Termín',ALIGN_CENTER), + 'pozn' => new DefaultHeaderRenderer('Pozn.'), + 'pozn_in' => new DefaultHeaderRenderer('Pozn.(i)'), + default => new DefaultHeaderRenderer($column_name), + }; + } +} + +?> \ No newline at end of file diff --git a/ct_renderer_races.inc.php b/ct_renderer_races.inc.php new file mode 100644 index 0000000..3402663 --- /dev/null +++ b/ct_renderer_races.inc.php @@ -0,0 +1,241 @@ +rec['vicedenni']) + return Date2StringFT($row->rec['datum'],$row->rec['datum2']); + else + return Date2String($row->rec['datum']); + } +} + +// Field renderer with visualised cancelation +class NameLinkRenderer extends CancelableRenderer { + public function render(RowData $row, array $options = [] ): string { + $value = parent::render($row) ?? ''; + return ''.$value.''; + } +} + +class BossRenderer implements IColumnContentRenderer { + + public function render(RowData $row, array $options = []): string { + + global $usr; + + $link_to_participation = " / rec['id']."','')\">Účast"; + $show_link = ($row->rec['vedouci'] == $usr->user_id) && (GetTimeToRace($row->rec['datum']) <= 0); + $boss = '-'; + if($row->rec['vedouci_jmeno'] != '-') + { + $boss = $row->rec['vedouci_jmeno'].($show_link ? $link_to_participation : ''); + } + return $boss; + } +} + +class RegistrationRenderer implements IColumnContentRenderer { + + public function render(RowData $row, array $options = []): string { + + $prihlasky_curr = raceterms::GetActiveRegDateArr($row->rec); + $prihlasky_out_term = Date2String($prihlasky_curr[0]); + if($row->rec['prihlasky'] > 1) + $prihlasky_out_term .= ' / '.$prihlasky_curr[1]; + $time_to_reg = GetTimeToReg($prihlasky_curr[0]); + + return raceterms::ColorizeTermUser($time_to_reg,$prihlasky_curr,$prihlasky_out_term); + } +} + +class ActivityRenderer implements IColumnContentRenderer { + + public function render(RowData $row, array $options = []): string { + + global $usr; + + $entry_lock = $options['entry_lock'] ?? true; // locked if undefined + if (!isset($options['curr_date'])) { + echo "Option 'curr_date' not set, using default.\n"; + } + $curr_date = $options['curr_date'] ?? GetCurrentDate(); + + $prihlasky_curr = raceterms::GetActiveRegDateArr($row->rec); + $time_to_reg = GetTimeToReg($prihlasky_curr[0]); + + $prihl_finish = ($time_to_reg == -1 && $prihlasky_curr[0] != 0) || ($prihlasky_curr[0] == 0 && $row->rec['datum'] <= $curr_date); + $zbr = "rec['id']."','')\">Zbr"; + + if($row->rec['kat'] == NULL) + { // neni prihlasen + if (!$prihl_finish && !$entry_lock) + { + return "rec["id"]."&id_us=".$usr->user_id."','')\">Přihl. / ".$zbr; + } + else + { + return "rec["id"]."&us=1','')\">Zobrazit"; + } + } + else + { // je prihlasen + $prihl_finish2 = $prihl_finish || ( $prihlasky_curr[0] != 0 && $prihlasky_curr[1] != $row->rec['termin']); + if($prihl_finish2 != $prihl_finish) + { + return "rec['id']."&us=1','')\">".$row->rec['kat'].' / '.$row->rec['termin']; + } + else if (!$prihl_finish && !$entry_lock) + { + return "rec['id']."&id_us=".$usr->user_id."','')\" class=\"Highlight\">".$row->rec['kat']." / rec['id']."&id_us=".$usr->user_id."','')\" onclick=\"return confirm_delete();\" class=\"Erase\">Od."; + } + else + { + return "rec['id']."&us=1','')\">".$row->rec['kat'].''; + } + } + + return ''; + } +} + +class ParticipantsRenderer implements IColumnContentRenderer { + + public function render(RowData $row, array $options = []): string { + + $registered = (int)$row->rec['prihlasenych']; + $kapacita = (int)$row->rec['kapacita']; + $alert = $kapacita - $registered < 10 ? 'class="TextAlert7"' : ''; + + if ($kapacita > 0) { + return '' .$registered . '/' . $kapacita . ''; + } else { + return $registered ?: ''; // show nothing if zero + } + } +} + +class RacesRendererFactory extends AColumnRendererFactory { + public static function createColRenderer(string $column_name): IColumnContentRenderer { + return match ($column_name) { + 'datum' => new DatumRenderer($column_name), + 'nazev' => new NameLinkRenderer($column_name), + 'misto' => new CancelableRenderer($column_name), + 'ext_id' => new FormatFieldRenderer($column_name, function ( $ext_id ) : string { return !empty ($ext_id) ? 'A' : '-';} ), + 'typ0' => new FormatFieldRenderer($column_name,'GetRaceType0'), + 'typ' => new FormatFieldRenderer($column_name,'GetRaceTypeImg'), + 'odkaz' => new FormatFieldRenderer($column_name,'GetRaceLinkHTML'), + 'ucast' => new ParticipantsRenderer(), + 'moznosti' => new ActivityRenderer(), + 'prihlasky' => new RegistrationRenderer(), + 'vedouci' => new BossRenderer(), + default => new DefaultRenderer($column_name), + }; + } + public static function createHeaderRenderer(string $column_name): IColumnHeaderRenderer { + return match ($column_name) { + 'datum' => new DefaultHeaderRenderer('Datum',ALIGN_CENTER), + 'nazev' => new DefaultHeaderRenderer('Název'), + 'misto' => new DefaultHeaderRenderer('Místo'), + 'oddil' => new HelpHeaderRenderer('Poř.',ALIGN_CENTER,"Pořadatel"), + 'ext_id' => new HelpHeaderRenderer('O',ALIGN_CENTER,"závod v ORISu"), + 'typ0' => new HelpHeaderRenderer('T',ALIGN_CENTER,"Typ akce"), + 'typ' => new HelpHeaderRenderer('S',ALIGN_CENTER,"Sport"), + 'odkaz' => new HelpHeaderRenderer('W',ALIGN_CENTER,"Web závodu"), + 'kategorie' => new HelpHeaderRenderer('Kat',ALIGN_CENTER,"Zadané kategorie"), + 'ucast' => new HelpHeaderRenderer('Účast',ALIGN_CENTER,"Přihlášeno/Kapacita"), + 'moznosti' => new DefaultHeaderRenderer('Možnosti',ALIGN_CENTER), + 'prihlasky' => new DefaultHeaderRenderer('Přihlášky',ALIGN_CENTER), + 'vedouci' => new DefaultHeaderRenderer('Vedoucí',ALIGN_CENTER), + default => new DefaultHeaderRenderer($column_name), + }; + } +} + +// modifies plain texts on row, evaluated once per row +class GreyOldPainter implements IRowTextPainter { + public function getPrefixSuffix(RowData $row, array $options = [] ): array { + $race_is_old = (GetTimeToRace($row->rec['datum']) == -1); + + return [ ($race_is_old) ? '' : '', ($race_is_old) ? '' : '' ]; + } +} + +// Break between years +class YearBreakDetector implements IBreakRowDetector { + public function needsBreak(array $prev, RowData $curr): bool { + return Date2Year($prev['datum']) !== Date2Year($curr->rec['datum']); + } + + public function renderBreak(html_table_mc $tbl, RowData $row): string { + return $tbl->get_break_row(true); + } +} + +// Break Before First Future Race +class FutureRaceBreakDetector implements IBreakRowDetector { + private ?bool $descending = null; // order unknown at start + private bool $alreadyBroken = false; + + public function needsBreak(array $prev, RowData $curr): bool { + if ($this->alreadyBroken) return false; + + if ( !isset( $this->descending ) ) { + if ( $prev['datum'] < $curr->rec['datum'] ) $this->descending = false; + if ( $prev['datum'] > $curr->rec['datum'] ) $this->descending = true; + } + + if ( isset( $this->descending ) ) { + $now = GetCurrentDate(); + if ( $this->descending && ( $prev['datum'] > $now && $curr->rec['datum'] <= $now ) || + !$this->descending && ( $prev['datum'] <= $now && $curr->rec['datum'] > $now) ) + { + $this->alreadyBroken = true; + return true; + } + } + return false; + } + + public function renderBreak(html_table_mc $tbl, RowData $row): string { + return $tbl->get_break_row(); + } +} + +// Button Break between years +class YearExpanderDetector implements IBreakRowDetector { + public function needsBreak(array $prev, RowData $curr): bool { + return Date2Year($prev['datum']) !== Date2Year($curr->rec['datum']); + } + + public function renderBreak(html_table_mc $tbl, RowData $row): string { + $year = Date2Year($row->rec['datum']); + $odkaz = '' . + ($year < date('Y') ? '▼' : '▲') . ' '. $year . ''; + return $tbl->get_info_row($odkaz)."\n"; + } + + // helper function for attribute setting + public static function yearGroupRowAttrsExtender(RowData $row): array + { + $year = Date2Year($row->rec['datum']); + + $attrs = ['data-group' => $year]; + + if ($year < date('Y')) { + $attrs['style'] = 'display:none'; + } + + return $attrs; + } +} + +?> \ No newline at end of file diff --git a/ctable.inc.php b/ctable.inc.php index 0ba1585..8aae605 100644 --- a/ctable.inc.php +++ b/ctable.inc.php @@ -137,34 +137,40 @@ function __construct($table_class_name = '') } //__________________________________________________________________ - function set_header_col ($col,$text,$align,$width = 0,$ex_td='') + function set_header_col ($col,$text,$align,$width = 0) { if (is_array($this->header_row)) { $this->header_row[$col]['text'] = $text; $this->header_row[$col]['class'] = $align; $this->header_row[$col]['width'] = $width; - $this->header_row[$col]['ex_td'] = $ex_td; $this->header_row[$col]['help'] = ''; $this->cols_align[$col] = $align; $this->sort_row[$col] = ''; } } - function set_header_col_with_help ($col,$text,$align,$help,$width = 0,$ex_td='') + function set_header_col_with_help ($col,$text,$align,$help,$width = 0) { if (is_array($this->header_row)) { $this->header_row[$col]['text'] = $text; $this->header_row[$col]['class'] = $align; $this->header_row[$col]['width'] = $width; - $this->header_row[$col]['ex_td'] = $ex_td; $this->header_row[$col]['help'] = $help; $this->cols_align[$col] = $align; $this->sort_row[$col] = ''; } } + function mod_header_col_onclick ($col,$onclick) + { + if (is_array($this->header_row) && $col < count($this->header_row)) + { + $this->header_row[$col]['onclick'] = $onclick; + } + } + function set_sort_col ($col,$text) { $this->sort_row[$col] = $text; @@ -187,6 +193,32 @@ function set_col_aligns()// align sloupcu za sebou oddelene carkou. } } + private function get_header_row_start( array $col ) : string { + $row = ''; + $row .= 'header_row as $col) { - $row .= ''; - $row .= $col['text']; - if ($col['help'] != '') - $row .=''; + $row .= $this->get_header_row_start ( $col ); $row .= ''; $this->cols++; } @@ -235,17 +256,7 @@ function get_header_row_with_sort() $row = ''; foreach($this->header_row as $idx => $col) { - $row .= ''; - $row .= $col['text']; - if ($col['help'] != '') - $row .=''; + $row .= $this->get_header_row_start($col); if ($this->sort_row[$idx] != '') $row .= ' '.$this->sort_row[$idx]; $row .= ''; @@ -267,15 +278,25 @@ function get_new_row()// sloupce za sebou oddelene carkou. } //__________________________________________________________________ - function get_new_row_arr($row_arr, $row_class="")// pole sloupcu - { + function get_new_row_arr($row_arr, $row_attrs=[]) + { // pole sloupcu with optional attributes + $row_add_class = ''; + $row_add_attrs = ''; + + foreach ($row_attrs as $key => $value) { + if ( $key === 'class') + $row_add_class = ' ' . $value; + else + $row_add_attrs .= ' ' . htmlspecialchars($key) . '="' . htmlspecialchars($value) . '"'; + } + $cols = count ($row_arr); if ($cols == 0) return ''; if ($this->highlighted_next_row) $rc = 'highlight'; else $rc= ((++$this->row_idx % 2) == 0) ? 'r1' : 'r2'; - $row = ''; + $row = ''; for($i = 0; $i < $cols; $i++) { $row .= ' 0) { show_link_to_actual_race($num_rows); - $data_tbl = new html_table_mc(); - $col = 0; - $data_tbl->set_header_col($col++,'Datum',ALIGN_CENTER); - $data_tbl->set_header_col($col++,'Název',ALIGN_LEFT); - $data_tbl->set_header_col($col++,'Místo',ALIGN_LEFT); - $data_tbl->set_header_col_with_help($col++,'Poř.',ALIGN_CENTER,"Pořadatel"); - $data_tbl->set_header_col_with_help($col++,'T',ALIGN_CENTER,"Typ akce"); - $data_tbl->set_header_col_with_help($col++,'S',ALIGN_CENTER,"Sport"); - $data_tbl->set_header_col($col++,'Možnosti',ALIGN_CENTER); - $data_tbl->set_header_col($col++,'Platba',ALIGN_CENTER); - - echo $data_tbl->get_css()."\n"; - echo $data_tbl->get_header()."\n"; - echo $data_tbl->get_header_row()."\n"; + $renderer_option['curr_date'] = GetCurrentDate(); + + // define table + $tbl_renderer = RacesRendererFactory::createTable(); + $tbl_renderer->addColumns('datum','nazev','misto','oddil','typ0','typ'); + $tbl_renderer->addColumns(['moznosti',new FormatFieldRenderer ( 'id', function ( $id ) : string { + return 'Přehled'; + })]); + $tbl_renderer->addColumns([new DefaultHeaderRenderer('Platba',ALIGN_CENTER), + new FormatFieldRenderer ( 'id', function ( $id ) use ($race_amount) : string { + return isset($race_amount[$id]) ? $race_amount[$id] : ''; + })]); - $i = 1; - $brk_tbl = false; - $old_year = 0; - $year = 0; - while ($zaznam=mysqli_fetch_array($vysledek)) - { - $prefix = ($zaznam['datum'] < GetCurrentDate()) ? '' : ''; - $suffix = ($zaznam['datum'] < GetCurrentDate()) ? '' : ''; - $row = array(); - //---------------------------- - if($zaznam['vicedenni']) - $datum=Date2StringFT($zaznam['datum'],$zaznam['datum2']); - else - $datum=Date2String($zaznam['datum']); - //---------------------------- - $row[] = $prefix.$datum.$suffix; - $row[] = "".$prefix.GetFormatedTextDel($zaznam['nazev'], $zaznam['cancelled']).$suffix.""; - $row[] = $prefix.GetFormatedTextDel($zaznam['misto'], $zaznam['cancelled']).$suffix; - $row[] = $prefix.$zaznam['oddil'].$suffix; - $row[] = GetRaceType0($zaznam['typ0']); - $row[] = GetRaceTypeImg($zaznam['typ']).''; - $row[] = 'Přehled'; - $row[] = isset($race_amount[$zaznam['id']])?$race_amount[$zaznam['id']]:""; - - $year = Date2Year($zaznam['datum']); - - if (!$brk_tbl && $zaznam['datum'] >= GetCurrentDate()) - { - if($i != 1) - echo $data_tbl->get_break_row()."\n"; - $brk_tbl = true; - } - else if($i != 1 && $year != $old_year) - { - $odkaz = ""; - echo $data_tbl->get_info_row($odkaz)."\n"; - } + $tbl_renderer->setRowTextPainter ( new GreyOldPainter() ); + $tbl_renderer->setRowAttrsExt ( YearExpanderDetector::yearGroupRowAttrsExtender(...)); - //prasacky schovane radky krome posledniho roku - ($year < date("Y"))?($class = $year."\" style=\"display:none") : ($class = $year); + // TODO: breaks are necessary only by some filters + $tbl_renderer->addBreak(new YearExpanderDetector()); + $tbl_renderer->addBreak(new FutureRaceBreakDetector()); - echo $data_tbl->get_new_row_arr($row, $class)."\n"; - $i++; - $old_year = $year; - } - echo $data_tbl->get_footer()."\n"; + echo $tbl_renderer->render( new html_table_mc(), $zaznamy, $renderer_option ); } ?> diff --git a/functions.js b/functions.js index d4cc98e..bf1426b 100644 --- a/functions.js +++ b/functions.js @@ -132,10 +132,21 @@ function changeParameterValueInURL(currentUrl, parameter, value) return url.href; } -function toggle_display_by_class(cls) { - var lst = document.getElementsByClassName(cls); - for(var i = 0; i < lst.length; ++i) { - (lst[i].style.display == '')?(lst[i].style.display='none'):(lst[i].style.display=''); +function toggle_expand_by_group(group,el) { + var lst = document.querySelectorAll('[data-group="' + group + '"]'); + var hidden = true; + for(var i = 0; i < lst.length; ++i) { + hidden = (lst[i].style.display == ''); + lst[i].style.display=hidden?'none':'' + } + + // toggle arrow + const groupText = el.textContent; + if (groupText.includes('▲') || groupText.includes('▼')) { + el.textContent = + hidden + ? groupText.replace('▲', '▼') + : groupText.replace('▼', '▲'); } } diff --git a/index.php b/index.php index c15a53a..371c6f8 100644 --- a/index.php +++ b/index.php @@ -76,12 +76,13 @@ case 1: //adresar require_once "./directory.inc.php"; break; - case 2: //terminovka - if (!IsLogged()) - require_once './racelist.inc.php'; - else - require_once "./news.inc.php"; - break; + // newer comes here ? + // case 2: //terminovka + // if (!IsLogged()) + // require_once './racelist.inc.php'; + // else + // require_once "./news.inc.php"; + // break; case 3: //prihlasky clena if (IsLogged()) require_once './users_races.inc.php'; diff --git a/main.css.php b/main.css.php index 88563af..ecfd173 100644 --- a/main.css.php +++ b/main.css.php @@ -488,6 +488,13 @@ margin-left: 50px; } +.year-expander { + cursor: pointer; + user-select: none; + font-weight: bold; + font-size: 1.1em; +} + @@ -35,86 +36,54 @@ function confirm_delete() { 0) { show_link_to_actual_race($num_rows); - $data_tbl = new html_table_mc(); - $col = 0; - $data_tbl->set_header_col($col++,'Datum',ALIGN_CENTER); - $data_tbl->set_header_col($col++,'Název',ALIGN_LEFT); - $data_tbl->set_header_col($col++,'Místo',ALIGN_LEFT); - $data_tbl->set_header_col_with_help($col++,'Poř.',ALIGN_CENTER,"Pořadatel"); - $data_tbl->set_header_col_with_help($col++,'T',ALIGN_CENTER,"Typ akce"); - $data_tbl->set_header_col_with_help($col++,'S',ALIGN_CENTER,"Sport"); - $data_tbl->set_header_col_with_help($col++,'W',ALIGN_CENTER,"Web závodu"); - $data_tbl->set_header_col($col++,'Možnosti',ALIGN_CENTER); - $data_tbl->set_header_col($col++,'Přihlášky',ALIGN_CENTER); - - echo $data_tbl->get_css()."\n"; - echo $data_tbl->get_header()."\n"; - echo $data_tbl->get_header_row()."\n"; - - $i = 1; - $brk_tbl = false; - $old_year = 0; - while ($zaznam=mysqli_fetch_array($vysledek)) - { - $race_is_old = (GetTimeToRace($zaznam['datum']) == -1); - - $prefix = ($zaznam['datum'] < GetCurrentDate()) ? '' : ''; - $suffix = ($zaznam['datum'] < GetCurrentDate()) ? '' : ''; - $row = array(); - //---------------------------- - if($zaznam['vicedenni']) - $datum=Date2StringFT($zaznam['datum'],$zaznam['datum2']); - else - $datum=Date2String($zaznam['datum']); - - $prihlasky_curr = raceterms::GetActiveRegDateArr($zaznam); - $prihlasky=Date2String($prihlasky_curr[0]); + // define table + $tbl_renderer = RacesRendererFactory::createTable(); + $tbl_renderer->addColumns('datum','nazev','misto','oddil','typ0','typ','odkaz'); + if ($g_enable_race_capacity) + $tbl_renderer->addColumns('ucast'); + $tbl_renderer->addColumns(['moznosti', new CallbackRenderer ( function ( RowData $row, array $options ) : string { + $race_is_old = (GetTimeToRace($row->rec['datum']) == -1); + $prihlasky_curr = raceterms::GetActiveRegDateArr($row->rec); - if($zaznam['prihlasky'] > 1) - $prihlasky .= ' / '.$prihlasky_curr[1]; $time_to_reg = GetTimeToReg($prihlasky_curr[0]); - $prihlasky_out = raceterms::ColorizeTermUser($time_to_reg,$prihlasky_curr,$prihlasky); $prihl_finish = (($time_to_reg == -1 && $prihlasky_curr[0] != 0) || $race_is_old); - //---------------------------- - $row[] = $prefix.$datum.$suffix; - $row[] = "".$prefix.GetFormatedTextDel($zaznam['nazev'], $zaznam['cancelled']).$suffix.""; - $row[] = $prefix.GetFormatedTextDel($zaznam['misto'], $zaznam['cancelled']).$suffix; - $row[] = $prefix.$zaznam['oddil'].$suffix; - $row[] = GetRaceType0($zaznam['typ0']); - $row[] = GetRaceTypeImg($zaznam['typ']); - $row[] = GetRaceLinkHTML($zaznam['odkaz']); - $ucast = (GetTimeToRace($zaznam['datum']) <= 0) ? " / Účast" : ''; + $ucast = (GetTimeToRace($row->rec['datum']) <= 0) ? " / rec['id']."','')\">Účast" : ''; if (!$prihl_finish) { - $row[] = "Př-1 / Př-V / Zbr".$ucast; + return "rec['id']."&show_ed=1','')\">Př-1 / rec['id']."','')\">Př-V / rec['id']."','')\">Zbr".$ucast; } else { - $row[] = "Zobrazit".$ucast; + return "rec['id']."','')\">Zobrazit".$ucast; } - $row[] = $prihlasky_out; + + })]); + $tbl_renderer->addColumns('prihlasky'); - if (!$brk_tbl && $zaznam['datum'] >= GetCurrentDate()) - { - if($i != 1) - echo $data_tbl->get_break_row()."\n"; - $brk_tbl = true; - } - else if($i != 1 && Date2Year($zaznam['datum']) != $old_year) - { - echo $data_tbl->get_break_row(true)."\n"; - } + $tbl_renderer->setRowTextPainter ( new GreyOldPainter() ); - echo $data_tbl->get_new_row_arr($row)."\n"; - $i++; - $old_year = Date2Year($zaznam['datum']); + if ($fC == 1) { + // old races - add breaks + $tbl_renderer->addBreak(new YearExpanderDetector()); + $tbl_renderer->setRowAttrsExt ( YearExpanderDetector::yearGroupRowAttrsExtender(...)); + } + else { + // TODO: breaks are necessary only by some filters + $tbl_renderer->addBreak(new YearBreakDetector()); + $tbl_renderer->addBreak(new FutureRaceBreakDetector()); } - echo $data_tbl->get_footer()."\n"; + + echo $tbl_renderer->render( new html_table_mc(), $zaznamy, $renderer_option ); } ?>

diff --git a/mns_races.inc.php b/mns_races.inc.php index ea2025d..2bbd2d4 100644 --- a/mns_races.inc.php +++ b/mns_races.inc.php @@ -7,6 +7,7 @@ @@ -35,84 +36,53 @@ function confirm_delete() { 0) { show_link_to_actual_race($num_rows); - $data_tbl = new html_table_mc(); - $col = 0; - $data_tbl->set_header_col($col++,'Datum',ALIGN_CENTER); - $data_tbl->set_header_col($col++,'Název',ALIGN_LEFT); - $data_tbl->set_header_col($col++,'Místo',ALIGN_LEFT); - $data_tbl->set_header_col_with_help($col++,'Poř.',ALIGN_CENTER,"Pořadatel"); - $data_tbl->set_header_col_with_help($col++,'T',ALIGN_CENTER,"Typ akce"); - $data_tbl->set_header_col_with_help($col++,'S',ALIGN_CENTER,"Sport"); - $data_tbl->set_header_col_with_help($col++,'W',ALIGN_CENTER,"Web závodu"); - $data_tbl->set_header_col($col++,'Možnosti',ALIGN_CENTER); - $data_tbl->set_header_col($col++,'Přihlášky',ALIGN_CENTER); - - echo $data_tbl->get_css()."\n"; - echo $data_tbl->get_header()."\n"; - echo $data_tbl->get_header_row()."\n"; - - $i = 1; - $brk_tbl = false; - $old_year = 0; - while ($zaznam=mysqli_fetch_array($vysledek)) - { - $race_is_old = (GetTimeToRace($zaznam['datum']) == -1); - - $prefix = ($zaznam['datum'] < GetCurrentDate()) ? '' : ''; - $suffix = ($zaznam['datum'] < GetCurrentDate()) ? '' : ''; - $row = array(); - //---------------------------- - if($zaznam['vicedenni']) - $datum=Date2StringFT($zaznam['datum'],$zaznam['datum2']); - else - $datum=Date2String($zaznam['datum']); - - $prihlasky_curr = raceterms::GetActiveRegDateArr($zaznam); - $prihlasky=Date2String($prihlasky_curr[0]); - if($zaznam['prihlasky'] > 1) - $prihlasky .= ' / '.$prihlasky_curr[1]; + // define table + $tbl_renderer = RacesRendererFactory::createTable(); + $tbl_renderer->addColumns('datum','nazev','misto','oddil','typ0','typ','odkaz'); + if ($g_enable_race_capacity) + $tbl_renderer->addColumns('ucast'); + $tbl_renderer->addColumns(['moznosti', new CallbackRenderer ( function ( RowData $row, array $options ) : string { + $race_is_old = (GetTimeToRace($row->rec['datum']) == -1); + $prihlasky_curr = raceterms::GetActiveRegDateArr($row->rec); $time_to_reg = GetTimeToReg($prihlasky_curr[0]); - $prihlasky_out = raceterms::ColorizeTermUser($time_to_reg,$prihlasky_curr,$prihlasky); $prihl_finish = (($time_to_reg == -1 && $prihlasky_curr[0] != 0) || $race_is_old); - //---------------------------- - $row[] = $prefix.$datum.$suffix; - $row[] = "".$prefix.GetFormatedTextDel($zaznam['nazev'], $zaznam['cancelled']).$suffix.""; - $row[] = $prefix.GetFormatedTextDel($zaznam['misto'], $zaznam['cancelled']).$suffix; - $row[] = $prefix.$zaznam['oddil'].$suffix; - $row[] = GetRaceType0($zaznam['typ0']); - $row[] = GetRaceTypeImg($zaznam['typ']); - $row[] = GetRaceLinkHTML($zaznam['odkaz']); + if (!$prihl_finish) { - $row[] = "Př-1 / Př-V /  / Zbr"; + return "rec['id']."&show_ed=1','')\">Př-1 / rec['id']."','')\">Př-V / rec['id']."&select=1','')\"> / rec['id']."','')\">Zbr"; } else { - $row[] = "Zbr.čl. / Zobrazit"; + return "rec['id']."&select=1','')\">Zbr.čl. / rec['id']."','')\">Zobrazit"; } - $row[] = $prihlasky_out; + })]); + $tbl_renderer->addColumns('prihlasky'); - if (!$brk_tbl && $zaznam['datum'] >= GetCurrentDate()) - { - if($i != 1) - echo $data_tbl->get_break_row()."\n"; - $brk_tbl = true; - } - else if($i != 1 && Date2Year($zaznam['datum']) != $old_year) - { - echo $data_tbl->get_break_row(true)."\n"; - } + $tbl_renderer->setRowTextPainter ( new GreyOldPainter() ); - echo $data_tbl->get_new_row_arr($row)."\n"; - $i++; - $old_year = Date2Year($zaznam['datum']); + if ($fC == 1) { + // old races - add breaks + $tbl_renderer->addBreak(new YearExpanderDetector()); + $tbl_renderer->setRowAttrsExt ( YearExpanderDetector::yearGroupRowAttrsExtender(...)); + } + else { + // TODO: breaks are necessary only by some filters + $tbl_renderer->addBreak(new YearBreakDetector()); + $tbl_renderer->addBreak(new FutureRaceBreakDetector()); } - echo $data_tbl->get_footer()."\n"; + + echo $tbl_renderer->render( new html_table_mc(), $zaznamy, $renderer_option ); } ?>

diff --git a/race_reg_chip.php b/race_reg_chip.php index d80633c..d591f6e 100644 --- a/race_reg_chip.php +++ b/race_reg_chip.php @@ -17,6 +17,7 @@ require_once ("./common_race.inc.php"); require_once ("./common_user.inc.php"); require_once ('./url.inc.php'); +require_once ('./ct_renderer_race.inc.php'); DrawPageTitle('Přiřazení SI čipů pro závod'); @@ -26,13 +27,16 @@ //$query = 'SELECT u.*, z.kat, z.pozn, z.pozn_in, z.si_chip as t_si_chip FROM '.TBL_ZAVXUS.' as z, '.TBL_USER.' as u WHERE z.id_user = u.id AND z.id_zavod='.$id_zav.' AND u.si_chip = 0 AND u.hidden = 0 ORDER BY z.id ASC'; $query = 'SELECT u.*, z.kat, z.pozn, z.pozn_in, z.si_chip as t_si_chip FROM '.TBL_ZAVXUS.' as z, '.TBL_USER.' as u WHERE z.id_user = u.id AND z.id_zavod='.$id_zav.' AND u.hidden = 0 ORDER BY z.id ASC'; - @$vysledek=query_db($query); +// Fetch all rows into array +$zaznamy = $vysledek ? mysqli_fetch_all($vysledek, MYSQLI_ASSOC) : []; +$num_rows = count ($zaznamy); @$vysledek_z=query_db("SELECT * FROM ".TBL_RACE." WHERE id=$id_zav LIMIT 1"); $zaznam_z = mysqli_fetch_array($vysledek_z); -DrawPageSubTitle('Vybraný závod'); +$kapacita = $zaznam_z['kapacita']; +DrawPageRaceTitle('Vybraný závod',$kapacita,$num_rows); RaceInfoTable($zaznam_z,'',false,false,true); ?> @@ -47,46 +51,27 @@

set_header_col($col++,'Poř.',ALIGN_CENTER); - $data_tbl->set_header_col($col++,'Jméno',ALIGN_LEFT); - $data_tbl->set_header_col($col++,'Příjmení',ALIGN_LEFT); - $data_tbl->set_header_col_with_help($col++,'Reg.',ALIGN_CENTER,"Registrační číslo"); - $data_tbl->set_header_col($col++,'SI čip',ALIGN_LEFT); - $data_tbl->set_header_col($col++,'Kategorie',ALIGN_CENTER); - $data_tbl->set_header_col($col++,'Poznámka',ALIGN_CENTER); - $data_tbl->set_header_col($col++,'Poznámka (interní)',ALIGN_CENTER); - - echo $data_tbl->get_css()."\n"; - echo $data_tbl->get_header()."\n"; - echo $data_tbl->get_header_row()."\n"; - - $i=0; - while ($zaznam=mysqli_fetch_array($vysledek)) - { - $i++; - - $row = array(); - $row[] = $i.''; - $row[] = $zaznam['jmeno']; - $row[] = $zaznam['prijmeni']; - $row[] = $g_shortcut.RegNumToStr($zaznam['reg']); - if ($zaznam['si_chip'] != 0) - { - $si = ($zaznam['t_si_chip'] != 0) ? $zaznam['t_si_chip'] : $zaznam['si_chip']; - $row[] = ' ('.$zaznam['si_chip'].')'; - } - else - $row[] = ''; - - $row[] = ''.$zaznam['kat'].''; - $row[] = $zaznam['pozn']; - $row[] = $zaznam['pozn_in']; - - echo $data_tbl->get_new_row_arr($row)."\n"; + // define table + $tbl_renderer = RaceRendererFactory::createTable(); + $tbl_renderer->addColumns('id','jmeno','prijmeni','reg'); + $tbl_renderer->addColumns([new DefaultHeaderRenderer('SI čip'), + new CallbackRenderer ( function ( RowData $row, array $options ) : string { + if ($row->rec['si_chip'] != 0) + { + $si = ($row->rec['t_si_chip'] != 0) ? $row->rec['t_si_chip'] : $row->rec['si_chip']; + return ' ('.$row->rec['si_chip'].')'; + } + else + return ''; + })]); + $tbl_renderer->addColumns('kat','pozn','pozn_in'); + + if ($g_enable_race_capacity && isSet ($zaznam_z['kapacita']) ) { + $tbl_renderer->addBreak(new LimitBreakDetector($zaznam_z['kapacita'])); + $tbl_renderer->setRowTextPainter ( new GreyLastNPainter($zaznam_z['kapacita']) ); } - echo $data_tbl->get_footer()."\n"; + echo $tbl_renderer->render( new html_table_mc(), $zaznamy, [] ); + ?>
diff --git a/race_reg_form.php b/race_reg_form.php index 4104982..37980ee 100644 --- a/race_reg_form.php +++ b/race_reg_form.php @@ -17,6 +17,7 @@ require_once ("./common_race.inc.php"); require_once ("./common_user.inc.php"); require_once ('./url.inc.php'); +require_once ('./ct_renderer_race.inc.php'); DrawPageTitle('Export přihlášky - kontrola'); @@ -40,6 +41,12 @@ $regsend = -1; //------------------------------ +$query = 'SELECT u.jmeno, u.prijmeni, u.reg, u.si_chip, z.id, z.kat, z.pozn, z.pozn_in, z.termin, z.si_chip as t_si_chip FROM '.TBL_ZAVXUS.' as z, '.TBL_USER.' as u WHERE z.id_user = u.id AND z.id_zavod='.$id_zav.' AND u.hidden = 0 ORDER BY z.termin ASC, z.id ASC'; +@$vysledek=query_db($query); +// Fetch all rows into array +$zaznamy = $vysledek ? mysqli_fetch_all($vysledek, MYSQLI_ASSOC) : []; +$num_rows = count ($zaznamy); + @$vysledek_z=query_db("SELECT * FROM ".TBL_RACE." WHERE id=$id_zav LIMIT 1"); $zaznam_z = mysqli_fetch_array($vysledek_z); @@ -86,7 +93,8 @@ function submit_form_reg(reg_type) //--> @@ -154,71 +162,34 @@ function submit_form_reg(reg_type) set_header_col($col++,'Poř.',ALIGN_CENTER); -$data_tbl->set_header_col($col++,'Jméno',ALIGN_LEFT); -$data_tbl->set_header_col($col++,'Příjmení',ALIGN_LEFT); -$data_tbl->set_header_col_with_help($col++,'Reg.',ALIGN_CENTER,"Registrační číslo"); -$data_tbl->set_header_col($col++,'SI čip',ALIGN_RIGHT); -$data_tbl->set_header_col($col++,'Kategorie',ALIGN_CENTER); -$data_tbl->set_header_col($col++,'Kontrola',ALIGN_CENTER); -if($zaznam_z['prihlasky'] > 1) -{ - $data_tbl->set_header_col($col++,'Termín',ALIGN_CENTER); -} -$data_tbl->set_header_col($col++,'Poznámka',ALIGN_CENTER); -$data_tbl->set_header_col($col++,'Poznámka (interní)',ALIGN_CENTER); - -echo $data_tbl->get_css()."\n"; -echo $data_tbl->get_header()."\n"; -echo $data_tbl->get_header_row()."\n"; - -$query = 'SELECT u.jmeno, u.prijmeni, u.reg, u.si_chip, z.kat, z.pozn, z.pozn_in, z.termin, z.si_chip as t_si_chip FROM '.TBL_ZAVXUS.' as z, '.TBL_USER.' as u WHERE z.id_user = u.id AND z.id_zavod='.$id_zav.' AND u.hidden = 0 ORDER BY z.termin ASC, z.id ASC'; - -@$vysledek=query_db($query); - -$i=0; $err_cnt = 0; -$old_term = 1; - -while ($zaznam=mysqli_fetch_array($vysledek)) -{ - $i++; - - $row = array(); - $row[] = $i; - $row[] = $zaznam['jmeno']; - $row[] = $zaznam['prijmeni']; - $row[] = $g_shortcut.RegNumToStr($zaznam['reg']); - if ($zaznam['si_chip'] == 0) - $row[] = (($zaznam['t_si_chip'] != 0) ? ''.SINumToStr($zaznam['t_si_chip']).'' : ''); - else - $row[] = (($zaznam['t_si_chip'] != 0) ? ''.SINumToStr($zaznam['t_si_chip']).'' : SINumToStr($zaznam['si_chip'])); - $row[] = ''.$zaznam['kat'].''; - if (check_kat($zaznam['kat'])) - $kres = 'OK'; - else - { - $kres = 'Chyba*'; - $err_cnt++; - } - $kres .= ''; - $row[] = $kres; - if($zaznam_z['prihlasky'] > 1) - $row[] = $zaznam['termin']; - $row[] = $zaznam['pozn']; - $row[] = $zaznam['pozn_in']; +// define table +$tbl_renderer = RaceRendererFactory::createTable(); +$tbl_renderer->addColumns('id','jmeno','prijmeni','reg','si_chip','kat'); +$tbl_renderer->addColumns([new DefaultHeaderRenderer('Kontrola',ALIGN_CENTER), + new FormatFieldRenderer ('kat', function ($kat) use (&$err_cnt) { + if (check_kat($kat)) + return 'OK'; + else + { + $err_cnt++; + return 'Chyba*'; + } +})]); +if($zaznam_z['prihlasky'] > 1) + $tbl_renderer->addColumns('termin'); +$tbl_renderer->addColumns('pozn','pozn_in'); - if($zaznam_z['prihlasky'] > 1 && $old_term != $zaznam['termin']) - { - $old_term = $zaznam['termin']; - echo $data_tbl->get_break_row()."\n"; - } +if ($g_enable_race_capacity && isSet ($zaznam_z['kapacita']) ) { + $tbl_renderer->addBreak(new LimitBreakDetector($zaznam_z['kapacita'])); + $tbl_renderer->setRowTextPainter ( new GreyLastNPainter($zaznam_z['kapacita']) ); +} - echo $data_tbl->get_new_row_arr($row)."\n"; +if($zaznam_z['prihlasky'] > 1) { + $tbl_renderer->addBreak(new TerminBreakDetector() ); } -echo $data_tbl->get_footer()."\n"; + +echo $tbl_renderer->render( new html_table_mc(), $zaznamy, [] ); if($err_cnt > 0) { diff --git a/race_reg_view.php b/race_reg_view.php index 4c7010d..aa00f1e 100644 --- a/race_reg_view.php +++ b/race_reg_view.php @@ -12,6 +12,7 @@ require_once ("./common_race.inc.php"); require_once ("./common_user.inc.php"); require_once ('./url.inc.php'); +require_once ('./ct_renderer_race.inc.php'); $id = (IsSet($id) && is_numeric($id)) ? (int)$id : 0; $us = (int)((IsSet($us) && is_numeric($us)) ? (($us > 0) ? 1 : 0) : 0); @@ -23,14 +24,16 @@ db_Connect(); $query = 'SELECT u.*, z.kat, z.pozn, z.pozn_in, z.termin, z.si_chip as t_si_chip, z.id_user, z.transport transport, z.sedadel, z.ubytovani ubytovani FROM '.TBL_ZAVXUS.' as z, '.TBL_USER.' as u WHERE z.id_user = u.id AND z.id_zavod='.$id.' ORDER BY z.termin ASC, z.id ASC'; - @$vysledek=query_db($query); +// Fetch all rows into array +$zaznamy = $vysledek ? mysqli_fetch_all($vysledek, MYSQLI_ASSOC) : []; +$num_rows = count ($zaznamy); @$vysledek_z=query_db('SELECT * FROM '.TBL_RACE." WHERE `id`='$id' LIMIT 1"); $zaznam_z = mysqli_fetch_array($vysledek_z); - -DrawPageSubTitle('Vybraný závod'); +$kapacita = $zaznam_z['kapacita']; +DrawPageRaceTitle('Vybraný závod',$kapacita,$num_rows); RaceInfoTable($zaznam_z,'',$gr_id != _REGISTRATOR_GROUP_ID_,false,true); ?> @@ -45,137 +48,43 @@ $is_sdil_dopr_on = ($zaznam_z["transport"]==3) && $g_enable_race_transport; $is_spol_ubyt_on = ($zaznam_z["ubytovani"]==1) && $g_enable_race_accommodation; -$data_tbl = new html_table_mc(); -$col = 0; -$data_tbl->set_header_col($col++,'Poř.',ALIGN_CENTER); -$data_tbl->set_header_col($col++,'Jméno',ALIGN_LEFT); -$data_tbl->set_header_col($col++,'Příjmení',ALIGN_LEFT); -if ($us == 0) -{ - $data_tbl->set_header_col_with_help($col++,'Reg.č.',ALIGN_CENTER,"Registrační číslo"); - $data_tbl->set_header_col($col++,'SI čip',ALIGN_RIGHT); -} -// Create category header with a clickable link -$kat_header = 'Kategorie'; -$data_tbl->set_header_col($col++,$kat_header,ALIGN_CENTER); +// define table +$tbl_renderer = RaceRendererFactory::createTable(); +$tbl_renderer->addColumns('id','jmeno','prijmeni'); +if ($us == 0) + $tbl_renderer->addColumns('reg','si_chip'); +$tbl_renderer->addColumns('kat'); if($is_spol_dopr_on||$is_sdil_dopr_on) - $data_tbl->set_header_col_with_help($col++,'SD',ALIGN_CENTER,($is_spol_dopr_on?'Společná':'Sdílená').' doprava'); + $tbl_renderer->addColumns('transport'); if($is_sdil_dopr_on) - $data_tbl->set_header_col_with_help($col++,'🚗',ALIGN_CENTER,'Nabízených sedadel'); + $tbl_renderer->addColumns('sedadel'); if($is_spol_ubyt_on) - $data_tbl->set_header_col_with_help($col++,'SU',ALIGN_CENTER,'Společné ubytování'); + $tbl_renderer->addColumns('ubytovani'); if($zaznam_z['prihlasky'] > 1) - $data_tbl->set_header_col($col++,'Termín',ALIGN_CENTER); + $tbl_renderer->addColumns('termin'); if (IsLogged()) -{ - $data_tbl->set_header_col($col++,'Pozn.',ALIGN_LEFT); - $data_tbl->set_header_col($col++,'Pozn.(i)',ALIGN_LEFT); -} -echo $data_tbl->get_css()."\n"; -echo $data_tbl->get_header()."\n"; -echo $data_tbl->get_header_row()."\n"; - -$i=0; -$trans=0; -$sedadel=0; -$ubyt=0; -$category_counts = []; -while ($zaznam=mysqli_fetch_array($vysledek)) -{ - if(($select == 0 || $zaznam['chief_id'] == $usr->user_id || $zaznam['id_user'] == $usr->user_id) && $zaznam['hidden'] == 0) - { - $i++; - - // Count category occurrences - $kat = $zaznam['kat']; - if (!isset($category_counts[$kat])) { - $category_counts[$kat] = 0; - } - $category_counts[$kat]++; - - $row = array(); - $row[] = $i.''; - $row[] = $zaznam['jmeno']; - $row[] = $zaznam['prijmeni']; - if ($us == 0) - { - $row[] = $g_shortcut.RegNumToStr($zaznam['reg']); - if ($zaznam['si_chip'] == 0) - $row[] = (($zaznam['t_si_chip'] != 0) ? ''.SINumToStr($zaznam['t_si_chip']).'' : ''); - else - $row[] = (($zaznam['t_si_chip'] != 0) ? ''.SINumToStr($zaznam['t_si_chip']).'' : SINumToStr($zaznam['si_chip'])); - } - $row[] = ''.$zaznam['kat'].''; - if($is_spol_dopr_on||$is_sdil_dopr_on) - { - if ($zaznam["transport"]) - { - $row[] = ''; - $trans++; - } - else - $row[] = ''; - } - if($is_sdil_dopr_on) - $row[] = GetSharedTransportValue($zaznam["transport"], $zaznam["sedadel"], $sedadel ); - if($is_spol_ubyt_on) - { - if ($zaznam["ubytovani"]) - { - $row[] = ''; - $ubyt++; - } - else - $row[] = ''; - } - if($zaznam_z['prihlasky'] > 1) - $row[] = $zaznam['termin']; - if(IsLogged()) - { - $row[] = $zaznam['pozn']; - $row[] = $zaznam['pozn_in']; - } - echo $data_tbl->get_new_row_arr($row)."\n"; - } -} -echo $data_tbl->get_footer()."\n"; -if ($select == 0) -{ // SD pouze pro vypis vsech prihlasek -echo $is_spol_dopr_on||$is_sdil_dopr_on ? "
Počet přihlášených na dopravu: $trans" : ""; -$warning_text = $sedadel < 0 ? ' (málo volných míst)' : ''; -echo $is_sdil_dopr_on ? "
Počet volných sdílených míst: $sedadel".$warning_text : ""; -echo $is_spol_ubyt_on ? "
Počet přihlášených na ubytování: $ubyt" : ""; + $tbl_renderer->addColumns('pozn','pozn_in'); -// Sort categories alphabetically -ksort($category_counts); - -// Add collapsible section for category counts with table formatting -echo '

"; +echo $tbl_renderer->render( new html_table_mc(), $zaznamy, [] ); -// JavaScript to expand list and scroll -echo ''; +if ($select == 0) +{ // SD pouze pro vypis vsech prihlasek + $stats = countRaceStats($zaznamy, $is_sdil_dopr_on); + RenderRaceStats( + $stats, + $is_spol_dopr_on, + $is_sdil_dopr_on, + $is_spol_ubyt_on + ); } ?> diff --git a/race_regs_1.php b/race_regs_1.php index e4398a5..0917588 100644 --- a/race_regs_1.php +++ b/race_regs_1.php @@ -18,6 +18,7 @@ require_once ("./common_user.inc.php"); require_once ("./common_race.inc.php"); require_once ('./url.inc.php'); +require_once('./ct_renderer_race.inc.php'); DrawPageTitle('Přihláška člena na závody'); ?> @@ -45,7 +46,14 @@ function zmen_kat(kat) @$vysledek_z=query_db("SELECT * FROM ".TBL_RACE." WHERE id=$id"); $zaznam_z = mysqli_fetch_array($vysledek_z); -DrawPageSubTitle('Vybraný závod'); +$query = 'SELECT u.*, z.kat, z.pozn, z.pozn_in, z.termin, z.id_user, z.transport, z.sedadel, z.ubytovani FROM '.TBL_ZAVXUS.' as z, '.TBL_USER.' as u WHERE z.id_user = u.id AND z.id_zavod='.$id.' ORDER BY z.id ASC'; +$vysledek=query_db($query); +// Fetch all rows into array +$zaznamy = $vysledek ? mysqli_fetch_all($vysledek, MYSQLI_ASSOC) : []; +$num_rows = count ($zaznamy); + +$kapacita = $zaznam_z['kapacita']; +DrawPageRaceTitle('Vybraný závod',$kapacita,$num_rows); RaceInfoTable($zaznam_z,'',$gr_id != _REGISTRATOR_GROUP_ID_,false,true); ?> @@ -324,77 +332,34 @@ function aktu_line() set_header_col($col++,'Poř.',ALIGN_CENTER); -$data_tbl->set_header_col($col++,'Jméno',ALIGN_LEFT); -$data_tbl->set_header_col($col++,'Příjmení',ALIGN_LEFT); -$data_tbl->set_header_col($col++,'Kategorie',ALIGN_CENTER); +// define table +$tbl_renderer = RaceRendererFactory::createTable(); +$tbl_renderer->addColumns('id','jmeno','prijmeni','kat'); if($is_spol_dopr_on||$is_sdil_dopr_on) - $data_tbl->set_header_col_with_help($col++,'SD',ALIGN_CENTER,($is_spol_dopr_on?'Společná':'Sdílená').' doprava'); + $tbl_renderer->addColumns('transport'); if($is_sdil_dopr_on) - $data_tbl->set_header_col_with_help($col++,'🚗',ALIGN_CENTER,'Nabízených sedadel'); + $tbl_renderer->addColumns('sedadel'); if($is_spol_ubyt_on) - $data_tbl->set_header_col_with_help($col++,'SU',ALIGN_CENTER,'Společné ubytování'); + $tbl_renderer->addColumns('ubytovani'); if($zaznam_z['prihlasky'] > 1) - $data_tbl->set_header_col($col++,'Termín',ALIGN_CENTER); -$data_tbl->set_header_col($col++,'Pozn.',ALIGN_LEFT); -$data_tbl->set_header_col($col++,'Pozn.(i)',ALIGN_LEFT); + $tbl_renderer->addColumns('termin'); +$tbl_renderer->addColumns('pozn','pozn_in'); -echo $data_tbl->get_css()."\n"; -echo $data_tbl->get_header()."\n"; -echo $data_tbl->get_header_row()."\n"; +if ($g_enable_race_capacity && isSet ($zaznam_z['kapacita']) ) { + $tbl_renderer->addBreak(new LimitBreakDetector($zaznam_z['kapacita'])); + $tbl_renderer->setRowTextPainter ( new GreyLastNPainter($zaznam_z['kapacita']) ); +} -@$vysledek=query_db("SELECT z.*, u.jmeno, u.prijmeni FROM ".TBL_ZAVXUS." z, ".TBL_USER." u WHERE z.id_zavod=$id AND z.id_user = u.id ORDER BY id"); -//SELECT zavxus.*, users.jmeno, users.prijmeni FROM zavxus, users WHERE id_zavod=1 AND zavxus.id_user = users.id ORDER BY id +echo $tbl_renderer->render( new html_table_mc(), $zaznamy, [] ); -$i=0; -$trans=0; -$sedadel=0; -$ubyt=0; -while ($zaznam=mysqli_fetch_array($vysledek)) -{ - $i++; - - $row = array(); - $row[] = $i.''; - $row[] = $zaznam['jmeno']; - $row[] = $zaznam['prijmeni']; - $row[] = ''.$zaznam['kat'].''; - if($is_spol_dopr_on||$is_sdil_dopr_on) - { - if ($zaznam["transport"]) - { - $row[] = ''; - $trans++; - } - else - $row[] = ''; - } - if($is_sdil_dopr_on) - $row[] = GetSharedTransportValue($zaznam["transport"], $zaznam["sedadel"], $sedadel ); - if($is_spol_ubyt_on) - { - if ($zaznam["ubytovani"]) - { - $row[] = ''; - $ubyt++; - } - else - $row[] = ''; - } - if($zaznam_z['prihlasky'] > 1) - $row[] = $zaznam['termin']; - $row[] = $zaznam['pozn']; - $row[] = $zaznam['pozn_in']; - echo $data_tbl->get_new_row_arr($row)."\n"; -} -echo $data_tbl->get_footer()."\n"; +$stats = countRaceStats($zaznamy, $is_sdil_dopr_on); +RenderRaceStats( + $stats, + $is_spol_dopr_on, + $is_sdil_dopr_on, + $is_spol_ubyt_on +); -echo $is_spol_dopr_on||$is_sdil_dopr_on ? "
Počet přihlášených na dopravu: $trans" : ""; -$warning_text = $sedadel < 0 ? ' (málo volných míst)' : ''; -echo $is_sdil_dopr_on ? "
Počet volných sdílených míst: $sedadel".$warning_text : ""; -echo $is_spol_ubyt_on ? "
Počet přihlášených na ubytování: $ubyt" : ""; ?>
diff --git a/race_regs_1_exc.php b/race_regs_1_exc.php index c4e1f88..85d5bb0 100644 --- a/race_regs_1_exc.php +++ b/race_regs_1_exc.php @@ -85,6 +85,9 @@ or die("Chyba při provádění dotazu do databáze."); if ($result == FALSE) die ("Nepodařilo se změnit přihlášku člena."); + if ($result !== false && mysqli_affected_rows($db_conn) > 0) { + query_db("UPDATE ".TBL_RACE." SET prihlasenych = GREATEST(0, prihlasenych - 1) WHERE id = '$id'"); + } } else { // update @@ -114,6 +117,9 @@ or die("Chyba při provádění dotazu do databáze."); if ($result == FALSE) die ("Nepodařilo se změnit přihlášku člena."); + if ($result !== false && mysqli_affected_rows($db_conn) > 0) { + query_db("UPDATE ".TBL_RACE." SET prihlasenych = prihlasenych + 1 WHERE id = '$id'"); + } } } } diff --git a/race_regs_all_exc.php b/race_regs_all_exc.php index 73df2b2..4e92034 100644 --- a/race_regs_all_exc.php +++ b/race_regs_all_exc.php @@ -79,6 +79,9 @@ or die("Chyba při provádění dotazu do databáze."); if ($result == FALSE) die ("Nepodařilo se změnit přihlášku člena."); + if ($result !== false && mysqli_affected_rows($db_conn) > 0) { + query_db("UPDATE ".TBL_RACE." SET prihlasenych = GREATEST(0, prihlasenych - 1) WHERE id = '$id'"); + } } else { // update @@ -108,6 +111,9 @@ or die("Chyba při provádění dotazu do databáze."); if ($result == FALSE) die ("Nepodařilo se změnit přihlášku člena."); + if ($result !== false && mysqli_affected_rows($db_conn) > 0) { + query_db("UPDATE ".TBL_RACE." SET prihlasenych = prihlasenych + 1 WHERE id = '$id'"); + } } // jinak stale neprihlasen } diff --git a/racelist.inc.php b/racelist.inc.php deleted file mode 100644 index 28d0d14..0000000 --- a/racelist.inc.php +++ /dev/null @@ -1,110 +0,0 @@ - - -
- - - 0) -{ - show_link_to_actual_race($num_rows); - - $data_tbl = new html_table_mc(); - $col = 0; - $data_tbl->set_header_col($col++,'Datum',ALIGN_CENTER); - $data_tbl->set_header_col($col++,'Název',ALIGN_LEFT); - $data_tbl->set_header_col($col++,'Místo',ALIGN_LEFT); - $data_tbl->set_header_col_with_help($col++,'Poř.',ALIGN_CENTER,"Pořadatel"); - $data_tbl->set_header_col_with_help($col++,'T',ALIGN_CENTER,"Typ akce"); - $data_tbl->set_header_col_with_help($col++,'S',ALIGN_CENTER,"Sport"); - $data_tbl->set_header_col_with_help($col++,'W',ALIGN_CENTER,"Web závodu"); - $data_tbl->set_header_col_with_help($col++,'Př',ALIGN_CENTER,"Zobrazit přihlášené"); - $data_tbl->set_header_col($col++,'Přihlášky',ALIGN_CENTER); - if($g_enable_race_boss) - $data_tbl->set_header_col($col++,'Vedoucí',ALIGN_CENTER); - echo $data_tbl->get_css()."\n"; - echo $data_tbl->get_header()."\n"; - echo $data_tbl->get_header_row()."\n"; - - $brk_tbl = false; - $i = 1; - $old_year = 0; - while ($zaznam=mysqli_fetch_array($vysledek)) - { - if($zaznam['vicedenni']) - $datum=Date2StringFT($zaznam['datum'],$zaznam['datum2']); - else - $datum=Date2String($zaznam['datum']); - - $prihlasky_curr = raceterms::GetActiveRegDateArr($zaznam); - $prihlasky_out_term = Date2String($prihlasky_curr[0]); - if($zaznam['prihlasky'] > 1) - $prihlasky_out_term .= ' / '.$prihlasky_curr[1]; - $time_to_reg = GetTimeToReg($prihlasky_curr[0]); - $termin = raceterms::ColorizeTermUser($time_to_reg,$prihlasky_curr,$prihlasky_out_term); - - $nazev = ''.GetFormatedTextDel($zaznam['nazev'], $zaznam['cancelled']).''; - $misto = GetFormatedTextDel($zaznam['misto'], $zaznam['cancelled']); - $oddil = $zaznam['oddil']; - $typ0 = GetRaceType0($zaznam['typ0']); - $typ = GetRaceTypeImg($zaznam['typ']); - $odkaz = GetRaceLinkHTML($zaznam['odkaz']); - $prihl2 = "Zbr"; - - if (!$brk_tbl && $zaznam['datum'] >= $curr_date) - { - if($i != 1) - echo $data_tbl->get_break_row()."\n"; - $brk_tbl = true; - } - else if($i != 1 && Date2Year($zaznam['datum']) != $old_year) - { - echo $data_tbl->get_break_row(true)."\n"; - } - - if($g_enable_race_boss) - { - $boss = '-'; - if($zaznam['vedouci'] != 0) - { - @$vysledekU=query_db("SELECT jmeno,prijmeni FROM ".TBL_USER." WHERE id = '".$zaznam['vedouci']."' LIMIT 1"); - @$zaznamU=mysqli_fetch_array($vysledekU); - if($zaznamU != FALSE) - $boss = $zaznamU['jmeno'].' '.$zaznamU['prijmeni']; - } - echo $data_tbl->get_new_row($datum,$nazev,$misto,$oddil,$typ0,$typ,$odkaz,$prihl2,$termin,$boss); - } - else - echo $data_tbl->get_new_row($datum,$nazev,$misto,$oddil,$typ0,$typ,$odkaz,$prihl2,$termin); - $i++; - $old_year = Date2Year($zaznam['datum']); - } - echo $data_tbl->get_footer()."\n"; -} -else -{ - echo "Termínová listina je prázdná.
"; -} -?> -
- -
\ No newline at end of file diff --git a/rg_ad_races.inc.php b/rg_ad_races.inc.php index e0d6ba9..9bf5342 100644 --- a/rg_ad_races.inc.php +++ b/rg_ad_races.inc.php @@ -14,6 +14,7 @@ 0) { show_link_to_actual_race($num_rows); - $data_tbl = new html_table_mc(); - $col = 0; - $data_tbl->set_header_col($col++,'Datum',ALIGN_CENTER,0); - $data_tbl->set_header_col($col++,'Název',ALIGN_LEFT); - $data_tbl->set_header_col($col++,'Místo',ALIGN_LEFT); - $data_tbl->set_header_col_with_help($col++,'Poř.',ALIGN_CENTER,"Pořadatel"); + // define table + $tbl_renderer = RacesRendererFactory::createTable(); + $tbl_renderer->addColumns('datum','nazev','misto','oddil'); if ($ext_id_active_oris) - $data_tbl->set_header_col_with_help($col++,'O',ALIGN_CENTER,"závod v ORISu"); - $data_tbl->set_header_col_with_help($col++,'T',ALIGN_CENTER,"Typ akce"); - $data_tbl->set_header_col_with_help($col++,'S',ALIGN_CENTER,"Sport"); - $data_tbl->set_header_col_with_help($col++,'W',ALIGN_CENTER,"Web závodu"); - $data_tbl->set_header_col($col++,'Možnosti',ALIGN_CENTER); - $data_tbl->set_header_col($col++,'Přihlášky',ALIGN_CENTER); + $tbl_renderer->addColumns('ext_id'); + $tbl_renderer->addColumns('typ0','typ','odkaz'); + if ($g_enable_race_capacity) + $tbl_renderer->addColumns('ucast'); + $tbl_renderer->addColumns(['moznosti', new CallbackRenderer ( function ( RowData $row, array $options ) : string { + $race_is_old = (GetTimeToRace($row->rec['datum']) == -1); + $ucast = " / rec['id']."','')\">Účast"; + if(!$race_is_old || IsLoggedAdmin()) + { + $s1 = "rec['id']."','')\">Vý. / rec['id']."','')\">SI / rec['id']."&show_ed=1','')\">P.1 / rec['id']."','')\">P.V / "; + $s2 = "rec['id']."','',600,600)\">Zbr"; + $s3 = (GetTimeToRace($row->rec['datum']) <= 0) ? $ucast :''; + return $s1.$s2.$s3; + } + else + { + return "rec['id']."','',600,600)\">Zobrazit".$ucast; + } + })]); + $tbl_renderer->addColumns(['prihlasky', new CallbackRenderer ( function ( RowData $row, array $options ) : string { + $race_is_old = (GetTimeToRace($row->rec['datum']) == -1); + $prihlasky_curr = raceterms::GetActiveRegDateArr($row->rec); + $prihlasky=Date2String($prihlasky_curr[0]); + if($row->rec['prihlasky'] > 1) + $prihlasky .= ' / '.$prihlasky_curr[1]; + + if ($race_is_old) + $prihlasky_out = ''.$prihlasky.''; + else if ($prihlasky_curr != 0 && GetTimeToReg($prihlasky_curr[0]) == -1) + $prihlasky_out = ''.$prihlasky.''; + else + $prihlasky_out = $prihlasky; + + if($row->rec['prihlasky'] > 1 && !$race_is_old) + { // insert before - previous term. + $prihlasky_prev = raceterms::GetActiveRegDateArrPrev($row->rec); + + if ($prihlasky_prev[0] != 0) + $prihlasky_out = ''.Date2String($prihlasky_prev[0]).' / '.$prihlasky_prev[1].'
'.$prihlasky_out; + } + return $prihlasky_out; + } )]); if($g_enable_race_boss) - $data_tbl->set_header_col($col++,'Vedoucí',ALIGN_CENTER); - $data_tbl->set_header_col_with_help($col++,'OP',ALIGN_CENTER,"Stav odeslání přihlášky"); - - echo $data_tbl->get_css()."\n"; - echo $data_tbl->get_header()."\n"; - echo $data_tbl->get_header_row()."\n"; - - $i = 1; - $brk_tbl = false; - $old_year = 0; - while ($zaznam=mysqli_fetch_array($vysledek)) - { - $row = array(); - - $race_is_old = (GetTimeToRace($zaznam['datum']) == -1); - - $prefix = ($race_is_old) ? '' : ''; - $suffix = ($race_is_old) ? '' : ''; - - if($zaznam['vicedenni']) - $datum=Date2StringFT($zaznam['datum'],$zaznam['datum2']); - else - $datum=Date2String($zaznam['datum']); - - //---------------------------- - $prihlasky_curr = raceterms::GetActiveRegDateArr($zaznam); - $prihlasky=Date2String($prihlasky_curr[0]); - if($zaznam['prihlasky'] > 1) - $prihlasky .= ' / '.$prihlasky_curr[1]; - - if ($race_is_old) - $prihlasky_out = ''.$prihlasky.''; - else if ($prihlasky_curr != 0 && GetTimeToReg($prihlasky_curr[0]) == -1) - $prihlasky_out = ''.$prihlasky.''; - else - $prihlasky_out = $prihlasky; - - if($zaznam['prihlasky'] > 1 && !$race_is_old) - { // insert before - previous term. - $prihlasky_prev = raceterms::GetActiveRegDateArrPrev($zaznam); - - if ($prihlasky_prev[0] != 0) - $prihlasky_out = ''.Date2String($prihlasky_prev[0]).' / '.$prihlasky_prev[1].'
'.$prihlasky_out; - } - //---------------------------- - $row[] = $prefix.$datum.$suffix; - $row[] = "".$prefix.GetFormatedTextDel($zaznam['nazev'], $zaznam['cancelled']).$suffix.""; - $row[] = $prefix.GetFormatedTextDel($zaznam['misto'], $zaznam['cancelled']).$suffix; - $row[] = $prefix.$zaznam['oddil'].$suffix; - if ($ext_id_active_oris) - { - $ext_id = $zaznam['ext_id']; - $row[] = (!empty ($ext_id)) ? 'A' : '-'; - } - $row[] = GetRaceType0($zaznam['typ0']); - $row[] = GetRaceTypeImg($zaznam['typ']).''; - $row[] = GetRaceLinkHTML($zaznam['odkaz']); - $ucast = " / Účast"; - if(!$race_is_old || IsLoggedAdmin()) - { - $s1 = "Vý. / SI / P.1 / P.V / "; - $s2 = "Zbr"; - $s3 = (GetTimeToRace($zaznam['datum']) <= 0) ? $ucast :''; - $row[] = $s1.$s2.$s3; - } - else - { - $row[] = "Zobrazit".$ucast; - } - - $row[] = $prihlasky_out; - - if($g_enable_race_boss) - { - $row[] = (($zaznam['vedouci'] != 0) ? 'A / ': '')."Edit"; - } - - if($zaznam['send'] > 0) - $row[] = ($zaznam['prihlasky'] > 1) ? $zaznam['send'].'.t.' : 'Ano'; - else - $row[] = 'Ne'; - - if (!$brk_tbl && $zaznam['datum'] >= GetCurrentDate()) - { - if($i != 1) - echo $data_tbl->get_break_row()."\n"; - $brk_tbl = true; - } - else if($i != 1 && Date2Year($zaznam['datum']) != $old_year) - { - echo $data_tbl->get_break_row(true)."\n"; - } - - echo $data_tbl->get_new_row_arr($row)."\n"; - $i++; - $old_year = Date2Year($zaznam['datum']); + $tbl_renderer->addColumns(['vedouci', new CallbackRenderer ( function ( RowData $row, array $options ) : string { + return (($row->rec['vedouci'] != 0) ? 'A / ': '')."rec['id']."','')\">Edit"; + })]); + $tbl_renderer->addColumns([ + new HelpHeaderRenderer ( 'OP',ALIGN_CENTER,"Stav odeslání přihlášky" ), + new CallbackRenderer ( function ( RowData $row, array $options ) : string { + if($row->rec['send'] > 0) + return ($row->rec['prihlasky'] > 1) ? $row->rec['send'].'.t.' : 'Ano'; + else + return 'Ne'; + } ) + ]); + + $tbl_renderer->setRowTextPainter ( new GreyOldPainter() ); + + if ($fC == 1) { + // old races - add breaks + $tbl_renderer->addBreak(new YearExpanderDetector()); + $tbl_renderer->setRowAttrsExt ( YearExpanderDetector::yearGroupRowAttrsExtender(...)); + } + else { + $tbl_renderer->addBreak(new YearBreakDetector()); + $tbl_renderer->addBreak(new FutureRaceBreakDetector()); } - echo $data_tbl->get_footer()."\n"; + echo $tbl_renderer->render( new html_table_mc(), $zaznamy, $renderer_option ); } //obsolete - echo('Výpis všech členů pro centrální registraci
'); echo('Vytvoření a export přihlášky pro prázdný závod
'); diff --git a/rg_ad_races_edit.inc.php b/rg_ad_races_edit.inc.php index 33c67b0..f08388d 100644 --- a/rg_ad_races_edit.inc.php +++ b/rg_ad_races_edit.inc.php @@ -33,6 +33,7 @@ function toggleButtonState() { require_once ('./common_race.inc.php'); require_once ('./url.inc.php'); +require_once ('./ct_renderer_races.inc.php'); $fA = (IsSet($fA) && is_numeric($fA)) ? (int)$fA : 0; $fB = (IsSet($fB) && is_numeric($fB)) ? (int)$fB : 0; @@ -42,93 +43,54 @@ function toggleButtonState() { if (!$g_is_release) { // pri debug zobrazit - @$vysledek=query_db("SELECT id,datum,typ,typ0,datum2,odkaz,nazev,vicedenni,kategorie,oddil,misto,modify_flag,cancelled,ext_id FROM ".TBL_RACE.$sql_sub_query.' ORDER BY datum , datum2, id'); + @$vysledek=query_db("SELECT id,datum,typ,typ0,datum2,odkaz,nazev,vicedenni,kategorie,oddil,kapacita,prihlasenych,misto,modify_flag,cancelled,ext_id FROM ".TBL_RACE.$sql_sub_query.' ORDER BY datum , datum2, id'); } else { - @$vysledek=query_db("SELECT id,datum,typ,typ0,datum2,odkaz,nazev,vicedenni,kategorie,oddil,misto,cancelled,ext_id FROM ".TBL_RACE.$sql_sub_query.' ORDER BY datum, datum2, id'); + @$vysledek=query_db("SELECT id,datum,typ,typ0,datum2,odkaz,nazev,vicedenni,kategorie,oddil,kapacita,prihlasenych,misto,cancelled,ext_id FROM ".TBL_RACE.$sql_sub_query.' ORDER BY datum, datum2, id'); } $ext_id_active_oris = ($g_external_is_connector === 'OrisCZConnector'); -$data_tbl = new html_table_mc(); -$col = 0; -$data_tbl->set_header_col($col++,'Datum',ALIGN_CENTER); -$data_tbl->set_header_col($col++,'Název',ALIGN_LEFT); -$data_tbl->set_header_col($col++,'Místo',ALIGN_LEFT); -$data_tbl->set_header_col_with_help($col++,'Poř.',ALIGN_CENTER,"Pořadatel"); +// Fetch all rows into array +$zaznamy = $vysledek ? mysqli_fetch_all($vysledek, MYSQLI_ASSOC) : []; + +$renderer_option['curr_date'] = GetCurrentDate(); + +// define table +$tbl_renderer = RacesRendererFactory::createTable(); +$tbl_renderer->addColumns('datum','nazev','misto','oddil'); if ($ext_id_active_oris) - $data_tbl->set_header_col_with_help($col++,'O',ALIGN_CENTER,"závod v ORISu"); -$data_tbl->set_header_col_with_help($col++,'T',ALIGN_CENTER,"Typ akce"); -$data_tbl->set_header_col_with_help($col++,'S',ALIGN_CENTER,"Sport"); -$data_tbl->set_header_col_with_help($col++,'W',ALIGN_CENTER,"Web závodu"); -$data_tbl->set_header_col_with_help($col++,'Kat',ALIGN_CENTER,"Zadané kategorie"); -$data_tbl->set_header_col($col++,'Možnosti',ALIGN_CENTER); + $tbl_renderer->addColumns('ext_id'); +$tbl_renderer->addColumns('typ0','typ','odkaz', ['kategorie', new FormatFieldRenderer ('kategorie', function ($kategorie) { + return (strlen($kategorie) > 0) ? 'A' :'N'; + })]); +if ($g_enable_race_capacity) + $tbl_renderer->addColumns('ucast'); +$tbl_renderer->addColumns(['moznosti', new FormatFieldRenderer ( 'id', function ( $id ) : string { + return "Edit / Kategorie / Smazat"; + })]); if (!$g_is_release) { // pri debug zobrazit - $data_tbl->set_header_col($col++,'Změny',ALIGN_CENTER); + $tbl_renderer->addColumns([ + new DefaultHeaderRenderer ( 'Změny',ALIGN_CENTER ), + new FormatFieldRenderer ( 'modify_flag', 'GetModifyFlagDesc' ) + ]); } -echo $data_tbl->get_css()."\n"; -echo $data_tbl->get_header()."\n"; -echo $data_tbl->get_header_row()."\n"; - -$i = 1; -$brk_tbl = false; -$old_year = 0; -if($vysledek && ($num_rows = mysqli_num_rows($vysledek)) > 0) -{ - show_link_to_actual_race($num_rows); - while ($zaznam=mysqli_fetch_array($vysledek)) - { - $row = array(); - - $race_is_old = (GetTimeToRace($zaznam['datum']) == -1); - - $prefix = ($race_is_old) ? '' : ''; - $suffix = ($race_is_old) ? '' : ''; - - if($zaznam['vicedenni']) - $datum=Date2StringFT($zaznam['datum'],$zaznam['datum2']); - else - $datum=Date2String($zaznam['datum']); - - $row[] = $prefix.$datum.$suffix; - $row[] = "".$prefix.GetFormatedTextDel($zaznam['nazev'], $zaznam['cancelled']).$suffix.""; - $row[] = $prefix.GetFormatedTextDel($zaznam['misto'], $zaznam['cancelled']).$suffix; - $row[] = $prefix.$zaznam['oddil'].$suffix; - if ($ext_id_active_oris) - { - $ext_id = $zaznam['ext_id']; - $row[] = (!empty ($ext_id)) ? 'A' : '-'; - } - $row[] = GetRaceType0($zaznam['typ0']); - $row[] = GetRaceTypeImg($zaznam['typ']); - $row[] = GetRaceLinkHTML($zaznam['odkaz']); - $row[] = (strlen($zaznam['kategorie']) > 0) ? 'A' :'N'; - $row [] = "Edit / Kategorie / Smazat"; - if (!$g_is_release) - { // pri debug zobrazit - $row[] = GetModifyFlagDesc($zaznam['modify_flag']); - } - if (!$brk_tbl && $zaznam['datum'] >= GetCurrentDate()) - { - if($i != 1) - echo $data_tbl->get_break_row()."\n"; - $brk_tbl = true; - } - else if($i != 1 && Date2Year($zaznam['datum']) != $old_year) - { - echo $data_tbl->get_break_row(true)."\n"; - } - - echo $data_tbl->get_new_row_arr($row)."\n"; - $i++; - $old_year = Date2Year($zaznam['datum']); - } +$tbl_renderer->setRowTextPainter ( new GreyOldPainter() ); + +if ($fC == 1) { + // old races - add breaks + $tbl_renderer->addBreak(new YearExpanderDetector()); + $tbl_renderer->setRowAttrsExt ( YearExpanderDetector::yearGroupRowAttrsExtender(...)); +} +else { + $tbl_renderer->addBreak(new YearBreakDetector()); + $tbl_renderer->addBreak(new FutureRaceBreakDetector()); } -echo $data_tbl->get_footer()."\n"; +echo $tbl_renderer->render( new html_table_mc(), $zaznamy, $renderer_option ); echo '


'; DrawPageSubTitleCenter('Vytváření nových závodů'); diff --git a/us_news.inc.php b/us_news.inc.php index 0188ac1..db8c4ec 100644 --- a/us_news.inc.php +++ b/us_news.inc.php @@ -38,25 +38,17 @@ require_once ('./common_race.inc.php'); require_once ('./url.inc.php'); +require_once ('./ct_renderer_races.inc.php'); if(SHOW_USER) { - @$vysledek1=query_db("SELECT id_zavod, kat, termin FROM ".TBL_ZAVXUS." where id_user=$usr->user_id"); - - while ($zaznam1=mysqli_fetch_array($vysledek1)) - { - $z=$zaznam1['id_zavod']; - $zav[$z]=$zaznam1['kat']; - $zav_t[$z]=$zaznam1['termin']; - $zaz[]=$zaznam1['id_zavod']; - } - @$vysledek2=query_db("SELECT * FROM ".TBL_USER." where id=$usr->user_id"); $entry_lock = false; if ($zaznam2=mysqli_fetch_array($vysledek2)) { $entry_lock = ($zaznam2['entry_locked'] != 0); } + $renderer_option['entry_lock'] = $entry_lock; ?> 0) { if ($entry_lock) @@ -86,126 +63,27 @@ function confirm_delete() { show_link_to_actual_race($num_rows); - $data_tbl = new html_table_mc(); - $col = 0; - $data_tbl->set_header_col($col++,'Datum',ALIGN_CENTER); - $data_tbl->set_header_col($col++,'Název',ALIGN_LEFT); - $data_tbl->set_header_col($col++,'Místo',ALIGN_LEFT); - $data_tbl->set_header_col_with_help($col++,'Poř.',ALIGN_CENTER,"Pořadatel"); - $data_tbl->set_header_col_with_help($col++,'T',ALIGN_CENTER,"Typ akce"); - $data_tbl->set_header_col_with_help($col++,'S',ALIGN_CENTER,"Sport"); - $data_tbl->set_header_col_with_help($col++,'W',ALIGN_CENTER,"Web závodu"); - if ($g_enable_race_capacity) { - $data_tbl->set_header_col_with_help($col++,'Účast',ALIGN_CENTER,"Přihlášeno/Kapacita"); - } - $data_tbl->set_header_col($col++,'Možnosti',ALIGN_CENTER); - $data_tbl->set_header_col($col++,'Přihlášky',ALIGN_CENTER); + // define table + $tbl_renderer = RacesRendererFactory::createTable(); + $tbl_renderer->addColumns('datum','nazev','misto','oddil','typ0','typ','odkaz'); + if ($g_enable_race_capacity) + $tbl_renderer->addColumns('ucast'); + $tbl_renderer->addColumns('moznosti','prihlasky'); if($g_enable_race_boss) - $data_tbl->set_header_col($col++,'Vedoucí',ALIGN_CENTER); - - echo $data_tbl->get_css()."\n"; - echo $data_tbl->get_header()."\n"; - echo $data_tbl->get_header_row()."\n"; - - $i = 1; - $brk_tbl = false; - $old_year = 0; - foreach ($zaznamy as $zaznam) - { - $row = array(); - if($zaznam['vicedenni']) - $datum=Date2StringFT($zaznam['datum'],$zaznam['datum2']); - else - $datum=Date2String($zaznam['datum']); - $row[] = $datum; - $row[] = ''.GetFormatedTextDel($zaznam['nazev'], $zaznam['cancelled']).''; - $row[] = GetFormatedTextDel($zaznam['misto'], $zaznam['cancelled']); - $row[] = $zaznam['oddil']; - $row[] = GetRaceType0($zaznam['typ0']); - $row[] = GetRaceTypeImg($zaznam['typ']); - $row[] = GetRaceLinkHTML($zaznam['odkaz']); - - if ($g_enable_race_capacity) { - $registered = isset($count_registered[$zaznam['id']]) ? $count_registered[$zaznam['id']] : 0; - $kapacita = (int)$zaznam['kapacita']; - $alert = $kapacita - $registered < 10 ? 'class="TextAlert7"' : ''; - - if ($kapacita > 0) { - $row[] = '' .$registered . '/' . $kapacita . ''; - } else { - $row[] = $registered ?: ''; // show nothing if zero - } - } - - $prihlasky_curr = raceterms::GetActiveRegDateArr($zaznam); - $prihlasky_out_term = Date2String($prihlasky_curr[0]); - if($zaznam['prihlasky'] > 1) - $prihlasky_out_term .= ' / '.$prihlasky_curr[1]; - $time_to_reg = GetTimeToReg($prihlasky_curr[0]); - $termin = raceterms::ColorizeTermUser($time_to_reg,$prihlasky_curr,$prihlasky_out_term); - - $prihl_finish = ($time_to_reg == -1 && $prihlasky_curr[0] != 0) || ($prihlasky_curr[0] == 0 && $zaznam['datum'] <= $curr_date); - $zbr = "Zbr"; - - if($zaznam['kat'] == NULL) - { // neni prihlasen - if (!$prihl_finish && !$entry_lock) - { - $row[] = "user_id."','')\">Přihl. / ".$zbr; - } - else - { - $row[] = "Zobrazit"; - } - } - else - { // je prihlasen - $prihl_finish2 = $prihl_finish || ( $prihlasky_curr[0] != 0 && $prihlasky_curr[1] != $zaznam['termin']); - if($prihl_finish2 != $prihl_finish) - { - $row[] = "".$zaznam['kat'].' / '.$zaznam['termin']; - } - else if (!$prihl_finish && !$entry_lock) - { - $row[] = "user_id."','')\" class=\"Highlight\">".$zaznam['kat']." / user_id."','')\" onclick=\"return confirm_delete();\" class=\"Erase\">Od."; - } - else - { - $row[] = "".$zaznam['kat'].''; - } - } - - $row[] = raceterms::ColorizeTermUser($time_to_reg,$prihlasky_curr,$prihlasky_out_term); - - if($g_enable_race_boss) - { - $link_to_participation = " / Účast"; - $show_link = ($zaznam['vedouci_id'] == $usr->user_id) && (GetTimeToRace($zaznam['datum']) <= 0); - $boss = '-'; - if($zaznam['vedouci'] != '-') - { - $boss = $zaznam['vedouci'].($show_link ? $link_to_participation : ''); - } - $row[] = $boss; - } - - if (!$brk_tbl && $zaznam['datum'] >= $curr_date) - { - if($i != 1) - echo $data_tbl->get_break_row()."\n"; - $brk_tbl = true; - } - else if($i != 1 && Date2Year($zaznam['datum']) != $old_year) - { - echo $data_tbl->get_break_row(true)."\n"; - } - - echo $data_tbl->get_new_row_arr($row)."\n"; - $old_year = Date2Year($zaznam['datum']); - $i++; + $tbl_renderer->addColumns('vedouci'); + if ($fC == 1) { + // old races - add breaks + $tbl_renderer->addBreak(new YearExpanderDetector()); + $tbl_renderer->setRowAttrsExt ( YearExpanderDetector::yearGroupRowAttrsExtender(...)); + } + else { + $tbl_renderer->addBreak(new YearBreakDetector()); + $tbl_renderer->addBreak(new FutureRaceBreakDetector()); } - echo $data_tbl->get_footer()."\n"; + + echo $tbl_renderer->render( new html_table_mc(), $zaznamy, $renderer_option ); } + echo('Vytvoření a export přihlášky pro prázdný závod
'); ?>
diff --git a/user_finance.inc.php b/user_finance.inc.php index 09f9e72..6253ac3 100644 --- a/user_finance.inc.php +++ b/user_finance.inc.php @@ -61,12 +61,15 @@ $row_date = substr($zaznam['date'],0,4); if ($year != $row_date) { $year = $row_date; - $odkaz = ""; + $odkaz = ""; echo $data_tbl->get_info_row($odkaz)."\n"; } - //prasacky schovane radky krome poslednich 2 let - ($year+1 < date("Y"))?($class = $year."\" style=\"display:none") : ($class = $year); - echo $data_tbl->get_new_row_arr($row, $class)."\n"; + + $attrs = [ 'data-group' => $year ]; + if ($year < date("Y")) + $attrs['style'] = "display:none"; + + echo $data_tbl->get_new_row_arr($row, $attrs)."\n"; $i++; } if ($i > 0) diff --git a/user_new.inc.php b/user_new.inc.php index 09bd5a7..c75a228 100644 --- a/user_new.inc.php +++ b/user_new.inc.php @@ -35,6 +35,7 @@ function focusOn(elem) $zaznam['lic'] = 'C'; $zaznam['lic_mtbo'] = '-'; $zaznam['lic_lob'] = '-'; + $zaznam['finance_type'] = '-'; $zaznam['hidden'] = 0; $zaznam['fin'] = ''; $zaznam['rc'] = '';