diff --git a/sql/swad.sql b/sql/swad.sql index 21204055..227d9e50 100644 --- a/sql/swad.sql +++ b/sql/swad.sql @@ -7,6 +7,7 @@ CREATE TABLE IF NOT EXISTS IP_prefs ( IP CHAR(15) NOT NULL, UsrCod INT NOT NULL DEFAULT -1, LastChange DATETIME NOT NULL, + FirstDayOfWeek TINYINT NOT NULL DEFAULT 0, Layout TINYINT NOT NULL DEFAULT 0, Theme CHAR(16) NOT NULL, IconSet CHAR(16) NOT NULL, @@ -1127,6 +1128,7 @@ CREATE TABLE IF NOT EXISTS usr_data ( Theme CHAR(16) NOT NULL, IconSet CHAR(16) NOT NULL, Language CHAR(2) NOT NULL, + FirstDayOfWeek TINYINT NOT NULL DEFAULT 0, Photo CHAR(43) NOT NULL, PhotoVisibility ENUM('user','course','system','world') NOT NULL DEFAULT 'user', ProfileVisibility ENUM('user','course','system','world') NOT NULL DEFAULT 'user', @@ -1154,6 +1156,7 @@ CREATE TABLE IF NOT EXISTS usr_data ( INDEX(Theme), INDEX(IconSet), INDEX(Language), + INDEX(FirstDayOfWeek), INDEX(CtyCod), INDEX(InsCtyCod), INDEX(InsCod), diff --git a/swad_account.c b/swad_account.c index 40773e4b..f76bfaa6 100644 --- a/swad_account.c +++ b/swad_account.c @@ -29,6 +29,7 @@ #include "swad_account.h" #include "swad_announcement.h" +#include "swad_calendar.h" #include "swad_database.h" #include "swad_enrollment.h" #include "swad_global.h" @@ -433,12 +434,12 @@ void Acc_CreateNewUsr (struct UsrData *UsrDat) /***** Insert new user in database *****/ /* Insert user's data */ sprintf (Query,"INSERT INTO usr_data (EncryptedUsrCod,Password,Surname1,Surname2,FirstName,Sex," - "Layout,Theme,IconSet,Language,PhotoVisibility,ProfileVisibility," + "Layout,Theme,IconSet,Language,FirstDayOfWeek,PhotoVisibility,ProfileVisibility," "CtyCod," "LocalAddress,LocalPhone,FamilyAddress,FamilyPhone,OriginPlace,Birthday,Comments," "Menu,SideCols,NotifNtfEvents,EmailNtfEvents)" " VALUES ('%s','%s','%s','%s','%s','%s'," - "'%u','%s','%s','%s','%s','%s'," + "'%u','%s','%s','%s','%u','%s','%s'," "'%ld'," "'%s','%s','%s','%s','%s','%04u-%02u-%02u','%s'," "'%u','%u','-1','0')", @@ -450,6 +451,7 @@ void Acc_CreateNewUsr (struct UsrData *UsrDat) The_ThemeId[UsrDat->Prefs.Theme], Ico_IconSetId[UsrDat->Prefs.IconSet], Txt_STR_LANG_ID[UsrDat->Prefs.Language], + Cal_FIRST_DAY_OF_WEEK_DEFAULT, Pri_VisibilityDB[UsrDat->PhotoVisibility], Pri_VisibilityDB[UsrDat->ProfileVisibility], UsrDat->CtyCod, diff --git a/swad_action.c b/swad_action.c index 1c295324..76aa77f2 100644 --- a/swad_action.c +++ b/swad_action.c @@ -1273,6 +1273,7 @@ Profile: 1078. ActChgThe Change theme 1079. ActReqChgLan Ask if change language 1080. ActChgLan Change language +-----> 1080. ActChg1stDay Change first day of the week 1081. ActChgCol Change side columns 1082. ActHidLftCol Hide left side column 1083. ActHidRgtCol Hide right side column @@ -2754,6 +2755,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActChgThe */{ 841,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,The_ChangeTheme ,Pre_EditPrefs ,NULL}, /* ActReqChgLan */{ 992,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pre_AskChangeLanguage ,NULL}, /* ActChgLan */{ 654,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Pre_ChangeLanguage ,Pre_EditPrefs ,NULL}, + /* ActChg1stDay */{1484,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Cal_ChangeFirstDayOfWeek ,Pre_EditPrefs ,NULL}, /* ActChgCol */{ 674,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Pre_ChangeSideCols ,Pre_EditPrefs ,NULL}, /* ActHidLftCol */{ 668,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Pre_HideLeftCol ,Pre_EditPrefs ,NULL}, /* ActHidRgtCol */{ 669,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Pre_HideRightCol ,Pre_EditPrefs ,NULL}, @@ -4278,6 +4280,7 @@ Act_Action_t Act_FromActCodToAction[1+Act_MAX_ACTION_COD] = // Do not reuse uniq ActNewMaiOth, // #1481 ActNewMaiStd, // #1482 ActNewMaiTch, // #1483 + ActChg1stDay, // #1484 }; /*****************************************************************************/ diff --git a/swad_action.h b/swad_action.h index fa37a709..68271533 100644 --- a/swad_action.h +++ b/swad_action.h @@ -70,9 +70,9 @@ typedef enum typedef int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action -#define Act_NUM_ACTIONS (7+52+15+90+73+68+204+182+154+171+27+79) +#define Act_NUM_ACTIONS (7+52+15+90+73+68+204+182+154+171+27+80) -#define Act_MAX_ACTION_COD 1483 +#define Act_MAX_ACTION_COD 1484 #define Act_MAX_OPTIONS_IN_MENU_PER_TAB 20 @@ -1314,38 +1314,39 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica #define ActChgThe (ActSeeAllStaCrs+47) #define ActReqChgLan (ActSeeAllStaCrs+48) #define ActChgLan (ActSeeAllStaCrs+49) -#define ActChgCol (ActSeeAllStaCrs+50) -#define ActHidLftCol (ActSeeAllStaCrs+51) -#define ActHidRgtCol (ActSeeAllStaCrs+52) -#define ActShoLftCol (ActSeeAllStaCrs+53) -#define ActShoRgtCol (ActSeeAllStaCrs+54) -#define ActChgIco (ActSeeAllStaCrs+55) -#define ActChgMnu (ActSeeAllStaCrs+56) -#define ActChgNtfPrf (ActSeeAllStaCrs+57) +#define ActChg1stDay (ActSeeAllStaCrs+50) +#define ActChgCol (ActSeeAllStaCrs+51) +#define ActHidLftCol (ActSeeAllStaCrs+52) +#define ActHidRgtCol (ActSeeAllStaCrs+53) +#define ActShoLftCol (ActSeeAllStaCrs+54) +#define ActShoRgtCol (ActSeeAllStaCrs+55) +#define ActChgIco (ActSeeAllStaCrs+56) +#define ActChgMnu (ActSeeAllStaCrs+57) +#define ActChgNtfPrf (ActSeeAllStaCrs+58) -#define ActPrnUsrQR (ActSeeAllStaCrs+58) +#define ActPrnUsrQR (ActSeeAllStaCrs+59) -#define ActPrnMyTimTbl (ActSeeAllStaCrs+59) -#define ActEdiTut (ActSeeAllStaCrs+60) -#define ActChgTut (ActSeeAllStaCrs+61) -#define ActReqRemFilBrf (ActSeeAllStaCrs+62) -#define ActRemFilBrf (ActSeeAllStaCrs+63) -#define ActRemFolBrf (ActSeeAllStaCrs+64) -#define ActCopBrf (ActSeeAllStaCrs+65) -#define ActPasBrf (ActSeeAllStaCrs+66) -#define ActRemTreBrf (ActSeeAllStaCrs+67) -#define ActFrmCreBrf (ActSeeAllStaCrs+68) -#define ActCreFolBrf (ActSeeAllStaCrs+69) -#define ActCreLnkBrf (ActSeeAllStaCrs+70) -#define ActRenFolBrf (ActSeeAllStaCrs+71) -#define ActRcvFilBrfDZ (ActSeeAllStaCrs+72) -#define ActRcvFilBrfCla (ActSeeAllStaCrs+73) -#define ActExpBrf (ActSeeAllStaCrs+74) -#define ActConBrf (ActSeeAllStaCrs+75) -#define ActZIPBrf (ActSeeAllStaCrs+76) -#define ActReqDatBrf (ActSeeAllStaCrs+77) -#define ActChgDatBrf (ActSeeAllStaCrs+78) -#define ActDowBrf (ActSeeAllStaCrs+79) +#define ActPrnMyTimTbl (ActSeeAllStaCrs+60) +#define ActEdiTut (ActSeeAllStaCrs+61) +#define ActChgTut (ActSeeAllStaCrs+62) +#define ActReqRemFilBrf (ActSeeAllStaCrs+63) +#define ActRemFilBrf (ActSeeAllStaCrs+64) +#define ActRemFolBrf (ActSeeAllStaCrs+65) +#define ActCopBrf (ActSeeAllStaCrs+66) +#define ActPasBrf (ActSeeAllStaCrs+67) +#define ActRemTreBrf (ActSeeAllStaCrs+68) +#define ActFrmCreBrf (ActSeeAllStaCrs+69) +#define ActCreFolBrf (ActSeeAllStaCrs+70) +#define ActCreLnkBrf (ActSeeAllStaCrs+71) +#define ActRenFolBrf (ActSeeAllStaCrs+72) +#define ActRcvFilBrfDZ (ActSeeAllStaCrs+73) +#define ActRcvFilBrfCla (ActSeeAllStaCrs+74) +#define ActExpBrf (ActSeeAllStaCrs+75) +#define ActConBrf (ActSeeAllStaCrs+76) +#define ActZIPBrf (ActSeeAllStaCrs+77) +#define ActReqDatBrf (ActSeeAllStaCrs+78) +#define ActChgDatBrf (ActSeeAllStaCrs+79) +#define ActDowBrf (ActSeeAllStaCrs+80) /*****************************************************************************/ /******************************** Public types *******************************/ diff --git a/swad_calendar.c b/swad_calendar.c index 57546b20..a54a1658 100644 --- a/swad_calendar.c +++ b/swad_calendar.c @@ -28,7 +28,11 @@ #include // For string functions #include "swad_exam.h" +#include "swad_calendar.h" +#include "swad_database.h" #include "swad_global.h" +#include "swad_parameter.h" +#include "swad_preference.h" /*****************************************************************************/ /************** External global variables from others modules ****************/ @@ -40,10 +44,103 @@ extern struct Globals Gbl; /**************************** Private constants ******************************/ /*****************************************************************************/ +const bool Cal_DayIsValidAsFirstDayOfWeek[7] = + { + true, // 0: monday + false, // 1: tuesday + false, // 2: wednesday + false, // 3: thursday + false, // 4: friday + false, // 5: saturday + true, // 6: sunday + }; + /*****************************************************************************/ /***************************** Private prototypes ****************************/ /*****************************************************************************/ +static unsigned Cal_GetParamFirstDayOfWeek (void); + +/*****************************************************************************/ +/************** Put icons to select the first day of the week ****************/ +/*****************************************************************************/ + +void Cal_PutIconsToSelectFirstDayOfWeek (void) + { + extern const char *Txt_Calendar; + extern const char *Txt_First_day_of_the_week; + extern const char *Txt_DAYS_SMALL[7]; + unsigned FirstDayOfWeek; + + Lay_StartRoundFrameTable (NULL,2,Txt_Calendar); + fprintf (Gbl.F.Out,""); + for (FirstDayOfWeek = 0; // Monday + FirstDayOfWeek <= 6; // Sunday + FirstDayOfWeek++) + if (Cal_DayIsValidAsFirstDayOfWeek[FirstDayOfWeek]) + { + fprintf (Gbl.F.Out,"", + FirstDayOfWeek == Gbl.Prefs.FirstDayOfWeek ? "LAYOUT_ON" : + "LAYOUT_OFF"); + Act_FormStart (ActChg1stDay); + Par_PutHiddenParamUnsigned ("FirstDayOfWeek",FirstDayOfWeek); + fprintf (Gbl.F.Out,"", + Gbl.Prefs.IconsURL, + FirstDayOfWeek, + Txt_DAYS_SMALL[FirstDayOfWeek], + Txt_First_day_of_the_week,Txt_DAYS_SMALL[FirstDayOfWeek]); + Act_FormEnd (); + fprintf (Gbl.F.Out,""); + } + fprintf (Gbl.F.Out,""); + Lay_EndRoundFrameTable (); + } + +/*****************************************************************************/ +/************************* Change first day of week **************************/ +/*****************************************************************************/ + +void Cal_ChangeFirstDayOfWeek (void) + { + char Query[512]; + + /***** Get param with icon set *****/ + Gbl.Prefs.FirstDayOfWeek = Cal_GetParamFirstDayOfWeek (); + + /***** Store icon set in database *****/ + if (Gbl.Usrs.Me.Logged) + { + sprintf (Query,"UPDATE usr_data SET FirstDayOfWeek='%u'" + " WHERE UsrCod='%ld'", + Gbl.Prefs.FirstDayOfWeek, + Gbl.Usrs.Me.UsrDat.UsrCod); + DB_QueryUPDATE (Query,"can not update your preference about first day of week"); + } + + /***** Set preferences from current IP *****/ + Pre_SetPrefsFromIP (); + } + +/*****************************************************************************/ +/*********************** Get parameter with icon set *************************/ +/*****************************************************************************/ + +static unsigned Cal_GetParamFirstDayOfWeek (void) + { + char UnsignedStr[10+1]; + unsigned UnsignedNum; + unsigned FirstDayOfWeek = Cal_FIRST_DAY_OF_WEEK_DEFAULT; + + Par_GetParToText ("FirstDayOfWeek",UnsignedStr,10); + if (sscanf (UnsignedStr,"%u",&UnsignedNum) == 1) + if (Cal_DayIsValidAsFirstDayOfWeek[UnsignedNum]) + FirstDayOfWeek = UnsignedNum; + + return FirstDayOfWeek; + } + /*****************************************************************************/ /***************************** Draw current month ****************************/ /*****************************************************************************/ diff --git a/swad_calendar.h b/swad_calendar.h index d943d676..6d51f5ba 100644 --- a/swad_calendar.h +++ b/swad_calendar.h @@ -31,6 +31,8 @@ /***************************** Public constants ******************************/ /*****************************************************************************/ +#define Cal_FIRST_DAY_OF_WEEK_DEFAULT 0 // Monday + /*****************************************************************************/ /******************************* Public types ********************************/ /*****************************************************************************/ @@ -39,6 +41,9 @@ /***************************** Public prototypes *****************************/ /*****************************************************************************/ +void Cal_PutIconsToSelectFirstDayOfWeek (void); +void Cal_ChangeFirstDayOfWeek (void); + void Cal_DrawCurrentMonth (void); void Cal_DrawCalendar (void); diff --git a/swad_changelog.h b/swad_changelog.h index d94f6647..2d590c15 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -111,11 +111,17 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 15.41 (2015/11/21)" +#define Log_PLATFORM_VERSION "SWAD 15.42 (2015/11/21)" // 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.42: Nov 21, 2015 New option in preferences to select first day of the week. (187520 lines) + 3 changes necessary in database: +ALTER TABLE IP_prefs ADD COLUMN FirstDayOfWeek TINYINT NOT NULL DEFAULT 0 AFTER LastChange; +ALTER TABLE usr_data ADD COLUMN FirstDayOfWeek TINYINT NOT NULL DEFAULT 0 AFTER Language,ADD INDEX (FirstDayOfWeek); +INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1484','es','N','Cambiar primer día de semana'); + Version 15.41: Nov 21, 2015 Javascript code to draw a month with sunday as the first day of a week. (187316 lines) Version 15.40.8: Nov 20, 2015 Password is requested only one time when creating a new account. (187309 lines) Version 15.40.7: Nov 20, 2015 New help button to register students in courses without them. (187319 lines) diff --git a/swad_country.c b/swad_country.c index ce55bf82..fcb62254 100644 --- a/swad_country.c +++ b/swad_country.c @@ -105,7 +105,8 @@ void Cty_SeeCtyWithPendingInss (void) " FROM institutions,countries" " WHERE (institutions.Status & %u)<>0" " AND institutions.CtyCod=countries.CtyCod" - " GROUP BY institutions.CtyCod ORDER BY countries.Name_%s", + " GROUP BY institutions.CtyCod" + " ORDER BY countries.Name_%s", (unsigned) Ins_STATUS_BIT_PENDING, Txt_STR_LANG_ID[Gbl.Prefs.Language]); break; @@ -320,8 +321,10 @@ static void Cty_Configuration (bool PrintView) "", The_ClassForm[Gbl.Prefs.Theme], Txt_Shortcut, - Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],Gbl.CurrentCty.Cty.CtyCod, - Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],Gbl.CurrentCty.Cty.CtyCod); + Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language], + Gbl.CurrentCty.Cty.CtyCod, + Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language], + Gbl.CurrentCty.Cty.CtyCod); if (PrintView) { diff --git a/swad_course.c b/swad_course.c index 55436889..3c0f5d92 100644 --- a/swad_course.c +++ b/swad_course.c @@ -354,8 +354,10 @@ static void Crs_Configuration (bool PrintView) "", The_ClassForm[Gbl.Prefs.Theme], Txt_Shortcut, - Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],Gbl.CurrentCrs.Crs.CrsCod, - Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],Gbl.CurrentCrs.Crs.CrsCod); + Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language], + Gbl.CurrentCrs.Crs.CrsCod, + Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language], + Gbl.CurrentCrs.Crs.CrsCod); if (PrintView) { diff --git a/swad_database.c b/swad_database.c index 639b7e22..607b30ae 100644 --- a/swad_database.c +++ b/swad_database.c @@ -88,24 +88,26 @@ void DB_CreateTablesIfNotExist (void) /***** Table IP_prefs *****/ /* mysql> DESCRIBE IP_prefs; -+------------+------------+------+-----+---------+-------+ -| Field | Type | Null | Key | Default | Extra | -+------------+------------+------+-----+---------+-------+ -| IP | char(15) | NO | PRI | NULL | | -| UsrCod | int(11) | NO | MUL | -1 | | -| LastChange | datetime | NO | MUL | NULL | | -| Layout | tinyint(4) | NO | | 0 | | -| Theme | char(16) | NO | | NULL | | -| IconSet | char(16) | NO | | NULL | | -| Menu | tinyint(4) | NO | | 0 | | -| SideCols | tinyint(4) | NO | | NULL | | -+------------+------------+------+-----+---------+-------+ -8 rows in set (0.00 sec) ++----------------+------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++----------------+------------+------+-----+---------+-------+ +| IP | char(15) | NO | PRI | NULL | | +| UsrCod | int(11) | NO | MUL | -1 | | +| LastChange | datetime | NO | MUL | NULL | | +| FirstDayOfWeek | tinyint(4) | NO | | 0 | | +| Layout | tinyint(4) | NO | | 0 | | +| Theme | char(16) | NO | | NULL | | +| IconSet | char(16) | NO | | NULL | | +| Menu | tinyint(4) | NO | | 0 | | +| SideCols | tinyint(4) | NO | | NULL | | ++----------------+------------+------+-----+---------+-------+ +9 rows in set (0.01 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS IP_prefs (" "IP CHAR(15) NOT NULL," "UsrCod INT NOT NULL DEFAULT -1," "LastChange DATETIME NOT NULL," + "FirstDayOfWeek TINYINT NOT NULL DEFAULT 0," "Layout TINYINT NOT NULL DEFAULT 0," "Theme CHAR(16) NOT NULL," "IconSet CHAR(16) NOT NULL," @@ -2277,6 +2279,7 @@ mysql> DESCRIBE usr_data; | Theme | char(16) | NO | MUL | NULL | | | IconSet | char(16) | NO | MUL | NULL | | | Language | char(2) | NO | MUL | NULL | | +| FirstDayOfWeek | tinyint(4) | NO | MUL | 0 | | | Photo | char(43) | NO | | NULL | | | PhotoVisibility | enum('user','course','system','world') | NO | | user | | | ProfileVisibility | enum('user','course','system','world') | NO | | user | | @@ -2299,7 +2302,7 @@ mysql> DESCRIBE usr_data; | NotifNtfEvents | int(11) | NO | | 0 | | | EmailNtfEvents | int(11) | NO | | 0 | | +-------------------+----------------------------------------+------+-----+---------+----------------+ -32 rows in set (0.00 sec) +33 rows in set (0.00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS usr_data (" "UsrCod INT NOT NULL AUTO_INCREMENT," @@ -2313,6 +2316,7 @@ mysql> DESCRIBE usr_data; "Theme CHAR(16) NOT NULL," "IconSet CHAR(16) NOT NULL," "Language CHAR(2) NOT NULL," + "FirstDayOfWeek TINYINT NOT NULL DEFAULT 0," "Photo CHAR(43) NOT NULL," "PhotoVisibility ENUM('user','course','system','world') NOT NULL DEFAULT 'user'," "ProfileVisibility ENUM('user','course','system','world') NOT NULL DEFAULT 'user'," @@ -2334,7 +2338,7 @@ mysql> DESCRIBE usr_data; "SideCols TINYINT NOT NULL DEFAULT 3," "NotifNtfEvents INT NOT NULL DEFAULT 0," "EmailNtfEvents INT NOT NULL DEFAULT 0," - "PRIMARY KEY(UsrCod),UNIQUE INDEX(EncryptedUsrCod),INDEX(Layout),INDEX(Theme),INDEX(IconSet),INDEX(Language),INDEX(CtyCod),INDEX(InsCtyCod),INDEX(InsCod),INDEX(DptCod),INDEX(CtrCod),INDEX(Menu),INDEX(SideCols))"); + "PRIMARY KEY(UsrCod),UNIQUE INDEX(EncryptedUsrCod),INDEX(Layout),INDEX(Theme),INDEX(IconSet),INDEX(Language),INDEX(FirstDayOfWeek),INDEX(CtyCod),INDEX(InsCtyCod),INDEX(InsCod),INDEX(DptCod),INDEX(CtrCod),INDEX(Menu),INDEX(SideCols))"); /***** Table usr_emails *****/ /* diff --git a/swad_degree.c b/swad_degree.c index 78a256e5..7e653ea3 100644 --- a/swad_degree.c +++ b/swad_degree.c @@ -414,8 +414,10 @@ static void Deg_Configuration (bool PrintView) "", The_ClassForm[Gbl.Prefs.Theme], Txt_Shortcut, - Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],Gbl.CurrentDeg.Deg.DegCod, - Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],Gbl.CurrentDeg.Deg.DegCod); + Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language], + Gbl.CurrentDeg.Deg.DegCod, + Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language], + Gbl.CurrentDeg.Deg.DegCod); if (PrintView) { diff --git a/swad_enrollment.c b/swad_enrollment.c index 95b8640f..c2147bba 100644 --- a/swad_enrollment.c +++ b/swad_enrollment.c @@ -447,7 +447,7 @@ void Enr_UpdateUsrData (struct UsrData *UsrDat) sprintf (Query,"UPDATE usr_data" " SET Password='%s'," "Surname1='%s',Surname2='%s',FirstName='%s',Sex='%s'," - "Layout='%u',Theme='%s',IconSet='%s',Language='%s',PhotoVisibility='%s',ProfileVisibility='%s'," + "Layout='%u',Theme='%s',IconSet='%s',Language='%s',FirstDayOfWeek='%u',PhotoVisibility='%s',ProfileVisibility='%s'," "CtyCod='%ld'," "LocalAddress='%s',LocalPhone='%s',FamilyAddress='%s',FamilyPhone='%s',OriginPlace='%s',Birthday='%04u-%02u-%02u',Comments='%s'" " WHERE UsrCod='%ld'", @@ -458,6 +458,7 @@ void Enr_UpdateUsrData (struct UsrData *UsrDat) The_ThemeId[UsrDat->Prefs.Theme], Ico_IconSetId[UsrDat->Prefs.IconSet], Txt_STR_LANG_ID[UsrDat->Prefs.Language], + UsrDat->Prefs.FirstDayOfWeek, Pri_VisibilityDB[UsrDat->PhotoVisibility], Pri_VisibilityDB[UsrDat->ProfileVisibility], UsrDat->CtyCod, diff --git a/swad_global.c b/swad_global.c index 09a2d51c..e0443fd0 100644 --- a/swad_global.c +++ b/swad_global.c @@ -35,6 +35,7 @@ #include // For getpid #include "swad_action.h" +#include "swad_calendar.h" #include "swad_config.h" #include "swad_constant.h" #include "swad_exam.h" @@ -125,14 +126,15 @@ void Gbl_InitializeGlobals (void) Gbl.HiddenParamsInsertedIntoDB = false; + Gbl.Prefs.Language = Txt_Current_CGI_SWAD_Language; + Gbl.Prefs.FirstDayOfWeek = Cal_FIRST_DAY_OF_WEEK_DEFAULT; // Default first day of week Gbl.Prefs.Layout = Lay_LAYOUT_DEFAULT; // Default layout + Gbl.Prefs.Menu = Mnu_MENU_DEFAULT; // Default menu + Gbl.Prefs.SideCols = Cfg_DEFAULT_COLUMNS; // Show both side columns, left and right Gbl.Prefs.Theme = The_THEME_DEFAULT; // Default theme Gbl.Prefs.IconSet = Ico_ICON_SET_DEFAULT; // Default icon set sprintf (Gbl.Prefs.IconsURL,"%s/%s", Cfg_HTTPS_URL_SWAD_PUBLIC,Cfg_FOLDER_PUBLIC_ICON); - Gbl.Prefs.Language = Txt_Current_CGI_SWAD_Language; - Gbl.Prefs.Menu = Mnu_MENU_DEFAULT; // Default menu - Gbl.Prefs.SideCols = Cfg_DEFAULT_COLUMNS; // Show both side columns, left and right sprintf (Gbl.Prefs.PathTheme,"%s/%s/%s", Gbl.Prefs.IconsURL, Cfg_ICON_FOLDER_THEMES, diff --git a/swad_global.h b/swad_global.h index 5fdb197d..1a16021b 100644 --- a/swad_global.h +++ b/swad_global.h @@ -130,15 +130,16 @@ struct Globals } Imported; struct { + Txt_Language_t Language; + unsigned FirstDayOfWeek; Lay_Layout_t Layout; + Mnu_Menu_t Menu; + unsigned SideCols; The_Theme_t Theme; char PathTheme[PATH_MAX+1]; - Txt_Language_t Language; - unsigned SideCols; Ico_IconSet_t IconSet; char PathIconSet[PATH_MAX+1]; char IconsURL[PATH_MAX+1]; - Mnu_Menu_t Menu; } Prefs; struct diff --git a/swad_icon.c b/swad_icon.c index 2b4dc76c..90c89e51 100644 --- a/swad_icon.c +++ b/swad_icon.c @@ -46,7 +46,7 @@ extern struct Globals Gbl; /******************************** Private constants **************************/ /*****************************************************************************/ -#define MAX_ICON_SET_ID 16 +#define Ico_MAX_BYTES_ICON_SET_ID 16 const char *Ico_IconSetId[Ico_NUM_ICON_SETS] = { @@ -129,17 +129,17 @@ void Ico_ChangeIconSet (void) Ico_IconSet_t Ico_GetParamIconSet (void) { - char IconSetId[MAX_ICON_SET_ID+1]; + char IconSetId[Ico_MAX_BYTES_ICON_SET_ID+1]; Ico_IconSet_t IconSet; - Par_GetParToText ("IconSet",IconSetId,MAX_ICON_SET_ID); + Par_GetParToText ("IconSet",IconSetId,Ico_MAX_BYTES_ICON_SET_ID); for (IconSet = (Ico_IconSet_t) 0; IconSet < Ico_NUM_ICON_SETS; IconSet++) if (!strcmp (IconSetId,Ico_IconSetId[IconSet])) return IconSet; - return Ico_ICON_SET_UNKNOWN; + return Ico_ICON_SET_DEFAULT; } /*****************************************************************************/ @@ -156,5 +156,5 @@ Ico_IconSet_t Ico_GetIconSetFromStr (const char *Str) if (!strcasecmp (Str,Ico_IconSetId[IconSet])) return IconSet; - return Ico_ICON_SET_UNKNOWN; + return Ico_ICON_SET_DEFAULT; } diff --git a/swad_icon.h b/swad_icon.h index c28e6688..2a320ebd 100644 --- a/swad_icon.h +++ b/swad_icon.h @@ -41,7 +41,6 @@ typedef enum { Ico_ICON_SET_AWESOME = 0, Ico_ICON_SET_NUVOLA = 1, - Ico_ICON_SET_UNKNOWN = 2, } Ico_IconSet_t; #define Ico_ICON_SET_DEFAULT Ico_ICON_SET_AWESOME diff --git a/swad_message.c b/swad_message.c index 825f336b..05a9081a 100644 --- a/swad_message.c +++ b/swad_message.c @@ -1721,31 +1721,39 @@ static void Msg_ConstructQueryToSelectSentOrReceivedMsgs (char *Query,Msg_TypeOf StrUnreadMsg = (Gbl.Msg.ShowOnlyUnreadMsgs ? " AND msg_rcv.Open='N'" : ""); if (FilterFromToSubquery[0]) - sprintf (PtrQuery,"SELECT msg_rcv.MsgCod FROM msg_rcv,msg_snt,usr_data" + sprintf (PtrQuery,"SELECT msg_rcv.MsgCod" + " FROM msg_rcv,msg_snt,usr_data" " WHERE msg_rcv.UsrCod='%ld'%s" - " AND msg_rcv.MsgCod=msg_snt.MsgCod AND msg_snt.CrsCod='%ld'" + " AND msg_rcv.MsgCod=msg_snt.MsgCod" + " AND msg_snt.CrsCod='%ld'" " AND msg_snt.UsrCod=usr_data.UsrCod%s" " ORDER BY msg_rcv.MsgCod DESC", UsrCod,StrUnreadMsg,FilterCrsCod, FilterFromToSubquery); else - sprintf (PtrQuery,"SELECT msg_rcv.MsgCod FROM msg_rcv,msg_snt" + sprintf (PtrQuery,"SELECT msg_rcv.MsgCod" + " FROM msg_rcv,msg_snt" " WHERE msg_rcv.UsrCod='%ld'%s" - " AND msg_rcv.MsgCod=msg_snt.MsgCod AND msg_snt.CrsCod='%ld'" + " AND msg_rcv.MsgCod=msg_snt.MsgCod" + " AND msg_snt.CrsCod='%ld'" " ORDER BY msg_rcv.MsgCod DESC", UsrCod,StrUnreadMsg, FilterCrsCod); break; case Msg_MESSAGES_SENT: if (FilterFromToSubquery[0]) - sprintf (PtrQuery,"SELECT DISTINCT msg_snt.MsgCod FROM msg_snt,msg_rcv,usr_data" - " WHERE msg_snt.UsrCod='%ld' AND msg_snt.CrsCod='%ld'" - " AND msg_snt.MsgCod=msg_rcv.MsgCod AND msg_rcv.UsrCod=usr_data.UsrCod%s" + sprintf (PtrQuery,"SELECT DISTINCT msg_snt.MsgCod" + " FROM msg_snt,msg_rcv,usr_data" + " WHERE msg_snt.UsrCod='%ld'" + " AND msg_snt.CrsCod='%ld'" + " AND msg_snt.MsgCod=msg_rcv.MsgCod" + " AND msg_rcv.UsrCod=usr_data.UsrCod%s" " ORDER BY msg_snt.MsgCod DESC", UsrCod,FilterCrsCod, FilterFromToSubquery); else - sprintf (PtrQuery,"SELECT MsgCod FROM msg_snt" + sprintf (PtrQuery,"SELECT MsgCod" + " FROM msg_snt" " WHERE UsrCod='%ld' AND CrsCod='%ld'" " ORDER BY MsgCod DESC", UsrCod,FilterCrsCod); @@ -1761,9 +1769,11 @@ static void Msg_ConstructQueryToSelectSentOrReceivedMsgs (char *Query,Msg_TypeOf { StrUnreadMsg = (Gbl.Msg.ShowOnlyUnreadMsgs ? " AND msg_rcv.Open='N'" : ""); - sprintf (PtrQuery,"SELECT msg_rcv.MsgCod FROM msg_rcv,msg_snt,usr_data" + sprintf (PtrQuery,"SELECT msg_rcv.MsgCod" + " FROM msg_rcv,msg_snt,usr_data" " WHERE msg_rcv.UsrCod='%ld'%s" - " AND msg_rcv.MsgCod=msg_snt.MsgCod AND msg_snt.UsrCod=usr_data.UsrCod%s" + " AND msg_rcv.MsgCod=msg_snt.MsgCod" + " AND msg_snt.UsrCod=usr_data.UsrCod%s" " ORDER BY msg_rcv.MsgCod DESC", UsrCod,StrUnreadMsg, FilterFromToSubquery); @@ -1772,7 +1782,8 @@ static void Msg_ConstructQueryToSelectSentOrReceivedMsgs (char *Query,Msg_TypeOf { StrUnreadMsg = (Gbl.Msg.ShowOnlyUnreadMsgs ? " AND Open='N'" : ""); - sprintf (PtrQuery,"SELECT MsgCod FROM msg_rcv" + sprintf (PtrQuery,"SELECT MsgCod" + " FROM msg_rcv" " WHERE UsrCod='%ld'%s" " ORDER BY MsgCod DESC", UsrCod,StrUnreadMsg); @@ -1780,14 +1791,17 @@ static void Msg_ConstructQueryToSelectSentOrReceivedMsgs (char *Query,Msg_TypeOf break; case Msg_MESSAGES_SENT: if (FilterFromToSubquery[0]) - sprintf (PtrQuery,"SELECT DISTINCT msg_snt.MsgCod FROM msg_snt,msg_rcv,usr_data" + sprintf (PtrQuery,"SELECT DISTINCT msg_snt.MsgCod" + " FROM msg_snt,msg_rcv,usr_data" " WHERE msg_snt.UsrCod='%ld'" - " AND msg_snt.MsgCod=msg_rcv.MsgCod AND msg_rcv.UsrCod=usr_data.UsrCod%s" + " AND msg_snt.MsgCod=msg_rcv.MsgCod" + " AND msg_rcv.UsrCod=usr_data.UsrCod%s" " ORDER BY msg_snt.MsgCod DESC", UsrCod, FilterFromToSubquery); else - sprintf (PtrQuery,"SELECT MsgCod FROM msg_snt" + sprintf (PtrQuery,"SELECT MsgCod" + " FROM msg_snt" " WHERE UsrCod='%ld'" " ORDER BY MsgCod DESC", UsrCod); @@ -1797,7 +1811,8 @@ static void Msg_ConstructQueryToSelectSentOrReceivedMsgs (char *Query,Msg_TypeOf } if (Gbl.Msg.FilterContent[0]) - sprintf (Query,"SELECT MsgCod FROM msg_content" + sprintf (Query,"SELECT MsgCod" + " FROM msg_content" " WHERE MsgCod IN (%s)" " AND MATCH (Subject,Content) AGAINST ('%s')", SubQuery, diff --git a/swad_nickname.c b/swad_nickname.c index d956d2d3..a583cb2f 100644 --- a/swad_nickname.c +++ b/swad_nickname.c @@ -156,7 +156,8 @@ long Nck_GetUsrCodFromNickname (const char *Nickname) /***** Get user's code from database *****/ /* Check if user code from table usr_nicknames is also in table usr_data */ - sprintf (Query,"SELECT usr_nicknames.UsrCod FROM usr_nicknames,usr_data" + sprintf (Query,"SELECT usr_nicknames.UsrCod" + " FROM usr_nicknames,usr_data" " WHERE usr_nicknames.Nickname='%s'" " AND usr_nicknames.UsrCod=usr_data.UsrCod", NicknameWithoutArroba); diff --git a/swad_photo.c b/swad_photo.c index 2f136e84..af1828d7 100644 --- a/swad_photo.c +++ b/swad_photo.c @@ -985,7 +985,9 @@ static void Pho_ClearPhotoName (long UsrCod) char Query[128]; /***** Clear photo name in user's data *****/ - sprintf (Query,"UPDATE usr_data SET Photo='' WHERE UsrCod='%ld'",UsrCod); + sprintf (Query,"UPDATE usr_data SET Photo=''" + " WHERE UsrCod='%ld'", + UsrCod); DB_QueryUPDATE (Query,"can not clear the name of a user's photo"); } @@ -999,7 +1001,8 @@ void Pho_UpdatePhotoName (struct UsrData *UsrDat) char PathPublPhoto[PATH_MAX+1]; /***** Update photo name in database *****/ - sprintf (Query,"UPDATE usr_data SET Photo='%s' WHERE UsrCod='%ld'", + sprintf (Query,"UPDATE usr_data SET Photo='%s'" + " WHERE UsrCod='%ld'", Gbl.UniqueNameEncrypted,UsrDat->UsrCod); DB_QueryUPDATE (Query,"can not update the name of a user's photo"); diff --git a/swad_preference.c b/swad_preference.c index 380dd985..9117c744 100644 --- a/swad_preference.c +++ b/swad_preference.c @@ -30,6 +30,7 @@ #include // For fprintf, etc. #include +#include "swad_calendar.h" #include "swad_config.h" #include "swad_database.h" #include "swad_global.h" @@ -67,35 +68,42 @@ void Pre_EditPrefs (void) extern const char *Txt_You_can_only_receive_email_notifications_if_; char MailDomain[Usr_MAX_BYTES_USR_EMAIL+1]; - /***** Language *****/ + /***** Language and first day of week *****/ + fprintf (Gbl.F.Out,"" + "" + "" + "" + "" + "
"); Lay_StartRoundFrame (NULL,Txt_Language); - Pre_PutSelectorToSelectLanguage (); + fprintf (Gbl.F.Out,"
"); + Pre_PutSelectorToSelectLanguage (); // 1. Language + fprintf (Gbl.F.Out,"
"); Lay_EndRoundFrame (); + fprintf (Gbl.F.Out,"
"); + Cal_PutIconsToSelectFirstDayOfWeek (); // 2. First day of week + fprintf (Gbl.F.Out,"
"); /***** Layout, side columns, theme, icon set & menu *****/ fprintf (Gbl.F.Out,"" "" ""); if (Gbl.Prefs.Layout == Lay_LAYOUT_DESKTOP) { fprintf (Gbl.F.Out,"" ""); } - fprintf (Gbl.F.Out,"" - "
"); - Lay_PutIconsToSelectLayout (); // 1. Layout + Lay_PutIconsToSelectLayout (); // 3. Layout fprintf (Gbl.F.Out,""); - Mnu_PutIconsToSelectMenu (); // 2. Menu + Mnu_PutIconsToSelectMenu (); // 4. Menu fprintf (Gbl.F.Out,""); - Pre_PutIconsToSelectSideCols (); // 3. Side columns + Pre_PutIconsToSelectSideCols (); // 5. Side columns fprintf (Gbl.F.Out,"
" - "" - "" - "" "" "" "
"); - The_PutIconsToSelectTheme (); // 4. Theme + fprintf (Gbl.F.Out,""); + The_PutIconsToSelectTheme (); // 6. Theme fprintf (Gbl.F.Out,""); - Ico_PutIconsToSelectIconSet (); // 5. Icon set + Ico_PutIconsToSelectIconSet (); // 7. Icon set fprintf (Gbl.F.Out,"
"); @@ -178,9 +186,10 @@ void Pre_SetPrefsFromIP (void) char Query[512]; /***** Update preferences from current IP in database *****/ - sprintf (Query,"REPLACE INTO IP_prefs (IP,UsrCod,LastChange,Layout,Theme,IconSet,Menu,SideCols)" - " VALUES ('%s','%ld',NOW(),'%u','%s','%s','%u','%u')", + sprintf (Query,"REPLACE INTO IP_prefs (IP,UsrCod,LastChange,FirstDayOfWeek,Layout,Theme,IconSet,Menu,SideCols)" + " VALUES ('%s','%ld',NOW(),'%u','%u','%s','%s','%u','%u')", Gbl.IP,Gbl.Usrs.Me.UsrDat.UsrCod, + Gbl.Prefs.FirstDayOfWeek, (unsigned) Gbl.Prefs.Layout, The_ThemeId[Gbl.Prefs.Theme], Ico_IconSetId[Gbl.Prefs.IconSet], @@ -191,8 +200,9 @@ void Pre_SetPrefsFromIP (void) /***** If a user is logged, update its preferences in database for all its IP's *****/ if (Gbl.Usrs.Me.Logged) { - sprintf (Query,"UPDATE IP_prefs SET Layout='%u',Theme='%s',IconSet='%s',Menu='%u',SideCols='%u'" + sprintf (Query,"UPDATE IP_prefs SET FirstDayOfWeek='%u',Layout='%u',Theme='%s',IconSet='%s',Menu='%u',SideCols='%u'" " WHERE UsrCod='%ld'", + Gbl.Prefs.FirstDayOfWeek, (unsigned) Gbl.Prefs.Layout, The_ThemeId[Gbl.Prefs.Theme], Ico_IconSetId[Gbl.Prefs.IconSet], @@ -234,7 +244,8 @@ void Pre_PutSelectorToSelectLanguage (void) }; Act_FormStart (ActReqChgLan); - fprintf (Gbl.F.Out,"