From 1350827f0e1cb77b0b1720ae7ef8dbf14406fa8b Mon Sep 17 00:00:00 2001 From: Marc Alexander Date: Thu, 7 Oct 2010 15:11:36 +0000 Subject: [PATCH] Added basic version of calendar block including the ability to add events; Fixed a few small bugs; --- .../en/mods/portal/portal_calendar_module.php | 89 +++++ root/portal/modules/portal_calendar.php | 378 ++++++++++++++++++ root/portal/modules/portal_links.php | 2 + root/portal/modules/portal_main_menu.php | 2 + .../template/portal/modules/attachments.html | 2 +- .../portal/modules/birthdays_side.html | 2 +- .../portal/modules/calendar_side.html | 75 ++++ .../template/portal/modules/clock_side.html | 2 +- .../portal/modules/donation_side.html | 2 +- .../template/portal/modules/friends_side.html | 2 +- .../portal/modules/latest_bots_side.html | 2 +- .../portal/modules/latest_members_side.html | 2 +- .../portal/modules/leaders_ext_side.html | 2 +- .../template/portal/modules/leaders_side.html | 2 +- .../template/portal/modules/link_us_side.html | 2 +- .../template/portal/modules/links_side.html | 2 +- .../portal/modules/login_box_side.html | 2 +- .../portal/modules/stylechanger_side.html | 2 +- .../portal/modules/user_menu_side.html | 2 +- .../images/portal/cal_icon_left_arrow.png | Bin 0 -> 744 bytes .../images/portal/cal_icon_right_arrow.png | Bin 0 -> 676 bytes .../theme/images/portal/portal_calendar.png | Bin 0 -> 1114 bytes 22 files changed, 560 insertions(+), 14 deletions(-) create mode 100644 root/language/en/mods/portal/portal_calendar_module.php create mode 100644 root/portal/modules/portal_calendar.php create mode 100644 root/styles/prosilver/template/portal/modules/calendar_side.html create mode 100644 root/styles/prosilver/theme/images/portal/cal_icon_left_arrow.png create mode 100644 root/styles/prosilver/theme/images/portal/cal_icon_right_arrow.png create mode 100644 root/styles/prosilver/theme/images/portal/portal_calendar.png diff --git a/root/language/en/mods/portal/portal_calendar_module.php b/root/language/en/mods/portal/portal_calendar_module.php new file mode 100644 index 00000000..2dcb9da4 --- /dev/null +++ b/root/language/en/mods/portal/portal_calendar_module.php @@ -0,0 +1,89 @@ + 'Calendar', + 'VIEW_NEXT_MONTH' => 'next month', + 'VIEW_PREVIOUS_MONTH' => 'Previous month', + 'EVENT_START' => 'From', + 'EVENT_END' => 'To', + 'EVENT_TIME' => 'Time', + 'EVENT_ALL_DAY' => 'All Day Event', + 'CURRENT_EVENTS' => 'Current Events', + 'NO_CUR_EVENTS' => 'No current events', + 'UPCOMING_EVENTS' => 'Upcoming Events', + 'NO_UPCOMING_EVENTS' => 'No upcoming events', + + 'mini_cal' => array( + 'day' => array( + '1' => 'Su', + '2' => 'Mo', + '3' => 'Tu', + '4' => 'We', + '5' => 'Th', + '6' => 'Fr', + '7' => 'Sa', + ), + + 'month' => array( + '1' => 'Jan.', + '2' => 'Feb.', + '3' => 'Mar.', + '4' => 'Apr.', + '5' => 'May', + '6' => 'Jun.', + '7' => 'Jul.', + '8' => 'Aug.', + '9' => 'Sep.', + '10'=> 'Oct.', + '11'=> 'Nov.', + '12'=> 'Dec.', + ), + + 'long_month'=> array( + '1' => 'January', + '2' => 'February', + '3' => 'March', + '4' => 'April', + '5' => 'May', + '6' => 'June', + '7' => 'July', + '8' => 'August', + '9' => 'September', + '10'=> 'October', + '11'=> 'November', + '12'=> 'December', + ), + ), +)); + +?> \ No newline at end of file diff --git a/root/portal/modules/portal_calendar.php b/root/portal/modules/portal_calendar.php new file mode 100644 index 00000000..cefaf9f3 --- /dev/null +++ b/root/portal/modules/portal_calendar.php @@ -0,0 +1,378 @@ +lang}/mods/portal/" + */ + var $language = 'portal_calendar_module'; + + /** + * custom acp template + * file must be in "adm/style/portal/" + */ + //var $custom_acp_tpl = ''; + + function get_template_center($module_id) + { + global $config, $template; + + $template->assign_vars(array( + 'EXAMPLE' => $config['portal_' . $module_id . '_configname'], + )); + + return 'modulename_center.html'; + } + + function get_template_side($module_id) + { + global $config, $template, $user, $phpbb_root_path, $phpEx; + + $portal_config = obtain_portal_config(); + + // 0 = Sunday first - 1 = Monday first. ;-) + if ($config['board3_sunday_first_' . $module_id]) + { + define('MINI_CAL_FDOW', 0); + } + else + { + define('MINI_CAL_FDOW', 1); + } + + // get the calendar month + $mini_cal_month = 0; + if(isset($_GET['m']) || isset($_POST['m'])) + { + $mini_cal_month = request_var('m', 0); + } + + // initialise some variables + $today_timestamp = time() + $user->timezone + $user->dst; + $mini_cal_today = date('Ymd', time() + $user->timezone + $user->dst - date('Z')); + $s_cal_month = ($mini_cal_month != 0) ? $mini_cal_month . ' month' : $mini_cal_today; + $this->getMonth($s_cal_month); + $mini_cal_count = MINI_CAL_FDOW; + $mini_cal_this_year = $this->dateYYYY; + $mini_cal_this_month = $this->dateMM; + $mini_cal_this_day = $this->dateDD; + $mini_cal_month_days = $this->daysMonth; + + // output the days for the current month + for($i=0; $i < $mini_cal_month_days;) + { + // is this the first day of the week? + if($mini_cal_count == MINI_CAL_FDOW) + { + $template->assign_block_vars('mini_cal_row', array()); + } + + // is this a valid weekday? + if($mini_cal_count == ($this->day[$i][3])) + { + $mini_cal_this_day = $this->day[$i][0]; + + $d_mini_cal_today = $mini_cal_this_year . (($mini_cal_this_month <= 9) ? '0' . $mini_cal_this_month : $mini_cal_this_month) . (($mini_cal_this_day <= 9) ? '0' . $mini_cal_this_day : $mini_cal_this_day); + $mini_cal_day = ($mini_cal_today == $d_mini_cal_today) ? '' . $mini_cal_this_day . '' : $mini_cal_this_day; + + $template->assign_block_vars('mini_cal_row.mini_cal_days', array( + 'MINI_CAL_DAY' => ($mini_cal_count == 0) ? '' . $mini_cal_day . '' : $mini_cal_day) + ); + $i++; + } + // no day + else + { + $template->assign_block_vars('mini_cal_row.mini_cal_days', array( + 'MINI_CAL_DAY' => ' ') + ); + } + + // is this the last day of the week? + if ($mini_cal_count == 6) + { + // if so then reset the count + $mini_cal_count = 0; + } + else + { + // otherwise increment the count + $mini_cal_count++; + } + } + + // output our general calendar bits + $down = $mini_cal_month - 1; + $up = $mini_cal_month + 1; + $prev_month = '<<'; + $next_month = '>>'; + + $template->assign_vars(array( + 'S_DISPLAY_MINICAL' => true, + 'S_SUNDAY_FIRST' => ($config['board3_sunday_first_' . $module_id]) ? true : false, + 'L_MINI_CAL_MONTH' => (($config['board3_long_month_' . $module_id]) ? $user->lang['mini_cal']['long_month'][$this->day[0][1]] : $user->lang['mini_cal']['month'][$this->day[0][1]]) . " " . $this->day[0][2], + 'L_MINI_CAL_SUN' => '' . $user->lang['mini_cal']['day'][1] . '', + 'L_MINI_CAL_MON' => $user->lang['mini_cal']['day'][2], + 'L_MINI_CAL_TUE' => $user->lang['mini_cal']['day'][3], + 'L_MINI_CAL_WED' => $user->lang['mini_cal']['day'][4], + 'L_MINI_CAL_THU' => $user->lang['mini_cal']['day'][5], + 'L_MINI_CAL_FRI' => $user->lang['mini_cal']['day'][6], + 'L_MINI_CAL_SAT' => $user->lang['mini_cal']['day'][7], + 'U_PREV_MONTH' => $prev_month, + 'U_NEXT_MONTH' => $next_month) + ); + + /* + * Let's start displaying the events + * make sure we only display events in the future + */ + $events = $this->utf_unserialize($portal_config['board3_calendar_events_' . $module_id]); + + /* + * this is what the events array should look like + $events[0] = array( + 'title' => '', + 'desc' => '', + 'start_time' => '', + 'end_time' => '', + 'url' => '', + );*/ + if(!empty($events)) + { + // we sort the $events array by the start time + foreach($events as $key => $cur_event) + { + $time_ary[$key] = $cur_event['start_time']; + } + array_multisort($time_ary, SORT_NUMERIC, $events); + + foreach($events as $key => $cur_event) + { + if($cur_event['start_time'] >= $today_timestamp || $cur_event['end_time'] >= $today_timestamp) + { + // current events + if(($cur_event['start_time'] <= $today_timestamp && $cur_event['end_time'] <= $cur_event['start_time']) || ($cur_event['start_time'] <= $today_timestamp && $cur_event['end_time'] >= $today_timestamp)) + { + $template->assign_block_vars('cur_events', array( + 'EVENT_URL' => (isset($cur_event['url']) && $cur_event['url'] != '') ? $this->validate_url($cur_event['url']) : '', + 'EVENT_TITLE' => $cur_event['title'], + 'START_TIME' => $user->format_date($cur_event['start_time'], 'y-m-d'), + 'END_TIME' => $user->format_date($cur_event['end_time'], 'y-m-d'), + 'EVENT_DESC' => (isset($cur_event['desc']) && $cur_event['desc'] != '') ? $cur_event['desc'] : '', + )); + } + else + { + $template->assign_block_vars('upcoming_events', array( + 'EVENT_URL' => (isset($cur_event['url']) && $cur_event['url'] != '') ? $this->validate_url($cur_event['url']) : '', + 'EVENT_TITLE' => $cur_event['title'], + 'CUR_EVENT' => ($cur_event['start_time'] <= $today_timestamp && $cur_event['end_time'] >= $today_timestamp) ? true : false, + 'START_TIME' => $user->format_date($cur_event['start_time'], 'y-m-d'), + 'END_TIME' => $user->format_date($cur_event['end_time'], 'y-m-d'), + 'EVENT_DESC' => (isset($cur_event['desc']) && $cur_event['desc'] != '') ? $cur_event['desc'] : '', + )); + } + } + else + { + // mark the events that should be deleted + $delete_id_ary[] = $key; + } + } + + // now delete old events + if(isset($delete_id_ary) && !empty($delete_id_ary)) + { + foreach($delete_id_ary as $cur_id) + { + array_splice($events, $cur_id, 1); + } + + // afterwards reset the array numbering and insert the data into the database + $events = array_merge($events); + + $events = serialize($events); + set_portal_config('board3_calendar_events_' . $module_id, $events); + } + } + + //print_r($events); // no output needed, seems to work correctly + + /* + if (!isset($template->filename['mini_cal_block'])) + { + $template->set_filenames(array( + 'mini_cal_block' => 'portal/block/mini_calendar.html') + ); + } + */ + + + return 'calendar_side.html'; + } + + function get_template_acp($module_id) + { + return array( + 'title' => 'ACP_CONFIG_MODULENAME', + 'vars' => array( + 'legend1' => 'ACP_MODULENAME_CONFIGLEGEND', + 'portal_' . $module_id . '_configname' => array('lang' => 'MODULENAME_CONFIGNAME', 'validate' => 'string', 'type' => 'text:10:200', 'explain' => false), + 'portal_' . $module_id . '_configname2' => array('lang' => 'MODULENAME_CONFIGNAME2', 'validate' => 'int', 'type' => 'text:3:3', 'explain' => true), + ), + ); + return array(); + } + + /** + * API functions + */ + function install($module_id) + { + set_config('board3_sunday_first_' . $module_id, 1); + set_config('board3_calendar_today_color_' . $module_id, '#000000'); + set_config('board3_calendar_sunday_color_' . $module_id, '#FF0000'); + set_config('board3_long_month_' . $module_id, 0); + + set_portal_config('board3_calendar_events_' . $module_id, ''); + return true; + } + + function uninstall($module_id) + { + global $db; + + $del_config = array( + 'board3_calendar_events_' . $module_id, + ); + $sql = 'DELETE FROM ' . PORTAL_CONFIG_TABLE . ' + WHERE ' . $db->sql_in_set('config_name', $del_config); + + $db->sql_query($sql); + + $del_config = array( + 'board3_sunday_first_' . $module_id, + 'board3_calendar_today_color_' . $module_id, + 'board3_calendar_sunday_color_' . $module_id, + 'board3_long_month_' . $module_id, + ); + $sql = 'DELETE FROM ' . CONFIG_TABLE . ' + WHERE ' . $db->sql_in_set('config_name', $del_config); + return $db->sql_query($sql); + } + + var $dateYYY; // year in numeric format (YYYY) + var $dateMM; // month in numeric format (MM) + var $dateDD; // day in numeric format (DD) + var $ext_dateMM; // extended month (e.g. February) + var $daysMonth; // count of days in month + var $stamp; // timestamp + var $day; // return array s.a. + + /** + * convert date->timestamp + **/ + function makeTimestamp($date) + { + $this->stamp = strtotime($date); + return ($this->stamp); + } + + /** + * get date listed in array + **/ + function getMonth($callDate) + { + + $this->makeTimestamp($callDate); + $this->dateYYYY = date("Y", $this->stamp); + $this->dateMM = date("n", $this->stamp); + $this->ext_dateMM = date("F", $this->stamp); + $this->dateDD = date("d", $this->stamp); + $this->daysMonth = date("t", $this->stamp); + + for($i=1; $i < $this->daysMonth+1; $i++) + { + $this->makeTimestamp("$i $this->ext_dateMM $this->dateYYYY"); + $this->day[] = array( + "0" => "$i", + "1" => $this->dateMM, + "2" => $this->dateYYYY, + "3" => (date('w', $this->stamp)) + ); + } + } + + // Unserialize links array + function utf_unserialize($serial_str) + { + $out = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str ); + return unserialize($out); + } + + /** + * validate URLs and execute apppend_sid if necessary + */ + function validate_url($url) + { + global $config; + + $url = str_replace("\r\n", "\n", str_replace('\"', '"', trim($url))); + $url = str_replace(' ', '%20', $url); + + // if there is no scheme, then add http schema + if (!preg_match('#^[a-z][a-z\d+\-.]*:/{2}#i', $url)) + { + $url = 'http://' . $url; + } + + // Is this a link to somewhere inside this board? If so then remove the session id from the url + if (strpos($url, generate_board_url()) !== false && strpos($url, 'sid=') !== false) + { + $url = reapply_sid($url); + } + + return $url; + } +} + +?> \ No newline at end of file diff --git a/root/portal/modules/portal_links.php b/root/portal/modules/portal_links.php index 5ba49966..735e312b 100644 --- a/root/portal/modules/portal_links.php +++ b/root/portal/modules/portal_links.php @@ -169,6 +169,8 @@ class portal_links_module $sql = 'DELETE FROM ' . PORTAL_CONFIG_TABLE . ' WHERE ' . $db->sql_in_set('config_name', $del_config); + $db->sql_query($sql); + $del_config = array( 'board3_links_' . $module_id, ); diff --git a/root/portal/modules/portal_main_menu.php b/root/portal/modules/portal_main_menu.php index 10320c26..8ee8e1d4 100644 --- a/root/portal/modules/portal_main_menu.php +++ b/root/portal/modules/portal_main_menu.php @@ -224,6 +224,8 @@ class portal_main_menu_module $sql = 'DELETE FROM ' . PORTAL_CONFIG_TABLE . ' WHERE ' . $db->sql_in_set('config_name', $del_config); + $db->sql_query($sql); + $del_config = array( 'board3_menu_' . $module_id, ); diff --git a/root/styles/prosilver/template/portal/modules/attachments.html b/root/styles/prosilver/template/portal/modules/attachments.html index a7d400e6..0a153e2f 100644 --- a/root/styles/prosilver/template/portal/modules/attachments.html +++ b/root/styles/prosilver/template/portal/modules/attachments.html @@ -1,5 +1,5 @@ -{$LR_BLOCK_H_L} {L_ATTACHMENTS}{$LR_BLOCK_H_R} +{$LR_BLOCK_H_L} {L_ATTACHMENTS}{$LR_BLOCK_H_R} {L_FILENAME}
diff --git a/root/styles/prosilver/template/portal/modules/birthdays_side.html b/root/styles/prosilver/template/portal/modules/birthdays_side.html index 5b3cfa77..28c5f208 100644 --- a/root/styles/prosilver/template/portal/modules/birthdays_side.html +++ b/root/styles/prosilver/template/portal/modules/birthdays_side.html @@ -1,5 +1,5 @@ -{$LR_BLOCK_H_L} {L_BIRTHDAYS}{$LR_BLOCK_H_R} +{$LR_BLOCK_H_L} {L_BIRTHDAYS}{$LR_BLOCK_H_R} {L_CONGRATULATIONS}:
{BIRTHDAY_LIST} diff --git a/root/styles/prosilver/template/portal/modules/calendar_side.html b/root/styles/prosilver/template/portal/modules/calendar_side.html new file mode 100644 index 00000000..c7e52ed5 --- /dev/null +++ b/root/styles/prosilver/template/portal/modules/calendar_side.html @@ -0,0 +1,75 @@ + + +{$LR_BLOCK_H_L} {L_PORTAL_CALENDAR}{$LR_BLOCK_H_R} + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{U_PREV_MONTH}{L_MINI_CAL_MONTH}{U_NEXT_MONTH}
{L_MINI_CAL_SUN}{L_MINI_CAL_MON}{L_MINI_CAL_TUE}{L_MINI_CAL_WED}{L_MINI_CAL_THU}{L_MINI_CAL_FRI}{L_MINI_CAL_SAT}{L_MINI_CAL_SUN}
{mini_cal_row.mini_cal_days.MINI_CAL_DAY}
+
+ + + + +{$LR_BLOCK_F_L}{$LR_BLOCK_F_R} \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/modules/clock_side.html b/root/styles/prosilver/template/portal/modules/clock_side.html index f360d589..06cd2e94 100644 --- a/root/styles/prosilver/template/portal/modules/clock_side.html +++ b/root/styles/prosilver/template/portal/modules/clock_side.html @@ -1,5 +1,5 @@ -{$LR_BLOCK_H_L} {L_CLOCK}{$LR_BLOCK_H_R} +{$LR_BLOCK_H_L} {L_CLOCK}{$LR_BLOCK_H_R}

