From afc8a6e1f5f88b4284c9cdebfd91ce233735f603 Mon Sep 17 00:00:00 2001 From: salam Date: Sun, 18 Oct 2026 17:49:22 +0200 Subject: [PATCH] wip watten --- packages/watten | 1 - .../Classes/Controller/EidController.php | 71 + .../Classes/Controller/WattenController.php | 71 + packages/watten/Classes/Daten/Berechnung.php | 191 + .../watten/Classes/Domain/Model/Athleten.php | 117 + .../Classes/Domain/Model/Ergebnisse.php | 170 + .../watten/Classes/Domain/Model/Events.php | 119 + .../Domain/Repository/AthletenRepository.php | 49 + .../Repository/ErgebnisseRepository.php | 120 + .../Domain/Repository/GstrichenRepository.php | 111 + .../Domain/Repository/RanglisteRepository.php | 149 + .../Domain/Repository/SpieltageRepository.php | 146 + .../Domain/Repository/StatistikRepository.php | 395 + packages/watten/Classes/Hooks/DataHandler.php | 75 + .../watten/Classes/Scheduler/CronTask.php | 20 + packages/watten/Classes/Tca/Configuration.php | 34 + .../Classes/Utilities/CookieUtility.php | 55 + .../FlexForms/flexform_watten.xml | 38 + packages/watten/Configuration/Icons.php | 8 + .../Configuration/RequestMiddlewares.php | 12 + .../TCA/Overrides/sys_template.php | 4 + .../TCA/Overrides/tt_content.php | 32 + .../tx_watten_domain_model_athleten.php | 9 + .../tx_watten_domain_model_ergebnisse.php | 9 + .../tx_watten_domain_model_events.php | 9 + .../TCA/tx_watten_domain_model_athleten.php | 107 + .../TCA/tx_watten_domain_model_ergebnisse.php | 169 + .../TCA/tx_watten_domain_model_events.php | 84 + .../TCA/tx_watten_tournaments.php | 50 + .../TypoScript/constants.typoscript | 14 + .../Configuration/TypoScript/setup.typoscript | 37 + packages/watten/Readme.md | 29 + packages/watten/Resources/Private/.htaccess | 11 + .../Private/Partials/GridErgebnisse.html | 99 + .../Private/Partials/GridGstrichen.html | 54 + .../Private/Partials/GridPaarlauf.html | 136 + .../Private/Partials/GridRangliste.html | 55 + .../Private/Partials/SelectPaarlauf.html | 31 + .../Private/Partials/SelectRangliste.html | 25 + .../Private/Partials/SelectSpieltag.html | 26 + .../Private/Partials/SelectTeilnehmer.html | 25 + .../Private/Partials/SelectTournament.html | 37 + .../Private/Partials/StatistikErgebnisse.html | 6 + .../Private/Partials/StatistikRangliste.html | 6 + .../Private/Templates/Watten/Ergebnisse.html | 26 + .../Private/Templates/Watten/Rangliste.html | 24 + .../Private/Templates/Watten/Statistik.html | 25 + packages/watten/Resources/Private/readme.md | 1 + packages/watten/Resources/Public/Css/base.css | 1 + .../Resources/Public/Css/images/Schellen.png | Bin 0 -> 6552 bytes .../Resources/Public/Css/jsgrid-dark.css | 326 + .../watten/Resources/Public/Icons/Bold.svg | 3 + .../watten/Resources/Public/Icons/Bowling.svg | 4 + .../watten/Resources/Public/Icons/Bum.svg | 4 + .../Resources/Public/Icons/Calender.svg | 5 + .../watten/Resources/Public/Icons/Degen.svg | 25 + .../Resources/Public/Icons/Extension.svg | 4 + .../Resources/Public/Icons/Gstrichen-lose.svg | 4 + .../Resources/Public/Icons/Gstrichen-win.svg | 4 + .../Resources/Public/Icons/Gstrichen.svg | 4 + .../watten/Resources/Public/Icons/Hashtag.svg | 5 + .../watten/Resources/Public/Icons/Krone.svg | 5 + .../watten/Resources/Public/Icons/List.svg | 3 + .../watten/Resources/Public/Icons/Loos.svg | 3 + .../Resources/Public/Icons/PersonAmber.svg | 3 + .../Resources/Public/Icons/PersonBlue.svg | 3 + .../watten/Resources/Public/Icons/Rank.svg | 5 + .../watten/Resources/Public/Icons/Sun.svg | 3 + .../watten/Resources/Public/Icons/Team.svg | 3 + .../Resources/Public/Icons/Thump-down.svg | 2 + .../Resources/Public/Icons/Thump-up.svg | 2 + .../watten/Resources/Public/Icons/User.svg | 3 + .../Resources/Public/Icons/UserGraduate.svg | 5 + .../watten/Resources/Public/Icons/Win.svg | 3 + .../Public/Icons/user_plugin_ergebnisse.svg | 4 + .../Public/Javascript/jsgrid/jsgrid-1.5.3.zip | Bin 0 -> 81288 bytes .../Public/Javascript/jsgrid/jsgrid-theme.css | 305 + .../Javascript/jsgrid/jsgrid-theme.min.css | 7 + .../Public/Javascript/jsgrid/jsgrid.css | 126 + .../Public/Javascript/jsgrid/jsgrid.js | 2516 ++++++ .../Public/Javascript/jsgrid/jsgrid.min.css | 7 + .../Public/Javascript/jsgrid/jsgrid.min.js | 8 + .../Public/Javascript/statistik_bar.js | 67 + .../Public/Javascript/statistik_line.js | 45 + .../Resources/Public/Logo/logo-icon-text.png | Bin 0 -> 16135 bytes .../watten/Resources/Public/package-lock.json | 58 + packages/watten/Resources/Public/package.json | 6 + packages/watten/composer.json | 26 + packages/watten/composer.lock | 7471 +++++++++++++++++ packages/watten/ext_emconf.php | 19 + packages/watten/ext_localconf.php | 92 + packages/watten/ext_tables.php | 4 + packages/watten/ext_tables.sql | 85 + 93 files changed, 14369 insertions(+), 1 deletion(-) delete mode 160000 packages/watten create mode 100644 packages/watten/Classes/Controller/EidController.php create mode 100644 packages/watten/Classes/Controller/WattenController.php create mode 100644 packages/watten/Classes/Daten/Berechnung.php create mode 100644 packages/watten/Classes/Domain/Model/Athleten.php create mode 100644 packages/watten/Classes/Domain/Model/Ergebnisse.php create mode 100644 packages/watten/Classes/Domain/Model/Events.php create mode 100644 packages/watten/Classes/Domain/Repository/AthletenRepository.php create mode 100644 packages/watten/Classes/Domain/Repository/ErgebnisseRepository.php create mode 100644 packages/watten/Classes/Domain/Repository/GstrichenRepository.php create mode 100644 packages/watten/Classes/Domain/Repository/RanglisteRepository.php create mode 100644 packages/watten/Classes/Domain/Repository/SpieltageRepository.php create mode 100644 packages/watten/Classes/Domain/Repository/StatistikRepository.php create mode 100644 packages/watten/Classes/Hooks/DataHandler.php create mode 100644 packages/watten/Classes/Scheduler/CronTask.php create mode 100644 packages/watten/Classes/Tca/Configuration.php create mode 100644 packages/watten/Classes/Utilities/CookieUtility.php create mode 100644 packages/watten/Configuration/FlexForms/flexform_watten.xml create mode 100644 packages/watten/Configuration/Icons.php create mode 100644 packages/watten/Configuration/RequestMiddlewares.php create mode 100644 packages/watten/Configuration/TCA/Overrides/sys_template.php create mode 100644 packages/watten/Configuration/TCA/Overrides/tt_content.php create mode 100644 packages/watten/Configuration/TCA/Overrides/tx_watten_domain_model_athleten.php create mode 100644 packages/watten/Configuration/TCA/Overrides/tx_watten_domain_model_ergebnisse.php create mode 100644 packages/watten/Configuration/TCA/Overrides/tx_watten_domain_model_events.php create mode 100644 packages/watten/Configuration/TCA/tx_watten_domain_model_athleten.php create mode 100644 packages/watten/Configuration/TCA/tx_watten_domain_model_ergebnisse.php create mode 100644 packages/watten/Configuration/TCA/tx_watten_domain_model_events.php create mode 100644 packages/watten/Configuration/TCA/tx_watten_tournaments.php create mode 100644 packages/watten/Configuration/TypoScript/constants.typoscript create mode 100644 packages/watten/Configuration/TypoScript/setup.typoscript create mode 100644 packages/watten/Readme.md create mode 100644 packages/watten/Resources/Private/.htaccess create mode 100644 packages/watten/Resources/Private/Partials/GridErgebnisse.html create mode 100644 packages/watten/Resources/Private/Partials/GridGstrichen.html create mode 100644 packages/watten/Resources/Private/Partials/GridPaarlauf.html create mode 100644 packages/watten/Resources/Private/Partials/GridRangliste.html create mode 100644 packages/watten/Resources/Private/Partials/SelectPaarlauf.html create mode 100644 packages/watten/Resources/Private/Partials/SelectRangliste.html create mode 100644 packages/watten/Resources/Private/Partials/SelectSpieltag.html create mode 100644 packages/watten/Resources/Private/Partials/SelectTeilnehmer.html create mode 100644 packages/watten/Resources/Private/Partials/SelectTournament.html create mode 100644 packages/watten/Resources/Private/Partials/StatistikErgebnisse.html create mode 100644 packages/watten/Resources/Private/Partials/StatistikRangliste.html create mode 100644 packages/watten/Resources/Private/Templates/Watten/Ergebnisse.html create mode 100644 packages/watten/Resources/Private/Templates/Watten/Rangliste.html create mode 100644 packages/watten/Resources/Private/Templates/Watten/Statistik.html create mode 100644 packages/watten/Resources/Private/readme.md create mode 120000 packages/watten/Resources/Public/Css/base.css create mode 100644 packages/watten/Resources/Public/Css/images/Schellen.png create mode 100644 packages/watten/Resources/Public/Css/jsgrid-dark.css create mode 100644 packages/watten/Resources/Public/Icons/Bold.svg create mode 100644 packages/watten/Resources/Public/Icons/Bowling.svg create mode 100644 packages/watten/Resources/Public/Icons/Bum.svg create mode 100644 packages/watten/Resources/Public/Icons/Calender.svg create mode 100644 packages/watten/Resources/Public/Icons/Degen.svg create mode 100644 packages/watten/Resources/Public/Icons/Extension.svg create mode 100644 packages/watten/Resources/Public/Icons/Gstrichen-lose.svg create mode 100644 packages/watten/Resources/Public/Icons/Gstrichen-win.svg create mode 100644 packages/watten/Resources/Public/Icons/Gstrichen.svg create mode 100644 packages/watten/Resources/Public/Icons/Hashtag.svg create mode 100644 packages/watten/Resources/Public/Icons/Krone.svg create mode 100644 packages/watten/Resources/Public/Icons/List.svg create mode 100644 packages/watten/Resources/Public/Icons/Loos.svg create mode 100644 packages/watten/Resources/Public/Icons/PersonAmber.svg create mode 100644 packages/watten/Resources/Public/Icons/PersonBlue.svg create mode 100644 packages/watten/Resources/Public/Icons/Rank.svg create mode 100644 packages/watten/Resources/Public/Icons/Sun.svg create mode 100644 packages/watten/Resources/Public/Icons/Team.svg create mode 100644 packages/watten/Resources/Public/Icons/Thump-down.svg create mode 100644 packages/watten/Resources/Public/Icons/Thump-up.svg create mode 100644 packages/watten/Resources/Public/Icons/User.svg create mode 100644 packages/watten/Resources/Public/Icons/UserGraduate.svg create mode 100644 packages/watten/Resources/Public/Icons/Win.svg create mode 100644 packages/watten/Resources/Public/Icons/user_plugin_ergebnisse.svg create mode 100644 packages/watten/Resources/Public/Javascript/jsgrid/jsgrid-1.5.3.zip create mode 100644 packages/watten/Resources/Public/Javascript/jsgrid/jsgrid-theme.css create mode 100644 packages/watten/Resources/Public/Javascript/jsgrid/jsgrid-theme.min.css create mode 100644 packages/watten/Resources/Public/Javascript/jsgrid/jsgrid.css create mode 100644 packages/watten/Resources/Public/Javascript/jsgrid/jsgrid.js create mode 100644 packages/watten/Resources/Public/Javascript/jsgrid/jsgrid.min.css create mode 100644 packages/watten/Resources/Public/Javascript/jsgrid/jsgrid.min.js create mode 100644 packages/watten/Resources/Public/Javascript/statistik_bar.js create mode 100644 packages/watten/Resources/Public/Javascript/statistik_line.js create mode 100644 packages/watten/Resources/Public/Logo/logo-icon-text.png create mode 100644 packages/watten/Resources/Public/package-lock.json create mode 100644 packages/watten/Resources/Public/package.json create mode 100644 packages/watten/composer.json create mode 100644 packages/watten/composer.lock create mode 100644 packages/watten/ext_emconf.php create mode 100644 packages/watten/ext_localconf.php create mode 100644 packages/watten/ext_tables.php create mode 100644 packages/watten/ext_tables.sql diff --git a/packages/watten b/packages/watten deleted file mode 160000 index de7be74..0000000 --- a/packages/watten +++ /dev/null @@ -1 +0,0 @@ -Subproject commit de7be741e38c818aec3849dca9b20d35b08c5478 diff --git a/packages/watten/Classes/Controller/EidController.php b/packages/watten/Classes/Controller/EidController.php new file mode 100644 index 0000000..dc355cd --- /dev/null +++ b/packages/watten/Classes/Controller/EidController.php @@ -0,0 +1,71 @@ +handle($request); + if (!isset($request->getQueryParams()['application'])) { + return $response; + } + + switch (GeneralUtility::_GP('application')) { + case 'loadspieltag': + $arr = SpieltageRepository::loadSpieltag(); + break; + case 'loadrangliste': + $activeTournament = GeneralUtility::_GP('tournament') ?? ErgebnisseRepository::getActiveTournament(); + $arr = RanglisteRepository::loadRangliste($activeTournament); + break; + case 'loadgstrichenliste': + $activeTournament = GeneralUtility::_GP('tournament') ?? ErgebnisseRepository::getActiveTournament(); + $arr = GstrichenRepository::loadGstrichenliste($activeTournament); + break; + case 'loadstatistik': + $event_id = GeneralUtility::_GP('event_id') ?? ErgebnisseRepository::getLastEventId(); + $arr = StatistikRepository::loadStatistik($event_id); + break; + case 'loadstatistiktangliste': + $activeTournament = GeneralUtility::_GP('tournament') ?? ErgebnisseRepository::getActiveTournament(); + $arr = StatistikRepository::loadStatistikRangliste($activeTournament); + break; + case 'loadtournamentathleten': + $activeTournament = GeneralUtility::_GP('tournament') ?? ErgebnisseRepository::getActiveTournament(); + $arr = AthletenRepository::loadTournamentAthleten($activeTournament); + break; + case 'loadpaarlaufer'; + $activeTournament = GeneralUtility::_GP('tournament') ?? ErgebnisseRepository::getActiveTournament(); + $teilnehmer_id = GeneralUtility::_GP('teilnehmer_id'); + $arr = StatistikRepository::loadPaarlauf($activeTournament, $teilnehmer_id); + break; + } + + header('Content-Type: application/json'); + echo json_encode((array) $arr); + exit(); + } +} diff --git a/packages/watten/Classes/Controller/WattenController.php b/packages/watten/Classes/Controller/WattenController.php new file mode 100644 index 0000000..469c9bd --- /dev/null +++ b/packages/watten/Classes/Controller/WattenController.php @@ -0,0 +1,71 @@ +athletenRepository = $athletenRepository; + $this->ergebnisseRepository = $ergebnisseRepository; + $this->spieltageRepository = $spieltageRepository; + $this->ranglisteRepository = $ranglisteRepository; + + $this->activeTournament = GeneralUtility::_GP('tournament') ?? $this->ergebnisseRepository->getActiveTournament(); + $this->event_id = GeneralUtility::_GP('event_id') ?? $this->ergebnisseRepository->getLastEventId(); + } + + public function ergebnisseAction() + { + $tournaments = $this->ergebnisseRepository->findTournaments(false); + $this->view->assign('tournaments', $tournaments); + $this->view->assign('active_tournaments', $this->activeTournament); + + $spieltage = $this->spieltageRepository->loadSpieltage(); + $this->view->assign('spieltage', $spieltage); + $this->view->assign('active_event_id', $this->event_id); + } + + public function ranglisteAction() + { + $tournaments = $this->ergebnisseRepository->findTournaments(true); + $this->view->assign('tournaments', $tournaments); + $this->view->assign('active', $this->activeTournament); + } + + public function statistikAction() + { + $tournaments = $this->ergebnisseRepository->findTournaments(true); + $this->view->assign('tournaments', $tournaments); + $this->view->assign('active', $this->activeTournament); + $teilnehmer = $this->athletenRepository->loadTournamentAthleten($this->activeTournament); + $this->view->assign('teilnehmer', $teilnehmer); + } +} diff --git a/packages/watten/Classes/Daten/Berechnung.php b/packages/watten/Classes/Daten/Berechnung.php new file mode 100644 index 0000000..3ad3c12 --- /dev/null +++ b/packages/watten/Classes/Daten/Berechnung.php @@ -0,0 +1,191 @@ +getConnectionForTable('tx_watten_domain_model_athleten')->createQueryBuilder(); + $res = $queryBuilder + ->select('uid', 'athlet') + ->from('tx_watten_domain_model_athleten') + ->execute(); + + $user = []; + foreach ($res as $key => $value) { + $user[$value['uid']] = $value['athlet']; + } + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_tournaments')->createQueryBuilder(); + $tournaments = $queryBuilder + ->select('uid', 'tournament', 'active', 'king') + ->from('tx_watten_tournaments') + ->execute(); + + // TRUNCATE `tx_watten_tournaments_ergebnisse` + GeneralUtility::makeInstance(ConnectionPool::class) + ->getConnectionForTable('tx_watten_tournaments_ergebnisse') + ->truncate('tx_watten_tournaments_ergebnisse'); + + self::calcolate_data($user, ['uid' => 0, 'tournament' => 'Gesamt']); + foreach ($tournaments as $key => $row) { + self::calcolate_data($user, $row); + } + } + + public static function calcolate_data($user, $row) + { + $tournamentid = $row['uid']; + $tournament = $row['tournament']; + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_ergebnisse')->createQueryBuilder(); + if ($tournamentid == 0) { + // Gesamt + $_tournament = $queryBuilder + ->select('s1', 's2', 'v1', 'v2', 'bumid') + ->from('tx_watten_domain_model_ergebnisse') + ->executeQuery() + ->fetchAllAssociative(); + } else { + $_tournament = $queryBuilder + ->select('s1', 's2', 'v1', 'v2', 'bumid') + ->from('tx_watten_domain_model_ergebnisse') + ->where( + $queryBuilder->expr()->eq('tournaments_id', (int) $tournamentid) + ) + ->executeQuery() + ->fetchAllAssociative(); + } + $arr = []; + foreach ($_tournament as $key => $value) { + $bum = $value['bumid']; + $s1 = $value['s1']; + $s2 = $value['s2']; + $v1 = $value['v1']; + $v2 = $value['v2']; + + if (!isset($arr[$s1]['s'][$bum])) { + $arr[$s1]['s'][$bum] = 0; + } + if (!isset($arr[$s2]['s'][$bum])) { + $arr[$s2]['s'][$bum] = 0; + } + if (!isset($arr[$v1]['v'][$bum])) { + $arr[$v1]['v'][$bum] = 0; + } + if (!isset($arr[$v2]['v'][$bum])) { + $arr[$v2]['v'][$bum] = 0; + } + if (!isset($arr[$s1]['p'])) { + $arr[$s1]['p'] = 0; + } + if (!isset($arr[$s2]['p'])) { + $arr[$s2]['p'] = 0; + } + if (!isset($arr[$v1]['p'])) { + $arr[$v1]['p'] = 0; + } + if (!isset($arr[$v2]['p'])) { + $arr[$v2]['p'] = 0; + } + $arr[$s1]['s'][$bum]++; + $arr[$s2]['s'][$bum]++; + $arr[$v1]['v'][$bum]++; + $arr[$v2]['v'][$bum]++; + $arr[$s1]['p']++; + $arr[$s2]['p']++; + $arr[$v1]['p']++; + $arr[$v2]['p']++; + } + + foreach ($arr as $userid => $value) { + $punkte = 0; + if (isset($value['s'][1])) { + $punkte = $value['s'][1] * 1.1; + } + if (isset($value['s'][2])) { + $punkte += $value['s'][2] * 2.1; + } + if (isset($value['s'][4])) { + $punkte += $value['s'][4] * 4.1; + } + if (isset($value['v'][1])) { + $punkte -= $value['v'][1]; + } + if (isset($value['v'][2])) { + $punkte -= $value['v'][2] * 2; + } + if (isset($value['v'][4])) { + $punkte -= $value['v'][4] * 4; + } + $arr[$userid]['punkte'] = round($punkte, 2); + $arr[$userid]['spiele'] = $value['p']; + $arr[$userid]['userid'] = $userid; + $arr[$userid]['name'] = $user[$userid]; + $arr[$userid]['userid'] = $userid; + } + + $punkte = array_column($arr, 'punkte'); + array_multisort($punkte, SORT_NUMERIC, SORT_DESC, $arr); + + $winner = $arr[0]; + $looser = $arr[array_key_last($arr)]; + + foreach ($arr as $key => $value) { + $arr[$key]['platz'] = $key + 1; + $arr[$key]['s1'] = isset($value['s'][1]) ? $value['s'][1] : ''; + $arr[$key]['s1'] = isset($value['s'][1]) ? $value['s'][1] : ''; + $arr[$key]['s2'] = isset($value['s'][2]) ? $value['s'][2] : ''; + $arr[$key]['s4'] = isset($value['s'][4]) ? $value['s'][4] : ''; + unset($arr[$key]['s']); + + $arr[$key]['v1'] = isset($value['v'][1]) ? $value['v'][1] : ''; + $arr[$key]['v2'] = isset($value['v'][2]) ? $value['v'][2] : ''; + $arr[$key]['v4'] = isset($value['v'][4]) ? $value['v'][4] : ''; + unset($arr[$key]['v']); + } + + $insert_value = []; + $insert_value['crdate'] = time(); + $insert_value['tournament_id'] = $tournamentid; + $insert_value['tournament'] = (string)$tournament; + if ($tournamentid == 0) { + $insert_value['type'] = 'gesamt'; + } elseif ($row['king'] == 1) { + $insert_value['type'] = 'king'; + } elseif ($row['active'] == 1) { + $insert_value['type'] = 'active'; + } + $insert_value['koenig'] = (string)$winner['name']; + $insert_value['koenig_id'] = (int)$winner['userid']; + $insert_value['koenig_spiele'] = isset($winner['spiele']) ? $winner['spiele'] : 0; + $insert_value['koenig_punkte'] = isset($winner['punkte']) ? (float) $winner['punkte'] : 0; + $insert_value['koenig_siege'] = isset($winner['s'][1]) ? $winner['s'][1] : 0; + $insert_value['koenig_niederlagen'] = isset($winner['v'][1]) ? $winner['v'][1] : 0; + $insert_value['koenig_schneider'] = isset($winner['s'][2]) ? $winner['s'][2] : 0; + $insert_value['koenig_schneider_niederlage'] = isset($winner['v'][2]) ? $winner['v'][2] : 0; + $insert_value['koenig_retour_schneider'] = isset($winner['s'][4]) ? $winner['s'][4] : 0; + $insert_value['koenig_retour_schneider_niederlage'] = isset($winner['v'][4]) ? $winner['v'][4] : 0; + + $insert_value['schneewatter'] = (string)$looser['name']; + $insert_value['schneewatter_id'] = (int)$looser['userid']; + $insert_value['schneewatter_spiele'] = isset($looser['spiele']) ? $looser['spiele'] : 0; + $insert_value['schneewatter_punkte'] = isset($looser['punkte']) ? (float) $looser['punkte'] : 0; + $insert_value['schneewatter_siege'] = isset($looser['s'][1]) ? $looser['s'][1] : 0; + $insert_value['schneewatter_niederlagen'] = isset($looser['v'][1]) ? $looser['v'][1] : 0; + $insert_value['schneewatter_schneider'] = isset($looser['s'][2]) ? $looser['s'][2] : 0; + $insert_value['schneewatter_schneider_niederlage'] = isset($looser['v'][2]) ? $looser['v'][2] : 0; + $insert_value['schneewatter_retour_schneider'] = isset($looser['s'][4]) ? $looser['s'][4] : 0; + $insert_value['schneewatter_retour_schneider_niederlage'] = isset($looser['v'][4]) ? $looser['v'][4] : 0; + + $insert_value['result_json'] = json_encode($arr); + + GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_tournaments_ergebnisse') + ->insert('tx_watten_tournaments_ergebnisse', $insert_value); + } +} diff --git a/packages/watten/Classes/Domain/Model/Athleten.php b/packages/watten/Classes/Domain/Model/Athleten.php new file mode 100644 index 0000000..1342247 --- /dev/null +++ b/packages/watten/Classes/Domain/Model/Athleten.php @@ -0,0 +1,117 @@ +setGender($gender); + $this->setName($name); + $this->setImage($image); + $this->setIsactive($isactive); + } + + /** + * + * @param int $gender + * + * @return void + */ + public function setGender(int $gender): void + { + $this->gender = $gender; + } + + /** + * + * @return int + */ + public function getGender(): int + { + return $this->gender; + } + + /** + * + * @param string $name + * + * @return void + */ + public function setName(string $name): void + { + $this->name = $name; + } + + /** + * + * @return string + */ + public function getName(): string + { + return $this->name; + } + + /** + * + * @param string $image + * + * @return void + */ + public function setImage(string $image): void + { + $this->image = $image; + } + + /** + * + * @return string + */ + public function getImage(): string + { + return $this->image; + } + + /** + * + * @param int $isactive + * + * @return void + */ + public function setIsactive(int $isactive): void + { + $this->isactive = $isactive; + } + + /** + * + * @return int + */ + public function getIsactive(): int + { + return $this->isactive; + } +} diff --git a/packages/watten/Classes/Domain/Model/Ergebnisse.php b/packages/watten/Classes/Domain/Model/Ergebnisse.php new file mode 100644 index 0000000..1de8d8a --- /dev/null +++ b/packages/watten/Classes/Domain/Model/Ergebnisse.php @@ -0,0 +1,170 @@ +setDatum($datum); + $this->setS1($s1); + $this->setS2($s2); + $this->setV1($v1); + $this->setV2($v2); + $this->setBumid($bumid); + } + + /** + * + * @param DateTime $datum time stamp + * + * @return void + */ + public function setDatum(int $datum): void + { + $this->datum = $datum; + } + + /** + * + * @return DateTime + */ + public function getDatum(): int + { + return $this->datum; + } + + + /** + * + * @param int $s1 + * + * @return void + */ + public function setS1(int $s1): void + { + $this->s1 = $s1; + } + + /** + * + * @return Int + */ + public function getS1(): int + { + return $this->s1; + } + + /** + * + * @param int $s2 + * + * @return void + */ + public function setS2(int $s2): void + { + $this->s2 = $s2; + } + + /** + * + * @return Int + */ + public function getS2(): int + { + return $this->s2; + } + + /** + * + * @param int $v1 + * + * @return void + */ + public function setV1(int $v1): void + { + $this->v1 = $v1; + } + + /** + * + * @return Int + */ + public function getV1(): int + { + return $this->v1; + } + + /** + * + * @param int $v1 + * + * @return void + */ + public function setV2(int $v2): void + { + $this->v2 = $v2; + } + + /** + * + * @return Int + */ + public function getV2(): int + { + return $this->v2; + } + + /** + * + * @param int $bumid + * + * @return void + */ + public function setBumid(int $bumid): void + { + $this->bumid = $bumid; + } + + /** + * + * @return Int + */ + public function getBumid(): int + { + return $this->bumid; + } +} diff --git a/packages/watten/Classes/Domain/Model/Events.php b/packages/watten/Classes/Domain/Model/Events.php new file mode 100644 index 0000000..d97e5eb --- /dev/null +++ b/packages/watten/Classes/Domain/Model/Events.php @@ -0,0 +1,119 @@ +setDatum($datum); + $this->setTournamentId($tournaments_id); + $this->setEvent($event); + $this->setIsactive($isactive); + } + + /** + * + * @param DateTime $datum + * + * @return void + */ + public function setDatum(int $datum): void + { + $this->datum = $datum; + } + + /** + * + * @return DateTime + */ + public function getDatum(): int + { + return $this->datum; + } + + + /** + * + * @param int $tournaments_id + * + * @return void + */ + public function setTournamentId(int $tournaments_id): void + { + $this->s1 = $tournaments_id; + } + + /** + * + * @return Int + */ + public function getTournamentId(): int + { + return $this->tournaments_id; + } + + /** + * + * @param String $event + * + * @return void + */ + public function setEvent(string $event): void + { + $this->event = $event; + } + + /** + * + * @return String + */ + public function getEvent(): string + { + return $this->event; + } + + /** + * + * @param int $isactive + * + * @return void + */ + public function setIsactive(int $isactive): void + { + $this->s1 = $isactive; + } + + /** + * + * @return Int + */ + public function getIsactive(): int + { + return $this->isactive; + } +} diff --git a/packages/watten/Classes/Domain/Repository/AthletenRepository.php b/packages/watten/Classes/Domain/Repository/AthletenRepository.php new file mode 100644 index 0000000..e97fb81 --- /dev/null +++ b/packages/watten/Classes/Domain/Repository/AthletenRepository.php @@ -0,0 +1,49 @@ +getConnectionForTable('tx_watten_domain_model_athleten')->createQueryBuilder(); + $res = $queryBuilder + ->select('uid', 'name') + ->from('tx_watten_domain_model_athleten') + ->execute(); + $athleten = []; + foreach ($res as $value) { + $athleten[$value['uid']] = $value['name']; + } + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_ergebnisse')->createQueryBuilder(); + $res = $queryBuilder + ->select('s1', 's2', 'v1', 'v2') + ->from('tx_watten_domain_model_ergebnisse') + ->where( + $queryBuilder->expr()->eq('tournaments_id', (int) $activeTournament) + ) + ->execute(); + $active = []; + foreach ($res as $value) { + $active[] = $value['s1']; + $active[] = $value['s2']; + $active[] = $value['v1']; + $active[] = $value['v2']; + } + $active = array_unique($active); + + $return = []; + $return[] = ['id' => 0, 'name' => 'Athleten']; + foreach ($athleten as $key => $name) { + if (in_array($key, $active)) { + $return[] = ['id' => $key, 'name' => $name]; + } + } + return $return; + } +} diff --git a/packages/watten/Classes/Domain/Repository/ErgebnisseRepository.php b/packages/watten/Classes/Domain/Repository/ErgebnisseRepository.php new file mode 100644 index 0000000..add8a8e --- /dev/null +++ b/packages/watten/Classes/Domain/Repository/ErgebnisseRepository.php @@ -0,0 +1,120 @@ +getConnectionForTable('tx_watten_tournaments')->createQueryBuilder(); + $res = $queryBuilder + ->select('uid') + ->from('tx_watten_tournaments') + ->where( + $queryBuilder->expr()->eq('active', (int) 1) + ) + ->execute(); + foreach ($res as $key => $value) { + return (int) $value['uid']; + } + return 0; + } + + public static function getActiveTournament() + { + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_tournaments')->createQueryBuilder(); + $res = $queryBuilder + ->select('uid') + ->from('tx_watten_tournaments') + ->where( + $queryBuilder->expr()->eq('active', (int) 1) + ) + ->execute(); + foreach ($res as $key => $value) { + return (int) $value['uid']; + } + return 0; + } + + public function getLastEventId() + { + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_events')->createQueryBuilder(); + $res = $queryBuilder + ->select('uid') + ->from('tx_watten_domain_model_events') + ->where( + $queryBuilder->expr()->eq('isactive', (int) 1) + ) + ->execute(); + foreach ($res as $key => $value) { + return (int) $value['uid']; + } + return 0; + } + + public function findTournaments($mitGesammt) + { + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_tournaments')->createQueryBuilder(); + $res = $queryBuilder + ->select('uid', 'tournament', 'active') + ->from('tx_watten_tournaments') + ->execute(); + + $tournaments = []; + foreach ($res as $key => $value) { + $tmp = new stdClass(); + $tmp->id = (int) $value['uid']; + $tmp->name = $value['tournament']; + $tmp->active = $value['active']; + $tournaments[] = $tmp; + } + if ($mitGesammt == true) { + $tmp = new stdClass(); + $tmp->id = -1; + $tmp->name = "Gesamt"; + $tournaments[] = $tmp; + } + return $tournaments; + } + + public function findByEventId(int $event_id) + { + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_athleten')->createQueryBuilder(); + $res = $queryBuilder + ->select('uid', 'name') + ->from('tx_watten_domain_model_athleten') + ->execute(); + $athleten = []; + foreach ($res as $key => $value) { + $athleten[$value['uid']] = $value['name']; + } + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_ergebnisse')->createQueryBuilder(); + $ergebnisse = $queryBuilder + ->select('uid', 'datum', 's1', 's2', 'v1', 'v2', 'bumid') + ->from('tx_watten_domain_model_ergebnisse') + ->where( + $queryBuilder->expr()->eq('event_id', (int) $event_id) + ) + ->execute(); + + $return = []; + foreach ($ergebnisse as $key => $value) { + $tmp = []; + $tmp['uid'] = $value['uid']; + $tmp['s1'] = $athleten[$value['s1']]; + $tmp['s2'] = $athleten[$value['s2']]; + $tmp['v1'] = $athleten[$value['v1']]; + $tmp['v2'] = $athleten[$value['v2']]; + $tmp['bumid'] = $value['bumid']; + $return[] = $tmp; + } + + return $return; + } +} \ No newline at end of file diff --git a/packages/watten/Classes/Domain/Repository/GstrichenRepository.php b/packages/watten/Classes/Domain/Repository/GstrichenRepository.php new file mode 100644 index 0000000..779fd1f --- /dev/null +++ b/packages/watten/Classes/Domain/Repository/GstrichenRepository.php @@ -0,0 +1,111 @@ +getConnectionForTable('tx_watten_domain_model_athleten')->createQueryBuilder(); + $res = $queryBuilder + ->select('uid', 'name') + ->from('tx_watten_domain_model_athleten') + ->execute(); + $user = []; + foreach ($res as $key => $value) { + $user[$value['uid']] = $value['name']; + } + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_ergebnisse')->createQueryBuilder(); + if ($activeTournament < 0) { + $ergebnisse = $queryBuilder + ->select('s1', 's2', 'v1', 'v2', 'gstrichen') + ->from('tx_watten_domain_model_ergebnisse') + ->execute(); + } else { + $ergebnisse = $queryBuilder + ->select('s1', 's2', 'v1', 'v2', 'gstrichen') + ->from('tx_watten_domain_model_ergebnisse') + ->where($queryBuilder->expr()->eq('tournaments_id', (int) $activeTournament)) + ->execute(); + } + + $arr = []; + foreach ($ergebnisse as $key => $value) { + $s1 = $value['s1']; + $s2 = $value['s2']; + $v1 = $value['v1']; + $v2 = $value['v2']; + $gs = $value['gstrichen']; + + if (!isset($arr[$s1]['s'])) { + $arr[$s1]['s'] = 0; + $arr[$s1]['v'] = 0; + } + if (!isset($arr[$s2]['s'])) { + $arr[$s2]['s'] = 0; + $arr[$s2]['v'] = 0; + } + if (!isset($arr[$v1]['v'])) { + $arr[$v1]['v'] = 0; + $arr[$v1]['s'] = 0; + } + if (!isset($arrv[$v2]['v'])) { + $arr[$v2]['v'] = 0; + $arr[$v2]['s'] = 0; + } + if ($gs) { + $arr[$s1]['s']++; + $arr[$s2]['s']++; + $arr[$v1]['v']++; + $arr[$v2]['v']++; + } + } + + $sieger = []; + $verlierer = []; + $i = 1; + foreach ($arr as $userid => $value) { + $sieger[$i]['sieger'] = $user[$userid]; + $sieger[$i]['gewonnen'] = $value['s']; + + $verlierer[$i]['verlierer'] = $user[$userid]; + $verlierer[$i]['verloren'] = $value['v']; + + $i++; + } + $gewonnen = array_column($sieger, 'gewonnen'); + array_multisort($gewonnen, SORT_NUMERIC, SORT_DESC, $sieger); + $verloren = array_column($verlierer, 'verloren'); + array_multisort($verloren, SORT_NUMERIC, SORT_DESC, $verlierer); + + $return = []; + $s = 0; + $v = 0; + foreach ($gewonnen as $key => $value) { + $return[$key] = array_merge($sieger[$key], $verlierer[$key]); + $return[$key]['platz'] = $key + 1; + + if ($return[$key]['gewonnen'] == 0) { + $return[$key]['sieger'] = ''; + $return[$key]['gewonnen'] = ''; + $s = 1; + } + if ($return[$key]['verloren'] == 0) { + $return[$key]['verloren'] = ''; + $return[$key]['verlierer'] = ''; + $v = 1; + } + if ($s and $v) { + unset($return[$key]); + } + } + + return $return; + } +} diff --git a/packages/watten/Classes/Domain/Repository/RanglisteRepository.php b/packages/watten/Classes/Domain/Repository/RanglisteRepository.php new file mode 100644 index 0000000..5c7a34b --- /dev/null +++ b/packages/watten/Classes/Domain/Repository/RanglisteRepository.php @@ -0,0 +1,149 @@ +getConnectionForTable('tx_watten_domain_model_athleten')->createQueryBuilder(); + $res = $queryBuilder + ->select('uid', 'name') + ->from('tx_watten_domain_model_athleten') + ->execute(); + $user = []; + foreach ($res as $key => $value) { + $user[$value['uid']] = $value['name']; + } + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_ergebnisse')->createQueryBuilder(); + if ($activeTournament < 0) { + $ergebnisse = $queryBuilder + ->select('s1', 's2', 'v1', 'v2', 'bumid', 'gstrichen') + ->from('tx_watten_domain_model_ergebnisse') + ->execute(); + } else { + $ergebnisse = $queryBuilder + ->select('s1', 's2', 'v1', 'v2', 'bumid', 'gstrichen') + ->from('tx_watten_domain_model_ergebnisse') + ->where($queryBuilder->expr()->eq('tournaments_id', (int) $activeTournament)) + ->execute(); + } + // debug($queryBuilder->getSQL()); + + $arr = []; + foreach ($ergebnisse as $key => $value) { + $bum = $value['bumid']; + $s1 = $value['s1']; + $s2 = $value['s2']; + $v1 = $value['v1']; + $v2 = $value['v2']; + $ge = $value['gstrichen']; + + if (!isset($arr[$s1]['s'][$bum])) { + $arr[$s1]['s'][$bum] = 0; + } + if (!isset($arr[$s2]['s'][$bum])) { + $arr[$s2]['s'][$bum] = 0; + } + if (!isset($arr[$v1]['v'][$bum])) { + $arr[$v1]['v'][$bum] = 0; + } + if (!isset($arr[$v2]['v'][$bum])) { + $arr[$v2]['v'][$bum] = 0; + } + if (!isset($arr[$s1]['p'])) { + $arr[$s1]['p'] = 0; + } + if (!isset($arr[$s2]['p'])) { + $arr[$s2]['p'] = 0; + } + if (!isset($arr[$v1]['p'])) { + $arr[$v1]['p'] = 0; + } + if (!isset($arr[$v2]['p'])) { + $arr[$v2]['p'] = 0; + } + if (!isset($arr[$s1]['sg'])) { + $arr[$s1]['sg'] = 0; + } + if (!isset($arr[$s2]['sg'])) { + $arr[$s2]['sg'] = 0; + } + if (!isset($arr[$v1]['vg'])) { + $arr[$v1]['vg'] = 0; + } + if (!isset($arr[$v2]['vg'])) { + $arr[$v2]['vg'] = 0; + } + $arr[$s1]['s'][$bum]++; + $arr[$s2]['s'][$bum]++; + $arr[$v1]['v'][$bum]++; + $arr[$v2]['v'][$bum]++; + $arr[$s1]['p']++; + $arr[$s2]['p']++; + $arr[$v1]['p']++; + $arr[$v2]['p']++; + if ($ge) { + $arr[$s1]['sg']++; + $arr[$s2]['sg']++; + $arr[$v1]['vg']++; + $arr[$v2]['vg']++; + } + } + + foreach ($arr as $userid => $value) { + $punkte = 0; + if (isset($value['s'][1])) { + $punkte += $value['s'][1] * 1.1; + } + if (isset($value['s'][2])) { + $punkte += $value['s'][2] * 2.1; + } + if (isset($value['s'][4])) { + $punkte += $value['s'][4] * 4.1; + } + if (isset($value['v'][1])) { + $punkte -= $value['v'][1]; + } + if (isset($value['v'][2])) { + $punkte -= $value['v'][2] * 2; + } + if (isset($value['v'][4])) { + $punkte -= $value['v'][4] * 4; + } + $arr[$userid]['punkte'] = round($punkte, 2); + $arr[$userid]['spiele'] = $value['p']; + $arr[$userid]['name'] = $user[$userid]; + unset($arr[$userid]['p']); + } + + $punkte = array_column($arr, 'punkte'); + array_multisort($punkte, SORT_NUMERIC, SORT_DESC, $arr); + + // $winner = $arr[0]; + // $looser = $arr[array_key_last($arr)]; + + foreach ($arr as $key => $value) { + $arr[$key]['platz'] = $key + 1; + $arr[$key]['s1'] = isset($value['s'][1]) ?? ''; + $arr[$key]['s1'] = isset($value['s'][1]) ? $value['s'][1] : ''; + $arr[$key]['s2'] = isset($value['s'][2]) ? $value['s'][2] : ''; + $arr[$key]['s4'] = isset($value['s'][4]) ? $value['s'][4] : ''; + $arr[$key]['sg'] = isset($value['sg']) && $value['sg'] != 0 ? $value['sg'] : ''; + unset($arr[$key]['s']); + + $arr[$key]['v1'] = isset($value['v'][1]) ? $value['v'][1] : ''; + $arr[$key]['v2'] = isset($value['v'][2]) ? $value['v'][2] : ''; + $arr[$key]['v4'] = isset($value['v'][4]) ? $value['v'][4] : ''; + $arr[$key]['vg'] = isset($value['vg']) && $value['vg'] != 0 ? $value['vg'] : ''; + unset($arr[$key]['v']); + } + return $arr; + } +} diff --git a/packages/watten/Classes/Domain/Repository/SpieltageRepository.php b/packages/watten/Classes/Domain/Repository/SpieltageRepository.php new file mode 100644 index 0000000..cc9fc81 --- /dev/null +++ b/packages/watten/Classes/Domain/Repository/SpieltageRepository.php @@ -0,0 +1,146 @@ +getConnectionForTable('tx_watten_domain_model_events')->createQueryBuilder(); + $res = $queryBuilder + ->select('uid', 'datum', 'event', 'isactive') + ->from('tx_watten_domain_model_events') + ->where( + $queryBuilder->expr()->eq('tournaments_id', (int) $activeTournament) + ) + ->addOrderBy('datum', 'DESC') + ->execute(); + + $spieltage = []; + $tmp = new stdClass(); + $tmp->id = 0; + $tmp->name = 'Spieltag'; + $spieltage[] = $tmp; + foreach ($res as $key => $value) { + $tmp = new stdClass(); + $tmp->id = (int) $value['uid']; + // $tmp->selected = (int) $value['isactive']; + $tmp->name = date("d. M. Y", $value['datum']); + if ($value['event']) { + $tmp->name .= ' - ' . $value['event']; + } + $spieltage[] = $tmp; + } + + return $spieltage; + } + + public static function loadSpieltag() + { + $event_id = (int) GeneralUtility::_GP('event_id'); + if (!$event_id) { + exit; + } + + $return = []; + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_events')->createQueryBuilder(); + $res = $queryBuilder + ->select('story') + ->from('tx_watten_domain_model_events') + ->where( + $queryBuilder->expr()->eq('uid', (int) $event_id) + ) + ->execute(); + foreach ($res as $key => $value) { + $return['story'] = $value['story']; + } + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_athleten')->createQueryBuilder(); + $res = $queryBuilder + ->select('uid', 'name') + ->from('tx_watten_domain_model_athleten') + ->execute(); + $athleten = []; + foreach ($res as $key => $value) { + $athleten[$value['uid']] = $value['name']; + } + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_ergebnisse')->createQueryBuilder(); + $ergebnisse = $queryBuilder + ->select('uid', 'datum', 's1', 's2', 'v1', 'v2', 'bumid', 'gstrichen') + ->from('tx_watten_domain_model_ergebnisse') + ->where( + $queryBuilder->expr()->eq('event_id', (int) $event_id) + ) + ->execute(); + + $data = []; + foreach ($ergebnisse as $key => $value) { + $tmp = []; + $tmp['uid'] = (int) $value['uid']; + $tmp['s1'] = $athleten[$value['s1']]; + $tmp['s2'] = $athleten[$value['s2']]; + $tmp['v1'] = $athleten[$value['v1']]; + $tmp['v2'] = $athleten[$value['v2']]; + $tmp['gs'] = $value['gstrichen'] ? '||' : ''; + $tmp['bumid'] = (int) $value['bumid']; + $tmp['datum'] = (int) $value['datum']; + $data[] = $tmp; + } + $return['data'] = $data; + $return['punkte'] = self::punkte($data); + return $return; + } + + private static function punkte(array $data) + { + $punkte = []; + foreach ($data as $value) { + $s1 = $value['s1']; + $s2 = $value['s2']; + $v1 = $value['v1']; + $v2 = $value['v2']; + if (!isset($punkte[$s1])) { + $punkte[$s1] = $value['bumid'] + 0.1; + } else { + $punkte[$s1] = $punkte[$s1] + $value['bumid'] + 0.1; + } + if (!isset($punkte[$s2])) { + $punkte[$s2] = $value['bumid'] + 0.1; + } else { + $punkte[$s2] = $punkte[$s2] + $value['bumid'] + 0.1; + } + if (!isset($punkte[$v1])) { + $punkte[$v1] = - ($value['bumid']); + } else { + $punkte[$v1] = $punkte[$v1] - $value['bumid']; + } + if (!isset($punkte[$v2])) { + $punkte[$v2] = - ($value['bumid']); + } else { + $punkte[$v2] = $punkte[$v2] - $value['bumid']; + } + } + $return = []; + arsort($punkte); + $i = 1; + foreach ($punkte as $name => $value) { + $tmp = []; + $tmp['rang'] = $i; + $tmp['name'] = $name; + $tmp['punkte'] = round($value, 1); + $return[] = $tmp; + $i++; + } + return $return; + } +} diff --git a/packages/watten/Classes/Domain/Repository/StatistikRepository.php b/packages/watten/Classes/Domain/Repository/StatistikRepository.php new file mode 100644 index 0000000..249a989 --- /dev/null +++ b/packages/watten/Classes/Domain/Repository/StatistikRepository.php @@ -0,0 +1,395 @@ + 5.9 + [spiele] => 13 + [name] => Gerhard + [platz] => 1 + [s1] => 9 + [s2] => + [s4] => + [v1] => 4 + [v2] => + [v4] => + */ + $arr = RanglisteRepository::loadRangliste($activeTournament); + $return = []; + $tmp = []; + foreach ($arr as $key => $value) { + $return['labels'][] = $value['name'] . " " . $value['platz'] . ". Platz"; + $tmp['s1']['label'] = "Gewonnen"; + $tmp['s1']['data'][] = $value['s1'] ? $value['s1'] : 0; + $tmp['s2']['label'] = "Schneider"; + $tmp['s2']['data'][] = $value['s2'] ? $value['s2'] : 0; + $tmp['s4']['label'] = "Retour Schneider"; + $tmp['s4']['data'][] = $value['s4'] ? $value['s4'] : 0; + $tmp['v1']['label'] = "Verloren"; + $tmp['v1']['data'][] = $value['v1'] ? $value['v1'] * -1 : 0; + $tmp['v2']['label'] = "Schneider Verloren"; + $tmp['v2']['data'][] = $value['v2'] ? $value['v2'] * -1 : 0; + $tmp['v4']['label'] = "Retour Schneider Verloren"; + $tmp['v4']['data'][] = $value['v4'] ? $value['v4'] * -1 : 0; + } + $datasets = []; + foreach ($tmp as $key => $value) { + if (array_sum($value['data']) != false) { + $value['borderWidth'] = 1; + $datasets[] = $value; + } + } + $return['datasets'] = $datasets; + // print_r($return); + return $return; + } + + + public static function loadStatistik($event_id) + { + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_athleten')->createQueryBuilder(); + $res = $queryBuilder + ->select('uid', 'name') + ->from('tx_watten_domain_model_athleten') + ->execute(); + $user = []; + foreach ($res as $key => $value) { + $user[$value['uid']] = $value['name']; + } + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_ergebnisse')->createQueryBuilder(); + $ergebnisse = $queryBuilder + ->select('uid', 's1', 's2', 'v1', 'v2', 'bumid') + ->from('tx_watten_domain_model_ergebnisse') + ->where($queryBuilder->expr()->eq('event_id', (int) $event_id)) + ->execute(); + + $usr = []; + $data = []; + foreach ($ergebnisse as $value) { + $usr[] = $value['s1']; + $usr[] = $value['s2']; + $usr[] = $value['v1']; + $usr[] = $value['v2']; + $data[] = $value; + } + $usr = array_unique($usr); + + $arr = []; + $datasets = []; + foreach ($data as $value) { + $arr['labels'][] = $value['uid']; + $bum = $value['bumid']; + $s1 = $value['s1']; + $s2 = $value['s2']; + $v1 = $value['v1']; + $v2 = $value['v2']; + + foreach ($usr as $key => $uid) { + if (isset($datasets[$uid])) { + $punkte = 0; + if ($s1 == $uid or $s2 == $uid) { + switch ($bum) { + case 1: + $punkte = 1.1; + break; + case 2: + $punkte = 2.1; + break; + case 4: + $punkte = 4.1; + break; + } + } elseif ($v1 == $uid or $v2 == $uid) { + switch ($bum) { + case 1: + $punkte = -1; + break; + case 2: + $punkte = -2; + break; + case 4: + $punkte = -4; + break; + } + } + $datasets[$uid]['stand'] = round($datasets[$uid]['stand'] + $punkte, 2); + $datasets[$uid]['data'][] = $datasets[$uid]['stand']; + } else { + $datasets[$uid]['label'] = $user[$uid]; + + $punkte = 0; + if ($s1 == $uid or $s2 == $uid) { + switch ($bum) { + case 1: + $punkte = 1.1; + break; + case 2: + $punkte = 2.1; + break; + case 4: + $punkte = 4.1; + break; + } + } elseif ($v1 == $uid or $v2 == $uid) { + switch ($bum) { + case 1: + $punkte = -1; + break; + case 2: + $punkte = -2; + break; + case 4: + $punkte = -4; + break; + } + } + $datasets[$uid]['stand'] = $punkte; + $datasets[$uid]['data'][] = $punkte; + } + } + } + foreach ($datasets as $value) { + unset($value['stand']); + $value['pointRadius'] = 2; + $value['tension'] = 0; + $value['borderWidth'] = 0.5; + $arr['datasets'][] = $value; + } + return $arr; + } + + public static function loadPaarlauf($activeTournament, $athlet_1) + { + $athlet_1 = (int) $athlet_1; + $athlet_2 = 3; + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_athleten')->createQueryBuilder(); + $res = $queryBuilder + ->select('uid', 'name') + ->from('tx_watten_domain_model_athleten') + ->execute(); + $user = []; + foreach ($res as $key => $value) { + $user[$value['uid']] = $value['name']; + } + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_ergebnisse')->createQueryBuilder(); + if ($activeTournament < 0) { + $res = $queryBuilder + ->select('s1', 's2', 'v1', 'v2', 'bumid', 'gstrichen') + ->from('tx_watten_domain_model_ergebnisse') + ->execute(); + } else { + $res = $queryBuilder + ->select('s1', 's2', 'v1', 'v2', 'bumid', 'gstrichen') + ->from('tx_watten_domain_model_ergebnisse') + ->where($queryBuilder->expr()->eq('tournaments_id', (int) $activeTournament)) + ->execute(); + } + + $_names = [ + 'spiele' => 0, + 'siege' => 0, + 'verloren' => 0, + 'sn' => 0, + 'ss' => 0, + 'srs' => 0, + 'sg' => 0, + 'vn' => 0, + 'vs' => 0, + 'vrs' => 0, + 'vg' => 0, + ]; + $_data = []; + foreach ($res as $row) { + if ($row['s1'] == $athlet_1 or $row['s2'] == $athlet_1) { + if ($row['s1'] == $athlet_1) + $partner = (int) $row['s2']; + else + $partner = (int) $row['s1']; + $gegner1 = (int) $row['v1']; + $gegner2 = (int) $row['v2']; + $bummalen = (int) $row['bumid']; + $gstrichen = (int) $row['gstrichen']; + + if (!isset($_data[$partner])) { + $_data[$partner] = $_names; + } + $_data[$partner]['spiele']++; + $_data[$partner]['siege']++; + if ($bummalen == 1) + $_data[$partner]['sn']++; + else if ($bummalen == 2) + $_data[$partner]['ss']++; + else if ($bummalen == 4) + $_data[$partner]['srs']++; + if ($gstrichen == 1) + $_data[$partner]['sg']++; + + + if ($gegner1 < $gegner2) { + $team = "$gegner1:$gegner2"; + } else { + $team = "$gegner2:$gegner1"; + } + if (!isset($_data[$partner]['gegner'][$team])) { + $_data[$partner]['gegner'][$team] = $_names; + } + $_data[$partner]['gegner'][$team]['spiele']++; + $_data[$partner]['gegner'][$team]['siege']++; + + if ($bummalen == 1) + $_data[$partner]['gegner'][$team]['sn']++; + else if ($bummalen == 2) + $_data[$partner]['gegner'][$team]['ss']++; + else if ($bummalen == 4) + $_data[$partner]['gegner'][$team]['srs']++; + + if ($gstrichen == 1) + $_data[$partner]['gegner'][$team]['sg']++; + + } else if ($row['v1'] == $athlet_1 or $row['v2'] == $athlet_1) { + if ($row['v1'] == $athlet_1) + $partner = $row['v2']; + else + $partner = (int) $row['v1']; + $gegner1 = (int) $row['s1']; + $gegner2 = (int) $row['s2']; + $bummalen = (int) $row['bumid']; + $gstrichen = (int) $row['gstrichen']; + + if (!isset($_data[$partner])) { + $_data[$partner] = $_names; + } + $_data[$partner]['spiele']++; + $_data[$partner]['verloren']++; + if ($bummalen == 1) + $_data[$partner]['vn']++; + if ($bummalen == 2) + $_data[$partner]['vs']++; + if ($bummalen == 4) + $_data[$partner]['vrs']++; + if ($gstrichen == 1) + $_data[$partner]['vg']++; + + if ($gegner1 < $gegner2) { + $team = "$gegner1:$gegner2"; + } else { + $team = "$gegner2:$gegner1"; + } + if (!isset($_data[$partner]['gegner'][$team])) { + $_data[$partner]['gegner'][$team] = $_names; + } + $_data[$partner]['gegner'][$team]['spiele']++; + $_data[$partner]['gegner'][$team]['verloren']++; + if ($bummalen == 1) + $_data[$partner]['gegner'][$team]['vn']++; + if ($bummalen == 2) + $_data[$partner]['gegner'][$team]['vs']++; + if ($bummalen == 4) + $_data[$partner]['gegner'][$team]['vrs']++; + if ($gstrichen == 1) + $_data[$partner]['gegner'][$team]['vg']++; + + } + } + + $return = []; + if(isset($user[$athlet_1])){ + $athlet = $user[$athlet_1]; + foreach ($_data as $partnerid => $row) { + $tmp = []; + $partner = $user[$partnerid]; + $tmp['head'] = 1; + $tmp['teams'] = $athlet . ' & ' . $partner . ' '; + $tmp['spiele'] = $row['spiele']; + $tmp['siege'] = $row['siege']; + $tmp['verloren'] = $row['verloren']; + $tmp['sn'] = $row['sn']; + $tmp['ss'] = $row['ss']; + $tmp['srs'] = $row['srs']; + $tmp['sg'] = $row['sg']; + $tmp['vn'] = $row['vn']; + $tmp['vs'] = $row['vs']; + $tmp['vrs'] = $row['vrs']; + $tmp['vg'] = $row['vg']; + $return[] = $tmp; + + foreach ($row['gegner'] as $team => $value) { + $tmp = []; + $tmp['head'] = 0; + $tmp['teams'] = $athlet . ' & ' . $partner . ' ' . self::getnames($user, $team); + $tmp['spiele'] = $value['spiele']; + $tmp['siege'] = $value['siege']; + $tmp['verloren'] = $value['verloren']; + $tmp['sn'] = $value['sn']; + $tmp['ss'] = $value['ss']; + $tmp['srs'] = $value['srs']; + $tmp['sg'] = $value['sg']; + $tmp['vn'] = $value['vn']; + $tmp['vs'] = $value['vs']; + $tmp['vrs'] = $value['vrs']; + $tmp['vg'] = $value['vg']; + $return[] = $tmp; + } + } + } + + foreach ($return as $key1 => $row) { + foreach ($row as $key2 => $value) { + if ($key2 != 'teams' and $value == 0) + $return[$key1][$key2] = ''; + } + } + + return $return; + } + + public function getnames(&$user, $team) + { + $_gegner = explode(':', $team); + $g1 = $_gegner[0]; + $g2 = $_gegner[1]; + return $user[$g1] . " & " . $user[$g2]; + } +} + + + +// Array +// ( +// [26] => Array +// ( +// [spiele] => 11 +// [siege] => 6 +// [verloren] => 5 +// [sn] => 0 +// [ss] => 0 +// [srs] => 0 +// [gs] => 0 +// [vn] => 0 +// [vs] => 0 +// [vrs] => 0 +// [vg] => 0 +// [6:31] => Array +// ( +// [spiele] => 1 +// [siege] => 1 +// [verloren] => 0 +// [sn] => 1 +// [ss] => 0 +// [srs] => 0 +// [gs] => 0 +// [vn] => 0 +// [vs] => 0 +// [vrs] => 0 diff --git a/packages/watten/Classes/Hooks/DataHandler.php b/packages/watten/Classes/Hooks/DataHandler.php new file mode 100644 index 0000000..3dd08c5 --- /dev/null +++ b/packages/watten/Classes/Hooks/DataHandler.php @@ -0,0 +1,75 @@ +log( + $table, + $id, + 2, + 0, + 1, + "Sichern des Eintrags misslang. Grund: Athleten müssen vollständig ausgefüllt werden.", + 1, + [$table] + ); + // unset table to prevent saving + $table = ''; + } elseif (\count($tmp) != 4) { + $parentObject->log( + $table, + $id, + 2, + 0, + 1, + "Sichern des Eintrags misslang. Grund: Athleten dürfen nicht doppelt vorkommen.", + 1, + [$table] + ); + // unset table to prevent saving + $table = ''; + } + } + } +} diff --git a/packages/watten/Classes/Scheduler/CronTask.php b/packages/watten/Classes/Scheduler/CronTask.php new file mode 100644 index 0000000..55bdc1d --- /dev/null +++ b/packages/watten/Classes/Scheduler/CronTask.php @@ -0,0 +1,20 @@ +run(); + + return true; + } +} diff --git a/packages/watten/Classes/Tca/Configuration.php b/packages/watten/Classes/Tca/Configuration.php new file mode 100644 index 0000000..246a6e7 --- /dev/null +++ b/packages/watten/Classes/Tca/Configuration.php @@ -0,0 +1,34 @@ +getConnectionForTable('tx_watten_domain_model_ergebnisse')->createQueryBuilder(); + $res = $queryBuilder + ->select('datum') + ->from('tx_watten_domain_model_ergebnisse') + ->addOrderBy('uid', 'DESC') + ->setMaxResults(1) + ->setFirstResult(0) + ->execute(); + $spieltag = 0; + foreach ($res as $key => $value) { + $spieltag = (int) $value['datum']; + } + return $spieltag; + } +} diff --git a/packages/watten/Classes/Utilities/CookieUtility.php b/packages/watten/Classes/Utilities/CookieUtility.php new file mode 100644 index 0000000..dfd6d48 --- /dev/null +++ b/packages/watten/Classes/Utilities/CookieUtility.php @@ -0,0 +1,55 @@ +, mindshape GmbH + * + ***/ + +/** + * @package HermannTelser\Watten\Utility + */ +class CookieUtility +{ + public const DEFAULT_COOKIE_NAME = 'watten'; + + /** + + * @param string $name + * @return array|null + */ + public static function getCookieValue(string $name = self::DEFAULT_COOKIE_NAME): ?array + { + if (false === self::hasCookie($name)) { + return null; + } + + return json_decode($_COOKIE[$name], true); + } + + /** + * @param string $named + * @return bool + */ + public static function hasCookie(string $name = self::DEFAULT_COOKIE_NAME): bool + { + return true === array_key_exists($name, $_COOKIE); + } + + /** + * @param string $name + */ + public static function deleteCookie(string $name = self::DEFAULT_COOKIE_NAME): void + { + unset($_COOKIE[$name]); + } +} diff --git a/packages/watten/Configuration/FlexForms/flexform_watten.xml b/packages/watten/Configuration/FlexForms/flexform_watten.xml new file mode 100644 index 0000000..30ff372 --- /dev/null +++ b/packages/watten/Configuration/FlexForms/flexform_watten.xml @@ -0,0 +1,38 @@ + + + + + + + Statistik Konfiguration + + array + + + + + + + + select + selectSingle + + + Spieltag Chart + line + + + Ranglisten Bar + bar + + + + + + + + + + + + diff --git a/packages/watten/Configuration/Icons.php b/packages/watten/Configuration/Icons.php new file mode 100644 index 0000000..901a7a5 --- /dev/null +++ b/packages/watten/Configuration/Icons.php @@ -0,0 +1,8 @@ + [ + 'provider' => \TYPO3\CMS\Core\Imaging\IconProvider\SvgIconProvider::class, + 'source' => 'EXT:watten/Resources/Public/Icons/user_plugin_ergebnisse.svg' + ], +]; diff --git a/packages/watten/Configuration/RequestMiddlewares.php b/packages/watten/Configuration/RequestMiddlewares.php new file mode 100644 index 0000000..2bd15a1 --- /dev/null +++ b/packages/watten/Configuration/RequestMiddlewares.php @@ -0,0 +1,12 @@ + [ + 'hermanntelser/watten/wattenajax' => [ + 'target' => \HermannTelser\Watten\Controller\EidController::class, + 'after' => [ + 'typo3/cms-frontend/prepare-tsfe-rendering' + ] + ], + ], +]; diff --git a/packages/watten/Configuration/TCA/Overrides/sys_template.php b/packages/watten/Configuration/TCA/Overrides/sys_template.php new file mode 100644 index 0000000..e81f713 --- /dev/null +++ b/packages/watten/Configuration/TCA/Overrides/sys_template.php @@ -0,0 +1,4 @@ + [ + 'title' => 'Watten Athleten', + 'label' => 'name', + 'tstamp' => 'tstamp', + 'crdate' => 'crdate', + 'dividers2tabs' => true, + 'versioningWS' => false, + 'iconfile' => 'EXT:watten/Resources/Public/Icons/User.svg', + 'sortby' => 'uid', + ], + 'interface' => [ + 'showRecordFieldList' => 'gender, name, image, isactive', + ], + 'types' => [ + '0' => ['showitem' => ' + --div--;Teilnehmer, gender, name, isactive, image' + ], + ], + 'palettes' => [ + '1' => ['showitem' => 'name, isactive'], + ], + 'columns' => [ + 'gender' => [ + 'exclude' => 1, + 'label' => 'Gender', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + ['Herr', 0], + ['Frau', 1], + ], + ], + ], + 'name' => [ + 'exclude' => 1, + 'label' => 'Athleten', + 'config' => [ + 'type' => 'input', + 'size' => 30, + 'max' => 50, + ], + ], + 'isactive' => [ + 'exclude' => 0, + 'label' => 'Ist Aktiv', + 'config' => [ + 'type' => 'check', + ], + ], + 'image' => [ + 'exclude' => true, + 'label' => 'Avatar', + 'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig( + 'image', + [ + 'appearance' => [ + 'createNewRelationLinkTitle' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:images.addFileReference' + ], + 'overrideChildTca' => [ + 'types' => [ + \TYPO3\CMS\Core\Resource\File::FILETYPE_UNKNOWN => [ + 'showitem' => ' + --palette--;;filePalette + ' + ], + \TYPO3\CMS\Core\Resource\File::FILETYPE_TEXT => [ + 'showitem' => ' + --palette--;;filePalette + ' + ], + \TYPO3\CMS\Core\Resource\File::FILETYPE_IMAGE => [ + 'showitem' => ' + title, + alternative, + crop, + --palette--;;filePalette + ' + ], + \TYPO3\CMS\Core\Resource\File::FILETYPE_AUDIO => [ + 'showitem' => ' + --palette--;;filePalette + ' + ], + \TYPO3\CMS\Core\Resource\File::FILETYPE_VIDEO => [ + 'showitem' => ' + --palette--;;filePalette + ' + ], + \TYPO3\CMS\Core\Resource\File::FILETYPE_APPLICATION => [ + 'showitem' => ' + --palette--;;filePalette + ' + ], + ], + ], + 'minitems' => 0, + 'maxitems' => 1, + ], + $GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'] + ), + ], + ], +]; diff --git a/packages/watten/Configuration/TCA/tx_watten_domain_model_ergebnisse.php b/packages/watten/Configuration/TCA/tx_watten_domain_model_ergebnisse.php new file mode 100644 index 0000000..2ab3b27 --- /dev/null +++ b/packages/watten/Configuration/TCA/tx_watten_domain_model_ergebnisse.php @@ -0,0 +1,169 @@ + [ + 'title' => 'Watten Ergebnisse', + 'label' => 'uid', + 'tstamp' => 'tstamp', + 'crdate' => 'crdate', + 'dividers2tabs' => true, + 'versioningWS' => false, + 'searchFields' => 'uid', + 'iconfile' => 'EXT:watten/Resources/Public/Icons/List.svg', + 'default_sortby' => 'uid DESC', + ], + 'interface' => [ + 'showRecordFieldList' => 'event_id, s1, s2, v1, v2, bumid, gstrichen', + ], + 'types' => [ + '1' => ['showitem' => ' + --div--;Spieltag, tournaments_id, event_id, s1, s2, v1, v2, bumid, gstrichen' + ], + ], + 'palettes' => [ + '1' => ['showitem' => 'datum'], + ], + 'columns' => [ + // 'datum' => [ + // 'exclude' => 1, + // 'label' => 'Spieltag', + // 'config' => [ + // 'type' => 'input', + // 'renderType' => 'inputDateTime', + // 'disableAgeDisplay' => 1, + // 'size' => 13, + // 'eval' => 'date', + // 'checkbox' => 0, + // 'default' => time(), + // 'behaviour' => ['allowLanguageSynchronization' => false ], + // 'range' => ['lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y'))] + // ], + // ], + 'tournaments_id' => [ + 'exclude' => 0, + 'label' => 'Tournament', + 'config' => [ + 'fieldWizard' => [ + 'selectIcons' => [ + 'disabled' => true + ] + ], + "type" => "select", + 'renderType' => 'selectSingle', + "foreign_table" => "tx_watten_tournaments", + // 'foreign_table_where' => 'AND active = 1 ORDER BY tournament', + "size" => 1, + "minitems" => 1, + "maxitems" => 1, + ], + ], + 'event_id' => [ + 'exclude' => 0, + 'label' => 'Event', + 'config' => [ + 'fieldWizard' => [ + 'selectIcons' => [ + 'disabled' => true + ] + ], + "type" => "select", + 'renderType' => 'selectSingle', + "foreign_table" => "tx_watten_domain_model_events", + // 'foreign_table_where' => 'AND isactive = 1', + "size" => 1, + "minitems" => 1, + "maxitems" => 1, + ], + ], + 's1' => [ + 'exclude' => 0, + 'label' => 'Sieger 1', + 'config' => [ + "type" => "select", + "default" => "0", + 'items' => [ + ['Bitte wählen', 0], + ], + 'renderType' => 'selectSingle', + "foreign_table" => "tx_watten_domain_model_athleten", + 'foreign_table_where' => 'AND isactive = 1 ORDER BY name', + "size" => 1, + "minitems" => 1, + "maxitems" => 1, + ], + ], + 's2' => [ + 'exclude' => 0, + 'label' => 'Sieger 2', + 'config' => [ + "type" => "select", + 'items' => [ + ['Bitte wählen', 0], + ], + "default" => "0", + 'renderType' => 'selectSingle', + "foreign_table" => "tx_watten_domain_model_athleten", + 'foreign_table_where' => 'AND isactive = 1 ORDER BY name', + "size" => 1, + "minitems" => 1, + "maxitems" => 1, + ], + ], + 'v1' => [ + 'exclude' => 0, + 'label' => 'Verlierer 1', + 'config' => [ + "type" => "select", + 'items' => [ + ['Bitte wählen', 0], + ], + "default" => "0", + 'renderType' => 'selectSingle', + "foreign_table" => "tx_watten_domain_model_athleten", + 'foreign_table_where' => 'AND isactive = 1 ORDER BY name', + "size" => 1, + "minitems" => 1, + "maxitems" => 1, + ], + ], + 'v2' => [ + 'exclude' => 0, + 'label' => 'Verlierer 2', + 'config' => [ + "type" => "select", + 'items' => [ + ['Bitte wählen', 0], + ], + "default" => "0", + 'renderType' => 'selectSingle', + "foreign_table" => "tx_watten_domain_model_athleten", + 'foreign_table_where' => 'AND isactive = 1 ORDER BY name', + "size" => 1, + "minitems" => 1, + "maxitems" => 1, + ], + ], + 'bumid' => [ + 'label' => 'Bummalen', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + ['Sieg', 1], + ['Schneider', 2], + ['Retour Schneider', 4], + ], + "size" => 1, + "minitems" => 1, + "maxitems" => 1, + ], + ], + 'gstrichen' => [ + 'exclude' => 0, + 'label' => 'Gstrichen/Gstrichen', + 'config' => [ + 'type' => 'check', + ], + ], + ], +]; diff --git a/packages/watten/Configuration/TCA/tx_watten_domain_model_events.php b/packages/watten/Configuration/TCA/tx_watten_domain_model_events.php new file mode 100644 index 0000000..a975bbe --- /dev/null +++ b/packages/watten/Configuration/TCA/tx_watten_domain_model_events.php @@ -0,0 +1,84 @@ + [ + 'title' => 'Watten Spieltage', + 'label' => 'datum', + 'tstamp' => 'tstamp', + 'crdate' => 'crdate', + 'dividers2tabs' => true, + 'versioningWS' => false, + 'iconfile' => 'EXT:watten/Resources/Public/Icons/Calender.svg', + 'default_sortby' => 'datum DESC', + ], + 'interface' => [ + 'showRecordFieldList' => 'tournaments_id, datum, isactive, event, story', + ], + 'types' => [ + '1' => ['showitem' => ' + --div--;Spieltag, tournaments_id, datum, isactive, event, story' + ], + ], + 'palettes' => [ + '1' => ['showitem' => 'datum'], + ], + 'columns' => [ + 'tournaments_id' => [ + 'exclude' => 0, + 'label' => 'Tournament/Saison', + 'config' =>[ + 'fieldWizard' => [ + 'selectIcons' => [ + 'disabled' => true + ] + ], + "type" => "select", + 'renderType' => 'selectSingle', + "foreign_table" => "tx_watten_tournaments", + "size" => 1, + "minitems" => 1, + "maxitems" => 1, + ], + ], + 'datum' => [ + 'exclude' => 1, + 'label' => 'Spieltag', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'disableAgeDisplay' => 1, + 'size' => 13, + 'eval' => 'date', + 'checkbox' => 0, + 'default' => time(), + 'behaviour' => ['allowLanguageSynchronization' => false ] + ], + ], + 'isactive' => [ + 'exclude' => 0, + 'label' => 'Ist Aktiv', + 'config' => [ + 'type' => 'check', + ], + ], + 'event' => [ + 'exclude' => 1, + 'label' => 'Select Anhang', + 'config' => [ + 'type' => 'input', + 'size' => 30, + 'max' => 50, + ], + ], + 'story' => [ + 'exclude' => true, + 'label' => 'Spieltag Beschreibung', + 'config' => [ + 'type' => 'text', + 'cols' => 60, + 'rows' => 5, + 'enableRichtext' => true + ] + ], + ], +]; diff --git a/packages/watten/Configuration/TCA/tx_watten_tournaments.php b/packages/watten/Configuration/TCA/tx_watten_tournaments.php new file mode 100644 index 0000000..91d0146 --- /dev/null +++ b/packages/watten/Configuration/TCA/tx_watten_tournaments.php @@ -0,0 +1,50 @@ + [ + 'title' => 'Saisonen / Tournaments', + 'label' => 'tournament', + 'tstamp' => 'tstamp', + 'crdate' => 'crdate', + 'dividers2tabs' => true, + 'versioningWS' => false, + 'iconfile' => 'EXT:watten/Resources/Public/Icons/Sun.svg', + 'default_sortby' => 'tournament DESC', + ], + 'interface' => [ + 'showRecordFieldList' => 'tournament, active, king', + ], + 'types' => [ + '0' => ['showitem' => ' + --div--;Tournaments, tournament, active, king' + ], + ], + 'palettes' => [ + '1' => ['showitem' => 'Tournaments'], + ], + 'columns' => [ + 'tournament' => [ + 'exclude' => 0, + 'label' => 'Tournaments', + 'config' => [ + 'type' => 'input', + 'size' => 30, + 'max' => 50, + ], + ], + 'active' => [ + 'exclude' => 0, + 'label' => 'Ist Aktiv', + 'config' => [ + 'type' => 'check', + ], + ], + 'king' => [ + 'exclude' => 0, + 'label' => 'Aktiver König', + 'config' => [ + 'type' => 'check', + ], + ], + ], +]; diff --git a/packages/watten/Configuration/TypoScript/constants.typoscript b/packages/watten/Configuration/TypoScript/constants.typoscript new file mode 100644 index 0000000..f6f9003 --- /dev/null +++ b/packages/watten/Configuration/TypoScript/constants.typoscript @@ -0,0 +1,14 @@ +plugin.tx_watten_domain_model_ergebnisse { + view { + # cat=plugin.tx_watten_domain_model_ergebnisse/file; type=string; label=Path to template root (FE) + templateRootPath = EXT:watten/Resources/Private/Templates/ + # cat=plugin.tx_watten_domain_model_ergebnisse/file; type=string; label=Path to template partials (FE) + partialRootPath = EXT:watten/Resources/Private/Partials/ + # cat=plugin.tx_watten_domain_model_ergebnisse/file; type=string; label=Path to template layouts (FE) + layoutRootPath = EXT:watten/Resources/Private/Layouts/ + } + persistence { + # cat=plugin.tx_watten_domain_model_ergebnisse//a; type=string; label=Default storage PID + storagePid = + } +} diff --git a/packages/watten/Configuration/TypoScript/setup.typoscript b/packages/watten/Configuration/TypoScript/setup.typoscript new file mode 100644 index 0000000..2099b01 --- /dev/null +++ b/packages/watten/Configuration/TypoScript/setup.typoscript @@ -0,0 +1,37 @@ +plugin.tx_watten_domain_model_ergebnisse { + view { + templateRootPaths.0 = EXT:watten/Resources/Private/Templates/ + templateRootPaths.1 = {$plugin.tx_watten_domain_model_ergebnisse.view.templateRootPath} + partialRootPaths.0 = EXT:watten/Resources/Private/Partials/ + partialRootPaths.1 = {$plugin.tx_watten_domain_model_ergebnisse.view.partialRootPath} + layoutRootPaths.0 = EXT:watten/Resources/Private/Layouts/ + layoutRootPaths.1 = {$plugin.tx_watten_domain_model_ergebnisse.view.layoutRootPath} + } + persistence { + storagePid = {$plugin.tx_watten_domain_model_ergebnisse.persistence.storagePid} + #recursive = 1 + } + features { + #skipDefaultArguments = 1 + # if set to 1, the enable fields are ignored in BE context + ignoreAllEnableFieldsInBe = 0 + } + mvc { + #callDefaultActionIfActionCantBeResolved = 1 + } +} + + + +tx_watten_domain_model_ergebnisse = PAGE +tx_watten_domain_model_ergebnisse { + typeNum < 1234 + config { + disableAllHeaderCode = 1 + additionalHeaders = Content-type:text/html + xhtml_cleaning = 0 + admPanel = 0 + debug = 0 + no_cache = 1 + } +} diff --git a/packages/watten/Readme.md b/packages/watten/Readme.md new file mode 100644 index 0000000..7239c5a --- /dev/null +++ b/packages/watten/Readme.md @@ -0,0 +1,29 @@ +# Dotterbühel Watten + +Typo3 Erweiterung zur Verwaltung der der Watterergebnisse des FC Dotterbühel +Verion TYPO3 CMS 11.5.19 + +### Installing + +``` +* git clone http://gitea.nuhodds.com:3000/salam/watten_t3.git +``` + +## Authors + +Hermann Telser + +## Version History + +* 0.1 + * Create Repository + +## License + +This project is privat + +## Acknowledgments + +Website Produktion +* [Dotterbühel Homepage](https://www.xn--dotterbhel-geb.com/) +* [Dotterbühel Typo3 Administration](https://www.xn--dotterbhel-geb.com/typo3) \ No newline at end of file diff --git a/packages/watten/Resources/Private/.htaccess b/packages/watten/Resources/Private/.htaccess new file mode 100644 index 0000000..96d0729 --- /dev/null +++ b/packages/watten/Resources/Private/.htaccess @@ -0,0 +1,11 @@ +# Apache < 2.3 + + Order allow,deny + Deny from all + Satisfy All + + +# Apache >= 2.3 + + Require all denied + diff --git a/packages/watten/Resources/Private/Partials/GridErgebnisse.html b/packages/watten/Resources/Private/Partials/GridErgebnisse.html new file mode 100644 index 0000000..c1784da --- /dev/null +++ b/packages/watten/Resources/Private/Partials/GridErgebnisse.html @@ -0,0 +1,99 @@ + + + + var bum1 = ''; + var bum2 = ''; + var bum4 = ''; + + function markName(classname) { + $('.athlet ').css('color', '#ddd'); + $('.athlet ').css('font-weight', 'normal'); + $('td.'+classname).css('color', '#CC7B2E'); + $('td.'+classname).css('font-weight', 'bold'); + } + + $("#grid_ergebnisse").jsGrid({ + height: "auto", + width: "100%", + + heading: true, + filtering: false, + inserting: false, + editing: false, + selecting: true, + sorting: true, + paging: false, + pageLoading: false, + + noDataContent: ' Spieltag wählen ', + + loadIndication: true, + loadIndicationDelay: 500, + loadMessage: " Bitte, warten... ", + loadShading: true, + + fields: [ + { title: '
Spiel Nummer
', name: "uid", type: "text" }, + { title: '
Sieger
', name: "s1", type: "text", css:"pointer", cellRenderer: function (item, value) { let v = value.s1; return '' + v + ''; }}, + { title: '
Sieger
', name: "s2", type: "text", css:"pointer", cellRenderer: function (item, value) { let v = value.s2; return '' + v + ''; }}, + { title: '
Verlierer
', name: "v1", type: "text", css:"pointer", cellRenderer: function (item, value) { let v = value.v1; return '' + v + ''; }}, + { title: '
Verlierer
', name: "v2", type: "text", css:"pointer", cellRenderer: function (item, value) { let v = value.v2; return '' + v + ''; }}, + { title: '
Bummale
', name: "bumid", type: "text", cellRenderer: function(item, value){ if(item==1) return bum1; else if(item==2) return bum2; else return bum4; }}, + { title: '
Gstr/Gstr
', name: "gs", type: "text"} + ] + }); + + $("#grid_punkte").jsGrid({ + height: "auto", + width: "50%", + + heading: true, + filtering: false, + inserting: false, + editing: false, + selecting: true, + sorting: true, + paging: false, + pageLoading: false, + + noDataContent: ' Spieltag wählen ', + + loadIndication: true, + loadIndicationDelay: 500, + loadMessage: " Bitte, warten... ", + loadShading: true, + + fields: [ + { title: '
Platzierung
', name: "rang", type: "text", width: "100" }, + { title: '
Athlet
', name: "name", type: "text", width: "200" }, + { title: '
Punkte
', name: "punkte", type: "text", width: "100" }, + ] + }); + + $(function() { + $.ajax({ + url: "../index.php", + type: "GET", + data: { + application: "loadspieltag", + event_id: $( "#spieltagselect" ).val() + }, + dataType : "json" + }) + .done(function( response ) { + $('#story_text').html(response.story); + $("#grid_ergebnisse").jsGrid({ data: response.data }); + $("#grid_punkte").jsGrid({ data: response.punkte }); + }) + }); +
+
+
+

+

Punkte Spieltag

+
\ No newline at end of file diff --git a/packages/watten/Resources/Private/Partials/GridGstrichen.html b/packages/watten/Resources/Private/Partials/GridGstrichen.html new file mode 100644 index 0000000..6a1e350 --- /dev/null +++ b/packages/watten/Resources/Private/Partials/GridGstrichen.html @@ -0,0 +1,54 @@ + + + + $("#grid_gstrichen").jsGrid({ + height: "auto", + width: "100%", + + heading: true, + filtering: false, + inserting: false, + editing: false, + selecting: true, + sorting: true, + paging: false, + pageLoading: false, + + noDataContent: ' Turnier wählen ', + + loadIndication: true, + loadIndicationDelay: 500, + loadMessage: " Bitte, warten... ", + loadShading: true, + + fields: [ + { title: '
Platzierungen
', name: "platz", type: "text", width: "100" }, + { title: '
Athlet
', name: "sieger", type: "text", width: "200" }, + { title: '
Gewonnen
', name: "gewonnen", type: "text", width: "100" }, + { title: '
 
', name: "", type: "text", width: "100", css: "transparent" }, + { title: '
Platzierungen
', name: "platz", type: "text", width: "100" }, + { title: '
Athlet
', name: "verlierer", type: "text", width: "200" }, + { title: '
Verloren
', name: "verloren", type: "text", width: "100" }, + ] + }); + $(function() { + $.ajax({ + url: "../index.php", + type: "GET", + data: { + application: "loadgstrichenliste", + tournament: $( "#tournament_rangliste" ).val() + }, + dataType : "json" + }) + .done(function( response ) { + $("#grid_gstrichen").jsGrid({ data: response }); + }) + }); +
+ +

+

Gstrichen || Gstrichen

+
+
diff --git a/packages/watten/Resources/Private/Partials/GridPaarlauf.html b/packages/watten/Resources/Private/Partials/GridPaarlauf.html new file mode 100644 index 0000000..e6af9d0 --- /dev/null +++ b/packages/watten/Resources/Private/Partials/GridPaarlauf.html @@ -0,0 +1,136 @@ + + + function render_gesamt(data, row) { + if(row.head == 1) + return ''+ data+ '' + else + return ''+ data+ '' + } + $("#grid_paarlauf").jsGrid({ + height: "auto", + width: "100%", + + heading: true, + filtering: false, + inserting: false, + editing: false, + selecting: true, + sorting: true, + paging: false, + pageLoading: false, + + noDataContent: ' Athleten wählen ', + + loadIndication: true, + loadIndicationDelay: 500, + loadMessage: " Bitte, warten... ", + loadShading: true, + + fields: [ + { + title: '
Kontrahenten
', + name: "teams", + type: "text", + width: "30%", + css: "firstcolumn", + cellRenderer: render_gesamt, + }, + { + title: '
Spiele
', + name: "spiele", + type: "text", + width: "6.5%", + css: "bold", + cellRenderer: render_gesamt + }, + { + title: '
Gesamt
', + name: "siege", + type: "text", + width: "6.5%", + css:"greenbold", + cellRenderer: render_gesamt + }, + { + title: '
Gesamt
', + name: "verloren", + type: "text", + width: "6.5%", + css:"rotbold", + cellRenderer: render_gesamt + }, + { + title: '
Siege
', + name: "sn", + type: "text", + width: "6.5%", + cellRenderer: render_gesamt + }, + { + title: '
Schneider
', + name: "ss", + type: "text", + width: "6.5%", + cellRenderer: render_gesamt + }, + { + title: '
R-Schneider
', + name: "srs", + type: "text", + width: "6.5%", + cellRenderer: render_gesamt + }, + { + title: '
Gstrichen
', + name: "sg", + type: "text", + width: "6.5%", + cellRenderer: render_gesamt + }, + { + title: '
Verloren
', + name: "vn", + type: "text", + width: "6.5%", + cellRenderer: render_gesamt + }, + { + title: '
Schneider
', + name: "vs", + type: "text", + width: "6.5%", + cellRenderer: render_gesamt + }, + { + title: '
R-Schneider
', + name: "vrs", + type: "text", + width: "6.5%", + cellRenderer: render_gesamt + }, + { + title: '
Gstrichen
', + name: "vg", + type: "text", + width: "6.5%", + cellRenderer: render_gesamt }, + ] + }); + $(function() { + $.ajax({ + url: "../index.php", + type: "GET", + data: { + application: "loadpaarlaufer", + tournament: $( "#tournament_paarlauf" ).val(), + teilnehmer_id: $( "#tournament_teilnehmer" ).val() + }, + dataType : "json" + }) + .done(function( response ) { + $("#grid_paarlauf").jsGrid({ data: response }); + }) + }); +
+
\ No newline at end of file diff --git a/packages/watten/Resources/Private/Partials/GridRangliste.html b/packages/watten/Resources/Private/Partials/GridRangliste.html new file mode 100644 index 0000000..cb978ec --- /dev/null +++ b/packages/watten/Resources/Private/Partials/GridRangliste.html @@ -0,0 +1,55 @@ + + + + $("#grid_rangliste").jsGrid({ + height: "auto", + width: "100%", + + heading: true, + filtering: false, + inserting: false, + editing: false, + selecting: true, + sorting: true, + paging: false, + pageLoading: false, + + noDataContent: ' Turnier wählen ', + + loadIndication: true, + loadIndicationDelay: 500, + loadMessage: " Bitte, warten... ", + loadShading: true, + + fields: [ + { title: '
Platzierungen
', name: "platz", type: "text", width: "100" }, + { title: '
Athlet
', name: "name", type: "text", width: "200" }, + { title: '
Spiele
', name: "spiele", type: "text", width: "100" }, + { title: '
Punkte
', name: "punkte", type: "text", width: "100", css: "bold" }, + + { title: '
Siege
', name: "s1", type: "text", width: "100" }, + { title: '
Schneider
', name: "s2", type: "text", width: "100" }, + { title: '
R-Schneider
', name: "s4", type: "text", width: "100" }, + { title: '
Gstrichen
', name: "sg", type: "text", width: "100" }, + { title: '
Niederlagen
', name: "v1", type: "text", width: "100" }, + { title: '
Schneider
', name: "v2", type: "text", width: "100" }, + { title: '
R-Schneider
', name: "v4", type: "text", width: "100" }, + { title: '
Gstrichen
', name: "vg", type: "text", width: "100" }, + ] + }); + $(function() { + $.ajax({ + url: "../index.php", + type: "GET", + data: { + application: "loadrangliste", + }, + dataType : "json" + }) + .done(function( response ) { + $("#grid_rangliste").jsGrid({ data: response }); + }) + }); +
+
diff --git a/packages/watten/Resources/Private/Partials/SelectPaarlauf.html b/packages/watten/Resources/Private/Partials/SelectPaarlauf.html new file mode 100644 index 0000000..2bfdf61 --- /dev/null +++ b/packages/watten/Resources/Private/Partials/SelectPaarlauf.html @@ -0,0 +1,31 @@ + + +function loadTournamentAthleten(){ + $.ajax({ + url: "../index.php", + type: "GET", + data: { + application: "loadtournamentathleten", + tournament: $( "#tournament_paarlauf" ).val() + }, + dataType : "json" + }) + .done(function( response ) { + $("#grid_paarlauf").jsGrid({ data: '' }); + var $select = $('#tournament_teilnehmer'); + $select.find('option').remove(); + $.each(response, function(key, value) { + $select.append(``); + }); + $select.options[0].selected = true + }); +} + + + diff --git a/packages/watten/Resources/Private/Partials/SelectRangliste.html b/packages/watten/Resources/Private/Partials/SelectRangliste.html new file mode 100644 index 0000000..53b5767 --- /dev/null +++ b/packages/watten/Resources/Private/Partials/SelectRangliste.html @@ -0,0 +1,25 @@ + + + function ladeRangliste(){ + $.ajax({ + url: "../index.php", + type: "GET", + data: { + application: "loadrangliste", + tournament: $( "#tournament_rangliste" ).val() + }, + dataType : "json" + }) + .done(function( response ) { + $("#grid_rangliste").jsGrid({ data: response }); + }); + } + + + diff --git a/packages/watten/Resources/Private/Partials/SelectSpieltag.html b/packages/watten/Resources/Private/Partials/SelectSpieltag.html new file mode 100644 index 0000000..11143ff --- /dev/null +++ b/packages/watten/Resources/Private/Partials/SelectSpieltag.html @@ -0,0 +1,26 @@ + + function ladeSpieltag(){ + $.ajax({ + url: "../index.php", + type: "GET", + data: { + application: "loadspieltag", + event_id: $( "#spieltagselect" ).val() + }, + dataType : "json" + }) + .done(function( response ) { + $('#story_text').html(response.story); + $("#grid_ergebnisse").jsGrid({ data: response.data }); + $("#grid_punkte").jsGrid({ data: response.punkte }); + }) + } + + + diff --git a/packages/watten/Resources/Private/Partials/SelectTeilnehmer.html b/packages/watten/Resources/Private/Partials/SelectTeilnehmer.html new file mode 100644 index 0000000..eb292be --- /dev/null +++ b/packages/watten/Resources/Private/Partials/SelectTeilnehmer.html @@ -0,0 +1,25 @@ + +function ladePaarlaufer(){ +$.ajax({ + url: "../index.php", + type: "GET", + data: { + application: "loadpaarlaufer", + tournament: $( "#tournament_paarlauf" ).val(), + teilnehmer_id: $( "#tournament_teilnehmer" ).val() + }, + dataType : "json" + }) + .done(function( response ) { + $("#grid_paarlauf").jsGrid({ data: response }); + }) +} + + + diff --git a/packages/watten/Resources/Private/Partials/SelectTournament.html b/packages/watten/Resources/Private/Partials/SelectTournament.html new file mode 100644 index 0000000..a0cb26b --- /dev/null +++ b/packages/watten/Resources/Private/Partials/SelectTournament.html @@ -0,0 +1,37 @@ + + + function ladeSpieltage(){ + $.ajax({ + url: "../index.php", + type: "GET", + data: { + application: "loadspieltage", + tournament: $( "#tournament" ).val() + }, + dataType : "json" + }) + .done(function( response ) { + $("#grid_ergebnisse").jsGrid({ data: '' }); + $("#grid_punkte").jsGrid({ data: '' }); + $('#story_text').html(''); + + + myChart.data = []; + myChart.update(); + + var $select = $('#spieltagselect'); + $select.find('option').remove(); + $.each(response, function(key, value) { + $select.append(``); + }); + }) + } + + + diff --git a/packages/watten/Resources/Private/Partials/StatistikErgebnisse.html b/packages/watten/Resources/Private/Partials/StatistikErgebnisse.html new file mode 100644 index 0000000..58730e1 --- /dev/null +++ b/packages/watten/Resources/Private/Partials/StatistikErgebnisse.html @@ -0,0 +1,6 @@ +

+

Liniendiagramm Spieltag

+
+
+ +
diff --git a/packages/watten/Resources/Private/Partials/StatistikRangliste.html b/packages/watten/Resources/Private/Partials/StatistikRangliste.html new file mode 100644 index 0000000..570e6c5 --- /dev/null +++ b/packages/watten/Resources/Private/Partials/StatistikRangliste.html @@ -0,0 +1,6 @@ +

+

Ergebnisse Balkendiagram

+
+
+ +
diff --git a/packages/watten/Resources/Private/Templates/Watten/Ergebnisse.html b/packages/watten/Resources/Private/Templates/Watten/Ergebnisse.html new file mode 100644 index 0000000..6313f2b --- /dev/null +++ b/packages/watten/Resources/Private/Templates/Watten/Ergebnisse.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+ + + + +
+ + + + + diff --git a/packages/watten/Resources/Private/Templates/Watten/Rangliste.html b/packages/watten/Resources/Private/Templates/Watten/Rangliste.html new file mode 100644 index 0000000..7d5f970 --- /dev/null +++ b/packages/watten/Resources/Private/Templates/Watten/Rangliste.html @@ -0,0 +1,24 @@ + + + + + + + + + +
+ + +
+ + + + + + diff --git a/packages/watten/Resources/Private/Templates/Watten/Statistik.html b/packages/watten/Resources/Private/Templates/Watten/Statistik.html new file mode 100644 index 0000000..0c21268 --- /dev/null +++ b/packages/watten/Resources/Private/Templates/Watten/Statistik.html @@ -0,0 +1,25 @@ + + +

Paarlauf

+
+ + + + + + + + +
+ + +
+ + +
+ + diff --git a/packages/watten/Resources/Private/readme.md b/packages/watten/Resources/Private/readme.md new file mode 100644 index 0000000..785daec --- /dev/null +++ b/packages/watten/Resources/Private/readme.md @@ -0,0 +1 @@ +https://www.chartjs.org/docs/latest/samples/line/line.html diff --git a/packages/watten/Resources/Public/Css/base.css b/packages/watten/Resources/Public/Css/base.css new file mode 120000 index 0000000..84a63d3 --- /dev/null +++ b/packages/watten/Resources/Public/Css/base.css @@ -0,0 +1 @@ +/var/www/html/dotter_t3/public/fileadmin/templates/css/base.css \ No newline at end of file diff --git a/packages/watten/Resources/Public/Css/images/Schellen.png b/packages/watten/Resources/Public/Css/images/Schellen.png new file mode 100644 index 0000000000000000000000000000000000000000..8505d2c882e61ec04ba364baa20cefeb48fc3bd2 GIT binary patch literal 6552 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.jsgrid-header-cell, +.jsgrid-filter-row>.jsgrid-cell, +.jsgrid-insert-row>.jsgrid-cell, +.jsgrid-edit-row>.jsgrid-cell { + border: 1px solid #333; + text-align: center; +} + +.jsgrid-header-row>.jsgrid-header-cell { + border-top: 0; +} + +.jsgrid-header-row>.jsgrid-header-cell, +.jsgrid-filter-row>.jsgrid-cell, +.jsgrid-insert-row>.jsgrid-cell { + border-bottom: 0; +} + +.jsgrid-header-row>.jsgrid-header-cell:first-child, +.jsgrid-filter-row>.jsgrid-cell:first-child, +.jsgrid-insert-row>.jsgrid-cell:first-child { + border-left: none; +} + +.jsgrid-header-row>.jsgrid-header-cell:last-child, +.jsgrid-filter-row>.jsgrid-cell:last-child, +.jsgrid-insert-row>.jsgrid-cell:last-child { + border-right: none; +} + +.jsgrid-header-row .jsgrid-align-right, +.jsgrid-header-row .jsgrid-align-left { + text-align: center; +} + +.jsgrid-grid-header { + background: #313131; +} + +.jsgrid-header-scrollbar { + scrollbar-arrow-color: #242424; + scrollbar-base-color: #242424; + scrollbar-3dlight-color: #242424; + scrollbar-highlight-color: #242424; + scrollbar-track-color: #242424; + scrollbar-shadow-color: #242424; + scrollbar-dark-shadow-color: #242424; +} + +.jsgrid-header-scrollbar::-webkit-scrollbar { + visibility: hidden; +} + +.jsgrid-header-scrollbar::-webkit-scrollbar-track { + background: #242424; +} + +.jsgrid-header-sortable:hover { + cursor: pointer; + background: #000; +} + +.jsgrid-header-row .jsgrid-header-sort { + background: #3d3d3d; +} + +.jsgrid-header-sort:before { + content: " "; + display: block; + float: left; + width: 0; + height: 0; + border-style: solid; +} + +.jsgrid-header-sort-asc:before { + border-width: 0 5px 5px 5px; + border-color: transparent transparent #aaa transparent; + margin: 3px; +} + +.jsgrid-header-sort-desc:before { + border-width: 5px 5px 0 5px; + border-color: #aaa transparent transparent transparent; + margin: 3px; +} + +.jsgrid-grid-body { + border-top: none; +} + +.jsgrid-cell { + border: #777 1px solid; +} + +.jsgrid-grid-body .jsgrid-row:first-child .jsgrid-cell, +.jsgrid-grid-body .jsgrid-alt-row:first-child .jsgrid-cell { + border-top: none; +} + +.jsgrid-grid-body .jsgrid-cell:first-child { + border-left: none; +} + +.jsgrid-grid-body .jsgrid-cell:last-child { + border-right: none; +} + +.jsgrid-row>.jsgrid-cell { + background: #0C0A09; +} + +.jsgrid-alt-row>.jsgrid-cell { + background: #313131; +} + +.jsgrid-header-row>.jsgrid-header-cell { + background: #313131; +} + +.jsgrid-filter-row>.jsgrid-cell { + background: #313131; +} + +.jsgrid-insert-row>.jsgrid-cell { + background: #313131; +} + +.jsgrid-edit-row>.jsgrid-cell { + background: #3a3a3a; +} + +.jsgrid-selected-row>.jsgrid-cell { + background: #D97706; + color:#000; + border-color: #3d3d3d; +} + +.jsgrid-nodata-row>.jsgrid-cell { + background: #000; +} + +.jsgrid-invalid input, +.jsgrid-invalid select, +.jsgrid-invalid textarea { + background: #313131; + color: #d3d3d3; + border: 1px solid #800; +} + +.jsgrid-pager-current-page { + font-weight: bold; +} + +.jsgrid-pager-nav-inactive-button a { + color: #d3d3d3; +} + +.jsgrid-button+.jsgrid-button { + margin-left: 5px; +} + +.jsgrid-button:hover { + opacity: .5; + transition: opacity 200ms linear; +} + +.jsgrid .jsgrid-button { + width: 16px; + height: 16px; + border: none; + cursor: pointer; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAFgEAYAAADx4WWjAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAZjElEQVR42u2deVyU1f7HzzyzDzCA7MgihCsY7uYOiZIamebVFl/Wy8zSxLTQuld/lmIuCGIu9cruLa9lXlNTUQsVUgQRNBbZF5F9lWEbZpj9/P74doQZ87LMDHjvPe9/vj7MPOf5fp6zjc/3e86D0H8rNTVRUd988/rrxpZTV3f48PHjixb1m+N5eVOmvP76hQtXryKEEMYVFWFhERG7dvW2nIKC4OBVq/71L1JOWdk774SHb9tmcoc1mpaWtjYLi6Ki+fPff/+f/7x2DS6YlobQpEkYJyQgxOViXFGxYUNExN693ZVXWDh//urV339/8yZCQiGUM3EixqTcqqq//e3gwQ8+MJkAnU6tVqvZbKk0KSkj47nnfv/d2nrcOInk1i2EHBw6HSBCyss3btyz53Eh4PiJEwkJCAkEGKenIzRlCsaJiQhZW2OcmentHRhYUCCX5+Tcv+/nZ/KaIKjVlZUSibPz3bu2tv7+jY1JSQjZ22P8++8ITZiA8c2bCIlEGNfU7Njx9dcbN5aXv/fe55/v2kXueFfHrawwzsjw8po1Kz9fp5PJVCoOx9T+sp4spLq6qcnJKTPTzy8wMDtbpWpurqlxcBAIEPL2RkihQKi8HCEWCyEOByGBACEPD4RkMoSysxGyshoxYtKkvLxnn83IiI3192cYoZDL1WjMduefhEbT2Njebm2dnT1x4sKFt26lpCDk7Q01Mm5cp719GyEPD4zz8+fNe/PNixcx1moxZhhz+9ftBTgce3tLy9ZWodDT08enqEirRUguh89YrE6r1SLU3o6QWDx27HPP3bjBYrHZLJZO1+933JDCwnnzVq8+eZJ0xvR0hKZNwzg5GSF3d4xJjXRt+2IxxpWVYWFRUX/964A5npc3e/aKFT/+aNg5k5IQsrPDOC9v/PjXX09Nzcpyc3vhhbKy5GSEXFygSY0fD6MWj4dxRcWmTZGRW7b0m+P5+dOnr1jx00+Gw+HNmwhZWmKcmTliRFBQdjb5vlrd1NTSYm2dmsrnDx0qlycnI+TsrC9EIMC4ouKDDyIitm41ucNqtUTS3GxlVVQ0f/66dZ0TWUYGQjNmQJPo6rhOp1RqtWy2YTkKRUFBVdXQoampPN7QoR0dt26BkPR0hCZPxpjMyDCRbdxoMgE6nUqlVnO5UmlSUmbmtGl374rFY8c2NcXFwQXv3RsxIigoKwtjpVKr7X5UUSgKCiorfXxSU0Wi4cOl0vh4KCcz08srMPD+fbk8O7u4+NlnTV4ThI6OrKzS0qFDc3JCQpYuPX1ap+vo0Ggev+PdIZPduVNY6O+flRUUFBLyyy9arVSqUAiFZnPcEI2mrq611cbG2HJUqrKyhgZX135znEKhUCgUCoVCoVAoFAqFQvlP4FGIyd//wIGYGPL0eOFCsOSRooWF/jHG3RT7R7kkwNHeDpY8W7106d69DRteesn4p9UGQbdZs8BOmAD26FGwajVYS8veFd/RAZbExtatA6tUgjW5gFdfBXv4MFhnZ7hTpEZ6D9TsiRNwFBsL9u23jXWc8FiUEi5IwqFlZWBLSkAIqaGeOn7uHBzNnAl2yBAoRyo1lYDHnvfDBUiV+/qCfeYZcOjs2Z45/s03cBQQAHbUKFM7TmB19wVwyNMTjlJSwCYlgW1tBUtqjM8HGxwMdsYMcDw319SOE7qNuIAD5eVwtGwZ2CVLwFpbgyU1RvrQypXmdrzHAvQhTaCoCOzy5eDoqlVwnJEBtqnJ3I73UQAJEQkEYG1t9T8nf++/UJKRqQBsNvSR3sfQBkiASPTHaX+cV1sLTUirhWNWt4PCAAuorQU7aBDYpUv1P5fJwJo+rcZoAfqjyvvvgz18GJpQXh4cjxkD1vTjvdEC9IUcOwZHZDglwyyEtREqLu4vARQKhUKhUCgUCoVCoVAoFMp/JL1+GAuLe0isbM8esCScum/fhAkIpaWdP9/vAsCxyEg4mjsX7MOHYA2XEE6ZAtbKSv/vJBx786b+eVwuWEdHsHFxINT4xUAGT5G9vMA6O4NtbgZrbw+WPJVOTARLHrMTS+LC48aBbWsD29gI1sFB/zrGYyCAhIpIXJgE927fBktCSCtXgv31V/07v3gx2DVrwA4dCjYwEOzp02DPnDGTAJJSQCLq48eDhdVlCB05Apa0fdKESFxg506wOTlgSVDwtdfAkiaZkAC2vt5YAQaP10kA4949/b8/KcWARGQMAxrk76TJEFJTwVZWGuv4YwKgU5FQEYn/EkjwjrRxQwyTP8ioRM4j1NTAdQzLN4EAfVpa9I9JDSgUYEmb77ogtyvkcxL4Jpg+cvMEASTiQiBtndQQEWIogNQE+Zz0KYLp48dPEFBSon9MhlUS/yXDIhk+iQDSxFQqsGKxfjkkQG52AWT8N1yRTZYmks8N5wHSREjc2MlJ/3zTdd5uBJBF54Zt1s4OLJmgyJ0nAkjNkBwKMgOTpkfOM7sAMkoYdmYyqvzZqvquDhKhBJJy9qRRzIQCYJgjna2qSv9TMk+QpkCakkSi/33iMIFMWGQiMx3dRNQNL0gi825uYEeNAks6rYsL2Dfe0D+PjP9kxu43Afn5YOfNAxsSApYMk6SzkiZE/u7tDZb8GjWc2SkUCoVCoVAoFAqFQqFQKBTjMNuiHViaMmQIHJFNgqOjYQVIRcVTKwAcJ2swydJFEuEhi0sDAvRXCPYdk20pC46TQAiJIxgG/0iN/PILfN/DY8AF6C8WTU8Hu3YtWPIQ2HBNJXko/MMPxl6/z+u9wHGSOhATA5Y8nSZbnhcWgiXLch88AEtibl9/bayAXvcBcHzwYDgiKQfdpQ6Q9cW//AKWy4U+QCL3/SAAHCc5EyRyTxa+9RQfH3DcMIjYd7ptQvqdjaQIkM7YHSQ2tmSJqR3vVgA4TqKMpI331HHCokXg+MWLpnb8iQL0R5UbN/rm+MKF5nacYLAxBgkVVVeDJaNKT1m8GBwnuxmYH7b+cEi21ScB7qlT//3ppI2TO06aWv/xx0Tm7g72wgWwZCOLjz7689NITgS545cu9bfjBI6+Q6TTkt8wpEZIqtknn4B95ZWBuuOG/FEDZC8VAo8HliRnkJ8IU6eC46SmBp4/aoC0ebKnyq1bYElKQWEhOE5+GlAoFAqFQqFQKBQKhUKhUCgDi8nCrKdOFRffuTN+/LJlMTEREdevIyQUkuAqPPPu6JBKEbp6ddmy7dtDQubOdXPz9SUBk75jsk0dWSwWi8Xi8xFiGDbbygpsVwFwzGIhxGIZLpB7CgQAGg1CGMOjYmIJXY/JmhvjMfu7U80NFTDQUAEEnc6w0/6HCfDyEovt7auru442+oJ0Oq0WITc3CwtbW7Kk0Xg4P/10//6dO7D4n8Uiq097/mJkPp/N5nC02t9+q6rKzx89GiGBgIzyMP6zWGB5PKEQoZMni4tTUwMCLl4sLc3MFAg6OrRatbrn2z5DTTMMl8swDKNUshCKilqyBOPOiae3TYE4yGZDdpBAALkoGOvfBhYLFu12dMCaV6iR3l+PnMflCgQdHRyY8lUqEMDj9b5A8m0ixNDxzu/B36EmOq/T272qQQCbzeUKhUolB4oATX3b9rr3Z5Gm1Sm99+fDOVotB35kCYXGNyFyvlBImhD5BrnT0IRUKlhtbFwT0mi0Wo1m0CDWtWuVlbm5s2aBI2TRf8/fJ8/lMgybrVbn5zc319b6+a1Zc/36t98ePtzZJ4jjSqVcjlBExKxZK1Zs3jxpkqOjl9edO2q1TqfVksGjezDGGGMOh81msRhGJuPMmePuboqftZmZjY3l5QUFCKlUCsXhw11HI7jDarVKhVBIiKenv39MzMiRtrYuLsbHnU02D+TmNjXV1np6du2c+m2bYRgGoaoqmay5meRmGI/JBEBT+jPHzQv9LTTQUAEDjcn+Tww/srjczgmKWDJrwjHGCGFM8pGeIgHw61Au5/G4XIGgoYFhuFyBoPPXjk6n0ajVLBZMQP33hggKhUKhUCgUCoVCoVAoFAoFIYTQhx8mJHz//dq1CO3b9/LLLS0IRUQsXNjSsm3b7ds//fThh/3tT6+fzEFekK0t/Ivsbkw+M9ws2Pz04eEuxhgrlX+eF0S2rH2qBTxd9FrAk5I6GKZ/Q0uEXvcBFxdLSxuburquj9ExRsjBgc+3sGho6HcBH32UkHD8eGgoxHOFQmjThlkOGNvYCARCYXt7XFx1dUHBCy8gJBTC1vBQH2fPlpZmZISE7NiRknLmDIvV2qpSKRQWFlBeZ91AnJdhWCyGYRiZLCpq5szly8mbJXoPC6F9+xYuxBghFotE6v8810Gng78LBJBOKRLpj0FyOWx4rlBAJB7Cqo9DymcYCG+HhZ092/fGx3k8v+dJof/HR50/vyxxsOt9//flGANn27bp05cv37wZxnUSWyepBp0vRrCzEwgsLEgTCgq6eLGkJC1twQIiPDjY03PMmCtX5s718Bg16sqVtjalsqNDJAInSV3AkU7H4bBYLBab3d6+fTtCP/9svJAeExWVlnbx4vLlCO3Z8+KLGCO0e/eCBRgfOZKRERv77rv96ArUQG9PKC9va5NInJ07kzmgKdTXKxRSKdmfov/o9TzA4zFM/72F3gwCIEw60G530ut7CeO4QNB1tOkcVQzfO/MUCmCzGYbNbmyEcby1lQhgGIZhsfp/JqZQKBQKhUKhUCgUCoVCofxv0uPAQmNjW1tbm5NTfX1ra3Pzyy9LJFKpVDp9Oiy/cnXV6XQ6na69ncfj8bjcjAw7O0tLK6vz5729nZ1dXDIzzSWg2ydzKSlFRfn5lpbNzTKZVLpwYUtLe3t7+xtvqFQajUYzdqxWi5BOZ2mJMUTN1GqdTqcjb0cXiUpL6+vr6trbvbycnJyd79/vtxqorJRIHj4cOTI7u7y8rOz0aY1Gq9VqfX0h0I0Ql8tmczgPH8Kz0oICCIU4OkIUc/hwEIgQj8fhcDgajY+Pi4uLyzvvDBvm6urmduyYqQQ89nS6rq6lpalpzJi8vMrKioq4OHDI11ck4vEEghs3LCz4fIFgzhxwzNNz3rxx4yZMmDmTx+NyudyRIwUCHo/HGz5cLBaJRKIjR0AuhwM34rvvSkrq6mprN240Ww1cuZKenpaWmalUajQajb+/lZVQKBB8+WVg4OjR/v7vv9/bC1y/np19797LL0ON/PxzR4darVKxWFOnDh8+cuS0aY6O1tY2NsnJfa4BuVyhUCjc3cvLGxrq69evl8tVKqXS318k4vN5vOvX++o4Ac4/fx5q7IMPSHShpKS2trZ23z5ja4ApL29sbGgIDq6qamqSSF56ic2G8CjYnTuNvYC+kEOHBAIul8stK2tr6+iQy6dOLStraKir6+17DLoIaG6WyWSyoCCFQq1Wq6dO5XI5HA6npgbu0+3bphLw6IIMwzDMtWtk1WtDQ0tLS8vEiX0uD9anOzoyDEKdK7rJjt+mzz6BUaywkAReVSqtVqcj7+TogwCtVqfT6eRyksQBw6GDA3xsrnCevb3+XghqdZ8FQGdNT+dwGIZh8vNBkK8vCOnt+we6B2bsqVPBImRjIxKJRH2f4BgvLwcHJ6cLF5ydbW1tbGJjVSqtVqMhaTVhYaZyPD4+MzM9fc4cjQZjjGfOtLQUi8XikhJfXw+PIUN+/bXPAmxtraysrNLS7O3FYmvrL7+EO9/erlSq1Wp1aOj16zk5WVmQUtA3x+/dy8iwsdHptFqtNjqax3N0dHREaNiwIUO8vDZvNvbGPJqJ7eysrMTi+/dHjHBzc3ffvFmhUKlUKoRUKrVarT53Diakdevi47OyMjO73wsF7viMGRhrtVptQoKFxZgxY8b4+ra0XLp0+TJCpaV790ZEGN/Hnvhb6MGDurra2vXrc3MrKysqoqNJ0gaPx2az2ZWVMBxevgyjSlkZhFutraHpzZ4N6SKTJgkEDg4ODghJJBcvXryIUEXFRx9t2oSQTCaXy+UIBQVFRkZGrls3bVpYWFhY7/OGuv05XVvb1NTUNHFicXFtbU3NoUMKhVqtUk2eDD/iyLDY+X2MoXNaWg4aZGf34IG7u6urq2tYWE7O6tXvvhsQcPfusWPHjq1fb23t7e3tjZBUWl1dXY3QvHmHDh06tGHDhAmrV69e/cUXJhNgSFWVRNLY6OtbXS2RSCQTJqjVsEUI5GApldbWIpFIVFDg6enu7uGRlGRpyWKxWJ27msXFbdmyZcvBgykpUVFRUaGhYrG7u7s7Qm1tICQ4ODIyMnLTpokT165duzYyss9ty9xcv/7ZZ599duDAzp1CoVCIcVSUm5ubG8bkOCkpIiIiYseOgfazWxISwsPDw6Ojw8N5PB4P46iowYMHD8Z4506RSCTCODFx9+7du033m8xsgKO7du3cKRAIBBgfPOjj4+PTKeTKlbCwsLC9ewfaz25JSTl06NCh8PDwcD6fz8d49247Ozs7jD/5hM1mszHOyzt79uzZ0FC5vKGhoWHIkKcuc/e550JDQ0P/7/+Cg/fv379/yxadDuYjS0sLCwsLhLhcoVAolEoRYrPZbKVyoP19IgpFa2trq739jz+GhISEnDhx8uTixYsXHz/e0dHc3NxsazvQ/lEoFAqFQqFQKBQKhUKhUChG0U2ERiBob1cqFYp9+ySStjapdP58iGa2tdnbW1uLxTt3jhzp5ubhcfbsUyMgL6+qqqIiKKisrKGhvv7YMUg5GDwY4jFlZbDlu7W1VouxTicUWltbWFhYXL7s7m5nZ2+/dKmHh4ODo2PP319gLI8e7hYV1dRUVQUGlpc3NDQ0XLum1ep0GJeWwtLDCRMglDRsGJvNZjPM4MEcDofD4Xz4YX19S0tz8yuv1NQ0NUkksbH9XgUymULR0WFvD2k29fUxMXfupKQkJvb0/Bs3cnKysvz8zp9PTU1OxhjygvovIMEUF9fV1dZu3QrRRUdHCws+n8/v+crsgAA/v2efzcnhcjkcLvf0aYlEKm1tXbPm/v3a2urqnu9q32cBLS3t7TLZsmWwGrW8fPZsf/+xY/PyelsQZLlcuaLVarUYI1Rd3dTU3Gz+Fd4MQgixWCT3zdLyt9+yszMze79NAkTibW2hHB5PKOTxeDzymngzCvDxcXZ2cgoP1+lg7wKVSqPRalev7m1BGHO5XO6qVba2Hh7u7ikpkyYNHTpsWHOzuQU84s6d4uKCgpiY06eTkxMTMYbOOWpUd+fFxxcW5udv356QUF9fW4txeXlZWWlp3zOwesujplJd3dTU2CgQlJXV1zc0nD/f1NTeLpUGB8OmL6dPw7B57RpE4p2ctFoej8t99VWRaNAgOztf39zc5ctXrECIzy8vLy8/dWrSpC1btmxZvtzff+XKlSt7/kqM3vJoHhg8eNAge3uFYtq0kSNHjXrhBVdXW1s7ux07RCI+n8+fOBEmtM8/hy3KQ0OHDHnmGR+fqioXl4cPJZIXX9Tp0tLS0lJSiopKSkpKli0rKrp69erVc+dyck6dOnWq/9faP0ZiYl5ebq6bW2pqQUF+/uM7OV27tm5daKit7YkTISEhIUlJkEiD8fHjwcHBwcnJKSkHDx482PfUsn7jzp2vvvrqKzu7b78NCAgIyMjYtIkImT179uz4+Nu3o6Ojo21sBtrPbklOjoyMjLS0PH48KCgoKC5u/XoQcvTojBkzZmRkyGR1dXV1gwcbex2z7dExdWpYWFhYe3tVVWpqaurChTKZVCqVPniAsUaj0bi58flisVjc92Q/swsguLlNnjx5skx26dKqVatW/eMfarVGo9HodAzD5/P5Eom5r0+hUCgUCoVCoVAoFAqFQqH8b3PsWHFxauqLLx49mp+fmLho0UD702Nyc1ta6urc3RHas2fBAowR2rkzOBjjTz+9e/fCBeO3ZzDbKiaZTKNRqRgmIOD06e3bb95EiMuFMIdGo1Ih9N13hYXJyatWPbUCnn/+3Lndu2NjHz5sbKyoGDKEOO7q6uHh51dRkZPzl7989tnkyU+dgDfeiI//+9+/+CI1tbDw1q05cxDi80UihBiGz7ew0Gji4195ZevW558Xi/l8oRD2yX8q2LUrMzM29r33EAoPDwrCGKEvvnjtNYwR2rVrwQKMY2OrqwsKnn/ebA6MHn3y5JYtiYlTppw6tW1bz9e4x8RUVOTkzJpFNpFH6MABcBw6a3R0Ts5vv61dazbH58y5dGn//h9+QGjr1mnTOi88evQPP3z88Y0bdXUKhUz2eJQxL6+lpa7OzQ2h6OhXX1WpEIqOXroUY4R27JgzB+OVKxMSjh//6iuzOf4HzPTpzs5Dh2ZmImRt7eSEEEIikViMUHZ2dXVBwaxZfn7ffbd+fV7egwetrQ0NnUsAAwLOnAkPv3ULIY1GqeRyEZLL29oQmjnTzy8wMD7+229nzVqxYs0acwt4FOi+cqWqKi8vIGDRonPndu+OiZHLOzqkUisr8ioKe3t7e0/PsjIPDyurQYNKS9PTy8uzsgIDEVKrlUqEXF3t7T08KisfPHjrrQMHvLwEAjabwyFv6e4HAYQHD6RSicTNbc6cM2d27IiLKympqSksHD4cISsre3uEEMIY3IL9JxBiGDZbpyspefvtI0e8vJ55xsrKzq6iwtyOEx4bRr29razs7KqqcnLefHP//tGj584dOXLmzMuXEWptra8HAbDDgVqtUCD0669Llnz66dy5/e14r3nrrbi4o0ePHkXo44/HjcN4796srGvXNmwYaL96TVxcZWVu7owZA+3Hfw3/D73/bnBl1mLvAAAAAElFTkSuQmCC); + background-repeat: no-repeat; + background-color: transparent; +} + +@media only screen and (-webkit-min-device-pixel-ratio: 2), +only screen and (min-device-pixel-ratio: 2) { + .jsgrid .jsgrid-button { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAALAEAYAAACFny30AAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAA6CUlEQVR42u2dZ2AUZRPH53rLpVdSKSGhgwoIqIgKiBRFBGwooQjoC9KbSEdFqoIiNhDBQhdEQBABIShNCCUhpEF6T+5yuX77fhgejhwc6dkE5/dl2LvN7uz8n/4cOwAEQVSCmJjOnZ97bunSK1eeeWbo0G7d+Pbn2rWBA8eMmTnz8uWuXQcPfughvv2pLMKKnpiY+Oqrs2Z16lRampwcGzt6tNlcWFhQMGwYX45nZCxe/O23kZEazb///vPPuHEWS3FxQcGrr/LlT62RlBQV9d574eGnT/v6tm6dkREdDRAUxHHR0WJxSAjHXb3ar9+wYcuX15U/WVkrV27e7Od35kzjxg8/fP36iRMA3t4cd+qUUNikCcfFxHTs+Pzzc+fyHbdqk5T02muzZnXu/M8/Xl6RkXl5p04BNGnCcefOAXTrxnFnzgC0a8dxJ08KBL6+HBcb26/fsGEffVRb/mRmLlu2aVNk5JkzjRq1b5+WdvIkQKNGHHf+vN2f9u05LjpaIAgO5rhLlzp1euGFOXP4jmN5CBw/SEgYMWLq1CefzM/fseOXX7Zv57jiYgAvL4kEwMsLgOMATCYAgQBAIgGw2QAMBgCTSSjMygLw9OzXr3fvFStatNizZ9OmqVOr62BW1sqVW7YEBNy8+ckny5YdP26x3LiRnd2smUwGEBZW1h+RyH5sNgsEGg2AQhEZ2bTpqlVisYuLu/tPP7VufebMtm2nT/MdeMZdfYBQqFZLpX376nTFxdeve3mJxQCurvgdx9nP4zgAiwVAKASQyQCkUpvN3x+goGDv3gMHpkyJje3b9/XXP/64qo5hiW/VKjV1+fJly86fN5tv3MjJadZMLi8b+Hv5o1IBWK0cp9EAGI0aTVrapElicWCgi8srr/Ad8HIF8PcfPjwqatas0NBRo2bM+PjjkhKACxewpBuNWNLE4rIPbrXig8vlAFIpx6EQ+/cfPjxtWmzsc8+9/vqqVRV1iJX41NS1a1eu3LPHbM7IyM7295fLAUJD0Y87A3/7QW7d32AASEkBkMmCgwMCCgsbNRo1auzYHj1cXTt16tp15ky+A+6IoLwTbt6cNu3DDxcsSE5etmzevLlzFQqA5s2xuqtUKIDZfOtiAntTwAQzmQSCzEwAT88+fXr1WrGiRYvfftu8+e6mCQPPSvzhwyZTRkZOjr+/QlF+4KVSDPzNmwAiUXCwWp2bGxIyefL06U8+GRAwadKIEVev8h1oZ5Q7DA0JWbZs1qx580JDp02bM2fx4tJSgLg4DIheb+8LGM5rxIEDhw9PmRIb27//G2+sWMHOz8xcuvTrr93dU1PXrFm5cu/eypR4mcweeLE4MFCtLiwMDn777cmTn3++vgeeUW4NcOTmzVmzli9fsCAp6cMPZ86cO1epBIiMvH+NEApRFKMRwGoVCktKANTqDh06dPjsM7M5MzM3t1s3vT4jIympfXu5HCA4uGIlPiUFS7yra05OcPC7706b1qNHo0ZTp44aVf8DX2UBGCkpU6cuWLBoUUrK8uWLFs2Zo1IBtGyJAVIo7J3i7Rvd0TSZzSiIRmOvQRIJgLu7/fvyAi+RhIZ6excUBAWNHz95ct++AQFTp0ZF/f033wGtMwEYWCPmzMEasWhReTWizM1vHd85unKEBV6vB0hKApBIGjf28cnODgubO3fBgu7dfX2jogYNunaN70BWlQovRTgjJOTDD6dOXbw4LGzmzPnz583T6wHi48v2EXeOmu6kIoE3GABu3ACQSkND/fwKCsLCZs6cN+/55xt64BnVrgGOpKUtWrR27ciRaWmLF69atXatSGQ0qlRyuUCAAQW4f+AZVitASQmARBIR4eV17lxQ0JQp7777yiu+vm+9NXTo9et8B66mqHYNcEShCAlp1mzrVrHY3d3VtbCQ1YTKIBBgDSotBVCpGjdu3/7IkQct8IwaEyAjY8mSb75p2zY5efbs9967csViyc4uKQkIEIsBPD3xnIqUfHaeWAzg7Q1QWPjXX4cOvftufPzAgW+/PXEi3wGraaotQE7OmjU//RQUlJb25Zdr1uzZYzKlp6enBwdLJBh4Ni+4F4L7NICsDxAIdDqxWCrNzd29e9euVavi44cMGT9+yhS+A1dTVLkPSE+fO/fzz9u1y8zcuHHDhoMHjcabN9PT/fzKm7my4ajVCqDV4rFcXrazttnufb5Oh4tseXkAvr6DBg0ZMmVKePj27WvWrFzJdyCrSqUFSEoaPXru3NDQ3Ny9e3fuPH7cZsvKKi4OCZFKAYKC7l4kuzOQYjHODQoLAQQCmQznBUaj0Yjfubvbz3OsOWy+wIQzmwWCggIAH5/Bg196aebM5s23bl2zZulSvgNaWUQVD/ybb86e3aFDbu7u3Tt2HDtms+Xm6nSNGkmlAI0alR3v38mdw8mkJACpNDw8ICA9PSho8uQJE558Uiz28XF1LS4uLLx8+dChbt3EYgAPD/w7xxphs9mXIJhQWu3Vq2fOPPPMrFlDhowcWVKyZs2VK//8c+oU34GtKOXWgKSkkSPfey80NC9vz56dO0+csFpzc43GoCCZDMDXt2Iz1+RkALE4JMTbOz8/LGzevLlz+/Tx9R05csiQM2fY+deuvfrqmDE//piV9cMP33338ssqFUCrVvalDI67u2m6s0ZYLCJRYSGAt/dLLw0aNHNm8+Y//9wQaoRTARITX3tt1qyHHsrLO3Bg1679+zkuP99k8vWVSDDw5ZX4O2eu3t6ZmWFhc+YsXNi9u6/vyJGDBjkfTl6/PmzYhAkbNmRkfP/9+vXDhyuV9iUOiaTsEsedq69WKw5bLRahsKgIwM2ta9cuXaZPb9XqxIlt25Yt4zvQFRYgIWHEiGnTHnssL2/Hjt27t20DKC4G8Pe/c0esciV+1iws8ePG3VniyyMubsiQUaN+/DE7e+vWzZsrViPEYvsM3GJBzxWKVq0iIpYulUhUKnf3rVtbtTp9euvW8+f5DvztuN0dSFdXieTFF3FHzN9fLAZwc8Pv2APfOZ53LPFicePGXl4ZGWFh8+cvXPjoo5UNPCMycuvWr79+5ZVGjYYNGzPm2291OoDLl9EHi8Ve8pk/rGCIRABqtb1GGI2FhampM2YIhQEBSuWbb/Id8HIF8Pd/883hw2fMCAsbOXLGjM8+0+kALl60t/WspDmWeIkkJMTHJy8vLGz69HnzBgzw9R0x4sUXExKq62B4+P000/LJyJF+fkOGDBu2ZUtpKUBsrH2UdKc/bH/gxg0AmSww0N9fqw0IGD581KhevVxdH3740UdnzeI74JUmKWncuPffX7Hi6FEAiYTjzp4F6NiR46Kj8VcJp083btyqVVpaTs633+7c2aRJbfuDfcTXXx87BiCT4a80OnfmuFOnAEJCOO6ff4KDIyIKCjIyPvxw/foOHfiOX42RmDhy5LRpq1cfPgwAwHGnTwcFtWqVn5+dvW7dtm0PP1zX/ly7NnTo2LGbN//xB/rzzz8BAS1aaDTp6QsXrl37+ON8x6vWSEqaMGH27A8+SEv76KPPPuvShW9/rl2Linr77c8/T0mZPHnBgl69+PaHIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIIga4q5XF7drt3r1nj2PPYZHLAVh8+ZohcKytqI5MerscW49z53vWwfAtEIAAJMmXbw4ceKAASdO8O0pw0l+o9270Xp5oWVv8s/ORssCX5m0PLUJCzzLXMCO/fzQPvJI2efy9ubXXztOBGAl5Pnnyz7YBx+gPXQIbVAQ2jtfo80HrEampaHt2RMte2u6QlH2ueoPTgRgqcp37Cj7QC+8gPbIEazKR47w/QAMbDpbtCjrJws8KzD8pWB3htP8AfhArApv24aWvRI4MRFt794oBDuue9DPpk3x6OBBtOz4r7/QDh6MfrImtP7gNItSWYfHjEHL3rvPHnDnTgyAj09dO172vjt3lvWL+TlmTH0NPKPcNFb4ALGxeDR+PFqWAaNtW7Rbt2JAZLLadrjsfbZuLesH82v8+LJ+118qnEcMHyg6Go8mTUKbk4P2ySfRbtmCAWJtb81R9rpbtpS9L/ODDTOZn/WfSidywwfctw+PWGZsgwHtoEFoV6/GgMnl1XWw7HVWry57H3bfqVPL+tVwqHImPXzg77/HI1Yj2HzgrbfQvvdezbjJrsOuy+7DSjzzo+FRY9lUsaTOno1HS5agNRrRLl+O9uxZtGwC5ww272ATKFbTWNv/3nsYeDYvabjUeDpbFIItYTgm3ywpQVteH8Hyr7q4lP189WoMPKtxDR9x9S9xL2bMQMsCOGoUWhb4lBS0jjNoNqMNCyv7+ddfl73ug0ON5xPGEsqakD17yn7LlgL69EHLUqAwyz53XDLYs6fsdR8caqkGMBwT1rLOs6AAA5qfz77BpsvxPGfXeXCo8RpQFsfAsdRrzrLMs89Fovtf58GhlgUgyoME4BkSgGdIAJ4hAXimjgW4V0Lc/za1LIDjcJNNpEpL+X7w+kItC8ACzkp8y5ZonSUBZcnK/zs1pJZnwmz1k22QdOuGdv16nPn++ise79qFNiYGrVbLd2DqilqrAbjUkJmJR++8gxaz/wI0boyWbXH+9BPazZvRtm7t4OYDO1io9QdDIS5exKNXXkH78stoWcn39UX77LNoQ0PLXqX295r5grc1FmyC2HI1C/hrr6FlAl27hvbtt1HI5GS+/CUIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiB4otbfmHX2LMDDDz/1FB69+ipa9lZEsxkteycce2v67t2PPAJw7lzDS8pTWWr5rYkMlo21a1e0LPuRowAst0xCAtoHX4C7agCW2IcewqPISLQsjRQLWHk4ZrpYtAhteHjF/j43F+20aWWvJ65ggWE1ib2p9/JlrFEsw179wckD/fAD2ogIftxiKQo3bqyZ67GX/7ECVX9w8trKms+Exy/193mc1ICxY9G2aYO2qAgta7udpRRhiZJZJ5uXV/Z81iSwgLCSzs7T6dA6vqiVJZZmTQs7n13PWaoU9j5S9kbe+ofTURD2BSwQrBN1bFvZg3MctrGxsfh3rM9g2U0dA1NcjOffuIHnBwTg5yx9ruM7pFNS8HydDs9n/rBOm2X8Zv4wGx+Pf1fRvqvuKadTe/RRtCy/ESuJLNEaCyjHYWD69y8bOJZImWXUY2/AZZ/36oV2xQq07M26LGASCdpXX8Xrs9HR0aNoWU1iNdNxODtgANr9+/kOtDPKEcAxhzzDWZvKmiCWqI3h+Ophx2PHrEks8AyNBi0rAEplxfypv3mEGeW8O/rmTbSFhRW7nKsrWtZGs8A5UtG0VGz4yXLFq9UV+7usrLJ/V39xKkDZtpO9Bb08WAllTQJrqqoKa7pYDkp394r9HZtHsL+vv1Tw7ekVFcDTEy3LkFHdPADsOqwGenhUzt/6n/qwhgVgAaopAdiwlAng5lY5f1lNrL9UUADWppaHqys2XazpqX4NwOuxQQDrY8r3t+zf1V9qXICyx8464YrimOynogKwHPP1nwoKUNHhnGMnWVxcPfdY58twHH5W11/+qWQf4JiA2RE2A2ZUtwY4NmEV7QNSU2smPLVPJQWw5/+9N44ToorOH5zh2AQ5pjh3hA07q3vfuqOCArDhXHlV27EGVHce4FiDymuC2ATQsemqv1RQAFayyhNAKsU1GzbTrW4gHPuQ8gRgE7AHVoDyRkNsjYetCVW3DygsREHZ/EKluv/5rIBU9751R7kC4Hiadb4ZGfc/mwnAliSqLwBaNroqT4CcHPS3/i9BMCqZyK38JghtTQnANoLY6KeifUDDoZICsDbWGWxZmTUZ1Z0JMwHYKqjjMrUjFZ0w1h8qKUBFl3dZk8E60cqOhtgqbEEB2oouQ9f/5WdHKikAq+LlbfGxGsBKcGXzB7M2nNW4igrABGs4VFIANrwrr61lNaCiAjhu0DCBWSdcngCsrylvolj/qKIA5fUFHh44GmGBdwyMY8Adx+0lJfj3rAkrbyOGCd1wZsCMSgrAOtXyBPD3L3vs2Aew0RLDsXN1bOLYqMoZLPANrwmq9I9zcWLEfjnHfsXgCAtEfDzatm3RsmEkK/FXrqBlv1hjw03WB7Df84SEoGU/W3Hk6FGsMT168BnMqlDFH+eWVwPY1iT7WYsjbFGtc+d7f88mdB07Vswf1gQ1PKooAMuQzYRgM+TylqtrCvb7H/bLt1On6ua+BEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQDZB27Vav3rNn3jy0o0fz7U9lqfWEzrUFBnzDBjwaPrzstyNGXLw4ceKAAez7+kuDEwADz9Lcvvnm/c+u/0LUewEw4Oxti3v3omUp0itK/RWiku8NrXswcOwFsMHBVbvKt9+ikFFRfD+PI/VWAAzY0qVoIyNRCJbG9vDhql21/glR75qge3eu7M24ISEoREkJnsfS4j7zTNXu9vbbeL116/h63npTA+4/qmFvY79+Hc9zccHA9eyJn1e1RnTpwvdz8y7A/QPvCHsndXWFOHAA7aRJfD8/b01Q5QLvDJYxIzy8Yk3TgQN4Xp8+fD23I3UuQM0E3hFnQly9ip9bLPg5e4l4/aHOBKidwDvCkgyxJom9nZ0NZ+vq3dYVp9YFqJvAO/LjjxjwV1+tm/tVnVrrhPkJ/MGDaN96q27uV31qvAbwFXgs8c8+Wzf3qzlqTAAKfNWodhPET+DZcLLhBp5R5RrAb+Drzzi+ulRagMqtx9cUD17gGRUWgAJfOzgVAAPO8nt99RVaCnxNU04nPH8+Wgp8bXG7BmCJZwmTLRa0CgXaEyfQtmpVO2789wLPcKgBLOCXLqH19cXAtG5d9vOa4r8beIaDAGzzOzwc7bVrWDOYEGw1sbpCUOAZDgK0aXPv01JSakYICrwjDgK0bHnv01jTVFUhKPDOcBCgvE62PCHi4sqe//vvFPj7I8BAsgTLf/+NtlOnyl2GddLJyWgXLsTAT53K9wPWd27VgNBQtM76gPJge7BWKwW+ctxKZ9u9O1rWxLCEygkJaK9fR3v5clnLPmdpbcXisn9PlMetgLHN67Fj0f7zD9rERCzRLJU5QRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRDEf496l0mP0anTtm0LF3755enTqamXLr38skCgULi6lp+Eh+MAAAQCgOLi7GyBYNmyPn3Gj58xY9q0du169+YvY54zxHw74AyRSCgUCn19AUQiiUSt5jiRSFwpb4VCiQRAJAIQCt3d+X4eZ9RbATiO4zhOpwPgOCz3HIelu+JXsNmwRnCcwcD38ziD91SG/3VIAJ4hAXiGBOAZEoBnSACeIQF4hgTgGRKAZ0gAniEBeIYE4BkSgGfqrQAWi81mtQIACASCertrUX3qrQBubjKZUslxAFYrS6xYOXA5WqkUi6XS8jdy+KLeChAcrFJ5eOj1AFar2VyVK+AGTm6uwVBSUn9TsAgefXTbtgULvvwSQCgUidzdceOjao9cfTgOS6zFEh+v1ebmPvFEWppWm5/fuDHujFXmWlhzwsJcXb29z55t1kyt9va+eLGkxGw2GlmyorrHYrFYTCaZLCDAxcXTMy5OALBixeDBHAcgFuOWX2V3nmoamw0bDJkMM1tKpRgu1idUFIFAKAQAMJlKS9HivphQKOS13qMfKpWbm79/ZqZYIFAqXV2Li3HP1c2NfwFwSx2AbbBXNvAMtpUpkcjlaFm55/f5xGKZDMDLS6FwdU1Pr5d9QG0FiO+CdS9/6qUA/yVIAJ4hAXhGaP8lGVGXsLiLAYqKsrNdXe3DUJuN784K769S4e/ZZDKVCv2q3GhIKMTn0emKigAAjMaSEvyG3+JmNhsMAKmpAAJBcLBgxYoLFw4eHDcOQCgUCHAiBlD3vyQTCgUCgYDjpFKhUCw2mb79Njb2r79Gjjx3LiMjLu6hhwDkcheXylzRYNBqAZ5/PiLiscd++aVXr6Cgli1//91gsFrNZpmsrp+PgWtccrm7u1Qql6ekiKdMad++Pv5o9Z13jh797rs2bc6dS0w8c6YqApSWajQAgwc3afLQQ9u2vf568+ZdumzZwvdzOVJvO+ErVwoLMzNdXQFksqotHGATlJ2t12u1vr58P49TL/l2wBklJdhW4hoV397UHvVWALGYBZ7/pZHapN4K8F+BBOAZEoBnSACeIQF4hgTgGRKAZ0gAniEBeIYE4BkSgGdIAJ4hAXim3r4rQq+3WEwmT0/7L9rwB00VB//ObLbZrFa1mu/ncUa9FSAkxMXFw+Ps2cxMd3d//+BguVwuV6v1+vL+ji1dl5QIBAKBQuHuLpMplQkJfD8PQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRANl1pPZ9O9+65dH30UEXHpUk5OYuLhwwUFJpPBoFIJBBKJXG4wsJQ6HFdSUlioVLZp4+0dGpqYOGlSly4vvfTMMyNGNG/epUthId+Bqi1q/Y1ZAoFAIBDI5ZgJIygIQCQSiQA4jiVoYDmN8FggABAIwsLw3w9y7oxbT13bN+A4juM4kwn/ZTDYM2I4swAcp9FwnD0d54NMHb01kZXyimbw+u8klqPXVvIMCcAzJADPkAA8QwLwTK0LgOP6yv+dzfZgJ3Bj1LoAZrPNZrEA2Gz21wrfTxAc/wMoFGKxVMp3eGqfWhfAzU0mUyrz8hQKgUAotNnseYEdZbDZbDYAFxexWCo1m195pWnTRx4pKOA7QLWNuHv33bs//LB5cwAAoVChwBmpyYRfV31ChPmBLRa1WiqVy5s0EQgEAuEtue/dtEgkUilAfr7FYjZLpaNHHz363XcdOsTE5ObeuKHTyeUSiVQqFjv764r5w3FGo8ViNstkHh4ymUKh0ezb17//lClJSbwJcOlSVlZS0rFjuEbj61tTAuBajsViMtlsVqtYXFwsEAgEMpk9Q7ZjG69QqNUA8fGlpcXFISHp6VevHjt28qRSKRZLpVhrOE5c5bUrXJPiOJvNbDaZZDKVSiZTqWJj8dtWrXgToKDAbDYYXFwAbDaRSCjEwMjl1b80xwHgG/9RRizhzksw+1woFAoBdDqz2WxWKHQ6kwlfWl/d5QmBAK9gNptMACaTUCiR1MRzVg8xLgtrtbg66eJSm+lj7Ytt9/8eqenwMAEAhEIApVIikck0Gp2udp61ooixZHFc7S+AVVbWmvbHcUGwfiz4iXEjxMfHnrm6pmoAW0wWibDlVird3Mp+X/Y+rJNmf6fT4TaMzYbn2Utw1WB/b7EYjQC5uRaLxeLtXfshvj/itm29vYOD4+Jw+8PTEwNjNjOnK3tBFlSZTCgUiYzGkhKbzWJRqeLi9HqNJjDQHui7/9JqBRAIOA7Aao2I8PBo1Cg9XaUSiSQSk8lsttlsNomkegJwHMdZLCaTVCoWy2QqVUrKv//yK4Bg48b4+OhoDw90UCLBEFZdADbh8vZWKNRqozE3V6fTaiMjZ878889vvjl+PDfXZNLrlUo26rFTUlJQANCmjZdXcHBi4gcfPPXUiBHduxcVGQw6nUZjtXJcdQRgG59mM8dxnFSqVAqFQqFe/+qr4eGPPqrR8CWAePjw5s27dq29Pdfnntu7d+XK7Gxs4gQCAKEQmyTHeTE2STIZbkRqtSaTXp+ZOWxYeHjnzg/uzlitz4SzsvR6jcbV1WJhUzEcZt4NfmsycZzNJhYbjVarxeLuzneAaps6WIqQSpXKso1ZRTr5+jFGqX1qXQCb7b+wtV51aD+AZ0gAniEBeIYE4BkSgGfq4LehbHkBlwLsazJ2y860f85xbObKd4Bqm1oXwGCw2cxmmcxiMZtNJrmcrccD4LKwXQCz2WgEsFoxj7DZXL2lh4ZCrQvg4SGVyuU6nYeHTKZSxcQIBEKhRCKVSiQSiUxmNLJyr9GYzWazUuniIpe7uKSmymQikUTC1qQIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiCI/yx1/oLgggKtVqsVCvV6k8lkCg52dVUqlUq1mr24DN+0a7PpdEaj0VhQEBDg4eHpmZXFd6Bqi1oTICenuLioyNs7K6uwsLBw4ECdzmg0GHr2LC01Go3Gtm0NBpPJZGraFF9eJhbfKQBmELDZbDaNBrMnXb8uk0mlYvGZM35+bm4eHr/80rSpv39AwIEDfAewutSYAHl5Gk1xsb9/YmJWVlbWlCnFxaWlJSWjR5tMFovV6uYmFAqFAgGASIRvSReJ8C3qjhnz7C/txrfJWa2YQYmdhwmiAcRioVAkunzZ29vV1dX1888ffrhp0/Dwdev4DmhlqbYAV66kpt64MXbszZt5ebm5H31ktVqtVqubm1QqFkskGCjMzVSzjmMNATAazWazGUChkMmk0jNnmjcPCAgM/N//QkJ8fHx9T5/mK7AVpcoCREfHxV29unFjfr5Wq9G8+SYLuEQiFmO6tfvlomFt+qVLaDMy0BqNaF1c0DZtirZ9e7SYFutemM0Wi8UCoNfjazFbtgwKCgmJioqICAwMCtq4ke9AO6PSAhw9euXKpUt792o0Op1O16+fUimXy2T4DlCWj+luNm9G+/33aI8de/rptm3bt2cBd84ff8TEXLjQqBEe9emDdvRotJ07336QW09isWDNuFOI4ODx48PDAwICA9eu5TvgjlRYgDNnEhLi47/7LiOjoKCg4I03XFzkcud5vv7+G+3kyRjoU6dq2nEUZvhwPFq9Gq2bG8vearFg38GEaN8+LKxJk0GDQkN9fHx9d+6suxDfn3IFSErKysrKGj48JubmzeTkDRtcXGQyuZylBnQ8++uvMeCshNY+KETjxnjERkXNmzP/TCZsmrCJ4rju3Vu3btMmMNDVVaFQKjMz68pPZzh9eTcOFz08rl/PysrIWL9eJsM2HpNiOp79zTd1HXgG3jc5GY86dUKbksL6IKmU9UkAAALB1aupqTdvbthQ1346w6kACQlZWRkZ8+cbDCaT0SiVymQSCUtyZe000zEAo0bx/SDoR3ExHvXujRYHrxwHoFLJZDIZQE5OUVFRUe/e2dlFRYWF3brx7fddAuh0BoNe7+aGE6hx43Ai5GxU8/rrfD+AIyhEfDweLVzIPnecX6Sm5ufn5c2axbe/dwmQlpafn58/ZIjBYDabTBKJRMJSEd7J9u34oFev8v0A92fxYrQFBazwKBRYk/PzNRqNpm9frVav1+vZKKvuuUsArVavLy197jmhEGesLMV4WerfcM4RLCCYuxtg06bbDyzEiSEmdgbAecyzz/Ll520BNJrSUp1OLMYS0a6dWCwSYXLPO8nLQ3viBF8OV439+519U1JiMOj19vlEXVOmBggEgYFms9VqtQYH33u0c/582ZLVULh8GS1LHWFfi9LrjUaTqVkzvjy7LQC6o1bj+NlZ6nD+x81Vg+XKzM6+81OBgC1/l00rWpfcFqBiWYTLXzqon7Aae7f/LNc8X57dUQMEAqGwvKSDbJGsoYHZ7AFcXR2/4bj7LxvWNrcFwB2q3Fxcf9fp2JpKWdiUv6EREIDW15d9UnZfITeXL89uC4AbG7m5CoVUKpMlJ7PFrLJ06IBrL2WTk9d/HnnE8RObDVdNlUq5XC7nbz5z1zzAw0OlcnH5+2+z2Wq1WBy/Zeuf/fvz5XDVGDz4rge/tUPn5qZUKpV//cWXZ3cJ4OXl6urqun07wP1y+k6ZwpfDFQVranAwHj3/PPvcYrFarVYArOlFRV5earVaffgwX37eJUBgoKenl9fBg2q1QiGXp6WZTLjlV5b27fEBX3mFL8crBpux46xGIGB9HYCfn7u7h8d338lkEolUajDw5aHT1dDGjX19/f3nzjUYcD393p3yN9+U3bHiH/TnjTfwaMAA9jkr+TKZVCqR4PP5+S1dyre/TgUIC/P19fPbsMHbW61Wq2NjS0uNRoPBcSNGoUB7/Dg+uLc3Xw+C9+/VC4+++459znFYgKxWpVKpBGjdul279u3fflulksvlcv4nluVmU23dOiQkNHToUJsNF+XYDlPZGsE2z//+GwPRpk1dPQDeLyoKjw4eZJ9zHJZ4qTQ4ODgYwGC4fPnyZQCN5ueft21jPwbgnwrvCd+8mZubk/P66+fOJSUlJHz/vUqFW5M4jnZcNWX/mjcP7dq1uIbElgSqDgY8MhKP5s9HO3So/c6sqQkKCgoCsFgKCvLzAWJjhwx55RUAgyEpKSnJYOjR49NPP/100KAOHaKioqJ++63eC8BISsrOzsr63/9iYm7cSE5es4ZtVdp3zO41r8zPR/vzz2jZ6mRMTNnvWXevVKL180PbpQvavn3RDhp0y/3b/uMPGgHk8tDQ0FAAkykrKysLICnpf/8bPx7AYIiLu3YNgOPUarUaoLQ0Nzc3F6B793nz5s176aVHH50wYcKEHTvqvQCMtLT8/Ly8QYNQiO+/N5stFqtVoWBbf2w19f6TfBZw9jshtlrJljyYAPdw/FZfxH6GYrFgAdDrY2IuXQIoKPj00zVrsMQnJwPIZNgUMdFMJq1WqwXQ6bKzs7MBnnxywYIFC158sXPn8ePHj9+1q64EqHJG7aAgLy9v7x07nniiRYvWrVu3Dgjw8PDw2LULN/MBSkqw02YzznvD8gWz8TrrS5wHno1mNJrS0tJSAI4TCoVCgyEyMjAwKGj2bKXyyJE//9yyJT09Ojo6GkAqDQnBq3Mc9mOsb3BxcXEBUKl8fX19AY4cmTNnzpydO8+f//rrr79+6aW6EqDGf5ybmVlYWFDQu3daWl5eXt5bbxUUlJRotX37Yuctk7G+gq3Hs87csaawpoz9BJHNXFUqqVQmy8ry8XFzc3P7+efQUB8fP7/Vq/FX1ikp7O9/+WX06NGj9+27fPmHH3744bnnvLwiIiIi7Dti7PoCAdsh02g0GgCDobi4uBigT59PPvnkkzFjWrceOnTo0C+/bDACOKLR6PWlpWFhhYVarVb7xBMlJQaDwdC5M/5aulkzDIS7O2tS8HcMNhvuRWdlYZN27RoG+ORJT0+1Wq0+ehR/LKDVlnf/AwcmTpw4ccuWs2fXr1+//tVXvb0jIyMjAYRC3PFjQrDj0tKCgoICex/Rv/9XX3311ZgxrVsPGTJkSM0LUef/P4AvDh6cMmXKlE2bTp/+7LPPPhs2zMenRYsWLe4WQiDAY4OhsLCwEECny8nJyQHo12/9+vXrx45t0+bll19+ef36mvKryn1AQ6N37xUrVqx4441Ond555513Nm/OzY2NjY0FsFpxqYU1RayPUCg8PDw87H3E/v0TJkyY8MUXWJOmTq0pv/4zAjBQiGHDunadPHny5G++KShISEhIALBYDAac6bP/t4BCyOUohELh6enpCXDw4KRJkyYtWxYdvXLlypXvv19df/5zAjCefvqDDz74YNSoxx6bOXPmzE8/tQuBozjHGiGT4fzBzS0sLCwM4OjR+fPnz1+4EIWYO7eqfvxn+oDyOHZs0aJFi9asOXHio48++uh///PwaNy4cWMAsVihUCjsEz0mjNms0+l0AFotTvi6dZs+ffr0BQsef3zmzJkz2Qy9fEgAB44f/+CDDz745JO//lq8ePHiCRNYiZdKVSqV6m4hLBa9Xq8HKCq6cePGDYCHHho9evToTz559tmVK1eunDixvPuRAE44ffrzzz///P33Dx2aNm3atIUL3dxCQkJC7BO4u4XAPsQuxKhRo0atWYNCTJjg7D7/2T6gPDp1evvtt99etKhXr+XLly+fO1ejSU9PTwcwmbDpsfcRKIRYjEswHh5YY86eXbdu3brx42NitmzZsmXcOGf3IQHKoWPHcePGjVu0qGfPjz/++ON584qKkpOTk+0zZzZvYPMIkQiFYE3W1avbt2/fPn68s+uTABWkY8exY8eOXbiwX78vvvjii8mT2QTNYMCZM5vQsRm91YpbnyhIaSnf/j9wXL68devWrWPGLF3q6enpyXFLlqhUKpXdss9TUo4ePXqULaPfDXXC1eTmzejo6OjevS9c2LBhw4a33mKfd+gwYsSIEV9+GRzcpUuXLvadOoIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgiEpQY++Mi41NTb15s2lTtVqhUKmaNJHLpVKJRKGwWKxWi8VkSkzMysrKSklxcVEo5PLk5HbtwsKaNGmo6XFrjioLcP16RkZ6upubTmc0Go29emFChiefxKxKERESiVgsFstkVqvVarWazRqNXq/XJyS4u6tUSuWpU5hIeffujh2bNYuIqH52pYZKhQWIjU1PT00VCjEnzDvvZGTk5+fnT55ss3EcQFgYy76K+S/uTBCNSXMwI4Y9FQl+mp6O53z5ZUiIt7ePz8cfR0QEBgYH85dasK4pV4Bjx65cuXw5MNBqtdkslp07MUlPp05SqVgsFmMuGJGInc3y8rL0sCw9lVqNAW/bFmXx88NUJQBmMyaGwyYrNrZRIw8PL6/hwyMjg4KCg0+f5jtAtY1TAS5cSE5OSvL1xaQ8hw5hyW7bFnO3AOA7YmNj8ZW9LGnmzz9jwjYWeDuYgM3DA4/69sX3y06ciLXh4YexCQMQiUQikSg3t1WrkJDQ0MceCwnx8vLxiY/nO1C1hVMB/vzz8uWYmL//1ukMBr2+c2elUiqVy1nGvC++wLMmTcKAV73JQGGWLMGsSrNnY5Iflm725s2OHcPDw8Pbt3d1VSiUygevr7jr3dGJiVlZGRljxxYV6XQlJZ07KxRSqVTKAv/llxjwceOqG3gGXue99zBd1eLFLBGcVqvXl5aGhCQmZmZmZFQ9Q0V953YNKC7W6UpK1OqzZxMTr19PSMDMeL6+mKIwPr5HjzZt2rWLiKhth44ciYm5cOHwYcw79vTT+KnF0rFjeHjz5k2aeHmp1a6uqal8B66mEGZmFhbm54tE2NY/95zBYDZbLL6+OIxkeb2WL68rh7CTnjdPKsXUhEaj2Ww2i8WFhSUlJSUvvsh3wGoaIY7bGzfW681ms/mpp3Dczr5mbS5LwllXREfjqCk2ViQSi0UigLw8rba4uHt3vgNW0wix7W3cGHM0NmtWNmHzhQvYRms0deUQ3o/NIi5fZikPjUaz2WIJDT17NiEhPt4+8G3oCPEBVSqRSCAQCuXysl8XFPDrXk5O2cTRmIsS4AESwGKx2TjOaLRaOc5mY+lkGSytLF94epY9tlhwjm1vJBs6QoPBZDKZkpI4zmbjuOTksk1Qhw44Tlep6tox9KFNG6sVlzikUpFILMZ5QUTEAyQAhjslRamUy+XykydFIlyrQXx90T77bF05hIK3a4dNTatWFovVarMBeHqq1S4u0dF8B6ymEYaF+fr6+RmNmCZ2504cfhYV4TyAJaWZPbuuHML7zZ9vMplMJpNAgK09x/n7e3h4edV9yvHa5vZMuFEjDw9Pz8JCDw8XF7V61SqDwWw2mVhT8NBDWDLnzastR/7449KlixfHjrXZjEaT6YUXbDaVSqkEaNasbdu2bT//3M1NqVQqr1/nO2A1zV1LEU2a+Pr6+S1d6uHh4qJSXbtWXIyp+jAT9fz5KMTChTXlAF5vzBibzWAwGNatE4sbNfL3BxCJSkv1eptNJDp16u+/ay+jNd84XYzLyCgoyM9v1+7ixRs3kpOPHbNYLBar1c3NxUUuZ4tyAAcO4Goomyn/9ReO4x1HU3Yw4F27YlMzfrzNZjKZTC+/LJUGBQUFAYjFbm6urgCXLvXu3acPx5nNV65cvXrhwkMPzZw5c+aAAV27Tp06dWpaGt+Bq3UBGCkpOTnZ2eHhyck5OVlZu3drtaWlBkPLllKpWCwUAkilYrFEwtruK1dQmGvX8K8zM9F6eWFTFhGB33foYDJhImWOUyqVSgCBQKPRagFSU+fMef99AJMpJubSJQC9HmfCcrlarVbn5HTqNH78+PG9emGqwYsX+Q5grQvAKCjQarVaT8/ExKyszMxZs3C1dMwYvd5kMpnUapFIJBIKcYNGeKthE9xxdbbEwXbOZDKRSCw2mcLCWrVq1WrNmuzszz77/PO4uJMnp0yZOvWrr9RqTDnu4uLn5+cHkJ8fFxcXByCXe3p6et68+fTTS5YsWfL00y1aDBw4cGBCAt+BrHUBHElKysrKzGzWzGCwWMzmZ58tKSkt1esff1yvN5tNpqZN8SyFAq3RiFuSN296e7u5ubqePKlUSiQSyW+/BQV5e/v6XrnCrrtz5+DBQ4YMHJia+u+/58/v3Mk2N11dsYnKz4+Pj48HUCp9fHx8ioqefHL+/Pnz+/Rp2fLFF1988e+/+Q5onQngDFyrEYttNgAANqew2Tp2bNaseXOLpaLXOXBg0qRJkwYPjovbvXv37p9+wuylQiETIjf3ypUrVwDU6sDAwMCcnK5dp0+fPv2ZZ9q1e+211167dInvwFaUep/K8NChGTNmzOjT5+rVHTt27Ni3z2azWCwWgcDDIzQ0NBQgLw9TkWMfodU+/PC4cePGDRzYpcu777777h9/8O1/edT7bKo9ey5dunTp/v1t277++uuvv/CCSCSRSCQmE0uc7OUVHh4eDmAwFBcXF6vV586tX79+/a5dJ0+uXLlyZefOfPtfHvW+Bjhy4sTSpUuX9uhx/vxXX3311f79ZrNer9fLZJ6ezZo1awZQXIzCYBpZna5Jk549e/Z8+eW+fdeuXbv211/59t+Rel8DHHnssRkzZsz488+OHcePHz++f3+ZzNXV1bWkpKAgMTExEcDNDZsmq9VgMBhUqmvXfvnll1927jxzZt26deu6dePbf0canAAMbOMPHerWbfr06dOffhozWGs0ubmxsbGxAJ6ezZs3bw6AA2CJ5OLFTZs2bdq4kW+/HWmwAjA6dIiKioo6ffrxx2fPnj17wAC12t/f37+wMD393Llz5wBKSoqKiooAJBKlUqnU6fj294EnPv633377LSJi8+Z+/fr1279/8+b+/fv337//xo3jx48fDw/n2z+CIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIAiC4J11665ePXbskUdiYgoKMjLUar79+c9w8mR2dnJyWBjAokU9e3Kcp+cXX4waFRt74UJ+flqaqyvf/jnS4F5d7IzERK02L08qbdly48bJkxMSjEazWa8PDgYwm41GAIXCxcXTMzl5+/Z+/SZP7t+/b9/Q0LZt7a/N54sG/+JWxoABv/yyfPmhQ0ZjSUl+fnAwgFrt7Q0A4OkZGAig1xuNOl3jxn37bt06f/6FC3Pm/PPPrl0jR/Ltd4MX4Kmnfvll2bIvvrhyJTn5/PknngDw8goOBgDATB126+aGWdF0usJCsXj79qSks2dHjODb/wYrwIQJJ0/+9NO77x45cuXKn3+OGQPg4xMSAsAybtzxiLdy3ufm3rwJ0KhRcHDr1gkJZ84MGjRnTs+efD9HgxPgq6/i4k6c6Nnz00+PHPnmm9Wr7SWbBZpleGLHGk1uLoBIJJe7uBgMR4++9NL773fvrlZLpQpFaSnfz9NgBNiz58aNmJimTUeP3rt3xYoDBwBcXTHwEgnmgGUlXyDAJEJ6vVYLAGAy6fUA+/a99NL77z/1VPPmbm6+vhkZfD8PQ8y3A+WRkqLV5udLJC1afP/91KnHjwOwECuVOKhkbTxLQmqxYBaz4uLsbIBPPx04cNasUaOefTYoqGXLU6f4fh5H6n1e3q1bw8MNhj//LCwsLMzMbN0awMMjIADAHnhHcnNTUgDeeqt79zfeWLFi8eJOnV54YelSvp/DGfW2CerVa8+e5cvXr8/IyMpKSHjiCeeBt3eyKSkA3bu3afP007/99uWX3bu/8cbUqXw/R3k4FWDDhri4kycffbSuHRo37vjxzZsnTvz99/Pn9+176y0AL6/AQADWtd7h+q3A5+enpgKEhDRqFBkZH3/s2MCBs2b17VvXfleVuwTYsiUx8cyZbt2ion788b33Tp2KjNy0acqU33+vbUdWrbp8+ciR3r3XrYuO/umnVasAfHxCQwHsneq9RzcCgVzu4mI0Hj8+ePC8ed278x3QynJbgFOncnKSkxs1eu21nTs//PDQIQAPD39/gLi49PTY2J49g4K+/XbChNOno6Ozs5OSsDGoCfC+TZtOmvTrr6tWHTiAGcEAAKRSZ6MbjQaALTEcPDh48Lx5PXqEhanVXl5ZWXwHtLII4+OLirKyFIqBA/fsWbbs6FF8ZIUCQKXy8AAA8PYODQVIS8vPT03t2LFr182bp0+/cGHLlvj4U6ceeaSqN46PLy7OzpbJevXavn3RomPHAMRiqRQAQKVydwcAsNkwG5/j6KaoKDsbYPXqvn0nTRoxolevwMAWLerf6KbCAnTsuGPH4sWHD2dlpaZevRoebm9zHafy7u5+fgCYWdjX97XX9uxZtuzMm000/+efnTtfeaWyNx4wYO/eVav++EOrLSrKzAwMtE+oHDtZVgPy8m7cABg37skn33xz2bKJE9u0eeqpDRv4DmB1ES5Z0qnTCy9s3IijDJsNIC8Ps/XaZ5YIK5EuLl5eAAAymVIJsGjRoUNffPHDD6NG/fHH11+/9155N+zZc8+eFSu++iou7saNCxe6dQPw9sYlBOejmxs3AJ54onXrZ57Zt2/duieeGDZs+nS+A1dT3F6OPnUqOzspqU2b55/fvfujj/bsycnJz09NDQtjTdCdayxl22SrFZuG/Py0NIDHHouIeOyxTZtOnBg8eO7cN99k1582LTp669ZJk5YtO3Lkm29WrgTw9sZFM5Y33rGTzctLTQUIDPTza9Lk2rX09BEjPv00MpLvgNWaAIysLL1eq3Vz69Nn587Fi/fu/000pKTz5x9/HMDHJywMA4SBt3eOLGMq1pCiosxMgO7dIyMff/znn3v0aNQoImL//vnz//pry5aNGwHkcpUKAEAikcnuvI59dJOTAyAWi8UymV4fFxcV9cknTZs2a+bq6uPDEkQ/OJS7ITN06L59q1d/883PP5879+uvI0bY+wiJBLMFcxwGniVwZmmcdbqiIgAAqxWT2LLOVSSSSO78O1aTDAZcuyktLS4GOHx42LAVKzp3fuaZwMCIiNOn+Q5UbVHuTPjnn/v2nThx5Mjp0596asSIOXMAiopycgAA9PriYoC7VyFZiWZrNS4unp53nmcPPBvdGI0AAMXFubkAa9f27z91alTUgx54RqW3JDdsuHr1+PGhQ6Oi9u1bufKnn+wl2M3N3x8AwGareNpmAIDs7KQkHN1ERX388bp1Tzzx2mszZvAdmLqiynvCR49mZFy71rHjgAG7dn344b59Gk1xcU6Oj499Y4T1CY6wmpCdnZgI0KNH69ZPP713759/vvDCjBkDBvAdkLqm2pvyKSklJQUFfn79+u3YsWTJr79evpyaeunSI4/YO23W1LCagqObsDB//2bNYmNTUqKiVq9u2ZLvQPBFjf8qok+f3bs/+mjbtv37Y2IOH37pJQBfXxQCO1ehUCSSSPT6lJSRIz/7LCwsJMTFxcMDexWiBpk06dixTZs++ADg/fcff5zjAJYs6d2b4/74Iz09Lq7+pxp/YJgx48SJH36YM2fBgnPn9u2bNIlvfwiCIIjb/B/7w7TJ1Po+fAAAAABJRU5ErkJggg==); + background-size: 24px 352px; + } +} + +.jsgrid .jsgrid-mode-button { + width: 24px; + height: 24px; +} + +.jsgrid-mode-on-button { + opacity: .5; +} + +.jsgrid-cancel-edit-button { + background-position: 0 0; + width: 16px; + height: 16px; +} + +.jsgrid-clear-filter-button { + background-position: 0 -40px; + width: 16px; + height: 16px; +} + +.jsgrid-delete-button { + background-position: 0 -80px; + width: 16px; + height: 16px; +} + +.jsgrid-edit-button { + background-position: 0 -120px; + width: 16px; + height: 16px; +} + +.jsgrid-insert-mode-button { + background-position: 0 -160px; + width: 24px; + height: 24px; +} + +.jsgrid-insert-button { + background-position: 0 -208px; + width: 16px; + height: 16px; +} + +.jsgrid-search-mode-button { + background-position: 0 -248px; + width: 24px; + height: 24px; +} + +.jsgrid-search-button { + background-position: 0 -296px; + width: 16px; + height: 16px; +} + +.jsgrid-update-button { + background-position: 0 -336px; + width: 16px; + height: 16px; +} + + +.jsgrid-load-shader { + background: #3d3d3d; + opacity: .5; + filter: alpha(opacity=50); +} + +.jsgrid-load-panel { + width: 15em; + height: 5em; + background: #000; + border: 1px solid #333; + padding-top: 3em; + text-align: center; +} + +.jsgrid-load-panel:before { + content: ' '; + position: absolute; + top: .5em; + left: 50%; + margin-left: -1em; + width: 2em; + height: 2em; + border: 2px solid #009a67; + border-right-color: transparent; + border-radius: 50%; + -webkit-animation: indicator 1s linear infinite; + animation: indicator 1s linear infinite; +} + +@-webkit-keyframes indicator { + from { + -webkit-transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(180deg); + } + + to { + -webkit-transform: rotate(360deg); + } +} + +@keyframes indicator { + from { + transform: rotate(0deg); + } + + 50% { + transform: rotate(180deg); + } + + to { + transform: rotate(360deg); + } +} + +/* old IE */ +.jsgrid-load-panel { + padding-top: 1.5em\9; +} + +.jsgrid-load-panel:before { + display: none\9; +} \ No newline at end of file diff --git a/packages/watten/Resources/Public/Icons/Bold.svg b/packages/watten/Resources/Public/Icons/Bold.svg new file mode 100644 index 0000000..31227ab --- /dev/null +++ b/packages/watten/Resources/Public/Icons/Bold.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/watten/Resources/Public/Icons/Bowling.svg b/packages/watten/Resources/Public/Icons/Bowling.svg new file mode 100644 index 0000000..05fe8e0 --- /dev/null +++ b/packages/watten/Resources/Public/Icons/Bowling.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/watten/Resources/Public/Icons/Bum.svg b/packages/watten/Resources/Public/Icons/Bum.svg new file mode 100644 index 0000000..a60807c --- /dev/null +++ b/packages/watten/Resources/Public/Icons/Bum.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/watten/Resources/Public/Icons/Calender.svg b/packages/watten/Resources/Public/Icons/Calender.svg new file mode 100644 index 0000000..697a3e2 --- /dev/null +++ b/packages/watten/Resources/Public/Icons/Calender.svg @@ -0,0 +1,5 @@ + + + diff --git a/packages/watten/Resources/Public/Icons/Degen.svg b/packages/watten/Resources/Public/Icons/Degen.svg new file mode 100644 index 0000000..1b8dde7 --- /dev/null +++ b/packages/watten/Resources/Public/Icons/Degen.svg @@ -0,0 +1,25 @@ + + + + + + + \ No newline at end of file diff --git a/packages/watten/Resources/Public/Icons/Extension.svg b/packages/watten/Resources/Public/Icons/Extension.svg new file mode 100644 index 0000000..1b9d632 --- /dev/null +++ b/packages/watten/Resources/Public/Icons/Extension.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/watten/Resources/Public/Icons/Gstrichen-lose.svg b/packages/watten/Resources/Public/Icons/Gstrichen-lose.svg new file mode 100644 index 0000000..84d8ffb --- /dev/null +++ b/packages/watten/Resources/Public/Icons/Gstrichen-lose.svg @@ -0,0 +1,4 @@ + + \ No newline at end of file diff --git a/packages/watten/Resources/Public/Icons/Gstrichen-win.svg b/packages/watten/Resources/Public/Icons/Gstrichen-win.svg new file mode 100644 index 0000000..56d2b38 --- /dev/null +++ b/packages/watten/Resources/Public/Icons/Gstrichen-win.svg @@ -0,0 +1,4 @@ + + \ No newline at end of file diff --git a/packages/watten/Resources/Public/Icons/Gstrichen.svg b/packages/watten/Resources/Public/Icons/Gstrichen.svg new file mode 100644 index 0000000..7dd0a7b --- /dev/null +++ b/packages/watten/Resources/Public/Icons/Gstrichen.svg @@ -0,0 +1,4 @@ + + \ No newline at end of file diff --git a/packages/watten/Resources/Public/Icons/Hashtag.svg b/packages/watten/Resources/Public/Icons/Hashtag.svg new file mode 100644 index 0000000..ed97314 --- /dev/null +++ b/packages/watten/Resources/Public/Icons/Hashtag.svg @@ -0,0 +1,5 @@ + + + diff --git a/packages/watten/Resources/Public/Icons/Krone.svg b/packages/watten/Resources/Public/Icons/Krone.svg new file mode 100644 index 0000000..8defc05 --- /dev/null +++ b/packages/watten/Resources/Public/Icons/Krone.svg @@ -0,0 +1,5 @@ + + + diff --git a/packages/watten/Resources/Public/Icons/List.svg b/packages/watten/Resources/Public/Icons/List.svg new file mode 100644 index 0000000..f44986a --- /dev/null +++ b/packages/watten/Resources/Public/Icons/List.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/watten/Resources/Public/Icons/Loos.svg b/packages/watten/Resources/Public/Icons/Loos.svg new file mode 100644 index 0000000..6ef497f --- /dev/null +++ b/packages/watten/Resources/Public/Icons/Loos.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/watten/Resources/Public/Icons/PersonAmber.svg b/packages/watten/Resources/Public/Icons/PersonAmber.svg new file mode 100644 index 0000000..40dd869 --- /dev/null +++ b/packages/watten/Resources/Public/Icons/PersonAmber.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/watten/Resources/Public/Icons/PersonBlue.svg b/packages/watten/Resources/Public/Icons/PersonBlue.svg new file mode 100644 index 0000000..aafc50f --- /dev/null +++ b/packages/watten/Resources/Public/Icons/PersonBlue.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/watten/Resources/Public/Icons/Rank.svg b/packages/watten/Resources/Public/Icons/Rank.svg new file mode 100644 index 0000000..21d2db3 --- /dev/null +++ b/packages/watten/Resources/Public/Icons/Rank.svg @@ -0,0 +1,5 @@ + + + diff --git a/packages/watten/Resources/Public/Icons/Sun.svg b/packages/watten/Resources/Public/Icons/Sun.svg new file mode 100644 index 0000000..862603d --- /dev/null +++ b/packages/watten/Resources/Public/Icons/Sun.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/watten/Resources/Public/Icons/Team.svg b/packages/watten/Resources/Public/Icons/Team.svg new file mode 100644 index 0000000..1d0c844 --- /dev/null +++ b/packages/watten/Resources/Public/Icons/Team.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/watten/Resources/Public/Icons/Thump-down.svg b/packages/watten/Resources/Public/Icons/Thump-down.svg new file mode 100644 index 0000000..b6940bd --- /dev/null +++ b/packages/watten/Resources/Public/Icons/Thump-down.svg @@ -0,0 +1,2 @@ + diff --git a/packages/watten/Resources/Public/Icons/Thump-up.svg b/packages/watten/Resources/Public/Icons/Thump-up.svg new file mode 100644 index 0000000..a3508bf --- /dev/null +++ b/packages/watten/Resources/Public/Icons/Thump-up.svg @@ -0,0 +1,2 @@ + diff --git a/packages/watten/Resources/Public/Icons/User.svg b/packages/watten/Resources/Public/Icons/User.svg new file mode 100644 index 0000000..2145974 --- /dev/null +++ b/packages/watten/Resources/Public/Icons/User.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/watten/Resources/Public/Icons/UserGraduate.svg b/packages/watten/Resources/Public/Icons/UserGraduate.svg new file mode 100644 index 0000000..b5881eb --- /dev/null +++ b/packages/watten/Resources/Public/Icons/UserGraduate.svg @@ -0,0 +1,5 @@ + + + diff --git a/packages/watten/Resources/Public/Icons/Win.svg b/packages/watten/Resources/Public/Icons/Win.svg new file mode 100644 index 0000000..e25e441 --- /dev/null +++ b/packages/watten/Resources/Public/Icons/Win.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/watten/Resources/Public/Icons/user_plugin_ergebnisse.svg b/packages/watten/Resources/Public/Icons/user_plugin_ergebnisse.svg new file mode 100644 index 0000000..1b9d632 --- /dev/null +++ b/packages/watten/Resources/Public/Icons/user_plugin_ergebnisse.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/watten/Resources/Public/Javascript/jsgrid/jsgrid-1.5.3.zip b/packages/watten/Resources/Public/Javascript/jsgrid/jsgrid-1.5.3.zip new file mode 100644 index 0000000000000000000000000000000000000000..5290b056190ce6822e6d5f8a4c0dcad44b954fb5 GIT binary patch literal 81288 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 z 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 q{`_S|{EhPq^*7GH.jsgrid-header-cell, +.jsgrid-filter-row>.jsgrid-cell, +.jsgrid-insert-row>.jsgrid-cell, +.jsgrid-edit-row>.jsgrid-cell { + border: 1px solid #e9e9e9; +} + +.jsgrid-header-row>.jsgrid-header-cell { + border-top: 0; +} + +.jsgrid-header-row>.jsgrid-header-cell, +.jsgrid-filter-row>.jsgrid-cell, +.jsgrid-insert-row>.jsgrid-cell { + border-bottom: 0; +} + +.jsgrid-header-row>.jsgrid-header-cell:first-child, +.jsgrid-filter-row>.jsgrid-cell:first-child, +.jsgrid-insert-row>.jsgrid-cell:first-child { + border-left: none; +} + +.jsgrid-header-row>.jsgrid-header-cell:last-child, +.jsgrid-filter-row>.jsgrid-cell:last-child, +.jsgrid-insert-row>.jsgrid-cell:last-child { + border-right: none; +} + +.jsgrid-header-row .jsgrid-align-right, +.jsgrid-header-row .jsgrid-align-left { + text-align: center; +} + +.jsgrid-grid-header { + background: #f9f9f9; +} + +.jsgrid-header-scrollbar { + scrollbar-arrow-color: #f1f1f1; + scrollbar-base-color: #f1f1f1; + scrollbar-3dlight-color: #f1f1f1; + scrollbar-highlight-color: #f1f1f1; + scrollbar-track-color: #f1f1f1; + scrollbar-shadow-color: #f1f1f1; + scrollbar-dark-shadow-color: #f1f1f1; +} + +.jsgrid-header-scrollbar::-webkit-scrollbar { + visibility: hidden; +} + +.jsgrid-header-scrollbar::-webkit-scrollbar-track { + background: #f1f1f1; +} + +.jsgrid-header-sortable:hover { + cursor: pointer; + background: #fcfcfc; +} + +.jsgrid-header-row .jsgrid-header-sort { + background: #c4e2ff; +} + +.jsgrid-header-sort:before { + content: " "; + display: block; + float: left; + width: 0; + height: 0; + border-style: solid; +} + +.jsgrid-header-sort-asc:before { + border-width: 0 5px 5px 5px; + border-color: transparent transparent #fff transparent; +} + +.jsgrid-header-sort-desc:before { + border-width: 5px 5px 0 5px; + border-color: #fff transparent transparent transparent; +} + +.jsgrid-grid-body { + border-top: none; +} + +.jsgrid-cell { + border: #f3f3f3 1px solid; +} + +.jsgrid-grid-body .jsgrid-row:first-child .jsgrid-cell, +.jsgrid-grid-body .jsgrid-alt-row:first-child .jsgrid-cell { + border-top: none; +} + +.jsgrid-grid-body .jsgrid-cell:first-child { + border-left: none; +} + +.jsgrid-grid-body .jsgrid-cell:last-child { + border-right: none; +} + +.jsgrid-row>.jsgrid-cell { + background: #fff; +} + +.jsgrid-alt-row>.jsgrid-cell { + background: #fcfcfc; +} + +.jsgrid-header-row>.jsgrid-header-cell { + background: #f9f9f9; +} + +.jsgrid-filter-row>.jsgrid-cell { + background: #fcfcfc; +} + +.jsgrid-insert-row>.jsgrid-cell { + background: #e3ffe5; +} + +.jsgrid-edit-row>.jsgrid-cell { + background: #fdffe3; +} + +.jsgrid-selected-row>.jsgrid-cell { + background: #c4e2ff; + border-color: #c4e2ff; +} + +.jsgrid-nodata-row>.jsgrid-cell { + background: #fff; +} + +.jsgrid-invalid input, +.jsgrid-invalid select, +.jsgrid-invalid textarea { + background: #ffe3e5; + border: 1px solid #ff808a; +} + +.jsgrid-pager-current-page { + font-weight: bold; +} + +.jsgrid-pager-nav-inactive-button a { + color: #d3d3d3; +} + +.jsgrid-button+.jsgrid-button { + margin-left: 5px; +} + +.jsgrid-button:hover { + opacity: .5; + transition: opacity 200ms linear; +} + +.jsgrid .jsgrid-button { + width: 16px; + height: 16px; + border: none; + cursor: pointer; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAFgEAYAAADx4WWjAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAZjElEQVR42u2deVyU1f7HzzyzDzCA7MgihCsY7uYOiZIamebVFl/Wy8zSxLTQuld/lmIuCGIu9cruLa9lXlNTUQsVUgQRNBbZF5F9lWEbZpj9/P74doQZ87LMDHjvPe9/vj7MPOf5fp6zjc/3e86D0H8rNTVRUd988/rrxpZTV3f48PHjixb1m+N5eVOmvP76hQtXryKEEMYVFWFhERG7dvW2nIKC4OBVq/71L1JOWdk774SHb9tmcoc1mpaWtjYLi6Ki+fPff/+f/7x2DS6YlobQpEkYJyQgxOViXFGxYUNExN693ZVXWDh//urV339/8yZCQiGUM3EixqTcqqq//e3gwQ8+MJkAnU6tVqvZbKk0KSkj47nnfv/d2nrcOInk1i2EHBw6HSBCyss3btyz53Eh4PiJEwkJCAkEGKenIzRlCsaJiQhZW2OcmentHRhYUCCX5+Tcv+/nZ/KaIKjVlZUSibPz3bu2tv7+jY1JSQjZ22P8++8ITZiA8c2bCIlEGNfU7Njx9dcbN5aXv/fe55/v2kXueFfHrawwzsjw8po1Kz9fp5PJVCoOx9T+sp4spLq6qcnJKTPTzy8wMDtbpWpurqlxcBAIEPL2RkihQKi8HCEWCyEOByGBACEPD4RkMoSysxGyshoxYtKkvLxnn83IiI3192cYoZDL1WjMduefhEbT2Njebm2dnT1x4sKFt26lpCDk7Q01Mm5cp719GyEPD4zz8+fNe/PNixcx1moxZhhz+9ftBTgce3tLy9ZWodDT08enqEirRUguh89YrE6r1SLU3o6QWDx27HPP3bjBYrHZLJZO1+933JDCwnnzVq8+eZJ0xvR0hKZNwzg5GSF3d4xJjXRt+2IxxpWVYWFRUX/964A5npc3e/aKFT/+aNg5k5IQsrPDOC9v/PjXX09Nzcpyc3vhhbKy5GSEXFygSY0fD6MWj4dxRcWmTZGRW7b0m+P5+dOnr1jx00+Gw+HNmwhZWmKcmTliRFBQdjb5vlrd1NTSYm2dmsrnDx0qlycnI+TsrC9EIMC4ouKDDyIitm41ucNqtUTS3GxlVVQ0f/66dZ0TWUYGQjNmQJPo6rhOp1RqtWy2YTkKRUFBVdXQoampPN7QoR0dt26BkPR0hCZPxpjMyDCRbdxoMgE6nUqlVnO5UmlSUmbmtGl374rFY8c2NcXFwQXv3RsxIigoKwtjpVKr7X5UUSgKCiorfXxSU0Wi4cOl0vh4KCcz08srMPD+fbk8O7u4+NlnTV4ThI6OrKzS0qFDc3JCQpYuPX1ap+vo0Ggev+PdIZPduVNY6O+flRUUFBLyyy9arVSqUAiFZnPcEI2mrq611cbG2HJUqrKyhgZX135znEKhUCgUCoVCoVAoFAqFQvlP4FGIyd//wIGYGPL0eOFCsOSRooWF/jHG3RT7R7kkwNHeDpY8W7106d69DRteesn4p9UGQbdZs8BOmAD26FGwajVYS8veFd/RAZbExtatA6tUgjW5gFdfBXv4MFhnZ7hTpEZ6D9TsiRNwFBsL9u23jXWc8FiUEi5IwqFlZWBLSkAIqaGeOn7uHBzNnAl2yBAoRyo1lYDHnvfDBUiV+/qCfeYZcOjs2Z45/s03cBQQAHbUKFM7TmB19wVwyNMTjlJSwCYlgW1tBUtqjM8HGxwMdsYMcDw319SOE7qNuIAD5eVwtGwZ2CVLwFpbgyU1RvrQypXmdrzHAvQhTaCoCOzy5eDoqlVwnJEBtqnJ3I73UQAJEQkEYG1t9T8nf++/UJKRqQBsNvSR3sfQBkiASPTHaX+cV1sLTUirhWNWt4PCAAuorQU7aBDYpUv1P5fJwJo+rcZoAfqjyvvvgz18GJpQXh4cjxkD1vTjvdEC9IUcOwZHZDglwyyEtREqLu4vARQKhUKhUCgUCoVCoVAoFMp/JL1+GAuLe0isbM8esCScum/fhAkIpaWdP9/vAsCxyEg4mjsX7MOHYA2XEE6ZAtbKSv/vJBx786b+eVwuWEdHsHFxINT4xUAGT5G9vMA6O4NtbgZrbw+WPJVOTARLHrMTS+LC48aBbWsD29gI1sFB/zrGYyCAhIpIXJgE927fBktCSCtXgv31V/07v3gx2DVrwA4dCjYwEOzp02DPnDGTAJJSQCLq48eDhdVlCB05Apa0fdKESFxg506wOTlgSVDwtdfAkiaZkAC2vt5YAQaP10kA4949/b8/KcWARGQMAxrk76TJEFJTwVZWGuv4YwKgU5FQEYn/EkjwjrRxQwyTP8ioRM4j1NTAdQzLN4EAfVpa9I9JDSgUYEmb77ogtyvkcxL4Jpg+cvMEASTiQiBtndQQEWIogNQE+Zz0KYLp48dPEFBSon9MhlUS/yXDIhk+iQDSxFQqsGKxfjkkQG52AWT8N1yRTZYmks8N5wHSREjc2MlJ/3zTdd5uBJBF54Zt1s4OLJmgyJ0nAkjNkBwKMgOTpkfOM7sAMkoYdmYyqvzZqvquDhKhBJJy9qRRzIQCYJgjna2qSv9TMk+QpkCakkSi/33iMIFMWGQiMx3dRNQNL0gi825uYEeNAks6rYsL2Dfe0D+PjP9kxu43Afn5YOfNAxsSApYMk6SzkiZE/u7tDZb8GjWc2SkUCoVCoVAoFAqFQqFQKBTjMNuiHViaMmQIHJFNgqOjYQVIRcVTKwAcJ2swydJFEuEhi0sDAvRXCPYdk20pC46TQAiJIxgG/0iN/PILfN/DY8AF6C8WTU8Hu3YtWPIQ2HBNJXko/MMPxl6/z+u9wHGSOhATA5Y8nSZbnhcWgiXLch88AEtibl9/bayAXvcBcHzwYDgiKQfdpQ6Q9cW//AKWy4U+QCL3/SAAHCc5EyRyTxa+9RQfH3DcMIjYd7ptQvqdjaQIkM7YHSQ2tmSJqR3vVgA4TqKMpI331HHCokXg+MWLpnb8iQL0R5UbN/rm+MKF5nacYLAxBgkVVVeDJaNKT1m8GBwnuxmYH7b+cEi21ScB7qlT//3ppI2TO06aWv/xx0Tm7g72wgWwZCOLjz7689NITgS545cu9bfjBI6+Q6TTkt8wpEZIqtknn4B95ZWBuuOG/FEDZC8VAo8HliRnkJ8IU6eC46SmBp4/aoC0ebKnyq1bYElKQWEhOE5+GlAoFAqFQqFQKBQKhUKhUCgDi8nCrKdOFRffuTN+/LJlMTEREdevIyQUkuAqPPPu6JBKEbp6ddmy7dtDQubOdXPz9SUBk75jsk0dWSwWi8Xi8xFiGDbbygpsVwFwzGIhxGIZLpB7CgQAGg1CGMOjYmIJXY/JmhvjMfu7U80NFTDQUAEEnc6w0/6HCfDyEovt7auru442+oJ0Oq0WITc3CwtbW7Kk0Xg4P/10//6dO7D4n8Uiq097/mJkPp/N5nC02t9+q6rKzx89GiGBgIzyMP6zWGB5PKEQoZMni4tTUwMCLl4sLc3MFAg6OrRatbrn2z5DTTMMl8swDKNUshCKilqyBOPOiae3TYE4yGZDdpBAALkoGOvfBhYLFu12dMCaV6iR3l+PnMflCgQdHRyY8lUqEMDj9b5A8m0ixNDxzu/B36EmOq/T272qQQCbzeUKhUolB4oATX3b9rr3Z5Gm1Sm99+fDOVotB35kCYXGNyFyvlBImhD5BrnT0IRUKlhtbFwT0mi0Wo1m0CDWtWuVlbm5s2aBI2TRf8/fJ8/lMgybrVbn5zc319b6+a1Zc/36t98ePtzZJ4jjSqVcjlBExKxZK1Zs3jxpkqOjl9edO2q1TqfVksGjezDGGGMOh81msRhGJuPMmePuboqftZmZjY3l5QUFCKlUCsXhw11HI7jDarVKhVBIiKenv39MzMiRtrYuLsbHnU02D+TmNjXV1np6du2c+m2bYRgGoaoqmay5meRmGI/JBEBT+jPHzQv9LTTQUAEDjcn+Tww/srjczgmKWDJrwjHGCGFM8pGeIgHw61Au5/G4XIGgoYFhuFyBoPPXjk6n0ajVLBZMQP33hggKhUKhUCgUCoVCoVAoFAoFIYTQhx8mJHz//dq1CO3b9/LLLS0IRUQsXNjSsm3b7ds//fThh/3tT6+fzEFekK0t/Ivsbkw+M9ws2Pz04eEuxhgrlX+eF0S2rH2qBTxd9FrAk5I6GKZ/Q0uEXvcBFxdLSxuburquj9ExRsjBgc+3sGho6HcBH32UkHD8eGgoxHOFQmjThlkOGNvYCARCYXt7XFx1dUHBCy8gJBTC1vBQH2fPlpZmZISE7NiRknLmDIvV2qpSKRQWFlBeZ91AnJdhWCyGYRiZLCpq5szly8mbJXoPC6F9+xYuxBghFotE6v8810Gng78LBJBOKRLpj0FyOWx4rlBAJB7Cqo9DymcYCG+HhZ092/fGx3k8v+dJof/HR50/vyxxsOt9//flGANn27bp05cv37wZxnUSWyepBp0vRrCzEwgsLEgTCgq6eLGkJC1twQIiPDjY03PMmCtX5s718Bg16sqVtjalsqNDJAInSV3AkU7H4bBYLBab3d6+fTtCP/9svJAeExWVlnbx4vLlCO3Z8+KLGCO0e/eCBRgfOZKRERv77rv96ArUQG9PKC9va5NInJ07kzmgKdTXKxRSKdmfov/o9TzA4zFM/72F3gwCIEw60G530ut7CeO4QNB1tOkcVQzfO/MUCmCzGYbNbmyEcby1lQhgGIZhsfp/JqZQKBQKhUKhUCgUCoVCofxv0uPAQmNjW1tbm5NTfX1ra3Pzyy9LJFKpVDp9Oiy/cnXV6XQ6na69ncfj8bjcjAw7O0tLK6vz5729nZ1dXDIzzSWg2ydzKSlFRfn5lpbNzTKZVLpwYUtLe3t7+xtvqFQajUYzdqxWi5BOZ2mJMUTN1GqdTqcjb0cXiUpL6+vr6trbvbycnJyd79/vtxqorJRIHj4cOTI7u7y8rOz0aY1Gq9VqfX0h0I0Ql8tmczgPH8Kz0oICCIU4OkIUc/hwEIgQj8fhcDgajY+Pi4uLyzvvDBvm6urmduyYqQQ89nS6rq6lpalpzJi8vMrKioq4OHDI11ck4vEEghs3LCz4fIFgzhxwzNNz3rxx4yZMmDmTx+NyudyRIwUCHo/HGz5cLBaJRKIjR0AuhwM34rvvSkrq6mprN240Ww1cuZKenpaWmalUajQajb+/lZVQKBB8+WVg4OjR/v7vv9/bC1y/np19797LL0ON/PxzR4darVKxWFOnDh8+cuS0aY6O1tY2NsnJfa4BuVyhUCjc3cvLGxrq69evl8tVKqXS318k4vN5vOvX++o4Ac4/fx5q7IMPSHShpKS2trZ23z5ja4ApL29sbGgIDq6qamqSSF56ic2G8CjYnTuNvYC+kEOHBAIul8stK2tr6+iQy6dOLStraKir6+17DLoIaG6WyWSyoCCFQq1Wq6dO5XI5HA6npgbu0+3bphLw6IIMwzDMtWtk1WtDQ0tLS8vEiX0uD9anOzoyDEKdK7rJjt+mzz6BUaywkAReVSqtVqcj7+TogwCtVqfT6eRyksQBw6GDA3xsrnCevb3+XghqdZ8FQGdNT+dwGIZh8vNBkK8vCOnt+we6B2bsqVPBImRjIxKJRH2f4BgvLwcHJ6cLF5ydbW1tbGJjVSqtVqMhaTVhYaZyPD4+MzM9fc4cjQZjjGfOtLQUi8XikhJfXw+PIUN+/bXPAmxtraysrNLS7O3FYmvrL7+EO9/erlSq1Wp1aOj16zk5WVmQUtA3x+/dy8iwsdHptFqtNjqax3N0dHREaNiwIUO8vDZvNvbGPJqJ7eysrMTi+/dHjHBzc3ffvFmhUKlUKoRUKrVarT53Diakdevi47OyMjO73wsF7viMGRhrtVptQoKFxZgxY8b4+ra0XLp0+TJCpaV790ZEGN/Hnvhb6MGDurra2vXrc3MrKysqoqNJ0gaPx2az2ZWVMBxevgyjSlkZhFutraHpzZ4N6SKTJgkEDg4ODghJJBcvXryIUEXFRx9t2oSQTCaXy+UIBQVFRkZGrls3bVpYWFhY7/OGuv05XVvb1NTUNHFicXFtbU3NoUMKhVqtUk2eDD/iyLDY+X2MoXNaWg4aZGf34IG7u6urq2tYWE7O6tXvvhsQcPfusWPHjq1fb23t7e3tjZBUWl1dXY3QvHmHDh06tGHDhAmrV69e/cUXJhNgSFWVRNLY6OtbXS2RSCQTJqjVsEUI5GApldbWIpFIVFDg6enu7uGRlGRpyWKxWJ27msXFbdmyZcvBgykpUVFRUaGhYrG7u7s7Qm1tICQ4ODIyMnLTpokT165duzYyss9ty9xcv/7ZZ599duDAzp1CoVCIcVSUm5ubG8bkOCkpIiIiYseOgfazWxISwsPDw6Ojw8N5PB4P46iowYMHD8Z4506RSCTCODFx9+7du033m8xsgKO7du3cKRAIBBgfPOjj4+PTKeTKlbCwsLC9ewfaz25JSTl06NCh8PDwcD6fz8d49247Ozs7jD/5hM1mszHOyzt79uzZ0FC5vKGhoWHIkKcuc/e550JDQ0P/7/+Cg/fv379/yxadDuYjS0sLCwsLhLhcoVAolEoRYrPZbKVyoP19IgpFa2trq739jz+GhISEnDhx8uTixYsXHz/e0dHc3NxsazvQ/lEoFAqFQqFQKBQKhUKhUChG0U2ERiBob1cqFYp9+ySStjapdP58iGa2tdnbW1uLxTt3jhzp5ubhcfbsUyMgL6+qqqIiKKisrKGhvv7YMUg5GDwY4jFlZbDlu7W1VouxTicUWltbWFhYXL7s7m5nZ2+/dKmHh4ODo2PP319gLI8e7hYV1dRUVQUGlpc3NDQ0XLum1ep0GJeWwtLDCRMglDRsGJvNZjPM4MEcDofD4Xz4YX19S0tz8yuv1NQ0NUkksbH9XgUymULR0WFvD2k29fUxMXfupKQkJvb0/Bs3cnKysvz8zp9PTU1OxhjygvovIMEUF9fV1dZu3QrRRUdHCws+n8/v+crsgAA/v2efzcnhcjkcLvf0aYlEKm1tXbPm/v3a2urqnu9q32cBLS3t7TLZsmWwGrW8fPZsf/+xY/PyelsQZLlcuaLVarUYI1Rd3dTU3Gz+Fd4MQgixWCT3zdLyt9+yszMze79NAkTibW2hHB5PKOTxeDzymngzCvDxcXZ2cgoP1+lg7wKVSqPRalev7m1BGHO5XO6qVba2Hh7u7ikpkyYNHTpsWHOzuQU84s6d4uKCgpiY06eTkxMTMYbOOWpUd+fFxxcW5udv356QUF9fW4txeXlZWWlp3zOwesujplJd3dTU2CgQlJXV1zc0nD/f1NTeLpUGB8OmL6dPw7B57RpE4p2ctFoej8t99VWRaNAgOztf39zc5ctXrECIzy8vLy8/dWrSpC1btmxZvtzff+XKlSt7/kqM3vJoHhg8eNAge3uFYtq0kSNHjXrhBVdXW1s7ux07RCI+n8+fOBEmtM8/hy3KQ0OHDHnmGR+fqioXl4cPJZIXX9Tp0tLS0lJSiopKSkpKli0rKrp69erVc+dyck6dOnWq/9faP0ZiYl5ebq6bW2pqQUF+/uM7OV27tm5daKit7YkTISEhIUlJkEiD8fHjwcHBwcnJKSkHDx482PfUsn7jzp2vvvrqKzu7b78NCAgIyMjYtIkImT179uz4+Nu3o6Ojo21sBtrPbklOjoyMjLS0PH48KCgoKC5u/XoQcvTojBkzZmRkyGR1dXV1gwcbex2z7dExdWpYWFhYe3tVVWpqaurChTKZVCqVPniAsUaj0bi58flisVjc92Q/swsguLlNnjx5skx26dKqVatW/eMfarVGo9HodAzD5/P5Eom5r0+hUCgUCoVCoVAoFAqFQqH8b3PsWHFxauqLLx49mp+fmLho0UD702Nyc1ta6urc3RHas2fBAowR2rkzOBjjTz+9e/fCBeO3ZzDbKiaZTKNRqRgmIOD06e3bb95EiMuFMIdGo1Ih9N13hYXJyatWPbUCnn/+3Lndu2NjHz5sbKyoGDKEOO7q6uHh51dRkZPzl7989tnkyU+dgDfeiI//+9+/+CI1tbDw1q05cxDi80UihBiGz7ew0Gji4195ZevW558Xi/l8oRD2yX8q2LUrMzM29r33EAoPDwrCGKEvvnjtNYwR2rVrwQKMY2OrqwsKnn/ebA6MHn3y5JYtiYlTppw6tW1bz9e4x8RUVOTkzJpFNpFH6MABcBw6a3R0Ts5vv61dazbH58y5dGn//h9+QGjr1mnTOi88evQPP3z88Y0bdXUKhUz2eJQxL6+lpa7OzQ2h6OhXX1WpEIqOXroUY4R27JgzB+OVKxMSjh//6iuzOf4HzPTpzs5Dh2ZmImRt7eSEEEIikViMUHZ2dXVBwaxZfn7ffbd+fV7egwetrQ0NnUsAAwLOnAkPv3ULIY1GqeRyEZLL29oQmjnTzy8wMD7+229nzVqxYs0acwt4FOi+cqWqKi8vIGDRonPndu+OiZHLOzqkUisr8ioKe3t7e0/PsjIPDyurQYNKS9PTy8uzsgIDEVKrlUqEXF3t7T08KisfPHjrrQMHvLwEAjabwyFv6e4HAYQHD6RSicTNbc6cM2d27IiLKympqSksHD4cISsre3uEEMIY3IL9JxBiGDZbpyspefvtI0e8vJ55xsrKzq6iwtyOEx4bRr29razs7KqqcnLefHP//tGj584dOXLmzMuXEWptra8HAbDDgVqtUCD0669Llnz66dy5/e14r3nrrbi4o0ePHkXo44/HjcN4796srGvXNmwYaL96TVxcZWVu7owZA+3Hfw3/D73/bnBl1mLvAAAAAElFTkSuQmCC); + background-repeat: no-repeat; + background-color: transparent; +} + +@media only screen and (-webkit-min-device-pixel-ratio: 2), +only screen and (min-device-pixel-ratio: 2) { + .jsgrid .jsgrid-button { + background-image: url(data:image/png;base64,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); + background-size: 24px 352px; + } +} + +.jsgrid .jsgrid-mode-button { + width: 24px; + height: 24px; +} + +.jsgrid-mode-on-button { + opacity: .5; +} + +.jsgrid-cancel-edit-button { + background-position: 0 0; + width: 16px; + height: 16px; +} +.jsgrid-clear-filter-button { + background-position: 0 -40px; + width: 16px; + height: 16px; +} +.jsgrid-delete-button { + background-position: 0 -80px; + width: 16px; + height: 16px; +} +.jsgrid-edit-button { + background-position: 0 -120px; + width: 16px; + height: 16px; +} +.jsgrid-insert-mode-button { + background-position: 0 -160px; + width: 24px; + height: 24px; +} +.jsgrid-insert-button { + background-position: 0 -208px; + width: 16px; + height: 16px; +} +.jsgrid-search-mode-button { + background-position: 0 -248px; + width: 24px; + height: 24px; +} +.jsgrid-search-button { + background-position: 0 -296px; + width: 16px; + height: 16px; +} +.jsgrid-update-button { + background-position: 0 -336px; + width: 16px; + height: 16px; +} + + +.jsgrid-load-shader { + background: #ddd; + opacity: .5; + filter: alpha(opacity=50); +} + +.jsgrid-load-panel { + width: 15em; + height: 5em; + background: #fff; + border: 1px solid #e9e9e9; + padding-top: 3em; + text-align: center; +} + +.jsgrid-load-panel:before { + content: ' '; + position: absolute; + top: .5em; + left: 50%; + margin-left: -1em; + width: 2em; + height: 2em; + border: 2px solid #009a67; + border-right-color: transparent; + border-radius: 50%; + -webkit-animation: indicator 1s linear infinite; + animation: indicator 1s linear infinite; +} + +@-webkit-keyframes indicator { + from { + -webkit-transform: rotate(0deg); + } + 50% { + -webkit-transform: rotate(180deg); + } + to { + -webkit-transform: rotate(360deg); + } +} + +@keyframes indicator { + from { + transform: rotate(0deg); + } + 50% { + transform: rotate(180deg); + } + to { + transform: rotate(360deg); + } +} + +/* old IE */ +.jsgrid-load-panel { + padding-top: 1.5em\9; +} +.jsgrid-load-panel:before { + display: none\9; +} diff --git a/packages/watten/Resources/Public/Javascript/jsgrid/jsgrid-theme.min.css b/packages/watten/Resources/Public/Javascript/jsgrid/jsgrid-theme.min.css new file mode 100644 index 0000000..f369d7e --- /dev/null +++ b/packages/watten/Resources/Public/Javascript/jsgrid/jsgrid-theme.min.css @@ -0,0 +1,7 @@ +/* + * jsGrid v1.5.3 (http://js-grid.com) + * (c) 2016 Artem Tabalin + * Licensed under MIT (https://github.com/tabalinas/jsgrid/blob/master/LICENSE) + */ + +.jsgrid-edit-row>.jsgrid-cell,.jsgrid-filter-row>.jsgrid-cell,.jsgrid-grid-body,.jsgrid-grid-header,.jsgrid-header-row>.jsgrid-header-cell,.jsgrid-insert-row>.jsgrid-cell{border:1px solid #e9e9e9}.jsgrid-header-row>.jsgrid-header-cell{border-top:0}.jsgrid-filter-row>.jsgrid-cell,.jsgrid-header-row>.jsgrid-header-cell,.jsgrid-insert-row>.jsgrid-cell{border-bottom:0}.jsgrid-filter-row>.jsgrid-cell:first-child,.jsgrid-header-row>.jsgrid-header-cell:first-child,.jsgrid-insert-row>.jsgrid-cell:first-child{border-left:none}.jsgrid-filter-row>.jsgrid-cell:last-child,.jsgrid-header-row>.jsgrid-header-cell:last-child,.jsgrid-insert-row>.jsgrid-cell:last-child{border-right:none}.jsgrid-header-row .jsgrid-align-left,.jsgrid-header-row .jsgrid-align-right{text-align:center}.jsgrid-grid-header{background:#f9f9f9}.jsgrid-header-scrollbar{scrollbar-arrow-color:#f1f1f1;scrollbar-base-color:#f1f1f1;scrollbar-3dlight-color:#f1f1f1;scrollbar-highlight-color:#f1f1f1;scrollbar-track-color:#f1f1f1;scrollbar-shadow-color:#f1f1f1;scrollbar-dark-shadow-color:#f1f1f1}.jsgrid-header-scrollbar::-webkit-scrollbar{visibility:hidden}.jsgrid-header-scrollbar::-webkit-scrollbar-track{background:#f1f1f1}.jsgrid-header-sortable:hover{cursor:pointer;background:#fcfcfc}.jsgrid-header-row .jsgrid-header-sort{background:#c4e2ff}.jsgrid-header-sort:before{content:" ";display:block;float:left;width:0;height:0;border-style:solid}.jsgrid-header-sort-asc:before{border-width:0 5px 5px;border-color:transparent transparent #009a67}.jsgrid-header-sort-desc:before{border-width:5px 5px 0;border-color:#009a67 transparent transparent}.jsgrid-grid-body{border-top:none}.jsgrid-cell{border:1px solid #f3f3f3}.jsgrid-grid-body .jsgrid-alt-row:first-child .jsgrid-cell,.jsgrid-grid-body .jsgrid-row:first-child .jsgrid-cell{border-top:none}.jsgrid-grid-body .jsgrid-cell:first-child{border-left:none}.jsgrid-grid-body .jsgrid-cell:last-child{border-right:none}.jsgrid-row>.jsgrid-cell{background:#fff}.jsgrid-alt-row>.jsgrid-cell{background:#fcfcfc}.jsgrid-header-row>.jsgrid-header-cell{background:#f9f9f9}.jsgrid-filter-row>.jsgrid-cell{background:#fcfcfc}.jsgrid-insert-row>.jsgrid-cell{background:#e3ffe5}.jsgrid-edit-row>.jsgrid-cell{background:#fdffe3}.jsgrid-selected-row>.jsgrid-cell{background:#c4e2ff;border-color:#c4e2ff}.jsgrid-nodata-row>.jsgrid-cell{background:#fff}.jsgrid-invalid input,.jsgrid-invalid select,.jsgrid-invalid textarea{background:#ffe3e5;border:1px solid #ff808a}.jsgrid-pager-current-page{font-weight:700}.jsgrid-pager-nav-inactive-button a{color:#d3d3d3}.jsgrid-button+.jsgrid-button{margin-left:5px}.jsgrid-button:hover{opacity:.5;transition:opacity 200ms linear}.jsgrid .jsgrid-button{width:16px;height:16px;border:none;cursor:pointer;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAFgEAYAAADx4WWjAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAZjElEQVR42u2deVyU1f7HzzyzDzCA7MgihCsY7uYOiZIamebVFl/Wy8zSxLTQuld/lmIuCGIu9cruLa9lXlNTUQsVUgQRNBbZF5F9lWEbZpj9/P74doQZ87LMDHjvPe9/vj7MPOf5fp6zjc/3e86D0H8rNTVRUd988/rrxpZTV3f48PHjixb1m+N5eVOmvP76hQtXryKEEMYVFWFhERG7dvW2nIKC4OBVq/71L1JOWdk774SHb9tmcoc1mpaWtjYLi6Ki+fPff/+f/7x2DS6YlobQpEkYJyQgxOViXFGxYUNExN693ZVXWDh//urV339/8yZCQiGUM3EixqTcqqq//e3gwQ8+MJkAnU6tVqvZbKk0KSkj47nnfv/d2nrcOInk1i2EHBw6HSBCyss3btyz53Eh4PiJEwkJCAkEGKenIzRlCsaJiQhZW2OcmentHRhYUCCX5+Tcv+/nZ/KaIKjVlZUSibPz3bu2tv7+jY1JSQjZ22P8++8ITZiA8c2bCIlEGNfU7Njx9dcbN5aXv/fe55/v2kXueFfHrawwzsjw8po1Kz9fp5PJVCoOx9T+sp4spLq6qcnJKTPTzy8wMDtbpWpurqlxcBAIEPL2RkihQKi8HCEWCyEOByGBACEPD4RkMoSysxGyshoxYtKkvLxnn83IiI3192cYoZDL1WjMduefhEbT2Njebm2dnT1x4sKFt26lpCDk7Q01Mm5cp719GyEPD4zz8+fNe/PNixcx1moxZhhz+9ftBTgce3tLy9ZWodDT08enqEirRUguh89YrE6r1SLU3o6QWDx27HPP3bjBYrHZLJZO1+933JDCwnnzVq8+eZJ0xvR0hKZNwzg5GSF3d4xJjXRt+2IxxpWVYWFRUX/964A5npc3e/aKFT/+aNg5k5IQsrPDOC9v/PjXX09Nzcpyc3vhhbKy5GSEXFygSY0fD6MWj4dxRcWmTZGRW7b0m+P5+dOnr1jx00+Gw+HNmwhZWmKcmTliRFBQdjb5vlrd1NTSYm2dmsrnDx0qlycnI+TsrC9EIMC4ouKDDyIitm41ucNqtUTS3GxlVVQ0f/66dZ0TWUYGQjNmQJPo6rhOp1RqtWy2YTkKRUFBVdXQoampPN7QoR0dt26BkPR0hCZPxpjMyDCRbdxoMgE6nUqlVnO5UmlSUmbmtGl374rFY8c2NcXFwQXv3RsxIigoKwtjpVKr7X5UUSgKCiorfXxSU0Wi4cOl0vh4KCcz08srMPD+fbk8O7u4+NlnTV4ThI6OrKzS0qFDc3JCQpYuPX1ap+vo0Ggev+PdIZPduVNY6O+flRUUFBLyyy9arVSqUAiFZnPcEI2mrq611cbG2HJUqrKyhgZX135znEKhUCgUCoVCoVAoFAqFQvlP4FGIyd//wIGYGPL0eOFCsOSRooWF/jHG3RT7R7kkwNHeDpY8W7106d69DRteesn4p9UGQbdZs8BOmAD26FGwajVYS8veFd/RAZbExtatA6tUgjW5gFdfBXv4MFhnZ7hTpEZ6D9TsiRNwFBsL9u23jXWc8FiUEi5IwqFlZWBLSkAIqaGeOn7uHBzNnAl2yBAoRyo1lYDHnvfDBUiV+/qCfeYZcOjs2Z45/s03cBQQAHbUKFM7TmB19wVwyNMTjlJSwCYlgW1tBUtqjM8HGxwMdsYMcDw319SOE7qNuIAD5eVwtGwZ2CVLwFpbgyU1RvrQypXmdrzHAvQhTaCoCOzy5eDoqlVwnJEBtqnJ3I73UQAJEQkEYG1t9T8nf++/UJKRqQBsNvSR3sfQBkiASPTHaX+cV1sLTUirhWNWt4PCAAuorQU7aBDYpUv1P5fJwJo+rcZoAfqjyvvvgz18GJpQXh4cjxkD1vTjvdEC9IUcOwZHZDglwyyEtREqLu4vARQKhUKhUCgUCoVCoVAoFMp/JL1+GAuLe0isbM8esCScum/fhAkIpaWdP9/vAsCxyEg4mjsX7MOHYA2XEE6ZAtbKSv/vJBx786b+eVwuWEdHsHFxINT4xUAGT5G9vMA6O4NtbgZrbw+WPJVOTARLHrMTS+LC48aBbWsD29gI1sFB/zrGYyCAhIpIXJgE927fBktCSCtXgv31V/07v3gx2DVrwA4dCjYwEOzp02DPnDGTAJJSQCLq48eDhdVlCB05Apa0fdKESFxg506wOTlgSVDwtdfAkiaZkAC2vt5YAQaP10kA4949/b8/KcWARGQMAxrk76TJEFJTwVZWGuv4YwKgU5FQEYn/EkjwjrRxQwyTP8ioRM4j1NTAdQzLN4EAfVpa9I9JDSgUYEmb77ogtyvkcxL4Jpg+cvMEASTiQiBtndQQEWIogNQE+Zz0KYLp48dPEFBSon9MhlUS/yXDIhk+iQDSxFQqsGKxfjkkQG52AWT8N1yRTZYmks8N5wHSREjc2MlJ/3zTdd5uBJBF54Zt1s4OLJmgyJ0nAkjNkBwKMgOTpkfOM7sAMkoYdmYyqvzZqvquDhKhBJJy9qRRzIQCYJgjna2qSv9TMk+QpkCakkSi/33iMIFMWGQiMx3dRNQNL0gi825uYEeNAks6rYsL2Dfe0D+PjP9kxu43Afn5YOfNAxsSApYMk6SzkiZE/u7tDZb8GjWc2SkUCoVCoVAoFAqFQqFQKBTjMNuiHViaMmQIHJFNgqOjYQVIRcVTKwAcJ2swydJFEuEhi0sDAvRXCPYdk20pC46TQAiJIxgG/0iN/PILfN/DY8AF6C8WTU8Hu3YtWPIQ2HBNJXko/MMPxl6/z+u9wHGSOhATA5Y8nSZbnhcWgiXLch88AEtibl9/bayAXvcBcHzwYDgiKQfdpQ6Q9cW//AKWy4U+QCL3/SAAHCc5EyRyTxa+9RQfH3DcMIjYd7ptQvqdjaQIkM7YHSQ2tmSJqR3vVgA4TqKMpI331HHCokXg+MWLpnb8iQL0R5UbN/rm+MKF5nacYLAxBgkVVVeDJaNKT1m8GBwnuxmYH7b+cEi21ScB7qlT//3ppI2TO06aWv/xx0Tm7g72wgWwZCOLjz7689NITgS545cu9bfjBI6+Q6TTkt8wpEZIqtknn4B95ZWBuuOG/FEDZC8VAo8HliRnkJ8IU6eC46SmBp4/aoC0ebKnyq1bYElKQWEhOE5+GlAoFAqFQqFQKBQKhUKhUCgDi8nCrKdOFRffuTN+/LJlMTEREdevIyQUkuAqPPPu6JBKEbp6ddmy7dtDQubOdXPz9SUBk75jsk0dWSwWi8Xi8xFiGDbbygpsVwFwzGIhxGIZLpB7CgQAGg1CGMOjYmIJXY/JmhvjMfu7U80NFTDQUAEEnc6w0/6HCfDyEovt7auru442+oJ0Oq0WITc3CwtbW7Kk0Xg4P/10//6dO7D4n8Uiq097/mJkPp/N5nC02t9+q6rKzx89GiGBgIzyMP6zWGB5PKEQoZMni4tTUwMCLl4sLc3MFAg6OrRatbrn2z5DTTMMl8swDKNUshCKilqyBOPOiae3TYE4yGZDdpBAALkoGOvfBhYLFu12dMCaV6iR3l+PnMflCgQdHRyY8lUqEMDj9b5A8m0ixNDxzu/B36EmOq/T272qQQCbzeUKhUolB4oATX3b9rr3Z5Gm1Sm99+fDOVotB35kCYXGNyFyvlBImhD5BrnT0IRUKlhtbFwT0mi0Wo1m0CDWtWuVlbm5s2aBI2TRf8/fJ8/lMgybrVbn5zc319b6+a1Zc/36t98ePtzZJ4jjSqVcjlBExKxZK1Zs3jxpkqOjl9edO2q1TqfVksGjezDGGGMOh81msRhGJuPMmePuboqftZmZjY3l5QUFCKlUCsXhw11HI7jDarVKhVBIiKenv39MzMiRtrYuLsbHnU02D+TmNjXV1np6du2c+m2bYRgGoaoqmay5meRmGI/JBEBT+jPHzQv9LTTQUAEDjcn+Tww/srjczgmKWDJrwjHGCGFM8pGeIgHw61Au5/G4XIGgoYFhuFyBoPPXjk6n0ajVLBZMQP33hggKhUKhUCgUCoVCoVAoFAoFIYTQhx8mJHz//dq1CO3b9/LLLS0IRUQsXNjSsm3b7ds//fThh/3tT6+fzEFekK0t/Ivsbkw+M9ws2Pz04eEuxhgrlX+eF0S2rH2qBTxd9FrAk5I6GKZ/Q0uEXvcBFxdLSxuburquj9ExRsjBgc+3sGho6HcBH32UkHD8eGgoxHOFQmjThlkOGNvYCARCYXt7XFx1dUHBCy8gJBTC1vBQH2fPlpZmZISE7NiRknLmDIvV2qpSKRQWFlBeZ91AnJdhWCyGYRiZLCpq5szly8mbJXoPC6F9+xYuxBghFotE6v8810Gng78LBJBOKRLpj0FyOWx4rlBAJB7Cqo9DymcYCG+HhZ092/fGx3k8v+dJof/HR50/vyxxsOt9//flGANn27bp05cv37wZxnUSWyepBp0vRrCzEwgsLEgTCgq6eLGkJC1twQIiPDjY03PMmCtX5s718Bg16sqVtjalsqNDJAInSV3AkU7H4bBYLBab3d6+fTtCP/9svJAeExWVlnbx4vLlCO3Z8+KLGCO0e/eCBRgfOZKRERv77rv96ArUQG9PKC9va5NInJ07kzmgKdTXKxRSKdmfov/o9TzA4zFM/72F3gwCIEw60G530ut7CeO4QNB1tOkcVQzfO/MUCmCzGYbNbmyEcby1lQhgGIZhsfp/JqZQKBQKhUKhUCgUCoVCofxv0uPAQmNjW1tbm5NTfX1ra3Pzyy9LJFKpVDp9Oiy/cnXV6XQ6na69ncfj8bjcjAw7O0tLK6vz5729nZ1dXDIzzSWg2ydzKSlFRfn5lpbNzTKZVLpwYUtLe3t7+xtvqFQajUYzdqxWi5BOZ2mJMUTN1GqdTqcjb0cXiUpL6+vr6trbvbycnJyd79/vtxqorJRIHj4cOTI7u7y8rOz0aY1Gq9VqfX0h0I0Ql8tmczgPH8Kz0oICCIU4OkIUc/hwEIgQj8fhcDgajY+Pi4uLyzvvDBvm6urmduyYqQQ89nS6rq6lpalpzJi8vMrKioq4OHDI11ck4vEEghs3LCz4fIFgzhxwzNNz3rxx4yZMmDmTx+NyudyRIwUCHo/HGz5cLBaJRKIjR0AuhwM34rvvSkrq6mprN240Ww1cuZKenpaWmalUajQajb+/lZVQKBB8+WVg4OjR/v7vv9/bC1y/np19797LL0ON/PxzR4darVKxWFOnDh8+cuS0aY6O1tY2NsnJfa4BuVyhUCjc3cvLGxrq69evl8tVKqXS318k4vN5vOvX++o4Ac4/fx5q7IMPSHShpKS2trZ23z5ja4ApL29sbGgIDq6qamqSSF56ic2G8CjYnTuNvYC+kEOHBAIul8stK2tr6+iQy6dOLStraKir6+17DLoIaG6WyWSyoCCFQq1Wq6dO5XI5HA6npgbu0+3bphLw6IIMwzDMtWtk1WtDQ0tLS8vEiX0uD9anOzoyDEKdK7rJjt+mzz6BUaywkAReVSqtVqcj7+TogwCtVqfT6eRyksQBw6GDA3xsrnCevb3+XghqdZ8FQGdNT+dwGIZh8vNBkK8vCOnt+we6B2bsqVPBImRjIxKJRH2f4BgvLwcHJ6cLF5ydbW1tbGJjVSqtVqMhaTVhYaZyPD4+MzM9fc4cjQZjjGfOtLQUi8XikhJfXw+PIUN+/bXPAmxtraysrNLS7O3FYmvrL7+EO9/erlSq1Wp1aOj16zk5WVmQUtA3x+/dy8iwsdHptFqtNjqax3N0dHREaNiwIUO8vDZvNvbGPJqJ7eysrMTi+/dHjHBzc3ffvFmhUKlUKoRUKrVarT53Diakdevi47OyMjO73wsF7viMGRhrtVptQoKFxZgxY8b4+ra0XLp0+TJCpaV790ZEGN/Hnvhb6MGDurra2vXrc3MrKysqoqNJ0gaPx2az2ZWVMBxevgyjSlkZhFutraHpzZ4N6SKTJgkEDg4ODghJJBcvXryIUEXFRx9t2oSQTCaXy+UIBQVFRkZGrls3bVpYWFhY7/OGuv05XVvb1NTUNHFicXFtbU3NoUMKhVqtUk2eDD/iyLDY+X2MoXNaWg4aZGf34IG7u6urq2tYWE7O6tXvvhsQcPfusWPHjq1fb23t7e3tjZBUWl1dXY3QvHmHDh06tGHDhAmrV69e/cUXJhNgSFWVRNLY6OtbXS2RSCQTJqjVsEUI5GApldbWIpFIVFDg6enu7uGRlGRpyWKxWJ27msXFbdmyZcvBgykpUVFRUaGhYrG7u7s7Qm1tICQ4ODIyMnLTpokT165duzYyss9ty9xcv/7ZZ599duDAzp1CoVCIcVSUm5ubG8bkOCkpIiIiYseOgfazWxISwsPDw6Ojw8N5PB4P46iowYMHD8Z4506RSCTCODFx9+7du033m8xsgKO7du3cKRAIBBgfPOjj4+PTKeTKlbCwsLC9ewfaz25JSTl06NCh8PDwcD6fz8d49247Ozs7jD/5hM1mszHOyzt79uzZ0FC5vKGhoWHIkKcuc/e550JDQ0P/7/+Cg/fv379/yxadDuYjS0sLCwsLhLhcoVAolEoRYrPZbKVyoP19IgpFa2trq739jz+GhISEnDhx8uTixYsXHz/e0dHc3NxsazvQ/lEoFAqFQqFQKBQKhUKhUChG0U2ERiBob1cqFYp9+ySStjapdP58iGa2tdnbW1uLxTt3jhzp5ubhcfbsUyMgL6+qqqIiKKisrKGhvv7YMUg5GDwY4jFlZbDlu7W1VouxTicUWltbWFhYXL7s7m5nZ2+/dKmHh4ODo2PP319gLI8e7hYV1dRUVQUGlpc3NDQ0XLum1ep0GJeWwtLDCRMglDRsGJvNZjPM4MEcDofD4Xz4YX19S0tz8yuv1NQ0NUkksbH9XgUymULR0WFvD2k29fUxMXfupKQkJvb0/Bs3cnKysvz8zp9PTU1OxhjygvovIMEUF9fV1dZu3QrRRUdHCws+n8/v+crsgAA/v2efzcnhcjkcLvf0aYlEKm1tXbPm/v3a2urqnu9q32cBLS3t7TLZsmWwGrW8fPZsf/+xY/PyelsQZLlcuaLVarUYI1Rd3dTU3Gz+Fd4MQgixWCT3zdLyt9+yszMze79NAkTibW2hHB5PKOTxeDzymngzCvDxcXZ2cgoP1+lg7wKVSqPRalev7m1BGHO5XO6qVba2Hh7u7ikpkyYNHTpsWHOzuQU84s6d4uKCgpiY06eTkxMTMYbOOWpUd+fFxxcW5udv356QUF9fW4txeXlZWWlp3zOwesujplJd3dTU2CgQlJXV1zc0nD/f1NTeLpUGB8OmL6dPw7B57RpE4p2ctFoej8t99VWRaNAgOztf39zc5ctXrECIzy8vLy8/dWrSpC1btmxZvtzff+XKlSt7/kqM3vJoHhg8eNAge3uFYtq0kSNHjXrhBVdXW1s7ux07RCI+n8+fOBEmtM8/hy3KQ0OHDHnmGR+fqioXl4cPJZIXX9Tp0tLS0lJSiopKSkpKli0rKrp69erVc+dyck6dOnWq/9faP0ZiYl5ebq6bW2pqQUF+/uM7OV27tm5daKit7YkTISEhIUlJkEiD8fHjwcHBwcnJKSkHDx482PfUsn7jzp2vvvrqKzu7b78NCAgIyMjYtIkImT179uz4+Nu3o6Ojo21sBtrPbklOjoyMjLS0PH48KCgoKC5u/XoQcvTojBkzZmRkyGR1dXV1gwcbex2z7dExdWpYWFhYe3tVVWpqaurChTKZVCqVPniAsUaj0bi58flisVjc92Q/swsguLlNnjx5skx26dKqVatW/eMfarVGo9HodAzD5/P5Eom5r0+hUCgUCoVCoVAoFAqFQqH8b3PsWHFxauqLLx49mp+fmLho0UD702Nyc1ta6urc3RHas2fBAowR2rkzOBjjTz+9e/fCBeO3ZzDbKiaZTKNRqRgmIOD06e3bb95EiMuFMIdGo1Ih9N13hYXJyatWPbUCnn/+3Lndu2NjHz5sbKyoGDKEOO7q6uHh51dRkZPzl7989tnkyU+dgDfeiI//+9+/+CI1tbDw1q05cxDi80UihBiGz7ew0Gji4195ZevW558Xi/l8oRD2yX8q2LUrMzM29r33EAoPDwrCGKEvvnjtNYwR2rVrwQKMY2OrqwsKnn/ebA6MHn3y5JYtiYlTppw6tW1bz9e4x8RUVOTkzJpFNpFH6MABcBw6a3R0Ts5vv61dazbH58y5dGn//h9+QGjr1mnTOi88evQPP3z88Y0bdXUKhUz2eJQxL6+lpa7OzQ2h6OhXX1WpEIqOXroUY4R27JgzB+OVKxMSjh//6iuzOf4HzPTpzs5Dh2ZmImRt7eSEEEIikViMUHZ2dXVBwaxZfn7ffbd+fV7egwetrQ0NnUsAAwLOnAkPv3ULIY1GqeRyEZLL29oQmjnTzy8wMD7+229nzVqxYs0acwt4FOi+cqWqKi8vIGDRonPndu+OiZHLOzqkUisr8ioKe3t7e0/PsjIPDyurQYNKS9PTy8uzsgIDEVKrlUqEXF3t7T08KisfPHjrrQMHvLwEAjabwyFv6e4HAYQHD6RSicTNbc6cM2d27IiLKympqSksHD4cISsre3uEEMIY3IL9JxBiGDZbpyspefvtI0e8vJ55xsrKzq6iwtyOEx4bRr29razs7KqqcnLefHP//tGj584dOXLmzMuXEWptra8HAbDDgVqtUCD0669Llnz66dy5/e14r3nrrbi4o0ePHkXo44/HjcN4796srGvXNmwYaL96TVxcZWVu7owZA+3Hfw3/D73/bnBl1mLvAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-color:transparent}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2){.jsgrid .jsgrid-button{background-image:url(data:image/png;base64,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);background-size:24px 352px}}.jsgrid .jsgrid-mode-button{width:24px;height:24px}.jsgrid-mode-on-button{opacity:.5}.jsgrid-cancel-edit-button{background-position:0 0;width:16px;height:16px}.jsgrid-clear-filter-button{background-position:0 -40px;width:16px;height:16px}.jsgrid-delete-button{background-position:0 -80px;width:16px;height:16px}.jsgrid-edit-button{background-position:0 -120px;width:16px;height:16px}.jsgrid-insert-mode-button{background-position:0 -160px;width:24px;height:24px}.jsgrid-insert-button{background-position:0 -208px;width:16px;height:16px}.jsgrid-search-mode-button{background-position:0 -248px;width:24px;height:24px}.jsgrid-search-button{background-position:0 -296px;width:16px;height:16px}.jsgrid-update-button{background-position:0 -336px;width:16px;height:16px}.jsgrid-load-shader{background:#ddd;opacity:.5;filter:alpha(opacity=50)}.jsgrid-load-panel{width:15em;height:5em;background:#fff;border:1px solid #e9e9e9;padding-top:3em;text-align:center}.jsgrid-load-panel:before{content:' ';position:absolute;top:.5em;left:50%;margin-left:-1em;width:2em;height:2em;border:2px solid #009a67;border-right-color:transparent;border-radius:50%;-webkit-animation:indicator 1s linear infinite;animation:indicator 1s linear infinite}@-webkit-keyframes indicator{from{-webkit-transform:rotate(0deg)}50%{-webkit-transform:rotate(180deg)}to{-webkit-transform:rotate(360deg)}}@keyframes indicator{from{transform:rotate(0deg)}50%{transform:rotate(180deg)}to{transform:rotate(360deg)}} \ No newline at end of file diff --git a/packages/watten/Resources/Public/Javascript/jsgrid/jsgrid.css b/packages/watten/Resources/Public/Javascript/jsgrid/jsgrid.css new file mode 100644 index 0000000..a59154f --- /dev/null +++ b/packages/watten/Resources/Public/Javascript/jsgrid/jsgrid.css @@ -0,0 +1,126 @@ +/* + * jsGrid v1.5.3 (http://js-grid.com) + * (c) 2016 Artem Tabalin + * Licensed under MIT (https://github.com/tabalinas/jsgrid/blob/master/LICENSE) + */ + +.jsgrid { + position: relative; + overflow: hidden; + font-size: 1em; +} + +.jsgrid, .jsgrid *, .jsgrid *:before, .jsgrid *:after { + box-sizing: border-box; +} + +.jsgrid input, +.jsgrid textarea, +.jsgrid select { + font-size: 1em; +} + +.jsgrid-grid-header { + overflow-x: hidden; + overflow-y: scroll; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; +} + +.jsgrid-grid-body { + overflow-x: auto; + overflow-y: scroll; + -webkit-overflow-scrolling: touch; +} + +.jsgrid-table { + width: 100%; + table-layout: fixed; + border-collapse: collapse; + border-spacing: 0; +} + +.jsgrid-cell { + padding: 0.5em 0.5em; +} + +.jsgrid-сell, +.jsgrid-header-cell { + box-sizing: border-box; +} + +.jsgrid-align-left { + text-align: left; +} + +.jsgrid-align-center, +.jsgrid-align-center input, +.jsgrid-align-center textarea, +.jsgrid-align-center select { + text-align: center; +} + +.jsgrid-align-right, +.jsgrid-align-right input, +.jsgrid-align-right textarea, +.jsgrid-align-right select { + text-align: right; +} + +.jsgrid-header-cell { + padding: .5em .5em; +} + +.jsgrid-filter-row input, +.jsgrid-filter-row textarea, +.jsgrid-filter-row select, +.jsgrid-edit-row input, +.jsgrid-edit-row textarea, +.jsgrid-edit-row select, +.jsgrid-insert-row input, +.jsgrid-insert-row textarea, +.jsgrid-insert-row select { + width: 100%; + padding: .3em .5em; +} + +.jsgrid-filter-row input[type='checkbox'], +.jsgrid-edit-row input[type='checkbox'], +.jsgrid-insert-row input[type='checkbox'] { + width: auto; +} + + +.jsgrid-selected-row .jsgrid-cell { + cursor: pointer; +} + +.jsgrid-nodata-row .jsgrid-cell { + padding: .5em 0; + text-align: center; +} + +.jsgrid-header-sort { + cursor: pointer; +} + +.jsgrid-pager { + padding: .5em 0; +} + +.jsgrid-pager-nav-button { + padding: .2em .6em; +} + +.jsgrid-pager-nav-inactive-button { + display: none; + pointer-events: none; +} + +.jsgrid-pager-page { + padding: .2em .6em; +} diff --git a/packages/watten/Resources/Public/Javascript/jsgrid/jsgrid.js b/packages/watten/Resources/Public/Javascript/jsgrid/jsgrid.js new file mode 100644 index 0000000..922bcdf --- /dev/null +++ b/packages/watten/Resources/Public/Javascript/jsgrid/jsgrid.js @@ -0,0 +1,2516 @@ +/* + * jsGrid v1.5.3 (http://js-grid.com) + * (c) 2016 Artem Tabalin + * Licensed under MIT (https://github.com/tabalinas/jsgrid/blob/master/LICENSE) + */ + +(function(window, $, undefined) { + + var JSGRID = "JSGrid", + JSGRID_DATA_KEY = JSGRID, + JSGRID_ROW_DATA_KEY = "JSGridItem", + JSGRID_EDIT_ROW_DATA_KEY = "JSGridEditRow", + + SORT_ORDER_ASC = "asc", + SORT_ORDER_DESC = "desc", + + FIRST_PAGE_PLACEHOLDER = "{first}", + PAGES_PLACEHOLDER = "{pages}", + PREV_PAGE_PLACEHOLDER = "{prev}", + NEXT_PAGE_PLACEHOLDER = "{next}", + LAST_PAGE_PLACEHOLDER = "{last}", + PAGE_INDEX_PLACEHOLDER = "{pageIndex}", + PAGE_COUNT_PLACEHOLDER = "{pageCount}", + ITEM_COUNT_PLACEHOLDER = "{itemCount}", + + EMPTY_HREF = "javascript:void(0);"; + + var getOrApply = function(value, context) { + if($.isFunction(value)) { + return value.apply(context, $.makeArray(arguments).slice(2)); + } + return value; + }; + + var normalizePromise = function(promise) { + var d = $.Deferred(); + + if(promise && promise.then) { + promise.then(function() { + d.resolve.apply(d, arguments); + }, function() { + d.reject.apply(d, arguments); + }); + } else { + d.resolve(promise); + } + + return d.promise(); + }; + + var defaultController = { + loadData: $.noop, + insertItem: $.noop, + updateItem: $.noop, + deleteItem: $.noop + }; + + + function Grid(element, config) { + var $element = $(element); + + $element.data(JSGRID_DATA_KEY, this); + + this._container = $element; + + this.data = []; + this.fields = []; + + this._editingRow = null; + this._sortField = null; + this._sortOrder = SORT_ORDER_ASC; + this._firstDisplayingPage = 1; + + this._init(config); + this.render(); + } + + Grid.prototype = { + width: "auto", + height: "auto", + updateOnResize: true, + + rowClass: $.noop, + rowRenderer: null, + + rowClick: function(args) { + if(this.editing) { + this.editItem($(args.event.target).closest("tr")); + } + }, + rowDoubleClick: $.noop, + + noDataContent: "Not found", + noDataRowClass: "jsgrid-nodata-row", + + heading: true, + headerRowRenderer: null, + headerRowClass: "jsgrid-header-row", + headerCellClass: "jsgrid-header-cell", + + filtering: false, + filterRowRenderer: null, + filterRowClass: "jsgrid-filter-row", + + inserting: false, + insertRowRenderer: null, + insertRowClass: "jsgrid-insert-row", + + editing: false, + editRowRenderer: null, + editRowClass: "jsgrid-edit-row", + + confirmDeleting: true, + deleteConfirm: "Are you sure?", + + selecting: true, + selectedRowClass: "jsgrid-selected-row", + oddRowClass: "jsgrid-row", + evenRowClass: "jsgrid-alt-row", + cellClass: "jsgrid-cell", + + sorting: false, + sortableClass: "jsgrid-header-sortable", + sortAscClass: "jsgrid-header-sort jsgrid-header-sort-asc", + sortDescClass: "jsgrid-header-sort jsgrid-header-sort-desc", + + paging: false, + pagerContainer: null, + pageIndex: 1, + pageSize: 20, + pageButtonCount: 15, + pagerFormat: "Pages: {first} {prev} {pages} {next} {last}    {pageIndex} of {pageCount}", + pagePrevText: "Prev", + pageNextText: "Next", + pageFirstText: "First", + pageLastText: "Last", + pageNavigatorNextText: "...", + pageNavigatorPrevText: "...", + pagerContainerClass: "jsgrid-pager-container", + pagerClass: "jsgrid-pager", + pagerNavButtonClass: "jsgrid-pager-nav-button", + pagerNavButtonInactiveClass: "jsgrid-pager-nav-inactive-button", + pageClass: "jsgrid-pager-page", + currentPageClass: "jsgrid-pager-current-page", + + customLoading: false, + pageLoading: false, + + autoload: false, + controller: defaultController, + + loadIndication: true, + loadIndicationDelay: 500, + loadMessage: "Please, wait...", + loadShading: true, + + invalidMessage: "Invalid data entered!", + + invalidNotify: function(args) { + var messages = $.map(args.errors, function(error) { + return error.message || null; + }); + + window.alert([this.invalidMessage].concat(messages).join("\n")); + }, + + onInit: $.noop, + onRefreshing: $.noop, + onRefreshed: $.noop, + onPageChanged: $.noop, + onItemDeleting: $.noop, + onItemDeleted: $.noop, + onItemInserting: $.noop, + onItemInserted: $.noop, + onItemEditing: $.noop, + onItemUpdating: $.noop, + onItemUpdated: $.noop, + onItemInvalid: $.noop, + onDataLoading: $.noop, + onDataLoaded: $.noop, + onOptionChanging: $.noop, + onOptionChanged: $.noop, + onError: $.noop, + + invalidClass: "jsgrid-invalid", + + containerClass: "jsgrid", + tableClass: "jsgrid-table", + gridHeaderClass: "jsgrid-grid-header", + gridBodyClass: "jsgrid-grid-body", + + _init: function(config) { + $.extend(this, config); + this._initLoadStrategy(); + this._initController(); + this._initFields(); + this._attachWindowLoadResize(); + this._attachWindowResizeCallback(); + this._callEventHandler(this.onInit) + }, + + loadStrategy: function() { + return this.pageLoading + ? new jsGrid.loadStrategies.PageLoadingStrategy(this) + : new jsGrid.loadStrategies.DirectLoadingStrategy(this); + }, + + _initLoadStrategy: function() { + this._loadStrategy = getOrApply(this.loadStrategy, this); + }, + + _initController: function() { + this._controller = $.extend({}, defaultController, getOrApply(this.controller, this)); + }, + + renderTemplate: function(source, context, config) { + args = []; + for(var key in config) { + args.push(config[key]); + } + + args.unshift(source, context); + + source = getOrApply.apply(null, args); + return (source === undefined || source === null) ? "" : source; + }, + + loadIndicator: function(config) { + return new jsGrid.LoadIndicator(config); + }, + + validation: function(config) { + return jsGrid.Validation && new jsGrid.Validation(config); + }, + + _initFields: function() { + var self = this; + self.fields = $.map(self.fields, function(field) { + if($.isPlainObject(field)) { + var fieldConstructor = (field.type && jsGrid.fields[field.type]) || jsGrid.Field; + field = new fieldConstructor(field); + } + field._grid = self; + return field; + }); + }, + + _attachWindowLoadResize: function() { + $(window).on("load", $.proxy(this._refreshSize, this)); + }, + + _attachWindowResizeCallback: function() { + if(this.updateOnResize) { + $(window).on("resize", $.proxy(this._refreshSize, this)); + } + }, + + _detachWindowResizeCallback: function() { + $(window).off("resize", this._refreshSize); + }, + + option: function(key, value) { + var optionChangingEventArgs, + optionChangedEventArgs; + + if(arguments.length === 1) + return this[key]; + + optionChangingEventArgs = { + option: key, + oldValue: this[key], + newValue: value + }; + this._callEventHandler(this.onOptionChanging, optionChangingEventArgs); + + this._handleOptionChange(optionChangingEventArgs.option, optionChangingEventArgs.newValue); + + optionChangedEventArgs = { + option: optionChangingEventArgs.option, + value: optionChangingEventArgs.newValue + }; + this._callEventHandler(this.onOptionChanged, optionChangedEventArgs); + }, + + fieldOption: function(field, key, value) { + field = this._normalizeField(field); + + if(arguments.length === 2) + return field[key]; + + field[key] = value; + this._renderGrid(); + }, + + _handleOptionChange: function(name, value) { + this[name] = value; + + switch(name) { + case "width": + case "height": + this._refreshSize(); + break; + case "rowClass": + case "rowRenderer": + case "rowClick": + case "rowDoubleClick": + case "noDataRowClass": + case "noDataContent": + case "selecting": + case "selectedRowClass": + case "oddRowClass": + case "evenRowClass": + this._refreshContent(); + break; + case "pageButtonCount": + case "pagerFormat": + case "pagePrevText": + case "pageNextText": + case "pageFirstText": + case "pageLastText": + case "pageNavigatorNextText": + case "pageNavigatorPrevText": + case "pagerClass": + case "pagerNavButtonClass": + case "pageClass": + case "currentPageClass": + case "pagerRenderer": + this._refreshPager(); + break; + case "fields": + this._initFields(); + this.render(); + break; + case "data": + case "editing": + case "heading": + case "filtering": + case "inserting": + case "paging": + this.refresh(); + break; + case "loadStrategy": + case "pageLoading": + this._initLoadStrategy(); + this.search(); + break; + case "pageIndex": + this.openPage(value); + break; + case "pageSize": + this.refresh(); + this.search(); + break; + case "editRowRenderer": + case "editRowClass": + this.cancelEdit(); + break; + case "updateOnResize": + this._detachWindowResizeCallback(); + this._attachWindowResizeCallback(); + break; + case "invalidNotify": + case "invalidMessage": + break; + default: + this.render(); + break; + } + }, + + destroy: function() { + this._detachWindowResizeCallback(); + this._clear(); + this._container.removeData(JSGRID_DATA_KEY); + }, + + render: function() { + this._renderGrid(); + return this.autoload ? this.loadData() : $.Deferred().resolve().promise(); + }, + + _renderGrid: function() { + this._clear(); + + this._container.addClass(this.containerClass) + .css("position", "relative") + .append(this._createHeader()) + .append(this._createBody()); + + this._pagerContainer = this._createPagerContainer(); + this._loadIndicator = this._createLoadIndicator(); + this._validation = this._createValidation(); + + this.refresh(); + }, + + _createLoadIndicator: function() { + return getOrApply(this.loadIndicator, this, { + message: this.loadMessage, + shading: this.loadShading, + container: this._container + }); + }, + + _createValidation: function() { + return getOrApply(this.validation, this); + }, + + _clear: function() { + this.cancelEdit(); + + clearTimeout(this._loadingTimer); + + this._pagerContainer && this._pagerContainer.empty(); + + this._container.empty() + .css({ position: "", width: "", height: "" }); + }, + + _createHeader: function() { + var $headerRow = this._headerRow = this._createHeaderRow(), + $filterRow = this._filterRow = this._createFilterRow(), + $insertRow = this._insertRow = this._createInsertRow(); + + var $headerGrid = this._headerGrid = $("").addClass(this.tableClass) + .append($headerRow) + .append($filterRow) + .append($insertRow); + + var $header = this._header = $("
").addClass(this.gridHeaderClass) + .addClass(this._scrollBarWidth() ? "jsgrid-header-scrollbar" : "") + .append($headerGrid); + + return $header; + }, + + _createBody: function() { + var $content = this._content = $("
"); + + var $bodyGrid = this._bodyGrid = $("
").addClass(this.tableClass) + .append($content); + + var $body = this._body = $("
").addClass(this.gridBodyClass) + .append($bodyGrid) + .on("scroll", $.proxy(function(e) { + this._header.scrollLeft(e.target.scrollLeft); + }, this)); + + return $body; + }, + + _createPagerContainer: function() { + var pagerContainer = this.pagerContainer || $("
").appendTo(this._container); + return $(pagerContainer).addClass(this.pagerContainerClass); + }, + + _eachField: function(callBack) { + var self = this; + $.each(this.fields, function(index, field) { + if(field.visible) { + callBack.call(self, field, index); + } + }); + }, + + _createHeaderRow: function() { + if($.isFunction(this.headerRowRenderer)) + return $(this.renderTemplate(this.headerRowRenderer, this)); + + var $result = $("
").addClass(this.headerRowClass); + + this._eachField(function(field, index) { + var $th = this._prepareCell("").addClass(this.filterRowClass); + + this._eachField(function(field) { + this._prepareCell("").addClass(this.insertRowClass); + + this._eachField(function(field) { + this._prepareCell("").addClass(this.noDataRowClass) + .append($(""); + this._renderCells($result, item); + } + + $result.addClass(this._getRowClasses(item, itemIndex)) + .data(JSGRID_ROW_DATA_KEY, item) + .on("click", $.proxy(function(e) { + this.rowClick({ + item: item, + itemIndex: itemIndex, + event: e + }); + }, this)) + .on("dblclick", $.proxy(function(e) { + this.rowDoubleClick({ + item: item, + itemIndex: itemIndex, + event: e + }); + }, this)); + + if(this.selecting) { + this._attachRowHover($result); + } + + return $result; + }, + + _getRowClasses: function(item, itemIndex) { + var classes = []; + classes.push(((itemIndex + 1) % 2) ? this.oddRowClass : this.evenRowClass); + classes.push(getOrApply(this.rowClass, this, item, itemIndex)); + return classes.join(" "); + }, + + _attachRowHover: function($row) { + var selectedRowClass = this.selectedRowClass; + $row.hover(function() { + $(this).addClass(selectedRowClass); + }, + function() { + $(this).removeClass(selectedRowClass); + } + ); + }, + + _renderCells: function($row, item) { + this._eachField(function(field) { + $row.append(this._createCell(item, field)); + }); + return this; + }, + + _createCell: function(item, field) { + var $result; + var fieldValue = this._getItemFieldValue(item, field); + + var args = { value: fieldValue, item : item }; + if($.isFunction(field.cellRenderer)) { + $result = this.renderTemplate(field.cellRenderer, field, args); + } else { + $result = $("").addClass(this.editRowClass); + + this._eachField(function(field) { + var fieldValue = this._getItemFieldValue(item, field); + + this._prepareCell("
", field, "headercss", this.headerCellClass) + .append(this.renderTemplate(field.headerTemplate, field)) + .appendTo($result); + + if(this.sorting && field.sorting) { + $th.addClass(this.sortableClass) + .on("click", $.proxy(function() { + this.sort(index); + }, this)); + } + }); + + return $result; + }, + + _prepareCell: function(cell, field, cssprop, cellClass) { + return $(cell).css("width", field.width) + .addClass(cellClass || this.cellClass) + .addClass((cssprop && field[cssprop]) || field.css) + .addClass(field.align ? ("jsgrid-align-" + field.align) : ""); + }, + + _createFilterRow: function() { + if($.isFunction(this.filterRowRenderer)) + return $(this.renderTemplate(this.filterRowRenderer, this)); + + var $result = $("
", field, "filtercss") + .append(this.renderTemplate(field.filterTemplate, field)) + .appendTo($result); + }); + + return $result; + }, + + _createInsertRow: function() { + if($.isFunction(this.insertRowRenderer)) + return $(this.renderTemplate(this.insertRowRenderer, this)); + + var $result = $("
", field, "insertcss") + .append(this.renderTemplate(field.insertTemplate, field)) + .appendTo($result); + }); + + return $result; + }, + + _callEventHandler: function(handler, eventParams) { + handler.call(this, $.extend(eventParams, { + grid: this + })); + + return eventParams; + }, + + reset: function() { + this._resetSorting(); + this._resetPager(); + return this._loadStrategy.reset(); + }, + + _resetPager: function() { + this._firstDisplayingPage = 1; + this._setPage(1); + }, + + _resetSorting: function() { + this._sortField = null; + this._sortOrder = SORT_ORDER_ASC; + this._clearSortingCss(); + }, + + refresh: function() { + this._callEventHandler(this.onRefreshing); + + this.cancelEdit(); + + this._refreshHeading(); + this._refreshFiltering(); + this._refreshInserting(); + this._refreshContent(); + this._refreshPager(); + this._refreshSize(); + + this._callEventHandler(this.onRefreshed); + }, + + _refreshHeading: function() { + this._headerRow.toggle(this.heading); + }, + + _refreshFiltering: function() { + this._filterRow.toggle(this.filtering); + }, + + _refreshInserting: function() { + this._insertRow.toggle(this.inserting); + }, + + _refreshContent: function() { + var $content = this._content; + $content.empty(); + + if(!this.data.length) { + $content.append(this._createNoDataRow()); + return this; + } + + var indexFrom = this._loadStrategy.firstDisplayIndex(); + var indexTo = this._loadStrategy.lastDisplayIndex(); + + for(var itemIndex = indexFrom; itemIndex < indexTo; itemIndex++) { + var item = this.data[itemIndex]; + $content.append(this._createRow(item, itemIndex)); + } + }, + + _createNoDataRow: function() { + var amountOfFields = 0; + this._eachField(function() { + amountOfFields++; + }); + + return $("
").addClass(this.cellClass).attr("colspan", amountOfFields) + .append(this.renderTemplate(this.noDataContent, this))); + }, + + _createRow: function(item, itemIndex) { + var $result; + + if($.isFunction(this.rowRenderer)) { + $result = this.renderTemplate(this.rowRenderer, this, { item: item, itemIndex: itemIndex }); + } else { + $result = $("
").append(this.renderTemplate(field.itemTemplate || fieldValue, field, args)); + } + + return this._prepareCell($result, field); + }, + + _getItemFieldValue: function(item, field) { + var props = field.name.split('.'); + var result = item[props.shift()]; + + while(result && props.length) { + result = result[props.shift()]; + } + + return result; + }, + + _setItemFieldValue: function(item, field, value) { + var props = field.name.split('.'); + var current = item; + var prop = props[0]; + + while(current && props.length) { + item = current; + prop = props.shift(); + current = item[prop]; + } + + if(!current) { + while(props.length) { + item = item[prop] = {}; + prop = props.shift(); + } + } + + item[prop] = value; + }, + + sort: function(field, order) { + if($.isPlainObject(field)) { + order = field.order; + field = field.field; + } + + this._clearSortingCss(); + this._setSortingParams(field, order); + this._setSortingCss(); + return this._loadStrategy.sort(); + }, + + _clearSortingCss: function() { + this._headerRow.find("th") + .removeClass(this.sortAscClass) + .removeClass(this.sortDescClass); + }, + + _setSortingParams: function(field, order) { + field = this._normalizeField(field); + order = order || ((this._sortField === field) ? this._reversedSortOrder(this._sortOrder) : SORT_ORDER_ASC); + + this._sortField = field; + this._sortOrder = order; + }, + + _normalizeField: function(field) { + if($.isNumeric(field)) { + return this.fields[field]; + } + + if(typeof field === "string") { + return $.grep(this.fields, function(f) { + return f.name === field; + })[0]; + } + + return field; + }, + + _reversedSortOrder: function(order) { + return (order === SORT_ORDER_ASC ? SORT_ORDER_DESC : SORT_ORDER_ASC); + }, + + _setSortingCss: function() { + var fieldIndex = this._visibleFieldIndex(this._sortField); + + this._headerRow.find("th").eq(fieldIndex) + .addClass(this._sortOrder === SORT_ORDER_ASC ? this.sortAscClass : this.sortDescClass); + }, + + _visibleFieldIndex: function(field) { + return $.inArray(field, $.grep(this.fields, function(f) { return f.visible; })); + }, + + _sortData: function() { + var sortFactor = this._sortFactor(), + sortField = this._sortField; + + if(sortField) { + this.data.sort(function(item1, item2) { + return sortFactor * sortField.sortingFunc(item1[sortField.name], item2[sortField.name]); + }); + } + }, + + _sortFactor: function() { + return this._sortOrder === SORT_ORDER_ASC ? 1 : -1; + }, + + _itemsCount: function() { + return this._loadStrategy.itemsCount(); + }, + + _pagesCount: function() { + var itemsCount = this._itemsCount(), + pageSize = this.pageSize; + return Math.floor(itemsCount / pageSize) + (itemsCount % pageSize ? 1 : 0); + }, + + _refreshPager: function() { + var $pagerContainer = this._pagerContainer; + $pagerContainer.empty(); + + if(this.paging) { + $pagerContainer.append(this._createPager()); + } + + var showPager = this.paging && this._pagesCount() > 1; + $pagerContainer.toggle(showPager); + }, + + _createPager: function() { + var $result; + + if($.isFunction(this.pagerRenderer)) { + $result = $(this.pagerRenderer({ + pageIndex: this.pageIndex, + pageCount: this._pagesCount() + })); + } else { + $result = $("
").append(this._createPagerByFormat()); + } + + $result.addClass(this.pagerClass); + + return $result; + }, + + _createPagerByFormat: function() { + var pageIndex = this.pageIndex, + pageCount = this._pagesCount(), + itemCount = this._itemsCount(), + pagerParts = this.pagerFormat.split(" "); + + return $.map(pagerParts, $.proxy(function(pagerPart) { + var result = pagerPart; + + if(pagerPart === PAGES_PLACEHOLDER) { + result = this._createPages(); + } else if(pagerPart === FIRST_PAGE_PLACEHOLDER) { + result = this._createPagerNavButton(this.pageFirstText, 1, pageIndex > 1); + } else if(pagerPart === PREV_PAGE_PLACEHOLDER) { + result = this._createPagerNavButton(this.pagePrevText, pageIndex - 1, pageIndex > 1); + } else if(pagerPart === NEXT_PAGE_PLACEHOLDER) { + result = this._createPagerNavButton(this.pageNextText, pageIndex + 1, pageIndex < pageCount); + } else if(pagerPart === LAST_PAGE_PLACEHOLDER) { + result = this._createPagerNavButton(this.pageLastText, pageCount, pageIndex < pageCount); + } else if(pagerPart === PAGE_INDEX_PLACEHOLDER) { + result = pageIndex; + } else if(pagerPart === PAGE_COUNT_PLACEHOLDER) { + result = pageCount; + } else if(pagerPart === ITEM_COUNT_PLACEHOLDER) { + result = itemCount; + } + + return $.isArray(result) ? result.concat([" "]) : [result, " "]; + }, this)); + }, + + _createPages: function() { + var pageCount = this._pagesCount(), + pageButtonCount = this.pageButtonCount, + firstDisplayingPage = this._firstDisplayingPage, + pages = []; + + if(firstDisplayingPage > 1) { + pages.push(this._createPagerPageNavButton(this.pageNavigatorPrevText, this.showPrevPages)); + } + + for(var i = 0, pageNumber = firstDisplayingPage; i < pageButtonCount && pageNumber <= pageCount; i++, pageNumber++) { + pages.push(pageNumber === this.pageIndex + ? this._createPagerCurrentPage() + : this._createPagerPage(pageNumber)); + } + + if((firstDisplayingPage + pageButtonCount - 1) < pageCount) { + pages.push(this._createPagerPageNavButton(this.pageNavigatorNextText, this.showNextPages)); + } + + return pages; + }, + + _createPagerNavButton: function(text, pageIndex, isActive) { + return this._createPagerButton(text, this.pagerNavButtonClass + (isActive ? "" : " " + this.pagerNavButtonInactiveClass), + isActive ? function() { this.openPage(pageIndex); } : $.noop); + }, + + _createPagerPageNavButton: function(text, handler) { + return this._createPagerButton(text, this.pagerNavButtonClass, handler); + }, + + _createPagerPage: function(pageIndex) { + return this._createPagerButton(pageIndex, this.pageClass, function() { + this.openPage(pageIndex); + }); + }, + + _createPagerButton: function(text, css, handler) { + var $link = $("").attr("href", EMPTY_HREF) + .html(text) + .on("click", $.proxy(handler, this)); + + return $("").addClass(css).append($link); + }, + + _createPagerCurrentPage: function() { + return $("") + .addClass(this.pageClass) + .addClass(this.currentPageClass) + .text(this.pageIndex); + }, + + _refreshSize: function() { + this._refreshHeight(); + this._refreshWidth(); + }, + + _refreshWidth: function() { + var width = (this.width === "auto") ? this._getAutoWidth() : this.width; + + this._container.width(width); + }, + + _getAutoWidth: function() { + var $headerGrid = this._headerGrid, + $header = this._header; + + $headerGrid.width("auto"); + + var contentWidth = $headerGrid.outerWidth(); + var borderWidth = $header.outerWidth() - $header.innerWidth(); + + $headerGrid.width(""); + + return contentWidth + borderWidth; + }, + + _scrollBarWidth: (function() { + var result; + + return function() { + if(result === undefined) { + var $ghostContainer = $("
"); + var $ghostContent = $("
"); + $ghostContainer.append($ghostContent).appendTo("body"); + var width = $ghostContent.innerWidth(); + $ghostContainer.css("overflow-y", "auto"); + var widthExcludingScrollBar = $ghostContent.innerWidth(); + $ghostContainer.remove(); + result = width - widthExcludingScrollBar; + } + return result; + }; + })(), + + _refreshHeight: function() { + var container = this._container, + pagerContainer = this._pagerContainer, + height = this.height, + nonBodyHeight; + + container.height(height); + + if(height !== "auto") { + height = container.height(); + + nonBodyHeight = this._header.outerHeight(true); + if(pagerContainer.parents(container).length) { + nonBodyHeight += pagerContainer.outerHeight(true); + } + + this._body.outerHeight(height - nonBodyHeight); + } + }, + + showPrevPages: function() { + var firstDisplayingPage = this._firstDisplayingPage, + pageButtonCount = this.pageButtonCount; + + this._firstDisplayingPage = (firstDisplayingPage > pageButtonCount) ? firstDisplayingPage - pageButtonCount : 1; + + this._refreshPager(); + }, + + showNextPages: function() { + var firstDisplayingPage = this._firstDisplayingPage, + pageButtonCount = this.pageButtonCount, + pageCount = this._pagesCount(); + + this._firstDisplayingPage = (firstDisplayingPage + 2 * pageButtonCount > pageCount) + ? pageCount - pageButtonCount + 1 + : firstDisplayingPage + pageButtonCount; + + this._refreshPager(); + }, + + openPage: function(pageIndex) { + if(pageIndex < 1 || pageIndex > this._pagesCount()) + return; + + this._setPage(pageIndex); + this._loadStrategy.openPage(pageIndex); + }, + + _setPage: function(pageIndex) { + var firstDisplayingPage = this._firstDisplayingPage, + pageButtonCount = this.pageButtonCount; + + this.pageIndex = pageIndex; + + if(pageIndex < firstDisplayingPage) { + this._firstDisplayingPage = pageIndex; + } + + if(pageIndex > firstDisplayingPage + pageButtonCount - 1) { + this._firstDisplayingPage = pageIndex - pageButtonCount + 1; + } + + this._callEventHandler(this.onPageChanged, { + pageIndex: pageIndex + }); + }, + + _controllerCall: function(method, param, isCanceled, doneCallback) { + if(isCanceled) + return $.Deferred().reject().promise(); + + this._showLoading(); + + var controller = this._controller; + if(!controller || !controller[method]) { + throw Error("controller has no method '" + method + "'"); + } + + return normalizePromise(controller[method](param)) + .done($.proxy(doneCallback, this)) + .fail($.proxy(this._errorHandler, this)) + .always($.proxy(this._hideLoading, this)); + }, + + _errorHandler: function() { + this._callEventHandler(this.onError, { + args: $.makeArray(arguments) + }); + }, + + _showLoading: function() { + if(!this.loadIndication) + return; + + clearTimeout(this._loadingTimer); + + this._loadingTimer = setTimeout($.proxy(function() { + this._loadIndicator.show(); + }, this), this.loadIndicationDelay); + }, + + _hideLoading: function() { + if(!this.loadIndication) + return; + + clearTimeout(this._loadingTimer); + this._loadIndicator.hide(); + }, + + search: function(filter) { + this._resetSorting(); + this._resetPager(); + return this.loadData(filter); + }, + + loadData: function(filter) { + filter = filter || (this.filtering ? this.getFilter() : {}); + + $.extend(filter, this._loadStrategy.loadParams(), this._sortingParams()); + + var args = this._callEventHandler(this.onDataLoading, { + filter: filter + }); + + return this._controllerCall("loadData", filter, args.cancel, function(loadedData) { + if(!loadedData) + return; + + this._loadStrategy.finishLoad(loadedData); + + this._callEventHandler(this.onDataLoaded, { + data: loadedData + }); + }); + }, + + getFilter: function() { + var result = {}; + this._eachField(function(field) { + if(field.filtering) { + this._setItemFieldValue(result, field, field.filterValue()); + } + }); + return result; + }, + + _sortingParams: function() { + if(this.sorting && this._sortField) { + return { + sortField: this._sortField.name, + sortOrder: this._sortOrder + }; + } + return {}; + }, + + getSorting: function() { + var sortingParams = this._sortingParams(); + return { + field: sortingParams.sortField, + order: sortingParams.sortOrder + }; + }, + + clearFilter: function() { + var $filterRow = this._createFilterRow(); + this._filterRow.replaceWith($filterRow); + this._filterRow = $filterRow; + return this.search(); + }, + + insertItem: function(item) { + var insertingItem = item || this._getValidatedInsertItem(); + + if(!insertingItem) + return $.Deferred().reject().promise(); + + var args = this._callEventHandler(this.onItemInserting, { + item: insertingItem + }); + + return this._controllerCall("insertItem", insertingItem, args.cancel, function(insertedItem) { + insertedItem = insertedItem || insertingItem; + this._loadStrategy.finishInsert(insertedItem); + + this._callEventHandler(this.onItemInserted, { + item: insertedItem + }); + }); + }, + + _getValidatedInsertItem: function() { + var item = this._getInsertItem(); + return this._validateItem(item, this._insertRow) ? item : null; + }, + + _getInsertItem: function() { + var result = {}; + this._eachField(function(field) { + if(field.inserting) { + this._setItemFieldValue(result, field, field.insertValue()); + } + }); + return result; + }, + + _validateItem: function(item, $row) { + var validationErrors = []; + + var args = { + item: item, + itemIndex: this._rowIndex($row), + row: $row + }; + + this._eachField(function(field) { + if(!field.validate || + ($row === this._insertRow && !field.inserting) || + ($row === this._getEditRow() && !field.editing)) + return; + + var fieldValue = this._getItemFieldValue(item, field); + + var errors = this._validation.validate($.extend({ + value: fieldValue, + rules: field.validate + }, args)); + + this._setCellValidity($row.children().eq(this._visibleFieldIndex(field)), errors); + + if(!errors.length) + return; + + validationErrors.push.apply(validationErrors, + $.map(errors, function(message) { + return { field: field, message: message }; + })); + }); + + if(!validationErrors.length) + return true; + + var invalidArgs = $.extend({ + errors: validationErrors + }, args); + this._callEventHandler(this.onItemInvalid, invalidArgs); + this.invalidNotify(invalidArgs); + + return false; + }, + + _setCellValidity: function($cell, errors) { + $cell + .toggleClass(this.invalidClass, !!errors.length) + .attr("title", errors.join("\n")); + }, + + clearInsert: function() { + var insertRow = this._createInsertRow(); + this._insertRow.replaceWith(insertRow); + this._insertRow = insertRow; + this.refresh(); + }, + + editItem: function(item) { + var $row = this.rowByItem(item); + if($row.length) { + this._editRow($row); + } + }, + + rowByItem: function(item) { + if(item.jquery || item.nodeType) + return $(item); + + return this._content.find("tr").filter(function() { + return $.data(this, JSGRID_ROW_DATA_KEY) === item; + }); + }, + + _editRow: function($row) { + if(!this.editing) + return; + + var item = $row.data(JSGRID_ROW_DATA_KEY); + + var args = this._callEventHandler(this.onItemEditing, { + row: $row, + item: item, + itemIndex: this._itemIndex(item) + }); + + if(args.cancel) + return; + + if(this._editingRow) { + this.cancelEdit(); + } + + var $editRow = this._createEditRow(item); + + this._editingRow = $row; + $row.hide(); + $editRow.insertBefore($row); + $row.data(JSGRID_EDIT_ROW_DATA_KEY, $editRow); + }, + + _createEditRow: function(item) { + if($.isFunction(this.editRowRenderer)) { + return $(this.renderTemplate(this.editRowRenderer, this, { item: item, itemIndex: this._itemIndex(item) })); + } + + var $result = $("
", field, "editcss") + .append(this.renderTemplate(field.editTemplate || "", field, { value: fieldValue, item: item })) + .appendTo($result); + }); + + return $result; + }, + + updateItem: function(item, editedItem) { + if(arguments.length === 1) { + editedItem = item; + } + + var $row = item ? this.rowByItem(item) : this._editingRow; + editedItem = editedItem || this._getValidatedEditedItem(); + + if(!editedItem) + return; + + return this._updateRow($row, editedItem); + }, + + _getValidatedEditedItem: function() { + var item = this._getEditedItem(); + return this._validateItem(item, this._getEditRow()) ? item : null; + }, + + _updateRow: function($updatingRow, editedItem) { + var updatingItem = $updatingRow.data(JSGRID_ROW_DATA_KEY), + updatingItemIndex = this._itemIndex(updatingItem), + updatedItem = $.extend(true, {}, updatingItem, editedItem); + + var args = this._callEventHandler(this.onItemUpdating, { + row: $updatingRow, + item: updatedItem, + itemIndex: updatingItemIndex, + previousItem: updatingItem + }); + + return this._controllerCall("updateItem", updatedItem, args.cancel, function(loadedUpdatedItem) { + var previousItem = $.extend(true, {}, updatingItem); + updatedItem = loadedUpdatedItem || $.extend(true, updatingItem, editedItem); + + var $updatedRow = this._finishUpdate($updatingRow, updatedItem, updatingItemIndex); + + this._callEventHandler(this.onItemUpdated, { + row: $updatedRow, + item: updatedItem, + itemIndex: updatingItemIndex, + previousItem: previousItem + }); + }); + }, + + _rowIndex: function(row) { + return this._content.children().index($(row)); + }, + + _itemIndex: function(item) { + return $.inArray(item, this.data); + }, + + _finishUpdate: function($updatingRow, updatedItem, updatedItemIndex) { + this.cancelEdit(); + this.data[updatedItemIndex] = updatedItem; + + var $updatedRow = this._createRow(updatedItem, updatedItemIndex); + $updatingRow.replaceWith($updatedRow); + return $updatedRow; + }, + + _getEditedItem: function() { + var result = {}; + this._eachField(function(field) { + if(field.editing) { + this._setItemFieldValue(result, field, field.editValue()); + } + }); + return result; + }, + + cancelEdit: function() { + if(!this._editingRow) + return; + + this._getEditRow().remove(); + this._editingRow.show(); + this._editingRow = null; + }, + + _getEditRow: function() { + return this._editingRow && this._editingRow.data(JSGRID_EDIT_ROW_DATA_KEY); + }, + + deleteItem: function(item) { + var $row = this.rowByItem(item); + + if(!$row.length) + return; + + if(this.confirmDeleting && !window.confirm(getOrApply(this.deleteConfirm, this, $row.data(JSGRID_ROW_DATA_KEY)))) + return; + + return this._deleteRow($row); + }, + + _deleteRow: function($row) { + var deletingItem = $row.data(JSGRID_ROW_DATA_KEY), + deletingItemIndex = this._itemIndex(deletingItem); + + var args = this._callEventHandler(this.onItemDeleting, { + row: $row, + item: deletingItem, + itemIndex: deletingItemIndex + }); + + return this._controllerCall("deleteItem", deletingItem, args.cancel, function() { + this._loadStrategy.finishDelete(deletingItem, deletingItemIndex); + + this._callEventHandler(this.onItemDeleted, { + row: $row, + item: deletingItem, + itemIndex: deletingItemIndex + }); + }); + } + }; + + $.fn.jsGrid = function(config) { + var args = $.makeArray(arguments), + methodArgs = args.slice(1), + result = this; + + this.each(function() { + var $element = $(this), + instance = $element.data(JSGRID_DATA_KEY), + methodResult; + + if(instance) { + if(typeof config === "string") { + methodResult = instance[config].apply(instance, methodArgs); + if(methodResult !== undefined && methodResult !== instance) { + result = methodResult; + return false; + } + } else { + instance._detachWindowResizeCallback(); + instance._init(config); + instance.render(); + } + } else { + new Grid($element, config); + } + }); + + return result; + }; + + var fields = {}; + + var setDefaults = function(config) { + var componentPrototype; + + if($.isPlainObject(config)) { + componentPrototype = Grid.prototype; + } else { + componentPrototype = fields[config].prototype; + config = arguments[1] || {}; + } + + $.extend(componentPrototype, config); + }; + + var locales = {}; + + var locale = function(lang) { + var localeConfig = $.isPlainObject(lang) ? lang : locales[lang]; + + if(!localeConfig) + throw Error("unknown locale " + lang); + + setLocale(jsGrid, localeConfig); + }; + + var setLocale = function(obj, localeConfig) { + $.each(localeConfig, function(field, value) { + if($.isPlainObject(value)) { + setLocale(obj[field] || obj[field[0].toUpperCase() + field.slice(1)], value); + return; + } + + if(obj.hasOwnProperty(field)) { + obj[field] = value; + } else { + obj.prototype[field] = value; + } + }); + }; + + window.jsGrid = { + Grid: Grid, + fields: fields, + setDefaults: setDefaults, + locales: locales, + locale: locale, + version: '1.5.3' + }; + +}(window, jQuery)); + +(function(jsGrid, $, undefined) { + + function LoadIndicator(config) { + this._init(config); + } + + LoadIndicator.prototype = { + + container: "body", + message: "Loading...", + shading: true, + + zIndex: 1000, + shaderClass: "jsgrid-load-shader", + loadPanelClass: "jsgrid-load-panel", + + _init: function(config) { + $.extend(true, this, config); + + this._initContainer(); + this._initShader(); + this._initLoadPanel(); + }, + + _initContainer: function() { + this._container = $(this.container); + }, + + _initShader: function() { + if(!this.shading) + return; + + this._shader = $("
").addClass(this.shaderClass) + .hide() + .css({ + position: "absolute", + top: 0, + right: 0, + bottom: 0, + left: 0, + zIndex: this.zIndex + }) + .appendTo(this._container); + }, + + _initLoadPanel: function() { + this._loadPanel = $("
").addClass(this.loadPanelClass) + .text(this.message) + .hide() + .css({ + position: "absolute", + top: "50%", + left: "50%", + zIndex: this.zIndex + }) + .appendTo(this._container); + }, + + show: function() { + var $loadPanel = this._loadPanel.show(); + + var actualWidth = $loadPanel.outerWidth(); + var actualHeight = $loadPanel.outerHeight(); + + $loadPanel.css({ + marginTop: -actualHeight / 2, + marginLeft: -actualWidth / 2 + }); + + this._shader.show(); + }, + + hide: function() { + this._loadPanel.hide(); + this._shader.hide(); + } + + }; + + jsGrid.LoadIndicator = LoadIndicator; + +}(jsGrid, jQuery)); + +(function(jsGrid, $, undefined) { + + function DirectLoadingStrategy(grid) { + this._grid = grid; + } + + DirectLoadingStrategy.prototype = { + + firstDisplayIndex: function() { + var grid = this._grid; + return grid.option("paging") ? (grid.option("pageIndex") - 1) * grid.option("pageSize") : 0; + }, + + lastDisplayIndex: function() { + var grid = this._grid; + var itemsCount = grid.option("data").length; + + return grid.option("paging") + ? Math.min(grid.option("pageIndex") * grid.option("pageSize"), itemsCount) + : itemsCount; + }, + + itemsCount: function() { + return this._grid.option("data").length; + }, + + openPage: function(index) { + this._grid.refresh(); + }, + + loadParams: function() { + return {}; + }, + + sort: function() { + this._grid._sortData(); + this._grid.refresh(); + return $.Deferred().resolve().promise(); + }, + + reset: function() { + this._grid.refresh(); + return $.Deferred().resolve().promise(); + }, + + finishLoad: function(loadedData) { + this._grid.option("data", loadedData); + }, + + finishInsert: function(insertedItem) { + var grid = this._grid; + grid.option("data").push(insertedItem); + grid.refresh(); + }, + + finishDelete: function(deletedItem, deletedItemIndex) { + var grid = this._grid; + grid.option("data").splice(deletedItemIndex, 1); + grid.reset(); + } + }; + + + function PageLoadingStrategy(grid) { + this._grid = grid; + this._itemsCount = 0; + } + + PageLoadingStrategy.prototype = { + + firstDisplayIndex: function() { + return 0; + }, + + lastDisplayIndex: function() { + return this._grid.option("data").length; + }, + + itemsCount: function() { + return this._itemsCount; + }, + + openPage: function(index) { + this._grid.loadData(); + }, + + loadParams: function() { + var grid = this._grid; + return { + pageIndex: grid.option("pageIndex"), + pageSize: grid.option("pageSize") + }; + }, + + reset: function() { + return this._grid.loadData(); + }, + + sort: function() { + return this._grid.loadData(); + }, + + finishLoad: function(loadedData) { + this._itemsCount = loadedData.itemsCount; + this._grid.option("data", loadedData.data); + }, + + finishInsert: function(insertedItem) { + this._grid.search(); + }, + + finishDelete: function(deletedItem, deletedItemIndex) { + this._grid.search(); + } + }; + + jsGrid.loadStrategies = { + DirectLoadingStrategy: DirectLoadingStrategy, + PageLoadingStrategy: PageLoadingStrategy + }; + +}(jsGrid, jQuery)); + +(function(jsGrid, $, undefined) { + + var isDefined = function(val) { + return typeof(val) !== "undefined" && val !== null; + }; + + var sortStrategies = { + string: function(str1, str2) { + if(!isDefined(str1) && !isDefined(str2)) + return 0; + + if(!isDefined(str1)) + return -1; + + if(!isDefined(str2)) + return 1; + + return ("" + str1).localeCompare("" + str2); + }, + + number: function(n1, n2) { + return n1 - n2; + }, + + date: function(dt1, dt2) { + return dt1 - dt2; + }, + + numberAsString: function(n1, n2) { + return parseFloat(n1) - parseFloat(n2); + } + }; + + jsGrid.sortStrategies = sortStrategies; + +}(jsGrid, jQuery)); + +(function(jsGrid, $, undefined) { + + function Validation(config) { + this._init(config); + } + + Validation.prototype = { + + _init: function(config) { + $.extend(true, this, config); + }, + + validate: function(args) { + var errors = []; + + $.each(this._normalizeRules(args.rules), function(_, rule) { + if(rule.validator(args.value, args.item, rule.param)) + return; + + var errorMessage = $.isFunction(rule.message) ? rule.message(args.value, args.item) : rule.message; + errors.push(errorMessage); + }); + + return errors; + }, + + _normalizeRules: function(rules) { + if(!$.isArray(rules)) + rules = [rules]; + + return $.map(rules, $.proxy(function(rule) { + return this._normalizeRule(rule); + }, this)); + }, + + _normalizeRule: function(rule) { + if(typeof rule === "string") + rule = { validator: rule }; + + if($.isFunction(rule)) + rule = { validator: rule }; + + if($.isPlainObject(rule)) + rule = $.extend({}, rule); + else + throw Error("wrong validation config specified"); + + if($.isFunction(rule.validator)) + return rule; + + return this._applyNamedValidator(rule, rule.validator); + }, + + _applyNamedValidator: function(rule, validatorName) { + delete rule.validator; + + var validator = validators[validatorName]; + if(!validator) + throw Error("unknown validator \"" + validatorName + "\""); + + if($.isFunction(validator)) { + validator = { validator: validator }; + } + + return $.extend({}, validator, rule); + } + }; + + jsGrid.Validation = Validation; + + + var validators = { + required: { + message: "Field is required", + validator: function(value) { + return value !== undefined && value !== null && value !== ""; + } + }, + + rangeLength: { + message: "Field value length is out of the defined range", + validator: function(value, _, param) { + return value.length >= param[0] && value.length <= param[1]; + } + }, + + minLength: { + message: "Field value is too short", + validator: function(value, _, param) { + return value.length >= param; + } + }, + + maxLength: { + message: "Field value is too long", + validator: function(value, _, param) { + return value.length <= param; + } + }, + + pattern: { + message: "Field value is not matching the defined pattern", + validator: function(value, _, param) { + if(typeof param === "string") { + param = new RegExp("^(?:" + param + ")$"); + } + return param.test(value); + } + }, + + range: { + message: "Field value is out of the defined range", + validator: function(value, _, param) { + return value >= param[0] && value <= param[1]; + } + }, + + min: { + message: "Field value is too small", + validator: function(value, _, param) { + return value >= param; + } + }, + + max: { + message: "Field value is too large", + validator: function(value, _, param) { + return value <= param; + } + } + }; + + jsGrid.validators = validators; + +}(jsGrid, jQuery)); + +(function(jsGrid, $, undefined) { + + function Field(config) { + $.extend(true, this, config); + this.sortingFunc = this._getSortingFunc(); + } + + Field.prototype = { + name: "", + title: null, + css: "", + align: "", + width: 100, + + visible: true, + filtering: true, + inserting: true, + editing: true, + sorting: true, + sorter: "string", // name of SortStrategy or function to compare elements + + headerTemplate: function() { + return (this.title === undefined || this.title === null) ? this.name : this.title; + }, + + itemTemplate: function(value, item) { + return value; + }, + + filterTemplate: function() { + return ""; + }, + + insertTemplate: function() { + return ""; + }, + + editTemplate: function(value, item) { + this._value = value; + return this.itemTemplate(value, item); + }, + + filterValue: function() { + return ""; + }, + + insertValue: function() { + return ""; + }, + + editValue: function() { + return this._value; + }, + + _getSortingFunc: function() { + var sorter = this.sorter; + + if($.isFunction(sorter)) { + return sorter; + } + + if(typeof sorter === "string") { + return jsGrid.sortStrategies[sorter]; + } + + throw Error("wrong sorter for the field \"" + this.name + "\"!"); + } + }; + + jsGrid.Field = Field; + +}(jsGrid, jQuery)); + +(function(jsGrid, $, undefined) { + + var Field = jsGrid.Field; + + function TextField(config) { + Field.call(this, config); + } + + TextField.prototype = new Field({ + + autosearch: true, + readOnly: false, + + filterTemplate: function() { + if(!this.filtering) + return ""; + + var grid = this._grid, + $result = this.filterControl = this._createTextBox(); + + if(this.autosearch) { + $result.on("keypress", function(e) { + if(e.which === 13) { + grid.search(); + e.preventDefault(); + } + }); + } + + return $result; + }, + + insertTemplate: function() { + if(!this.inserting) + return ""; + + return this.insertControl = this._createTextBox(); + }, + + editTemplate: function(value) { + if(!this.editing) + return this.itemTemplate.apply(this, arguments); + + var $result = this.editControl = this._createTextBox(); + $result.val(value); + return $result; + }, + + filterValue: function() { + return this.filterControl.val(); + }, + + insertValue: function() { + return this.insertControl.val(); + }, + + editValue: function() { + return this.editControl.val(); + }, + + _createTextBox: function() { + return $("").attr("type", "text") + .prop("readonly", !!this.readOnly); + } + }); + + jsGrid.fields.text = jsGrid.TextField = TextField; + +}(jsGrid, jQuery)); + +(function(jsGrid, $, undefined) { + + var TextField = jsGrid.TextField; + + function NumberField(config) { + TextField.call(this, config); + } + + NumberField.prototype = new TextField({ + + sorter: "number", + align: "right", + readOnly: false, + + filterValue: function() { + return this.filterControl.val() + ? parseInt(this.filterControl.val() || 0, 10) + : undefined; + }, + + insertValue: function() { + return this.insertControl.val() + ? parseInt(this.insertControl.val() || 0, 10) + : undefined; + }, + + editValue: function() { + return this.editControl.val() + ? parseInt(this.editControl.val() || 0, 10) + : undefined; + }, + + _createTextBox: function() { + return $("").attr("type", "number") + .prop("readonly", !!this.readOnly); + } + }); + + jsGrid.fields.number = jsGrid.NumberField = NumberField; + +}(jsGrid, jQuery)); + +(function(jsGrid, $, undefined) { + + var TextField = jsGrid.TextField; + + function TextAreaField(config) { + TextField.call(this, config); + } + + TextAreaField.prototype = new TextField({ + + insertTemplate: function() { + if(!this.inserting) + return ""; + + return this.insertControl = this._createTextArea(); + }, + + editTemplate: function(value) { + if(!this.editing) + return this.itemTemplate.apply(this, arguments); + + var $result = this.editControl = this._createTextArea(); + $result.val(value); + return $result; + }, + + _createTextArea: function() { + return $("