From 15708d951ba01486856da6cb388a11fdfedaae7b Mon Sep 17 00:00:00 2001 From: Milan Date: Fri, 5 Feb 2021 22:59:31 +0100 Subject: [PATCH] calendar.js: save selected day start time set the day start time to the last selecved value for each studio the user is assigned to. --- install/create.sql | 27 ++++ lib/calcms/user_day_start.pm | 128 ++++++++++++++++++ website/agenda/planung/calendar.cgi | 15 +- website/agenda/planung/js/calendar.js | 9 ++ website/agenda/planung/set-user-day-start.cgi | 100 ++++++++++++++ 5 files changed, 277 insertions(+), 2 deletions(-) create mode 100644 lib/calcms/user_day_start.pm create mode 100644 website/agenda/planung/set-user-day-start.cgi diff --git a/install/create.sql b/install/create.sql index 81ab307..e712a3c 100644 --- a/install/create.sql +++ b/install/create.sql @@ -1308,3 +1308,30 @@ CREATE TABLE `calcms_user_selected_events` ( ALTER TABLE `calcms`.`calcms_events` ADD COLUMN `upload_status` VARCHAR(45) NULL DEFAULT NULL AFTER `listen_key`; +-- +-- Table structure for table `calcms_user_day_start` +-- + +DROP TABLE IF EXISTS `calcms_user_day_start`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `calcms_user_day_start` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `user` varchar(45) NOT NULL, + `project_id` int(10) unsigned NOT NULL, + `studio_id` int(10) unsigned NOT NULL, + `day_start` int(10) unsigned DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `select` (`project_id`,`studio_id`,`user`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + diff --git a/lib/calcms/user_day_start.pm b/lib/calcms/user_day_start.pm new file mode 100644 index 0000000..34dce6a --- /dev/null +++ b/lib/calcms/user_day_start.pm @@ -0,0 +1,128 @@ +package user_day_start; + +use strict; +use warnings; +no warnings 'redefine'; + +use Data::Dumper; + +# table: calcms_user_day_start +# columns: user, project_id, studio_id, series_id, day_start + +sub debug; + +sub get_columns($) { + my $config = shift; + + my $dbh = db::connect($config); + return db::get_columns_hash( $dbh, 'calcms_user_day_start' ); +} + +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}; + + for my $field ('user', 'project_id', 'studio_id'){ + 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_day_start + $conditions + }; + + my $dbh = db::connect($config); + my $entries = db::get( $dbh, $query, \@bind_values ); + return $entries->[0] || undef; +} + +sub insert_or_update($$){ + my $config = shift; + my $entry = shift; + print STDERR Dumper $entry; + if ( get($config, $entry) ){ + update ($config, $entry); + } else { + insert ($config, $entry); + } +} + +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->{day_start}; + + my $dbh = db::connect($config); + print STDERR "insert".Dumper($entry ); + return db::insert( $dbh, 'calcms_user_day_start', $entry ); +} + +sub update($$) { + my $config = shift; + my $entry = shift; + + my $fields = [ 'user', 'project_id', 'studio_id' ]; + 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_day_start + 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}; + + my $query = qq{ + delete + from calcms_user_day_start + where user=? and project_id=? and studio_id=? + }; + my $bind_values = [ $entry->{user}, $entry->{project_id}, $entry->{studio_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/calendar.cgi b/website/agenda/planung/calendar.cgi index 1f3033b..0e00e80 100755 --- a/website/agenda/planung/calendar.cgi +++ b/website/agenda/planung/calendar.cgi @@ -34,6 +34,7 @@ use playout(); use user_settings(); use audio_recordings(); use audio(); +use user_day_start(); binmode STDOUT, ":utf8"; @@ -44,6 +45,7 @@ my $config = config::get('../config/config.cgi'); my $debug = $config->{system}->{debug}; my ( $user, $expires ) = auth::get_user( $config, $params, $cgi ); return if ( !defined $user ) || ( $user eq '' ); +$config->{user} = $user; my $user_presets = uac::get_user_presets( $config, @@ -1731,7 +1733,7 @@ sub printToolbar { # start of day my $day_start = $params->{day_start} || ''; $toolbar .= qq{ - }; for my $hour ( 0 .. 24 ) { my $selected = ''; @@ -1947,7 +1949,9 @@ sub check_params { my $config = shift; my $params = shift; - my $checked = {}; + my $checked = { + user => $config->{user} + }; my $template = ''; $checked->{template} = template::check( $config, $params->{template}, 'series' ); @@ -1961,6 +1965,13 @@ sub check_params { 'list', 'day_start', 'open_end' ]); + my $start = user_day_start::get( $config, { + user => $checked->{user}, + project_id => $checked->{project_id}, + studio_id => $checked->{studio_id} + }); + print STDERR "read start $start\n"; + $checked->{day_start} = $start->{day_start} if $start; $checked->{day_start} = $config->{date}->{day_starting_hour} unless defined $checked->{day_start}; $checked->{day_start} %= 24; diff --git a/website/agenda/planung/js/calendar.js b/website/agenda/planung/js/calendar.js index 031c0ae..13b6ab5 100644 --- a/website/agenda/planung/js/calendar.js +++ b/website/agenda/planung/js/calendar.js @@ -411,6 +411,15 @@ function getUrl(name,value){ return url; } +function updateDayStart(){ + var url = "set-user-day-start.cgi?"; + url += "&project_id=" + getProjectId(); + url += "&studio_id=" + getStudioId(); + url += "&day_start=" + $('#day_start').val(); + console.log(url); + $.get(url); +} + // to be called from elements directly function reloadCalendar(){ var url=window.location.href; diff --git a/website/agenda/planung/set-user-day-start.cgi b/website/agenda/planung/set-user-day-start.cgi new file mode 100644 index 0000000..762dfa2 --- /dev/null +++ b/website/agenda/planung/set-user-day-start.cgi @@ -0,0 +1,100 @@ +#!/usr/bin/perl + +use strict; +use warnings; +no warnings 'redefine'; + +use Data::Dumper; + +use params(); +use config(); +use entry(); +use log(); +use template(); +use auth(); +use uac(); + +use series(); +use localization(); +use user_day_start(); + +binmode STDOUT, ":utf8"; + +my $r = shift; +( my $cgi, my $params, my $error ) = params::get($r); + +my $config = config::get('../config/config.cgi'); +my $debug = $config->{system}->{debug}; +my ( $user, $expires ) = auth::get_user( $config, $params, $cgi ); +return if ( ( !defined $user ) || ( $user eq '' ) ); + +my $user_presets = uac::get_user_presets( + $config, + { + project_id => $params->{project_id}, + studio_id => $params->{studio_id}, + user => $user + } +); +$params->{default_studio_id} = $user_presets->{studio_id}; +$params = uac::setDefaultStudio( $params, $user_presets ); +$params = uac::setDefaultProject( $params, $user_presets ); + +my $request = { + url => $ENV{QUERY_STRING} || '', + params => { + original => $params, + checked => check_params( $config, $params ), + }, +}; +$request = uac::prepare_request( $request, $user_presets ); + +$params = $request->{params}->{checked}; +$params = uac::set_template_permissions( $request->{permissions}, $params ); +$params->{loc} = localization::get( $config, { user => $user, file => 'select-event' } ); + +#process header +print "Content-type:text/text; charset=UTF-8;\n\n"; + +return unless uac::check( $config, $params, $user_presets ) == 1; +set_start_date( $config, $request ); + +sub set_start_date { + my $config = shift; + my $request = shift; + + my $params = $request->{params}->{checked}; + my $permissions = $request->{permissions}; + unless ( $permissions->{read_event} == 1 ) { + uac::permissions_denied('read_event'); + return; + } + + my $preset = user_day_start::insert_or_update($config, { + user => $request->{user}, + project_id => $params->{project_id}, + studio_id => $params->{studio_id}, + day_start => $params->{day_start}, + }); + print "done\n"; + return; +} + +sub check_params { + my $config = shift; + my $params = shift; + + my $checked = {}; + + entry::set_numbers( $checked, $params, [ + 'id', 'project_id', 'studio_id', 'day_start' + ]); + + if ( defined $checked->{studio_id} ) { + $checked->{default_studio_id} = $checked->{studio_id}; + } else { + $checked->{studio_id} = -1; + } + return $checked; +} +