diff --git a/root/styles/prosilver/template/portal/modules/donation_side.html b/root/styles/prosilver/template/portal/modules/donation_side.html index 98f19fe0..e36fb4ee 100644 --- a/root/styles/prosilver/template/portal/modules/donation_side.html +++ b/root/styles/prosilver/template/portal/modules/donation_side.html @@ -1,5 +1,5 @@ -{$LR_BLOCK_H_L} {L_DONATION}{$LR_BLOCK_H_R} +{$LR_BLOCK_H_L} {L_DONATION}{$LR_BLOCK_H_R}
diff --git a/root/styles/prosilver/template/portal/modules/friends_side.html b/root/styles/prosilver/template/portal/modules/friends_side.html index 2ca525d0..5fd73a99 100644 --- a/root/styles/prosilver/template/portal/modules/friends_side.html +++ b/root/styles/prosilver/template/portal/modules/friends_side.html @@ -1,5 +1,5 @@ -{$LR_BLOCK_H_L} {L_FRIENDS}{$LR_BLOCK_H_R} +{$LR_BLOCK_H_L} {L_FRIENDS}{$LR_BLOCK_H_R} {L_FRIENDS_ONLINE}
{b3p_friends_online.USERNAME_FULL}
diff --git a/root/styles/prosilver/template/portal/modules/latest_bots_side.html b/root/styles/prosilver/template/portal/modules/latest_bots_side.html index 96a93941..696cf672 100644 --- a/root/styles/prosilver/template/portal/modules/latest_bots_side.html +++ b/root/styles/prosilver/template/portal/modules/latest_bots_side.html @@ -1,5 +1,5 @@ -{$LR_BLOCK_H_L} {LAST_VISITED_BOTS}{$LR_BLOCK_H_R} +{$LR_BLOCK_H_L} {LAST_VISITED_BOTS}{$LR_BLOCK_H_R} {last_visited_bots.BOT_NAME}
{last_visited_bots.LAST_VISIT_DATE}
diff --git a/root/styles/prosilver/template/portal/modules/latest_members_side.html b/root/styles/prosilver/template/portal/modules/latest_members_side.html index ff2bb118..1ed7a437 100644 --- a/root/styles/prosilver/template/portal/modules/latest_members_side.html +++ b/root/styles/prosilver/template/portal/modules/latest_members_side.html @@ -1,5 +1,5 @@ -{$LR_BLOCK_H_L} {L_LATEST_MEMBERS}{$LR_BLOCK_H_R} +{$LR_BLOCK_H_L} {L_LATEST_MEMBERS}{$LR_BLOCK_H_R} {L_USERNAME} {L_JOINED}
diff --git a/root/styles/prosilver/template/portal/modules/leaders_ext_side.html b/root/styles/prosilver/template/portal/modules/leaders_ext_side.html index 53848c8f..dc7c144f 100644 --- a/root/styles/prosilver/template/portal/modules/leaders_ext_side.html +++ b/root/styles/prosilver/template/portal/modules/leaders_ext_side.html @@ -1,5 +1,5 @@ -{$LR_BLOCK_H_L} {L_THE_TEAM}{$LR_BLOCK_H_R} +{$LR_BLOCK_H_L} {L_THE_TEAM}{$LR_BLOCK_H_R} {group.GROUP_NAME}
diff --git a/root/styles/prosilver/template/portal/modules/leaders_side.html b/root/styles/prosilver/template/portal/modules/leaders_side.html index 2883ddd4..16474e68 100644 --- a/root/styles/prosilver/template/portal/modules/leaders_side.html +++ b/root/styles/prosilver/template/portal/modules/leaders_side.html @@ -1,5 +1,5 @@ -{$LR_BLOCK_H_L} {L_THE_TEAM}{$LR_BLOCK_H_R} +{$LR_BLOCK_H_L} {L_THE_TEAM}{$LR_BLOCK_H_R} {L_ADMINISTRATORS}
{admin.USERNAME_FULL}
diff --git a/root/styles/prosilver/template/portal/modules/link_us_side.html b/root/styles/prosilver/template/portal/modules/link_us_side.html index 556c8e5e..531e0034 100644 --- a/root/styles/prosilver/template/portal/modules/link_us_side.html +++ b/root/styles/prosilver/template/portal/modules/link_us_side.html @@ -1,5 +1,5 @@ -{$LR_BLOCK_H_L} {L_LINK_US}{$LR_BLOCK_H_R} +{$LR_BLOCK_H_L} {L_LINK_US}{$LR_BLOCK_H_R} {LINK_US_TXT}


