X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FReaction%2FUI%2FViewPort%2FField%2FTimeRange.pm;h=f227203cca1ffaa2eb8bc11ce47d7b9dc2ce4729;hb=565a1fc7fe67c721f2766bdc3f55c5fcb33fc760;hp=a63fdf4c9af525e272d854fcca00e88110f14eab;hpb=e739c9a211e3a55714904f6c75843e8902226214;p=catagits%2FReaction.git diff --git a/lib/Reaction/UI/ViewPort/Field/TimeRange.pm b/lib/Reaction/UI/ViewPort/Field/TimeRange.pm index a63fdf4..f227203 100644 --- a/lib/Reaction/UI/ViewPort/Field/TimeRange.pm +++ b/lib/Reaction/UI/ViewPort/Field/TimeRange.pm @@ -1,94 +1,93 @@ package Reaction::UI::ViewPort::Field::TimeRange; use Reaction::Class; -use Reaction::Types::DateTime; +use Reaction::Types::DateTime qw(SpanSet); use DateTime; use DateTime::SpanSet; use Time::ParseDate (); -class TimeRange is 'Reaction::UI::ViewPort::Field', which { - - has '+value' => (isa => 'SpanSet'); - - #has '+layout' => (default => 'timerange'); - - has value_string => - (isa => 'Str', is => 'rw', lazy_fail => 1, trigger_adopt('value_string')); - - has delete_label => ( - isa => 'Str', is => 'rw', required => 1, default => sub { 'Delete' }, - ); - - has parent => ( - isa => 'Reaction::UI::ViewPort::TimeRangeCollection', - is => 'ro', - required => 1, - is_weak_ref => 1 - ); - - implements _build_value_string => as { - my $self = shift; - #return '' unless $self->has_value; - #return $self->value_string; - }; - - implements value_array => as { - my $self = shift; - return split(',', $self->value_string); - }; - - implements adopt_value_string => as { - my ($self) = @_; - my @values = $self->value_array; - for my $idx (0 .. 3) { # last value is repeat - if (length $values[$idx]) { - my ($epoch) = Time::ParseDate::parsedate($values[$idx], UK => 1); - $values[$idx] = DateTime->from_epoch( epoch => $epoch ); - } +use namespace::clean -except => [ qw(meta) ]; +extends 'Reaction::UI::ViewPort::Field'; + + + +has '+value' => (isa => SpanSet); + +#has '+layout' => (default => 'timerange'); + +has value_string => + (isa => 'Str', is => 'rw', lazy_fail => 1, trigger_adopt('value_string')); + +has delete_label => ( + isa => 'Str', is => 'rw', required => 1, default => sub { 'Delete' }, +); + +has parent => ( + isa => 'Reaction::UI::ViewPort::TimeRangeCollection', + is => 'ro', + required => 1, + is_weak_ref => 1 +); +sub _build_value_string { + my $self = shift; + #return '' unless $self->has_value; + #return $self->value_string; +}; +sub value_array { + my $self = shift; + return split(',', $self->value_string); +}; +sub adopt_value_string { + my ($self) = @_; + my @values = $self->value_array; + for my $idx (0 .. 3) { # last value is repeat + if (length $values[$idx]) { + my ($epoch) = Time::ParseDate::parsedate($values[$idx], UK => 1); + $values[$idx] = DateTime->from_epoch( epoch => $epoch ); } - $self->value($self->range_to_spanset(@values)); - }; - - implements range_to_spanset => as { - my ($self, $time_from, $time_to, $repeat_from, $repeat_to, $pattern) = @_; - my $spanset = DateTime::SpanSet->empty_set; - if (!$pattern || $pattern eq 'none') { - my $span = DateTime::Span->from_datetimes( - start => $time_from, end => $time_to - ); - $spanset = $spanset->union( $span ); - } else { - my $duration = $time_to - $time_from; - my %args = ( days => $time_from->day + 2, - hours => $time_from->hour, - minutes => $time_from->minute, - seconds => $time_from->second ); - - delete $args{'days'} if ($pattern eq 'daily'); - delete @args{qw/hours days/} if ($pattern eq 'hourly'); - $args{'days'} = $time_from->day if ($pattern eq 'monthly'); - my $start_set = DateTime::Event::Recurrence->$pattern( %args ); - my $iter = $start_set->iterator( start => $repeat_from, end => $repeat_to ); - while ( my $dt = $iter->next ) { - my $endtime = $dt + $duration; - my $new_span = DateTime::Span->from_datetimes( - start => $dt, - end => $endtime - ); - $spanset = $spanset->union( $new_span ); - } + } + $self->value($self->range_to_spanset(@values)); +}; +sub range_to_spanset { + my ($self, $time_from, $time_to, $repeat_from, $repeat_to, $pattern) = @_; + my $spanset = DateTime::SpanSet->empty_set; + if (!$pattern || $pattern eq 'none') { + my $span = DateTime::Span->from_datetimes( + start => $time_from, end => $time_to + ); + $spanset = $spanset->union( $span ); + } else { + my $duration = $time_to - $time_from; + my %args = ( days => $time_from->day + 2, + hours => $time_from->hour, + minutes => $time_from->minute, + seconds => $time_from->second ); + + delete $args{'days'} if ($pattern eq 'daily'); + delete @args{qw/hours days/} if ($pattern eq 'hourly'); + $args{'days'} = $time_from->day if ($pattern eq 'monthly'); + my $start_set = DateTime::Event::Recurrence->$pattern( %args ); + my $iter = $start_set->iterator( start => $repeat_from, end => $repeat_to ); + while ( my $dt = $iter->next ) { + my $endtime = $dt + $duration; + my $new_span = DateTime::Span->from_datetimes( + start => $dt, + end => $endtime + ); + $spanset = $spanset->union( $new_span ); } - return $spanset; - }; + } + return $spanset; +}; +sub delete { + my ($self) = @_; + $self->parent->remove_range_vp($self); +}; - implements delete => as { - my ($self) = @_; - $self->parent->remove_range_vp($self); - }; +override accept_events => sub { ('value_string', 'delete', super()) }; - override accept_events => sub { ('value_string', 'delete', super()) }; +__PACKAGE__->meta->make_immutable; -}; 1;