From fd3bcb2d9497b4dffdf552e2390b938a9dd747f7 Mon Sep 17 00:00:00 2001 From: acanas Date: Thu, 10 Mar 2022 14:35:28 +0100 Subject: [PATCH] Version 21.83.3: Mar 10, 2022 Code refactoring in timetable. --- swad_changelog.h | 3 +- swad_timetable.c | 531 +++++++++++++++++++++++++---------------------- 2 files changed, 288 insertions(+), 246 deletions(-) diff --git a/swad_changelog.h b/swad_changelog.h index 90e5d923..213a1ac2 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 21.83.2 (2022-03-10)" +#define Log_PLATFORM_VERSION "SWAD 21.83.3 (2022-03-10)" #define CSS_FILE "swad21.83.2.css" #define JS_FILE "swad21.78.2.js" /* + Version 21.83.3: Mar 10, 2022 Code refactoring in timetable. (323527 lines) Version 21.83.2: Mar 10, 2022 Working on design of dark theme. (323488 lines) Copy the following icon to icon public directory: sudo cp icon/theme/dark/theme_32x20.gif /var/www/html/swad/icon/theme/dark/ diff --git a/swad_timetable.c b/swad_timetable.c index 713e9448..8611fc6d 100644 --- a/swad_timetable.c +++ b/swad_timetable.c @@ -136,8 +136,19 @@ static unsigned Tmt_CalculateColsToDrawInCell (const struct Tmt_Timetable *Timet static void Tmt_DrawCellAlignTimeTable (void); static void Tmt_TimeTableDrawCell (const struct Tmt_Timetable *Timetable, unsigned Weekday,unsigned Interval,unsigned Column,unsigned ColSpan, - long CrsCod,Tmt_IntervalType_t IntervalType,Tmt_ClassType_t ClassType, - unsigned DurationNumIntervals,long GrpCod,const char *Info); + long CrsCod,long GrpCod, + Tmt_IntervalType_t IntervalType,Tmt_ClassType_t ClassType, + unsigned DurationNumIntervals,const char *Info); +static void Tmt_TimeTableDrawCellView (const struct Tmt_Timetable *Timetable, + long CrsCod,long GrpCod, + Tmt_ClassType_t ClassType, + unsigned DurationNumIntervals, + const char *Info); +static void Tmt_TimeTableDrawCellEdit (const struct Tmt_Timetable *Timetable, + unsigned Weekday,unsigned Interval,unsigned Column, + long GrpCod, + Tmt_IntervalType_t IntervalType,Tmt_ClassType_t ClassType, + unsigned DurationNumIntervals,const char *Info); /*****************************************************************************/ /******************** Create internal timetable in memory ********************/ @@ -1080,25 +1091,25 @@ static void Tmt_DrawTimeTable (const struct Tmt_Timetable *Timetable) if (ContinuousFreeMinicolumns) { Tmt_TimeTableDrawCell (Timetable, - Weekday,Interval,Column - 1,ContinuousFreeMinicolumns, - -1L,Tmt_FREE_INTERVAL,Tmt_FREE,0,-1L,NULL); + Weekday,Interval,Column - 1,ContinuousFreeMinicolumns, + -1L,-1L,Tmt_FREE_INTERVAL,Tmt_FREE,0,NULL); ContinuousFreeMinicolumns = 0; } Tmt_TimeTableDrawCell (Timetable, - Weekday,Interval,Column, - Tmt_NUM_MINICOLUMNS_PER_DAY / - ColumnsToDrawIncludingExtraColumn, - Tmt_TimeTable[Weekday][Interval].Columns[Column].CrsCod, - Tmt_TimeTable[Weekday][Interval].Columns[Column].IntervalType, - Tmt_TimeTable[Weekday][Interval].Columns[Column].ClassType, - Tmt_TimeTable[Weekday][Interval].Columns[Column].DurationIntervals, - Tmt_TimeTable[Weekday][Interval].Columns[Column].GrpCod, - Tmt_TimeTable[Weekday][Interval].Columns[Column].Info); + Weekday,Interval,Column, + Tmt_NUM_MINICOLUMNS_PER_DAY / + ColumnsToDrawIncludingExtraColumn, + Tmt_TimeTable[Weekday][Interval].Columns[Column].CrsCod, + Tmt_TimeTable[Weekday][Interval].Columns[Column].GrpCod, + Tmt_TimeTable[Weekday][Interval].Columns[Column].IntervalType, + Tmt_TimeTable[Weekday][Interval].Columns[Column].ClassType, + Tmt_TimeTable[Weekday][Interval].Columns[Column].DurationIntervals, + Tmt_TimeTable[Weekday][Interval].Columns[Column].Info); } if (ContinuousFreeMinicolumns) Tmt_TimeTableDrawCell (Timetable, - Weekday,Interval,Column - 1,ContinuousFreeMinicolumns, - -1L,Tmt_FREE_INTERVAL,Tmt_FREE,0,-1L,NULL); + Weekday,Interval,Column - 1,ContinuousFreeMinicolumns, + -1L,-1L,Tmt_FREE_INTERVAL,Tmt_FREE,0,NULL); } /* Empty column used to adjust height */ @@ -1107,9 +1118,9 @@ static void Tmt_DrawTimeTable (const struct Tmt_Timetable *Timetable) /* Right hour:minutes cell */ if (Interval % 2) Tmt_TimeTableDrawHourCell (Timetable->Config.Range.Hours.Start + - (Interval + 2) / Timetable->Config.IntervalsPerHour, - Min, - "LM"); + (Interval + 2) / Timetable->Config.IntervalsPerHour, + Min, + "LM"); HTM_TR_End (); } @@ -1300,16 +1311,12 @@ static void Tmt_DrawCellAlignTimeTable (void) static void Tmt_TimeTableDrawCell (const struct Tmt_Timetable *Timetable, unsigned Weekday,unsigned Interval,unsigned Column,unsigned ColSpan, - long CrsCod,Tmt_IntervalType_t IntervalType,Tmt_ClassType_t ClassType, - unsigned DurationNumIntervals,long GrpCod,const char *Info) + long CrsCod,long GrpCod, + Tmt_IntervalType_t IntervalType,Tmt_ClassType_t ClassType, + unsigned DurationNumIntervals,const char *Info) { extern const char *The_ClassDatSmall[The_NUM_THEMES]; - extern const char *Tmt_DB_ClassType[Tmt_NUM_CLASS_TYPES]; - extern const char *Txt_unknown_removed_course; - extern const char *Txt_TIMETABLE_CLASS_TYPES[Tmt_NUM_CLASS_TYPES]; - extern const char *Txt_Group; extern const char *Txt_All_groups; - extern const char *Txt_Info; static const char *TimeTableClasses[Tmt_NUM_CLASS_TYPES] = { [Tmt_FREE ] = "Tmt_FREE", // free hour @@ -1317,23 +1324,11 @@ static void Tmt_TimeTableDrawCell (const struct Tmt_Timetable *Timetable, [Tmt_PRACTICAL] = "Tmt_PRAC", // practical class [Tmt_TUTORING ] = "Tmt_TUTO", // tutoring/office hour }; - char *CellStr; // Unique string for this cell used in labels struct GroupData GrpDat; - unsigned NumGrpTyp; - unsigned NumGrp; - unsigned i; - unsigned Dur; - unsigned MaxDuration; - char *TTDur; unsigned RowSpan = 0; char *RowSpanStr; char *ColSpanStr; char *ClassStr; - Tmt_ClassType_t CT; - struct Crs_Course Crs; - struct GroupType *GrpTyp; - struct Group *Grp; - char *Room; /***** Compute row span and background color depending on hour type *****/ switch (IntervalType) @@ -1408,224 +1403,270 @@ static void Tmt_TimeTableDrawCell (const struct Tmt_Timetable *Timetable, free (ColSpanStr); free (ClassStr); - /***** Form to modify this cell *****/ - if (Timetable->View == Tmt_CRS_EDIT) - Frm_BeginForm (ActChgCrsTT); - else if (Timetable->View == Tmt_TUT_EDIT) - Frm_BeginForm (ActChgTut); - /***** Draw cell depending on type of view *****/ switch (Timetable->View) { case Tmt_CRS_VIEW: // View course timetable case Tmt_TUT_VIEW: // View tutoring timetable if (IntervalType != Tmt_FREE_INTERVAL) // If cell is not empty... - { - /***** Begin cell *****/ - HTM_DIV_Begin ("class=\"Tmt_CELL Tmt_TXT\""); - - /***** Course name *****/ - if (Timetable->Type == Tmt_MY_TIMETABLE) - { - Crs.CrsCod = CrsCod; - Crs_GetDataOfCourseByCod (&Crs); - if (ClassType == Tmt_LECTURE || - ClassType == Tmt_PRACTICAL) - { - HTM_Txt (Crs.ShrtName[0] ? Crs.ShrtName : - Txt_unknown_removed_course); - HTM_BR (); - } - } - - /***** Type of class and duration *****/ - HTM_TxtF ("%s (%u:%02u)", - Txt_TIMETABLE_CLASS_TYPES[ClassType], - (DurationNumIntervals / Timetable->Config.IntervalsPerHour), // Hours - (DurationNumIntervals % Timetable->Config.IntervalsPerHour) * - Timetable->Config.Range.MinutesPerInterval); // Minutes - - /***** Group *****/ - if (Timetable->View == Tmt_CRS_VIEW && - GrpCod > 0) - { - HTM_BR (); - HTM_Txt (GrpDat.GrpTypName); - HTM_BR (); - HTM_Txt (GrpDat.GrpName); - if (GrpDat.Room.RooCod > 0) - { - HTM_BR (); - HTM_TxtF ("(%s)",GrpDat.Room.ShrtName); - } - } - - /***** Info *****/ - if (Info) - if (Info[0]) - { - HTM_BR (); - HTM_Txt (Info); - } - - /***** End cell *****/ - HTM_DIV_End (); - } + Tmt_TimeTableDrawCellView (Timetable, + CrsCod,GrpCod, + ClassType, + DurationNumIntervals, + Info); break; - case Tmt_CRS_EDIT: - case Tmt_TUT_EDIT: - /***** Create unique string for this cell used in labels *****/ - if (asprintf (&CellStr,"%02u%02u%02u", - Weekday,Interval,Column) < 0) - Err_NotEnoughMemoryExit (); - - /***** Put hidden parameters *****/ - Par_PutHiddenParamUnsigned (NULL,"TTDay",Weekday); - Par_PutHiddenParamUnsigned (NULL,"TTInt",Interval); - Par_PutHiddenParamUnsigned (NULL,"TTCol",Column); - - /***** Class type *****/ - HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE, - "name=\"TTTyp\" class=\"Tmt_TYP\""); - for (CT = (Tmt_ClassType_t) 0; - CT <= (Tmt_ClassType_t) (Tmt_NUM_CLASS_TYPES - 1); - CT++) - if ((CT == Tmt_FREE) || - ((Timetable->View == Tmt_CRS_EDIT) && (CT == Tmt_LECTURE || CT == Tmt_PRACTICAL)) || - ((Timetable->View == Tmt_TUT_EDIT) && (CT == Tmt_TUTORING))) - HTM_OPTION (HTM_Type_STRING,Tmt_DB_ClassType[CT], - CT == ClassType,false, - "%s",Txt_TIMETABLE_CLASS_TYPES[CT]); - HTM_SELECT_End (); - - if (IntervalType == Tmt_FREE_INTERVAL) - { - for (i = Interval + 1; - i < Timetable->Config.IntervalsPerDay; - i++) - if (Tmt_TimeTable[Weekday][i].NumColumns == Tmt_MAX_COLUMNS_PER_CELL) - break; - MaxDuration = i - Interval; - Dur = (MaxDuration >= Timetable->Config.IntervalsPerHour) ? Timetable->Config.IntervalsPerHour : // MaxDuration >= 1h ==> Dur = 1h - MaxDuration; // MaxDuration < 1h ==> Dur = MaxDuration - if (asprintf (&TTDur,"%u:%02u", - (Dur / Timetable->Config.IntervalsPerHour), // Hours - (Dur % Timetable->Config.IntervalsPerHour) * - Timetable->Config.Range.MinutesPerInterval) < 0) // Minutes - Err_NotEnoughMemoryExit (); - Par_PutHiddenParamString (NULL,"TTDur",TTDur); - free (TTDur); - } - else - { - /***** Class duration *****/ - HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE, - "name=\"TTDur\" class=\"Tmt_DUR\""); - for (i = Interval + Tmt_TimeTable[Weekday][Interval].Columns[Column].DurationIntervals; - i < Timetable->Config.IntervalsPerDay; - i++) - if (Tmt_TimeTable[Weekday][i].NumColumns == Tmt_MAX_COLUMNS_PER_CELL) - break; - MaxDuration = i - Interval; - if (Tmt_TimeTable[Weekday][Interval].Columns[Column].DurationIntervals > MaxDuration) - MaxDuration = Tmt_TimeTable[Weekday][Interval].Columns[Column].DurationIntervals; - for (Dur = 0; - Dur <= MaxDuration; - Dur++) - { - if (asprintf (&TTDur,"%u:%02u", - (Dur / Timetable->Config.IntervalsPerHour), // Hours - (Dur % Timetable->Config.IntervalsPerHour) * - Timetable->Config.Range.MinutesPerInterval) < 0) // Minutes - Err_NotEnoughMemoryExit (); - HTM_OPTION (HTM_Type_STRING,TTDur, - Dur == DurationNumIntervals,false, - "%s",TTDur); - free (TTDur); - } - HTM_SELECT_End (); - - if (Timetable->View == Tmt_CRS_EDIT) - { - /***** Group *****/ - HTM_BR (); - HTM_LABEL_Begin ("for=\"TTGrp%s\"",CellStr); - HTM_Txt (Txt_Group); - HTM_LABEL_End (); - HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE, - "id=\"TTGrp%s\" name=\"TTGrp\"" - " class=\"Tmt_GRP\"", - CellStr); - HTM_OPTION (HTM_Type_STRING,"-1",GrpCod <= 0,false, - "%s",Txt_All_groups); - for (NumGrpTyp = 0; - NumGrpTyp < Gbl.Crs.Grps.GrpTypes.NumGrpTypes; - NumGrpTyp++) - { - GrpTyp = &Gbl.Crs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp]; - - for (NumGrp = 0; - NumGrp < GrpTyp->NumGrps; - NumGrp++) - { - Grp = &GrpTyp->LstGrps[NumGrp]; - if (Grp->Room.RooCod > 0) - { - if (asprintf (&Room," (%s)",Grp->Room.ShrtName) < 0) - Err_NotEnoughMemoryExit (); - } - else - { - if (asprintf (&Room,"%s","") < 0) - Err_NotEnoughMemoryExit (); - } - HTM_OPTION (HTM_Type_LONG,&Grp->GrpCod, - GrpCod == Grp->GrpCod,false, - "%s %s%s", - GrpTyp->GrpTypName,Grp->GrpName,Room); - free (Room); - } - } - HTM_SELECT_End (); - - /***** Info *****/ - HTM_BR (); - HTM_LABEL_Begin ("for=\"TTInf%s\"",CellStr); - HTM_Txt (Txt_Info); - HTM_LABEL_End (); - HTM_INPUT_TEXT ("TTInf",Tmt_MAX_CHARS_INFO,Info ? Info : - "", - HTM_SUBMIT_ON_CHANGE, - "id=\"TTInf%s\" size=\"1\" class=\"Tmt_INF\"", - CellStr); - } - else // TimeTableView == Tmt_TUT_EDIT - { - /***** Info *****/ - HTM_BR (); - HTM_LABEL_Begin ("for=\"TTInf%s\" class=\"%s\"", - CellStr, - The_ClassDatSmall[Gbl.Prefs.Theme]); - HTM_Txt (Txt_Info); - HTM_LABEL_End (); - HTM_INPUT_TEXT ("TTInf",Tmt_MAX_CHARS_INFO,Info, - HTM_SUBMIT_ON_CHANGE, - "id=\"TTInf%s\" size=\"12\" class=\"Tmt_INF\"", - CellStr); - } - } - - /***** Free allocated unique string for this cell used in labels *****/ - free (CellStr); - + case Tmt_CRS_EDIT: // Edit course timetable + case Tmt_TUT_EDIT: // Edit tutoring timetable + Tmt_TimeTableDrawCellEdit (Timetable, + Weekday,Interval,Column, + GrpCod, + IntervalType,ClassType, + DurationNumIntervals, + Info); break; } - /***** End form *****/ - if (Timetable->View == Tmt_CRS_EDIT || - Timetable->View == Tmt_TUT_EDIT) - Frm_EndForm (); - /***** End cell *****/ HTM_TD_End (); } + +static void Tmt_TimeTableDrawCellView (const struct Tmt_Timetable *Timetable, + long CrsCod,long GrpCod, + Tmt_ClassType_t ClassType, + unsigned DurationNumIntervals, + const char *Info) + { + extern const char *Txt_unknown_removed_course; + extern const char *Txt_TIMETABLE_CLASS_TYPES[Tmt_NUM_CLASS_TYPES]; + struct Crs_Course Crs; + struct GroupData GrpDat; + + /***** Begin cell *****/ + HTM_DIV_Begin ("class=\"Tmt_CELL Tmt_TXT\""); + + /***** Course name *****/ + if (Timetable->Type == Tmt_MY_TIMETABLE) + { + Crs.CrsCod = CrsCod; + Crs_GetDataOfCourseByCod (&Crs); + if (ClassType == Tmt_LECTURE || + ClassType == Tmt_PRACTICAL) + { + HTM_Txt (Crs.ShrtName[0] ? Crs.ShrtName : + Txt_unknown_removed_course); + HTM_BR (); + } + } + + /***** Type of class and duration *****/ + HTM_TxtF ("%s (%u:%02u)", + Txt_TIMETABLE_CLASS_TYPES[ClassType], + (DurationNumIntervals / Timetable->Config.IntervalsPerHour), // Hours + (DurationNumIntervals % Timetable->Config.IntervalsPerHour) * + Timetable->Config.Range.MinutesPerInterval); // Minutes + + /***** Group *****/ + if (Timetable->View == Tmt_CRS_VIEW && + GrpCod > 0) + { + HTM_BR (); + HTM_Txt (GrpDat.GrpTypName); + HTM_BR (); + HTM_Txt (GrpDat.GrpName); + if (GrpDat.Room.RooCod > 0) + { + HTM_BR (); + HTM_TxtF ("(%s)",GrpDat.Room.ShrtName); + } + } + + /***** Info *****/ + if (Info) + if (Info[0]) + { + HTM_BR (); + HTM_Txt (Info); + } + + /***** End cell *****/ + HTM_DIV_End (); + } + +static void Tmt_TimeTableDrawCellEdit (const struct Tmt_Timetable *Timetable, + unsigned Weekday,unsigned Interval,unsigned Column, + long GrpCod, + Tmt_IntervalType_t IntervalType,Tmt_ClassType_t ClassType, + unsigned DurationNumIntervals,const char *Info) + { + extern const char *The_ClassDatSmall[The_NUM_THEMES]; + extern const char *The_ClassInput[The_NUM_THEMES]; + extern const char *Tmt_DB_ClassType[Tmt_NUM_CLASS_TYPES]; + extern const char *Txt_TIMETABLE_CLASS_TYPES[Tmt_NUM_CLASS_TYPES]; + extern const char *Txt_Group; + extern const char *Txt_All_groups; + extern const char *Txt_Info; + char *CellStr; // Unique string for this cell used in labels + Tmt_ClassType_t CT; + unsigned i; + unsigned Dur; + unsigned MaxDuration; + char *TTDur; + unsigned NumGrpTyp; + unsigned NumGrp; + struct GroupType *GrpTyp; + struct Group *Grp; + char *Room; + + /***** Form to modify this cell *****/ + Frm_BeginForm (Timetable->View == Tmt_CRS_EDIT ? ActChgCrsTT : + ActChgTut); + + /***** Create unique string for this cell used in labels *****/ + if (asprintf (&CellStr,"%02u%02u%02u", + Weekday,Interval,Column) < 0) + Err_NotEnoughMemoryExit (); + + /***** Put hidden parameters *****/ + Par_PutHiddenParamUnsigned (NULL,"TTDay",Weekday); + Par_PutHiddenParamUnsigned (NULL,"TTInt",Interval); + Par_PutHiddenParamUnsigned (NULL,"TTCol",Column); + + /***** Class type *****/ + HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE, + "name=\"TTTyp\" class=\"Tmt_TYP\""); + for (CT = (Tmt_ClassType_t) 0; + CT <= (Tmt_ClassType_t) (Tmt_NUM_CLASS_TYPES - 1); + CT++) + if ((CT == Tmt_FREE) || + ((Timetable->View == Tmt_CRS_EDIT) && (CT == Tmt_LECTURE || CT == Tmt_PRACTICAL)) || + ((Timetable->View == Tmt_TUT_EDIT) && (CT == Tmt_TUTORING))) + HTM_OPTION (HTM_Type_STRING,Tmt_DB_ClassType[CT], + CT == ClassType,false, + "%s",Txt_TIMETABLE_CLASS_TYPES[CT]); + HTM_SELECT_End (); + + if (IntervalType == Tmt_FREE_INTERVAL) + { + for (i = Interval + 1; + i < Timetable->Config.IntervalsPerDay; + i++) + if (Tmt_TimeTable[Weekday][i].NumColumns == Tmt_MAX_COLUMNS_PER_CELL) + break; + MaxDuration = i - Interval; + Dur = (MaxDuration >= Timetable->Config.IntervalsPerHour) ? Timetable->Config.IntervalsPerHour : // MaxDuration >= 1h ==> Dur = 1h + MaxDuration; // MaxDuration < 1h ==> Dur = MaxDuration + if (asprintf (&TTDur,"%u:%02u", + (Dur / Timetable->Config.IntervalsPerHour), // Hours + (Dur % Timetable->Config.IntervalsPerHour) * + Timetable->Config.Range.MinutesPerInterval) < 0) // Minutes + Err_NotEnoughMemoryExit (); + Par_PutHiddenParamString (NULL,"TTDur",TTDur); + free (TTDur); + } + else + { + /***** Class duration *****/ + HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE, + "name=\"TTDur\" class=\"Tmt_DUR\""); + for (i = Interval + Tmt_TimeTable[Weekday][Interval].Columns[Column].DurationIntervals; + i < Timetable->Config.IntervalsPerDay; + i++) + if (Tmt_TimeTable[Weekday][i].NumColumns == Tmt_MAX_COLUMNS_PER_CELL) + break; + MaxDuration = i - Interval; + if (Tmt_TimeTable[Weekday][Interval].Columns[Column].DurationIntervals > MaxDuration) + MaxDuration = Tmt_TimeTable[Weekday][Interval].Columns[Column].DurationIntervals; + for (Dur = 0; + Dur <= MaxDuration; + Dur++) + { + if (asprintf (&TTDur,"%u:%02u", + (Dur / Timetable->Config.IntervalsPerHour), // Hours + (Dur % Timetable->Config.IntervalsPerHour) * + Timetable->Config.Range.MinutesPerInterval) < 0) // Minutes + Err_NotEnoughMemoryExit (); + HTM_OPTION (HTM_Type_STRING,TTDur, + Dur == DurationNumIntervals,false, + "%s",TTDur); + free (TTDur); + } + HTM_SELECT_End (); + + if (Timetable->View == Tmt_CRS_EDIT) + { + /***** Group *****/ + HTM_BR (); + HTM_LABEL_Begin ("for=\"TTGrp%s\"",CellStr); + HTM_Txt (Txt_Group); + HTM_LABEL_End (); + HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE, + "id=\"TTGrp%s\" name=\"TTGrp\"" + " class=\"Tmt_GRP\"", + CellStr); + HTM_OPTION (HTM_Type_STRING,"-1",GrpCod <= 0,false, + "%s",Txt_All_groups); + for (NumGrpTyp = 0; + NumGrpTyp < Gbl.Crs.Grps.GrpTypes.NumGrpTypes; + NumGrpTyp++) + { + GrpTyp = &Gbl.Crs.Grps.GrpTypes.LstGrpTypes[NumGrpTyp]; + + for (NumGrp = 0; + NumGrp < GrpTyp->NumGrps; + NumGrp++) + { + Grp = &GrpTyp->LstGrps[NumGrp]; + if (Grp->Room.RooCod > 0) + { + if (asprintf (&Room," (%s)",Grp->Room.ShrtName) < 0) + Err_NotEnoughMemoryExit (); + } + else + { + if (asprintf (&Room,"%s","") < 0) + Err_NotEnoughMemoryExit (); + } + HTM_OPTION (HTM_Type_LONG,&Grp->GrpCod, + GrpCod == Grp->GrpCod,false, + "%s %s%s", + GrpTyp->GrpTypName,Grp->GrpName,Room); + free (Room); + } + } + HTM_SELECT_End (); + + /***** Info *****/ + HTM_BR (); + HTM_LABEL_Begin ("for=\"TTInf%s\"",CellStr); + HTM_Txt (Txt_Info); + HTM_LABEL_End (); + HTM_INPUT_TEXT ("TTInf",Tmt_MAX_CHARS_INFO,Info ? Info : + "", + HTM_SUBMIT_ON_CHANGE, + "id=\"TTInf%s\" size=\"1\"" + " class=\"Tmt_INF %s\"", + CellStr,The_ClassInput[Gbl.Prefs.Theme]); + } + else // TimeTableView == Tmt_TUT_EDIT + { + /***** Info *****/ + HTM_BR (); + HTM_LABEL_Begin ("for=\"TTInf%s\" class=\"%s\"", + CellStr, + The_ClassDatSmall[Gbl.Prefs.Theme]); + HTM_Txt (Txt_Info); + HTM_LABEL_End (); + HTM_INPUT_TEXT ("TTInf",Tmt_MAX_CHARS_INFO,Info, + HTM_SUBMIT_ON_CHANGE, + "id=\"TTInf%s\" size=\"12\"" + " class=\"Tmt_INF %s\"", + CellStr,The_ClassInput[Gbl.Prefs.Theme]); + } + } + + /***** Free allocated unique string for this cell used in labels *****/ + free (CellStr); + + /***** End form *****/ + Frm_EndForm (); + }