Version 22.18: Sep 22, 2022 Expand/contract program items.

This commit is contained in:
acanas 2022-09-22 00:21:23 +02:00
parent beb2a24fa2
commit 1b5071da3d
18 changed files with 762 additions and 192 deletions

View File

@ -1679,7 +1679,7 @@ a:hover img.CENTER_PHOTO_SHOW
.PRG_COL1 .PRG_COL1
{ {
box-sizing:border-box; box-sizing:border-box;
width:88px; width:44px;
} }
.PRG_TITLE_DESCRIPTION_WIDTH .PRG_TITLE_DESCRIPTION_WIDTH

View File

@ -4,7 +4,7 @@
SWAD (Shared Workspace At a Distance), SWAD (Shared Workspace At a Distance),
is a web platform developed at the University of Granada (Spain), is a web platform developed at the University of Granada (Spain),
and used to support university teaching. and used to support university teaching.
Copyright (C) 1999-2021 Antonio Cañas-Vargas Copyright (C) 1999-2022 Antonio Cañas-Vargas
University of Granada (SPAIN) (acanas@ugr.es) University of Granada (SPAIN) (acanas@ugr.es)
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@ -443,6 +443,10 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
[ActDwnPrgItm ] = {1832,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_MoveDownItem ,NULL}, [ActDwnPrgItm ] = {1832,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_MoveDownItem ,NULL},
[ActLftPrgItm ] = {1834,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_MoveLeftItem ,NULL}, [ActLftPrgItm ] = {1834,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_MoveLeftItem ,NULL},
[ActRgtPrgItm ] = {1833,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_MoveRightItem ,NULL}, [ActRgtPrgItm ] = {1833,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_MoveRightItem ,NULL},
[ActExpSeePrgItm ] = {1944,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_ExpandItem ,NULL},
[ActExpEdiPrgItm ] = {1946,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_ExpandItem ,NULL},
[ActConSeePrgItm ] = {1945,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_ContractItem ,NULL},
[ActConEdiPrgItm ] = {1947,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Prg_ContractItem ,NULL},
[ActFrmSeePrgRsc ] = {1925,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,PrgRsc_ViewResourcesAfterEdit ,NULL}, [ActFrmSeePrgRsc ] = {1925,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,PrgRsc_ViewResourcesAfterEdit ,NULL},
[ActFrmEdiPrgRsc ] = {1918,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,PrgRsc_EditResources ,NULL}, [ActFrmEdiPrgRsc ] = {1918,-1,TabUnk,ActSeePrg ,0x220,0x200, 0, 0, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,PrgRsc_EditResources ,NULL},
@ -3798,6 +3802,10 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
ActReqLnkForCrsUsr, // #1941 ActReqLnkForCrsUsr, // #1941
ActSeeOneAsg, // #1942 ActSeeOneAsg, // #1942
ActReqLnkAsg, // #1943 ActReqLnkAsg, // #1943
ActExpSeePrgItm, // #1944
ActConSeePrgItm, // #1945
ActExpEdiPrgItm, // #1946
ActConEdiPrgItm, // #1947
}; };
/*****************************************************************************/ /*****************************************************************************/

View File

