diff --git a/css/swad22.3.css b/css/swad22.3.css index f953179f..7c49df9c 100644 --- a/css/swad22.3.css +++ b/css/swad22.3.css @@ -1679,7 +1679,7 @@ a:hover img.CENTER_PHOTO_SHOW .PRG_COL1 { box-sizing:border-box; - width:86px; + width:108px; } .PRG_TITLE_DESCRIPTION_WIDTH @@ -1778,8 +1778,8 @@ a:hover img.CENTER_PHOTO_SHOW .PRG_RSC_PURPLE, .PRG_RSC_BLUE, .PRG_RSC_YELLOW, -.PRG_RSC_PINK {color:#202020; font-size:14pt; font-weight:bold;} -.PRG_RSC_DARK {color:#e0e0e0; font-size:14pt; font-weight:bold;} +.PRG_RSC_PINK {color:#202020; font-size:12pt;} +.PRG_RSC_DARK {color:#e0e0e0; font-size:12pt;} /************************* Program resource clipboard ************************/ .PRG_CLIPBOARD diff --git a/swad_browser.c b/swad_browser.c index 1a7dcf71..061647c2 100644 --- a/swad_browser.c +++ b/swad_browser.c @@ -7969,12 +7969,19 @@ void Brw_ShowFileMetadata (void) FileNameToShow); /***** Begin box *****/ + /* PutIconToGetLink = (Gbl.FileBrowser.Type == Brw_SHOW_DOC_CRS || // Only document zone Gbl.FileBrowser.Type == Brw_ADMI_DOC_CRS) && (FileMetadata.FilFolLnk.Type == Brw_IS_FILE || // Only files or links FileMetadata.FilFolLnk.Type == Brw_IS_LINK) && (Gbl.Usrs.Me.Role.Logged == Rol_TCH || // Only if I am teacher or superuser Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM); + */ + PutIconToGetLink = (Gbl.FileBrowser.Type == Brw_SHOW_DOC_CRS || // Only document zone + Gbl.FileBrowser.Type == Brw_ADMI_DOC_CRS) && + (FileMetadata.FilFolLnk.Type == Brw_IS_FILE || // Only files or links + FileMetadata.FilFolLnk.Type == Brw_IS_LINK) && + (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM); // Only if I am superuser // TODO: Include teachers if (PutIconToGetLink) Box_BoxShadowBegin (NULL,NULL, Brw_PutIconToGetLinkToFile,&FileMetadata, diff --git a/swad_changelog.h b/swad_changelog.h index 08dc0725..cdc0956b 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -606,10 +606,11 @@ TODO: Fix bug: error al enviar un mensaje a dos recipientes, error on duplicate TODO: Attach pdf files in multimedia. */ -#define Log_PLATFORM_VERSION "SWAD 22.4.1 (2022-09-15)" +#define Log_PLATFORM_VERSION "SWAD 22.4.2 (2022-09-16)" #define CSS_FILE "swad22.3.css" #define JS_FILE "swad21.100.js" /* + Version 22.4.2: Sep 16, 2022 Changes in edition of program items. (329982 lines) Version 22.4.1: Sep 15, 2022 Changes in edition of program items. (329955 lines) Copy the following icon to icon public directory: sudo cp icon/link.svg /var/www/html/swad/icon/ diff --git a/swad_program.h b/swad_program.h index 0de20094..f6e3a03c 100644 --- a/swad_program.h +++ b/swad_program.h @@ -70,6 +70,12 @@ typedef enum PrgRsc_FORUM_THREAD, } PrgRsc_Type_t; +struct Prg_Link + { + PrgRsc_Type_t Type; + long Cod; + }; + #define Prg_MAX_CHARS_PROGRAM_ITEM_TITLE (128 - 1) // 127 #define Prg_MAX_BYTES_PROGRAM_ITEM_TITLE ((Prg_MAX_CHARS_PROGRAM_ITEM_TITLE + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047 @@ -92,8 +98,7 @@ struct Prg_Item struct { struct Prg_ResourceHierarchy Hierarchy; - PrgRsc_Type_t Type; - long Cod; + struct Prg_Link Link; char Title[PrgRsc_MAX_BYTES_PROGRAM_RESOURCE_TITLE + 1]; } Resource; }; diff --git a/swad_program_resource.c b/swad_program_resource.c index 1eb0f314..beb7e237 100644 --- a/swad_program_resource.c +++ b/swad_program_resource.c @@ -112,10 +112,9 @@ static bool PrgRsc_ExchangeResources (const struct Prg_ResourceHierarchy *Rsc1, const struct Prg_ResourceHierarchy *Rsc2); static void PrgRsc_ShowClipboard (struct Prg_Item *Item); -static void PrgRsc_WriteRowClipboard (unsigned NumLink, - const struct PrgRsc_Link *Link); -static void PrgRsc_WriteLinkName (const struct PrgRsc_Link *Link); -static void PrgRsc_GetDataOfLinkFromClipboard (struct PrgRsc_Link *Link, +static void PrgRsc_WriteRowClipboard (bool SubmitOnClick,const struct Prg_Link *Link); +static void PrgRsc_WriteLinkName (const struct Prg_Link *Link); +static void PrgRsc_GetDataOfLinkFromClipboard (struct Prg_Link *Link, MYSQL_RES **mysql_res); /*****************************************************************************/ @@ -408,8 +407,8 @@ static void PrgRsc_GetDataOfResource (struct Prg_Item *Item, Item->Resource.Hierarchy.Hidden = (row[3][0] == 'Y'); /* Get link type and code (row[4], row[5]) */ - Item->Resource.Type = PrgRsc_GetTypeFromString (row[4]); - Item->Resource.Cod = Str_ConvertStrCodToLongCod (row[5]); + Item->Resource.Link.Type = PrgRsc_GetTypeFromString (row[4]); + Item->Resource.Link.Cod = Str_ConvertStrCodToLongCod (row[5]); /* Get the title of the item resource (row[6]) */ Str_Copy (Item->Resource.Title,row[6],sizeof (Item->Resource.Title) - 1); @@ -422,6 +421,8 @@ static void PrgRsc_GetDataOfResource (struct Prg_Item *Item, static void PrgRsc_WriteRowViewResource (unsigned NumRsc, const struct Prg_Item *Item) { + extern const char *Prg_ResourceTypesDB[PrgRsc_NUM_TYPES]; + /***** Begin row *****/ HTM_TR_Begin (NULL); @@ -435,6 +436,10 @@ static void PrgRsc_WriteRowViewResource (unsigned NumRsc, HTM_TD_Begin ("class=\"PRG_MAIN PRG_RSC_%s %s\"", The_GetSuffix (),The_GetColorRows1 (1)); HTM_Txt (Item->Resource.Title); + HTM_BR (); + Ico_PutIconOn (Prg_ResourceTypesLogos[Item->Resource.Link.Type],Ico_BLACK, + Prg_ResourceTypesDB[Item->Resource.Link.Type]); + PrgRsc_WriteLinkName (&Item->Resource.Link); HTM_TD_End (); /***** End row *****/ @@ -451,10 +456,6 @@ static void PrgRsc_WriteRowEditResource (Prg_ListingType_t ListingType, long SelectedRscCod) { extern const char *Prg_ResourceTypesDB[PrgRsc_NUM_TYPES]; - struct PrgRsc_Link Link; - - Link.Type = Item->Resource.Type; - Link.Cod = Item->Resource.Cod; /***** Begin row *****/ HTM_TR_Begin (NULL); @@ -470,8 +471,10 @@ static void PrgRsc_WriteRowEditResource (Prg_ListingType_t ListingType, HTM_Unsigned (NumRsc + 1); HTM_TD_End (); - /***** Title *****/ + /***** Title and link/clipboard *****/ HTM_TD_Begin ("class=\"PRG_MAIN LT %s\"",The_GetColorRows1 (1)); + + /* Title */ Frm_BeginFormAnchor (ActRenPrgRsc,PrgRsc_RESOURCE_SECTION_ID); Prg_PutParamRscCod (&Item->Resource.Hierarchy.RscCod); HTM_INPUT_TEXT ("Title",PrgRsc_MAX_CHARS_PROGRAM_RESOURCE_TITLE,Item->Resource.Title, @@ -479,27 +482,20 @@ static void PrgRsc_WriteRowEditResource (Prg_ListingType_t ListingType, "class=\"INPUT_FULL_NAME INPUT_%s\"", The_GetSuffix ()); Frm_EndForm (); - HTM_TD_End (); - /***** Icon to edit link *****/ - HTM_TD_Begin ("class=\"PRG_MAIN RT %s\"",The_GetColorRows1 (1)); - Ico_PutContextualIconToEdit (ActSeeCliPrgRsc,PrgRsc_RESOURCE_SECTION_ID, - Prg_PutParamRscCod,&Item->Resource.Hierarchy.RscCod); - HTM_TD_End (); + HTM_BR (); - /***** Link *****/ - HTM_TD_Begin ("class=\"PRG_MAIN LT %s\"",The_GetColorRows1 (1)); - - /* Show clipboard to change resource link */ + /* Link / clipboard */ if (ListingType == Prg_SHOW_CLIPBOARD && Item->Resource.Hierarchy.RscCod == SelectedRscCod) + /* Show clipboard to change resource link */ PrgRsc_ShowClipboard (Item); else { - /***** Link *****/ - Ico_PutIconOn (Prg_ResourceTypesLogos[Link.Type],Ico_BLACK, - Prg_ResourceTypesDB[Link.Type]); - PrgRsc_WriteLinkName (&Link); + /* Link */ + Ico_PutIconOn (Prg_ResourceTypesLogos[Item->Resource.Link.Type],Ico_BLACK, + Prg_ResourceTypesDB[Item->Resource.Link.Type]); + PrgRsc_WriteLinkName (&Item->Resource.Link); } HTM_TD_End (); @@ -524,6 +520,7 @@ static void PrgRsc_WriteRowNewResource (Prg_ListingType_t ListingType, /***** Forms to remove/edit this item resource *****/ HTM_TD_Begin ("class=\"PRG_COL1 LT %s\"",The_GetColorRows1 (1)); + PrgRsc_PutFormsToRemEditOneResource (Item,NumResources,NumResources); HTM_TD_End (); /***** Resource number *****/ @@ -532,8 +529,10 @@ static void PrgRsc_WriteRowNewResource (Prg_ListingType_t ListingType, HTM_Unsigned (NumResources + 1); HTM_TD_End (); - /***** Title *****/ + /***** Title and link/clipboard *****/ HTM_TD_Begin ("class=\"PRG_MAIN LT %s\"",The_GetColorRows1 (1)); + + /* Title */ Frm_BeginFormAnchor (ActNewPrgRsc,PrgRsc_RESOURCE_SECTION_ID); Prg_PutParamItmCod (&Item->Hierarchy.ItmCod); HTM_INPUT_TEXT ("Title",PrgRsc_MAX_CHARS_PROGRAM_RESOURCE_TITLE,"", @@ -543,25 +542,17 @@ static void PrgRsc_WriteRowNewResource (Prg_ListingType_t ListingType, "Nuevo recurso", // TODO: Need translation!!!!!!!!!!!!!!!!!!! The_GetSuffix ()); Frm_EndForm (); - HTM_TD_End (); - /***** Icon to edit link *****/ - HTM_TD_Begin ("class=\"PRG_MAIN RT %s\"",The_GetColorRows1 (1)); - Ico_PutContextualIconToEdit (ActSeeCliPrgRsc,PrgRsc_RESOURCE_SECTION_ID, - Prg_PutParamItmCod,&Item->Hierarchy.ItmCod); - HTM_TD_End (); - /***** Link *****/ - HTM_TD_Begin ("class=\"PRG_MAIN LT %s\"",The_GetColorRows1 (1)); - - /* Show clipboard to change resource link */ + /* Link / clipboard */ if (ListingType == Prg_SHOW_CLIPBOARD && - SelectedRscCod <= 0) // No resource selected + Item->Resource.Hierarchy.RscCod == SelectedRscCod) + { + HTM_BR (); + + /* Show clipboard to change resource link */ PrgRsc_ShowClipboard (Item); - else - /***** Link *****/ - Ico_PutIconOn (Prg_ResourceTypesLogos[PrgRsc_NONE],Ico_BLACK, - Prg_ResourceTypesDB[PrgRsc_NONE]); + } HTM_TD_End (); @@ -583,35 +574,50 @@ static void PrgRsc_PutFormsToRemEditOneResource (struct Prg_Item *Item, [true ] = ActUnhPrgRsc, // Hidden ==> action to unhide }; extern const char *Txt_Movement_not_allowed; + extern const char *Txt_Visible; switch (Gbl.Usrs.Me.Role.Logged) { case Rol_TCH: case Rol_SYS_ADM: /***** Icon to remove item resource *****/ - Ico_PutContextualIconToRemove (ActReqRemPrgRsc,PrgRsc_RESOURCE_SECTION_ID, - Prg_PutParamRscCod,&Item->Resource.Hierarchy.RscCod); + if (NumRsc < NumResources) + Ico_PutContextualIconToRemove (ActReqRemPrgRsc,PrgRsc_RESOURCE_SECTION_ID, + Prg_PutParamRscCod,&Item->Resource.Hierarchy.RscCod); + else + Ico_PutIconRemovalNotAllowed (); /***** Icon to hide/unhide item resource *****/ - Ico_PutContextualIconToHideUnhide (ActionHideUnhide,PrgRsc_RESOURCE_SECTION_ID, - Prg_PutParamRscCod,&Item->Resource.Hierarchy.RscCod, - Item->Resource.Hierarchy.Hidden); + if (NumRsc < NumResources) + Ico_PutContextualIconToHideUnhide (ActionHideUnhide,PrgRsc_RESOURCE_SECTION_ID, + Prg_PutParamRscCod,&Item->Resource.Hierarchy.RscCod, + Item->Resource.Hierarchy.Hidden); + else + Ico_PutIconOff ("eye.svg",Ico_GREEN,Txt_Visible); - /***** Icon to move up the item *****/ - if (NumRsc > 0) + /***** Icon to move up the item resource *****/ + if (NumRsc > 0 && NumRsc < NumResources) Lay_PutContextualLinkOnlyIcon (ActUp_PrgRsc,PrgRsc_RESOURCE_SECTION_ID, Prg_PutParamRscCod,&Item->Resource.Hierarchy.RscCod, "arrow-up.svg",Ico_BLACK); else Ico_PutIconOff ("arrow-up.svg",Ico_BLACK,Txt_Movement_not_allowed); - /***** Put icon to move down the item *****/ + /***** Put icon to move down the item resource *****/ if (NumRsc < NumResources - 1) Lay_PutContextualLinkOnlyIcon (ActDwnPrgRsc,PrgRsc_RESOURCE_SECTION_ID, Prg_PutParamRscCod,&Item->Resource.Hierarchy.RscCod, "arrow-down.svg",Ico_BLACK); else Ico_PutIconOff ("arrow-down.svg",Ico_BLACK,Txt_Movement_not_allowed); + + /***** Put icon to edit the item resource *****/ + if (NumRsc < NumResources) + Ico_PutContextualIconToEdit (ActSeeCliPrgRsc,PrgRsc_RESOURCE_SECTION_ID, + Prg_PutParamRscCod,&Item->Resource.Hierarchy.RscCod); + else + Ico_PutContextualIconToEdit (ActSeeCliPrgRsc,PrgRsc_RESOURCE_SECTION_ID, + Prg_PutParamItmCod,&Item->Hierarchy.ItmCod); break; case Rol_STD: case Rol_NET: @@ -917,7 +923,12 @@ static void PrgRsc_ShowClipboard (struct Prg_Item *Item) MYSQL_RES *mysql_res; unsigned NumLink; unsigned NumLinks; - struct PrgRsc_Link Link; + struct Prg_Link Link; + static const struct Prg_Link EmptyLink = + { + .Type = PrgRsc_NONE, + .Cod = -1L, + }; /***** Begin form *****/ Frm_BeginFormAnchor (ActChgLnkPrgRsc,PrgRsc_RESOURCE_SECTION_ID); @@ -926,24 +937,21 @@ static void PrgRsc_ShowClipboard (struct Prg_Item *Item) /***** Begin list *****/ HTM_UL_Begin ("class=\"PRG_CLIPBOARD\""); - /***** Current link *****/ - Link.Type = Item->Resource.Type; - Link.Cod = Item->Resource.Cod; - PrgRsc_WriteRowClipboard (0,&Link); + /***** Current link (empty or not) *****/ + PrgRsc_WriteRowClipboard (false,&Item->Resource.Link); - /***** Get list of item resources from database *****/ + /***** Row with empty link to remove the current link *****/ + if (Item->Resource.Link.Type != PrgRsc_NONE) + PrgRsc_WriteRowClipboard (true,&EmptyLink); + + /***** Get links in clipboard from database and write them *****/ NumLinks = Prg_DB_GetClipboard (&mysql_res); - - /***** Write all item resources *****/ for (NumLink = 1; NumLink <= NumLinks; NumLink++) { - /* Get data of this link */ PrgRsc_GetDataOfLinkFromClipboard (&Link,&mysql_res); - - /* Show link */ - PrgRsc_WriteRowClipboard (NumLink,&Link); + PrgRsc_WriteRowClipboard (true,&Link); } /***** Free structure that stores the query result *****/ @@ -960,21 +968,19 @@ static void PrgRsc_ShowClipboard (struct Prg_Item *Item) /************************ Show one link from clipboard ***********************/ /*****************************************************************************/ -static void PrgRsc_WriteRowClipboard (unsigned NumLink, - const struct PrgRsc_Link *Link) +static void PrgRsc_WriteRowClipboard (bool SubmitOnClick,const struct Prg_Link *Link) { extern const char *Prg_ResourceTypesDB[PrgRsc_NUM_TYPES]; HTM_LI_Begin ("class=\"DAT_%s\"",The_GetSuffix ()); HTM_LABEL_Begin (NULL); - if (NumLink) - HTM_INPUT_RADIO ("Link",true, - "value=\"%s_%ld\"", - Prg_ResourceTypesDB[Link->Type],Link->Cod); - else - HTM_INPUT_RADIO ("Link",false, - "value=\"%s_%ld\" checked=\"checked\"", - Prg_ResourceTypesDB[Link->Type],Link->Cod); + + /***** Radio selector *****/ + HTM_INPUT_RADIO ("Link",SubmitOnClick, + "value=\"%s_%ld\"%s", + Prg_ResourceTypesDB[Link->Type],Link->Cod, + SubmitOnClick ? "" : + " checked=\"checked\""); /***** Type *****/ Ico_PutIconOn (Prg_ResourceTypesLogos[Link->Type],Ico_BLACK, @@ -991,7 +997,7 @@ static void PrgRsc_WriteRowClipboard (unsigned NumLink, /************* Write link name (filename, assignment title...) ***************/ /*****************************************************************************/ -static void PrgRsc_WriteLinkName (const struct PrgRsc_Link *Link) +static void PrgRsc_WriteLinkName (const struct Prg_Link *Link) { char FileName[NAME_MAX + 1]; @@ -1072,7 +1078,7 @@ void PrgRsc_ChangeLink (void) /********************** Get resource data from clipboard *********************/ /*****************************************************************************/ -static void PrgRsc_GetDataOfLinkFromClipboard (struct PrgRsc_Link *Link, +static void PrgRsc_GetDataOfLinkFromClipboard (struct Prg_Link *Link, MYSQL_RES **mysql_res) { MYSQL_ROW row; diff --git a/swad_program_resource.h b/swad_program_resource.h index cef8bf33..acde6740 100644 --- a/swad_program_resource.h +++ b/swad_program_resource.h @@ -23,20 +23,6 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -/*****************************************************************************/ -/********************************* Headers ***********************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/************************** Public types and constants ***********************/ -/*****************************************************************************/ - -struct PrgRsc_Link - { - PrgRsc_Type_t Type; - long Cod; - }; - /*****************************************************************************/ /***************************** Public prototypes *****************************/ /*****************************************************************************/ diff --git a/swad_text.c b/swad_text.c index d5c14114..f7c1c7c5 100644 --- a/swad_text.c +++ b/swad_text.c @@ -58403,6 +58403,29 @@ const char *Txt_View_homework = "View homework"; // Çeviri lazim! #endif +const char *Txt_Visible = +#if L==1 // ca + "Visible"; +#elif L==2 // de + "Sichtbare"; +#elif L==3 // en + "Visible"; +#elif L==4 // es + "Visible"; +#elif L==5 // fr + "Visible"; +#elif L==6 // gn + "Visible"; // Okoteve traducción +#elif L==7 // it + "Visibile"; +#elif L==8 // pl + "Widoczny"; +#elif L==9 // pt + "Visível"; +#elif L==10 // tr + "Visible"; // Çeviri lazim! +#endif + const char *Txt_Visible_by_BR_the_student = #if L==1 // ca "¿Visible por
el estudiante?"; // Necessita traducció