diff --git a/install/create.sql b/install/create.sql index 360c4a2..369f74d 100644 --- a/install/create.sql +++ b/install/create.sql @@ -1282,4 +1282,25 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2020-12-21 13:16:22 + +DROP TABLE IF EXISTS `calcms_user_selected_events`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `calcms_user_selected_events` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `user` varchar(45) NOT NULL, + `project_id` int(10) unsigned DEFAULT NULL, + `studio_id` int(10) unsigned DEFAULT NULL, + `series_id` int(10) unsigned DEFAULT NULL, + `filter_project_studio` int(1) unsigned DEFAULT NULL, + `filter_series` int(1) unsigned DEFAULT NULL, + `selected_project` int(10) unsigned DEFAULT NULL, + `selected_studio` int(10) unsigned DEFAULT NULL, + `selected_series` int(10) unsigned DEFAULT NULL, + `selected_event` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique` (`user`,`project_id`,`studio_id`,`series_id`,`filter_project_studio`,`filter_series`), + KEY `user` (`user`,`project_id`,`studio_id`,`series_id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; + diff --git a/lib/calcms/user_selected_events.pm b/lib/calcms/user_selected_events.pm new file mode 100644 index 0000000..a8a36da --- /dev/null +++ b/lib/calcms/user_selected_events.pm @@ -0,0 +1,127 @@ +package user_selected_events; + +use strict; +use warnings; +no warnings 'redefine'; + +use Data::Dumper; + +# table: calcms_user_selected_events +# columns: user, project_id, studio_id, series_id, <- selection +# project_studio_filter, series_filter <- optional filter params +# selected_project, selected_studio, selected_series, selected_event <-result + +sub debug; + +sub get_columns($) { + my $config = shift; + + my $dbh = db::connect($config); + return db::get_columns_hash( $dbh, 'calcms_user_selected_events' ); +} + +sub get ($$) { + my $config = shift; + my $condition = shift; + + my @conditions = (); + my @bind_values = (); + + return unless defined $condition->{user}; + return unless defined $condition->{project_id}; + return unless defined $condition->{studio_id}; + return unless defined $condition->{series_id}; + + for my $field ('user', 'project_id', 'studio_id', 'series_id', + 'filter_project_studio', 'filter_series' + ){ + if ( ( defined $condition->{$field} ) && ( $condition->{$field} ne '' ) ) { + push @conditions, $field.'=?'; + push @bind_values, $condition->{$field}; + } + } + + my $conditions = ''; + $conditions = " where " . join( " and ", @conditions ) if scalar(@conditions) > 0; + + my $query = qq{ + select * + from calcms_user_selected_events + $conditions + }; + + my $dbh = db::connect($config); + my $entries = db::get( $dbh, $query, \@bind_values ); + return $entries->[0] || undef; +} + +sub insert ($$) { + my $config = shift; + my $entry = shift; + + return unless defined $entry->{user}; + return unless defined $entry->{project_id}; + return unless defined $entry->{studio_id}; + return unless defined $entry->{series_id}; + return unless defined $entry->{selected_event}; + + my $dbh = db::connect($config); + print STDERR "insert".Dumper($entry ); + return db::insert( $dbh, 'calcms_user_selected_events', $entry ); +} + +sub update($$) { + my $config = shift; + my $entry = shift; + + my $fields = [ + 'user', 'project_id', 'studio_id', 'series_id', + 'filter_project_studio', 'filter_series' + ]; + for (@$fields){ + return unless defined $entry->{$_} + }; + + my @keys = sort keys %$entry; + my $values = join( ",", map { $_ . '=?' } @keys ); + my @bind_values = map { $entry->{$_} } ( @keys, @$fields ); + my $conditions = join (' and ', map { $_.'=?' } @$fields ); + + my $query = qq{ + update calcms_user_selected_events + set $values + where $conditions + }; + + print STDERR "update".Dumper($query ).Dumper(\@bind_values); + my $dbh = db::connect($config); + return db::put( $dbh, $query, \@bind_values ); +} + +sub delete ($$) { + my $config = shift; + my $entry = shift; + + return unless defined $entry->{user}; + return unless defined $entry->{project_id}; + return unless defined $entry->{studio_id}; + return unless defined $entry->{series_id}; + + my $query = qq{ + delete + from calcms_user_selected_events + where user=? and project_id=? and studio_id=? and series_id=? + }; + my $bind_values = [ $entry->{user}, $entry->{project_id}, $entry->{studio_id}, $entry->{series_id} ]; + + my $dbh = db::connect($config); + return db::put( $dbh, $query, $bind_values ); +} + +sub error ($) { + my $msg = shift; + print "ERROR: $msg
\n"; +} + +#do not delete last line! +1; diff --git a/website/agenda/planung/js/select-event.js b/website/agenda/planung/js/select-event.js index e4e6b52..d8c0fcc 100644 --- a/website/agenda/planung/js/select-event.js +++ b/website/agenda/planung/js/select-event.js @@ -88,8 +88,33 @@ function updateEventSelection(resultElemId){ // set selected eventId at external result selector function selectEventAction(resultElemId){ - var eventId=$('#selectEvent #eventId').val(); + + + var projectId = $('#selectEvent #projectId').val(); + var studioId = $('#selectEvent #studioId').val(); + var seriesId = $('#selectEvent #seriesId').val(); + var eventId = $('#selectEvent #eventId').val(); if (eventId<=0) return; + + var filterProjectStudio = $('#selectEvent #selectProjectStudio').length!=0 ? 1:0; + var filterSeries = $('#selectEvent #selectSeries').length!=0 ? 1:0; + + var url = "user-selected-event.cgi"; + url += "?project_id=" + getProjectId(); + url += "&studio_id=" + getStudioId(); + url += "&series_id=" + getUrlParameter("series_id"); + url += "&filter_project_studio=" + filterProjectStudio; + url += "&filter_series=" + filterSeries; + url += "&selected_project=" + projectId; + url += "&selected_studio=" + studioId; + url += "&selected_series=" + seriesId; + url += "&selected_event=" + eventId; + $.get(url).done(function() { + console.log("success: "+url) + }).fail(function() { + console.log("failed: "+url) + }); + // set the result value $('#'+resultElemId).val( eventId ); // trigger the change event for invisble form elements diff --git a/website/agenda/planung/select-event.cgi b/website/agenda/planung/select-event.cgi index 2bc576f..e26d587 100755 --- a/website/agenda/planung/select-event.cgi +++ b/website/agenda/planung/select-event.cgi @@ -16,6 +16,7 @@ use uac(); use series(); use localization(); +use user_selected_events(); binmode STDOUT, ":utf8"; @@ -70,11 +71,21 @@ sub show_events { return; } + my $entry = { + user => $request->{user}, + project_id => $params->{p_id}, + studio_id => $params->{s_id}, + series_id => $params->{series_id}, + filter_project_studio => $params->{selectProjectStudio}, + filter_series => $params->{selectSeries}, + }; + my $preset = user_selected_events::get($config, $entry); + # get user projects my $user_projects = uac::get_projects_by_user( $config, { user => $request->{user} } ); - my $projects = {}; + my $project_by_id = {}; for my $project (@$user_projects) { - $projects->{ $project->{project_id} } = $project; + $project_by_id->{ $project->{project_id} } = $project; } # get user studios @@ -82,32 +93,64 @@ sub show_events { for my $studio (@$user_studios) { my $project_id = $studio->{project_id}; my $studio_id = $studio->{id}; - $studio->{project_name} = $projects->{$project_id}->{name}; - $studio->{selected} = 1 if ( $project_id eq $params->{p_id} ) && ( $studio_id eq $params->{s_id} ); + $studio->{project_name} = $project_by_id->{$project_id}->{name}; + if ($preset) { + $studio->{selected} = 1 if $project_id eq $preset->{selected_project} and $studio_id eq $preset->{selected_studio}; + } else { + $studio->{selected} = 1 if $project_id eq $params->{p_id} and $studio_id eq $params->{s_id}; + } } # get series my $options = {}; - $options->{project_id} = $params->{p_id} if defined $params->{p_id}; - $options->{studio_id} = $params->{s_id} if defined $params->{s_id}; + if ($preset){ + $options->{project_id} = $preset->{selected_project}; + $options->{studio_id} = $preset->{selected_studio}; + }else{ + $options->{project_id} = $params->{p_id} if defined $params->{p_id}; + $options->{studio_id} = $params->{s_id} if defined $params->{s_id}; + } my $series = series::get( $config, $options ); for my $serie (@$series) { - $serie->{selected} = 1 if ( defined $params->{series_id} ) && ( $serie->{series_id} eq $params->{series_id} ); + if ( defined $params->{series_id} ){ + if ($preset){ + $serie->{selected} = 1 if $serie->{series_id} eq $preset->{selected_series}; + } else { + $serie->{selected} = 1 if $serie->{series_id} eq $params->{series_id}; + } + } $serie->{series_name} = 'Einzelsendung' if $serie->{series_name} eq '_single_'; } # get events - $options->{series_id} = $params->{series_id} if defined $params->{series_id}; + if ($preset){ + $options->{series_id} = $preset->{selected_series}; + }else{ + $options->{series_id} = $params->{series_id} if defined $params->{series_id}; + } $options->{from_date} = $params->{from_date} if defined $params->{from_date}; $options->{till_date} = $params->{till_date} if defined $params->{till_date}; + $options->{set_no_listen_keys} = 1; my $events = series::get_events( $config, $options ); + my $preset_year = ''; + for my $event ( @$events ) { + if ($preset and $preset->{selected_event} eq $event->{id}){ + $event->{selected} = 1; + $preset_year = (split /\-/, $event->{start_date})[0]; + } + } + # filter by year my $years = []; for my $year ( 2005 .. 2025 ) { my $date = { year => $year }; - $date->{selected} = 1 if ( defined $params->{from_date} ) && ( $params->{from_date} eq $year . '-01-01' ); + if ( $preset ){ + $date->{selected} = 1 if $preset_year eq $year; + }else{ + $date->{selected} = 1 if ( defined $params->{from_date} ) && ( $params->{from_date} eq $year . '-01-01' ); + } push @$years, $date; } diff --git a/website/agenda/planung/templates/assign-series.html b/website/agenda/planung/templates/assign-series.html index 3624349..9240b8b 100644 --- a/website/agenda/planung/templates/assign-series.html +++ b/website/agenda/planung/templates/assign-series.html @@ -15,7 +15,9 @@ if (series_id=='')return false; $('#assignments_form input[name="series_id"]').val(series_id); - var url="assign-series.cgi?project_id="+project_id+'&studio_id='+studio_id+'&series_id='+series_id+'&action=assign_series'; + $('#assignments_form input[name="action"]').val("assign_series"); + //var url="assign-series.cgi?project_id="+project_id+'&studio_id='+studio_id+'&series_id='+series_id+'&action=assign_series'; + //console.log("url:"+url); $('#assignments_form').submit(); return false; } @@ -24,9 +26,12 @@ if (project_id=='')return false; if (studio_id=='')return false; if (series_id=='')return false; - + $('#assignments_form input[name="series_id"]').val(series_id); - var url="assign-series.cgi?project_id="+project_id+'&studio_id='+studio_id+'&series_id='+series_id+'&action=unassign_series'; + $('#assignments_form input[name="action"]').val("unassign_series"); + alert("unassign"); + //var url="assign-series.cgi?project_id="+project_id+'&studio_id='+studio_id+'&series_id='+series_id+'&action=unassign_series'; + //console.log("url:"+url); $('#assignments_form').submit(); return false; } @@ -39,7 +44,7 @@ } - assign series to project and studio + assign and unassign series to project and studio
@@ -49,7 +54,7 @@ @@ -57,7 +62,6 @@ -