@ -65,7 +65,7 @@ typedef enum
typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action
#define Act_MAX_ACTION_COD 1943 #define Act_MAX_ACTION_COD 1947
#define Act_MAX_OPTIONS_IN_MENU_PER_TAB 13 #define Act_MAX_OPTIONS_IN_MENU_PER_TAB 13
@ -410,119 +410,123 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to
#define ActDwnPrgItm (ActChgCrsSta + 27) #define ActDwnPrgItm (ActChgCrsSta + 27)
#define ActLftPrgItm (ActChgCrsSta + 28) #define ActLftPrgItm (ActChgCrsSta + 28)
#define ActRgtPrgItm (ActChgCrsSta + 29) #define ActRgtPrgItm (ActChgCrsSta + 29)
#define ActFrmSeePrgRsc (ActChgCrsSta + 30) #define ActExpSeePrgItm (ActChgCrsSta + 30)
#define ActFrmEdiPrgRsc (ActChgCrsSta + 31) #define ActConSeePrgItm (ActChgCrsSta + 31)
#define ActNewPrgRsc (ActChgCrsSta + 32) #define ActExpEdiPrgItm (ActChgCrsSta + 32)
#define ActRenPrgRsc (ActChgCrsSta + 33) #define ActConEdiPrgItm (ActChgCrsSta + 33)
#define ActReqRemPrgRsc (ActChgCrsSta + 34) #define ActFrmSeePrgRsc (ActChgCrsSta + 34)
#define ActRemPrgRsc (ActChgCrsSta + 35) #define ActFrmEdiPrgRsc (ActChgCrsSta + 35)
#define ActHidPrgRsc (ActChgCrsSta + 36) #define ActNewPrgRsc (ActChgCrsSta + 36)
#define ActUnhPrgRsc (ActChgCrsSta + 37) #define ActRenPrgRsc (ActChgCrsSta + 37)
#define ActUp_PrgRsc (ActChgCrsSta + 38) #define ActReqRemPrgRsc (ActChgCrsSta + 38)
#define ActDwnPrgRsc (ActChgCrsSta + 39) #define ActRemPrgRsc (ActChgCrsSta + 39)
#define ActSeeCliPrgRsc (ActChgCrsSta + 40) #define ActHidPrgRsc (ActChgCrsSta + 40)
#define ActChgLnkPrgRsc (ActChgCrsSta + 41) #define ActUnhPrgRsc (ActChgCrsSta + 41)
#define ActEdiTchGui (ActChgCrsSta + 42) #define ActUp_PrgRsc (ActChgCrsSta + 42)
#define ActSeeSylLec (ActChgCrsSta + 43) #define ActDwnPrgRsc (ActChgCrsSta + 43)
#define ActSeeSylPra (ActChgCrsSta + 44) #define ActSeeCliPrgRsc (ActChgCrsSta + 44)
#define ActEdiSylLec (ActChgCrsSta + 45) #define ActChgLnkPrgRsc (ActChgCrsSta + 45)
#define ActEdiSylPra (ActChgCrsSta + 46) #define ActEdiTchGui (ActChgCrsSta + 46)
#define ActDelItmSylLec (ActChgCrsSta + 47) #define ActSeeSylLec (ActChgCrsSta + 47)
#define ActDelItmSylPra (ActChgCrsSta + 48) #define ActSeeSylPra (ActChgCrsSta + 48)
#define ActUp_IteSylLec (ActChgCrsSta + 49) #define ActEdiSylLec (ActChgCrsSta + 49)
#define ActUp_IteSylPra (ActChgCrsSta + 50) #define ActEdiSylPra (ActChgCrsSta + 50)
#define ActDwnIteSylLec (ActChgCrsSta + 51) #define ActDelItmSylLec (ActChgCrsSta + 51)
#define ActDwnIteSylPra (ActChgCrsSta + 52) #define ActDelItmSylPra (ActChgCrsSta + 52)
#define ActRgtIteSylLec (ActChgCrsSta + 53) #define ActUp_IteSylLec (ActChgCrsSta + 53)
#define ActRgtIteSylPra (ActChgCrsSta + 54) #define ActUp_IteSylPra (ActChgCrsSta + 54)
#define ActLftIteSylLec (ActChgCrsSta + 55) #define ActDwnIteSylLec (ActChgCrsSta + 55)
#define ActLftIteSylPra (ActChgCrsSta + 56) #define ActDwnIteSylPra (ActChgCrsSta + 56)
#define ActInsIteSylLec (ActChgCrsSta + 57) #define ActRgtIteSylLec (ActChgCrsSta + 57)
#define ActInsIteSylPra (ActChgCrsSta + 58) #define ActRgtIteSylPra (ActChgCrsSta + 58)
#define ActModIteSylLec (ActChgCrsSta + 59) #define ActLftIteSylLec (ActChgCrsSta + 59)
#define ActModIteSylPra (ActChgCrsSta + 60) #define ActLftIteSylPra (ActChgCrsSta + 60)
#define ActInsIteSylLec (ActChgCrsSta + 61)
#define ActInsIteSylPra (ActChgCrsSta + 62)
#define ActModIteSylLec (ActChgCrsSta + 63)
#define ActModIteSylPra (ActChgCrsSta + 64)
#define ActEdiBib (ActChgCrsSta + 61) #define ActEdiBib (ActChgCrsSta + 65)
#define ActEdiFAQ (ActChgCrsSta + 62) #define ActEdiFAQ (ActChgCrsSta + 66)
#define ActEdiCrsLnk (ActChgCrsSta + 63) #define ActEdiCrsLnk (ActChgCrsSta + 67)
#define ActChgFrcReaCrsInf (ActChgCrsSta + 64) #define ActChgFrcReaCrsInf (ActChgCrsSta + 68)
#define ActChgFrcReaTchGui (ActChgCrsSta + 65) #define ActChgFrcReaTchGui (ActChgCrsSta + 69)
#define ActChgFrcReaSylLec (ActChgCrsSta + 66) #define ActChgFrcReaSylLec (ActChgCrsSta + 70)
#define ActChgFrcReaSylPra (ActChgCrsSta + 67) #define ActChgFrcReaSylPra (ActChgCrsSta + 71)
#define ActChgFrcReaBib (ActChgCrsSta + 68) #define ActChgFrcReaBib (ActChgCrsSta + 72)
#define ActChgFrcReaFAQ (ActChgCrsSta + 69) #define ActChgFrcReaFAQ (ActChgCrsSta + 73)
#define ActChgFrcReaCrsLnk (ActChgCrsSta + 70) #define ActChgFrcReaCrsLnk (ActChgCrsSta + 74)
#define ActChgHavReaCrsInf (ActChgCrsSta + 71) #define ActChgHavReaCrsInf (ActChgCrsSta + 75)
#define ActChgHavReaTchGui (ActChgCrsSta + 72) #define ActChgHavReaTchGui (ActChgCrsSta + 76)
#define ActChgHavReaSylLec (ActChgCrsSta + 73) #define ActChgHavReaSylLec (ActChgCrsSta + 77)
#define ActChgHavReaSylPra (ActChgCrsSta + 74) #define ActChgHavReaSylPra (ActChgCrsSta + 78)
#define ActChgHavReaBib (ActChgCrsSta + 75) #define ActChgHavReaBib (ActChgCrsSta + 79)
#define ActChgHavReaFAQ (ActChgCrsSta + 76) #define ActChgHavReaFAQ (ActChgCrsSta + 80)
#define ActChgHavReaCrsLnk (ActChgCrsSta + 77) #define ActChgHavReaCrsLnk (ActChgCrsSta + 81)
#define ActSelInfSrcCrsInf (ActChgCrsSta + 78) #define ActSelInfSrcCrsInf (ActChgCrsSta + 82)
#define ActSelInfSrcTchGui (ActChgCrsSta + 79) #define ActSelInfSrcTchGui (ActChgCrsSta + 83)
#define ActSelInfSrcSylLec (ActChgCrsSta + 80) #define ActSelInfSrcSylLec (ActChgCrsSta + 84)
#define ActSelInfSrcSylPra (ActChgCrsSta + 81) #define ActSelInfSrcSylPra (ActChgCrsSta + 85)
#define ActSelInfSrcBib (ActChgCrsSta + 82) #define ActSelInfSrcBib (ActChgCrsSta + 86)
#define ActSelInfSrcFAQ (ActChgCrsSta + 83) #define ActSelInfSrcFAQ (ActChgCrsSta + 87)
#define ActSelInfSrcCrsLnk (ActChgCrsSta + 84) #define ActSelInfSrcCrsLnk (ActChgCrsSta + 88)
#define ActRcvURLCrsInf (ActChgCrsSta + 85) #define ActRcvURLCrsInf (ActChgCrsSta + 89)
#define ActRcvURLTchGui (ActChgCrsSta + 86) #define ActRcvURLTchGui (ActChgCrsSta + 90)
#define ActRcvURLSylLec (ActChgCrsSta + 87) #define ActRcvURLSylLec (ActChgCrsSta + 91)
#define ActRcvURLSylPra (ActChgCrsSta + 88) #define ActRcvURLSylPra (ActChgCrsSta + 92)
#define ActRcvURLBib (ActChgCrsSta + 89) #define ActRcvURLBib (ActChgCrsSta + 93)
#define ActRcvURLFAQ (ActChgCrsSta + 90) #define ActRcvURLFAQ (ActChgCrsSta + 94)
#define ActRcvURLCrsLnk (ActChgCrsSta + 91) #define ActRcvURLCrsLnk (ActChgCrsSta + 95)
#define ActRcvPagCrsInf (ActChgCrsSta + 92) #define ActRcvPagCrsInf (ActChgCrsSta + 96)
#define ActRcvPagTchGui (ActChgCrsSta + 93) #define ActRcvPagTchGui (ActChgCrsSta + 97)
#define ActRcvPagSylLec (ActChgCrsSta + 94) #define ActRcvPagSylLec (ActChgCrsSta + 98)
#define ActRcvPagSylPra (ActChgCrsSta + 95) #define ActRcvPagSylPra (ActChgCrsSta + 99)
#define ActRcvPagBib (ActChgCrsSta + 96) #define ActRcvPagBib (ActChgCrsSta + 100)
#define ActRcvPagFAQ (ActChgCrsSta + 97) #define ActRcvPagFAQ (ActChgCrsSta + 101)
#define ActRcvPagCrsLnk (ActChgCrsSta + 98) #define ActRcvPagCrsLnk (ActChgCrsSta + 102)
#define ActEditorCrsInf (ActChgCrsSta + 99) #define ActEditorCrsInf (ActChgCrsSta + 103)
#define ActEditorTchGui (ActChgCrsSta + 100) #define ActEditorTchGui (ActChgCrsSta + 104)
#define ActEditorSylLec (ActChgCrsSta + 101) #define ActEditorSylLec (ActChgCrsSta + 105)
#define ActEditorSylPra (ActChgCrsSta + 102) #define ActEditorSylPra (ActChgCrsSta + 106)
#define ActEditorBib (ActChgCrsSta + 103) #define ActEditorBib (ActChgCrsSta + 107)
#define ActEditorFAQ (ActChgCrsSta + 104) #define ActEditorFAQ (ActChgCrsSta + 108)
#define ActEditorCrsLnk (ActChgCrsSta + 105) #define ActEditorCrsLnk (ActChgCrsSta + 109)
#define ActPlaTxtEdiCrsInf (ActChgCrsSta + 106) #define ActPlaTxtEdiCrsInf (ActChgCrsSta + 110)
#define ActPlaTxtEdiTchGui (ActChgCrsSta + 107) #define ActPlaTxtEdiTchGui (ActChgCrsSta + 111)
#define ActPlaTxtEdiSylLec (ActChgCrsSta + 108) #define ActPlaTxtEdiSylLec (ActChgCrsSta + 112)
#define ActPlaTxtEdiSylPra (ActChgCrsSta + 109) #define ActPlaTxtEdiSylPra (ActChgCrsSta + 113)
#define ActPlaTxtEdiBib (ActChgCrsSta + 110) #define ActPlaTxtEdiBib (ActChgCrsSta + 114)
#define ActPlaTxtEdiFAQ (ActChgCrsSta + 111) #define ActPlaTxtEdiFAQ (ActChgCrsSta + 115)
#define ActPlaTxtEdiCrsLnk (ActChgCrsSta + 112) #define ActPlaTxtEdiCrsLnk (ActChgCrsSta + 116)
#define ActRchTxtEdiCrsInf (ActChgCrsSta + 113) #define ActRchTxtEdiCrsInf (ActChgCrsSta + 117)
#define ActRchTxtEdiTchGui (ActChgCrsSta + 114) #define ActRchTxtEdiTchGui (ActChgCrsSta + 118)
#define ActRchTxtEdiSylLec (ActChgCrsSta + 115) #define ActRchTxtEdiSylLec (ActChgCrsSta + 119)
#define ActRchTxtEdiSylPra (ActChgCrsSta + 116) #define ActRchTxtEdiSylPra (ActChgCrsSta + 120)
#define ActRchTxtEdiBib (ActChgCrsSta + 117) #define ActRchTxtEdiBib (ActChgCrsSta + 121)
#define ActRchTxtEdiFAQ (ActChgCrsSta + 118) #define ActRchTxtEdiFAQ (ActChgCrsSta + 122)
#define ActRchTxtEdiCrsLnk (ActChgCrsSta + 119) #define ActRchTxtEdiCrsLnk (ActChgCrsSta + 123)
#define ActRcvPlaTxtCrsInf (ActChgCrsSta + 120) #define ActRcvPlaTxtCrsInf (ActChgCrsSta + 124)
#define ActRcvPlaTxtTchGui (ActChgCrsSta + 121) #define ActRcvPlaTxtTchGui (ActChgCrsSta + 125)
#define ActRcvPlaTxtSylLec (ActChgCrsSta + 122) #define ActRcvPlaTxtSylLec (ActChgCrsSta + 126)
#define ActRcvPlaTxtSylPra (ActChgCrsSta + 123) #define ActRcvPlaTxtSylPra (ActChgCrsSta + 127)
#define ActRcvPlaTxtBib (ActChgCrsSta + 124) #define ActRcvPlaTxtBib (ActChgCrsSta + 128)
#define ActRcvPlaTxtFAQ (ActChgCrsSta + 125) #define ActRcvPlaTxtFAQ (ActChgCrsSta + 129)
#define ActRcvPlaTxtCrsLnk (ActChgCrsSta + 126) #define ActRcvPlaTxtCrsLnk (ActChgCrsSta + 130)
#define ActRcvRchTxtCrsInf (ActChgCrsSta + 127) #define ActRcvRchTxtCrsInf (ActChgCrsSta + 131)
#define ActRcvRchTxtTchGui (ActChgCrsSta + 128) #define ActRcvRchTxtTchGui (ActChgCrsSta + 132)
#define ActRcvRchTxtSylLec (ActChgCrsSta + 129) #define ActRcvRchTxtSylLec (ActChgCrsSta + 133)
#define ActRcvRchTxtSylPra (ActChgCrsSta + 130) #define ActRcvRchTxtSylPra (ActChgCrsSta + 134)
#define ActRcvRchTxtBib (ActChgCrsSta + 131) #define ActRcvRchTxtBib (ActChgCrsSta + 135)
#define ActRcvRchTxtFAQ (ActChgCrsSta + 132) #define ActRcvRchTxtFAQ (ActChgCrsSta + 136)
#define ActRcvRchTxtCrsLnk (ActChgCrsSta + 133) #define ActRcvRchTxtCrsLnk (ActChgCrsSta + 137)
#define ActPrnCrsTT (ActChgCrsSta + 134) #define ActPrnCrsTT (ActChgCrsSta + 138)
#define ActEdiCrsTT (ActChgCrsSta + 135) #define ActEdiCrsTT (ActChgCrsSta + 139)
#define ActChgCrsTT (ActChgCrsSta + 136) #define ActChgCrsTT (ActChgCrsSta + 140)
#define ActChgCrsTT1stDay (ActChgCrsSta + 137) #define ActChgCrsTT1stDay (ActChgCrsSta + 141)
/*****************************************************************************/ /*****************************************************************************/
/***************************** Assessment tab ********************************/ /***************************** Assessment tab ********************************/

130
swad_assignment_resource.c Normal file
View File

