# HG changeset patch # User Paul Boddie # Date 1445203952 -7200 # Node ID f113c939d93c0a462e9d2e36ee16807fbad38449 # Parent fc2d5f82623677d6183fb8f621b9dcbf74c0a91c Improved the time navigation, storing the current period in form fields so that other state information can be maintained while navigating between periods. Expanded the day padding to fill the current period instead of just the days between those containing events. Fixed the availability of the period selection reset button. diff -r fc2d5f826236 -r f113c939d93c htdocs/styles.css --- a/htdocs/styles.css Sun Oct 18 23:24:37 2015 +0200 +++ b/htdocs/styles.css Sun Oct 18 23:32:32 2015 +0200 @@ -188,6 +188,8 @@ /* Hide the controls. */ +input#earlier, +input#later, input#hidebusy, input#showdays, @@ -257,6 +259,8 @@ /* Style the labels. */ +label.earlier, +label.later, label.day, label.timepoint, label.newevent, @@ -291,6 +295,8 @@ float: none; } +label.earlier, +label.later, .dt.disabled label, .dt.enabled label, label.add, @@ -312,12 +318,22 @@ margin-top: 0.25em; } +label.earlier, +label.later, label.hidebusy, label.showdays, label.reset { padding-left: 0.25em; } +label.earlier { + border-left: 1em solid #f85; +} + +label.later { + border-left: 1em solid #f85; +} + label.showdays { border-left: 1em solid #faa; /* th.participantheading background-color */ } diff -r fc2d5f826236 -r f113c939d93c imiptools/period.py --- a/imiptools/period.py Sun Oct 18 23:24:37 2015 +0200 +++ b/imiptools/period.py Sun Oct 18 23:32:32 2015 +0200 @@ -794,11 +794,14 @@ return d -def add_empty_days(days, tzid): +def add_empty_days(days, tzid, start=None, end=None): - "Add empty days to 'days' between busy days." + """ + Add empty days to 'days' between busy days, and optionally from the given + 'start' day and until the given 'end' day. + """ - last_day = None + last_day = start all_days = days.keys() all_days.sort() @@ -808,7 +811,13 @@ while empty_day < day: days[empty_day] = [(Point(get_start_of_day(empty_day, tzid)), None)] empty_day += timedelta(1) - last_day = day + last_day = day + + if end: + empty_day = last_day + timedelta(1) + while empty_day < end: + days[empty_day] = [(Point(get_start_of_day(empty_day, tzid)), None)] + empty_day += timedelta(1) def get_spans(slots): diff -r fc2d5f826236 -r f113c939d93c imipweb/calendar.py --- a/imipweb/calendar.py Sun Oct 18 23:24:37 2015 +0200 +++ b/imipweb/calendar.py Sun Oct 18 23:32:32 2015 +0200 @@ -19,7 +19,7 @@ this program. If not, see . """ -from datetime import datetime +from datetime import datetime, timedelta from imiptools.data import get_address, get_uri, uri_parts from imiptools.dates import format_datetime, get_datetime, \ get_datetime_item, get_end_of_day, get_start_of_day, \ @@ -250,6 +250,63 @@ return participants + def show_time_navigation(self, view_start, view_end, view_period=None): + + """ + Show the calendar navigation links for the period defined by + 'view_start' and 'view_end'. + """ + + page = self.page + view_period = view_period or timedelta(7) + + page.p() + + if view_start: + if view_end: + earlier_start = view_start - (view_end - view_start) + else: + earlier_start = view_start - view_period + page.label("Show earlier events", for_="earlier", class_="earlier") + page.input(name="earlier", id_="earlier", type="submit") + page.input(name="earlier-start", type="hidden", value=format_datetime(earlier_start)) + page.input(name="earlier-end", type="hidden", value=format_datetime(view_start)) + page.input(name="start", type="hidden", value=format_datetime(view_start)) + + if view_end: + if view_start: + later_end = view_end + (view_end - view_start) + else: + later_end = view_end + view_period + page.label("Show later events", for_="later", class_="later") + page.input(name="later", id_="later", type="submit") + page.input(name="later-start", type="hidden", value=format_datetime(view_end)) + page.input(name="later-end", type="hidden", value=format_datetime(later_end)) + page.input(name="end", type="hidden", value=format_datetime(view_end)) + + page.p.close() + + def get_time_navigation(self): + + "Return the start and end dates for the calendar view." + + for args in [self.env.get_args(), self.env.get_query()]: + if args.has_key("earlier"): + start_name, end_name = "earlier-start", "earlier-end" + break + elif args.has_key("later"): + start_name, end_name = "later-start", "later-end" + break + elif args.has_key("start") or args.has_key("end"): + start_name, end_name = "start", "end" + break + else: + return None, None + + view_start = self.get_date_arg(args, start_name) + view_end = self.get_date_arg(args, end_name) + return view_start, view_end + # Full page output methods. def show(self): @@ -282,11 +339,11 @@ # Day view: start at the earliest known day and produce days until the # latest known day, with expandable sections of empty days. - args = self.env.get_query() - view_start = self.get_date_arg(args, "start") - view_end = self.get_date_arg(args, "end") + view_start, view_end = self.get_time_navigation() view_period = (view_start or view_end) and Period(view_start, view_end, self.get_tzid()) + self.show_time_navigation(view_start, view_end) + # Requests are listed and linked to their tentative positions in the # calendar. Other participants are also shown. @@ -400,9 +457,7 @@ # Add empty days. - add_empty_days(days, tzid) - - page.p("Select days or periods for a new event.") + add_empty_days(days, tzid, view_start, view_end) # Show controls for hiding empty days and busy slots. # The positioning of the control, paragraph and table are important here. @@ -411,12 +466,12 @@ page.input(name="hidebusy", type="checkbox", value="hide", id="hidebusy", accesskey="B") page.p(class_="controls") + page.span("Select days or periods for a new event.") page.label("Hide busy time periods", for_="hidebusy", class_="hidebusy enable") page.label("Show busy time periods", for_="hidebusy", class_="hidebusy disable") page.label("Show empty days", for_="showdays", class_="showdays disable") page.label("Hide empty days", for_="showdays", class_="showdays enable") page.input(name="reset", type="submit", value="Clear selections", id="reset") - page.label("Clear selections", for_="reset", class_="reset newevent-with-periods") page.p.close() # Show the calendar itself. @@ -634,6 +689,10 @@ page.input(name="newevent-%d" % i, type="submit", value="New event", accesskey="N") page.p.close() + page.p(class_="newevent-with-periods") + page.label("Clear selections", for_="reset", class_="reset") + page.p.close() + page.div.close() i += 1