From ef84ca07a3d52ead63f9419d59357b9bbd92bae9 Mon Sep 17 00:00:00 2001 From: Milan Date: Mon, 1 Feb 2021 22:58:23 +0100 Subject: [PATCH] copying events: save user selection On copying events from another studio selection will be saved. The next time one wants to copy saved presets are preselected. This simplifies to frequently rebroadcast shows from another project. --- install/create.sql | 23 +++- lib/calcms/user_selected_events.pm | 127 ++++++++++++++++++ website/agenda/planung/js/select-event.js | 27 +++- website/agenda/planung/select-event.cgi | 61 +++++++-- .../planung/templates/assign-series.html | 16 ++- .../planung/templates/select-event.html | 2 +- .../agenda/planung/user-selected-event.cgi | 110 +++++++++++++++ 7 files changed, 348 insertions(+), 18 deletions(-) create mode 100644 lib/calcms/user_selected_events.pm create mode 100644 website/agenda/planung/user-selected-event.cgi 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 @@ -