diff --git a/swad_changelog.h b/swad_changelog.h
index 6fde66e06..801f71122 100644
--- a/swad_changelog.h
+++ b/swad_changelog.h
@@ -252,13 +252,14 @@
/****************************** Public constants *****************************/
/*****************************************************************************/
-#define Log_PLATFORM_VERSION "SWAD 17.7.1 (2017-09-23)"
+#define Log_PLATFORM_VERSION "SWAD 17.8 (2017-09-23)"
#define CSS_FILE "swad17.0.css"
#define JS_FILE "swad16.206.3.js"
// Number of lines (includes comments but not blank lines) has been got with the following command:
// nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*?.h sql/swad*.sql | tail -1
/*
+ Version 17.8: Sep 23, 2017 Projects can be ordered by start, end, title and department. (230963 lines)
Version 17.7.1: Sep 23, 2017 Changes in listing of projects. (230764 lines)
Version 17.7: Sep 23, 2017 Remove user from project. (230798 lines)
Version 17.6: Sep 22, 2017 Actions to remove user from project. (230559 lines)
diff --git a/swad_global.h b/swad_global.h
index 139886604..62ac77182 100644
--- a/swad_global.h
+++ b/swad_global.h
@@ -67,6 +67,7 @@
#include "swad_photo.h"
#include "swad_place.h"
#include "swad_plugin.h"
+#include "swad_project.h"
#include "swad_record.h"
#include "swad_search.h"
#include "swad_session.h"
@@ -574,7 +575,7 @@ struct Globals
bool LstIsRead; // Is the list already read from database, or it needs to be read?
unsigned Num; // Number of projects
long *LstPrjCods; // List of project codes
- Dat_StartEndTime_t SelectedOrder;
+ Prj_Order_t SelectedOrder;
long PrjCodToEdit; // Used as parameter in contextual links
unsigned CurrentPage;
} Prjs;
diff --git a/swad_project.c b/swad_project.c
index 59be84213..392ad4399 100644
--- a/swad_project.c
+++ b/swad_project.c
@@ -207,16 +207,14 @@ static void Prj_ShowAllProjects (void)
static void Prj_PutHeadForSeeing (bool PrintView)
{
- extern const char *Txt_START_END_TIME_HELP[Dat_NUM_START_END_TIME];
- extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME];
- extern const char *Txt_Project;
- extern const char *Txt_Department;
- Dat_StartEndTime_t Order;
+ extern const char *Txt_PROJECT_ORDER_HELP[Prj_NUM_ORDERS];
+ extern const char *Txt_PROJECT_ORDER[Prj_NUM_ORDERS];
+ Prj_Order_t Order;
fprintf (Gbl.F.Out,"
"
" | "); // Column for contextual icons
- for (Order = Dat_START_TIME;
- Order <= Dat_END_TIME;
+ for (Order = (Prj_Order_t) 0;
+ Order <= (Prj_Order_t) (Prj_NUM_ORDERS - 1);
Order++)
{
fprintf (Gbl.F.Out,"");
@@ -226,11 +224,11 @@ static void Prj_PutHeadForSeeing (bool PrintView)
Act_FormStart (ActSeePrj);
Pag_PutHiddenParamPagNum (Pag_PROJECTS,Gbl.Prjs.CurrentPage);
Par_PutHiddenParamUnsigned ("Order",(unsigned) Order);
- Act_LinkFormSubmit (Txt_START_END_TIME_HELP[Order],"TIT_TBL",NULL);
+ Act_LinkFormSubmit (Txt_PROJECT_ORDER_HELP[Order],"TIT_TBL",NULL);
if (Order == Gbl.Prjs.SelectedOrder)
fprintf (Gbl.F.Out,"");
}
- fprintf (Gbl.F.Out,"%s",Txt_START_END_TIME[Order]);
+ fprintf (Gbl.F.Out,"%s",Txt_PROJECT_ORDER[Order]);
if (!PrintView)
{
if (Order == Gbl.Prjs.SelectedOrder)
@@ -241,15 +239,6 @@ static void Prj_PutHeadForSeeing (bool PrintView)
fprintf (Gbl.F.Out," | ");
}
- fprintf (Gbl.F.Out,""
- "%s"
- " | "
- ""
- "%s"
- " | "
- "
",
- Txt_Project,
- Txt_Department);
}
/*****************************************************************************/
@@ -1045,10 +1034,10 @@ static bool Prj_CheckIfICanRemUsrFromPrj (void)
static void Prj_GetParamPrjOrder (void)
{
- Gbl.Prjs.SelectedOrder = (Dat_StartEndTime_t)
+ Gbl.Prjs.SelectedOrder = (Prj_Order_t)
Par_GetParToUnsignedLong ("Order",
0,
- Dat_NUM_START_END_TIME - 1,
+ Prj_NUM_ORDERS - 1,
(unsigned long) Prj_ORDER_DEFAULT);
}
@@ -1127,30 +1116,83 @@ void Prj_GetListProjects (void)
Prj_FreeListProjects ();
/***** Get list of projects from database *****/
- switch (Gbl.Usrs.Me.Role.Logged)
- {
- case Rol_TCH:
- case Rol_SYS_ADM:
- HiddenSubQuery[0] = '\0';
- break;
- default:
- sprintf (HiddenSubQuery," AND Hidden='N'");
- break;
- }
switch (Gbl.Prjs.SelectedOrder)
{
- case Dat_START_TIME:
- sprintf (OrderBySubQuery,"StartTime DESC,EndTime DESC,Title DESC");
+ case Prj_ORDER_START_TIME:
+ case Prj_ORDER_END_TIME:
+ case Prj_ORDER_TITLE:
+ /* Hidden subquery */
+ switch (Gbl.Usrs.Me.Role.Logged)
+ {
+ case Rol_TCH:
+ case Rol_SYS_ADM:
+ HiddenSubQuery[0] = '\0';
+ break;
+ default:
+ sprintf (HiddenSubQuery," AND Hidden='N'");
+ break;
+ }
+
+ /* Order subquery */
+ switch (Gbl.Prjs.SelectedOrder)
+ {
+ case Prj_ORDER_START_TIME:
+ sprintf (OrderBySubQuery,"StartTime DESC,"
+ "EndTime DESC,"
+ "Title");
+ break;
+ case Prj_ORDER_END_TIME:
+ sprintf (OrderBySubQuery,"EndTime DESC,"
+ "StartTime DESC,"
+ "Title");
+ break;
+ case Prj_ORDER_TITLE:
+ sprintf (OrderBySubQuery,"Title,"
+ "StartTime DESC,"
+ "EndTime DESC");
+ break;
+ case Prj_ORDER_DEPARTMENT: // Not applicable
+ break;
+ }
+
+ /* Query */
+ sprintf (Query,"SELECT PrjCod"
+ " FROM projects"
+ " WHERE CrsCod=%ld%s"
+ " ORDER BY %s",
+ Gbl.CurrentCrs.Crs.CrsCod,HiddenSubQuery,
+ OrderBySubQuery);
break;
- case Dat_END_TIME:
- sprintf (OrderBySubQuery,"EndTime DESC,StartTime DESC,Title DESC");
+ case Prj_ORDER_DEPARTMENT:
+ /* Hidden subquery */
+ switch (Gbl.Usrs.Me.Role.Logged)
+ {
+ case Rol_TCH:
+ case Rol_SYS_ADM:
+ HiddenSubQuery[0] = '\0';
+ break;
+ default:
+ sprintf (HiddenSubQuery," AND projects.Hidden='N'");
+ break;
+ }
+
+ /* Order subquery */
+ sprintf (OrderBySubQuery,"departments.FullName,"
+ "projects.StartTime DESC,"
+ "projects.EndTime DESC,"
+ "projects.Title");
+
+ /* Query */
+ sprintf (Query,"SELECT projects.PrjCod"
+ " FROM projects LEFT JOIN departments"
+ " ON projects.DptCod=departments.DptCod"
+ " WHERE projects.CrsCod=%ld%s"
+ " ORDER BY %s",
+ Gbl.CurrentCrs.Crs.CrsCod,HiddenSubQuery,
+ OrderBySubQuery);
break;
}
- sprintf (Query,"SELECT PrjCod"
- " FROM projects"
- " WHERE CrsCod=%ld%s"
- " ORDER BY %s",
- Gbl.CurrentCrs.Crs.CrsCod,HiddenSubQuery,OrderBySubQuery);
+
NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get projects");
if (NumRows) // Projects found...
diff --git a/swad_project.h b/swad_project.h
index 6d2d62b28..fedbbf4e6 100644
--- a/swad_project.h
+++ b/swad_project.h
@@ -72,7 +72,15 @@ struct Project
char URL[Cns_MAX_BYTES_WWW + 1];
};
-#define Prj_ORDER_DEFAULT Dat_START_TIME
+#define Prj_NUM_ORDERS 4
+typedef enum
+ {
+ Prj_ORDER_START_TIME = 0,
+ Prj_ORDER_END_TIME = 1,
+ Prj_ORDER_TITLE = 2,
+ Prj_ORDER_DEPARTMENT = 3,
+ } Prj_Order_t;
+#define Prj_ORDER_DEFAULT Prj_ORDER_START_TIME
/*****************************************************************************/
/***************************** Public prototypes *****************************/
diff --git a/swad_text.c b/swad_text.c
index 627819aec..3d96fab1c 100644
--- a/swad_text.c
+++ b/swad_text.c
@@ -30720,27 +30720,6 @@ const char *Txt_Private_available_to_certain_users_identified =
"Privado, disponível para alguns usuários identificados";
#endif
-const char *Txt_Project =
-#if L==1
- "Projecte";
-#elif L==2
- "Projekt";
-#elif L==3
- "Project";
-#elif L==4
- "Proyecto";
-#elif L==5
- "Projet";
-#elif L==6
- "Proyecto"; // Okoteve traducción
-#elif L==7
- "Progetto";
-#elif L==8
- "Projekt";
-#elif L==9
- "Projeto";
-#endif
-
const char *Txt_Project_data =
#if L==1
"Dades del projecte";
@@ -30825,6 +30804,180 @@ const char *Txt_Project_members =
"Membros do projeto";
#endif
+const char *Txt_PROJECT_ORDER[Prj_NUM_ORDERS] =
+ {
+ // Prj_ORDER_START_TIME
+#if L==1
+ "Inici"
+#elif L==2
+ "Start"
+#elif L==3
+ "Start"
+#elif L==4
+ "Inicio"
+#elif L==5
+ "Début"
+#elif L==6
+ "Ñepyrũ"
+#elif L==7
+ "Inizio"
+#elif L==8
+ "Początek"
+#elif L==9
+ "Início"
+#endif
+ ,
+ // Prj_ORDER_END_TIME
+#if L==1
+ "Final"
+#elif L==2
+ "Ende"
+#elif L==3
+ "End"
+#elif L==4
+ "Final"
+#elif L==5
+ "Fin"
+#elif L==6
+ "Paha"
+#elif L==7
+ "Fine"
+#elif L==8
+ "Koniec"
+#elif L==9
+ "Fim"
+#endif
+ ,
+ // Prj_ORDER_TITLE
+#if L==1
+ "Projecte"
+#elif L==2
+ "Projekt"
+#elif L==3
+ "Project"
+#elif L==4
+ "Proyecto"
+#elif L==5
+ "Projet"
+#elif L==6
+ "Proyecto" // Okoteve traducción
+#elif L==7
+ "Progetto"
+#elif L==8
+ "Projekt"
+#elif L==9
+ "Projeto"
+#endif
+ ,
+ // Prj_ORDER_DEPARTMENT
+#if L==1
+ "Departament"
+#elif L==2
+ "Abteilung"
+#elif L==3
+ "Department"
+#elif L==4
+ "Departamento"
+#elif L==5
+ "Département"
+#elif L==6
+ "Pehẽ"
+#elif L==7
+ "Dipartimento"
+#elif L==8
+ "Wydział"
+#elif L==9
+ "Departamento"
+#endif
+ };
+
+const char *Txt_PROJECT_ORDER_HELP[Prj_NUM_ORDERS] =
+ {
+ // Prj_ORDER_START_TIME
+#if L==1
+ "Ordenar per data de començament"
+#elif L==2
+ "Sortieren nach Startdatum"
+#elif L==3
+ "Sort by start date"
+#elif L==4
+ "Ordenar por fecha de comienzo"
+#elif L==5
+ "Trier par date de début"
+#elif L==6
+ "Ordenar por fecha de comienzo" // Okoteve traducción
+#elif L==7
+ "Ordina per data di inizio"
+#elif L==8
+ "Sortuj wedlug daty rozpoczecia"
+#elif L==9
+ "Classificar por data de início"
+#endif
+ ,
+ // Prj_ORDER_END_TIME
+#if L==1
+ "Ordenar per data de finalització"
+#elif L==2
+ "Sortieren nach Enddatum"
+#elif L==3
+ "Sort by end date"
+#elif L==4
+ "Ordenar por fecha de finalización"
+#elif L==5
+ "Trier par date de fin"
+#elif L==6
+ "Ordenar por fecha de finalización" // Okoteve traducción
+#elif L==7
+ "Ordina per data di fine"
+#elif L==8
+ "Sortuj wedlug daty zakonczenia"
+#elif L==9
+ "Classificar por data de término"
+#endif
+ ,
+ // Prj_ORDER_TITLE
+#if L==1
+ "Ordenar per títol"
+#elif L==2
+ "Sortieren nach Titel"
+#elif L==3
+ "Sort by title"
+#elif L==4
+ "Ordenar por título"
+#elif L==5
+ "Trier par date de début"
+#elif L==6
+ "Ordenar por título" // Okoteve traducción
+#elif L==7
+ "Ordina per titolo"
+#elif L==8
+ "Sortuj wedlug tytuł"
+#elif L==9
+ "Classificar por título"
+#endif
+ ,
+ // Prj_ORDER_DEPARTMENT
+#if L==1
+ "Ordenar per departament"
+#elif L==2
+ "Sortieren nach Abteilung"
+#elif L==3
+ "Sort by department"
+#elif L==4
+ "Ordenar por departamento"
+#elif L==5
+ "Trier par département"
+#elif L==6
+ "Ordenar por departamento" // Okoteve traducción
+#elif L==7
+ "Ordina per dipartimento"
+#elif L==8
+ "Sortuj wedlug wydział"
+#elif L==9
+ "Classificar por departamento"
+#endif
+ };
+
const char *Txt_Project_X_removed = // Warning: it is very important to include %s in the following sentences
#if L==1
"Projecte %s eliminat.";