diff --git a/css/swad_desktop.css b/css/swad_desktop.css index b7b160781..2c4bf4f61 100644 --- a/css/swad_desktop.css +++ b/css/swad_desktop.css @@ -359,8 +359,16 @@ hr.YELLOW_SEPARA {height:0; border-top:0; border-bottom:#BD4815 dotted 1px;} text-align:center; overflow:hidden; } +.NOTICE_TEXT_BRIEF + { + clear:both; + font-size:12pt; + color:#204080; + overflow:hidden; + } .NOTICE_TEXT_ACTIVE { + padding:10px 20px; clear:both; font-size:12pt; color:#204080; @@ -368,6 +376,7 @@ hr.YELLOW_SEPARA {height:0; border-top:0; border-bottom:#BD4815 dotted 1px;} } .NOTICE_TEXT_OBSOLETE { + padding:10px 20px; clear:both; font-size:12pt; color:#4070A0; diff --git a/css/swad_mobile.css b/css/swad_mobile.css index f84389930..29e7908d4 100644 --- a/css/swad_mobile.css +++ b/css/swad_mobile.css @@ -313,6 +313,7 @@ form {margin:0; display:inline;} } .NOTICE_TEXT_ACTIVE { + padding:10px 20px; clear:both; font-size:12pt; color:#204080; @@ -320,6 +321,7 @@ form {margin:0; display:inline;} } .NOTICE_TEXT_OBSOLETE { + padding:10px 20px; clear:both; font-size:12pt; color:#4070A0; diff --git a/swad_action.c b/swad_action.c index ea61fa4c2..7494a01d0 100644 --- a/swad_action.c +++ b/swad_action.c @@ -2440,7 +2440,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = // TabMsg ****************************************************************** // Actions in menu: /* ActSeeNtf */{ 990, 0,TabMsg,ActSeeNtf ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ntf_ShowMyNotifications ,"bell" }, - /* ActSeeAnn */{1235, 1,TabMsg,ActSeeAnn ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ann_ShowAllAnnouncements ,"note" }, + /* ActSeeAnn */{1235, 1,TabMsg,ActSeeAnn ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ann_ShowAllAnnouncements ,"note" }, /* ActSeeNot */{ 762, 2,TabMsg,ActSeeNot ,0x1FF,0x1FF,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Not_ListNotices ,"note" }, /* ActSeeFor */{ 95, 3,TabMsg,ActSeeFor ,0x1FC,0x1FC,0x1FC,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,For_ShowForumList ,"forum" }, /* ActSeeChtRms */{ 51, 4,TabMsg,ActSeeChtRms ,0x1FC,0x1FC,0x1FC,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Cht_ShowChatRooms ,"chat" }, diff --git a/swad_announcement.c b/swad_announcement.c index 19f0daa08..1ecc339ce 100644 --- a/swad_announcement.c +++ b/swad_announcement.c @@ -73,7 +73,7 @@ static void Ann_CreateAnnouncement (unsigned Roles,const char *Subject,const cha void Ann_ShowAllAnnouncements (void) { extern const char *Txt_New_announcement; - extern const char *Txt_All_announcements; + extern const char *Txt_Announcements; extern const char *Txt_No_announcements; char Query[256]; MYSQL_RES *mysql_res; @@ -97,14 +97,32 @@ void Ann_ShowAllAnnouncements (void) } /***** Get announcements from database *****/ - sprintf (Query,"SELECT AnnCod,Status,Roles,Subject,Content" - " FROM announcements" - " ORDER BY AnnCod DESC"); + if (ICanEditAnnouncements) + /* Select all announcements */ + sprintf (Query,"SELECT AnnCod,Status,Roles,Subject,Content" + " FROM announcements" + " ORDER BY AnnCod DESC"); + else if (Gbl.Usrs.Me.Logged) + /* Select only active announcements I can see */ + sprintf (Query,"SELECT AnnCod,Status,Roles,Subject,Content" + " FROM announcements" + " WHERE Status='%u' AND (Roles&%u)<>0 " + " ORDER BY AnnCod DESC", + (unsigned) Ann_ACTIVE_ANNOUNCEMENT, + Gbl.Usrs.Me.UsrDat.Roles); // All my roles in different courses + else // No user logged + /* Select only active announcements for unknown users */ + sprintf (Query,"SELECT AnnCod,Status,Roles,Subject,Content" + " FROM announcements" + " WHERE Status='%u' AND (Roles&%u)<>0 " + " ORDER BY AnnCod DESC", + (unsigned) Ann_ACTIVE_ANNOUNCEMENT, + (unsigned) (1 << Rol_UNKNOWN)); NumAnnouncements = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get announcements"); if (NumAnnouncements) /***** Start frame *****/ - Lay_StartRoundFrame ("550px",Txt_All_announcements); + Lay_StartRoundFrame ("550px",Txt_Announcements); else Lay_ShowAlert (Lay_INFO,Txt_No_announcements); @@ -170,7 +188,7 @@ void Ann_ShowMyAnnouncementsNotMarkedAsSeen (void) /***** Select announcements not seen *****/ // Roles == 24 ==> Teachers and students sprintf (Query,"SELECT AnnCod,Subject,Content FROM announcements" - " WHERE (Roles&%u)<>0 AND Status='%u'" + " WHERE Status='%u' AND (Roles&%u)<>0 " " AND AnnCod NOT IN" " (SELECT AnnCod FROM ann_seen WHERE UsrCod='%ld')" " ORDER BY AnnCod DESC", // Newest first @@ -249,7 +267,7 @@ static void Ann_DrawAnAnnouncement (long AnnCod,Ann_Status_t Status, "NOTICE_AUTHOR_OBSOLETE", // Ann_OBSOLETE_ANNOUNCEMENT }; Rol_Role_t Role; - bool RolesSelected; + bool SomeRolesAreSelected; /***** Start yellow note *****/ fprintf (Gbl.F.Out,"
", @@ -320,15 +338,14 @@ static void Ann_DrawAnAnnouncement (long AnnCod,Ann_Status_t Status, /* Users' roles who can view this announcement */ fprintf (Gbl.F.Out,"

%s:", UsersClass[Status],Txt_Users); - for (Role = Rol_STUDENT, RolesSelected = false; + for (Role = Rol_UNKNOWN, SomeRolesAreSelected = false; Role <= Rol_TEACHER; Role++) if (Roles & (1 << Role)) { - if (RolesSelected) + if (SomeRolesAreSelected) fprintf (Gbl.F.Out,","); - else - RolesSelected = true; + SomeRolesAreSelected = true; fprintf (Gbl.F.Out," %s",Txt_ROLES_PLURAL_abc[Role][Usr_SEX_UNKNOWN]); } fprintf (Gbl.F.Out,"

"); @@ -433,7 +450,13 @@ void Ann_ShowFormAnnouncement (void) "", The_ClassForm[Gbl.Prefs.Theme], Txt_Users); - Rol_WriteSelectorRoles (1 << Rol_STUDENT | + Rol_WriteSelectorRoles (1 << Rol_UNKNOWN | + 1 << Rol__GUEST_ | + 1 << Rol_STUDENT | + 1 << Rol_TEACHER, + 1 << Rol_UNKNOWN | + 1 << Rol__GUEST_ | + 1 << Rol_STUDENT | 1 << Rol_TEACHER); fprintf (Gbl.F.Out,"" ""); diff --git a/swad_changelog.h b/swad_changelog.h index 73d1280fa..920b26483 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -109,11 +109,12 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 15.34 (2015/11/01)" +#define Log_PLATFORM_VERSION "SWAD 15.34.1 (2015/11/01)" // 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.34.1: Nov 01, 2015 Global announcements can be seen by all. (186939 lines) Version 15.34: Nov 01, 2015 Global announcements can be hidden. (186896 lines) 3 changes necessary in database: ALTER TABLE announcements ADD COLUMN Status TINYINT NOT NULL DEFAULT 0 AFTER AnnCod,ADD INDEX (Status); diff --git a/swad_enrollment.c b/swad_enrollment.c index 42f7e8454..eccf59882 100644 --- a/swad_enrollment.c +++ b/swad_enrollment.c @@ -2142,7 +2142,7 @@ void Enr_ShowEnrollmentRequests (void) extern const char *Txt_Register; extern const char *Txt_Reject; extern const char *Txt_No_enrollment_requests; - unsigned Roles; + unsigned RolesSelected; char Query[1024]; MYSQL_RES *mysql_res; MYSQL_ROW row; @@ -2194,25 +2194,28 @@ void Enr_ShowEnrollmentRequests (void) "", The_ClassForm[Gbl.Prefs.Theme], Txt_Users); - Rol_GetSelectedRoles (&Roles); - if (!Roles) + Rol_GetSelectedRoles (&RolesSelected); + if (!RolesSelected) /* Set default roles */ switch (Gbl.Usrs.Me.LoggedRole) { case Rol_TEACHER: - Roles = (1 << Rol_STUDENT) | (1 << Rol_TEACHER); + RolesSelected = (1 << Rol_STUDENT) | + (1 << Rol_TEACHER); break; case Rol_DEG_ADM: case Rol_CTR_ADM: case Rol_INS_ADM: case Rol_SYS_ADM: - Roles = (1 << Rol_TEACHER); + RolesSelected = (1 << Rol_TEACHER); break; default: Lay_ShowErrorAndExit ("You don't have permission to list requesters."); break; } - Rol_WriteSelectorRoles (Roles); + Rol_WriteSelectorRoles (1 << Rol_STUDENT | + 1 << Rol_TEACHER, + RolesSelected); fprintf (Gbl.F.Out,"" "" ""); @@ -2242,7 +2245,7 @@ void Enr_ShowEnrollmentRequests (void) " AND ((1<0" " ORDER BY crs_usr_requests.RequestTime DESC", Gbl.Usrs.Me.UsrDat.UsrCod, - Roles); + RolesSelected); break; case Rol_DEG_ADM: sprintf (Query,"SELECT crs_usr_requests.ReqCod," @@ -2257,7 +2260,7 @@ void Enr_ShowEnrollmentRequests (void) " AND ((1<0" " ORDER BY crs_usr_requests.RequestTime DESC", Gbl.Usrs.Me.UsrDat.UsrCod, - Roles); + RolesSelected); break; case Rol_CTR_ADM: sprintf (Query,"SELECT crs_usr_requests.ReqCod," @@ -2273,7 +2276,7 @@ void Enr_ShowEnrollmentRequests (void) " AND ((1<0" " ORDER BY crs_usr_requests.RequestTime DESC", Gbl.Usrs.Me.UsrDat.UsrCod, - Roles); + RolesSelected); break; case Rol_INS_ADM: sprintf (Query,"SELECT crs_usr_requests.ReqCod," @@ -2290,7 +2293,7 @@ void Enr_ShowEnrollmentRequests (void) " AND ((1<0" " ORDER BY crs_usr_requests.RequestTime DESC", Gbl.Usrs.Me.UsrDat.UsrCod, - Roles); + RolesSelected); break; case Rol_SYS_ADM: sprintf (Query,"SELECT ReqCod," @@ -2301,7 +2304,7 @@ void Enr_ShowEnrollmentRequests (void) " FROM crs_usr_requests" " WHERE ((1<0" " ORDER BY RequestTime DESC", - Roles); + RolesSelected); break; default: Lay_ShowErrorAndExit ("You don't have permission to list requesters."); @@ -2328,7 +2331,7 @@ void Enr_ShowEnrollmentRequests (void) " ORDER BY crs_usr_requests.RequestTime DESC", Gbl.Usrs.Me.UsrDat.UsrCod, Gbl.CurrentIns.Ins.InsCod, - Roles); + RolesSelected); break; case Rol_DEG_ADM: sprintf (Query,"SELECT crs_usr_requests.ReqCod," @@ -2347,7 +2350,7 @@ void Enr_ShowEnrollmentRequests (void) " ORDER BY crs_usr_requests.RequestTime DESC", Gbl.Usrs.Me.UsrDat.UsrCod, Gbl.CurrentIns.Ins.InsCod, - Roles); + RolesSelected); break; case Rol_CTR_ADM: sprintf (Query,"SELECT crs_usr_requests.ReqCod," @@ -2366,7 +2369,7 @@ void Enr_ShowEnrollmentRequests (void) " ORDER BY crs_usr_requests.RequestTime DESC", Gbl.Usrs.Me.UsrDat.UsrCod, Gbl.CurrentIns.Ins.InsCod, - Roles); + RolesSelected); break; case Rol_INS_ADM: // If I am logged as admin of this institution, I can view all the requesters from this institution case Rol_SYS_ADM: @@ -2383,7 +2386,7 @@ void Enr_ShowEnrollmentRequests (void) " AND ((1<0" " ORDER BY crs_usr_requests.RequestTime DESC", Gbl.CurrentIns.Ins.InsCod, - Roles); + RolesSelected); break; default: Lay_ShowErrorAndExit ("You don't have permission to list requesters."); @@ -2409,7 +2412,7 @@ void Enr_ShowEnrollmentRequests (void) " ORDER BY crs_usr_requests.RequestTime DESC", Gbl.Usrs.Me.UsrDat.UsrCod, Gbl.CurrentCtr.Ctr.CtrCod, - Roles); + RolesSelected); break; case Rol_DEG_ADM: sprintf (Query,"SELECT crs_usr_requests.ReqCod," @@ -2427,7 +2430,7 @@ void Enr_ShowEnrollmentRequests (void) " ORDER BY crs_usr_requests.RequestTime DESC", Gbl.Usrs.Me.UsrDat.UsrCod, Gbl.CurrentCtr.Ctr.CtrCod, - Roles); + RolesSelected); break; case Rol_CTR_ADM: // If I am logged as admin of this centre , I can view all the requesters from this centre case Rol_INS_ADM: // If I am logged as admin of this institution, I can view all the requesters from this centre @@ -2444,7 +2447,7 @@ void Enr_ShowEnrollmentRequests (void) " AND ((1<0" " ORDER BY crs_usr_requests.RequestTime DESC", Gbl.CurrentCtr.Ctr.CtrCod, - Roles); + RolesSelected); break; default: Lay_ShowErrorAndExit ("You don't have permission to list requesters."); @@ -2469,7 +2472,7 @@ void Enr_ShowEnrollmentRequests (void) " ORDER BY crs_usr_requests.RequestTime DESC", Gbl.Usrs.Me.UsrDat.UsrCod, Gbl.CurrentDeg.Deg.DegCod, - Roles); + RolesSelected); break; case Rol_DEG_ADM: // If I am logged as admin of this degree , I can view all the requesters from this degree case Rol_CTR_ADM: // If I am logged as admin of this centre , I can view all the requesters from this degree @@ -2486,7 +2489,7 @@ void Enr_ShowEnrollmentRequests (void) " AND ((1<0" " ORDER BY crs_usr_requests.RequestTime DESC", Gbl.CurrentDeg.Deg.DegCod, - Roles); + RolesSelected); break; default: Lay_ShowErrorAndExit ("You don't have permission to list requesters."); @@ -2507,7 +2510,8 @@ void Enr_ShowEnrollmentRequests (void) " WHERE CrsCod='%ld'" " AND ((1<0" " ORDER BY RequestTime DESC", - Gbl.CurrentCrs.Crs.CrsCod,Roles); + Gbl.CurrentCrs.Crs.CrsCod, + RolesSelected); break; default: Lay_ShowErrorAndExit ("You don't have permission to list requesters."); diff --git a/swad_notice.c b/swad_notice.c index 711ac36b2..544c73525 100644 --- a/swad_notice.c +++ b/swad_notice.c @@ -619,12 +619,13 @@ static void Not_DrawANotice (Not_Listing_t TypeNoticesListing, UniqueId,(long) TimeUTC); /***** Write the content of the notice *****/ - fprintf (Gbl.F.Out,"
%s", - TextClass[Status],Content); if (TypeNoticesListing == Not_LIST_BRIEF_NOTICES) { - fprintf (Gbl.F.Out,"
"); + fprintf (Gbl.F.Out,"
%s
", + Content); + /* Form to view full notice */ + fprintf (Gbl.F.Out,"
"); Act_FormStart (ActShoNot); Not_PutHiddenParamNotCod (NotCod); Act_LinkFormSubmit (Txt_See_full_notice,The_ClassForm[Gbl.Prefs.Theme]); @@ -638,7 +639,9 @@ static void Not_DrawANotice (Not_Listing_t TypeNoticesListing, Act_FormEnd (); fprintf (Gbl.F.Out,"
"); } - fprintf (Gbl.F.Out,"
"); + else + fprintf (Gbl.F.Out,"
%s
", + TextClass[Status],Content); /***** Write the author *****/ fprintf (Gbl.F.Out,"
", diff --git a/swad_role.c b/swad_role.c index 0f569fc6e..a4509ef56 100644 --- a/swad_role.c +++ b/swad_role.c @@ -348,22 +348,24 @@ void Rol_ChangeMyRole (void) /********************* Write selector of users' roles ************************/ /*****************************************************************************/ -void Rol_WriteSelectorRoles (unsigned Roles) +void Rol_WriteSelectorRoles (unsigned RolesAllowed, + unsigned RolesSelected) { extern const char *Txt_ROLES_PLURAL_abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; Rol_Role_t Role; - for (Role = Rol_STUDENT; - Role <= Rol_TEACHER; + for (Role = Rol_UNKNOWN; + Role <= Rol_SYS_ADM; Role++) - { - fprintf (Gbl.F.Out,"%s
", - Txt_ROLES_PLURAL_abc[Role][Usr_SEX_UNKNOWN]); - } + if ((RolesAllowed & (1 << Role))) + { + fprintf (Gbl.F.Out,"%s
", + Txt_ROLES_PLURAL_abc[Role][Usr_SEX_UNKNOWN]); + } } /*****************************************************************************/ diff --git a/swad_role.h b/swad_role.h index 4d3623fb3..aac9b2039 100644 --- a/swad_role.h +++ b/swad_role.h @@ -78,7 +78,8 @@ unsigned Rol_ConvertUnsignedStrToRoles (const char *UnsignedStr); void Rol_PutFormToChangeMyRole (bool FormInHead); void Rol_ChangeMyRole (void); -void Rol_WriteSelectorRoles (unsigned Roles); +void Rol_WriteSelectorRoles (unsigned RolesAllowed, + unsigned RolesSelected); void Rol_GetSelectedRoles (unsigned *Roles); Rol_Role_t Rol_GetRequestedRole (long UsrCod); diff --git a/swad_survey.c b/swad_survey.c index 8033e3380..32c6e3374 100644 --- a/swad_survey.c +++ b/swad_survey.c @@ -1572,7 +1572,9 @@ void Svy_RequestCreatOrEditSvy (void) "", The_ClassForm[Gbl.Prefs.Theme], Txt_Users); - Rol_WriteSelectorRoles (Svy.Roles); + Rol_WriteSelectorRoles (1 << Rol_STUDENT | + 1 << Rol_TEACHER, + Svy.Roles); fprintf (Gbl.F.Out,"" ""); diff --git a/swad_tab.c b/swad_tab.c index ddb1c542e..950a1fe6d 100644 --- a/swad_tab.c +++ b/swad_tab.c @@ -294,9 +294,6 @@ static bool Tab_CheckIfICanViewTab (Act_Tab_t Tab) Gbl.CurrentCrs.Crs.CrsCod <= 0); case TabCrs: return (Gbl.CurrentCrs.Crs.CrsCod > 0); - case TabMsg: // TODO: Show this tab in any case when Announcements will be available for all - return (Gbl.Usrs.Me.Logged || - Gbl.CurrentCrs.Crs.CrsCod > 0); default: return true; } diff --git a/swad_text.c b/swad_text.c index a644935f7..93979ddf0 100644 --- a/swad_text.c +++ b/swad_text.c @@ -2002,27 +2002,6 @@ const char *Txt_All = "Tudo"; #endif -const char *Txt_All_announcements = -#if L==0 - "Tots els anuncis"; -#elif L==1 - "Alle Bekanntmachungen"; -#elif L==2 - "All announcements"; -#elif L==3 - "Todos los anuncios"; -#elif L==4 - "Tous les annonces"; -#elif L==5 - "Todos los anuncios"; // Okoteve traducción -#elif L==6 - "Tutti i annunci"; -#elif L==7 - "Wszystkie ogłoszenia"; -#elif L==8 - "Todos os anúncios"; -#endif - const char *Txt_all_degrees = #if L==0 "Totes les titulacions"; @@ -2338,6 +2317,27 @@ const char *Txt_and_X_other_recipients = // Warning: it is very important to inc "...e %u outros destinatários"; #endif +const char *Txt_Announcements = +#if L==0 + "Anuncis"; +#elif L==1 + "Bekanntmachungen"; +#elif L==2 + "Announcements"; +#elif L==3 + "Anuncios"; +#elif L==4 + "Annonces"; +#elif L==5 + "Anuncios"; // Okoteve traducción +#elif L==6 + "Annunci"; +#elif L==7 + "Ogłoszenia"; +#elif L==8 + "Anúncios"; +#endif + const char *Txt_Announcement_of_exam_removed = #if L==0 "Convocatoria d'examen eliminada.";