diff --git a/src/main/java/Team5.Smarttowns/Data/Towns.db b/src/main/java/Team5.Smarttowns/Data/Towns.db deleted file mode 100644 index 2532550d9acf4d8abc21a6e6ed89629908b72a3e..0000000000000000000000000000000000000000 Binary files a/src/main/java/Team5.Smarttowns/Data/Towns.db and /dev/null differ diff --git a/src/main/java/Team5/SmartTowns/Data/QRCodes.java b/src/main/java/Team5/SmartTowns/Data/QRCodes.java deleted file mode 100644 index ef350eb418b959e1069ee51d061471448c3b7457..0000000000000000000000000000000000000000 --- a/src/main/java/Team5/SmartTowns/Data/QRCodes.java +++ /dev/null @@ -1,4 +0,0 @@ -package Team5.SmartTowns.Data; - -public class QRCodes { -} diff --git a/src/main/java/Team5/SmartTowns/Data/trailsRepository.java b/src/main/java/Team5/SmartTowns/Data/trailsRepository.java deleted file mode 100644 index 52d8dc39b9bda0a7390f06afca8769a5fd0607a9..0000000000000000000000000000000000000000 --- a/src/main/java/Team5/SmartTowns/Data/trailsRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -//Holds trails data repository -package Team5.SmartTowns.Data; - -import java.util.List; - -public interface trailsRepository { - List<trail> getAllTrails(); -} diff --git a/src/main/java/Team5/SmartTowns/Towns/TownStorage.java b/src/main/java/Team5/SmartTowns/Towns/TownStorage.java deleted file mode 100644 index d2d99ea992086630324fa131ad5bb410acd3c425..0000000000000000000000000000000000000000 --- a/src/main/java/Team5/SmartTowns/Towns/TownStorage.java +++ /dev/null @@ -1,44 +0,0 @@ -package Team5.SmartTowns.Towns; - -import java.util.ArrayList; -import java.util.List; - -public class TownStorage { - private List<Towns> townList; - private static TownStorage singleton; - - TownStorage() { - townList = new ArrayList<>(); - townList.addAll( - List.of( - new Towns("Caerphilly",01,3,70,"/images/CaerphillyCastle.jpg"), - new Towns("Risca",02,2,34,"/images/RiscaBanner.jpg"), - new Towns("Penarth",03,5,0,"/images/PenarthBanner.jpg"), - new Towns("Penarth",03,5,50,"/images/PenarthBanner.jpg"), - new Towns("Caerphilly",01,3,70,"/images/CaerphillyCastle.jpg"), - new Towns("Risca",02,2,90,"/images/RiscaBanner.jpg"), - new Towns("Penarth",03,5,100,"/images/PenarthBanner.jpg") - - - - ) - - ); - - } - public static TownStorage getInstance() { - if (singleton == null) { - singleton = new TownStorage(); - - } - return singleton; - } - - public List<Towns> getTownList() { - return townList; - } - - - - -} diff --git a/src/main/java/Team5/SmartTowns/Data/DatabaseController.java b/src/main/java/Team5/SmartTowns/data/DatabaseController.java similarity index 76% rename from src/main/java/Team5/SmartTowns/Data/DatabaseController.java rename to src/main/java/Team5/SmartTowns/data/DatabaseController.java index 6c6b60ed7193d71db2d97022c9141c6b0951d608..77853b538d790d9db467f39967884f7887941343 100644 --- a/src/main/java/Team5/SmartTowns/Data/DatabaseController.java +++ b/src/main/java/Team5/SmartTowns/data/DatabaseController.java @@ -1,7 +1,5 @@ -package Team5.SmartTowns.Data; +package Team5.SmartTowns.data; -import Team5.SmartTowns.users.User; -import Team5.SmartTowns.users.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @@ -11,17 +9,19 @@ import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.*; + @Controller public class DatabaseController { + @Autowired - private locationRepository locationRepository; + private LocationRepository locationRepository; @Autowired - private trailsRepository trailsRepository; + private TrailsRepository trailsRepository; @GetMapping("/trailList") public ModelAndView trailList() { ModelAndView mav1 = new ModelAndView("towns/trailsData"); - List<trail> trail = trailsRepository.getAllTrails(); + List<Trail> trail = trailsRepository.getAllTrails(); mav1.addObject("trails", trail); return mav1; } diff --git a/src/main/java/Team5/SmartTowns/Data/Location.java b/src/main/java/Team5/SmartTowns/data/Location.java similarity index 97% rename from src/main/java/Team5/SmartTowns/Data/Location.java rename to src/main/java/Team5/SmartTowns/data/Location.java index 01ba2932c6b7d0a6201aa8128161bf7ad8b27526..c733d9b9a487ea290b0dfcab6618c0134dd438f5 100644 --- a/src/main/java/Team5/SmartTowns/Data/Location.java +++ b/src/main/java/Team5/SmartTowns/data/Location.java @@ -1,5 +1,5 @@ //Holds variable data for the locations table (landmarks) -package Team5.SmartTowns.Data; +package Team5.SmartTowns.data; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/Team5/SmartTowns/Data/locationRepository.java b/src/main/java/Team5/SmartTowns/data/LocationRepository.java similarity index 67% rename from src/main/java/Team5/SmartTowns/Data/locationRepository.java rename to src/main/java/Team5/SmartTowns/data/LocationRepository.java index 822a18cb860654694734c7f591cbb5b216eb8a39..a8c8ca81722933a480cefabacd8a863ff2b2524b 100644 --- a/src/main/java/Team5/SmartTowns/Data/locationRepository.java +++ b/src/main/java/Team5/SmartTowns/data/LocationRepository.java @@ -1,12 +1,11 @@ //Holds locations data repository (landmarks) -package Team5.SmartTowns.Data; +package Team5.SmartTowns.data; import java.util.List; -public interface locationRepository { +public interface LocationRepository { List<Location> getAllLocation(); void addLocation(Location loc); - } diff --git a/src/main/java/Team5/SmartTowns/Data/locationRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/data/LocationRepositoryJDBC.java similarity index 90% rename from src/main/java/Team5/SmartTowns/Data/locationRepositoryJDBC.java rename to src/main/java/Team5/SmartTowns/data/LocationRepositoryJDBC.java index a5e79d4442d540f5dba67ee7f2b6217984044ebb..e9c23c1510241f1b4934dff0434bcaecdf1a0ed1 100644 --- a/src/main/java/Team5/SmartTowns/Data/locationRepositoryJDBC.java +++ b/src/main/java/Team5/SmartTowns/data/LocationRepositoryJDBC.java @@ -1,5 +1,5 @@ //Implements the locations repository using JDBC -package Team5.SmartTowns.Data; +package Team5.SmartTowns.data; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; @@ -8,11 +8,11 @@ import org.springframework.stereotype.Repository; import java.util.List; @Repository -public class locationRepositoryJDBC implements locationRepository { +public class LocationRepositoryJDBC implements LocationRepository { private JdbcTemplate jdbc; private RowMapper<Location> locationMapper; - public locationRepositoryJDBC(JdbcTemplate aJdbc) { + public LocationRepositoryJDBC(JdbcTemplate aJdbc) { this.jdbc = aJdbc; setlocationMapper(); } diff --git a/src/main/java/Team5/SmartTowns/Data/MockUser.java b/src/main/java/Team5/SmartTowns/data/MockUser.java similarity index 71% rename from src/main/java/Team5/SmartTowns/Data/MockUser.java rename to src/main/java/Team5/SmartTowns/data/MockUser.java index 48748a17a4ac6fe230ee7f12119d5c71ab73839a..344dbbd77e6aeba32c362c4955c87464125ab0e4 100644 --- a/src/main/java/Team5/SmartTowns/Data/MockUser.java +++ b/src/main/java/Team5/SmartTowns/data/MockUser.java @@ -1,4 +1,4 @@ -package Team5.SmartTowns.Data; +package Team5.SmartTowns.data; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; @@ -8,8 +8,8 @@ import java.util.List; public class MockUser { private JdbcTemplate jdbc; - private RowMapper<trail> trailMapper; - public List<trail> getAllTrails(){ + private RowMapper<Trail> trailMapper; + public List<Trail> getAllTrails(){ String sql= "SELECT * FROM trails"; return jdbc.query(sql, trailMapper); } diff --git a/src/main/java/Team5/SmartTowns/data/QRCodes.java b/src/main/java/Team5/SmartTowns/data/QRCodes.java new file mode 100644 index 0000000000000000000000000000000000000000..28ebf97c96d884a6629208ce8ce58505334b63b6 --- /dev/null +++ b/src/main/java/Team5/SmartTowns/data/QRCodes.java @@ -0,0 +1,4 @@ +package Team5.SmartTowns.data; + +public class QRCodes { +} diff --git a/src/main/java/Team5/SmartTowns/Data/trail.java b/src/main/java/Team5/SmartTowns/data/Trail.java similarity index 77% rename from src/main/java/Team5/SmartTowns/Data/trail.java rename to src/main/java/Team5/SmartTowns/data/Trail.java index 86e78b96712ecf7a5756edbf20a4bae35839ca70..1a44d9270405a05ce9d8f97b3ddd2a43cc6b9653 100644 --- a/src/main/java/Team5/SmartTowns/Data/trail.java +++ b/src/main/java/Team5/SmartTowns/data/Trail.java @@ -1,12 +1,12 @@ //Holds variable data for the trails table -package Team5.SmartTowns.Data; +package Team5.SmartTowns.data; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor -public class trail { +public class Trail { private int trailsId; private String name; } diff --git a/src/main/java/Team5/SmartTowns/data/TrailsRepository.java b/src/main/java/Team5/SmartTowns/data/TrailsRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..d25e6fd62efdfdb4d743c829eeab5ddfeb5119d0 --- /dev/null +++ b/src/main/java/Team5/SmartTowns/data/TrailsRepository.java @@ -0,0 +1,8 @@ +//Holds trails data repository +package Team5.SmartTowns.data; + +import java.util.List; + +public interface TrailsRepository { + List<Trail> getAllTrails(); +} diff --git a/src/main/java/Team5/SmartTowns/Data/trailsRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/data/TrailsRepositoryJDBC.java similarity index 66% rename from src/main/java/Team5/SmartTowns/Data/trailsRepositoryJDBC.java rename to src/main/java/Team5/SmartTowns/data/TrailsRepositoryJDBC.java index 58aa84a95b00b8f8b5d7f97d240e04f405d2ac3b..3acf61c405688ac7a40536bafd38f4a0a92bfaec 100644 --- a/src/main/java/Team5/SmartTowns/Data/trailsRepositoryJDBC.java +++ b/src/main/java/Team5/SmartTowns/data/TrailsRepositoryJDBC.java @@ -1,5 +1,5 @@ //Implements the trails repository using JDBC -package Team5.SmartTowns.Data; +package Team5.SmartTowns.data; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; @@ -8,20 +8,20 @@ import org.springframework.stereotype.Repository; import java.util.List; @Repository -public class trailsRepositoryJDBC implements trailsRepository{ +public class TrailsRepositoryJDBC implements TrailsRepository { private JdbcTemplate jdbc; - private RowMapper<trail> trailMapper; - public trailsRepositoryJDBC(JdbcTemplate aJdbc){ + private RowMapper<Trail> trailMapper; + public TrailsRepositoryJDBC(JdbcTemplate aJdbc){ this.jdbc = aJdbc; settrailsMapper(); } private void settrailsMapper(){ - trailMapper = (rs, i) -> new trail( + trailMapper = (rs, i) -> new Trail( rs.getInt("trailID"), rs.getString("name") ); } - public List<trail> getAllTrails(){ + public List<Trail> getAllTrails(){ String sql= "SELECT * FROM trails"; return jdbc.query(sql, trailMapper); } diff --git a/src/main/java/Team5/SmartTowns/Landmarks/Landmarks.java b/src/main/java/Team5/SmartTowns/landmarks/Landmarks.java similarity index 93% rename from src/main/java/Team5/SmartTowns/Landmarks/Landmarks.java rename to src/main/java/Team5/SmartTowns/landmarks/Landmarks.java index f1c7b5fc264d29d3b0179b558d3df6b7e8bdc974..6974c1e997c5b2dd6d7396f44ea0cbe4565331c7 100644 --- a/src/main/java/Team5/SmartTowns/Landmarks/Landmarks.java +++ b/src/main/java/Team5/SmartTowns/landmarks/Landmarks.java @@ -1,8 +1,6 @@ -package Team5.SmartTowns.Landmarks; +package Team5.SmartTowns.landmarks; -import Team5.SmartTowns.trails.Trail; import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotEmpty; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/Team5/SmartTowns/Landmarks/LandmarksController.java b/src/main/java/Team5/SmartTowns/landmarks/LandmarksController.java similarity index 91% rename from src/main/java/Team5/SmartTowns/Landmarks/LandmarksController.java rename to src/main/java/Team5/SmartTowns/landmarks/LandmarksController.java index a94feef88935a8d3ca71f6326bdb8f44cda6dd0e..630740b580a1e81c91838b8b97c20c0d90132167 100644 --- a/src/main/java/Team5/SmartTowns/Landmarks/LandmarksController.java +++ b/src/main/java/Team5/SmartTowns/landmarks/LandmarksController.java @@ -1,7 +1,7 @@ -package Team5.SmartTowns.Landmarks; +package Team5.SmartTowns.landmarks; -import Team5.SmartTowns.Data.Location; -import Team5.SmartTowns.Data.locationRepository; +import Team5.SmartTowns.data.Location; +import Team5.SmartTowns.data.LocationRepository; import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -26,7 +26,7 @@ public class LandmarksController { } @Autowired - private locationRepository locationRepository; + private LocationRepository locationRepository; @PostMapping("/landmarkSub") public ModelAndView landmarkSent(@Valid @ModelAttribute("landmarkData") Landmarks landmarks, BindingResult bindingResult, Model model ) { diff --git a/src/main/java/Team5/SmartTowns/rewards/Badge.java b/src/main/java/Team5/SmartTowns/rewards/Badge.java index 25c231e14e3f0afdd4ecfc2d6e9f352925224097..976238804f5686bfd77e2bd028f7cc79ecf18698 100644 --- a/src/main/java/Team5/SmartTowns/rewards/Badge.java +++ b/src/main/java/Team5/SmartTowns/rewards/Badge.java @@ -1,51 +1,26 @@ /*AUTHOR: Gabriel Copat*/ package Team5.SmartTowns.rewards; -import lombok.Data; +import lombok.Getter; -import java.io.File; -import java.util.Objects; -@Data -public class Badge { +@Getter +public class Badge extends Reward { /* Badges can be earned by completing certain goals. * They are displayed in the user profile page * * For example, one might earn a badge after visiting 20 locations */ + static final String DEFAULT_IMAGE = "0.png"; - int id; - String name; - String description; - String imgPath; int difficulty; //1-5 public Badge(int id, String name, String description, int difficulty) { - this.id = id; - this.name = name; - this.description = description; + super(id, name, description); this.difficulty = difficulty; - imgPath = findImagePath(); - } - - private String findImagePath(){ - /* Finds the image in the Path folder, if image is not found assigns default image */ - String imgPath = "images/rewards/badges/" + id + ".jpg"; - String notFoundPath = "/images/rewards/badges/0.png"; - - File imgFile = new File("src/main/resources/static/" + imgPath); - return imgFile.exists() ? imgPath : notFoundPath; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Badge badge = (Badge) o; - return id == badge.id && Objects.equals(name, badge.name); } @Override - public int hashCode() { - return Objects.hash(id, name); + public String getImgFolder() { + return "badges"; } } diff --git a/src/main/java/Team5/SmartTowns/rewards/BadgesRepository.java b/src/main/java/Team5/SmartTowns/rewards/BadgesRepository.java deleted file mode 100644 index 56b1019cbe016a7c687b5ac83973679e8f498eef..0000000000000000000000000000000000000000 --- a/src/main/java/Team5/SmartTowns/rewards/BadgesRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -//Holds locations data repository -package Team5.SmartTowns.rewards; - -import java.util.List; - -public interface BadgesRepository { - List<Badge> getAllBadges(); -} - diff --git a/src/main/java/Team5/SmartTowns/rewards/BadgesRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/rewards/BadgesRepositoryJDBC.java deleted file mode 100644 index 7c22061e894a633bf9c047f69f575daf9366b493..0000000000000000000000000000000000000000 --- a/src/main/java/Team5/SmartTowns/rewards/BadgesRepositoryJDBC.java +++ /dev/null @@ -1,33 +0,0 @@ -//Implements the locations repository using JDBC -package Team5.SmartTowns.rewards; - -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public class BadgesRepositoryJDBC implements BadgesRepository { - private JdbcTemplate jdbc; - private RowMapper<Badge> badgeMapper; - - public BadgesRepositoryJDBC(JdbcTemplate aJdbc) { - this.jdbc = aJdbc; - setBadgeMapper(); - } - private void setBadgeMapper(){ - badgeMapper = (rs, i) -> new Badge( - rs.getInt("badgeID"), - rs.getString("name"), - rs.getString("description"), - rs.getInt("difficulty") - ); - } - - @Override - public List<Badge> getAllBadges(){ - String sql= "SELECT * FROM badges"; - return jdbc.query(sql, badgeMapper); - } -} diff --git a/src/main/java/Team5/SmartTowns/rewards/Pack.java b/src/main/java/Team5/SmartTowns/rewards/Pack.java new file mode 100644 index 0000000000000000000000000000000000000000..ef7fe7409f6e4fdfee3494a0dc932981df2c6907 --- /dev/null +++ b/src/main/java/Team5/SmartTowns/rewards/Pack.java @@ -0,0 +1,28 @@ +package Team5.SmartTowns.rewards; + +import lombok.Getter; + +import java.util.List; + +@Getter +public class Pack extends Reward{ + + int progression; //0-100%; + + public Pack(int id, String name, String description) { + super(id, name, description); + displayImg = super.findImagePath(); + } + + public void setProgression(List<Sticker> packStickers, List<Sticker> userStickers){ + /* Takes in a list with all stickers in the pack and a list with all userStickers from the pack + * These lists are taken from database in the Controllers via SQL query*/ + int totalAmount = packStickers.size(); + int hasAmount = userStickers.size(); + progression = (int) ((totalAmount/hasAmount) * 100); + } + @Override + public String getImgFolder() { + return "packs"; + } +} diff --git a/src/main/java/Team5/SmartTowns/rewards/Reward.java b/src/main/java/Team5/SmartTowns/rewards/Reward.java new file mode 100644 index 0000000000000000000000000000000000000000..0a2d9145817a6e6935e5cc7dca283c47c491ee53 --- /dev/null +++ b/src/main/java/Team5/SmartTowns/rewards/Reward.java @@ -0,0 +1,37 @@ +package Team5.SmartTowns.rewards; + +import lombok.Getter; + +import java.io.File; + +@Getter +public abstract class Reward { + /* Abstract class for all rewards */ + + int id; + String displayImg; //Path to the image file + String name; + String description; + + public Reward(int id, String name, String description) { + //Default constructor + this.id = id; + this.name = name; + this.description = description; + } + + public abstract String getImgFolder(); + /*Returns folder in which images are located*/ + + public String getDefaultImg(){ + /*Returns the name of the default image to be used in case no image is found*/ + return "0.png"; + } + public String findImagePath(){ + /* Finds the image in the Path folder, if image is not found assigns default image */ + String imgPath = "images/rewards/" + getImgFolder() + "/" + id + ".png"; + String notFoundPath = "images/rewards/" + getImgFolder() + "/" + getDefaultImg(); + File imgFile = new File("src/main/resources/static/" + imgPath); + return imgFile.exists() ? imgPath : notFoundPath; + } +} diff --git a/src/main/java/Team5/SmartTowns/rewards/RewardsController.java b/src/main/java/Team5/SmartTowns/rewards/RewardsController.java deleted file mode 100644 index af9d33cba34dd12ac6aa5ca1e54320b8124af9d4..0000000000000000000000000000000000000000 --- a/src/main/java/Team5/SmartTowns/rewards/RewardsController.java +++ /dev/null @@ -1,7 +0,0 @@ -package Team5.SmartTowns.rewards; - -import org.springframework.stereotype.Controller; - -@Controller -public class RewardsController { -} diff --git a/src/main/java/Team5/SmartTowns/rewards/RewardsRepository.java b/src/main/java/Team5/SmartTowns/rewards/RewardsRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..51bde7f297613873b38b0eec939f58d9c1dc1acd --- /dev/null +++ b/src/main/java/Team5/SmartTowns/rewards/RewardsRepository.java @@ -0,0 +1,18 @@ +//Holds locations data repository +package Team5.SmartTowns.rewards; + +import java.util.List; + +public interface RewardsRepository { + List<Sticker> getAllStickers(); + + List<Sticker> getAllStickersFromPack(int packID); + + List<Sticker> getAllStickersFromUser(int userID); + + List<Pack> getAllPacks(); + + Pack findPackByID(int id); + +} + diff --git a/src/main/java/Team5/SmartTowns/rewards/RewardsRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/rewards/RewardsRepositoryJDBC.java new file mode 100644 index 0000000000000000000000000000000000000000..65eaa9843ec3af33e994ea34ed8d219ce712ffaf --- /dev/null +++ b/src/main/java/Team5/SmartTowns/rewards/RewardsRepositoryJDBC.java @@ -0,0 +1,73 @@ +//Implements the locations repository using JDBC +package Team5.SmartTowns.rewards; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public class RewardsRepositoryJDBC implements RewardsRepository { + private final JdbcTemplate jdbc; + private RowMapper<Badge> badgeMapper; + private RowMapper<Sticker> stickerMapper; + private RowMapper<Pack> packMapper; + + public RewardsRepositoryJDBC(JdbcTemplate aJdbc) { + this.jdbc = aJdbc; + setStickerMapper(); + setPackMapper(); + } + + private void setStickerMapper(){ + stickerMapper = (rs, i) -> new Sticker( + rs.getInt("packID"), + rs.getInt("stickerID"), + rs.getString("name"), + rs.getString("description"), + rs.getInt("rarity") + ); + } + private void setPackMapper(){ + packMapper = (rs, i) -> new Pack( + rs.getInt("id"), + rs.getString("name"), + rs.getString("description") + ); + } + + @Override + public List<Sticker> getAllStickers(){ + String sql= "SELECT * FROM stickers"; + return jdbc.query(sql, stickerMapper); + } + + @Override + public List<Pack> getAllPacks() { + String sql= "SELECT * FROM packs"; + return jdbc.query(sql, packMapper); + } + + @Override + public List<Sticker> getAllStickersFromPack(int packID){ + String sql= "SELECT * FROM stickers WHERE packID="+packID; + return jdbc.query(sql, stickerMapper); + } + + @Override + public List<Sticker> getAllStickersFromUser(int userID) { + /* FINDS ALL STICKERS UNLOCKED BY THE GIVEN USER */ + String sql= "SELECT * FROM stickers LEFT JOIN stickerprogress " + + "ON (stickers.id, stickers.packID) = (stickerprogress.stickerID, stickerprogress.packID) " + + "WHERE stickerprogress.userID="+userID; + return jdbc.query(sql, stickerMapper); + } + + @Override + public Pack findPackByID(int id){ + String sql= "SELECT * FROM packs WHERE id="+id; + List<Pack> result = jdbc.query(sql, packMapper); + return result.isEmpty() ? null : result.get(0); + } +} diff --git a/src/main/java/Team5/SmartTowns/rewards/Sticker.java b/src/main/java/Team5/SmartTowns/rewards/Sticker.java index 4fa498c61e7d5748e7d6dcfc26c7c6442dfd8cc4..7e5315c651bea73aa31572856710b21bbc25457b 100644 --- a/src/main/java/Team5/SmartTowns/rewards/Sticker.java +++ b/src/main/java/Team5/SmartTowns/rewards/Sticker.java @@ -1,37 +1,29 @@ /*AUTHOR: Gabriel Copat*/ package Team5.SmartTowns.rewards; -import lombok.Data; +import lombok.Getter; -import java.io.File; -import java.util.Objects; -@Data -public class Sticker { - /* Stickers are trade-able rewards, they vary in rarity and are earned at random */ +@Getter +public class Sticker extends Reward{ + /* Stickers are randomly earned rewards from a specific pack */ + + final int rarity; //1-5 + final int packID; - int id; - String name; - String description; - String imgPath; - int rarity; //1-5 boolean hasSticker; - public Sticker(int id, String name, String description, int rarity) { - this.id = id; - this.name = name; - this.description = description; + + public Sticker(int packID, int id, String name, String description, int rarity) { + super(id, name, description); this.rarity = rarity; - imgPath = findImagePath(); + this.packID = packID; + displayImg = super.findImagePath(); } - private String findImagePath(){ - /* Finds the image in the Path folder, if image is not found assigns default image */ - String imgPath = "images/rewards/stickers/" + id + ".jpg"; - String notFoundPath = "images/rewards/stickers/0.png"; - - File imgFile = new File("src/main/resources/static/" + imgPath); - return imgFile.exists() ? imgPath : notFoundPath; + @Override + public String getImgFolder() { + return "stickers/" + getPackID(); } public boolean hasSticker(){ @@ -41,21 +33,7 @@ public class Sticker { this.hasSticker = hasSticker; } public String getVisibility(){ - return hasSticker? "" : "grayedOut"; - } - - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Sticker sticker = (Sticker) o; - return id == sticker.id && Objects.equals(name, sticker.name); - } - - @Override - public int hashCode() { - return Objects.hash(id, name); + return hasSticker ? "gotSticker" : "grayedSticker"; } } diff --git a/src/main/java/Team5/SmartTowns/rewards/StickersRepository.java b/src/main/java/Team5/SmartTowns/rewards/StickersRepository.java deleted file mode 100644 index 869c2d07353a7aa090fb7fee79b2d44feacd9b12..0000000000000000000000000000000000000000 --- a/src/main/java/Team5/SmartTowns/rewards/StickersRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -//Holds locations data repository -package Team5.SmartTowns.rewards; - -import java.util.List; - -public interface StickersRepository { - List<Sticker> getAllStickers(); -} - diff --git a/src/main/java/Team5/SmartTowns/rewards/StickersRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/rewards/StickersRepositoryJDBC.java deleted file mode 100644 index 64df71bc3da3eff327377798185111aee3be7867..0000000000000000000000000000000000000000 --- a/src/main/java/Team5/SmartTowns/rewards/StickersRepositoryJDBC.java +++ /dev/null @@ -1,33 +0,0 @@ -//Implements the locations repository using JDBC -package Team5.SmartTowns.rewards; - -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public class StickersRepositoryJDBC implements StickersRepository { - private JdbcTemplate jdbc; - private RowMapper<Sticker> stickerMapper; - - public StickersRepositoryJDBC(JdbcTemplate aJdbc) { - this.jdbc = aJdbc; - setStickerMapper(); - } - private void setStickerMapper(){ - stickerMapper = (rs, i) -> new Sticker( - rs.getInt("stickerID"), - rs.getString("name"), - rs.getString("description"), - rs.getInt("rarity") - ); - } - - @Override - public List<Sticker> getAllStickers(){ - String sql= "SELECT * FROM stickers"; - return jdbc.query(sql, stickerMapper); - } -} diff --git a/src/main/java/Team5/SmartTowns/Towns/TownController.java b/src/main/java/Team5/SmartTowns/towns/TownController.java similarity index 94% rename from src/main/java/Team5/SmartTowns/Towns/TownController.java rename to src/main/java/Team5/SmartTowns/towns/TownController.java index aa15a341da7fe2ef346f5278ae1a55faaa3136fc..9063712be2de660379c504bb064254367dcaa3d8 100644 --- a/src/main/java/Team5/SmartTowns/Towns/TownController.java +++ b/src/main/java/Team5/SmartTowns/towns/TownController.java @@ -1,4 +1,4 @@ -package Team5.SmartTowns.Towns; +package Team5.SmartTowns.towns; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; diff --git a/src/main/java/Team5/SmartTowns/towns/TownStorage.java b/src/main/java/Team5/SmartTowns/towns/TownStorage.java new file mode 100644 index 0000000000000000000000000000000000000000..988a20223b33d27fbccab94007a1efb6e3088bbb --- /dev/null +++ b/src/main/java/Team5/SmartTowns/towns/TownStorage.java @@ -0,0 +1,44 @@ +package Team5.SmartTowns.towns; + +import java.util.ArrayList; +import java.util.List; + +public class TownStorage { + private List<Towns> townList; + private static TownStorage singleton; + + TownStorage() { + townList = new ArrayList<>(); + townList.addAll( + List.of( + new Towns("Caerphilly",01,3,70,"/images/banners/CaerphillyCastle.jpg"), + new Towns("Risca",02,2,34,"/images/banners/RiscaBanner.jpg"), + new Towns("Penarth",03,5,0,"/images/banners/PenarthBanner.jpg"), + new Towns("Penarth",03,5,50,"/images/banners/PenarthBanner.jpg"), + new Towns("Caerphilly",01,3,70,"/images/banners/CaerphillyCastle.jpg"), + new Towns("Risca",02,2,90,"/images/banners/RiscaBanner.jpg"), + new Towns("Penarth",03,5,100,"/images/banners/PenarthBanner.jpg") + + + + ) + + ); + + } + public static TownStorage getInstance() { + if (singleton == null) { + singleton = new TownStorage(); + + } + return singleton; + } + + public List<Towns> getTownList() { + return townList; + } + + + + +} diff --git a/src/main/java/Team5/SmartTowns/Towns/Towns.java b/src/main/java/Team5/SmartTowns/towns/Towns.java similarity index 97% rename from src/main/java/Team5/SmartTowns/Towns/Towns.java rename to src/main/java/Team5/SmartTowns/towns/Towns.java index a1b103f7abf6aa4379d877c645185f2c522a25ba..ebe6fd4797c205ace803727026e64837a2af93e6 100644 --- a/src/main/java/Team5/SmartTowns/Towns/Towns.java +++ b/src/main/java/Team5/SmartTowns/towns/Towns.java @@ -1,4 +1,4 @@ -package Team5.SmartTowns.Towns; +package Team5.SmartTowns.towns; import lombok.Data; diff --git a/src/main/java/Team5/SmartTowns/trails/TrailsController.java b/src/main/java/Team5/SmartTowns/trails/TrailsController.java index 004fdabd4e836fb7e4110f8d3f63bad76fb8b3d4..c6472019b4e17f3ff6aa4c60188ad524bfc10010 100644 --- a/src/main/java/Team5/SmartTowns/trails/TrailsController.java +++ b/src/main/java/Team5/SmartTowns/trails/TrailsController.java @@ -1,7 +1,7 @@ package Team5.SmartTowns.trails; -import Team5.SmartTowns.Landmarks.Landmarks; +import Team5.SmartTowns.landmarks.Landmarks; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; @@ -11,7 +11,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; -import static Team5.SmartTowns.Landmarks.Landmarks.landmarksDragonstrail; +import static Team5.SmartTowns.landmarks.Landmarks.landmarksDragonstrail; //import static Team5.SmartTowns.Landmarks.Landmarks.landmarksDragonstrail; diff --git a/src/main/java/Team5/SmartTowns/users/User.java b/src/main/java/Team5/SmartTowns/users/User.java index 1e13ad566cc794c429ee93bdcac0dd22acce5b5d..4ef65c3b288f9433e37d60e8e984b869f3a8d53e 100644 --- a/src/main/java/Team5/SmartTowns/users/User.java +++ b/src/main/java/Team5/SmartTowns/users/User.java @@ -17,7 +17,6 @@ public class User { String name; String imgPath; int dragonProgress; - Map<Badge, Integer> badgeProgress = new HashMap<>(); // Demonstrates the progress towards a specific badge (0-100) Map<Sticker, Boolean> hasStickers = new HashMap<>(); // True if User has sticker (key) Map<Integer, Boolean> dragonstaleLandmarkIDs = new HashMap<>(); // Storing the IDs of the landmarks associated with Dragonstale, as well as if the user has visited it before (boolean) @@ -26,7 +25,12 @@ public class User { this.email = email; this.name = name; this.dragonProgress = dragonProgress; -// this.dragonstaleLandmarkIDs = dragonstaleLandmarkIDs; + imgPath = findImagePath(); + } + public User(int id, String email, String name) { + this.id = id; + this.email = email; + this.name = name; imgPath = findImagePath(); } diff --git a/src/main/java/Team5/SmartTowns/users/UserController.java b/src/main/java/Team5/SmartTowns/users/UserController.java index d635c8a401d85ef6d930142882d69b5528f38fd7..989d13b7161f783dc75bdcb9dbf379808b1584e4 100644 --- a/src/main/java/Team5/SmartTowns/users/UserController.java +++ b/src/main/java/Team5/SmartTowns/users/UserController.java @@ -1,10 +1,9 @@ package Team5.SmartTowns.users; -import Team5.SmartTowns.rewards.Badge; -import Team5.SmartTowns.rewards.BadgesRepository; +import Team5.SmartTowns.rewards.Pack; +import Team5.SmartTowns.rewards.RewardsRepository; import Team5.SmartTowns.rewards.Sticker; -import Team5.SmartTowns.rewards.StickersRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @@ -12,7 +11,6 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.servlet.ModelAndView; import java.util.List; -import java.util.Map; @Controller public class UserController { @@ -20,13 +18,11 @@ public class UserController { @Autowired private UserRepository userRepository; @Autowired - private BadgesRepository badgesRepository; - @Autowired - private StickersRepository stickersRepository; + private RewardsRepository rewardsRepository; @GetMapping("/login") public ModelAndView getLoginPage() { - ModelAndView mav = new ModelAndView("rewards/login"); + ModelAndView mav = new ModelAndView("users/login"); // List<User> users = userRepository.getAllUsers(); // mav.addObject("users", users); return mav; @@ -42,21 +38,52 @@ public class UserController { @GetMapping("/user/{id}") public ModelAndView getUserPage(@PathVariable int id) { - ModelAndView mav = new ModelAndView("rewards/userProfile"); - List<Badge> badges = badgesRepository.getAllBadges(); /*DEPRECATED FOR THE MOMENT*/ - mav.addObject("badges", badges); - List<Sticker> allStickers = stickersRepository.getAllStickers(); - List<User> users = userRepository.getAllUsers(); - Map<Long, Boolean> userStickers = userRepository.getStickers(id); + ModelAndView mav = new ModelAndView("users/userProfile"); + List<Pack> allPacks = rewardsRepository.getAllPacks(); + mav.addObject("user", userRepository.getUserById(id)); + mav.addObject("packs", allPacks); - for (Long stickerID : userStickers.keySet()) { //Finds and updates visibility of stickers based on what the user has - allStickers.stream() - .filter(sticker -> sticker.getId()==stickerID) - .findFirst().ifPresent(sticker -> sticker.setVisibility(userStickers.get(stickerID))); - } + mav.addAllObjects(getPackInfo(id, 1).getModelMap()); - mav.addObject("user", userRepository.getUser(id)); - mav.addObject("stickers", allStickers); return mav; } + + @GetMapping("/packInfo/{userID}/{packID}") + public ModelAndView getPackInfo(@PathVariable int userID, @PathVariable int packID) { + /* Displays on page the stickers present in the pack and colour the ones the + * user has acquired */ + + ModelAndView mav = new ModelAndView("users/userFrags :: stickersBox"); + List<Sticker> allStickers = rewardsRepository.getAllStickersFromPack(packID); + List<Long> userStickers = userRepository.getUserStickersFromPack(userID, packID); + + + + mav.addObject("stickers", setStickerVisibility(allStickers, userStickers)); + mav.addObject("progress", getPackProgress(allStickers)); + mav.addObject("selectedPack", rewardsRepository.findPackByID(packID)); + return mav; + } + + public int getPackProgress(List<Sticker> userStickers){ + /* Returns the % of completion of given userStickers */ + double progress = 0; + if (!userStickers.isEmpty()) { + progress = userStickers.stream().filter(Sticker::hasSticker).count(); + progress = progress / userStickers.size(); + progress = Math.round(progress * 100); + } + return (int) progress; + } + + public List<Sticker> setStickerVisibility(List<Sticker> displayedStickers, List<Long> userStickers){ + /* Makes displayedStickers which are present in userStickers visible */ + for (Long stickerID : userStickers) { + displayedStickers.stream() + .filter(sticker -> sticker.getId()==stickerID) //Tries to find matching id from the two lists + .findFirst().ifPresent(sticker -> sticker.setVisibility(true)); + } + return displayedStickers; + } + } diff --git a/src/main/java/Team5/SmartTowns/users/UserRepository.java b/src/main/java/Team5/SmartTowns/users/UserRepository.java index c6cca35048256beb897a69a9bf67a6087d836e28..f0f01269786128dd9afaa8d3becd5b3ada4944fa 100644 --- a/src/main/java/Team5/SmartTowns/users/UserRepository.java +++ b/src/main/java/Team5/SmartTowns/users/UserRepository.java @@ -2,13 +2,10 @@ package Team5.SmartTowns.users; import java.util.List; -import java.util.Map; public interface UserRepository { List<User> getAllUsers(); -// Map<Long, Integer> getBadgeProgress(int id); - Map<Long, Boolean> getStickers(int id); -// Map<Integer, Boolean> getTest(int id); -// Map<Long, Boolean> getDTCompletion(int id); - User getUser(int id); + List<Long> getUserStickersFromPack(int userID, int packID); + User getUserById(int userID); + boolean unlockSticker(int userID, int packID, int stickerID); } diff --git a/src/main/java/Team5/SmartTowns/users/UserRepositoryJDBC.java b/src/main/java/Team5/SmartTowns/users/UserRepositoryJDBC.java index 93b0cf5de2a9c533be5bda7e17b24cd0585dec3c..8b46fc3a568455e91c180b66fc91b65f20d20c81 100644 --- a/src/main/java/Team5/SmartTowns/users/UserRepositoryJDBC.java +++ b/src/main/java/Team5/SmartTowns/users/UserRepositoryJDBC.java @@ -7,7 +7,6 @@ import org.springframework.stereotype.Repository; import java.util.HashMap; import java.util.List; -import java.util.Map; @Repository public class UserRepositoryJDBC implements UserRepository{ @@ -21,10 +20,9 @@ public class UserRepositoryJDBC implements UserRepository{ private void setUserMapper(){ userMapper = (rs, i) -> new User( - rs.getInt("userID"), + rs.getInt("id"), rs.getString("email"), - rs.getString("name"), - rs.getInt("dragonProgress") + rs.getString("name") ); } @@ -36,44 +34,23 @@ public class UserRepositoryJDBC implements UserRepository{ @Override - public User getUser(int id){ - String sql= "SELECT * FROM users WHERE userID="+id; + public User getUserById(int userID){ + String sql= "SELECT * FROM users WHERE id="+userID; List<User> result = jdbc.query(sql, userMapper); - return result.get(0); + return result.isEmpty() ? null : result.get(0); } @Override - public Map<Long, Boolean> getStickers(int id){ - String sql = "SELECT stickerID, hasSticker FROM stickerprogress WHERE userID=" + id; - List<Map<String, Object>> query = jdbc.queryForList(sql); - Map<Long, Boolean> progress = new HashMap<>(); - for (Map<String, Object> result : query) { - progress.put((Long)result.get("stickerID"), (boolean)result.get("hasSticker")); - } - return progress; + public List<Long> getUserStickersFromPack(int userID, int packID) { + String sql = "SELECT stickerID FROM stickerprogress WHERE (userID, packID)= (" + userID + "," + packID + ")"; + return jdbc.queryForList(sql, Long.class); } -// @Override -// public Map<Long, Boolean> getDTCompletion(int id){ -// //Using prepared statement to prevent SQL injections -// String sql = "SELECT userid, qrCodeSCAN FROM testuser WHERE userID= ?"; -// List<Map<String, Object>> dtQuery = jdbc.queryForList(sql, id); -// Map<Long, Boolean> dtProgress = new HashMap<>(); -// for (Map<String, Object> result : dtQuery) { -// dtProgress.put((Long)result.get("stickerID"), (boolean)result.get("hasSticker")); -// } -// return dtProgress; -// } - - -// @Override -// public Map<Long, Integer> getBadgeProgress(int id){ -// String sql = "SELECT badgeID, progress FROM badgeprogress WHERE userID=" + id; -// List<Map<String, Object>> query = jdbc.queryForList(sql); -// Map<Long, Integer> progress = new HashMap<>(); -// for (Map<String, Object> result : query) { -// progress.put((Long)result.get("badgeID"), (int)result.get("progress")); -// } -// return progress; -// } + @Override + public boolean unlockSticker(int userID, int packID, int stickerID){ + String sql = "INSERT INTO stickerprogress (userID, packID, stickerID) VALUES (" + + userID + ", " + packID + "," + stickerID + ")"; + jdbc.update(sql); + return true; + } } diff --git a/src/main/java/Team5/SmartTowns/Webpages/WebpageController.java b/src/main/java/Team5/SmartTowns/webpages/WebpageController.java similarity index 55% rename from src/main/java/Team5/SmartTowns/Webpages/WebpageController.java rename to src/main/java/Team5/SmartTowns/webpages/WebpageController.java index 37a30366e5335d1870c202d1a49b4a5d2bca474d..7cb5243f41e420e1640d5419fb39524df543761d 100644 --- a/src/main/java/Team5/SmartTowns/Webpages/WebpageController.java +++ b/src/main/java/Team5/SmartTowns/webpages/WebpageController.java @@ -1,10 +1,7 @@ -package Team5.SmartTowns.Webpages; +package Team5.SmartTowns.webpages; -import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import org.springframework.stereotype.Controller; @Controller @@ -26,20 +23,4 @@ public class WebpageController { ModelAndView modelAndView = new ModelAndView("Towns/risca"); return modelAndView; } - -// @GetMapping("/home") -// public ModelAndView getHome(){ -// ModelAndView modelAndView = new ModelAndView("Towns/home/homePage"); -// return modelAndView; -// } - - - @RequestMapping(value="/test_ajax_frag", method=RequestMethod.POST) - public String sendHtmlFragment(Model map) { - //map.addAttribute("foo", "bar"); - return "fragments/temp_frags.html :: trailInfo2"; - } - - - } diff --git a/src/main/resources/QRCodeScanner.html b/src/main/resources/QRCodeScanner.html deleted file mode 100644 index 11da0658b1421e28159c97fc5abae82030ff3630..0000000000000000000000000000000000000000 --- a/src/main/resources/QRCodeScanner.html +++ /dev/null @@ -1,10 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="UTF-8"> - <title>QR Camera</title> -</head> -<body> - -</body> -</html> \ No newline at end of file diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index 40fefacad3c479dd900e3952793535612f2ed229..830f9672f0c4bb7c103027a2470d87fb15d259cd 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -1,6 +1,6 @@ delete from users; -insert into users (email, name, dragonProgress) value ('hannah@gmail.com', 'Hannah', '90'); -insert into users (userID, email, name, dragonProgress) value ('2', 'nigel@gmail.com', 'Nigel', '40'); +insert into users (email, name) value ('hannah@gmail.com', 'Hannah'); +insert into users (email, name) value ('nigel@gmail.com', 'Nigel'); delete from trails; insert into trails ( Name) value ( 'Caerphilly Coffee Trail'); @@ -32,26 +32,32 @@ insert into locations ( locationName , locationEmail,locationDescription,locatio insert into locations (locationID, locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value (19, 'The Esplanade','','Location description here','Penarth',0301); insert into locations (locationID, locationName , locationEmail,locationDescription,locationPlace, locationTrailID) value (20, 'The Old Swimming Baths','','Location description here','Penarth',0301); -delete from badges; -insert into badges (name, description, difficulty) value ('TownConnoisseur', 'You know the town very well!', '2'); -insert into badges (name, description, difficulty) value ('TownRegular', 'You visited the town 3 days in a row!', '1'); -insert into badges (name, description, difficulty) value ('TownMaster', 'You visited the town 7 days in a row!', '1'); -insert into badges (name, description, difficulty) value ('TownRegular', 'You visited the town 3 days in a row!', '1'); -insert into badges (name, description, difficulty) value ('TownRegular', 'You visited the town 3 days in a row!', '1'); -delete from stickers; -insert into stickers (name, description, rarity) value ('TownConnoisseur', 'You know the town very well!', '2'); -insert into stickers (name, description, rarity) value ('TownRegular', 'You visited the town 3 days in a row!', '1'); -insert into stickers (name, description, rarity) value ('TownMaster', 'You visited the town 7 days in a row!', '1'); -insert into stickers (name, description, rarity) value ('TownRegular', 'You visited the town 3 days in a row!', '1'); -insert into stickers (name, description, rarity) value ('TownRegular', 'You visited the town 3 days in a row!', '1'); -delete from badgeprogress; -insert into badgeprogress (userID, badgeID, progress) value ('1', '1', '40'); -insert into badgeprogress (userID, badgeID, progress) value ('1', '2', '70'); -insert into badgeprogress (userID, badgeID, progress) value ('2', '2', '70'); +delete from packs; +insert into packs (name, description) value ('Wales Football Team', 'Pack of Welsh Football Players in the National Team'); +insert into packs (name, description) value ('Wales Rugby Team', 'Pack of Welsh Rugby Players in the National Team'); +insert into packs (name, description) value ('Welsh Heritage', 'Pack About Welsh Heritage'); + +delete from stickers; +insert into stickers (packID, stickerID, name, description, rarity) value (1, 1, 'wayne_hennessey', 'Wales Football Team Player', '2'); +insert into stickers (packID, stickerID, name, description, rarity) value (1, 2, 'neco_williams', 'Wales Football Team Player', '2'); +insert into stickers (packID, stickerID, name, description, rarity) value (1, 3, 'joe_morrell', 'Wales Football Team Player', '2'); +insert into stickers (packID, stickerID, name, description, rarity) value (1, 4, 'ethan_ampadu', 'Wales Football Team Player', '2'); +insert into stickers (packID, stickerID, name, description, rarity) value (1, 5, 'connor_roberts', 'Wales Football Team Player', '2'); +insert into stickers (packID, stickerID, name, description, rarity) value (2, 1, 'Taine_Basham', 'Wales Rugby Team Player', '1'); +insert into stickers (packID, stickerID, name, description, rarity) value (2, 2, 'Adam Beard', 'Wales Rugby Team Player', '1'); +insert into stickers (packID, stickerID, name, description, rarity) value (2, 3, 'Elliot Dee', 'Wales Rugby Team Player', '1'); +insert into stickers (packID, stickerID, name, description, rarity) value (2, 4, 'Corey Domachowski', 'Wales Rugby Team Player', '1'); +insert into stickers (packID, stickerID, name, description, rarity) value (2, 5, 'Ryan Elias', 'Wales Rugby Team Player', '1'); +insert into stickers (packID, stickerID, name, description, rarity) value (3, 1, 'Welsh Lady', 'Welsh Heritage', '1'); +insert into stickers (packID, stickerID, name, description, rarity) value (3, 2, 'Welsh Outline', 'Welsh Heritage', '1'); +insert into stickers (packID, stickerID, name, description, rarity) value (3, 3, 'Welsh Spoon', 'Welsh Heritage', '1'); delete from stickerprogress; -insert into stickerprogress (userID, stickerID, hasSticker) value ('1', '1', true); -insert into stickerprogress (userID, stickerID, hasSticker) value ('1', '3', true); -insert into stickerprogress (userID, stickerID, hasSticker) value ('2', '2', true); +insert into stickerprogress (userID, packID, stickerID) value (1, 1, 1); +insert into stickerprogress (userID, packID, stickerID) value (1, 1, 2); +insert into stickerprogress (userID, packID, stickerID) value (1, 1, 3); +insert into stickerprogress (userID, packID, stickerID) value (1, 1, 5); +insert into stickerprogress (userID, packID, stickerID) value (1, 2, 1); +insert into stickerprogress (userID, packID, stickerID) value (1, 2, 3); \ No newline at end of file diff --git a/src/main/resources/index.html b/src/main/resources/index.html deleted file mode 100644 index 489349d1b63d75904028b48ddd4eb36d29f63650..0000000000000000000000000000000000000000 --- a/src/main/resources/index.html +++ /dev/null @@ -1,11 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="UTF-8"> - <title>Home Page</title> -</head> -<body> -<h1>Welcome to the home page</h1> - -</body> -</html> \ No newline at end of file diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 44b983453ce1552774bb0a8529fffb3d18ce4276..b5908000f5460b1c03f7531b5615a19f9c5e5d01 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -17,45 +17,48 @@ create table if not exists locations locationTrailID varchar(128) ) engine=InnoDB; + drop table if exists users; +drop table if exists stickers; +drop table if exists packs; +drop table if exists stickerProgress; + create table if not exists users ( - userID bigint auto_increment primary key, + id bigint auto_increment primary key, email varchar(128), - name varchar(128), + name varchar(30), dragonProgress int, dragonsLandmarkIDs longtext ) engine=InnoDB; -drop table if exists badges; -create table if not exists badges + +create table if not exists packs ( - badgeID bigint auto_increment primary key, - name varchar(128), - description varchar(128), - difficulty bigint + id bigint auto_increment primary key, + name varchar(20), + description text ) engine=InnoDB; -drop table if exists stickers; create table if not exists stickers ( - stickerID bigint auto_increment primary key, - name varchar(128), - description varchar(128), - rarity bigint -) engine=InnoDB; + id bigint auto_increment primary key, + packID bigint, + FOREIGN KEY (packID) REFERENCES packs(id) + ON DELETE CASCADE + ON UPDATE RESTRICT, + stickerID bigint, /*STICKER ID NUMBER WITHIN ITS OWN PACK*/ + name varchar(30), + description text, + rarity tinyint -drop table if exists badgeProgress; -create table if not exists badgeProgress -( - userID bigint, - badgeID bigint, - progress int /*0-100*/ ) engine=InnoDB; create table if not exists stickerProgress ( + id bigint auto_increment primary key, userID bigint, - stickerID bigint, - hasSticker boolean /*Has sticker or not*/ -) engine=InnoDB; \ No newline at end of file + packID bigint, + stickerID bigint + +) engine=InnoDB; diff --git a/src/main/resources/static/css/userProfile.css b/src/main/resources/static/css/userProfile.css index 8ceb77b4e82d8c44f9aefdcf9c1f54493771e668..878ab054fc53828cb76726775109ca7d3f4bcc80 100644 --- a/src/main/resources/static/css/userProfile.css +++ b/src/main/resources/static/css/userProfile.css @@ -37,13 +37,21 @@ & p { line-height: 1.1; color: white;} } } - +html{ + height: 100%; + @media only screen and (min-device-width: 1500px) { + height: auto; + } +} body { background: linear-gradient(135deg, #f7e8fd, #9914d1); - height: 100svh; + height: 100%; display: flex; flex-direction: column; justify-content: space-evenly; + @media only screen and (min-device-width: 1500px) { + height: auto; + } } main { background: linear-gradient(to bottom, #1e1e1e 10%, darkgoldenrod 50%, #1e1e1e 90%); @@ -55,8 +63,16 @@ main { margin-top: 6em; padding-inline: 1vw; box-shadow: rgba(0, 0, 0, 0.7) 0 0.5svh max(1vw, 1em); - - + transition: all linear 2s; + overflow-y: scroll; + height: 90%; + @media only screen and (min-device-width: 1500px) { + padding-inline: 20%; + overflow: visible; + } +} +.rewards { + position: relative; } .userInfo { display: flex; @@ -81,15 +97,16 @@ main { box-shadow: rgba(0, 0, 0, 0.7) 0 0.5svh 1vw -1vw; } } -#badgesBar::-webkit-scrollbar { +#packsBar::-webkit-scrollbar { display: none; -ms-scrollbar-darkshadow-color: transparent; } -#badgesBar { +#packsBar { + position: static; display: grid; grid-template-areas: "header" - "badges"; + "packs"; overflow-x: scroll; overflow-y: hidden; color: white; @@ -110,31 +127,54 @@ main { height: 1.2em; } - & #allBadgesContainer { + & #allPacksContainer { margin-top: 3svh; - grid-area: badges; - height: 10svh; - align-content: center; + grid-area: packs; + height: 12svh; + width: 100%; display: flex; + justify-content: space-between; @media only screen and (min-device-width: 501px) { height: 20vw; margin-top: 6vw; } } - & .badgeImg { + & .packContainer{ + position: relative; + height: 12svh; + width: 20vw; + display: flex; + flex-direction: column; + text-align: center; + justify-content: center; + overflow: visible; + } + + & .packImg { + position: relative; margin-inline: 3vw; height: 8svh; + /*width: 25%;*/ z-index: 50; @media only screen and (min-device-width: 501px) { height: 15vw; } transition: 0.3s ease-out 100ms; } - & .badgeImg:hover { + & .packImg:hover { /*box-shadow: 0 0 20px 10px #bbbb00;*/ transform: scale(1.5,1.5); } + & .packName { + height: 4svh; + display: flex; + justify-content: center; + font-size: 2em; + overflow: hidden; + align-items: flex-end; + + } } #stickersBox { @@ -145,6 +185,7 @@ main { /* border-bottom-right-radius: 2vw; */ /*background: linear-gradient(to bottom, darkgoldenrod, transparent 90%);*/ margin-top: -1%; + height: 500px; & h2 { font-size: 4em; text-align: center; @@ -360,4 +401,8 @@ header .footerButton:hover { font-size: 0.6em; opacity: 0; transition: 0.5s ease-in-out 1ms; +} + +.rewards { + transition: 1s ease-in-out 1ms; } \ No newline at end of file diff --git a/src/main/resources/static/css/userProfile2.css b/src/main/resources/static/css/userProfile2.css new file mode 100644 index 0000000000000000000000000000000000000000..0728cbc6e973473051420fd817d243d5d484c489 --- /dev/null +++ b/src/main/resources/static/css/userProfile2.css @@ -0,0 +1,309 @@ +/* AUTHOR: Gabriel Copat*/ +@import url('https://fonts.googleapis.com/css2?family=MedievalSharp&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=MedievalSharp&display=swap'); + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + + /*COLOUR PALETTE*/ + @media (prefers-color-scheme: dark) { + --primary-darker: hsl(272, 100%, 10%); + --primary-dark: hsl(271, 100%, 20%); + --primary-colour: hsl(271, 100%, 30%); + --primary-light: hsl(271, 100%, 40%); + --primary-lighter: hsl(271, 100%, 50%); + + --secondary-colour: hsl(12, 81%, 46%); + --accent-colour: hsl(12, 82%, 32%); + --accent-border: hsl(12, 81%, 25%); + + --accent-shadow: rgba(0, 0, 0, 0.7) 0 0.5em 1em -0.5em; + + color: white; + + } + @media (prefers-color-scheme: light) { + --primary-darker: hsl(272, 100%, 10%); + --primary-dark: hsl(271, 100%, 20%); + --primary-colour: hsl(271, 100%, 30%); + --primary-light: hsl(271, 100%, 40%); + --primary-lighter: hsl(271, 100%, 50%); + + --secondary-colour: hsl(12, 81%, 46%); + --accent-colour: hsl(12, 82%, 32%); + --accent-border: hsl(12, 81%, 25%); + + --accent-shadow: rgba(0, 0, 0, 0.7) 0 0.5em 1em -0.5em; + + color: white; + + + } +} + + + +/* DEFAULT CSS MADE FOR SCREEN SIZES WIDTHS + BETWEEN 320px and 640px:*/ + +body { + background: linear-gradient(to bottom right, + var(--primary-darker), + var(--primary-dark), + var(--primary-darker)); + + display: flex; + flex-direction: column; + justify-content: center; + align-content: center; + + position: fixed; + width: 100vw; + height: 100svh; +} + +.grayedSticker { + filter: grayscale(1); +} +.gotSticker { + filter: drop-shadow(0 0 10px yellow); +} + + +html { + position: fixed; + width: 100vw; + height: 100svh; +} +main { + width: 90%; + height: 95%; + background: linear-gradient(to bottom left, #1f1f1f, #1e1e1e, #1f1f1f); + overflow-x: hidden; + overflow-y: scroll; + margin-inline: auto; + + display: flex; + flex-direction: column; + align-content: flex-start; + align-items: center; + border-radius: 5vw; +} +.userContainer { + width: 90%; + padding-block: 2em; + margin-block: 1em; + border-radius: 5vw; + display: flex; + flex-direction: row-reverse; + /*align-items: center;*/ + justify-content: space-evenly; + + row-gap: 1svh; + + & h1 { + font-size: 5em; + text-align: center; + text-shadow: black 0 0.2em 0.5em; + letter-spacing: 0.1em; + width: 40vw; + max-height: 40vw; + /*border-bottom: black solid 3px;*/ + padding-inline: 5%; + padding-block: 2%; + border-radius: 35%; + /*box-shadow: var(--accent-shadow);*/ + /*background: var(--accent-border);*/ + align-self: center; + text-wrap: normal; + } + & #userPicture { + border-radius: 100%; + box-shadow: var(--accent-shadow); + overflow: hidden; + } + +} + + +.rewards { + position: relative; + display: flex; + flex-direction: column; + overflow: visible; + width: 100%; +} +#packsBar { + position: relative; + display: flex; + flex-direction: column; + justify-content: space-evenly; + text-align: center; + width: 100%; + & h2 { + font-size: 4em; + letter-spacing: 0.1em; + border-bottom: 10px solid darkred; + margin-inline: 5%; + } + +} +#allPacksContainer { + padding-top: 3em; + display: flex; + overflow-x: scroll; + padding-inline: 20%; + justify-content: space-between; + border-bottom: 10px solid rgba(139, 0, 0, 0.5); + margin-bottom: 2em; + & .packName { + font-size: 2em; + height: 2.4em; + overflow: hidden; + padding-bottom: 1em; + display: flex; + justify-content: center; + align-content: flex-start; + + } + & .packImg { + transition: 0.5s ease-in-out 1ms; + border-radius: 20%; + } +} +.packImg:hover { + transform: scale(1.5, 1.5) +} +.progressionContainer { + display: flex; + flex-direction: column; + height: 18svh; + & h1 { + font-size: 4em; + width: 100%; + font-family: 'MedievalSharp', cursive; + text-align: center; + overflow-x: scroll; + overflow-y: hidden; + } + & .progImgContainer { + position: relative; + margin-inline: auto; + & .progImg { + height: 14svh; + /*width: 16svh;*/ + border-radius: 20%; + } + & .progImgFill { + position: absolute; + overflow: hidden; + width: 50%; + } + & .progImgOutline { + opacity: 0.1; + filter: grayscale(1); + } + & .progText { + font-family: Consolas, serif; + opacity: 0.5; + -webkit-text-stroke: 1px black; + position: absolute; + text-align: center; + width: 16svh; + left:50%; + transform: translate(-50%, 150%); + font-size: 3em; + } + + } + +} + +#stickersBox { + width: 100%; +} +.stickersContainer { + display: flex; + flex-wrap: wrap; + justify-content: center; + margin-top: 2em; + row-gap: 2em; + height: 100%; + +} +.stickerImg { + height: 17em; + margin: 1.5em; +} +/*}*/ + +@media only screen +and (min-device-width: 320px) +and (max-device-width: 640px) { + #userPicture { + width: 30vw; + height: 30vw; + border: solid #989898 0.8em; + } + .packImg { + height: 10svh; + width: 15em; + padding-inline: 1em; + margin-inline: 1em; + } + #allPacksContainer::-webkit-scrollbar { + display: none; + -ms-scrollbar-darkshadow-color: transparent; + } +} + +@media only screen +and (min-device-width: 1000px) { + #userPicture { + width: 200px; + height: 200px; + border: solid #989898 10px; + } + #allPacksContainer { + padding:0; + margin-block: 50px; + width: 100%; + height: 100%; + overflow: visible; + border: 5px solid rgba(139, 0, 0, 0.5); + justify-content: space-evenly; + } + .packImg { + height: 100px; + width: 125px; + padding-inline: 1em; + margin-inline: 3em; + } + .packImg:hover{ + transform: scale(2,2); + } + .packImg:hover ~ .packName{ + visibility: visible; + opacity: 1; + } + & .packName { + position: absolute; + visibility: hidden; + text-align: center; + left: 50%; + transform: translate(-50%); + opacity: 0; + transition: opacity 1s; + } + #packsBar { + /*height: 250px;*/ + & h2 { + display: none; + } + } + .progressionContainer { + height: 20svh; + } +} \ No newline at end of file diff --git a/src/main/resources/static/images/LinkedIn.jpg b/src/main/resources/static/images/LinkedIn.jpg deleted file mode 100644 index 6bf094d20c89883756ec5a105ec2cea1f9eeaf76..0000000000000000000000000000000000000000 Binary files a/src/main/resources/static/images/LinkedIn.jpg and /dev/null differ diff --git "a/src/main/resources/static/images/Twitter-Log\320\276.png" "b/src/main/resources/static/images/Twitter-Log\320\276.png" deleted file mode 100644 index c475939bfacb4be3559aab3d58a9a5eadf036afb..0000000000000000000000000000000000000000 Binary files "a/src/main/resources/static/images/Twitter-Log\320\276.png" and /dev/null differ diff --git a/src/main/resources/static/images/badges.png b/src/main/resources/static/images/badges.png deleted file mode 100644 index 57e379c719f5fe28ba827d7007be9637cfd9ff73..0000000000000000000000000000000000000000 Binary files a/src/main/resources/static/images/badges.png and /dev/null differ diff --git a/src/main/resources/static/images/CaerphillyCastle.jpg b/src/main/resources/static/images/banners/CaerphillyCastle.jpg similarity index 100% rename from src/main/resources/static/images/CaerphillyCastle.jpg rename to src/main/resources/static/images/banners/CaerphillyCastle.jpg diff --git a/src/main/resources/static/images/PenarthBanner.jpg b/src/main/resources/static/images/banners/PenarthBanner.jpg similarity index 100% rename from src/main/resources/static/images/PenarthBanner.jpg rename to src/main/resources/static/images/banners/PenarthBanner.jpg diff --git a/src/main/resources/static/images/RiscaBanner.jpg b/src/main/resources/static/images/banners/RiscaBanner.jpg similarity index 100% rename from src/main/resources/static/images/RiscaBanner.jpg rename to src/main/resources/static/images/banners/RiscaBanner.jpg diff --git a/src/main/resources/static/images/Facebook.png b/src/main/resources/static/images/icons/Facebook.png similarity index 100% rename from src/main/resources/static/images/Facebook.png rename to src/main/resources/static/images/icons/Facebook.png diff --git a/src/main/resources/static/images/Instagram.jpg b/src/main/resources/static/images/icons/Instagram.jpg similarity index 100% rename from src/main/resources/static/images/Instagram.jpg rename to src/main/resources/static/images/icons/Instagram.jpg diff --git a/src/main/resources/static/images/Linkedin.png b/src/main/resources/static/images/icons/Linkedin.png similarity index 100% rename from src/main/resources/static/images/Linkedin.png rename to src/main/resources/static/images/icons/Linkedin.png diff --git a/src/main/resources/static/images/Twitter.jpg b/src/main/resources/static/images/icons/Twitter.jpg similarity index 100% rename from src/main/resources/static/images/Twitter.jpg rename to src/main/resources/static/images/icons/Twitter.jpg diff --git a/src/main/resources/static/images/VZTA.png b/src/main/resources/static/images/icons/VZTA.png similarity index 100% rename from src/main/resources/static/images/VZTA.png rename to src/main/resources/static/images/icons/VZTA.png diff --git a/src/main/resources/static/images/rewards/packs/0.png b/src/main/resources/static/images/rewards/packs/0.png new file mode 100644 index 0000000000000000000000000000000000000000..af986ffdeaf3478c06e47ca8f8231b62ee54e862 Binary files /dev/null and b/src/main/resources/static/images/rewards/packs/0.png differ diff --git a/src/main/resources/static/images/rewards/packs/1.png b/src/main/resources/static/images/rewards/packs/1.png new file mode 100644 index 0000000000000000000000000000000000000000..af986ffdeaf3478c06e47ca8f8231b62ee54e862 Binary files /dev/null and b/src/main/resources/static/images/rewards/packs/1.png differ diff --git a/src/main/resources/static/images/rewards/packs/2.png b/src/main/resources/static/images/rewards/packs/2.png new file mode 100644 index 0000000000000000000000000000000000000000..49e1ffc1ddad8ce3d6806f388f4dd70cd59c233e Binary files /dev/null and b/src/main/resources/static/images/rewards/packs/2.png differ diff --git a/src/main/resources/static/images/rewards/dragonFilled.png b/src/main/resources/static/images/rewards/packs/3.png similarity index 100% rename from src/main/resources/static/images/rewards/dragonFilled.png rename to src/main/resources/static/images/rewards/packs/3.png diff --git a/src/main/resources/static/images/rewards/stickers/1/1.png b/src/main/resources/static/images/rewards/stickers/1/1.png new file mode 100644 index 0000000000000000000000000000000000000000..82eda396931e573eb4885e99348a6da6af12dd3d Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/1/1.png differ diff --git a/src/main/resources/static/images/rewards/stickers/1/2.png b/src/main/resources/static/images/rewards/stickers/1/2.png new file mode 100644 index 0000000000000000000000000000000000000000..c3a83c4dc354c66e76318159bf406a82720c1a83 Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/1/2.png differ diff --git a/src/main/resources/static/images/rewards/stickers/1/3.png b/src/main/resources/static/images/rewards/stickers/1/3.png new file mode 100644 index 0000000000000000000000000000000000000000..197da770196d927d3321f17c6fa2b05846a3e589 Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/1/3.png differ diff --git a/src/main/resources/static/images/rewards/stickers/1/4.png b/src/main/resources/static/images/rewards/stickers/1/4.png new file mode 100644 index 0000000000000000000000000000000000000000..824de21bcd8a979419585b88f68b892337905285 Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/1/4.png differ diff --git a/src/main/resources/static/images/rewards/stickers/1/5.png b/src/main/resources/static/images/rewards/stickers/1/5.png new file mode 100644 index 0000000000000000000000000000000000000000..ea442315db144974ad10319936a3f66976b7fc7f Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/1/5.png differ diff --git a/src/main/resources/static/images/rewards/stickers/2/1.png b/src/main/resources/static/images/rewards/stickers/2/1.png new file mode 100644 index 0000000000000000000000000000000000000000..9db9fe209598c122fac00f272b9a0dac20925b06 Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/2/1.png differ diff --git a/src/main/resources/static/images/rewards/stickers/2/2.png b/src/main/resources/static/images/rewards/stickers/2/2.png new file mode 100644 index 0000000000000000000000000000000000000000..8235ea3febeeeae29076d810dc0a989df02c7b3a Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/2/2.png differ diff --git a/src/main/resources/static/images/rewards/stickers/2/3.png b/src/main/resources/static/images/rewards/stickers/2/3.png new file mode 100644 index 0000000000000000000000000000000000000000..81f9ca020c4596076834fdbebb6ca2d51a3b5a35 Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/2/3.png differ diff --git a/src/main/resources/static/images/rewards/stickers/2/4.png b/src/main/resources/static/images/rewards/stickers/2/4.png new file mode 100644 index 0000000000000000000000000000000000000000..43a57a6f9d580bd669eb7bc88b1cd56fb43b5c3c Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/2/4.png differ diff --git a/src/main/resources/static/images/rewards/stickers/2/5.png b/src/main/resources/static/images/rewards/stickers/2/5.png new file mode 100644 index 0000000000000000000000000000000000000000..8926f0b96019ca755895a071a34e7368533ff23d Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/2/5.png differ diff --git a/src/main/resources/static/images/rewards/stickers/3/1.png b/src/main/resources/static/images/rewards/stickers/3/1.png new file mode 100644 index 0000000000000000000000000000000000000000..d759091a2ffb55680062749f999a238a6ae9c26e Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/3/1.png differ diff --git a/src/main/resources/static/images/rewards/stickers/3/2.png b/src/main/resources/static/images/rewards/stickers/3/2.png new file mode 100644 index 0000000000000000000000000000000000000000..9d03b83e1e071ab15c4f9fed3a6cb6df597ffb1a Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/3/2.png differ diff --git a/src/main/resources/static/images/rewards/stickers/3/3.png b/src/main/resources/static/images/rewards/stickers/3/3.png new file mode 100644 index 0000000000000000000000000000000000000000..db70b88cd891c33fcbb3ef5c2b3bcfc8ba6cefb9 Binary files /dev/null and b/src/main/resources/static/images/rewards/stickers/3/3.png differ diff --git a/src/main/resources/static/images/stats.png b/src/main/resources/static/images/stats.png deleted file mode 100644 index 39904f1cfc911df01306fb85ab78b015e7d0386c..0000000000000000000000000000000000000000 Binary files a/src/main/resources/static/images/stats.png and /dev/null differ diff --git a/src/main/resources/static/images/trails.jpg b/src/main/resources/static/images/trails.jpg deleted file mode 100644 index 20481a4f8a914ae8b272f490e2006dd0afaa5a2b..0000000000000000000000000000000000000000 Binary files a/src/main/resources/static/images/trails.jpg and /dev/null differ diff --git a/src/main/resources/static/scripts/login.js b/src/main/resources/static/scripts/login.js index 929b8b61e7a6f0f71a97937b2bdf2fcd83a5ce4f..38ef327134aa8ae03ddc44ddf796b2df139fc3bb 100644 --- a/src/main/resources/static/scripts/login.js +++ b/src/main/resources/static/scripts/login.js @@ -46,4 +46,6 @@ function validateForm(){ return false; } //TODO SERVER SIDE VALIDATION AND CHECK AGAINST USERS DB TABLE -} \ No newline at end of file +} + + diff --git a/src/main/resources/static/scripts/userPage.js b/src/main/resources/static/scripts/userPage.js new file mode 100644 index 0000000000000000000000000000000000000000..2c1d5069ad652b854abf6b8cb460d7ebf89d696f --- /dev/null +++ b/src/main/resources/static/scripts/userPage.js @@ -0,0 +1,11 @@ +function updatePack(userid, packid) { + /* Updates the trail being shown on screen to the one requested by ID */ + $.get("/packInfo/" + userid + "/" + packid).done(function (fragment) { + let packRewardsWrapper = $("#packRewardsWrapper"); + + packRewardsWrapper.fadeTo("slow", 0, function () { + packRewardsWrapper.html(fragment) + packRewardsWrapper.fadeTo("slow", 1); + }) + }); +} \ No newline at end of file diff --git a/src/main/resources/static/test.html b/src/main/resources/static/test.html deleted file mode 100644 index 98a5d8ce3c443e9b3c9e183848b038b11f2df7de..0000000000000000000000000000000000000000 --- a/src/main/resources/static/test.html +++ /dev/null @@ -1,11 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="UTF-8"> - <title>asdasd</title> -</head> -<body> -sadasdasdasd - -</body> -</html> \ No newline at end of file diff --git a/src/main/resources/static/users.html b/src/main/resources/static/users.html deleted file mode 100644 index 566549bdf8fae810809c1a81066000687cb338f6..0000000000000000000000000000000000000000 --- a/src/main/resources/static/users.html +++ /dev/null @@ -1,10 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="UTF-8"> - <title>Title</title> -</head> -<body> - -</body> -</html> \ No newline at end of file diff --git a/src/main/resources/templates/allTrails/allTrails.html b/src/main/resources/templates/allTrails/allTrails.html index 746762b68f64b62190bf71e102edf0ff309772d9..d29d1ad91cf459383b4681678742ed0a2cacbcd6 100644 --- a/src/main/resources/templates/allTrails/allTrails.html +++ b/src/main/resources/templates/allTrails/allTrails.html @@ -10,7 +10,7 @@ </head> <body> -<header th:replace="~{/towns/Templating.html :: header}"></header> +<header th:replace="~{/fragments/Templating.html :: header}"></header> <main> <section id="allTrailsBar" class="centerFlex"> @@ -31,7 +31,7 @@ </section> </main> -<footer th:insert="~{/towns/Templating.html :: footer}"></footer> +<footer th:insert="~{/fragments/Templating.html :: footer}"></footer> <script type="text/javascript" th:src="@{scripts/allTrails.js}"></script> diff --git a/src/main/resources/templates/towns/Templating.html b/src/main/resources/templates/fragments/Templating.html similarity index 74% rename from src/main/resources/templates/towns/Templating.html rename to src/main/resources/templates/fragments/Templating.html index 1313b325bb3027665a9242b8fcd6d9db707af4e7..871e541bd8767e721d139cedfa8dd193b5212987 100644 --- a/src/main/resources/templates/towns/Templating.html +++ b/src/main/resources/templates/fragments/Templating.html @@ -2,7 +2,7 @@ <link rel="stylesheet" href="../../static/css/templatingstyle.css"> <header class="headerBar" th:fragment="header"> <div class="Logo"> - <img src="/images/VZTA.png" height="97" width="400" alt="VZTA Logo"/> + <img src="/images/icons/VZTA.png" height="97" width="400" alt="VZTA Logo"/> </div> <nav class="navBar"> <ul> @@ -41,10 +41,10 @@ <div class="centerFooter"> <span class="footerText"> <h3>Follow Us</h3> - <a href="https://www.facebook.com/VZTAsmarttowns/" class="icon"><img src="/images/Facebook.png" height="25" width="25" alt="Facebook Logo" class="icon"/></a> - <a href="https://www.twitter.com/VZTAsmarttowns/" class="icon"><img src="/images/Twitter.jpg" height="25" width="25" alt="X (formally Twitter) Logo" class="icon"/></a> - <a href="https://www.instagram.com/vztasmarttowns/" class="icon"><img src="/images/Instagram.jpg" height="25" width="25" alt="Instagram Logo" class="icon"/></a> - <a href="https://www.linkin.com/company/vztasmarttowns/" class="icon"><img src="/images/Linkedin.png" height="25" width="25" alt="Linkedin Logo" class="icon"/></a><br> + <a href="https://www.facebook.com/VZTAsmarttowns/" class="icon"><img src="/images/icons/Facebook.png" height="25" width="25" alt="Facebook Logo" class="icon"/></a> + <a href="https://www.twitter.com/VZTAsmarttowns/" class="icon"><img src="/images/icons/Twitter.jpg" height="25" width="25" alt="X (formally Twitter) Logo" class="icon"/></a> + <a href="https://www.instagram.com/vztasmarttowns/" class="icon"><img src="/images/icons/Instagram.jpg" height="25" width="25" alt="Instagram Logo" class="icon"/></a> + <a href="https://www.linkin.com/company/vztasmarttowns/" class="icon"><img src="/images/icons/Linkedin.png" height="25" width="25" alt="Linkedin Logo" class="icon"/></a><br> </span> </div> <div class="copyright" style="text-align: left"> diff --git a/src/main/resources/templates/fragments/temp_frags.html b/src/main/resources/templates/fragments/temp_frags.html deleted file mode 100644 index 03efad3ee73e973e0faf7401b7d3b0de2e1578e4..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/fragments/temp_frags.html +++ /dev/null @@ -1,23 +0,0 @@ -<header th:fragment="header" class="headerBlock"> - <h1 class="headerTitle">SMART-TOWNS</h1> - <div class="headerBanner"> - <img src="images/trails.jpg" alt="Trails" class="bannerBack"> -<!-- <div class="bannerText">--> - <h1 class="bigTitle">Smart Town Trails</h1> - <h2 class="smallTitle">Information about trails for your town</h2> -<!-- </div>--> - </div> -</header> -<footer th:fragment="footer"> - <ul class="footerBar"> - <li class="footerButton">Home</li> - <li class="footerButton">About</li> - <li class="footerButton">Map</li> - <li class="footerButton">Facilities</li> - <li class="footerButton">Search</li> - </ul> -</footer> - -<article class="trailInfo" th:fragment="trailInfo2"> - <h1 class="titleH1" th:text="${trail.name}">Trail Info</h1> -</article> \ No newline at end of file diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html deleted file mode 100644 index 47b1dc1353c7c96bcb3409f54558ff18c4da6cf4..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/home.html +++ /dev/null @@ -1,51 +0,0 @@ -<!DOCTYPE html> -<html> - -<head> - <title>Website Web</title> - <link rel="stylesheet" th:href="@{css/style.css}"> - <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> -</head> - -<body> - <header th:replace="fragments/temp_frags.html :: header"></header> - <main> - <div class="trailList"> - <ul class="ulHeader"> - <li onclick="selectTrail('trail1', this)" class="liHeader" id="trail1" >Trail 1</li> - <li onclick="selectTrail('trail2', this)" class="liHeader selected" id="trail2" >Trail 2</li> - <li onclick="selectTrail('trail3', this)" class="liHeader" id="trail3" >Trail 3</li> - <li onclick="updateOutput()" class="liHeader" id="trail4" >Trail 4</li> - </ul> - </div> - - <section class="mainBlock"> - <article class="trailStats"> - <h1 class="titleH1">Trail Stats</h1> - <img src="../static/images/stats.png" alt="Stats" class="stats"> - <div class="textStats"> - <p><b>Explored:</b> 60%</p> - <p><b>Landmarks Visited:</b> 3/5</p> - <p><b>Shops Visited:</b> 6/10</p> - </div> - </article> - <article id="trailInfoBox" class="trailInfo"></article> - <article class="badgesBlock"> - <h1 class="titleH1">Badges</h1> - <div class="badgesList"> - <img src="../static/images/badges.png" alt="Badge" class="badgeImg"> - <img src="../static/images/badges.png" alt="Badge" class="badgeImg"> - <img src="../static/images/badges.png" alt="Badge" class="badgeImg"> - <img src="../static/images/badges.png" alt="Badge" class="badgeImg"> - <img src="../static/images/badges.png" alt="Badge" class="badgeImg"> - </div> - - </article> - </section> - </main> - - <footer th:replace="fragments/temp_frags.html :: footer"></footer> - <script src="https://code.jquery.com/jquery-1.9.1.js"></script> - <script type="text/javascript" th:src="@{scripts/gabScripts.js}"></script> -</body> -</html> \ No newline at end of file diff --git a/src/main/resources/templates/Landmarks/LandmarkFormTh.html b/src/main/resources/templates/landmarks/LandmarkFormTh.html similarity index 94% rename from src/main/resources/templates/Landmarks/LandmarkFormTh.html rename to src/main/resources/templates/landmarks/LandmarkFormTh.html index b77bb90ece04cc582bc5fa5ea369bd8ba45e864b..0f7879d8277ad1012ffefaae75fc49d70b6932ca 100644 --- a/src/main/resources/templates/Landmarks/LandmarkFormTh.html +++ b/src/main/resources/templates/landmarks/LandmarkFormTh.html @@ -10,7 +10,7 @@ </head> <body> -<header th:insert="~{/towns/Templating.html :: header}"></header> +<header th:insert="~{/fragments/Templating.html :: header}"></header> <hr style="height:20px; visibility:hidden;" /> <H2 id="landmarkFormTitle"> Interested in joining our trails? Sign up Here! </H2> <main> @@ -60,6 +60,6 @@ </main> -<footer th:insert="~{/towns/Templating.html :: footer}"></footer> +<footer th:insert="~{/fragments/Templating.html :: footer}"></footer> </body> </html> \ No newline at end of file diff --git a/src/main/resources/templates/rewards/userProfile.html b/src/main/resources/templates/rewards/userProfile.html deleted file mode 100644 index a193bf7614603637614dd0cfdc0974fdd8c44767..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/rewards/userProfile.html +++ /dev/null @@ -1,73 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="UTF-8"> - <title th:text="'VZLA Profile Page of ' + ${user.getName()}"></title> - <link rel="stylesheet" th:href="@{/css/userProfile.css}"> -<!-- <link rel="stylesheet" th:href="@{/css/templatingstyle.css}">--> -</head> -<body> - -<header> - <ul class="footerBar"> - <li class="footerButton"><b>Home</b></li> - <li class="footerButton"><b>About</b></li> - <li class="footerButton"><b>Map</b></li> - <li class="footerButton"><b>Facilities</b></li> - <li class="footerButton"><b>Log In</b></li> - </ul> -</header> - -<main> - <!--PICTURE - DATA - BADGES --> - <div class="userInfo"> - <img th:src="@{${user.getImgPath()}}" - th:alt="${user.getName()}" - id="userPicture" - > - <h1 th:text="${user.getName()}"></h1> - <!--TODO add some progression info here?--> - </div> - <section class="rewards"> <!--Reward lists, badges on top, stickers (larger) on the bottom--> - <article id="badgesBar"> - <h2>Your Badges: </h2> <!--Shows first earned badges, followed by greyed out badges--> - <div id="allBadgesContainer" class="centerFlex"> - <img class="badgeImg" th:each="badge : ${badges}" th:src="@{'..' + ${badge.getImgPath()}}" - th:id="'img' + ${badge.getId()}" th:alt="${badge.getName()}" > - </div> - </article> - <article class="dragonProgression"> - <h1>The Dragon's Tale</h1> - <div class="dragonContainer"> - <div class="dragonFill" th:style="'width:'+ ${user.getDragonProgress()} + '%;'"> - <img th:src="@{/images/rewards/dragonFilled.png}" - alt="Filled Dragon" id="FilledDragon" class="dragonImg"> - </div> - <div class="dragonOut"> - <img th:src="@{/images/rewards/dragonOutline.png}" - alt="Outline Dragon" id="OutlineDragon" class="dragonImg"> - </div> - </div> - <h2 th:text="${user.getDragonProgress()} + '%'"></h2> - </article> - <article id="stickersBox"> <!--Need a controller to show earned stickers --> - <h2> STICKERS! </h2> - <div class="stickersContainer"> - <img th:class="'stickerImg ' + ${sticker.getVisibility()}" th:each="sticker : ${stickers}" th:src="@{'../' + ${sticker.getImgPath()}}" - th:id="'img' + ${sticker.getId()}" th:alt="${sticker.getName()}" > - </div> - </article> - </section> - - -</main> - -<footer> - -</footer> - - -<script> -</script> -</body> -</html> \ No newline at end of file diff --git a/src/main/resources/templates/towns/caerphilly.html b/src/main/resources/templates/towns/caerphilly.html index 912da813737475d83dfc3af4c0ff4010189ec7f5..11d4aabb9ef479d9e67bc5c19419ec0f9c47d3eb 100644 --- a/src/main/resources/templates/towns/caerphilly.html +++ b/src/main/resources/templates/towns/caerphilly.html @@ -171,7 +171,7 @@ <link rel="stylesheet" th:href="@{/css/templatingstyle.css}"> </head> <body> -<header th:insert="~{/towns/Templating.html::header}"></header> +<header th:insert="~{/fragments/Templating.html::header}"></header> <main> <div class="container"> <h1 class="townName"> Welcome to the town of Caerphilly.</h1> @@ -215,7 +215,7 @@ </div> </main> -<footer th:insert="~{/towns/Templating.html::footer}"></footer> +<footer th:insert="~{/fragments/Templating.html::footer}"></footer> </body> </html> \ No newline at end of file diff --git a/src/main/resources/templates/towns/home/homePage.html b/src/main/resources/templates/towns/home/homePage.html index 2cdc1e854fba95f89dd2da702bbeb6d5011ed5d8..ec489ae7d334997390462ef1ffbe0d3ceaf5c828 100644 --- a/src/main/resources/templates/towns/home/homePage.html +++ b/src/main/resources/templates/towns/home/homePage.html @@ -8,7 +8,7 @@ </head> <body> -<header th:insert="~{/towns/Templating.html::header}"></header> +<header th:insert="~{/fragments/Templating.html::header}"></header> <main> <div class="gridContainer1"> <H1 id="homeTitle"> VZTA Smart Towns - Trails</H1> @@ -56,7 +56,7 @@ rough % outline; </div> </main> -<footer th:insert="~{/towns/Templating.html::footer}"></footer> +<footer th:insert="~{/fragments/Templating.html::footer}"></footer> </body> </html> diff --git a/src/main/resources/templates/towns/home/homePageOld.html b/src/main/resources/templates/towns/home/homePageOld.html index bf35e662607a4b2a101aeef83f3a05a65fd50ad2..ce51066c3313d03de40e19be1b1bf951bcc9b6b7 100644 --- a/src/main/resources/templates/towns/home/homePageOld.html +++ b/src/main/resources/templates/towns/home/homePageOld.html @@ -9,7 +9,7 @@ </head> <body> -<header th:insert="~{/towns/Templating.html::header}"></header> +<header th:insert="~{/fragments/Templating.html::header}"></header> <main> <div class="gridContainer1"> <H1 id="homeTitle"> VZTA Smart Towns - Trails</H1> @@ -60,7 +60,7 @@ </main> -<footer th:insert="~{/towns/Templating.html::footer}"></footer> +<footer th:insert="~{/fragments/Templating.html::footer}"></footer> </body> </html> diff --git a/src/main/resources/templates/towns/templates.server/Templating.html b/src/main/resources/templates/towns/templates.server/Templating.html deleted file mode 100644 index 14343a76ea3cc2974dbdd50cc7bd3ade124adc17..0000000000000000000000000000000000000000 --- a/src/main/resources/templates/towns/templates.server/Templating.html +++ /dev/null @@ -1,149 +0,0 @@ -<header class="headerBar th:fragment="header"> - - <div class="Logo"> - <img th:src="@{images/VZTA.png}" alt="VZTA Logo"> - </div> - <nav class="navBar"> - <ul> - <li>Home</li> - <li>FAQs</li> - <li>Contact us</li> - </ul> - <label class="work">Who we Work with:</label> - <select> - <ul> - <option value="localauthorities">Local Authorities</option> - <option value="towns">Towns</option> - <option value="businesses">Businesses</option> - <option value="consumers">Consumers</option> - </ul> - </select> - </nav> - </header> - - <div class="footerBar" th:fragment="footer"> - <div class="containerFooter"> - <div class="leftFooter"> - <h3>VZTA</h3> - Near Me Now LTD - <br>Britania House - <br>Caerphilly Business Park - <br>Caerphilly - <br>CF83 3GG - </div> - <div class="rightFooter"> - <h3>Connect with us</h3> - <p>Be the first to know about updates by joining out Community page</p> - (C) VZTA 2022<br> - Policy Terms and Conditions - </div> - <div class="centerFooter"> - <span class="footerText"> - <h3>Follow Us</h3> - <a th:href=="https://www.facebook.com/VZTAsmarttowns/" class="icon"></a><img th:src="@{images/Facebook.png}" alt="Facebook Logo" class="picture"> - <a th:href=="https://www.twitter.com/VZTAsmarttowns/" class="icon"></a><img th:src="@{images/Twitter-Logo.png}" alt="X (formally Twitter) Logo" class="picture"> - <a th:href=="https://www.instagram.com/vztasmarttowns/" class="icon"></a><img th:src="@{images/Instagram.jpg}" alt="Instagram Logo" class="picture"> - <a th:href=="https://'www.linkin.com/company/vztasmarttowns/" class="icon"></a><img th:src="@{images/LinkedIn.jpg}" alt="Linkedin Logo" class="picture"> <br> - </span> - </div> - <div class="copyright" style="text-align: left"> - - </div> - </div> - </div> -</div> -<style> - /* Header */ - .headerBar { - border-bottom: 2px rgb(230, 230, 230) solid; - margin-bottom: 20px; - display: flex; - background: blueviolet; - } - /* Navbar Links */ - .navBar { - margin-top: 50px; - margin-left: auto; - margin-right:20px; - text-align: right; - } - .work{ - color: rgb(255, 255, 255); - } - .navBar ul { - list-style: none; - display: flex; - margin-left: 100px; - } - .navBar a { - border-left: 2px rgb(185, 185, 185) solid; - padding: 10px 40px; - text-decoration: none; - color:rgb(87, 86, 86); - white-space: nowrap; - overflow: hidden; - float: right; - } - .navBar a:hover { - background-color: rgb(209, 209, 209); - } - .navBar li{ - margin-left: 10px; - margin-right: 10px; - color: rgb(255, 255, 255); - } - .navListLast { - border-right: 2px rgb(185, 185, 185) solid; - margin-right:40px; - } - - /* Navbar Logo */ - .Logo { - margin-left:10px; - padding: 20px; - width: fit-content; - } - .Logo img { - width: 120px; - margin-left:15px; - } - - /* Footer */ - footer { - margin-top:20px; - display: flex; - justify-content: center; - } - .footerBar{ - border-top: 2px rgb(230, 230, 230) solid; - text-align: left; - display: flex; - background: blueviolet; - color: rgb(255, 255, 255); - padding-left: 30px; - } - .footerBar ul { - list-style: none; - display: flex; - } - .copyright{ - text-align: left; - display: flex; - } - .containerFooter{ - display: flex; - flex-direction: row; - } - .leftFooter{ - flex:1; - color: rgb(255, 255,255); - } - .centerFooter{ - flex: 1; - color: rgb(255, 255,255); - } - .rightFooter{ - flex:1; - color: rgb(255, 255, 255); - } -</style> \ No newline at end of file diff --git a/src/main/resources/templates/towns/trails/dragonstale/index.html b/src/main/resources/templates/towns/trails/dragonstale/index.html index 80aa32934673ddca22af19a7f7772a378ce9c774..7cf5948e993116ac247cf9c8aaac3d1ece2e8762 100644 --- a/src/main/resources/templates/towns/trails/dragonstale/index.html +++ b/src/main/resources/templates/towns/trails/dragonstale/index.html @@ -8,7 +8,7 @@ <script src="./node_modules/html5-qrcode/html5-qrcode.min.js"></script> </head> <body> - <header th:insert="towns/Templating.html :: header"></header> + <header th:insert="fragments/Templating.html :: header"></header> <!-- As this predefined trail will be accessible from multiple different towns, this thymeleaf element will display the town the user is currently trying to access and display it accordingly. <span th:text="${townName}"> --> <div class="centre"> @@ -49,7 +49,7 @@ <button type="button" id="begin">Click here!</button> </div> - <div th:insert="towns/Templating.html :: footer"></div> + <div th:insert="fragments/Templating.html :: footer"></div> <script> diff --git a/src/main/resources/templates/rewards/login.html b/src/main/resources/templates/users/login.html similarity index 100% rename from src/main/resources/templates/rewards/login.html rename to src/main/resources/templates/users/login.html diff --git a/src/main/resources/templates/users/userFrags.html b/src/main/resources/templates/users/userFrags.html new file mode 100644 index 0000000000000000000000000000000000000000..5b5e8201f805bdcbed9234da8c39d6a4b79e94f7 --- /dev/null +++ b/src/main/resources/templates/users/userFrags.html @@ -0,0 +1,28 @@ +<!-- @thymesVar id="sticker" type="Team5.SmartTowns.rewards.Sticker" --> +<!-- @thymesVar id="user" type="Team5.SmartTowns.users.User" --> +<!-- @thymesVar id="selectedPack" type="Team5.SmartTowns.rewards.Pack" --> +<div th:fragment="stickersBox" id="packRewardsWrapper"> + <article class="progressionContainer"> + <h1 th:text="${selectedPack.getName()}"></h1> + <div class="progImgContainer"> + <div class="progImgFill" th:style="'width:'+ ${progress} + '%;'"> + <img th:src="@{'../' + ${selectedPack.getDisplayImg()}}" + alt="Filled Dragon" id="FilledDragon" class="progImg"> + </div> + <div class="progText"> + <p th:text="${progress} + '%'"></p> + </div> + <div class="progImgOutline"> + <img th:src="@{'../' + ${selectedPack.getDisplayImg()}}" + alt="Outline Dragon" id="OutlineDragon" class="progImg"> + </div> + </div> + </article> + + <article id="stickersBox"> + <div class="stickersContainer"> + <img th:class="'stickerImg ' + ${sticker.getVisibility()}" th:each="sticker : ${stickers}" th:src="@{'../' + ${sticker.getDisplayImg()}}" + th:id="'img' + ${sticker.getId()}" th:alt="${sticker.getName()}" > + </div> + </article> +</div> \ No newline at end of file diff --git a/src/main/resources/templates/users/userProfile.html b/src/main/resources/templates/users/userProfile.html new file mode 100644 index 0000000000000000000000000000000000000000..3e865175760bc4b0aa11c9b54aade5d312ac55b5 --- /dev/null +++ b/src/main/resources/templates/users/userProfile.html @@ -0,0 +1,60 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title th:text="'VZLA Profile Page of ' + ${user.getName()}"></title> + <link rel="stylesheet" th:href="@{/css/userProfile2.css}"> + <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> +<!-- <link rel="stylesheet" th:href="@{/css/templatingstyle.css}">--> +</head> +<body> + +<!--<header>--> +<!-- <ul class="footerBar">--> +<!-- <li class="footerButton"><b>Home</b></li>--> +<!-- <li class="footerButton"><b>About</b></li>--> +<!-- <li class="footerButton"><b>Map</b></li>--> +<!-- <li class="footerButton"><b>Facilities</b></li>--> +<!-- <li class="footerButton"><b>Log In</b></li>--> +<!-- </ul>--> +<!--</header>--> + +<main> + <!--PICTURE - DATA - BADGES --> + <div class="userContainer"> + <h1 th:text="${user.getName()}"></h1> + <img th:src="@{${user.getImgPath()}}" + th:alt="${user.getName()}" + id="userPicture" + > + + <!--TODO add some progression info here?--> + </div> + <section class="rewards"> <!--Reward lists, badges on top, stickers (larger) on the bottom--> + <article id="packsBar"> + <h2>Packs</h2> + <!--Shows first earned badges, followed by greyed out badges--> + <div id="allPacksContainer" class="centerFlex"> + <div th:each="pack : ${packs}" class="packContainer"> + <img class="packImg" th:src="@{'../' + ${pack.getDisplayImg()}}" + th:id="'packImg' + ${pack.getId()}" th:alt="${pack.getName()}" + th:onclick="'updatePack(' + ${user.getId()} +',' + ${pack.getId()} +');'"> + <h4 class="packName" th:text="${pack.getName()}"></h4> + </div> + </div> + </article> + <article th:replace="~{users/userFrags.html::stickersBox}" id="stickersBox"></article> + </section> + + +</main> + +<footer> + +</footer> +<script type="text/javascript" th:src="@{../scripts/userPage.js}"></script> + +<script> +</script> +</body> +</html> \ No newline at end of file