{$LR_BLOCK_F_L}{$LR_BLOCK_F_R} \ No newline at end of file diff --git a/root/styles/prosilver/template/portal/modules/links_side.html b/root/styles/prosilver/template/portal/modules/links_side.html index b027d996..1bb2414b 100644 --- a/root/styles/prosilver/template/portal/modules/links_side.html +++ b/root/styles/prosilver/template/portal/modules/links_side.html @@ -1,5 +1,5 @@ -{$LR_BLOCK_H_L} {L_PORTAL_LINKS}{$LR_BLOCK_H_R} +{$LR_BLOCK_H_L} {L_PORTAL_LINKS}{$LR_BLOCK_H_R}
    diff --git a/root/styles/prosilver/template/portal/modules/login_box_side.html b/root/styles/prosilver/template/portal/modules/login_box_side.html index 32e730c7..e15bf0fc 100644 --- a/root/styles/prosilver/template/portal/modules/login_box_side.html +++ b/root/styles/prosilver/template/portal/modules/login_box_side.html @@ -1,7 +1,7 @@
    -{$LR_BLOCK_H_L} {L_LOGIN_LOGOUT}{$LR_BLOCK_H_R} +{$LR_BLOCK_H_L} {L_LOGIN_LOGOUT}{$LR_BLOCK_H_R} {L_USERNAME}:


    {L_PASSWORD}:
    diff --git a/root/styles/prosilver/template/portal/modules/stylechanger_side.html b/root/styles/prosilver/template/portal/modules/stylechanger_side.html index 2f93b89d..099f595a 100644 --- a/root/styles/prosilver/template/portal/modules/stylechanger_side.html +++ b/root/styles/prosilver/template/portal/modules/stylechanger_side.html @@ -1,6 +1,6 @@ -{$LR_BLOCK_H_L} {L_BOARD_STYLE}{$LR_BLOCK_H_R} +{$LR_BLOCK_H_L} {L_BOARD_STYLE}{$LR_BLOCK_H_R} diff --git a/root/styles/prosilver/template/portal/modules/user_menu_side.html b/root/styles/prosilver/template/portal/modules/user_menu_side.html index d31b004e..b2c32bdd 100644 --- a/root/styles/prosilver/template/portal/modules/user_menu_side.html +++ b/root/styles/prosilver/template/portal/modules/user_menu_side.html @@ -1,5 +1,5 @@ -{$LR_BLOCK_H_L} {L_USER_MENU}{$LR_BLOCK_H_R} +{$LR_BLOCK_H_L} {L_USER_MENU}{$LR_BLOCK_H_R}
    {USERNAME_FULL}
    diff --git a/root/styles/prosilver/theme/images/portal/cal_icon_left_arrow.png b/root/styles/prosilver/theme/images/portal/cal_icon_left_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..33b7979b535c72f5ca7831597cd3bb5b8b4a0b0f GIT binary patch literal 744 zcmVP)%9thzrT3z(|^mPO(1{r0LAR({8pTwyY2q}*I)ntcg|dY1|Wb~uxRvGR~DU6l47o) zrzOSkkC}nt%P$57Ub{IfgS`#BvSW-H-hF3ac=VBh;nPnB27mx!LDHzt$;~k#F2dZw z&PJW#*=GiZtyh0CTt0b)fs3D)VPcP)*SG)d44ZF4lq(2A3;+lq7N|cP%xrWDJiLq< zUj1Tc*l>e^;pw%T3=eNSU#>K$!{Wk*xKmalQ`uzUb*;BU|o_|3|atQD; zyu5vv;q2Yd48Q*3k4At1V*dAd)0!_|_%FPF@Z3N^gkMBlN`OH`N|=G4pM~Ms$>R(^ zKYwKqml0;*=3-&sWMhD1Spf!yE9Y)J2M8cw7&H83czf*np9dQjynG|}>&xr+#;RH} z>~f0Y3@ZAH41E7TFr3+Tn1Pp@l|e~agn^Hf0gMHJUbqf403d*vkzDhO;nlu_U*3ON zcJ16Nf&c#)4GavW801x@7_OeW&TwVd)|%HZzH7+J@bb#b@-naiU2)^=jpqOX#Ejvo zFSkB2yxOzn#q+Hc$o z0AeJN)Y%wR3j-Mb{gh$2J8e3U{~Z)=4D#^?EE1+QylmfI0R#{u1^I{#gaHDGk<#o8 a5MTfS_TPrtT^A1k0000Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBU!B1uF+R5(w~l3hsCQ5eP#2HA%sMdXMv3mTaAv9*k4k`$uQDs3AR z6rD*;iW(*n$coj1kfegF*`~5S{9wu7F=I8$3TlD&KUuq45Uq=57v9Ju72zBH60*AJoUQW#50oct$vrdegZz|V?=(-VZ++cC(DzA2_W zY0Ecx;dn)8d!B%*B?MMlY!jtExh2C@Hg7)^l$4vi8F{c+?O ze6y_3VNW_tQ&t`jcGzy$g5rXdsFJlCA zyNIQw?!bmRKPEpB#y=9=qcN;A41Hj#YgO}p?CxfPPk$!#1fr1d9eB;Qy2_Gk(jN5V z&HFeiTY@u8`6pHRCwBA zEGaHx`1_S%Rx5)Ab?na*noqBy+Be%E=oaBnN?awfu;m_}13~~wz z4319D+855BHwOxygc$%3Kn#5oCw;zn{pSC-pFaJ6_4fV$PhYr)yJ<49NgRtJV0l&{Q1kk za^WHa!;KpZ|6jdiU_O3~f$`F1hJQfCGU6f(){aintjtUiEX+&{Y^*E{00G1dWEiO% zTI(ywOE55l0`&K925`V?YB2nhl44-GbC-busPK=xJOe9G{5K0HYyXB{jAOHR88v_F)P{BVAPKG}U@<1CI8JG_rW?+2!l!4*pONRf?o`apN zsjb6cU}0klWa@zU00G1-Cc^g!82{n2`gS6U;@k|3K)3z_IRR+;f1u5Ol~ov+uU}_i z272SKrX~XyFBik}Pd`|X@7?kJ*RNl@00M~V)2FY$p4`5?;p~~q|6l!PU|<0{<3Gp{ zV1WKnRAl(0tOPWOm4Wf&M~2_P@L>a*ZDDQ2sHCYK1Z4671Q4@`ARoiGFCQK;un8r} z8alBl3oY96aWhW0005=^8f|^{Qvt<1$snxaeAB9U zwwj*47{k?j3=DUk{AYOg>?6a^XEz!CJv++q`}wIqU!I?R`TotLbDzKd+5rrzjQ|0} zs3ao-j-G#ie=%@y^41Et^f$c`aAaV5c$9(Z#i9Q{U!MN