@ -0,0 +1,130 @@
// swad_assignment_resource.c: links to assignments as program resources
/*
SWAD (Shared Workspace At a Distance),
is a web platform developed at the University of Granada (Spain),
and used to support university teaching.
This file is part of SWAD core.
Copyright (C) 1999-2022 Antonio Cañas Vargas
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/********************************* Headers ***********************************/
/*****************************************************************************/
#include "swad_alert.h"
#include "swad_assignment.h"
#include "swad_assignment_database.h"
#include "swad_error.h"
#include "swad_form.h"
#include "swad_pagination.h"
#include "swad_program_database.h"
/*****************************************************************************/
/************************** Get link to assignment ***************************/
/*****************************************************************************/
void AsgRsc_GetLinkToAssignment (void)
{
extern const char *Txt_Link_to_resource_X_copied_into_clipboard;
struct Asg_Assignments Assignments;
char Title[Asg_MAX_BYTES_ASSIGNMENT_TITLE + 1];
/***** Reset assignments *****/
Asg_ResetAssignments (&Assignments);
/***** Get parameters *****/
Assignments.SelectedOrder = Asg_GetParamAsgOrder ();
Grp_GetParamWhichGroups ();
Assignments.CurrentPage = Pag_GetParamPagNum (Pag_ASSIGNMENTS);
/***** Get assignment code *****/
if ((Assignments.AsgCod = Asg_GetParamAsgCod ()) <= 0)
Err_WrongAssignmentExit ();
/***** Get assignment title *****/
Asg_DB_GetAssignmentTitleByCod (Assignments.AsgCod,Title);
/***** Copy link to assignment into resource clipboard *****/
Prg_DB_CopyToClipboard (PrgRsc_ASSIGNMENT,Assignments.AsgCod);
/***** Write sucess message *****/
Ale_ShowAlert (Ale_SUCCESS,Txt_Link_to_resource_X_copied_into_clipboard,
Title);
/***** Show selected assignment in a box *****/
Asg_ShowOneAssignmentInBox (&Assignments);
/***** Show current assignments, if any *****/
Asg_ShowAllAssignments (&Assignments);
}
/*****************************************************************************/
/********************* Write assignment in course program ********************/
/*****************************************************************************/
void AsgRsc_WriteAssignmentInCrsProgram (long AsgCod,bool PutFormToGo,
const char *Icon,const char *IconTitle)
{
extern const char *Txt_Actions[Act_NUM_ACTIONS];
char Title[Asg_MAX_BYTES_ASSIGNMENT_TITLE + 1];
/***** Get assignment title *****/
Asg_DB_GetAssignmentTitleByCod (AsgCod,Title);
/***** Begin form to go to assignment *****/
if (PutFormToGo)
{
Frm_BeginForm (ActSeeOneAsg);
Asg_PutParamAsgCod (AsgCod);
// TODO: In the listing of assignments, the page is always the first.
// The page should be that corresponding to the selected assignment.
HTM_BUTTON_Submit_Begin (Txt_Actions[ActSeeOneAsg],
"class=\"LM BT_LINK PRG_RSC_%s\"",
The_GetSuffix ());
}
/***** Icon depending on type ******/
if (PutFormToGo)
Ico_PutIconLink (Icon,Ico_BLACK,ActSeeOneAsg);
else
Ico_PutIconOn (Icon,Ico_BLACK,IconTitle);
/***** Write assignment title of exam *****/
HTM_Txt (Title);
/***** End form to download file *****/
if (PutFormToGo)
{
/* End form */
HTM_BUTTON_End ();
Frm_EndForm ();
}
}
/*****************************************************************************/
/**************** Get assignment title from assignment code ******************/
/*****************************************************************************/
void AsgRsc_GetTitleFromAsgCod (long AsgCod,char *Title,size_t TitleSize)
{
char TitleFromDB[Asg_MAX_BYTES_ASSIGNMENT_TITLE + 1];
/***** Get assignment title *****/
Asg_DB_GetAssignmentTitleByCod (AsgCod,TitleFromDB);
Str_Copy (Title,TitleFromDB,TitleSize);
}

View File

@ -0,0 +1,42 @@
// swad_assignment_resource.h: links to assignments as program resources
#ifndef _SWAD_ASG_RSC
#define _SWAD_ASG_RSC
/*
SWAD (Shared Workspace At a Distance),
is a web platform developed at the University of Granada (Spain),
and used to support university teaching.
This file is part of SWAD core.
Copyright (C) 1999-2022 Antonio Cañas Vargas
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/********************************* Headers ***********************************/
/*****************************************************************************/
#include <stdbool.h> // For boolean type
#include <stddef.h> // For size_t
/*****************************************************************************/
/***************************** Public prototypes *****************************/
/*****************************************************************************/
void Asg_GetLinkToAssignment (void);
void Asg_WriteAssignmentInCrsProgram (long AsgCod,bool PutFormToGo,
const char *Icon,const char *IconTitle);
void Asg_GetTitleFromAsgCod (long AsgCod,char *Title,size_t TitleSize);
#endif

View File

