diff --git a/swad_assignment.c b/swad_assignment.c index 5a5f5de9..da1da041 100644 --- a/swad_assignment.c +++ b/swad_assignment.c @@ -229,6 +229,7 @@ static void Asg_ShowOneAssignment (long AsgCod) extern const char *Txt_ASSIGNMENT_TYPES[Asg_NUM_TYPES_SEND_WORK]; extern const char *Txt_Yes; extern const char *Txt_No; + static unsigned UniqueId = 0; struct Assignment Asg; char Txt[Cns_MAX_BYTES_TEXT+1]; @@ -238,37 +239,35 @@ static void Asg_ShowOneAssignment (long AsgCod) /***** Write first row of data of this assignment *****/ /* Start date/time */ + UniqueId++; fprintf (Gbl.F.Out,"" - "" - "%02u/%02u/%02u
" - "%02u:%02u h" + "" + "" "", + UniqueId, Asg.Hidden ? (Asg.Open ? "DATE_GREEN_LIGHT" : "DATE_RED_LIGHT") : (Asg.Open ? "DATE_GREEN" : "DATE_RED"), Gbl.RowEvenOdd, - Asg.DateTimes[Asg_START_TIME].Date.Day, - Asg.DateTimes[Asg_START_TIME].Date.Month, - Asg.DateTimes[Asg_START_TIME].Date.Year % 100, - Asg.DateTimes[Asg_START_TIME].Time.Hour, - Asg.DateTimes[Asg_START_TIME].Time.Minute); + UniqueId,Asg.DateTimes[Asg_START_TIME]); /* End date/time */ - fprintf (Gbl.F.Out,"" - "%02u/%02u/%02u
" - "%02u:%02u h" + UniqueId++; + fprintf (Gbl.F.Out,"" + "" "", + UniqueId, Asg.Hidden ? (Asg.Open ? "DATE_GREEN_LIGHT" : "DATE_RED_LIGHT") : (Asg.Open ? "DATE_GREEN" : "DATE_RED"), Gbl.RowEvenOdd, - Asg.DateTimes[Asg_END_TIME].Date.Day, - Asg.DateTimes[Asg_END_TIME].Date.Month, - Asg.DateTimes[Asg_END_TIME].Date.Year % 100, - Asg.DateTimes[Asg_END_TIME].Time.Hour, - Asg.DateTimes[Asg_END_TIME].Time.Minute); + UniqueId,Asg.DateTimes[Asg_END_TIME]); /* Assignment title */ fprintf (Gbl.F.Out,"" @@ -619,6 +618,7 @@ void Asg_GetDataOfAssignmentByCod (struct Assignment *Asg) char Query[1024]; /***** Build query *****/ + /* sprintf (Query,"SELECT AsgCod,Hidden,UsrCod," "DATE_FORMAT(StartTime,'%%Y%%m%%d%%H%%i%%S')," "DATE_FORMAT(EndTime,'%%Y%%m%%d%%H%%i%%S')," @@ -627,6 +627,15 @@ void Asg_GetDataOfAssignmentByCod (struct Assignment *Asg) " FROM assignments" " WHERE AsgCod='%ld' AND CrsCod='%ld'", Asg->AsgCod,Gbl.CurrentCrs.Crs.CrsCod); + */ + sprintf (Query,"SELECT AsgCod,Hidden,UsrCod," + "UNIX_TIMESTAMP(StartTime)," + "UNIX_TIMESTAMP(EndTime)," + "NOW() BETWEEN StartTime AND EndTime," + "Title,Folder" + " FROM assignments" + " WHERE AsgCod='%ld' AND CrsCod='%ld'", + Asg->AsgCod,Gbl.CurrentCrs.Crs.CrsCod); /***** Get data of assignment *****/ Asg_GetDataOfAssignment (Asg,Query); @@ -641,6 +650,7 @@ void Asg_GetDataOfAssignmentByFolder (struct Assignment *Asg) char Query[1024]; /***** Query database *****/ + /* sprintf (Query,"SELECT AsgCod,Hidden,UsrCod," "DATE_FORMAT(StartTime,'%%Y%%m%%d%%H%%i%%S')," "DATE_FORMAT(EndTime,'%%Y%%m%%d%%H%%i%%S')," @@ -649,6 +659,15 @@ void Asg_GetDataOfAssignmentByFolder (struct Assignment *Asg) " FROM assignments" " WHERE CrsCod='%ld' AND Folder='%s'", Gbl.CurrentCrs.Crs.CrsCod,Asg->Folder); + */ + sprintf (Query,"SELECT AsgCod,Hidden,UsrCod," + "UNIX_TIMESTAMP(StartTime)," + "UNIX_TIMESTAMP(EndTime)," + "NOW() BETWEEN StartTime AND EndTime," + "Title,Folder" + " FROM assignments" + " WHERE CrsCod='%ld' AND Folder='%s'", + Gbl.CurrentCrs.Crs.CrsCod,Asg->Folder); /***** Get data of assignment *****/ Asg_GetDataOfAssignment (Asg,Query); @@ -665,9 +684,8 @@ static void Asg_GetDataOfAssignment (struct Assignment *Asg,const char *Query) unsigned long NumRows; /***** Clear data *****/ - Asg->DateTimes[Asg_START_TIME].Date.Day = - Asg->DateTimes[Asg_START_TIME].Date.Month = - Asg->DateTimes[Asg_START_TIME].Date.Year = 0; + Asg->DateTimes[Asg_START_TIME] = + Asg->DateTimes[Asg_END_TIME ] = (time_t) 0; Asg->Title[0] = '\0'; /***** Get data of assignment from database *****/ @@ -688,12 +706,18 @@ static void Asg_GetDataOfAssignment (struct Assignment *Asg,const char *Query) Asg->UsrCod = Str_ConvertStrCodToLongCod (row[2]); /* Get start date (row[3] holds the start date in YYYYMMDDHHMMSS format) */ + /* if (!(Dat_GetDateTimeFromYYYYMMDDHHMMSS (&(Asg->DateTimes[Asg_START_TIME]),row[3]))) Lay_ShowErrorAndExit ("Error when reading start date of assignment."); + */ + Asg->DateTimes[Asg_START_TIME] = Dat_GetUNIXTimeFromStr (row[3]); /* Get end date (row[4] holds the end date in YYYYMMDDHHMMSS format) */ + /* if (!(Dat_GetDateTimeFromYYYYMMDDHHMMSS (&(Asg->DateTimes[Asg_END_TIME]),row[4]))) Lay_ShowErrorAndExit ("Error when reading end date of assignment."); + */ + Asg->DateTimes[Asg_END_TIME] = Dat_GetUNIXTimeFromStr (row[4]); /* Get whether the assignment is open or closed (row(5)) */ Asg->Open = (row[5][0] == '1'); @@ -752,7 +776,8 @@ static void Asg_GetAssignmentTxtFromDB (long AsgCod,char *Txt) unsigned long NumRows; /***** Get text of assignment from database *****/ - sprintf (Query,"SELECT Txt FROM assignments WHERE AsgCod='%ld' AND CrsCod='%ld'", + sprintf (Query,"SELECT Txt FROM assignments" + " WHERE AsgCod='%ld' AND CrsCod='%ld'", AsgCod,Gbl.CurrentCrs.Crs.CrsCod); NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get assignment text"); @@ -776,27 +801,22 @@ static void Asg_GetAssignmentTxtFromDB (long AsgCod,char *Txt) /*****************************************************************************/ /***************** Get summary and content of an assignment *****************/ /*****************************************************************************/ -// This function may be called inside a web service, so don't report error +// This function may be called inside a web service void Asg_GetNotifAssignment (char *SummaryStr,char **ContentStr, long AsgCod,unsigned MaxChars,bool GetContent) { - extern const char *Txt_Start_date; - extern const char *Txt_End_date; + // extern const char *Txt_Start_date; + // extern const char *Txt_End_date; char Query[512]; MYSQL_RES *mysql_res; MYSQL_ROW row; - struct DateTime DateTimes[Asg_NUM_DATES]; + // struct DateTime DateTimes[Asg_NUM_DATES]; SummaryStr[0] = '\0'; // Return nothing on error /***** Build query *****/ - sprintf (Query,"SELECT Title," - "DATE_FORMAT(StartTime,'%%Y%%m%%d%%H%%i%%S')," - "DATE_FORMAT(EndTime,'%%Y%%m%%d%%H%%i%%S')," - "Txt" - " FROM assignments" - " WHERE AsgCod='%ld'", + sprintf (Query,"SELECT Title,Txt FROM assignments WHERE AsgCod='%ld'", AsgCod); if (!mysql_query (&Gbl.mysql,Query)) if ((mysql_res = mysql_store_result (&Gbl.mysql)) != NULL) @@ -817,30 +837,7 @@ void Asg_GetNotifAssignment (char *SummaryStr,char **ContentStr, { if ((*ContentStr = (char *) malloc (512+Cns_MAX_BYTES_TEXT)) == NULL) Lay_ShowErrorAndExit ("Error allocating memory for notification content."); - (*ContentStr)[0] = '\0'; // Return nothing on error - - /* Get start date (row[1] holds the start date in YYYYMMDDHHMMSS format) */ - if (!(Dat_GetDateTimeFromYYYYMMDDHHMMSS (&DateTimes[Asg_START_TIME],row[1]))) - Lay_ShowErrorAndExit ("Error when reading start date of assignment."); - - /* Get end date (row[2] holds the end date in YYYYMMDDHHMMSS format) */ - if (!(Dat_GetDateTimeFromYYYYMMDDHHMMSS (&DateTimes[Asg_END_TIME ],row[2]))) - Lay_ShowErrorAndExit ("Error when reading end date of assignment."); - - sprintf (*ContentStr,"%s: %02u/%02u/%04u %02u:%02u
%s: %02u/%02u/%04u %02u:%02u
%s", - Txt_Start_date, - DateTimes[Asg_START_TIME].Date.Day, - DateTimes[Asg_START_TIME].Date.Month, - DateTimes[Asg_START_TIME].Date.Year, - DateTimes[Asg_START_TIME].Time.Hour, - DateTimes[Asg_START_TIME].Time.Minute, - Txt_End_date, - DateTimes[Asg_END_TIME].Date.Day, - DateTimes[Asg_END_TIME].Date.Month, - DateTimes[Asg_END_TIME].Date.Year, - DateTimes[Asg_END_TIME].Time.Hour, - DateTimes[Asg_END_TIME].Time.Minute, - row[3]); + strcpy (*ContentStr,row[1]); } } mysql_free_result (mysql_res); @@ -1071,18 +1068,23 @@ void Asg_RequestCreatOrEditAsg (void) { /* Initialize to empty assignment */ Asg.AsgCod = -1L; + /* Asg.DateTimes[Asg_START_TIME].Date.Day = Gbl.Now.Date.Day; Asg.DateTimes[Asg_START_TIME].Date.Month = Gbl.Now.Date.Month; Asg.DateTimes[Asg_START_TIME].Date.Year = Gbl.Now.Date.Year; Asg.DateTimes[Asg_START_TIME].Time.Hour = Gbl.Now.Time.Hour; Asg.DateTimes[Asg_START_TIME].Time.Minute = Gbl.Now.Time.Minute; Asg.DateTimes[Asg_START_TIME].Time.Second = Gbl.Now.Time.Second; - + */ + Asg.DateTimes[Asg_START_TIME] = Gbl.TimeStartExecution; + /* Asg.DateTimes[Asg_END_TIME ].Date.Day = Gbl.Now.Date.Day; Asg.DateTimes[Asg_END_TIME ].Date.Month = Gbl.Now.Date.Month; Asg.DateTimes[Asg_END_TIME ].Date.Year = Gbl.Now.Date.Year; Asg.DateTimes[Asg_END_TIME ].Time.Hour = 23; Asg.DateTimes[Asg_END_TIME ].Time.Minute = 59; + */ + Asg.DateTimes[Asg_END_TIME ] = Gbl.TimeStartExecution + (2 * 60 * 60); // +2 hours Asg.Open = true; Asg.Title[0] = '\0'; Asg.SendWork = false; @@ -1144,21 +1146,29 @@ void Asg_RequestCreatOrEditAsg (void) Dates[StartOrEndTime]); /* Date */ + /* Dat_WriteFormDate (Gbl.Now.Date.Year-1,Gbl.Now.Date.Year+1, NameSelectDay [StartOrEndTime], NameSelectMonth[StartOrEndTime], NameSelectYear [StartOrEndTime], &(Asg.DateTimes[StartOrEndTime].Date), false,false); - - fprintf (Gbl.F.Out,"" - ""); + */ + Dat_WriteFormClientLocalDateTime (Gbl.Now.Date.Year-1,Gbl.Now.Date.Year+1, + NameSelectDay [StartOrEndTime], + NameSelectMonth [StartOrEndTime], + NameSelectYear [StartOrEndTime], + NameSelectHour [StartOrEndTime], + NameSelectMinute[StartOrEndTime], + false,false); /* Time */ + /* Dat_WriteFormHourMinute (NameSelectHour [StartOrEndTime], NameSelectMinute[StartOrEndTime], &(Asg.DateTimes[StartOrEndTime].Time), false,false); + */ fprintf (Gbl.F.Out,"" "" @@ -1291,6 +1301,7 @@ void Asg_RecFormAssignment (void) } /***** Get start date *****/ + /* Dat_GetDateFromForm ("StartDay","StartMonth","StartYear", &(NewAsg.DateTimes[Asg_START_TIME].Date.Day), &(NewAsg.DateTimes[Asg_START_TIME].Date.Month), @@ -1299,8 +1310,11 @@ void Asg_RecFormAssignment (void) &(NewAsg.DateTimes[Asg_START_TIME].Time.Hour), &(NewAsg.DateTimes[Asg_START_TIME].Time.Minute)); NewAsg.DateTimes[Asg_START_TIME].Time.Second = 0; + */ + NewAsg.DateTimes[Asg_START_TIME] = Dat_GetDateTimeFromForm ("StartDateTime"); /***** Get end date *****/ + /* Dat_GetDateFromForm ("EndDay","EndMonth","EndYear", &(NewAsg.DateTimes[Asg_END_TIME].Date.Day), &(NewAsg.DateTimes[Asg_END_TIME].Date.Month), @@ -1309,6 +1323,8 @@ void Asg_RecFormAssignment (void) &(NewAsg.DateTimes[Asg_END_TIME].Time.Hour), &(NewAsg.DateTimes[Asg_END_TIME].Time.Minute)); NewAsg.DateTimes[Asg_END_TIME].Time.Second = 59; + */ + NewAsg.DateTimes[Asg_END_TIME] = Dat_GetDateTimeFromForm ("EndDateTime"); /***** Get assignment title *****/ Par_GetParToText ("Title",NewAsg.Title,Asg_MAX_LENGTH_ASSIGNMENT_TITLE); @@ -1322,6 +1338,7 @@ void Asg_RecFormAssignment (void) Par_GetParToHTML ("Txt",Txt,Cns_MAX_BYTES_TEXT); // Store in HTML format (not rigorous) /***** Adjust dates *****/ + /* if (NewAsg.DateTimes[Asg_START_TIME].Date.Day == 0 || NewAsg.DateTimes[Asg_START_TIME].Date.Month == 0 || NewAsg.DateTimes[Asg_START_TIME].Date.Year == 0) @@ -1342,6 +1359,11 @@ void Asg_RecFormAssignment (void) NewAsg.DateTimes[Asg_END_TIME].Time.Hour = 23; NewAsg.DateTimes[Asg_END_TIME].Time.Minute = 59; } + */ + if (NewAsg.DateTimes[Asg_START_TIME] == 0) + NewAsg.DateTimes[Asg_START_TIME] = Gbl.TimeStartExecution; + if (NewAsg.DateTimes[Asg_END_TIME] == 0) + NewAsg.DateTimes[Asg_END_TIME] = NewAsg.DateTimes[Asg_START_TIME] + 2*60*60; // +2 hours /***** Check if title is correct *****/ if (NewAsg.Title[0]) // If there's an assignment title @@ -1450,6 +1472,7 @@ static void Asg_CreateAssignment (struct Assignment *Asg,const char *Txt) char Query[1024+Cns_MAX_BYTES_TEXT]; /***** Create a new assignment *****/ + /* sprintf (Query,"INSERT INTO assignments (CrsCod,UsrCod,StartTime,EndTime,Title,Folder,Txt)" " VALUES ('%ld','%ld','%04u%02u%02u%02u%02u%02u','%04u%02u%02u%02u%02u%02u','%s','%s','%s')", Gbl.CurrentCrs.Crs.CrsCod, @@ -1469,6 +1492,19 @@ static void Asg_CreateAssignment (struct Assignment *Asg,const char *Txt) Asg->Title, Asg->Folder, Txt); + */ + sprintf (Query,"INSERT INTO assignments" + " (CrsCod,UsrCod,StartTime,EndTime,Title,Folder,Txt)" + " VALUES" + " ('%ld','%ld',FROM_UNIXTIME('%ld'),FROM_UNIXTIME('%ld')," + "'%s','%s','%s')", + Gbl.CurrentCrs.Crs.CrsCod, + Gbl.Usrs.Me.UsrDat.UsrCod, + Asg->DateTimes[Asg_START_TIME], + Asg->DateTimes[Asg_END_TIME ], + Asg->Title, + Asg->Folder, + Txt); Asg->AsgCod = DB_QueryINSERTandReturnCode (Query,"can not create new assignment"); /***** Create groups *****/ @@ -1491,7 +1527,9 @@ static void Asg_UpdateAssignment (struct Assignment *Asg,const char *Txt) char Query[1024+Cns_MAX_BYTES_TEXT]; /***** Update the data of the assignment *****/ - sprintf (Query,"UPDATE assignments SET StartTime='%04u%02u%02u%02u%02u%02u',EndTime='%04u%02u%02u%02u%02u%02u'," + /* + sprintf (Query,"UPDATE assignments" + " SET StartTime='%04u%02u%02u%02u%02u%02u',EndTime='%04u%02u%02u%02u%02u%02u'," "Title='%s',Folder='%s',Txt='%s'" " WHERE AsgCod='%ld' AND CrsCod='%ld'", Asg->DateTimes[Asg_START_TIME].Date.Year, @@ -1510,6 +1548,18 @@ static void Asg_UpdateAssignment (struct Assignment *Asg,const char *Txt) Asg->Folder, Txt, Asg->AsgCod,Gbl.CurrentCrs.Crs.CrsCod); + */ + sprintf (Query,"UPDATE assignments SET " + "StartTime=FROM_UNIXTIME('%ld')," + "EndTime=FROM_UNIXTIME('%ld')," + "Title='%s',Folder='%s',Txt='%s'" + " WHERE AsgCod='%ld' AND CrsCod='%ld'", + Asg->DateTimes[Asg_START_TIME], + Asg->DateTimes[Asg_END_TIME ], + Asg->Title, + Asg->Folder, + Txt, + Asg->AsgCod,Gbl.CurrentCrs.Crs.CrsCod); DB_QueryUPDATE (Query,"can not update assignment"); /***** Update groups *****/ diff --git a/swad_assignment.h b/swad_assignment.h index 40aa07cd..987227b9 100644 --- a/swad_assignment.h +++ b/swad_assignment.h @@ -57,7 +57,8 @@ struct Assignment long AsgCod; bool Hidden; long UsrCod; - struct DateTime DateTimes[Asg_NUM_DATES]; + // struct DateTime DateTimes[Asg_NUM_DATES]; + time_t DateTimes[Asg_NUM_DATES]; bool Open; char Title[Asg_MAX_LENGTH_ASSIGNMENT_TITLE+1]; Asg_SendWork_t SendWork; diff --git a/swad_changelog.h b/swad_changelog.h index d7781112..368e399a 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -107,11 +107,12 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 15.15.3 (2015/10/21)" +#define Log_PLATFORM_VERSION "SWAD 15.16 (2015/10/22)" // Number of lines (includes comments but not blank lines) has been got with the following command: // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h sql/swad*.sql | tail -1 /* + Version 15.16: Oct 22, 2015 Assignment date-times are displayed in client local date-time. Not finished. (186436 lines) Version 15.15.3: Oct 21, 2015 File date-time is displayed in client local date-time. (186264 lines) Version 15.15.2: Oct 21, 2015 Fixed bug in client local date-time. (186254 lines) Version 15.15.1: Oct 21, 2015 Top-left date-time is now displayed in local time. (186249 lines) diff --git a/swad_date.c b/swad_date.c index 987bb79a..649a9adf 100644 --- a/swad_date.c +++ b/swad_date.c @@ -101,6 +101,20 @@ void Dat_GetAndConvertCurrentDateTime (void) Dat_GetDateBefore (&Gbl.Now.Date,&Gbl.Yesterday); } +/*****************************************************************************/ +/************ Get UNIX time (seconds since 1970 UTC) from string *************/ +/*****************************************************************************/ + +time_t Dat_GetUNIXTimeFromStr (const char *Str) + { + time_t Time; + + if (sscanf (Str,"%ld",&Time) != 1) + Time = (time_t) 0; + + return Time; + } + /*****************************************************************************/ /*********** Get a struct Date from a string in YYYYMMDD format **************/ /*****************************************************************************/ @@ -152,40 +166,13 @@ bool Dat_GetDateTimeFromYYYYMMDDHHMMSS (struct DateTime *DateTime,const char *YY } /*****************************************************************************/ -/***************************** Show date ant time ****************************/ -/*****************************************************************************/ -/* -void Dat_ShowCurrentDateTime (void) - { - extern const char *The_ClassCurrentTime[The_NUM_THEMES]; - extern const char *Txt_MONTHS_SMALL_SHORT[12]; - - fprintf (Gbl.F.Out,"
" - "%u %s, %u:%02u" - "
", - The_ClassCurrentTime[Gbl.Prefs.Theme], - Gbl.Now.Date.Day, - Txt_MONTHS_SMALL_SHORT[Gbl.Now.Date.Month-1], - Gbl.Now.Time.Hour,Gbl.Now.Time.Minute); - } -*/ -/*****************************************************************************/ -/***************************** Show date ant time ****************************/ +/******************** Write div for client local time ************************/ /*****************************************************************************/ -void Dat_ShowCurrentDateTime (void) +void Dat_ShowClientLocalTime (void) { extern const char *The_ClassCurrentTime[The_NUM_THEMES]; -/* - -*/ + fprintf (Gbl.F.Out,"
" "
", @@ -279,6 +266,137 @@ void Dat_WriteFormIniEndDates (void) ""); } + +/*****************************************************************************/ +/************************* Show a form to enter a date ***********************/ +/*****************************************************************************/ + +void Dat_WriteFormClientLocalDateTime (unsigned FirstYear,unsigned LastYear, + const char *NameSelectDay, + const char *NameSelectMonth, + const char *NameSelectYear, + const char *NameSelectHour, + const char *NameSelectMinute, + bool SubmitFormOnChange,bool Disabled) + { + extern const char *Txt_MONTHS_SMALL[12]; + unsigned Day; + unsigned Month; + unsigned Year; + unsigned Hour; + unsigned Minute; + + /***** Day *****/ + fprintf (Gbl.F.Out,"" + "" + "" + "" + ""); + + /***** Hour *****/ + fprintf (Gbl.F.Out,"" + "" + "" + "
" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "
"); + } + +/*****************************************************************************/ +/***************** Get an hour-minute time from a form ***********************/ +/*****************************************************************************/ + +time_t Dat_GetDateTimeFromForm (const char *NameParam) + { + char LongStr[1+10+1]; + + /**** Get time ****/ + Par_GetParToText (NameParam,LongStr,1+10); + return Dat_GetUNIXTimeFromStr (LongStr); + } + /*****************************************************************************/ /************************* Show a form to enter a date ***********************/ /*****************************************************************************/ @@ -391,7 +509,8 @@ void Dat_WriteFormHourMinute (const char *NameSelectHour,const char *NameSelectM struct Time *TimeSelected, bool SubmitFormOnChange,bool Disabled) { - unsigned Hour,Minute; + unsigned Hour; + unsigned Minute; /***** Hour *****/ fprintf (Gbl.F.Out,"" diff --git a/swad_date.h b/swad_date.h index b5e7d36e..595d35d3 100644 --- a/swad_date.h +++ b/swad_date.h @@ -68,15 +68,26 @@ struct DateTime void Dat_GetTimeStartExecution (void); void Dat_GetAndConvertCurrentDateTime (void); +time_t Dat_GetUNIXTimeFromStr (const char *Str); bool Dat_GetDateFromYYYYMMDD (struct Date *Date,const char *YYYYMMDDString); bool Dat_GetDateTimeFromYYYYMMDDHHMMSS (struct DateTime *DateTime,const char *YYYYMMDDHHMMSS); -void Dat_ShowCurrentDateTime (void); +void Dat_ShowClientLocalTime (void); void Dat_GetLocalTimeFromClock (const time_t *clock); void Dat_ConvDateToDateStr (struct Date *Date,char *DateStr); void Dat_WriteFormIniEndDates (void); + +void Dat_WriteFormClientLocalDateTime (unsigned FirstYear,unsigned LastYear, + const char *NameSelectDay, + const char *NameSelectMonth, + const char *NameSelectYear, + const char *NameSelectHour, + const char *NameSelectMinute, + bool SubmitFormOnChange,bool Disabled); +time_t Dat_GetDateTimeFromForm (const char *NameParam); + void Dat_WriteFormDate (unsigned FirstYear,unsigned LastYear, const char *NameSelectDay, const char *NameSelectMonth, diff --git a/swad_file_browser.c b/swad_file_browser.c index 46e753ae..0a5a22d2 100644 --- a/swad_file_browser.c +++ b/swad_file_browser.c @@ -5765,6 +5765,7 @@ void Brw_ParamListFiles (Brw_FileType_t FileType,const char *PathInTree,const ch static void Brw_WriteDatesAssignment (void) { extern const char *Txt_unknown_assignment; + static unsigned UniqueId; fprintf (Gbl.F.Out,""); // End of first column /***** 2nd. row, 2nd. column: degree and course *****/
", @@ -5772,20 +5773,21 @@ static void Brw_WriteDatesAssignment (void) if (Gbl.FileBrowser.Asg.AsgCod > 0) { - fprintf (Gbl.F.Out,"" - ""); + UniqueId++; /***** Write start date *****/ - fprintf (Gbl.F.Out,"", + fprintf (Gbl.F.Out,"
" - " %02u/%02u/%02u %02u:%02u" - "
" + "" + ""); /***** Arrow *****/ fprintf (Gbl.F.Out,"", + /***** Write end date *****/ + fprintf (Gbl.F.Out,"" + "ASG_LST_DATE_RED"); + fprintf (Gbl.F.Out,"", + UniqueId, + (long) Gbl.FileBrowser.Asg.DateTimes[Asg_END_TIME]); + fprintf (Gbl.F.Out,"" + "" "
", + UniqueId, Gbl.FileBrowser.Asg.Open ? "ASG_LST_DATE_GREEN" : - "ASG_LST_DATE_RED", - Gbl.FileBrowser.Asg.DateTimes[Asg_START_TIME].Date.Day, - Gbl.FileBrowser.Asg.DateTimes[Asg_START_TIME].Date.Month, - Gbl.FileBrowser.Asg.DateTimes[Asg_START_TIME].Date.Year % 100, - Gbl.FileBrowser.Asg.DateTimes[Asg_START_TIME].Time.Hour, - Gbl.FileBrowser.Asg.DateTimes[Asg_START_TIME].Time.Minute); + "ASG_LST_DATE_RED"); + fprintf (Gbl.F.Out,"", + UniqueId, + (long) Gbl.FileBrowser.Asg.DateTimes[Asg_START_TIME]); + fprintf (Gbl.F.Out,"" @@ -5797,19 +5799,18 @@ static void Brw_WriteDatesAssignment (void) Gbl.FileBrowser.Asg.Open ? "green" : "red"); - /***** Write start date *****/ - fprintf (Gbl.F.Out,"" - "%02u/%02u/%02u %02u:%02u" - "", + UniqueId, Gbl.FileBrowser.Asg.Open ? "ASG_LST_DATE_GREEN" : - "ASG_LST_DATE_RED", - Gbl.FileBrowser.Asg.DateTimes[Asg_END_TIME].Date.Day, - Gbl.FileBrowser.Asg.DateTimes[Asg_END_TIME].Date.Month, - Gbl.FileBrowser.Asg.DateTimes[Asg_END_TIME].Date.Year % 100, - Gbl.FileBrowser.Asg.DateTimes[Asg_END_TIME].Time.Hour, - Gbl.FileBrowser.Asg.DateTimes[Asg_END_TIME].Time.Minute); - - fprintf (Gbl.F.Out,"
"); } else diff --git a/swad_layout.c b/swad_layout.c index 1bdf69c7..411ea291 100644 --- a/swad_layout.c +++ b/swad_layout.c @@ -705,7 +705,7 @@ static void Lay_WritePageTopHeading (void) /* Clock with hour:minute (server hour is shown) */ fprintf (Gbl.F.Out,"
"); - Dat_ShowCurrentDateTime (); + Dat_ShowClientLocalTime (); fprintf (Gbl.F.Out,"