1.1 --- a/htdocs/styles.css Sun Oct 18 23:24:37 2015 +0200
1.2 +++ b/htdocs/styles.css Sun Oct 18 23:32:32 2015 +0200
1.3 @@ -188,6 +188,8 @@
1.4
1.5 /* Hide the controls. */
1.6
1.7 +input#earlier,
1.8 +input#later,
1.9 input#hidebusy,
1.10 input#showdays,
1.11
1.12 @@ -257,6 +259,8 @@
1.13
1.14 /* Style the labels. */
1.15
1.16 +label.earlier,
1.17 +label.later,
1.18 label.day,
1.19 label.timepoint,
1.20 label.newevent,
1.21 @@ -291,6 +295,8 @@
1.22 float: none;
1.23 }
1.24
1.25 +label.earlier,
1.26 +label.later,
1.27 .dt.disabled label,
1.28 .dt.enabled label,
1.29 label.add,
1.30 @@ -312,12 +318,22 @@
1.31 margin-top: 0.25em;
1.32 }
1.33
1.34 +label.earlier,
1.35 +label.later,
1.36 label.hidebusy,
1.37 label.showdays,
1.38 label.reset {
1.39 padding-left: 0.25em;
1.40 }
1.41
1.42 +label.earlier {
1.43 + border-left: 1em solid #f85;
1.44 +}
1.45 +
1.46 +label.later {
1.47 + border-left: 1em solid #f85;
1.48 +}
1.49 +
1.50 label.showdays {
1.51 border-left: 1em solid #faa; /* th.participantheading background-color */
1.52 }
2.1 --- a/imiptools/period.py Sun Oct 18 23:24:37 2015 +0200
2.2 +++ b/imiptools/period.py Sun Oct 18 23:32:32 2015 +0200
2.3 @@ -794,11 +794,14 @@
2.4
2.5 return d
2.6
2.7 -def add_empty_days(days, tzid):
2.8 +def add_empty_days(days, tzid, start=None, end=None):
2.9
2.10 - "Add empty days to 'days' between busy days."
2.11 + """
2.12 + Add empty days to 'days' between busy days, and optionally from the given
2.13 + 'start' day and until the given 'end' day.
2.14 + """
2.15
2.16 - last_day = None
2.17 + last_day = start
2.18 all_days = days.keys()
2.19 all_days.sort()
2.20
2.21 @@ -808,7 +811,13 @@
2.22 while empty_day < day:
2.23 days[empty_day] = [(Point(get_start_of_day(empty_day, tzid)), None)]
2.24 empty_day += timedelta(1)
2.25 - last_day = day
2.26 + last_day = day
2.27 +
2.28 + if end:
2.29 + empty_day = last_day + timedelta(1)
2.30 + while empty_day < end:
2.31 + days[empty_day] = [(Point(get_start_of_day(empty_day, tzid)), None)]
2.32 + empty_day += timedelta(1)
2.33
2.34 def get_spans(slots):
2.35
3.1 --- a/imipweb/calendar.py Sun Oct 18 23:24:37 2015 +0200
3.2 +++ b/imipweb/calendar.py Sun Oct 18 23:32:32 2015 +0200
3.3 @@ -19,7 +19,7 @@
3.4 this program. If not, see <http://www.gnu.org/licenses/>.
3.5 """
3.6
3.7 -from datetime import datetime
3.8 +from datetime import datetime, timedelta
3.9 from imiptools.data import get_address, get_uri, uri_parts
3.10 from imiptools.dates import format_datetime, get_datetime, \
3.11 get_datetime_item, get_end_of_day, get_start_of_day, \
3.12 @@ -250,6 +250,63 @@
3.13
3.14 return participants
3.15
3.16 + def show_time_navigation(self, view_start, view_end, view_period=None):
3.17 +
3.18 + """
3.19 + Show the calendar navigation links for the period defined by
3.20 + 'view_start' and 'view_end'.
3.21 + """
3.22 +
3.23 + page = self.page
3.24 + view_period = view_period or timedelta(7)
3.25 +
3.26 + page.p()
3.27 +
3.28 + if view_start:
3.29 + if view_end:
3.30 + earlier_start = view_start - (view_end - view_start)
3.31 + else:
3.32 + earlier_start = view_start - view_period
3.33 + page.label("Show earlier events", for_="earlier", class_="earlier")
3.34 + page.input(name="earlier", id_="earlier", type="submit")
3.35 + page.input(name="earlier-start", type="hidden", value=format_datetime(earlier_start))
3.36 + page.input(name="earlier-end", type="hidden", value=format_datetime(view_start))
3.37 + page.input(name="start", type="hidden", value=format_datetime(view_start))
3.38 +
3.39 + if view_end:
3.40 + if view_start:
3.41 + later_end = view_end + (view_end - view_start)
3.42 + else:
3.43 + later_end = view_end + view_period
3.44 + page.label("Show later events", for_="later", class_="later")
3.45 + page.input(name="later", id_="later", type="submit")
3.46 + page.input(name="later-start", type="hidden", value=format_datetime(view_end))
3.47 + page.input(name="later-end", type="hidden", value=format_datetime(later_end))
3.48 + page.input(name="end", type="hidden", value=format_datetime(view_end))
3.49 +
3.50 + page.p.close()
3.51 +
3.52 + def get_time_navigation(self):
3.53 +
3.54 + "Return the start and end dates for the calendar view."
3.55 +
3.56 + for args in [self.env.get_args(), self.env.get_query()]:
3.57 + if args.has_key("earlier"):
3.58 + start_name, end_name = "earlier-start", "earlier-end"
3.59 + break
3.60 + elif args.has_key("later"):
3.61 + start_name, end_name = "later-start", "later-end"
3.62 + break
3.63 + elif args.has_key("start") or args.has_key("end"):
3.64 + start_name, end_name = "start", "end"
3.65 + break
3.66 + else:
3.67 + return None, None
3.68 +
3.69 + view_start = self.get_date_arg(args, start_name)
3.70 + view_end = self.get_date_arg(args, end_name)
3.71 + return view_start, view_end
3.72 +
3.73 # Full page output methods.
3.74
3.75 def show(self):
3.76 @@ -282,11 +339,11 @@
3.77 # Day view: start at the earliest known day and produce days until the
3.78 # latest known day, with expandable sections of empty days.
3.79
3.80 - args = self.env.get_query()
3.81 - view_start = self.get_date_arg(args, "start")
3.82 - view_end = self.get_date_arg(args, "end")
3.83 + view_start, view_end = self.get_time_navigation()
3.84 view_period = (view_start or view_end) and Period(view_start, view_end, self.get_tzid())
3.85
3.86 + self.show_time_navigation(view_start, view_end)
3.87 +
3.88 # Requests are listed and linked to their tentative positions in the
3.89 # calendar. Other participants are also shown.
3.90
3.91 @@ -400,9 +457,7 @@
3.92
3.93 # Add empty days.
3.94
3.95 - add_empty_days(days, tzid)
3.96 -
3.97 - page.p("Select days or periods for a new event.")
3.98 + add_empty_days(days, tzid, view_start, view_end)
3.99
3.100 # Show controls for hiding empty days and busy slots.
3.101 # The positioning of the control, paragraph and table are important here.
3.102 @@ -411,12 +466,12 @@
3.103 page.input(name="hidebusy", type="checkbox", value="hide", id="hidebusy", accesskey="B")
3.104
3.105 page.p(class_="controls")
3.106 + page.span("Select days or periods for a new event.")
3.107 page.label("Hide busy time periods", for_="hidebusy", class_="hidebusy enable")
3.108 page.label("Show busy time periods", for_="hidebusy", class_="hidebusy disable")
3.109 page.label("Show empty days", for_="showdays", class_="showdays disable")
3.110 page.label("Hide empty days", for_="showdays", class_="showdays enable")
3.111 page.input(name="reset", type="submit", value="Clear selections", id="reset")
3.112 - page.label("Clear selections", for_="reset", class_="reset newevent-with-periods")
3.113 page.p.close()
3.114
3.115 # Show the calendar itself.
3.116 @@ -634,6 +689,10 @@
3.117 page.input(name="newevent-%d" % i, type="submit", value="New event", accesskey="N")
3.118 page.p.close()
3.119
3.120 + page.p(class_="newevent-with-periods")
3.121 + page.label("Clear selections", for_="reset", class_="reset")
3.122 + page.p.close()
3.123 +
3.124 page.div.close()
3.125
3.126 i += 1