| author | ymh <ymh.work@gmail.com> |
| Tue, 23 Apr 2013 16:54:18 +0200 | |
| branch | user_management |
| changeset 215 | a282eebbc5e0 |
| parent 214 | ff3b21d62eb8 |
| child 216 | fdc74162bef1 |
--- a/.classpath Tue May 14 14:10:23 2013 +0200 +++ b/.classpath Tue Apr 23 16:54:18 2013 +0200 @@ -67,7 +67,7 @@ <attribute name="org.eclipse.jst.component.nondependency" value=""/> </attributes> </classpathentry> - <classpathentry kind="var" path="M2_REPO/org/mongodb/mongo-java-driver/2.10.1/mongo-java-driver-2.10.1.jar" sourcepath="M2_REPO/org/mongodb/mongo-java-driver/2.10.1/mongo-java-driver-2.10.1-sources.jar"> + <classpathentry kind="var" path="M2_REPO/org/mongodb/mongo-java-driver/2.11.0/mongo-java-driver-2.11.0.jar" sourcepath="M2_REPO/org/mongodb/mongo-java-driver/2.10.1/mongo-java-driver-2.10.1-sources.jar"> <attributes> <attribute name="javadoc_location" value="jar:file:/Users/ymh/.m2/repository/org/mongodb/mongo-java-driver/2.10.1/mongo-java-driver-2.10.1-javadoc.jar!/"/> <attribute name="org.eclipse.jst.component.nondependency" value=""/> @@ -195,7 +195,7 @@ <attribute name="org.eclipse.jst.component.nondependency" value=""/> </attributes> </classpathentry> - <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"> <attributes> <attribute name="owner.project.facets" value="java"/> </attributes>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/README.md Tue Apr 23 16:54:18 2013 +0200 @@ -0,0 +1,7 @@ +Dependencies + +- Icon user from echo-icon-theme (echo) (Open Icon Library - http://openiconlibrary.sourceforge.net/) +licence CC BY-SA - Creative Commons + +- cf pom.xml for dependencies +
--- a/server/pom.xml Tue May 14 14:10:23 2013 +0200 +++ b/server/pom.xml Tue Apr 23 16:54:18 2013 +0200 @@ -13,6 +13,7 @@ <cowebx-version>1.0</cowebx-version> <jersey-version>1.17.1</jersey-version> <spring-version>3.2.1.RELEASE</spring-version> + <spring-data-mongodb-version>1.2.0.RELEASE</spring-data-mongodb-version> <spring-security-version>3.1.3.RELEASE</spring-security-version> <jetty-version>8.1.10.v20130312</jetty-version> <junit-version>4.10</junit-version> @@ -21,6 +22,7 @@ <cometd-version>2.5.1</cometd-version> <jackson-version>2.1.4</jackson-version> <joda-version>2.1</joda-version> + <mongo-driver-version>2.11.0</mongo-driver-version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> @@ -125,6 +127,11 @@ <artifactId>maven-surefire-plugin</artifactId> <version>${surefire-version}</version> </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <version>2.4</version> + </plugin> </plugins> </build> <repositories> @@ -238,7 +245,7 @@ <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> - <version>2.10.1</version> + <version>${mongo-driver-version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> @@ -284,7 +291,7 @@ <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> - <version>1.2.0.RELEASE</version> + <version>${spring-data-mongodb-version}</version> </dependency> <dependency> <groupId>javax.persistence</groupId>
--- a/server/src/main/java/org/iri_research/renkan/Constants.java Tue May 14 14:10:23 2013 +0200 +++ b/server/src/main/java/org/iri_research/renkan/Constants.java Tue Apr 23 16:54:18 2013 +0200 @@ -49,6 +49,7 @@ public final static int PAGINATION_SIZE = 10; public final static String PROPERTIES_SERVLET_CONTEXT_NAME = "renkan.properties"; public final static String PROPERTIES_CLASSPATH_NAME = "renkan_run.properties"; + public final static String ANONYMOUS_USER_BASE_NAME = "Anonymous"; private final static EthernetAddress ETHERNET_ADRESS = EthernetAddress.fromInterface(); public final static NoArgGenerator UUID_GENERATOR = Generators.timeBasedGenerator(ETHERNET_ADRESS);
--- a/server/src/main/java/org/iri_research/renkan/controller/AdminController.java Tue May 14 14:10:23 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,195 +0,0 @@ -package org.iri_research.renkan.controller; - -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; -import java.util.Arrays; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -import org.apache.commons.codec.binary.Hex; -import org.iri_research.renkan.Constants; -import org.iri_research.renkan.RenkanException; -import org.iri_research.renkan.forms.SpaceForm; -import org.iri_research.renkan.forms.SpaceFormValidator; -import org.iri_research.renkan.models.Space; -import org.iri_research.renkan.repositories.ProjectsRepository; -import org.iri_research.renkan.repositories.SpacesRepository; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort.Direction; -import org.springframework.data.web.PageableDefaults; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.validation.BindingResult; -import org.springframework.web.bind.WebDataBinder; -import org.springframework.web.bind.annotation.InitBinder; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.client.HttpClientErrorException; - -@Controller -@RequestMapping("/admin") -public class AdminController { - - private final Logger logger = LoggerFactory.getLogger(AdminController.class); - - @Autowired - private SpacesRepository spacesRepository; - @Autowired - private ProjectsRepository projectsRepository; - - @InitBinder(value={"space"}) - protected void initBinder(WebDataBinder binder) { - binder.setValidator(new SpaceFormValidator()); - } - - @RequestMapping(value="", method = RequestMethod.GET, produces={"text/html;charset=UTF-8"}) - public String adminIndex() { - - return "admin/adminIndex"; - } - - @RequestMapping(value="/spaces", method = RequestMethod.GET, produces={"text/html;charset=UTF-8"}) - public String spacesList( - Model model, - @PageableDefaults(sort={"created"}, sortDir=Direction.DESC, pageNumber=0, value=Constants.PAGINATION_SIZE) Pageable p, - HttpServletRequest request) { - - Page<Space> page = this.spacesRepository.findAll(p); - - model.addAttribute("page", page); - model.addAttribute("baseUrl", Utils.buildBaseUrl(request)); - model.addAttribute("projectsCount", this.projectsRepository.getCountBySpace()); - - return "admin/spacesList"; - } - - @RequestMapping(value="/spaces/edit/", method = RequestMethod.GET, produces={"text/html;charset=UTF-8"}) - public String editSpace(Model model) { - return editSpace(model, null); - } - - @RequestMapping(value="/spaces/edit/{spaceId}", method = RequestMethod.GET, produces={"text/html;charset=UTF-8"}) - public String editSpace(Model model, @PathVariable(value="spaceId") String spaceId) { - - SpaceForm spaceForm = null; - - if(spaceId == null || spaceId.length() == 0 || "_".equals(spaceId)) { - spaceForm = new SpaceForm(); - } - else { - Space space = this.spacesRepository.findOne(spaceId); - if(space == null) { - throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "space " + spaceId + " not found"); - } - spaceForm = new SpaceForm(space); - } - - model.addAttribute("space", spaceForm); - - return "admin/spaceEdit"; - } - - - @RequestMapping(value="/spaces/save", method = RequestMethod.POST) - public String saveSpace(Model model, @ModelAttribute("space") @Valid SpaceForm spaceForm, BindingResult bindingResult) { - - logger.debug("space title " + spaceForm.getTitle()); - logger.debug("space description " + spaceForm.getDescription()); - - if(bindingResult.hasErrors()) { - return "admin/spaceEdit"; - } - - spaceForm.setSpacesRepository(spacesRepository); - - try { - spaceForm.save(); - } catch (RenkanException e) { - throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "space " + spaceForm.getId() + " not found"); - } - - return "redirect:/admin/spaces"; - } - - //@RequestMapping(value="/spaces/confirmdelete/{spaceId}", method = RequestMethod.GET) - //public String askDeleteSpace(Model model, @PathVariable(value="spaceId") String spaceId) { - - - //} - - @RequestMapping(value="/spaces/delete/{spaceId}") - public String deleteSpace( - HttpServletRequest request, - Model model, - @PathVariable(value="spaceId") String spaceId, - @RequestParam(value="key", required=false) String key, - @RequestParam(value="salt", required=false) String salt) throws NoSuchAlgorithmException, RenkanException - { - - if(spaceId == null || spaceId.length() == 0) { - throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Null or empty space id"); - } - - RequestMethod method = RequestMethod.valueOf(request.getMethod()); - - Map<String, Integer> nbProj = this.projectsRepository.getCountBySpace(Arrays.asList(spaceId)); - if(nbProj.containsKey(spaceId) && nbProj.get(spaceId).intValue()>0) { - throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "This space have projects"); - } - - if(RequestMethod.GET.equals(method)) { - - Space space = this.spacesRepository.findOne(spaceId); - - if(space == null) { - throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "space " + spaceId + " not found"); - } - - SecureRandom rand = SecureRandom.getInstance("SHA1PRNG"); - rand.setSeed(System.currentTimeMillis()); - byte[] rawSalt = new byte[50]; - rand.nextBytes(rawSalt); - String newSalt = Hex.encodeHexString(rawSalt); - - - model.addAttribute("spaceObj", space); - model.addAttribute("salt", newSalt); - model.addAttribute("key", space.getKey(newSalt)); - - return "admin/spaceDeleteConfirm"; - } - else if (RequestMethod.POST.equals(method) && key != null && !key.isEmpty() && salt != null && !salt.isEmpty()) { - - if(spaceId != null && spaceId.length() > 0) { - - Space space = this.spacesRepository.findOne(spaceId); - if(space != null) { - if(space.checkKey(key, salt)) { - this.spacesRepository.delete(spaceId); - } - else { - throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Key not ckecked"); - } - } - - } - return "redirect:/admin/spaces"; - - } - else { - throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Bad request method or parameters"); - } - - } - -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/src/main/java/org/iri_research/renkan/controller/admin/AdminController.java Tue Apr 23 16:54:18 2013 +0200 @@ -0,0 +1,23 @@ +package org.iri_research.renkan.controller.admin; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Controller +@RequestMapping("/admin") +public class AdminController { + + + @SuppressWarnings("unused") + private final Logger logger = LoggerFactory.getLogger(AdminController.class); + + @RequestMapping(value="", method = RequestMethod.GET, produces={"text/html;charset=UTF-8"}) + public String adminIndex() { + + return "admin/adminIndex"; + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/src/main/java/org/iri_research/renkan/controller/admin/SpacesAdminController.java Tue Apr 23 16:54:18 2013 +0200 @@ -0,0 +1,184 @@ +package org.iri_research.renkan.controller.admin; + +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Arrays; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; + +import org.apache.commons.codec.binary.Hex; +import org.iri_research.renkan.Constants; +import org.iri_research.renkan.RenkanException; +import org.iri_research.renkan.controller.Utils; +import org.iri_research.renkan.forms.SpaceForm; +import org.iri_research.renkan.forms.SpaceFormValidator; +import org.iri_research.renkan.models.Space; +import org.iri_research.renkan.repositories.ProjectsRepository; +import org.iri_research.renkan.repositories.SpacesRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort.Direction; +import org.springframework.data.web.PageableDefaults; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.client.HttpClientErrorException; + +@Controller +@RequestMapping("/admin/spaces") +public class SpacesAdminController { + + private final Logger logger = LoggerFactory.getLogger(SpacesAdminController.class); + + @Autowired + private SpacesRepository spacesRepository; + @Autowired + private ProjectsRepository projectsRepository; + + @InitBinder(value={"space"}) + protected void initBinder(WebDataBinder binder) { + binder.setValidator(new SpaceFormValidator()); + } + + @RequestMapping(value="/", method = RequestMethod.GET, produces={"text/html;charset=UTF-8"}) + public String spacesList( + Model model, + @PageableDefaults(sort={"created"}, sortDir=Direction.DESC, pageNumber=0, value=Constants.PAGINATION_SIZE) Pageable p, + HttpServletRequest request) { + + Page<Space> page = this.spacesRepository.findAll(p); + + model.addAttribute("page", page); + model.addAttribute("baseUrl", Utils.buildBaseUrl(request)); + model.addAttribute("projectsCount", this.projectsRepository.getCountBySpace()); + + return "admin/spacesList"; + } + + @RequestMapping(value="/edit/", method = RequestMethod.GET, produces={"text/html;charset=UTF-8"}) + public String editSpace(Model model) { + return editSpace(model, null); + } + + @RequestMapping(value="/edit/{spaceId}", method = RequestMethod.GET, produces={"text/html;charset=UTF-8"}) + public String editSpace(Model model, @PathVariable(value="spaceId") String spaceId) { + + SpaceForm spaceForm = null; + + if(spaceId == null || spaceId.length() == 0 || "_".equals(spaceId)) { + spaceForm = new SpaceForm(); + } + else { + Space space = this.spacesRepository.findOne(spaceId); + if(space == null) { + throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "space " + spaceId + " not found"); + } + spaceForm = new SpaceForm(space); + } + + model.addAttribute("space", spaceForm); + + return "admin/spaceEdit"; + } + + + @RequestMapping(value="/save", method = RequestMethod.POST) + public String saveSpace(Model model, @ModelAttribute("space") @Valid SpaceForm spaceForm, BindingResult bindingResult) { + + logger.debug("space title " + spaceForm.getTitle()); + logger.debug("space description " + spaceForm.getDescription()); + + if(bindingResult.hasErrors()) { + return "admin/spaceEdit"; + } + + spaceForm.setSpacesRepository(spacesRepository); + + try { + spaceForm.save(); + } catch (RenkanException e) { + throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "space " + spaceForm.getId() + " not found"); + } + + return "redirect:/admin/spaces"; + } + + @RequestMapping(value="/delete/{spaceId}") + public String deleteSpace( + HttpServletRequest request, + Model model, + @PathVariable(value="spaceId") String spaceId, + @RequestParam(value="key", required=false) String key, + @RequestParam(value="salt", required=false) String salt) throws NoSuchAlgorithmException, RenkanException + { + + if(spaceId == null || spaceId.length() == 0) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Null or empty space id"); + } + + RequestMethod method = RequestMethod.valueOf(request.getMethod()); + + Map<String, Integer> nbProj = this.projectsRepository.getCountBySpace(Arrays.asList(spaceId)); + if(nbProj.containsKey(spaceId) && nbProj.get(spaceId).intValue()>0) { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "This space have projects"); + } + + if(RequestMethod.GET.equals(method)) { + + Space space = this.spacesRepository.findOne(spaceId); + + if(space == null) { + throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "space " + spaceId + " not found"); + } + + SecureRandom rand = SecureRandom.getInstance("SHA1PRNG"); + rand.setSeed(System.currentTimeMillis()); + byte[] rawSalt = new byte[50]; + rand.nextBytes(rawSalt); + String newSalt = Hex.encodeHexString(rawSalt); + + + model.addAttribute("spaceObj", space); + model.addAttribute("salt", newSalt); + model.addAttribute("key", space.getKey(newSalt)); + + return "admin/spaceDeleteConfirm"; + } + else if (RequestMethod.POST.equals(method) && key != null && !key.isEmpty() && salt != null && !salt.isEmpty()) { + + if(spaceId != null && spaceId.length() > 0) { + + Space space = this.spacesRepository.findOne(spaceId); + if(space != null) { + if(space.checkKey(key, salt)) { + this.spacesRepository.delete(spaceId); + } + else { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Key not ckecked"); + } + } + + } + return "redirect:/admin/spaces"; + + } + else { + throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Bad request method or parameters"); + } + + } + +}
--- a/server/src/main/java/org/iri_research/renkan/coweb/RenkanSessionModerator.java Tue May 14 14:10:23 2013 +0200 +++ b/server/src/main/java/org/iri_research/renkan/coweb/RenkanSessionModerator.java Tue Apr 23 16:54:18 2013 +0200 @@ -123,7 +123,7 @@ return; } for (RosterUser rosterUser : r_user_list) { - if( rosterUser.getClient_id().equals(clientId)) { + if( rosterUser.getClientId().equals(clientId)) { r_user_list.remove(rosterUser); } }
--- a/server/src/main/java/org/iri_research/renkan/coweb/event/UserSyncEventManager.java Tue May 14 14:10:23 2013 +0200 +++ b/server/src/main/java/org/iri_research/renkan/coweb/event/UserSyncEventManager.java Tue Apr 23 16:54:18 2013 +0200 @@ -1,5 +1,6 @@ package org.iri_research.renkan.coweb.event; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -8,6 +9,7 @@ import org.coweb.CowebException; import org.iri_research.renkan.models.Project; +import org.iri_research.renkan.models.RenkanUser; import org.iri_research.renkan.models.User; import org.iri_research.renkan.repositories.IRenkanRepository; import org.iri_research.renkan.repositories.UsersRepository; @@ -56,7 +58,7 @@ color = UserSyncEventManager.DEFAULT_COLOR; } - User user = new User(user_id, (String)values.get("title"), (String)values.get("description"), (String)values.get("uri"), color, project_id); + User user = new User(user_id, (String)values.get("title"), (String)values.get("description"), (String)values.get("uri"), color); Integer position = (Integer)data.get("position"); @@ -64,7 +66,8 @@ throw new CowebException("node insert: bad insert position", String.format("Bad position %s not found", position==null?"null":position.toString())); } int index = position.intValue(); - List<User> users = project.getUsers(); + //TODO: correct this. done that to compile + List<User> users = new ArrayList<User>();//project.getUsers(); if(index > users.size()) { index = users.size(); } @@ -82,7 +85,9 @@ @Override protected List<User> getObjectList(Project project) { - return project.getUsers(); + //TODO: correct this, this is wrong, just put here to cpmpile + return null; + //return project.getUsers(); } }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/src/main/java/org/iri_research/renkan/management/MigrateRenkanUser.java Tue Apr 23 16:54:18 2013 +0200 @@ -0,0 +1,72 @@ +package org.iri_research.renkan.management; + +import org.iri_research.renkan.models.Project; +import org.iri_research.renkan.models.RenkanUser; +import org.iri_research.renkan.models.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.stereotype.Component; + +import com.mongodb.BasicDBObject; +import com.mongodb.DBCollection; +import com.mongodb.DBObject; +import com.mongodb.WriteConcern; + +@Component +public class MigrateRenkanUser { + + public static void main(String[] args) { + + @SuppressWarnings("resource") + ApplicationContext context = new ClassPathXmlApplicationContext("classpath:WEB-INF/applicationContext.xml"); + + MigrateRenkanUser p = context.getBean(MigrateRenkanUser.class); + p.start(args); + + } + + @Autowired + private MongoTemplate template; + + private void start(String[] args) { + + DBCollection userColl = template.getCollection(template.getCollectionName(User.class)); + DBCollection renkanUserColl = template.getCollection(template.getCollectionName(RenkanUser.class)); + DBCollection projectColl = template.getCollection(template.getCollectionName(Project.class)); + + for (DBObject user: userColl.find()) { + if(!user.containsField("project_id")) { + continue; + } + String projectId = (String) user.get("project_id"); + if(projectId == null || projectId.isEmpty()) { + user.removeField("project_id"); + userColl.save(user); + continue; + } + DBObject proj = new BasicDBObject(); + proj.put("_id", projectId); + if(projectColl.findOne(proj) != null) { + DBObject renkanUser = new BasicDBObject(); + renkanUser.put("project_id", projectId); + renkanUser.put("user_id", user.get("_id")); + if(renkanUserColl.findOne(renkanUser) == null) { + System.out.println(String.format("%s : %s : %s", user.get("_id"),user.get("title"),user.get("project_id"))); + renkanUser = new BasicDBObject(); + renkanUser.put("project_id", user.get("project_id")); + renkanUser.put("user_id", user.get("_id")); + renkanUser.put("color", user.get("color")); + renkanUserColl.insert(renkanUser); + } + user.removeField("project_id"); + userColl.save(user); + } + else { + userColl.remove(user, WriteConcern.ACKNOWLEDGED); + } + } + + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/src/main/java/org/iri_research/renkan/models/Group.java Tue Apr 23 16:54:18 2013 +0200 @@ -0,0 +1,14 @@ +package org.iri_research.renkan.models; + +import org.springframework.data.mongodb.core.mapping.Document; + +@Document(collection="groups") +public class Group extends AbstractRenkanModel<String> { + + public String getGroupName() { + return this.getTitle(); + } + + + +}
--- a/server/src/main/java/org/iri_research/renkan/models/Project.java Tue May 14 14:10:23 2013 +0200 +++ b/server/src/main/java/org/iri_research/renkan/models/Project.java Tue Apr 23 16:54:18 2013 +0200 @@ -14,6 +14,7 @@ import org.apache.commons.codec.binary.Hex; import org.iri_research.renkan.Constants; import org.iri_research.renkan.Constants.EditMode; +import org.iri_research.renkan.utils.ColorGenerator; import org.iri_research.renkan.RenkanException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,8 +51,7 @@ private List<Edge> edges = new ArrayList<Edge>(); // Users - @DBRef - private List<User> users = new ArrayList<User>(); + private List<RenkanUser> users = new ArrayList<RenkanUser>(); public Project(Project project) { @@ -67,8 +67,8 @@ for (Edge edge : project.edges) { this.edges.add(new Edge(edge, nodeCloneMap.get(edge.getFrom()), nodeCloneMap.get(edge.getTo()), this.id)); } - for(User user : project.users) { - this.users.add(user); + for(RenkanUser user : project.users) { + this.users.add(new RenkanUser(user)); } } @@ -105,7 +105,7 @@ return this.edges; } - public List<User> getUsers() { + public List<RenkanUser> getUsers() { return this.users; } @@ -183,4 +183,62 @@ this.updated = updated; } + public void addUser(User user) { + + if(user == null) { + // we add an anonymous user + // find an unique user name + this.addUser(null, null); + } + else { + // if user is already in list do nothing + for (RenkanUser renkanUser : this.users) { + if(renkanUser.getUserId() != null && renkanUser.getUserId().equals(user.getId())) { + return; + } + } + // user not found + this.users.add(new RenkanUser(this.getId(), user.getId(), user.getColor(), user.getUsername())); + + } + + } + + public void addUser(String username, String color) { + + if(username == null) { + //find a new username + int i = 0; + boolean usernameFound = true; + while(i++<1000000 && usernameFound) { + username = String.format("%s-%s", Constants.ANONYMOUS_USER_BASE_NAME, i); + usernameFound = false; + for(RenkanUser renkanUser : this.users) { + if(username.equals(renkanUser.getUsername())) { + usernameFound = true; + break; + } + } + } + } + + if(color == null) { + int i=0; + boolean colorFound = true; + while(i++<10000000 && colorFound) { + color = "#" + ColorGenerator.randomColorHex(); + colorFound = false; + for(RenkanUser renkanUser : this.users) { + if(username.equals(renkanUser.getUsername())) { + colorFound = true; + break; + } + } + } + } + + RenkanUser ruser = new RenkanUser(this.getId(), null, color, username); + this.users.add(ruser); + } + }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/src/main/java/org/iri_research/renkan/models/RenkanUser.java Tue Apr 23 16:54:18 2013 +0200 @@ -0,0 +1,63 @@ +package org.iri_research.renkan.models; + +import org.springframework.data.mongodb.core.mapping.Field; + + +public class RenkanUser { + + @Field(value="user_id") + private String userId; + private String color; + private String username; + + + @SuppressWarnings("unused") + private RenkanUser() { + } + + public RenkanUser(String projectId, String userId, String color, + String username) { + this.userId = userId; + this.color = color; + this.username = username; + } + + public RenkanUser(RenkanUser user) { + if(user != null) { + this.setUserId(user.getUserId()); + this.setColor(user.getColor()); + this.setUsername(user.getUsername()); + } + } + + @Field(value="user_id") + public String getUserId() { + return userId; + } + + @Field(value="user_id") + public void setUserId(String userId) { + this.userId = userId; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public boolean isAnonymous() { + return this.getUserId() == null; + } + +}
--- a/server/src/main/java/org/iri_research/renkan/models/RosterUser.java Tue May 14 14:10:23 2013 +0200 +++ b/server/src/main/java/org/iri_research/renkan/models/RosterUser.java Tue Apr 23 16:54:18 2013 +0200 @@ -1,17 +1,19 @@ package org.iri_research.renkan.models; +import com.fasterxml.jackson.annotation.JsonProperty; + public class RosterUser extends AbstractRenkanModel<String> { - private String project_id; - private Long site_id; - private String client_id; + private String projectId; + private Long siteId; + private String clientId; public RosterUser(String id, String title, String description, String uri, String color, String project_id, Long site_id, String client_id) { super(id, title, description, uri, color); - this.project_id = project_id; - this.site_id = site_id; - this.client_id = client_id; + this.projectId = project_id; + this.siteId = site_id; + this.clientId = client_id; } public void setTitle(String title) { @@ -30,16 +32,19 @@ this.color = color; } - public String getProject_id() { - return project_id; + @JsonProperty(value="project_id") + public String getProjectId() { + return projectId; } - public Long getSite_id() { - return site_id; + @JsonProperty(value="site_id") + public Long getSiteId() { + return siteId; } - public String getClient_id() { - return client_id; + @JsonProperty(value="client_id") + public String getClientId() { + return clientId; }
--- a/server/src/main/java/org/iri_research/renkan/models/User.java Tue May 14 14:10:23 2013 +0200 +++ b/server/src/main/java/org/iri_research/renkan/models/User.java Tue Apr 23 16:54:18 2013 +0200 @@ -1,24 +1,86 @@ package org.iri_research.renkan.models; +import java.util.Collection; +import java.util.Date; + import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.Field; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; @Document(collection="users") -public class User extends AbstractRenkanModel<String> { +public class User extends AbstractRenkanModel<String> implements UserDetails { + + private static final long serialVersionUID = 6972038893086220548L; - private String project_id; + private String email; + private String password; + private String salt; + private String avatar; + private boolean enabled; + private boolean locked; + + @Field("expiration_date") + private Date expirationDate; + + @Field("credentials_expiration_date") + private Date credentialExpirationDate; - public User(String id, String title, String description, String uri, String color, String project_id) { + public User(String id, String title, String description, String uri, String color) { super(id, title, description, uri, color); - - this.project_id = project_id; } public String getColor() { return this.color; } - public String getProject_id() { - return project_id; + @Override + public Collection<? extends GrantedAuthority> getAuthorities() { + // TODO Auto-generated method stub + return null; + } + + @Override + @JsonIgnore + public String getPassword() { + return this.password; + } + + @Override + @JsonIgnore + public String getUsername() { + return this.title; + } + + @Override + public boolean isAccountNonExpired() { + return this.expirationDate == null || this.expirationDate.after(new Date()); + } + + @Override + public boolean isAccountNonLocked() { + return !this.locked; + } + + @Override + public boolean isCredentialsNonExpired() { + return this.credentialExpirationDate == null || this.credentialExpirationDate.after(new Date()); + } + + @Override + public boolean isEnabled() { + return this.enabled; + } + + public String getEmail() { + return email; + } + + public String getAvatar() { + return avatar; } }
--- a/server/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryCustom.java Tue May 14 14:10:23 2013 +0200 +++ b/server/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryCustom.java Tue Apr 23 16:54:18 2013 +0200 @@ -10,6 +10,11 @@ public int getRevCounter(String projectId); public Map<String, Integer> getCountBySpace(); public Map<String, Integer> getCountBySpace(Collection<String> spaceIds); + + public Map<String, Integer> getCountByUser(); + public Map<String, Integer> getCountByUser(Collection<String> userIds); + public Map<String, Integer> getCountByUsername(); + public Map<String, Integer> getCountByUsername(Collection<String> usernames); public void deleteRecursive(String projectId); public void deleteRecursive(Project project);
--- a/server/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryImpl.java Tue May 14 14:10:23 2013 +0200 +++ b/server/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryImpl.java Tue Apr 23 16:54:18 2013 +0200 @@ -5,8 +5,13 @@ import java.util.HashMap; import java.util.Map; +import org.eclipse.jetty.util.component.AggregateLifeCycle; +import org.iri_research.renkan.RenkanProperties; import org.iri_research.renkan.models.Project; import org.iri_research.renkan.models.ProjectRevision; +import org.iri_research.renkan.models.RenkanUser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.stereotype.Component; @@ -18,9 +23,15 @@ import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Update; +import com.mongodb.AggregationOutput; +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; + @Component public class ProjectsRepositoryImpl implements ProjectsRepositoryCustom { + private final Logger logger = LoggerFactory.getLogger(ProjectsRepositoryImpl.class); + @Autowired private ProjectsRepository projectsRepository; @@ -34,10 +45,15 @@ private ProjectRevisionsRepository projectRevisionsRepository; - private class GroupResult { + private class GroupSpaceResult { public String space_id; public int count; } + + private class GroupUsernameResult { + public String username; + public int count; + } @Autowired private MongoTemplate mongoTemplate; @@ -62,14 +78,14 @@ filter = Criteria.where("space_id").in(spaceIds); } - GroupByResults<GroupResult> groupResult = this.mongoTemplate.group( + GroupByResults<GroupSpaceResult> groupResult = this.mongoTemplate.group( filter, this.mongoTemplate.getCollectionName(Project.class), GroupBy.key("space_id").initialDocument("{ count: 0 }").reduceFunction("function(doc, prev) { prev.count += 1; }"), - GroupResult.class); + GroupSpaceResult.class); HashMap<String, Integer> res = new HashMap<>(); - for (GroupResult gr : groupResult) { + for (GroupSpaceResult gr : groupResult) { res.put(gr.space_id, new Integer(gr.count)); } @@ -123,4 +139,49 @@ this.projectsRepository.delete(p); } } + + + @Override + public Map<String, Integer> getCountByUser() { + return getCountByUser(null); + } + + + @Override + public Map<String, Integer> getCountByUser(Collection<String> userIds) { + + Criteria filter = null; + + if(userIds != null) { + filter = Criteria.where("users.user_id").in(userIds); + } + + DBObject projectOp = new BasicDBObject("$project", new BasicDBObject("users", 1)); + DBObject unwindOp = new BasicDBObject("$unwind","$users"); + DBObject groupOpFields = new BasicDBObject("_id", "$users.user_id"); + groupOpFields.put("count", new BasicDBObject("$sum", 1)); + DBObject groupOp = new BasicDBObject("$group",groupOpFields); + + AggregationOutput output = this.projectsRepository.getCollection().aggregate(projectOp, unwindOp, groupOp); + HashMap<String, Integer> res = new HashMap<>(); + + for (DBObject groupRes : output.results()) { + res.put((String)groupRes.get("_id"), (Integer)groupRes.get("count")); + } + + return res; + } + + + @Override + public Map<String, Integer> getCountByUsername() { + return this.getCountByUsername(null); + } + + + @Override + public Map<String, Integer> getCountByUsername(Collection<String> usernames) { + // TODO Auto-generated method stub + return null; + } }
--- a/server/src/main/java/org/iri_research/renkan/repositories/UsersRepository.java Tue May 14 14:10:23 2013 +0200 +++ b/server/src/main/java/org/iri_research/renkan/repositories/UsersRepository.java Tue Apr 23 16:54:18 2013 +0200 @@ -1,7 +1,14 @@ package org.iri_research.renkan.repositories; +import java.util.List; + import org.iri_research.renkan.models.User; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; public interface UsersRepository extends IRenkanRepository<User, String> { + + public List<User> findByTitle(String title); + public Page<User> findByTitle(String title, Pageable p); }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/src/main/java/org/iri_research/renkan/services/RenkanUserDetailsService.java Tue Apr 23 16:54:18 2013 +0200 @@ -0,0 +1,29 @@ +package org.iri_research.renkan.services; + +import java.util.List; + +import org.iri_research.renkan.models.User; +import org.iri_research.renkan.repositories.UsersRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +@Service +public class RenkanUserDetailsService implements UserDetailsService { + + @Autowired + private UsersRepository usersRepository; + + @Override + public UserDetails loadUserByUsername(String username) + throws UsernameNotFoundException { + List<User> res = this.usersRepository.findByTitle(username); + if(res == null || res.size() == 0) { + throw new UsernameNotFoundException(String.format("User {0} not found.", username)); + } + return res.get(0); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/src/main/java/org/iri_research/renkan/utils/ColorGenerator.java Tue Apr 23 16:54:18 2013 +0200 @@ -0,0 +1,24 @@ +package org.iri_research.renkan.utils; + +import java.awt.Color; +import java.util.Random; + +public class ColorGenerator { + + public static Color randomColor() { + + Random rand = new Random(); + + float r = rand.nextFloat()*0.5f + 0.5f; + float g = rand.nextFloat()*0.5f + 0.5f; + float b = rand.nextFloat()*0.5f + 0.5f; + + return new Color(r, g, b); + } + + public static String randomColorHex() { + Color resColor = ColorGenerator.randomColor(); + return Integer.toHexString(resColor.getRGB()); + } + +}
--- a/server/src/main/webapp/WEB-INF/applicationContext.xml Tue May 14 14:10:23 2013 +0200 +++ b/server/src/main/webapp/WEB-INF/applicationContext.xml Tue Apr 23 16:54:18 2013 +0200 @@ -69,6 +69,7 @@ <context:component-scan base-package="org.iri_research.renkan.rest" /> <context:component-scan base-package="org.iri_research.renkan.coweb" /> <context:component-scan base-package="org.iri_research.renkan.forms" /> + <context:component-scan base-package="org.iri_research.renkan.management" /> <!--mvc:annotation-driven> <mvc:argument-resolvers>
--- a/server/src/main/webapp/WEB-INF/i18n/messages_en.properties Tue May 14 14:10:23 2013 +0200 +++ b/server/src/main/webapp/WEB-INF/i18n/messages_en.properties Tue Apr 23 16:54:18 2013 +0200 @@ -44,12 +44,14 @@ renkanAdmin.space_add = Add space renkanAdmin.space_edit = Edit space -renkanAdmin.space_delete = Delete space +renkanAdmin.space_delete = Del. space renkanIndex.space_url = Url renkanAdmin.space_confirm_delete = Do you want to delete the space entitled "{0}" ? renkanAdmin.object_name = Name +renkanAdmin.object_created = Created renkanAdmin.object_edit = Edit +renkanAdmin.object_proj_count = Renkan count renkanAdmin.object_delete = Delete renkanAdmin.object_edit_link = Edit renkanAdmin.object_delete_link = Del. @@ -64,6 +66,15 @@ renkanAdmin.form.space.format = Format renkanAdmin.form.space.compact = Compact + +renkanAdmin.user_objects_name = Users +renkanAdmin.user_add = Add user +renkanAdmin.user_edit = Edit user +renkanAdmin.user_delete = Del. user +renkanIndex.user_url = Url +renkanAdmin.user_confirm_delete = Do you want to delete the user with username "{0}" ? + + renkan.error.title.empty = Title must not be empty or null renkan.error.bin_config.json = bin config field must contain a valid json
--- a/server/src/main/webapp/WEB-INF/i18n/messages_fr.properties Tue May 14 14:10:23 2013 +0200 +++ b/server/src/main/webapp/WEB-INF/i18n/messages_fr.properties Tue Apr 23 16:54:18 2013 +0200 @@ -48,6 +48,8 @@ renkanAdmin.space_confirm_delete = Confirmez-vous l'effacement de l'espace intitulé "{0}" ? renkanAdmin.object_name = Nom +renkanAdmin.object_created = Date Crea. +renkanAdmin.object_proj_count = Nb. renkan renkanAdmin.object_edit = Modif. renkanAdmin.object_delete = Eff. renkanAdmin.object_edit_link = Modif. @@ -63,6 +65,16 @@ renkanAdmin.form.space.format = Formatter renkanAdmin.form.space.compact = Compacter +renkanAdmin.user_objects_name = Utilisateurs +renkanAdmin.user_add = Ajout utilisateur +renkanAdmin.user_edit = Edition utilisateur +renkanAdmin.user_delete = Delete space +renkanIndex.user_url = Url +renkanAdmin.user_confirm_delete = Do you want to delete the user with username "{0}" ? + + + + renkan.error.title.empty = Le champ titre ne doit pas être vide renkan.error.bin_config.json = le champ bin config doit contenir un json valide
--- a/server/src/main/webapp/WEB-INF/templates/admin/spacesList.html Tue May 14 14:10:23 2013 +0200 +++ b/server/src/main/webapp/WEB-INF/templates/admin/spacesList.html Tue Apr 23 16:54:18 2013 +0200 @@ -39,27 +39,27 @@ </div> <div id="objects-content"> <ul class="object-tools"> - <li><a href="spacesAdd.html" th:href="@{/admin/spaces/edit/}" th:text="#{renkanAdmin.space_add}">Add space</a></li> + <li><a href="spaceAdd.html" th:href="@{/admin/users/edit/}" th:text="#{renkanAdmin.user_add}">Add user</a></li> </ul> <table> <thead> <tr> - <th th:text="#{renkanAdmin.object_name}" class="spaces-table-title">Name</th> - <th th:text="#{renkanAdmin.object_name}" class="spaces-table-created">Created</th> - <th th:text="#{renkanIndex.space_proj_count}">Project count</th> - <th th:text="#{renkanIndex.space_url}">url</th> - <th th:text="#{renkanAdmin.object_edit}" class="spaces-table-actions">Edit</th> - <th th:text="#{renkanAdmin.object_delete}" class="spaces-table-actions">Delete</th> + <th th:text="#{renkanAdmin.object_name}" class="object-table-title">Name</th> + <th th:text="#{renkanAdmin.object_created}" class="object-table-created">Created</th> + <th th:text="#{renkanAdmin.space_proj_count}" class="object-proj-count">Project count</th> + <th th:text="#{renkanIndex.space_url}" class="object-url">url</th> + <th th:text="#{renkanAdmin.object_edit}" class="object-table-actions">Edit</th> + <th th:text="#{renkanAdmin.object_delete}" class="object-table-actions">Delete</th> </tr> </thead> <tbody> <tr th:each="object: ${page.content}" th:with="spaceProjCount=${#maps.containsKey(projectsCount, object.id)}? ${projectsCount[object.id]} : 0"> - <td th:text="${object.title}" class="spaces-table-title" >title</td> - <td th:text="${object.created}?${#dates.format(object.created, #messages.msg('date.format'))}:'n/a'" class="spaces-table-created">created</td> - <td th:text="${spaceProjCount}">nb. proj</td> - <td><a href="../renkanIndex.html" th:href="@{'/s/'+${object.id}}" th:text="#{renkanIndex.space_url}">url</a></td> - <td><a href="spaceEdit.html" th:href="@{'/admin/spaces/edit/'+${object.id}}" th:text="#{renkanAdmin.object_edit_link}" class="spaces-table-actions">Edit</a></td> - <td><a href="#" th:if="${spaceProjCount==0}" th:href="@{'/admin/spaces/delete/'+${object.id}}" th:text="#{renkanAdmin.object_delete_link}" class="spaces-table-actions">Delete</a><span th:if="${spaceProjCount>0}" class="spaces-table-actions spaces-table-actions-disabled" th:text="#{renkanAdmin.object_delete_link}">Delete</span></td> + <td th:text="${object.title}" class="object-table-title" >title</td> + <td th:text="${object.created}?${#dates.format(object.created, #messages.msg('date.format'))}:'n/a'" class="object-table-created">created</td> + <td th:text="${spaceProjCount}" class="object-proj-count">nb. proj</td> + <td class="object-url"><a href="../renkanIndex.html" th:href="@{'/s/'+${object.id}}" th:text="#{renkanIndex.space_url}" >url</a></td> + <td><a href="spaceEdit.html" th:href="@{'/admin/spaces/edit/'+${object.id}}" th:text="#{renkanAdmin.object_edit_link}" class="object-table-actions">Edit</a></td> + <td><a href="#" th:if="${spaceProjCount==0}" th:href="@{'/admin/spaces/delete/'+${object.id}}" th:text="#{renkanAdmin.object_delete_link}" class="object-table-actions">Delete</a><span th:if="${spaceProjCount>0}" class="object-table-actions object-table-actions-disabled" th:text="#{renkanAdmin.object_delete_link}">Delete</span></td> </tr> </tbody> </table>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/src/main/webapp/WEB-INF/templates/admin/userEdit.html Tue Apr 23 16:54:18 2013 +0200 @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" > + <head> + <title>Renkan Admin - edit user</title> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> + <meta charset="utf-8"/> + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/> + + <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" /> + + <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/> + <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/> + <link href='../../../static/css/spectrum.css' rel="stylesheet" th:href="@{/static/css/spectrum.css}"/> + + <script type="text/javascript" src="../../../static/lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script> + <script type="text/javascript" src="../../../static/lib/jquery-ui.min.js" th:src="@{/static/lib/jquery-ui.min.js}" ></script> + <script type="text/javascript" src="../../../static/lib/i18n/jquery-ui-i18n.min.js" th:src="@{/static/lib/i18n/jquery-ui-i18n.min.js}" ></script> + <script type="text/javascript" src='../../../static/lib/spectrum.js' th:src="@{/static/lib/spectrum.js}"></script> + <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script> + </head> + <body> + <div id="container"> + <div id="wrapper"> + <header id="header"> + <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1> + <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div> + </header> + <h2><a href="userList.html" th:href="@{/admin/users}" th:text="#{renkanAdmin.object_list(#{renkanAdmin.user_objects_name})}">Users List</a> / <span th:text="#{renkanAdmin.user_edit}">Edit user</span></h2> + <div th:include="fragment/spaceForm::spaceFormFragment" id="inner-container"> + </div> + </div> + <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment"> + <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blanck">IRI</a> - Version <span class="version-version">0.0</span></div> + </footer> + </div> + </body> +</html> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/src/main/webapp/WEB-INF/templates/admin/usersList.html Tue Apr 23 16:54:18 2013 +0200 @@ -0,0 +1,70 @@ +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" > + <head> + <title>Renkan Admin - Users</title> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> + <meta charset="utf-8"/> + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/> + + <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}"/> + + <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/> + <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/> + + <script th:remove="all" type="text/javascript" src="../../../static/lib/jquery.min.js"></script> + <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script> + </head> + <body> + <div id="container"> + <div id="wrapper"> + <header id="header"> + <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1> + <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div> + </header> + <h2 th:text="#{renkanAdmin.object_list(#{renkanAdmin.user_objects_name})}">List of objects</h2> + <div th:include="fragment/paginationFragment :: paginationFragment" class="pagination-container"> + <div> + <a href="#?p.page=1"><<</a> + <a href="#?p.page=3"><</a> + <span>...</span> + <a href="#?p.page=2">2</a> + <a href="#?p.page=3">3</a> + <span>4</span> + <a href="#?p.page=5">5</a> + <a href="#?p.page=6">6</a> + <span>...</span> + <a href="#?p.page=5">></a> + <a href="#?p.page=7">>></a> + </div> + </div> + <div id="objects-content"> + <ul class="object-tools"> + <li><a href="userEdit.html" th:href="@{/admin/spaces/edit/}" th:text="#{renkanAdmin.space_add}">Add space</a></li> + </ul> + <table> + <thead> + <tr> + <th th:text="#{renkanAdmin.object_name}" class="object-table-title">Username</th> + <th th:text="#{renkanAdmin.object_proj_count}" class="object-proj-count">Project count</th> + <th th:text="#{renkanAdmin.object_edit}" class="object-table-actions">Edit</th> + <th th:text="#{renkanAdmin.object_delete}" class="object-table-actions">Delete</th> + </tr> + </thead> + <tbody> + <tr th:each="object: ${page.content}" th:with="userProjCount=${#maps.containsKey(projectsCount, object.id)}? ${projectsCount[object.id]} : 0"> + <td th:text="${object.title}" class="object-table-title" >username</td> + <td th:text="${userProjCount}" class="object-proj-count">nb. proj</td> + <td><a href="userEdit.html" th:href="@{'/admin/users/edit/'+${object.id}}" th:text="#{renkanAdmin.object_edit_link}" class="object-table-actions">Edit</a></td> + <td><a href="#" th:if="${userProjCount==0}" th:href="@{'/admin/users/delete/'+${object.id}}" th:text="#{renkanAdmin.object_delete_link}" class="users-table-actions">Delete</a><span th:if="${userProjCount>0}" class="object-table-actions object-table-actions-disabled" th:text="#{renkanAdmin.object_delete_link}">Delete</span></td> + </tr> + </tbody> + </table> + </div> + + </div> + <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment"> + <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blanck">IRI</a> - Version <span class="version-version">0.0</span></div> + </footer> + </div> + </body> +</html> \ No newline at end of file
--- a/server/src/main/webapp/static/css/index.css Tue May 14 14:10:23 2013 +0200 +++ b/server/src/main/webapp/static/css/index.css Tue Apr 23 16:54:18 2013 +0200 @@ -239,24 +239,24 @@ text-decoration: none; } -.spaces-table-title { +.object-table-title { width: 250px; } -.spaces-table-created { +.object-table-created { width: 120px; } -.spaces-table-actions { +.object-table-actions { width: 40px; } -.spaces-table-actions-disabled, .spaces-table-actions-disabled:link, .spaces-table-actions-disabled:visited, .spaces-table-actions-disabled:hover, .spaces-table-actions-disabled:active, .spaces-table-actions-disabled:focus { +.object-table-actions-disabled, .object-table-actions-disabled:link, .object-table-actions-disabled:visited, .object-table-actions-disabled:hover, .object-table-actions-disabled:active, .object-table-actions-disabled:focus { color: gray; text-decoration: none; cursor: default; } -td.spaces-table-created { +td.object-table-created { text-align: center; }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/src/main/webapp/static/lib/i18n/jquery-ui-i18n.min.js Tue Apr 23 16:54:18 2013 +0200 @@ -0,0 +1,6 @@ +/*! jQuery UI - v1.10.2 - 2013-03-14 +* http://jqueryui.com +* Includes: jquery.ui.datepicker-af.js, jquery.ui.datepicker-ar-DZ.js, jquery.ui.datepicker-ar.js, jquery.ui.datepicker-az.js, jquery.ui.datepicker-be.js, jquery.ui.datepicker-bg.js, jquery.ui.datepicker-bs.js, jquery.ui.datepicker-ca.js, jquery.ui.datepicker-cs.js, jquery.ui.datepicker-cy-GB.js, jquery.ui.datepicker-da.js, jquery.ui.datepicker-de.js, jquery.ui.datepicker-el.js, jquery.ui.datepicker-en-AU.js, jquery.ui.datepicker-en-GB.js, jquery.ui.datepicker-en-NZ.js, jquery.ui.datepicker-eo.js, jquery.ui.datepicker-es.js, jquery.ui.datepicker-et.js, jquery.ui.datepicker-eu.js, jquery.ui.datepicker-fa.js, jquery.ui.datepicker-fi.js, jquery.ui.datepicker-fo.js, jquery.ui.datepicker-fr-CA.js, jquery.ui.datepicker-fr-CH.js, jquery.ui.datepicker-fr.js, jquery.ui.datepicker-gl.js, jquery.ui.datepicker-he.js, jquery.ui.datepicker-hi.js, jquery.ui.datepicker-hr.js, jquery.ui.datepicker-hu.js, jquery.ui.datepicker-hy.js, jquery.ui.datepicker-id.js, jquery.ui.datepicker-is.js, jquery.ui.datepicker-it.js, jquery.ui.datepicker-ja.js, jquery.ui.datepicker-ka.js, jquery.ui.datepicker-kk.js, jquery.ui.datepicker-km.js, jquery.ui.datepicker-ko.js, jquery.ui.datepicker-ky.js, jquery.ui.datepicker-lb.js, jquery.ui.datepicker-lt.js, jquery.ui.datepicker-lv.js, jquery.ui.datepicker-mk.js, jquery.ui.datepicker-ml.js, jquery.ui.datepicker-ms.js, jquery.ui.datepicker-nb.js, jquery.ui.datepicker-nl-BE.js, jquery.ui.datepicker-nl.js, jquery.ui.datepicker-nn.js, jquery.ui.datepicker-no.js, jquery.ui.datepicker-pl.js, jquery.ui.datepicker-pt-BR.js, jquery.ui.datepicker-pt.js, jquery.ui.datepicker-rm.js, jquery.ui.datepicker-ro.js, jquery.ui.datepicker-ru.js, jquery.ui.datepicker-sk.js, jquery.ui.datepicker-sl.js, jquery.ui.datepicker-sq.js, jquery.ui.datepicker-sr-SR.js, jquery.ui.datepicker-sr.js, jquery.ui.datepicker-sv.js, jquery.ui.datepicker-ta.js, jquery.ui.datepicker-th.js, jquery.ui.datepicker-tj.js, jquery.ui.datepicker-tr.js, jquery.ui.datepicker-uk.js, jquery.ui.datepicker-vi.js, jquery.ui.datepicker-zh-CN.js, jquery.ui.datepicker-zh-HK.js, jquery.ui.datepicker-zh-TW.js +* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */ +jQuery(function(e){e.datepicker.regional.af={closeText:"Selekteer",prevText:"Vorige",nextText:"Volgende",currentText:"Vandag",monthNames:["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"],monthNamesShort:["Jan","Feb","Mrt","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],dayNames:["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],dayNamesShort:["Son","Maa","Din","Woe","Don","Vry","Sat"],dayNamesMin:["So","Ma","Di","Wo","Do","Vr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.af)}),jQuery(function(e){e.datepicker.regional["ar-DZ"]={closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["ar-DZ"])}),jQuery(function(e){e.datepicker.regional.ar={closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ar)}),jQuery(function(e){e.datepicker.regional.az={closeText:"Bağla",prevText:"<Geri",nextText:"İrəli>",currentText:"Bugün",monthNames:["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avqust","Sentyabr","Oktyabr","Noyabr","Dekabr"],monthNamesShort:["Yan","Fev","Mar","Apr","May","İyun","İyul","Avq","Sen","Okt","Noy","Dek"],dayNames:["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],dayNamesShort:["B","Be","Ça","Ç","Ca","C","Ş"],dayNamesMin:["B","B","Ç","С","Ç","C","Ş"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.az)}),jQuery(function(e){e.datepicker.regional.be={closeText:"Зачыніць",prevText:"←Папяр.",nextText:"Наст.→",currentText:"Сёньня",monthNames:["Студзень","Люты","Сакавік","Красавік","Травень","Чэрвень","Ліпень","Жнівень","Верасень","Кастрычнік","Лістапад","Сьнежань"],monthNamesShort:["Сту","Лют","Сак","Кра","Тра","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сьн"],dayNames:["нядзеля","панядзелак","аўторак","серада","чацьвер","пятніца","субота"],dayNamesShort:["ндз","пнд","аўт","срд","чцв","птн","сбт"],dayNamesMin:["Нд","Пн","Аў","Ср","Чц","Пт","Сб"],weekHeader:"Тд",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.be)}),jQuery(function(e){e.datepicker.regional.bg={closeText:"затвори",prevText:"<назад",nextText:"напред>",nextBigText:">>",currentText:"днес",monthNames:["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Яну","Фев","Мар","Апр","Май","Юни","Юли","Авг","Сеп","Окт","Нов","Дек"],dayNames:["Неделя","Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота"],dayNamesShort:["Нед","Пон","Вто","Сря","Чет","Пет","Съб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Съ"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.bg)}),jQuery(function(e){e.datepicker.regional.bs={closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Januar","Februar","Mart","April","Maj","Juni","Juli","August","Septembar","Oktobar","Novembar","Decembar"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.bs)}),jQuery(function(e){e.datepicker.regional.ca={closeText:"Tanca",prevText:"Anterior",nextText:"Següent",currentText:"Avui",monthNames:["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],monthNamesShort:["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des"],dayNames:["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],dayNamesShort:["dg","dl","dt","dc","dj","dv","ds"],dayNamesMin:["dg","dl","dt","dc","dj","dv","ds"],weekHeader:"Set",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ca)}),jQuery(function(e){e.datepicker.regional.cs={closeText:"Zavřít",prevText:"<Dříve",nextText:"Později>",currentText:"Nyní",monthNames:["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],monthNamesShort:["led","úno","bře","dub","kvě","čer","čvc","srp","zář","říj","lis","pro"],dayNames:["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],dayNamesShort:["ne","po","út","st","čt","pá","so"],dayNamesMin:["ne","po","út","st","čt","pá","so"],weekHeader:"Týd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.cs)}),jQuery(function(e){e.datepicker.regional["cy-GB"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"],monthNamesShort:["Ion","Chw","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tac","Rha"],dayNames:["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],dayNamesShort:["Sul","Llu","Maw","Mer","Iau","Gwe","Sad"],dayNamesMin:["Su","Ll","Ma","Me","Ia","Gw","Sa"],weekHeader:"Wy",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["cy-GB"])}),jQuery(function(e){e.datepicker.regional.da={closeText:"Luk",prevText:"<Forrige",nextText:"Næste>",currentText:"Idag",monthNames:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],dayNamesShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],dayNamesMin:["Sø","Ma","Ti","On","To","Fr","Lø"],weekHeader:"Uge",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.da)}),jQuery(function(e){e.datepicker.regional.de={closeText:"Schließen",prevText:"<Zurück",nextText:"Vor>",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.de)}),jQuery(function(e){e.datepicker.regional.el={closeText:"Κλείσιμο",prevText:"Προηγούμενος",nextText:"Επόμενος",currentText:"Τρέχων Μήνας",monthNames:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],monthNamesShort:["Ιαν","Φεβ","Μαρ","Απρ","Μαι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],dayNames:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],dayNamesShort:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],dayNamesMin:["Κυ","Δε","Τρ","Τε","Πε","Πα","Σα"],weekHeader:"Εβδ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.el)}),jQuery(function(e){e.datepicker.regional["en-AU"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["en-AU"])}),jQuery(function(e){e.datepicker.regional["en-GB"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["en-GB"])}),jQuery(function(e){e.datepicker.regional["en-NZ"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["en-NZ"])}),jQuery(function(e){e.datepicker.regional.eo={closeText:"Fermi",prevText:"<Anta",nextText:"Sekv>",currentText:"Nuna",monthNames:["Januaro","Februaro","Marto","Aprilo","Majo","Junio","Julio","Aŭgusto","Septembro","Oktobro","Novembro","Decembro"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aŭg","Sep","Okt","Nov","Dec"],dayNames:["Dimanĉo","Lundo","Mardo","Merkredo","Ĵaŭdo","Vendredo","Sabato"],dayNamesShort:["Dim","Lun","Mar","Mer","Ĵaŭ","Ven","Sab"],dayNamesMin:["Di","Lu","Ma","Me","Ĵa","Ve","Sa"],weekHeader:"Sb",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.eo)}),jQuery(function(e){e.datepicker.regional.es={closeText:"Cerrar",prevText:"<Ant",nextText:"Sig>",currentText:"Hoy",monthNames:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],monthNamesShort:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],dayNames:["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],dayNamesShort:["Dom","Lun","Mar","Mié","Juv","Vie","Sáb"],dayNamesMin:["Do","Lu","Ma","Mi","Ju","Vi","Sá"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.es)}),jQuery(function(e){e.datepicker.regional.et={closeText:"Sulge",prevText:"Eelnev",nextText:"Järgnev",currentText:"Täna",monthNames:["Jaanuar","Veebruar","Märts","Aprill","Mai","Juuni","Juuli","August","September","Oktoober","November","Detsember"],monthNamesShort:["Jaan","Veebr","Märts","Apr","Mai","Juuni","Juuli","Aug","Sept","Okt","Nov","Dets"],dayNames:["Pühapäev","Esmaspäev","Teisipäev","Kolmapäev","Neljapäev","Reede","Laupäev"],dayNamesShort:["Pühap","Esmasp","Teisip","Kolmap","Neljap","Reede","Laup"],dayNamesMin:["P","E","T","K","N","R","L"],weekHeader:"näd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.et)}),jQuery(function(e){e.datepicker.regional.eu={closeText:"Egina",prevText:"<Aur",nextText:"Hur>",currentText:"Gaur",monthNames:["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua"],monthNamesShort:["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe."],dayNames:["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],dayNamesShort:["ig.","al.","ar.","az.","og.","ol.","lr."],dayNamesMin:["ig","al","ar","az","og","ol","lr"],weekHeader:"As",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.eu)}),jQuery(function(e){e.datepicker.regional.fa={closeText:"بستن",prevText:"<قبلی",nextText:"بعدی>",currentText:"امروز",monthNames:["فروردين","ارديبهشت","خرداد","تير","مرداد","شهريور","مهر","آبان","آذر","دی","بهمن","اسفند"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["يکشنبه","دوشنبه","سهشنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],dayNamesShort:["ی","د","س","چ","پ","ج","ش"],dayNamesMin:["ی","د","س","چ","پ","ج","ش"],weekHeader:"هف",dateFormat:"yy/mm/dd",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fa)}),jQuery(function(e){e.datepicker.regional.fi={closeText:"Sulje",prevText:"«Edellinen",nextText:"Seuraava»",currentText:"Tänään",monthNames:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],monthNamesShort:["Tammi","Helmi","Maalis","Huhti","Touko","Kesä","Heinä","Elo","Syys","Loka","Marras","Joulu"],dayNamesShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayNames:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],dayNamesMin:["Su","Ma","Ti","Ke","To","Pe","La"],weekHeader:"Vk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fi)}),jQuery(function(e){e.datepicker.regional.fo={closeText:"Lat aftur",prevText:"<Fyrra",nextText:"Næsta>",currentText:"Í dag",monthNames:["Januar","Februar","Mars","Apríl","Mei","Juni","Juli","August","September","Oktober","November","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],dayNames:["Sunnudagur","Mánadagur","Týsdagur","Mikudagur","Hósdagur","Fríggjadagur","Leyardagur"],dayNamesShort:["Sun","Mán","Týs","Mik","Hós","Frí","Ley"],dayNamesMin:["Su","Má","Tý","Mi","Hó","Fr","Le"],weekHeader:"Vk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fo)}),jQuery(function(e){e.datepicker.regional["fr-CA"]={closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["fr-CA"])}),jQuery(function(e){e.datepicker.regional["fr-CH"]={closeText:"Fermer",prevText:"<Préc",nextText:"Suiv>",currentText:"Courant",monthNames:["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],monthNamesShort:["Jan","Fév","Mar","Avr","Mai","Jun","Jul","Aoû","Sep","Oct","Nov","Déc"],dayNames:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],dayNamesShort:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],dayNamesMin:["Di","Lu","Ma","Me","Je","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["fr-CH"])}),jQuery(function(e){e.datepicker.regional.fr={closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],monthNamesShort:["Janv.","Févr.","Mars","Avril","Mai","Juin","Juil.","Août","Sept.","Oct.","Nov.","Déc."],dayNames:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],dayNamesShort:["Dim.","Lun.","Mar.","Mer.","Jeu.","Ven.","Sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fr)}),jQuery(function(e){e.datepicker.regional.gl={closeText:"Pechar",prevText:"<Ant",nextText:"Seg>",currentText:"Hoxe",monthNames:["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],monthNamesShort:["Xan","Feb","Mar","Abr","Mai","Xuñ","Xul","Ago","Set","Out","Nov","Dec"],dayNames:["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],dayNamesShort:["Dom","Lun","Mar","Mér","Xov","Ven","Sáb"],dayNamesMin:["Do","Lu","Ma","Mé","Xo","Ve","Sá"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.gl)}),jQuery(function(e){e.datepicker.regional.he={closeText:"סגור",prevText:"<הקודם",nextText:"הבא>",currentText:"היום",monthNames:["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],monthNamesShort:["ינו","פבר","מרץ","אפר","מאי","יוני","יולי","אוג","ספט","אוק","נוב","דצמ"],dayNames:["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת"],dayNamesShort:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],dayNamesMin:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.he)}),jQuery(function(e){e.datepicker.regional.hi={closeText:"बंद",prevText:"पिछला",nextText:"अगला",currentText:"आज",monthNames:["जनवरी ","फरवरी","मार्च","अप्रेल","मई","जून","जूलाई","अगस्त ","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],monthNamesShort:["जन","फर","मार्च","अप्रेल","मई","जून","जूलाई","अग","सित","अक्ट","नव","दि"],dayNames:["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],dayNamesShort:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],dayNamesMin:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],weekHeader:"हफ्ता",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hi)}),jQuery(function(e){e.datepicker.regional.hr={closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],monthNamesShort:["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],dayNames:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Tje",dateFormat:"dd.mm.yy.",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hr)}),jQuery(function(e){e.datepicker.regional.hu={closeText:"bezár",prevText:"vissza",nextText:"előre",currentText:"ma",monthNames:["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],monthNamesShort:["Jan","Feb","Már","Ápr","Máj","Jún","Júl","Aug","Szep","Okt","Nov","Dec"],dayNames:["Vasárnap","Hétfő","Kedd","Szerda","Csütörtök","Péntek","Szombat"],dayNamesShort:["Vas","Hét","Ked","Sze","Csü","Pén","Szo"],dayNamesMin:["V","H","K","Sze","Cs","P","Szo"],weekHeader:"Hét",dateFormat:"yy.mm.dd.",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hu)}),jQuery(function(e){e.datepicker.regional.hy={closeText:"Փակել",prevText:"<Նախ.",nextText:"Հաջ.>",currentText:"Այսօր",monthNames:["Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս","Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր"],monthNamesShort:["Հունվ","Փետր","Մարտ","Ապր","Մայիս","Հունիս","Հուլ","Օգս","Սեպ","Հոկ","Նոյ","Դեկ"],dayNames:["կիրակի","եկուշաբթի","երեքշաբթի","չորեքշաբթի","հինգշաբթի","ուրբաթ","շաբաթ"],dayNamesShort:["կիր","երկ","երք","չրք","հնգ","ուրբ","շբթ"],dayNamesMin:["կիր","երկ","երք","չրք","հնգ","ուրբ","շբթ"],weekHeader:"ՇԲՏ",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hy)}),jQuery(function(e){e.datepicker.regional.id={closeText:"Tutup",prevText:"<mundur",nextText:"maju>",currentText:"hari ini",monthNames:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agus","Sep","Okt","Nop","Des"],dayNames:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],dayNamesShort:["Min","Sen","Sel","Rab","kam","Jum","Sab"],dayNamesMin:["Mg","Sn","Sl","Rb","Km","jm","Sb"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.id)}),jQuery(function(e){e.datepicker.regional.is={closeText:"Loka",prevText:"< Fyrri",nextText:"Næsti >",currentText:"Í dag",monthNames:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ágúst","September","Október","Nóvember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ágú","Sep","Okt","Nóv","Des"],dayNames:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],dayNamesShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],dayNamesMin:["Su","Má","Þr","Mi","Fi","Fö","La"],weekHeader:"Vika",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.is)}),jQuery(function(e){e.datepicker.regional.it={closeText:"Chiudi",prevText:"<Prec",nextText:"Succ>",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.it)}),jQuery(function(e){e.datepicker.regional.ja={closeText:"閉じる",prevText:"<前",nextText:"次>",currentText:"今日",monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthNamesShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayNames:["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],dayNamesShort:["日","月","火","水","木","金","土"],dayNamesMin:["日","月","火","水","木","金","土"],weekHeader:"週",dateFormat:"yy/mm/dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional.ja)}),jQuery(function(e){e.datepicker.regional.ka={closeText:"დახურვა",prevText:"< წინა",nextText:"შემდეგი >",currentText:"დღეს",monthNames:["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],monthNamesShort:["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"],dayNames:["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],dayNamesShort:["კვ","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],dayNamesMin:["კვ","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],weekHeader:"კვირა",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ka)}),jQuery(function(e){e.datepicker.regional.kk={closeText:"Жабу",prevText:"<Алдыңғы",nextText:"Келесі>",currentText:"Бүгін",monthNames:["Қаңтар","Ақпан","Наурыз","Сәуір","Мамыр","Маусым","Шілде","Тамыз","Қыркүйек","Қазан","Қараша","Желтоқсан"],monthNamesShort:["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел"],dayNames:["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],dayNamesShort:["жкс","дсн","ссн","срс","бсн","жма","снб"],dayNamesMin:["Жк","Дс","Сс","Ср","Бс","Жм","Сн"],weekHeader:"Не",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.kk)}),jQuery(function(e){e.datepicker.regional.km={closeText:"ធ្វើរួច",prevText:"មុន",nextText:"បន្ទាប់",currentText:"ថ្ងៃនេះ",monthNames:["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],monthNamesShort:["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],dayNames:["អាទិត្យ","ចន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],dayNamesShort:["អា","ច","អ","ពុ","ព្រហ","សុ","សៅ"],dayNamesMin:["អា","ច","អ","ពុ","ព្រហ","សុ","សៅ"],weekHeader:"សប្ដាហ៍",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.km)}),jQuery(function(e){e.datepicker.regional.ko={closeText:"닫기",prevText:"이전달",nextText:"다음달",currentText:"오늘",monthNames:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthNamesShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],dayNames:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],dayNamesShort:["일","월","화","수","목","금","토"],dayNamesMin:["일","월","화","수","목","금","토"],weekHeader:"Wk",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"년"},e.datepicker.setDefaults(e.datepicker.regional.ko)}),jQuery(function(e){e.datepicker.regional.ky={closeText:"Жабуу",prevText:"<Мур",nextText:"Кий>",currentText:"Бүгүн",monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["жекшемби","дүйшөмбү","шейшемби","шаршемби","бейшемби","жума","ишемби"],dayNamesShort:["жек","дүй","шей","шар","бей","жум","ише"],dayNamesMin:["Жк","Дш","Шш","Шр","Бш","Жм","Иш"],weekHeader:"Жум",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ky)}),jQuery(function(e){e.datepicker.regional.lb={closeText:"Fäerdeg",prevText:"Zréck",nextText:"Weider",currentText:"Haut",monthNames:["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],dayNamesShort:["Son","Méi","Dën","Mët","Don","Fre","Sam"],dayNamesMin:["So","Mé","Dë","Më","Do","Fr","Sa"],weekHeader:"W",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.lb)}),jQuery(function(e){e.datepicker.regional.lt={closeText:"Uždaryti",prevText:"<Atgal",nextText:"Pirmyn>",currentText:"Šiandien",monthNames:["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","Rugpjūtis","Rugsėjis","Spalis","Lapkritis","Gruodis"],monthNamesShort:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],dayNames:["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],dayNamesShort:["sek","pir","ant","tre","ket","pen","šeš"],dayNamesMin:["Se","Pr","An","Tr","Ke","Pe","Še"],weekHeader:"Wk",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.lt)}),jQuery(function(e){e.datepicker.regional.lv={closeText:"Aizvērt",prevText:"Iepr",nextText:"Nāka",currentText:"Šodien",monthNames:["Janvāris","Februāris","Marts","Aprīlis","Maijs","Jūnijs","Jūlijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],monthNamesShort:["Jan","Feb","Mar","Apr","Mai","Jūn","Jūl","Aug","Sep","Okt","Nov","Dec"],dayNames:["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],dayNamesShort:["svt","prm","otr","tre","ctr","pkt","sst"],dayNamesMin:["Sv","Pr","Ot","Tr","Ct","Pk","Ss"],weekHeader:"Nav",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.lv)}),jQuery(function(e){e.datepicker.regional.mk={closeText:"Затвори",prevText:"<",nextText:">",currentText:"Денес",monthNames:["Јануари","Февруари","Март","Април","Мај","Јуни","Јули","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Јан","Фев","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Ное","Дек"],dayNames:["Недела","Понеделник","Вторник","Среда","Четврток","Петок","Сабота"],dayNamesShort:["Нед","Пон","Вто","Сре","Чет","Пет","Саб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Са"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.mk)}),jQuery(function(e){e.datepicker.regional.ml={closeText:"ശരി",prevText:"മുന്നത്തെ",nextText:"അടുത്തത് ",currentText:"ഇന്ന്",monthNames:["ജനുവരി","ഫെബ്രുവരി","മാര്ച്ച്","ഏപ്രില്","മേയ്","ജൂണ്","ജൂലൈ","ആഗസ്റ്റ്","സെപ്റ്റംബര്","ഒക്ടോബര്","നവംബര്","ഡിസംബര്"],monthNamesShort:["ജനു","ഫെബ്","മാര്","ഏപ്രി","മേയ്","ജൂണ്","ജൂലാ","ആഗ","സെപ്","ഒക്ടോ","നവം","ഡിസ"],dayNames:["ഞായര്","തിങ്കള്","ചൊവ്വ","ബുധന്","വ്യാഴം","വെള്ളി","ശനി"],dayNamesShort:["ഞായ","തിങ്ക","ചൊവ്വ","ബുധ","വ്യാഴം","വെള്ളി","ശനി"],dayNamesMin:["ഞാ","തി","ചൊ","ബു","വ്യാ","വെ","ശ"],weekHeader:"ആ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ml)}),jQuery(function(e){e.datepicker.regional.ms={closeText:"Tutup",prevText:"<Sebelum",nextText:"Selepas>",currentText:"hari ini",monthNames:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],monthNamesShort:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],dayNames:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],dayNamesShort:["Aha","Isn","Sel","Rab","kha","Jum","Sab"],dayNamesMin:["Ah","Is","Se","Ra","Kh","Ju","Sa"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ms)}),jQuery(function(e){e.datepicker.regional.nb={closeText:"Lukk",prevText:"«Forrige",nextText:"Neste»",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["søn","man","tir","ons","tor","fre","lør"],dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],dayNamesMin:["sø","ma","ti","on","to","fr","lø"],weekHeader:"Uke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.nb) +}),jQuery(function(e){e.datepicker.regional["nl-BE"]={closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["nl-BE"])}),jQuery(function(e){e.datepicker.regional.nl={closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.nl)}),jQuery(function(e){e.datepicker.regional.nn={closeText:"Lukk",prevText:"«Førre",nextText:"Neste»",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["sun","mån","tys","ons","tor","fre","lau"],dayNames:["sundag","måndag","tysdag","onsdag","torsdag","fredag","laurdag"],dayNamesMin:["su","må","ty","on","to","fr","la"],weekHeader:"Veke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.nn)}),jQuery(function(e){e.datepicker.regional.no={closeText:"Lukk",prevText:"«Forrige",nextText:"Neste»",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["søn","man","tir","ons","tor","fre","lør"],dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],dayNamesMin:["sø","ma","ti","on","to","fr","lø"],weekHeader:"Uke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.no)}),jQuery(function(e){e.datepicker.regional.pl={closeText:"Zamknij",prevText:"<Poprzedni",nextText:"Następny>",currentText:"Dziś",monthNames:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Śr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Śr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.pl)}),jQuery(function(e){e.datepicker.regional["pt-BR"]={closeText:"Fechar",prevText:"<Anterior",nextText:"Próximo>",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["pt-BR"])}),jQuery(function(e){e.datepicker.regional.pt={closeText:"Fechar",prevText:"<Anterior",nextText:"Seguinte",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sem",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.pt)}),jQuery(function(e){e.datepicker.regional.rm={closeText:"Serrar",prevText:"<Suandant",nextText:"Precedent>",currentText:"Actual",monthNames:["Schaner","Favrer","Mars","Avrigl","Matg","Zercladur","Fanadur","Avust","Settember","October","November","December"],monthNamesShort:["Scha","Fev","Mar","Avr","Matg","Zer","Fan","Avu","Sett","Oct","Nov","Dec"],dayNames:["Dumengia","Glindesdi","Mardi","Mesemna","Gievgia","Venderdi","Sonda"],dayNamesShort:["Dum","Gli","Mar","Mes","Gie","Ven","Som"],dayNamesMin:["Du","Gl","Ma","Me","Gi","Ve","So"],weekHeader:"emna",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.rm)}),jQuery(function(e){e.datepicker.regional.ro={closeText:"Închide",prevText:"« Luna precedentă",nextText:"Luna următoare »",currentText:"Azi",monthNames:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthNamesShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Duminică","Luni","Marţi","Miercuri","Joi","Vineri","Sâmbătă"],dayNamesShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],dayNamesMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],weekHeader:"Săpt",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ro)}),jQuery(function(e){e.datepicker.regional.ru={closeText:"Закрыть",prevText:"<Пред",nextText:"След>",currentText:"Сегодня",monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],dayNamesShort:["вск","пнд","втр","срд","чтв","птн","сбт"],dayNamesMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Нед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ru)}),jQuery(function(e){e.datepicker.regional.sk={closeText:"Zavrieť",prevText:"<Predchádzajúci",nextText:"Nasledujúci>",currentText:"Dnes",monthNames:["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],monthNamesShort:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],dayNames:["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],dayNamesShort:["Ned","Pon","Uto","Str","Štv","Pia","Sob"],dayNamesMin:["Ne","Po","Ut","St","Št","Pia","So"],weekHeader:"Ty",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sk)}),jQuery(function(e){e.datepicker.regional.sl={closeText:"Zapri",prevText:"<Prejšnji",nextText:"Naslednji>",currentText:"Trenutni",monthNames:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota"],dayNamesShort:["Ned","Pon","Tor","Sre","Čet","Pet","Sob"],dayNamesMin:["Ne","Po","To","Sr","Če","Pe","So"],weekHeader:"Teden",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sl)}),jQuery(function(e){e.datepicker.regional.sq={closeText:"mbylle",prevText:"<mbrapa",nextText:"Përpara>",currentText:"sot",monthNames:["Janar","Shkurt","Mars","Prill","Maj","Qershor","Korrik","Gusht","Shtator","Tetor","Nëntor","Dhjetor"],monthNamesShort:["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gus","Sht","Tet","Nën","Dhj"],dayNames:["E Diel","E Hënë","E Martë","E Mërkurë","E Enjte","E Premte","E Shtune"],dayNamesShort:["Di","Hë","Ma","Më","En","Pr","Sh"],dayNamesMin:["Di","Hë","Ma","Më","En","Pr","Sh"],weekHeader:"Ja",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sq)}),jQuery(function(e){e.datepicker.regional["sr-SR"]={closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljak","Utorak","Sreda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sre","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Sed",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["sr-SR"])}),jQuery(function(e){e.datepicker.regional.sr={closeText:"Затвори",prevText:"<",nextText:">",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sr)}),jQuery(function(e){e.datepicker.regional.sv={closeText:"Stäng",prevText:"«Förra",nextText:"Nästa»",currentText:"Idag",monthNames:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNamesShort:["Sön","Mån","Tis","Ons","Tor","Fre","Lör"],dayNames:["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],dayNamesMin:["Sö","Må","Ti","On","To","Fr","Lö"],weekHeader:"Ve",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sv)}),jQuery(function(e){e.datepicker.regional.ta={closeText:"மூடு",prevText:"முன்னையது",nextText:"அடுத்தது",currentText:"இன்று",monthNames:["தை","மாசி","பங்குனி","சித்திரை","வைகாசி","ஆனி","ஆடி","ஆவணி","புரட்டாசி","ஐப்பசி","கார்த்திகை","மார்கழி"],monthNamesShort:["தை","மாசி","பங்","சித்","வைகா","ஆனி","ஆடி","ஆவ","புர","ஐப்","கார்","மார்"],dayNames:["ஞாயிற்றுக்கிழமை","திங்கட்கிழமை","செவ்வாய்க்கிழமை","புதன்கிழமை","வியாழக்கிழமை","வெள்ளிக்கிழமை","சனிக்கிழமை"],dayNamesShort:["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],dayNamesMin:["ஞா","தி","செ","பு","வி","வெ","ச"],weekHeader:"Не",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ta)}),jQuery(function(e){e.datepicker.regional.th={closeText:"ปิด",prevText:"« ย้อน",nextText:"ถัดไป »",currentText:"วันนี้",monthNames:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],monthNamesShort:["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],dayNames:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],dayNamesShort:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],dayNamesMin:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.th)}),jQuery(function(e){e.datepicker.regional.tj={closeText:"Идома",prevText:"<Қафо",nextText:"Пеш>",currentText:"Имрӯз",monthNames:["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["якшанбе","душанбе","сешанбе","чоршанбе","панҷшанбе","ҷумъа","шанбе"],dayNamesShort:["якш","душ","сеш","чор","пан","ҷум","шан"],dayNamesMin:["Як","Дш","Сш","Чш","Пш","Ҷм","Шн"],weekHeader:"Хф",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.tj)}),jQuery(function(e){e.datepicker.regional.tr={closeText:"kapat",prevText:"<geri",nextText:"ileri>",currentText:"bugün",monthNames:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],monthNamesShort:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],dayNames:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],dayNamesShort:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],dayNamesMin:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.tr)}),jQuery(function(e){e.datepicker.regional.uk={closeText:"Закрити",prevText:"<",nextText:">",currentText:"Сьогодні",monthNames:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],monthNamesShort:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],dayNames:["неділя","понеділок","вівторок","середа","четвер","п’ятниця","субота"],dayNamesShort:["нед","пнд","вів","срд","чтв","птн","сбт"],dayNamesMin:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Тиж",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.uk)}),jQuery(function(e){e.datepicker.regional.vi={closeText:"Đóng",prevText:"<Trước",nextText:"Tiếp>",currentText:"Hôm nay",monthNames:["Tháng Một","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai"],monthNamesShort:["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],dayNames:["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],dayNamesShort:["CN","T2","T3","T4","T5","T6","T7"],dayNamesMin:["CN","T2","T3","T4","T5","T6","T7"],weekHeader:"Tu",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.vi)}),jQuery(function(e){e.datepicker.regional["zh-CN"]={closeText:"关闭",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional["zh-CN"])}),jQuery(function(e){e.datepicker.regional["zh-HK"]={closeText:"關閉",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"dd-mm-yy",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional["zh-HK"])}),jQuery(function(e){e.datepicker.regional["zh-TW"]={closeText:"關閉",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy/mm/dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional["zh-TW"])}); \ No newline at end of file
--- a/server/src/test/java/org/iri_research/renkan/test/repositories/ProjectsRepositoryTest.java Tue May 14 14:10:23 2013 +0200 +++ b/server/src/test/java/org/iri_research/renkan/test/repositories/ProjectsRepositoryTest.java Tue Apr 23 16:54:18 2013 +0200 @@ -13,11 +13,14 @@ import org.iri_research.renkan.models.Project; import org.iri_research.renkan.models.ProjectRevision; import org.iri_research.renkan.models.Space; +import org.iri_research.renkan.models.User; import org.iri_research.renkan.repositories.EdgesRepository; import org.iri_research.renkan.repositories.NodesRepository; import org.iri_research.renkan.repositories.ProjectRevisionsRepository; import org.iri_research.renkan.repositories.ProjectsRepository; import org.iri_research.renkan.repositories.SpacesRepository; +import org.iri_research.renkan.repositories.UsersRepository; +import org.iri_research.renkan.utils.ColorGenerator; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -61,18 +64,22 @@ private EdgesRepository edgesRepository; @Autowired + private UsersRepository usersRepository; + + @Autowired private ProjectRevisionsRepository projectRevisionsRepository; @Autowired private MongoTemplate mongoTemplate; private ArrayList<Project> testProjects = new ArrayList<Project>(); - private List<Node> testNodes = new ArrayList<Node>(); + private List<Node> testNodes = new ArrayList<>(); private List<Edge> testEdges = new ArrayList<>(); + private List<User> testUsers = new ArrayList<>(); private Date creationDate = new Date(); - private List<String> spaceIds = new ArrayList<>(); + private List<String> spaceIds = new ArrayList<>(); private Project copyProject; @@ -83,19 +90,36 @@ public void setup() { logger.debug("Setup"); + + // CREATE USERS + for(int i=0; i<SPACE_NB; i++) { + this.testUsers.add(new User(UUID.randomUUID().toString(), "test_user"+(i+1), "Test user " + (i+1), "http://www.iri.centrepompidou.fr/users/test_user"+(i+1), "#"+ColorGenerator.randomColorHex())); + } + usersRepository.save(this.testUsers); + + ArrayList<Project> pl = new ArrayList<Project>(); Space testSpace = null; for(int i=0; i<SPACE_NB; i++) { spaceIds.add(UUID.randomUUID().toString()); testSpace = new Space(this.spaceIds.get(i), "test space " + i, "Test space " + i, null, null, null, "test_user", null, this.creationDate); testSpace = spacesRepository.save(testSpace); - for(int j=0; j<SPACE_NB-1-i; j++) { - pl.add(new Project(testSpace.getId(), UUID.randomUUID().toString(), "test project "+((SPACE_NB-1)*i+j+1), "desc"+((SPACE_NB-1)*i+j+1), "http://localhost:8080/rest/projects/id"+((SPACE_NB-1)*i+j+1), this.creationDate)); + for(int j=0; j<SPACE_NB-1-i; j++) { + final Project project = new Project(testSpace.getId(), UUID.randomUUID().toString(), "test project "+((SPACE_NB-1)*i+j+1), "desc"+((SPACE_NB-1)*i+j+1), "http://localhost:8080/rest/projects/id"+((SPACE_NB-1)*i+j+1), this.creationDate); + pl.add(project); + for(int k=0; k<SPACE_NB-j; k++) { + project.addUser(this.testUsers.get(k)); + } + for(int k=SPACE_NB-j; k<SPACE_NB; k++) { + project.addUser(null,null); + } } } + for(Project p: projectsRepository.save(pl)) { this.testProjects.add(p); } + copyProject = this.testProjects.get(0); for(int i=0;i<3;i++) { @@ -103,15 +127,14 @@ node = this.nodesRepository.save(node); copyProject.getNodes().add(node); this.testNodes.add(node); - } - + } for(int i=0;i<3;i++) { Edge edge = new Edge("Node"+i, "Node"+i, "Node "+i, "http://renkan.org/edges/edge"+i, "#ffff0"+i, this.testNodes.get((i+2)%3), this.testNodes.get(i), "test_user", copyProject.getId()); edge = this.edgesRepository.save(edge); copyProject.getEdges().add(edge); this.testEdges.add(edge); } - + this.projectsRepository.save(copyProject); } @@ -124,6 +147,7 @@ projectRevisionsRepository.deleteAll(); projectsRepository.deleteAll(); spacesRepository.deleteAll(); + usersRepository.deleteAll(); } @Test @@ -226,6 +250,43 @@ Assert.assertNull("other space id has no project i.e count is null", groupRes.get(this.spaceIds.get(i))); } } + + @Test + public void testGetCountByUser() { + + Map<String, Integer> groupRes = projectsRepository.getCountByUser(); + + Assert.assertNotNull("GroupRes not null", groupRes); + Assert.assertEquals("Group res size", testProjects.size()+1, groupRes.size()); + + for(int i=0;i<testProjects.size()+1;i++) { + Integer count = groupRes.get(this.testProjects.get(i).getId()); + Assert.assertNotNull("count not null", count); + Assert.assertEquals("Nb of user/project", testProjects.size()-i, count.intValue()); + } + + //Assert.assertNull("Last space id has no project i.e count is null", groupRes.get(this.spaceIds.get(SPACE_NB-1))); + } + + @Test + public void testGetCountByUserFilter() { + + List<String> spacesIdsFilter = Arrays.asList(this.spaceIds.get(0)); + + Map<String, Integer> groupRes = projectsRepository.getCountBySpace(spacesIdsFilter); + + Assert.assertNotNull("GroupRes not null", groupRes); + Assert.assertEquals("Group res size", 1, groupRes.size()); + + Integer count = groupRes.get(this.spaceIds.get(0)); + Assert.assertNotNull("count not null", count); + Assert.assertEquals("Nb of project/space", 2, count.intValue()); + + for(int i=1; i<SPACE_NB; i++) { + Assert.assertNull("other space id has no project i.e count is null", groupRes.get(this.spaceIds.get(i))); + } + } + @Test public void testCopyProjectCreation() {
--- a/server/src/test/resources/log4j.xml Tue May 14 14:10:23 2013 +0200 +++ b/server/src/test/resources/log4j.xml Tue Apr 23 16:54:18 2013 +0200 @@ -17,6 +17,9 @@ <logger name="org.springframework.test"> <level value="DEBUG" /> </logger> + <logger name="org.springframework.data.mongodb"> + <level value="DEBUG" /> + </logger> <root> <priority value ="WARN" /> <appender-ref ref="console" />