@ -4901,9 +4901,11 @@ static void Brw_PutIconToExpandFolder (const char *FileBrowserId,const char *Row
/***** Begin container *****/ /***** Begin container *****/
if (Hidden) if (Hidden)
HTM_DIV_Begin ("id=\"expand_%s_%s\" style=\"display:none;\"",FileBrowserId,RowId); HTM_DIV_Begin ("id=\"expand_%s_%s\" style=\"display:none;\"",
FileBrowserId,RowId);
else else
HTM_DIV_Begin ("id=\"expand_%s_%s\"",FileBrowserId,RowId); HTM_DIV_Begin ("id=\"expand_%s_%s\"",
FileBrowserId,RowId);
/***** Form and icon *****/ /***** Form and icon *****/
snprintf (JavaScriptFuncToExpandFolder,sizeof (JavaScriptFuncToExpandFolder), snprintf (JavaScriptFuncToExpandFolder,sizeof (JavaScriptFuncToExpandFolder),
@ -4913,7 +4915,8 @@ static void Brw_PutIconToExpandFolder (const char *FileBrowserId,const char *Row
FileBrowserId, FileBrowserId,
JavaScriptFuncToExpandFolder); // JavaScript function to unhide rows JavaScriptFuncToExpandFolder); // JavaScript function to unhide rows
Brw_PutImplicitParamsFileBrowser (&Gbl.FileBrowser.FilFolLnk); Brw_PutImplicitParamsFileBrowser (&Gbl.FileBrowser.FilFolLnk);
Ico_PutIconLink ("caret-right.svg",Ico_BLACK,Brw_ActExpandFolder[Gbl.FileBrowser.Type]); Ico_PutIconLink ("caret-right.svg",Ico_BLACK,
Brw_ActExpandFolder[Gbl.FileBrowser.Type]);
Frm_EndForm (); Frm_EndForm ();
/***** End container *****/ /***** End container *****/
@ -4931,8 +4934,7 @@ static void Brw_PutIconToContractFolder (const char *FileBrowserId,const char *R
/***** Begin container *****/ /***** Begin container *****/
if (Hidden) if (Hidden)
HTM_DIV_Begin ("id=\"contract_%s_%s\"" HTM_DIV_Begin ("id=\"contract_%s_%s\" style=\"display:none;\"",
" style=\"display:none;\"",
FileBrowserId,RowId); FileBrowserId,RowId);
else else
HTM_DIV_Begin ("id=\"contract_%s_%s\"", HTM_DIV_Begin ("id=\"contract_%s_%s\"",
@ -4946,7 +4948,8 @@ static void Brw_PutIconToContractFolder (const char *FileBrowserId,const char *R
FileBrowserId, FileBrowserId,
JavaScriptFuncToContractFolder); // JavaScript function to hide rows JavaScriptFuncToContractFolder); // JavaScript function to hide rows
Brw_PutImplicitParamsFileBrowser (&Gbl.FileBrowser.FilFolLnk); Brw_PutImplicitParamsFileBrowser (&Gbl.FileBrowser.FilFolLnk);
Ico_PutIconLink ("caret-down.svg",Ico_BLACK,Brw_ActContractFolder[Gbl.FileBrowser.Type]); Ico_PutIconLink ("caret-down.svg",Ico_BLACK,
Brw_ActContractFolder[Gbl.FileBrowser.Type]);
Frm_EndForm (); Frm_EndForm ();
/***** End container *****/ /***** End container *****/

View File

@ -2429,7 +2429,7 @@ bool Brw_DB_GetIfExpandedFolder (const char Path[PATH_MAX + 1])
{ {
if (WorksUsrCod > 0) if (WorksUsrCod > 0)
return return
DB_QueryEXISTS ("can not check check if a folder is expanded", DB_QueryEXISTS ("can not check if a folder is expanded",
"SELECT EXISTS" "SELECT EXISTS"
"(SELECT *" "(SELECT *"
" FROM brw_expanded" " FROM brw_expanded"
@ -2445,7 +2445,7 @@ bool Brw_DB_GetIfExpandedFolder (const char Path[PATH_MAX + 1])
Path); Path);
else else
return return
DB_QueryEXISTS ("can not get check if a folder is expanded", DB_QueryEXISTS ("can not check if a folder is expanded",
"SELECT EXISTS" "SELECT EXISTS"
"(SELECT *" "(SELECT *"
" FROM brw_expanded" " FROM brw_expanded"
@ -2460,7 +2460,7 @@ bool Brw_DB_GetIfExpandedFolder (const char Path[PATH_MAX + 1])
} }
else // Briefcase else // Briefcase
return return
DB_QueryEXISTS ("can not get check if a folder is expanded", DB_QueryEXISTS ("can not check if a folder is expanded",
"SELECT EXISTS" "SELECT EXISTS"
"(SELECT *" "(SELECT *"
" FROM brw_expanded" " FROM brw_expanded"

View File

@ -606,10 +606,16 @@ TODO: Fix bug: error al enviar un mensaje a dos recipientes, error on duplicate
TODO: Attach pdf files in multimedia. TODO: Attach pdf files in multimedia.
*/ */
#define Log_PLATFORM_VERSION "SWAD 22.17 (2022-09-21)" #define Log_PLATFORM_VERSION "SWAD 22.18 (2022-09-21)"
#define CSS_FILE "swad22.16.css" #define CSS_FILE "swad22.18.css"
#define JS_FILE "swad21.100.js" #define JS_FILE "swad21.100.js"
/* /*
Version 22.18: Sep 22, 2022 Expand/contract program items. (331877 lines)
1 change necessary in database:
CREATE TABLE IF NOT EXISTS prg_expanded (UsrCod INT NOT NULL,ItmCod INT NOT NULL,ClickTime DATETIME NOT NULL,UNIQUE INDEX(UsrCod,ItmCod),INDEX(ItmCod),INDEX(ClickTime));
If you want to use MyISAM:
ALTER TABLE prg_expanded ENGINE=MyISAM;
Version 22.17: Sep 21, 2022 New module swad_assignment_resource. (331524 lines) Version 22.17: Sep 21, 2022 New module swad_assignment_resource. (331524 lines)
Version 22.16.1: Sep 21, 2022 Changes in program layout. (331462 lines) Version 22.16.1: Sep 21, 2022 Changes in program layout. (331462 lines)
Version 22.16: Sep 21, 2022 Changes in program layout. (331455 lines) Version 22.16: Sep 21, 2022 Changes in program layout. (331455 lines)

View File

@ -2484,6 +2484,27 @@ mysql> DESCRIBE prg_clipboards;
"INDEX(CrsCod,Type,Cod)," "INDEX(CrsCod,Type,Cod),"
"INDEX(CopyTime))"); "INDEX(CopyTime))");
/***** Table prg_expanded *****/
/*
mysql> DESCRIBE prg_expanded;
+-----------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------+------+-----+---------+-------+
| UsrCod | int | NO | PRI | NULL | |
| ItmCod | int | NO | PRI | NULL | |
| ClickTime | datetime | NO | MUL | NULL | |
+-----------+----------+------+-----+---------+-------+
3 rows in set (0,00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS prg_expanded ("
"UsrCod INT NOT NULL,"
"ItmCod INT NOT NULL,"
"ClickTime DATETIME NOT NULL,"
"UNIQUE INDEX(UsrCod,ItmCod),"
"INDEX(ItmCod),"
"INDEX(ClickTime))");
/***** Table prg_items *****/ /***** Table prg_items *****/
/* /*
mysql> DESCRIBE prg_items; mysql> DESCRIBE prg_items;

View File

@ -299,6 +299,22 @@ void Ico_PutContextualIconToHideUnhide (const Act_Action_t NextAction[2],const c
Icon[Hidden],Color[Hidden]); Icon[Hidden],Color[Hidden]);
} }
void Ico_PutContextualIconToExpand (const Act_Action_t NextAction,const char *Anchor,
void (*FuncParams) (void *Args),void *Args)
{
Lay_PutContextualLinkOnlyIcon (NextAction,Anchor,
FuncParams,Args,
"caret-right.svg",Ico_BLACK);
}
void Ico_PutContextualIconToContract (const Act_Action_t NextAction,const char *Anchor,
void (*FuncParams) (void *Args),void *Args)
{
Lay_PutContextualLinkOnlyIcon (NextAction,Anchor,
FuncParams,Args,
"caret-down.svg",Ico_BLACK);
}
void Ico_PutContextualIconToPrint (Act_Action_t NextAction, void Ico_PutContextualIconToPrint (Act_Action_t NextAction,
void (*FuncParams) (void *Args),void *Args) void (*FuncParams) (void *Args),void *Args)
{ {

View File

@ -79,6 +79,10 @@ void Ico_PutContextualIconToConfigure (Act_Action_t NextAction,
void Ico_PutContextualIconToHideUnhide (const Act_Action_t NextAction[2],const char *Anchor, void Ico_PutContextualIconToHideUnhide (const Act_Action_t NextAction[2],const char *Anchor,
void (*FuncParams) (void *Args),void *Args, void (*FuncParams) (void *Args),void *Args,
bool Hidden); bool Hidden);
void Ico_PutContextualIconToExpand (const Act_Action_t NextAction,const char *Anchor,
void (*FuncParams) (void *Args),void *Args);
void Ico_PutContextualIconToContract (const Act_Action_t NextAction,const char *Anchor,
void (*FuncParams) (void *Args),void *Args);
void Ico_PutContextualIconToPrint (Act_Action_t NextAction, void Ico_PutContextualIconToPrint (Act_Action_t NextAction,
void (*FuncParams) (void *Args),void *Args); void (*FuncParams) (void *Args),void *Args);
void Ico_PutContextualIconToGetLink (Act_Action_t NextAction,const char *Anchor, void Ico_PutContextualIconToGetLink (Act_Action_t NextAction,const char *Anchor,

View File

@ -71,6 +71,7 @@ typedef enum
struct Level struct Level
{ {
unsigned Number; // Numbers for each level from 1 to maximum level unsigned Number; // Numbers for each level from 1 to maximum level
bool Expanded; // If each level from 1 to maximum level is expanded
bool Hidden; // If each level from 1 to maximum level is hidden bool Hidden; // If each level from 1 to maximum level is hidden
}; };
@ -102,6 +103,7 @@ static struct
}; };
static const char *Prg_ITEM_SECTION_ID = "item_section"; static const char *Prg_ITEM_SECTION_ID = "item_section";
static const char *Prg_HIGHLIGHTED_SECTION_ID = "prg_highlighted";
/*****************************************************************************/ /*****************************************************************************/
/***************************** Private prototypes ****************************/ /***************************** Private prototypes ****************************/
@ -116,7 +118,12 @@ static void Prg_PutButtonToCreateNewItem (void);
static void Prg_WriteRowItem (Prg_ListingType_t ListingType, static void Prg_WriteRowItem (Prg_ListingType_t ListingType,
unsigned NumItem,struct Prg_Item *Item, unsigned NumItem,struct Prg_Item *Item,
bool HasChildren,
bool Expanded,
long SelectedItmCod,
long SelectedRscCod); long SelectedRscCod);
static void Prg_PutIconToContractExpandItem (struct Prg_Item *Item,
bool Expanded,bool Editing);
static void Prg_WriteItemText (long ItmCod,bool LightStyle); static void Prg_WriteItemText (long ItmCod,bool LightStyle);
static void Prg_WriteRowToCreateItem (long ParentItmCod,unsigned FormLevel); static void Prg_WriteRowToCreateItem (long ParentItmCod,unsigned FormLevel);
static void Prg_SetTitleClass (char **TitleClass,unsigned Level,bool LightStyle); static void Prg_SetTitleClass (char **TitleClass,unsigned Level,bool LightStyle);
@ -132,8 +139,12 @@ static unsigned Prg_GetCurrentNumberInLevel (unsigned Level);
static void Prg_WriteNumItem (unsigned Level); static void Prg_WriteNumItem (unsigned Level);
static void Prg_WriteNumNewItem (unsigned Level); static void Prg_WriteNumNewItem (unsigned Level);
static void Prg_SetExpandedLevel (unsigned Level,bool Expanded);
static void Prg_SetHiddenLevel (unsigned Level,bool Hidden); static void Prg_SetHiddenLevel (unsigned Level,bool Hidden);
static bool Prg_GetExpandedLevel (unsigned Level);
static bool Prg_GetHiddenLevel (unsigned Level); static bool Prg_GetHiddenLevel (unsigned Level);
static bool Prg_CheckIfAllHigherLevelsAreExpanded (unsigned CurrentLevel);
static bool Prg_CheckIfAnyHigherLevelIsHidden (unsigned CurrentLevel); static bool Prg_CheckIfAnyHigherLevelIsHidden (unsigned CurrentLevel);
static void Prg_PutFormsToRemEditOneItem (Prg_ListingType_t ListingType, static void Prg_PutFormsToRemEditOneItem (Prg_ListingType_t ListingType,
@ -158,6 +169,8 @@ static int Prg_GetNextBrother (int NumItem);
static void Prg_MoveLeftRightItem (Prg_MoveLeftRight_t LeftRight); static void Prg_MoveLeftRightItem (Prg_MoveLeftRight_t LeftRight);
static void Prg_ExpandContractItem (Prg_ExpandContract_t ExpandContract);
static void Prg_SetItemRangeOnlyItem (unsigned NumItem,struct Prg_ItemRange *ItemRange); static void Prg_SetItemRangeOnlyItem (unsigned NumItem,struct Prg_ItemRange *ItemRange);
static void Prg_SetItemRangeWithAllChildren (unsigned NumItem,struct Prg_ItemRange *ItemRange); static void Prg_SetItemRangeWithAllChildren (unsigned NumItem,struct Prg_ItemRange *ItemRange);
static unsigned Prg_GetLastChild (int NumItem); static unsigned Prg_GetLastChild (int NumItem);
@ -211,9 +224,10 @@ void Prg_ShowAllItems (Prg_ListingType_t ListingType,
long ParentItmCod = -1L; // Initialized to avoid warning long ParentItmCod = -1L; // Initialized to avoid warning
unsigned NumItem; unsigned NumItem;
unsigned FormLevel = 0; // Initialized to avoid warning unsigned FormLevel = 0; // Initialized to avoid warning
Prg_ListingType_t LT;
struct Prg_Item Item; struct Prg_Item Item;
struct Prg_ItemRange ToHighlight; struct Prg_ItemRange ToHighlight;
bool HasChildren;
bool Expanded;
char *Title; char *Title;
static bool FirstTBodyOpen = false; static bool FirstTBodyOpen = false;
static void (*FunctionToDrawContextualIcons[Prg_NUM_LISTING_TYPES]) (void *Args) = static void (*FunctionToDrawContextualIcons[Prg_NUM_LISTING_TYPES]) (void *Args) =
@ -241,6 +255,7 @@ void Prg_ShowAllItems (Prg_ListingType_t ListingType,
ToHighlight.End = 0; ToHighlight.End = 0;
switch (ListingType) switch (ListingType)
{ {
case Prg_VIEW:
case Prg_EDIT_ITEMS: case Prg_EDIT_ITEMS:
if (SelectedItmCod > 0) if (SelectedItmCod > 0)
Prg_SetItemRangeWithAllChildren (Prg_GetNumItemFromItmCod (SelectedItmCod), Prg_SetItemRangeWithAllChildren (Prg_GetNumItemFromItmCod (SelectedItmCod),
@ -258,7 +273,7 @@ void Prg_ShowAllItems (Prg_ListingType_t ListingType,
case Prg_FORM_NEW_CHILD_ITEM: case Prg_FORM_NEW_CHILD_ITEM:
ParentItmCod = SelectedItmCod; // Item code here is parent of the item to create ParentItmCod = SelectedItmCod; // Item code here is parent of the item to create
NumItem = Prg_GetNumItemFromItmCod (SelectedItmCod); NumItem = Prg_GetNumItemFromItmCod (SelectedItmCod);
SelectedItmCod = Prg_Gbl.List.Items[Prg_GetLastChild (NumItem)].ItmCod; SelectedItmCod = Prg_GetItmCodFromNumItem (Prg_GetLastChild (NumItem));
FormLevel = Prg_GetLevelFromNumItem (NumItem) + 1; FormLevel = Prg_GetLevelFromNumItem (NumItem) + 1;
break; break;
default: default:
@ -286,11 +301,19 @@ void Prg_ShowAllItems (Prg_ListingType_t ListingType,
/***** Write all program items *****/ /***** Write all program items *****/
for (NumItem = 0, The_ResetRowColor (); for (NumItem = 0, The_ResetRowColor ();
NumItem < Prg_Gbl.List.NumItems; NumItem < Prg_Gbl.List.NumItems;
NumItem++, The_ChangeRowColor ()) NumItem++)
{ {
/* Get data of this program item */ /* Get data of this program item */
Item.Hierarchy.ItmCod = Prg_Gbl.List.Items[NumItem].ItmCod; Item.Hierarchy.ItmCod = Prg_GetItmCodFromNumItem (NumItem);
Prg_GetDataOfItemByCod (&Item); Prg_GetDataOfItemByCod (&Item);
if (NumItem == Prg_Gbl.List.NumItems - 1)
// The last item
HasChildren = false; // Last item has no children
else
// Not the last item
// This item has children if its level is lower than the level of the following item
HasChildren = (Prg_GetLevelFromNumItem (NumItem) <
Prg_GetLevelFromNumItem (NumItem + 1));
/* Begin range to highlight? */ /* Begin range to highlight? */
if (Item.Hierarchy.ItmInd == ToHighlight.Begin) // Begin of the highlighted range if (Item.Hierarchy.ItmInd == ToHighlight.Begin) // Begin of the highlighted range
@ -300,32 +323,29 @@ void Prg_ShowAllItems (Prg_ListingType_t ListingType,
HTM_TBODY_End (); // 1st tbody end HTM_TBODY_End (); // 1st tbody end
FirstTBodyOpen = false; FirstTBodyOpen = false;
} }
HTM_TBODY_Begin ("id=\"prg_highlighted\""); // Highlighted tbody start HTM_TBODY_Begin ("id=\"%s\"",
Prg_HIGHLIGHTED_SECTION_ID); // Highlighted tbody start
} }
/* Write row with this item */ /* Set if this level is expanded */
LT = ListingType; Expanded = Prg_DB_GetIfExpandedItem (Item.Hierarchy.ItmCod);
switch (ListingType) Prg_SetExpandedLevel (Item.Hierarchy.Level,Expanded);
{
case Prg_FORM_EDIT_ITEM:
case Prg_EDIT_RESOURCES:
case Prg_EDIT_RESOURCE_LINK:
case Prg_CHANGE_RESOURCE_LINK:
case Prg_END_EDIT_RES:
if (Item.Hierarchy.ItmCod != SelectedItmCod)
LT = Prg_EDIT_ITEMS;
break;
default:
break;
}
Prg_WriteRowItem (LT,NumItem,&Item,SelectedRscCod);
/* Show form to create child item? */ /* Show this row only if all higher levels are expanded */
if (ListingType == Prg_FORM_NEW_CHILD_ITEM && if (Prg_CheckIfAllHigherLevelsAreExpanded (Item.Hierarchy.Level))
Item.Hierarchy.ItmCod == SelectedItmCod)
{ {
The_ChangeRowColor (); /* Write row with this item */
Prg_WriteRowToCreateItem (ParentItmCod,FormLevel); Prg_WriteRowItem (ListingType,NumItem,&Item,HasChildren,Expanded,
SelectedItmCod,SelectedRscCod);
The_ChangeRowColor ();
/* Show form to create child item? */
if (ListingType == Prg_FORM_NEW_CHILD_ITEM &&
Item.Hierarchy.ItmCod == SelectedItmCod)
{
Prg_WriteRowToCreateItem (ParentItmCod,FormLevel);
The_ChangeRowColor ();
}
} }
/* End range to highlight? */ /* End range to highlight? */
@ -346,8 +366,16 @@ void Prg_ShowAllItems (Prg_ListingType_t ListingType,
HTM_TABLE_End (); HTM_TABLE_End ();
/***** Button to create a new program item *****/ /***** Button to create a new program item *****/
if (Prg_CheckIfICanEditProgram ()) switch (ListingType)
Prg_PutButtonToCreateNewItem (); {
case Prg_PRINT:
case Prg_VIEW:
break;
default:
if (Prg_CheckIfICanEditProgram ())
Prg_PutButtonToCreateNewItem ();
break;
}
/***** End box *****/ /***** End box *****/
Box_BoxEnd (); Box_BoxEnd ();
@ -450,10 +478,13 @@ static void Prg_PutButtonToCreateNewItem (void)
static void Prg_WriteRowItem (Prg_ListingType_t ListingType, static void Prg_WriteRowItem (Prg_ListingType_t ListingType,
unsigned NumItem,struct Prg_Item *Item, unsigned NumItem,struct Prg_Item *Item,
bool HasChildren,
bool Expanded,
long SelectedItmCod,
long SelectedRscCod) long SelectedRscCod)
{ {
static unsigned UniqueId = 0; static unsigned UniqueId = 0;
static bool PutFormsToRemEditOneItem[Prg_NUM_LISTING_TYPES] = static bool Editing[Prg_NUM_LISTING_TYPES] =
{ {
[Prg_PRINT ] = false, [Prg_PRINT ] = false,
[Prg_VIEW ] = false, [Prg_VIEW ] = false,
@ -474,6 +505,7 @@ static void Prg_WriteRowItem (Prg_ListingType_t ListingType,
unsigned NumCol; unsigned NumCol;
char *TitleClass; char *TitleClass;
Dat_StartEndTime_t StartEndTime; Dat_StartEndTime_t StartEndTime;
bool HighlightItem;
/***** Check if this item should be shown as hidden *****/ /***** Check if this item should be shown as hidden *****/
Prg_SetHiddenLevel (Item->Hierarchy.Level,Item->Hierarchy.Hidden); Prg_SetHiddenLevel (Item->Hierarchy.Level,Item->Hierarchy.Hidden);
@ -488,18 +520,14 @@ static void Prg_WriteRowItem (Prg_ListingType_t ListingType,
/***** Increase number in level *****/ /***** Increase number in level *****/
Prg_IncreaseNumberInLevel (Item->Hierarchy.Level); Prg_IncreaseNumberInLevel (Item->Hierarchy.Level);
/***** Is this the item selected? *****/
HighlightItem = Item->Hierarchy.ItmCod == SelectedItmCod &&
(ListingType == Prg_FORM_EDIT_ITEM ||
ListingType == Prg_END_EDIT_ITEM);
/***** Begin row *****/ /***** Begin row *****/
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
/***** Forms to remove/edit this program item *****/
if (PutFormsToRemEditOneItem[ListingType])
{
HTM_TD_Begin ("rowspan=\"2\" class=\"PRG_COL1 LT %s\"",
The_GetColorRows ());
Prg_PutFormsToRemEditOneItem (ListingType,NumItem,Item);
HTM_TD_End ();
}
/***** Indent depending on the level *****/ /***** Indent depending on the level *****/
for (NumCol = 1; for (NumCol = 1;
NumCol < Item->Hierarchy.Level; NumCol < Item->Hierarchy.Level;
@ -509,6 +537,22 @@ static void Prg_WriteRowItem (Prg_ListingType_t ListingType,
HTM_TD_End (); HTM_TD_End ();
} }
/***** Expand/contract this program item *****/
HTM_TD_Begin ("rowspan=\"2\" class=\"LT %s\"",The_GetColorRows ());
/* Only if this item has children ==> show icon to contract/expand */
if (HasChildren)
Prg_PutIconToContractExpandItem (Item,Expanded,Editing[ListingType]);
HTM_TD_End ();
/***** Forms to remove/edit this program item *****/
if (Editing[ListingType])
{
HTM_TD_Begin ("rowspan=\"2\" class=\"PRG_COL1 LT %s\"",
The_GetColorRows ());
Prg_PutFormsToRemEditOneItem (ListingType,NumItem,Item);
HTM_TD_End ();
}
/***** Item number *****/ /***** Item number *****/
HTM_TD_Begin ("rowspan=\"2\" class=\"PRG_NUM %s RT %s\"", HTM_TD_Begin ("rowspan=\"2\" class=\"PRG_NUM %s RT %s\"",
TitleClass,The_GetColorRows ()); TitleClass,The_GetColorRows ());
@ -528,12 +572,10 @@ static void Prg_WriteRowItem (Prg_ListingType_t ListingType,
default: default:
HTM_TD_Begin ("colspan=\"%u\" class=\"PRG_MAIN %s %s\"", HTM_TD_Begin ("colspan=\"%u\" class=\"PRG_MAIN %s %s\"",
ColSpan,TitleClass,The_GetColorRows ()); ColSpan,TitleClass,The_GetColorRows ());
if (ListingType == Prg_FORM_EDIT_ITEM || if (HighlightItem)
ListingType == Prg_END_EDIT_ITEM)
HTM_ARTICLE_Begin (Prg_ITEM_SECTION_ID); HTM_ARTICLE_Begin (Prg_ITEM_SECTION_ID);
HTM_Txt (Item->Title); HTM_Txt (Item->Title);
if (ListingType == Prg_FORM_EDIT_ITEM || if (HighlightItem)
ListingType == Prg_END_EDIT_ITEM)
HTM_ARTICLE_End (); HTM_ARTICLE_End ();
HTM_TD_End (); HTM_TD_End ();
break; break;
@ -597,17 +639,12 @@ static void Prg_WriteRowItem (Prg_ListingType_t ListingType,
} }
/* Item text / form */ /* Item text / form */
switch (ListingType) if (ListingType == Prg_FORM_EDIT_ITEM && HighlightItem)
{ /* Form to change item title, dates and text */
case Prg_FORM_EDIT_ITEM: Prg_ShowFormToChangeItem (Item->Hierarchy.ItmCod);
/* Form to change item title, dates and text */ else
Prg_ShowFormToChangeItem (Item->Hierarchy.ItmCod); /* Text */
break; Prg_WriteItemText (Item->Hierarchy.ItmCod,LightStyle);
default:
/* Text */
Prg_WriteItemText (Item->Hierarchy.ItmCod,LightStyle);
break;
}
/* List of resources */ /* List of resources */
PrgRsc_ListItemResources (ListingType,Item,SelectedRscCod); PrgRsc_ListItemResources (ListingType,Item,SelectedRscCod);
@ -622,6 +659,32 @@ static void Prg_WriteRowItem (Prg_ListingType_t ListingType,
Prg_FreeTitleClass (TitleClass); Prg_FreeTitleClass (TitleClass);
} }
/*****************************************************************************/
/************************ Put icon to expand an item *************************/
/*****************************************************************************/
static void Prg_PutIconToContractExpandItem (struct Prg_Item *Item,
bool Expanded,bool Editing)
{
static Act_Action_t NextAction[2][2] =
{
[false][false] = ActExpSeePrgItm, // Contracted, Not editing ==> action to expand
[false][true ] = ActExpEdiPrgItm, // Contracted, Editing ==> action to expand
[true ][false] = ActConSeePrgItm, // Expanded , Not editing ==> action to contract
[true ][true ] = ActConEdiPrgItm, // Expanded , Editing ==> action to contract
};
static void (*PutContextualIcon[2]) (const Act_Action_t NextAction,const char *Anchor,
void (*FuncParams) (void *Args),void *Args) =
{
[false] = Ico_PutContextualIconToExpand, // Contracted ==> function to expand
[true ] = Ico_PutContextualIconToContract, // Expanded ==> function to contract
};
/***** Icon to hide/unhide program item *****/
PutContextualIcon[Expanded] (NextAction[Expanded][Editing],Prg_HIGHLIGHTED_SECTION_ID,
Prg_PutParamItmCod,&Item->Hierarchy.ItmCod);
}
/*****************************************************************************/ /*****************************************************************************/
/**************************** Show item text *********************************/ /**************************** Show item text *********************************/
/*****************************************************************************/ /*****************************************************************************/
@ -659,6 +722,10 @@ static void Prg_WriteRowToCreateItem (long ParentItmCod,unsigned FormLevel)
/***** Begin row *****/ /***** Begin row *****/
HTM_TR_Begin (NULL); HTM_TR_Begin (NULL);
/***** Column under expand/contract icon *****/
HTM_TD_Begin ("class=\"LT %s\"",The_GetColorRows ());
HTM_TD_End ();
/***** Column under icons *****/ /***** Column under icons *****/
HTM_TD_Begin ("class=\"PRG_COL1 LT %s\"",The_GetColorRows ()); HTM_TD_Begin ("class=\"PRG_COL1 LT %s\"",The_GetColorRows ());
HTM_TD_End (); HTM_TD_End ();
@ -764,7 +831,7 @@ static void Prg_CreateLevels (void)
MaxLevel = 4 MaxLevel = 4
Level Number Level Number
----- ------ ----- ------
0 <--- Not used 0 N.A. <--- Root level
1 2 1 2
2 5 2 5
3 2 3 2
@ -836,14 +903,36 @@ static void Prg_WriteNumNewItem (unsigned Level)
/********************** Set / Get if a level is hidden ***********************/ /********************** Set / Get if a level is hidden ***********************/
/*****************************************************************************/ /*****************************************************************************/
static void Prg_SetExpandedLevel (unsigned Level,bool Expanded)
{
if (Prg_Gbl.Levels)
Prg_Gbl.Levels[Level].Expanded = Expanded;
}
static void Prg_SetHiddenLevel (unsigned Level,bool Hidden) static void Prg_SetHiddenLevel (unsigned Level,bool Hidden)
{ {
if (Prg_Gbl.Levels) if (Prg_Gbl.Levels)
Prg_Gbl.Levels[Level].Hidden = Hidden; Prg_Gbl.Levels[Level].Hidden = Hidden;
} }
static bool Prg_GetExpandedLevel (unsigned Level)
{
/* Level 0 (root) is always expanded */
if (Level == 0)
return true;
if (Prg_Gbl.Levels)
return Prg_Gbl.Levels[Level].Expanded;
return false;
}
static bool Prg_GetHiddenLevel (unsigned Level) static bool Prg_GetHiddenLevel (unsigned Level)
{ {
/* Level 0 (root) is always visible */
if (Level == 0)
return false;
if (Prg_Gbl.Levels) if (Prg_Gbl.Levels)
return Prg_Gbl.Levels[Level].Hidden; return Prg_Gbl.Levels[Level].Hidden;
@ -854,6 +943,19 @@ static bool Prg_GetHiddenLevel (unsigned Level)
/********* Check if any level higher than the current one is hidden **********/ /********* Check if any level higher than the current one is hidden **********/
/*****************************************************************************/ /*****************************************************************************/
static bool Prg_CheckIfAllHigherLevelsAreExpanded (unsigned CurrentLevel)
{
unsigned Level;
for (Level = 1;
Level < CurrentLevel;
Level++)
if (!Prg_GetExpandedLevel (Level)) // Contracted?
return false; // A level is contracted. Not all are expanded
return true; // None is contracted. All are expanded
}
static bool Prg_CheckIfAnyHigherLevelIsHidden (unsigned CurrentLevel) static bool Prg_CheckIfAnyHigherLevelIsHidden (unsigned CurrentLevel)
{ {
unsigned Level; unsigned Level;
@ -895,7 +997,7 @@ static void Prg_PutFormsToRemEditOneItem (Prg_ListingType_t ListingType,
Prg_PutParamItmCod,&Item->Hierarchy.ItmCod); Prg_PutParamItmCod,&Item->Hierarchy.ItmCod);
/***** Icon to hide/unhide program item *****/ /***** Icon to hide/unhide program item *****/
Ico_PutContextualIconToHideUnhide (ActionHideUnhide,"prg_highlighted", Ico_PutContextualIconToHideUnhide (ActionHideUnhide,Prg_HIGHLIGHTED_SECTION_ID,
Prg_PutParamItmCod,&Item->Hierarchy.ItmCod, Prg_PutParamItmCod,&Item->Hierarchy.ItmCod,
Item->Hierarchy.Hidden); Item->Hierarchy.Hidden);
@ -920,7 +1022,7 @@ static void Prg_PutFormsToRemEditOneItem (Prg_ListingType_t ListingType,
/***** Icon to move up the item *****/ /***** Icon to move up the item *****/
if (Prg_CheckIfMoveUpIsAllowed (NumItem)) if (Prg_CheckIfMoveUpIsAllowed (NumItem))
Lay_PutContextualLinkOnlyIcon (ActUp_PrgItm,"prg_highlighted", Lay_PutContextualLinkOnlyIcon (ActUp_PrgItm,Prg_HIGHLIGHTED_SECTION_ID,
Prg_PutParamItmCod,&Item->Hierarchy.ItmCod, Prg_PutParamItmCod,&Item->Hierarchy.ItmCod,
"arrow-up.svg",Ico_BLACK); "arrow-up.svg",Ico_BLACK);
else else
@ -928,7 +1030,7 @@ static void Prg_PutFormsToRemEditOneItem (Prg_ListingType_t ListingType,
/***** Icon to move down the item *****/ /***** Icon to move down the item *****/
if (Prg_CheckIfMoveDownIsAllowed (NumItem)) if (Prg_CheckIfMoveDownIsAllowed (NumItem))
Lay_PutContextualLinkOnlyIcon (ActDwnPrgItm,"prg_highlighted", Lay_PutContextualLinkOnlyIcon (ActDwnPrgItm,Prg_HIGHLIGHTED_SECTION_ID,
Prg_PutParamItmCod,&Item->Hierarchy.ItmCod, Prg_PutParamItmCod,&Item->Hierarchy.ItmCod,
"arrow-down.svg",Ico_BLACK); "arrow-down.svg",Ico_BLACK);
else else
@ -936,7 +1038,7 @@ static void Prg_PutFormsToRemEditOneItem (Prg_ListingType_t ListingType,
/***** Icon to move left item (increase level) *****/ /***** Icon to move left item (increase level) *****/
if (Prg_CheckIfMoveLeftIsAllowed (NumItem)) if (Prg_CheckIfMoveLeftIsAllowed (NumItem))
Lay_PutContextualLinkOnlyIcon (ActLftPrgItm,"prg_highlighted", Lay_PutContextualLinkOnlyIcon (ActLftPrgItm,Prg_HIGHLIGHTED_SECTION_ID,
Prg_PutParamItmCod,&Item->Hierarchy.ItmCod, Prg_PutParamItmCod,&Item->Hierarchy.ItmCod,
"arrow-left.svg",Ico_BLACK); "arrow-left.svg",Ico_BLACK);
else else
@ -944,7 +1046,7 @@ static void Prg_PutFormsToRemEditOneItem (Prg_ListingType_t ListingType,
/***** Icon to move right item (indent, decrease level) *****/ /***** Icon to move right item (indent, decrease level) *****/
if (Prg_CheckIfMoveRightIsAllowed (NumItem)) if (Prg_CheckIfMoveRightIsAllowed (NumItem))
Lay_PutContextualLinkOnlyIcon (ActRgtPrgItm,"prg_highlighted", Lay_PutContextualLinkOnlyIcon (ActRgtPrgItm,Prg_HIGHLIGHTED_SECTION_ID,
Prg_PutParamItmCod,&Item->Hierarchy.ItmCod, Prg_PutParamItmCod,&Item->Hierarchy.ItmCod,
"arrow-right.svg",Ico_BLACK); "arrow-right.svg",Ico_BLACK);
else else
@ -1098,7 +1200,7 @@ void Prg_GetListItems (void)
/* Get index of the program item (row[1]) /* Get index of the program item (row[1])
and level of the program item (row[2]) */ and level of the program item (row[2]) */
Prg_Gbl.List.Items[NumItem].ItmInd = Str_ConvertStrToUnsigned (row[1]); Prg_Gbl.List.Items[NumItem].ItmInd = Str_ConvertStrToUnsigned (row[1]);
Prg_Gbl.List.Items[NumItem].Level = Str_ConvertStrToUnsigned (row[2]); Prg_Gbl.List.Items[NumItem].Level = Str_ConvertStrToUnsigned (row[2]);
/* Get whether the program item is hidden or not (row[3]) */ /* Get whether the program item is hidden or not (row[3]) */
Prg_Gbl.List.Items[NumItem].Hidden = (row[3][0] == 'Y'); Prg_Gbl.List.Items[NumItem].Hidden = (row[3][0] == 'Y');
@ -1249,7 +1351,7 @@ unsigned Prg_GetNumItemFromItmCod (long ItmCod)
for (NumItem = 0; for (NumItem = 0;
NumItem < Prg_Gbl.List.NumItems; NumItem < Prg_Gbl.List.NumItems;
NumItem++) NumItem++)
if (Prg_Gbl.List.Items[NumItem].ItmCod == ItmCod) // Found! if (Prg_GetItmCodFromNumItem (NumItem) == ItmCod) // Found!
return NumItem; return NumItem;
/***** Not found *****/ /***** Not found *****/
@ -1257,6 +1359,24 @@ unsigned Prg_GetNumItemFromItmCod (long ItmCod)
return 0; // Not reached return 0; // Not reached
} }
/*****************************************************************************/
/******************** Get item code from number of item **********************/
/*****************************************************************************/
inline long Prg_GetItmCodFromNumItem (unsigned NumItem)
{
return Prg_Gbl.List.Items[NumItem].ItmCod;
}
/*****************************************************************************/
/******************** Get item index from number of item *********************/
/*****************************************************************************/
inline unsigned Prg_GetItmIndFromNumItem (unsigned NumItem)
{
return Prg_Gbl.List.Items[NumItem].ItmInd;
}
/*****************************************************************************/ /*****************************************************************************/
/****************** Get level of item from number of item ********************/ /****************** Get level of item from number of item ********************/
/*****************************************************************************/ /*****************************************************************************/
@ -1539,7 +1659,7 @@ static int Prg_GetPrevBrother (int NumItem)
if (Prg_GetLevelFromNumItem (i) == Level) if (Prg_GetLevelFromNumItem (i) == Level)
return i; // Previous brother before item found return i; // Previous brother before item found
if (Prg_GetLevelFromNumItem (i) < Level) if (Prg_GetLevelFromNumItem (i) < Level)
return -1; // Previous lower level found ==> there are no brothers before item return -1; // Previous lower level found ==> there are no brothers before item
} }
return -1; // Start reached ==> there are no brothers before item return -1; // Start reached ==> there are no brothers before item
} }
@ -1636,6 +1756,63 @@ static void Prg_MoveLeftRightItem (Prg_MoveLeftRight_t LeftRight)
Prg_FreeListItems (); Prg_FreeListItems ();
} }
/*****************************************************************************/
/************** Move a subtree to left/right in a course program *************/
/*****************************************************************************/
void Prg_ExpandItem (void)
{
Prg_ExpandContractItem (Prg_EXPAND);
}
void Prg_ContractItem (void)
{
Prg_ExpandContractItem (Prg_CONTRACT);
}
static void Prg_ExpandContractItem (Prg_ExpandContract_t ExpandContract)
{
struct Prg_Item Item;
Prg_ListingType_t ListingType;
/***** Get list of program items *****/
Prg_GetListItems ();
/***** Get program item *****/
Prg_GetParams (&Item);
if (Item.Hierarchy.ItmCod <= 0)
Err_WrongItemExit ();
/***** Add/remove item to/from table of expanded items *****/
switch (ExpandContract)
{
case Prg_EXPAND:
Prg_DB_InsertItemInExpandedItems (Item.Hierarchy.ItmCod);
break;
case Prg_CONTRACT:
Prg_DB_RemoveItemFromExpandedItems (Item.Hierarchy.ItmCod);
break;
}
/***** Show program items highlighting subtree *****/
switch (Gbl.Action.Act)
{
case ActExpEdiPrgItm:
case ActConEdiPrgItm:
ListingType = Prg_EDIT_ITEMS;
break;
case ActExpSeePrgItm:
case ActConSeePrgItm:
default:
ListingType = Prg_VIEW;
break;
}
Prg_ShowAllItems (ListingType,Item.Hierarchy.ItmCod,-1L);
/***** Free list of program items *****/
Prg_FreeListItems ();
}
/*****************************************************************************/ /*****************************************************************************/
/****** Set subtree begin and end from number of item in course program ******/ /****** Set subtree begin and end from number of item in course program ******/
/*****************************************************************************/ /*****************************************************************************/
@ -1652,7 +1829,7 @@ static void Prg_SetItemRangeOnlyItem (unsigned NumItem,struct Prg_ItemRange *Ite
/***** Range includes only this item *****/ /***** Range includes only this item *****/
ItemRange->Begin = ItemRange->Begin =
ItemRange->End = Prg_Gbl.List.Items[NumItem].ItmInd; ItemRange->End = Prg_GetItmIndFromNumItem (NumItem);
} }
static void Prg_SetItemRangeWithAllChildren (unsigned NumItem,struct Prg_ItemRange *ItemRange) static void Prg_SetItemRangeWithAllChildren (unsigned NumItem,struct Prg_ItemRange *ItemRange)
@ -1666,8 +1843,8 @@ static void Prg_SetItemRangeWithAllChildren (unsigned NumItem,struct Prg_ItemRan
Err_WrongItemExit (); Err_WrongItemExit ();
/***** Range includes this item and all its children *****/ /***** Range includes this item and all its children *****/
ItemRange->Begin = Prg_Gbl.List.Items[NumItem ].ItmInd; ItemRange->Begin = Prg_GetItmIndFromNumItem (NumItem);
ItemRange->End = Prg_Gbl.List.Items[Prg_GetLastChild (NumItem)].ItmInd; ItemRange->End = Prg_GetItmIndFromNumItem (Prg_GetLastChild (NumItem));
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1753,6 +1930,10 @@ void Prg_RequestCreateItem (void)
/***** Get program item *****/ /***** Get program item *****/
Prg_GetParams (&Item); Prg_GetParams (&Item);
/***** Add item to table of expanded items
to ensure that child items are displayed *****/
Prg_DB_InsertItemInExpandedItems (Item.Hierarchy.ItmCod);
/***** Show current program items, if any *****/ /***** Show current program items, if any *****/
Prg_ShowAllItems (Item.Hierarchy.ItmCod > 0 ? Prg_FORM_NEW_CHILD_ITEM : Prg_ShowAllItems (Item.Hierarchy.ItmCod > 0 ? Prg_FORM_NEW_CHILD_ITEM :
Prg_FORM_NEW_END_ITEM, Prg_FORM_NEW_END_ITEM,
@ -1793,7 +1974,7 @@ static void Prg_ShowFormToCreateItem (long ParentItmCod)
Ale_ShowAlerts (NULL); Ale_ShowAlerts (NULL);
/***** Begin form *****/ /***** Begin form *****/
Frm_BeginFormAnchor (ActNewPrgItm,"prg_highlighted"); Frm_BeginFormAnchor (ActNewPrgItm,Prg_HIGHLIGHTED_SECTION_ID);
Prg_PutParamItmCod (&ParentItem.Hierarchy.ItmCod); Prg_PutParamItmCod (&ParentItem.Hierarchy.ItmCod);
/***** Begin box and table *****/ /***** Begin box and table *****/
@ -1837,7 +2018,7 @@ static void Prg_ShowFormToChangeItem (long ItmCod)
// Ale_ShowAlerts (NULL); // Ale_ShowAlerts (NULL);
/***** Begin form *****/ /***** Begin form *****/
Frm_BeginFormAnchor (ActChgPrgItm,"prg_highlighted"); Frm_BeginFormAnchor (ActChgPrgItm,Prg_HIGHLIGHTED_SECTION_ID);
Prg_PutParamItmCod (&Item.Hierarchy.ItmCod); Prg_PutParamItmCod (&Item.Hierarchy.ItmCod);
/***** Begin box and table *****/ /***** Begin box and table *****/
@ -2028,14 +2209,14 @@ static void Prg_InsertItem (const struct Prg_Item *ParentItem,
if (NumItemLastChild < Prg_Gbl.List.NumItems - 1) if (NumItemLastChild < Prg_Gbl.List.NumItems - 1)
{ {
/***** New program item will be inserted after last child of parent *****/ /***** New program item will be inserted after last child of parent *****/
Item->Hierarchy.ItmInd = Prg_Gbl.List.Items[NumItemLastChild + 1].ItmInd; Item->Hierarchy.ItmInd = Prg_GetItmIndFromNumItem (NumItemLastChild + 1);
/***** Move down all indexes of after last child of parent *****/ /***** Move down all indexes of after last child of parent *****/
Prg_DB_MoveDownItems (Item->Hierarchy.ItmInd); Prg_DB_MoveDownItems (Item->Hierarchy.ItmInd);
} }
else else
/***** New program item will be inserted at the end *****/ /***** New program item will be inserted at the end *****/
Item->Hierarchy.ItmInd = Prg_Gbl.List.Items[Prg_Gbl.List.NumItems - 1].ItmInd + 1; Item->Hierarchy.ItmInd = Prg_GetItmIndFromNumItem (Prg_Gbl.List.NumItems - 1) + 1;
/***** Child ==> parent level + 1 *****/ /***** Child ==> parent level + 1 *****/
Item->Hierarchy.Level = ParentItem->Hierarchy.Level + 1; Item->Hierarchy.Level = ParentItem->Hierarchy.Level + 1;
@ -2043,7 +2224,7 @@ static void Prg_InsertItem (const struct Prg_Item *ParentItem,
else // No parent specified else // No parent specified
{ {
/***** New program item will be inserted at the end *****/ /***** New program item will be inserted at the end *****/
Item->Hierarchy.ItmInd = Prg_Gbl.List.Items[Prg_Gbl.List.NumItems - 1].ItmInd + 1; Item->Hierarchy.ItmInd = Prg_GetItmIndFromNumItem (Prg_Gbl.List.NumItems - 1) + 1;
/***** First level *****/ /***** First level *****/
Item->Hierarchy.Level = 1; Item->Hierarchy.Level = 1;

View File

@ -116,6 +116,13 @@ typedef enum
Prg_MOVE_RIGHT, Prg_MOVE_RIGHT,
} Prg_MoveLeftRight_t; } Prg_MoveLeftRight_t;
#define Prg_NUM_MOVEMENTS_EXPAND_CONTRACT 2
typedef enum
{
Prg_EXPAND,
Prg_CONTRACT,
} Prg_ExpandContract_t;
#define Prg_NUM_LISTING_TYPES 12 #define Prg_NUM_LISTING_TYPES 12
typedef enum typedef enum
{ {
@ -157,6 +164,8 @@ void Prg_FreeListItems (void);
void Prg_ResetItem (struct Prg_Item *Item); void Prg_ResetItem (struct Prg_Item *Item);
unsigned Prg_GetNumItemFromItmCod (long ItmCod); unsigned Prg_GetNumItemFromItmCod (long ItmCod);
long Prg_GetItmCodFromNumItem (unsigned NumItem);
unsigned Prg_GetItmIndFromNumItem (unsigned NumItem);
unsigned Prg_GetLevelFromNumItem (unsigned NumItem); unsigned Prg_GetLevelFromNumItem (unsigned NumItem);
void Prg_ViewItemAfterEdit (void); void Prg_ViewItemAfterEdit (void);
@ -175,6 +184,9 @@ void Prg_MoveDownItem (void);
void Prg_MoveLeftItem (void); void Prg_MoveLeftItem (void);
void Prg_MoveRightItem (void); void Prg_MoveRightItem (void);
void Prg_ExpandItem (void);
void Prg_ContractItem (void);
//-------------------------------- Figures ------------------------------------ //-------------------------------- Figures ------------------------------------
void Prg_GetAndShowCourseProgramStats (void); // TODO: Change function from assignments to schedule void Prg_GetAndShowCourseProgramStats (void); // TODO: Change function from assignments to schedule

View File

@ -720,3 +720,49 @@ void Prg_DB_RemoveLinkFromClipboard (struct Prg_Link *Link)
Prg_ResourceTypesDB[Link->Type], Prg_ResourceTypesDB[Link->Type],
Link->Cod); Link->Cod);
} }
/*****************************************************************************/
/************************ Insert item in expanded items **********************/
/*****************************************************************************/
void Prg_DB_InsertItemInExpandedItems (long ItmCod)
{
DB_QueryREPLACE ("can not expand item",
"REPLACE INTO prg_expanded"
" (UsrCod,ItmCod,ClickTime)"
" VALUES"
" (%ld,%ld,NOW())",
Gbl.Usrs.Me.UsrDat.UsrCod,
ItmCod);
}
/*****************************************************************************/
/******************** Check if a program item is expanded ********************/
/*****************************************************************************/
bool Prg_DB_GetIfExpandedItem (long ItmCod)
{
return
DB_QueryEXISTS ("can not check if an item is expanded",
"SELECT EXISTS"
"(SELECT *"
" FROM prg_expanded"
" WHERE UsrCod=%ld"
" AND ItmCod=%ld)",
Gbl.Usrs.Me.UsrDat.UsrCod,
ItmCod);
}
/*****************************************************************************/
/********************** Remove item from expanded items **********************/
/*****************************************************************************/
void Prg_DB_RemoveItemFromExpandedItems (long ItmCod)
{
DB_QueryDELETE ("can not contract item",
"DELETE FROM prg_expanded"
" WHERE UsrCod=%ld"
" AND ItmCod=%ld",
Gbl.Usrs.Me.UsrDat.UsrCod,
ItmCod);
}

View File

@ -81,4 +81,8 @@ void Prg_DB_CopyToClipboard (PrgRsc_Type_t Type,long Cod);
unsigned Prg_DB_GetClipboard (MYSQL_RES **mysql_res); unsigned Prg_DB_GetClipboard (MYSQL_RES **mysql_res);
void Prg_DB_RemoveLinkFromClipboard (struct Prg_Link *Link); void Prg_DB_RemoveLinkFromClipboard (struct Prg_Link *Link);
void Prg_DB_InsertItemInExpandedItems (long ItmCod);
bool Prg_DB_GetIfExpandedItem (long ItmCod);
void Prg_DB_RemoveItemFromExpandedItems (long ItmCod);
#endif #endif

View File

@ -27,6 +27,7 @@
#define _GNU_SOURCE // For asprintf #define _GNU_SOURCE // For asprintf
#include <stdio.h> // For asprintf #include <stdio.h> // For asprintf
#include <stdlib.h> // For free
#include <string.h> // For string functions #include <string.h> // For string functions
#include "swad_assignment_resource.h" #include "swad_assignment_resource.h"

View File

@ -6040,6 +6040,98 @@ const char *Txt_Actions[Act_NUM_ACTIONS] =
"Move right program item" // Precisa de tradução "Move right program item" // Precisa de tradução
#elif L==10 // tr #elif L==10 // tr
"Move right program item" // Çeviri lazim! "Move right program item" // Çeviri lazim!
#endif
,
[ActExpSeePrgItm] =
#if L==1 // ca
"Expand program item" // Necessita traducció
#elif L==2 // de
"Expand program item" // Need Übersetzung
#elif L==3 // en
"Expand program item"
#elif L==4 // es
"Expandir &iacute;tem del programa"
#elif L==5 // fr
"Expand program item" // Besoin de traduction
#elif L==6 // gn
"Expandir &iacute;tem del programa" // Okoteve traducción
#elif L==7 // it
"Expand program item" // Bisogno di traduzione
#elif L==8 // pl
"Expand program item" // Potrzebujesz tlumaczenie
#elif L==9 // pt
"Expand program item" // Precisa de tradução
#elif L==10 // tr
"Expand program item" // Çeviri lazim!
#endif
,
[ActConSeePrgItm] =
#if L==1 // ca
"Contract program item" // Necessita traducció
#elif L==2 // de
"Contract program item" // Need Übersetzung
#elif L==3 // en
"Contract program item"
#elif L==4 // es
"Contraer &iacute;tem del programa"
#elif L==5 // fr
"Contract program item" // Besoin de traduction
#elif L==6 // gn
"Contraer &iacute;tem del programa" // Okoteve traducción
#elif L==7 // it
"Contract program item" // Bisogno di traduzione
#elif L==8 // pl
"Contract program item" // Potrzebujesz tlumaczenie
#elif L==9 // pt
"Contract program item" // Precisa de tradução
#elif L==10 // tr
"Contract program item" // Çeviri lazim!
#endif
,
[ActExpEdiPrgItm] =
#if L==1 // ca
"Expand program item when editing" // Necessita traducció
#elif L==2 // de
"Expand program item when editing" // Need Übersetzung
#elif L==3 // en
"Expand program item when editing"
#elif L==4 // es
"Expandir &iacute;tem del programa editando"
#elif L==5 // fr
"Expand program item when editing" // Besoin de traduction
#elif L==6 // gn
"Expandir &iacute;tem del programa editando" // Okoteve traducción
#elif L==7 // it
"Expand program item when editing" // Bisogno di traduzione
#elif L==8 // pl
"Expand program item when editing" // Potrzebujesz tlumaczenie
#elif L==9 // pt
"Expand program item when editing" // Precisa de tradução
#elif L==10 // tr
"Expand program item when editing" // Çeviri lazim!
#endif
,
[ActConEdiPrgItm] =
#if L==1 // ca
"Contract program item when editing" // Necessita traducció
#elif L==2 // de
"Contract program item when editing" // Need Übersetzung
#elif L==3 // en
"Contract program item when editing"
#elif L==4 // es
"Contraer &iacute;tem del programa editando"
#elif L==5 // fr
"Contract program item when editing" // Besoin de traduction
#elif L==6 // gn
"Contraer &iacute;tem del programa editando" // Okoteve traducción
#elif L==7 // it
"Contract program item when editing" // Bisogno di traduzione
#elif L==8 // pl
"Contract program item when editing" // Potrzebujesz tlumaczenie
#elif L==9 // pt
"Contract program item when editing" // Precisa de tradução
#elif L==10 // tr
"Contract program item when editing" // Çeviri lazim!
#endif #endif
, ,
[ActFrmSeePrgRsc] = [ActFrmSeePrgRsc] =