diff --git a/docker-compose.yaml b/docker-compose.yaml index 50af719a2c1bfacc8a13ae0414c7ed90a376880c..e4edfa929cd46509f8602e80cc6c4588f30d8e43 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -16,7 +16,7 @@ services: ports: - 3308:3307 expose: - - 3307 + - 3308 hostname: tubes-php-db env_file: .env volumes: diff --git a/src/app/components/library/library.php b/src/app/components/library/library.php index db770cb01a7dcef5fc05b3059ac3b0fe11ca0dbc..307ab31cc2df3f209e1dfaefaabcf1fa88475afc 100644 --- a/src/app/components/library/library.php +++ b/src/app/components/library/library.php @@ -7,13 +7,34 @@ <link rel="stylesheet" type="text/css" href="<?= BASE_URL ?>/styles/globals.css"> <!-- Page-specific CSS --> <link rel="stylesheet" type="text/css" href="<?= BASE_URL ?>/styles/library/library.css"> + + <script type="text/javascript" src="<?= BASE_URL ?>/javascript/library/library2.js" defer></script> + <title>Library</title> </head> <body> + <button class="new-playlist-btn" onclick="toggle()">New Playlist</button> + <main> - <div class="playlist-container"> + <div class="playlist-container" id="blur"> <?php include(dirname(__DIR__) . "/library/playlist.php")?> </div> - </main> + </main> + + <div class="wrapper" id="popup"> + <form id="add-playlist-form" autocomplete="off"> + + <h2>Add New Playlist</h2> + <div class="input-box"> + <input type="text" placeholder="Playlist Title" id="playlist-title" required> + <p id="playlist-title-alert" class="alert-hide"></p> + </div> + + <button type="submit" class="btn">Submit</button> + </form> + </div> </body> + +<script type="text/javascript"> +</script> </html> \ No newline at end of file diff --git a/src/app/controllers/library/post_library.php b/src/app/controllers/library/post_library.php new file mode 100644 index 0000000000000000000000000000000000000000..53ccef149bd83b6ca064a802eae41e1ca3d3b16f --- /dev/null +++ b/src/app/controllers/library/post_library.php @@ -0,0 +1,35 @@ +<?php + +class PostLibraryController +{ + public function call() + { + session_start(); + + if(!isset($_SESSION["user_id"])){ + header("Location: " . BASE_URL . "/login"); + + return; + } + + $playlistTitle = ""; + $idUser = $_SESSION["user_id"]; + + if(isset($_POST["playlistTitle"])){ + $playlistTitle = $_POST["playlistTitle"]; + } + + + $model = new PlaylistModel(); + + try{ + $model->addPlaylist($idUser, $playlistTitle); + http_response_code(201); + exit; + }catch(PDOException $e){ + http_response_code(200); + echo($e->getMessage()); + exit; + } + } +} diff --git a/src/app/core/app.php b/src/app/core/app.php index 2b08fb582639226cf9a8473a3ebd4a10d5c8708f..b1a9253c72be63c3259e4b762105bd6df4fc597c 100644 --- a/src/app/core/app.php +++ b/src/app/core/app.php @@ -54,7 +54,7 @@ class App $router->post("public/login", new PostLoginController()); $router->get("public/signup", new GetSignupController()); $router->post("public/signup", new PostSignupController()); - $router->get("public/library", new GetLibraryController()); + $router->post("public/library", new PostLibraryController()); $router->get("public/playlist", new GetPlaylistController()); $router->post("public/playlist", new PostPlaylistController()); diff --git a/src/app/init.php b/src/app/init.php index c83fbbbbecf2eb21b94e1c426cf7e6526e30e3a6..2022d21e6e3e26afa8dc5c730e45b11222eebf98 100644 --- a/src/app/init.php +++ b/src/app/init.php @@ -36,6 +36,7 @@ require_once __DIR__ . "/controllers/library/get_library.php"; require_once __DIR__ . "/controllers/playlist/get_playlist.php"; require_once __DIR__ . "/controllers/playlist/post_playlist.php"; require_once __DIR__ . "/controllers/library/get_library.php"; +require_once __DIR__ . "/controllers/library/post_library.php"; require_once __DIR__ . "/controllers/signup/get_signup.php"; require_once __DIR__ . "/controllers/signup/post_signup.php"; require_once __DIR__ . "/controllers/search/get_search.php"; diff --git a/src/app/models/playlist.php b/src/app/models/playlist.php index ba55193a3ebd0d41d076c6eba58a88a65414e2be..92e9631a05a3893d56139d8d6b5b999314986b80 100644 --- a/src/app/models/playlist.php +++ b/src/app/models/playlist.php @@ -37,17 +37,16 @@ class PlaylistModel return $playlistPodcast; } - public function addPlaylist($id_user, $title, $id_playlist) + public function addPlaylist($id_user, $title) { $query = " - INSERT INTO playlist (id_playlist, title, id_user) - VALUES(:id_playlist, :title, :id_user) + INSERT INTO playlist (title, id_user) + VALUES(:title, :id_user) "; $this->db->query($query); $this->db->bind("id_user", $id_user); $this->db->bind("title", $title); - $this->db->bind("id_playlist", $id_playlist); $this->db->execute(); } diff --git a/src/public/javascript/app/route.js b/src/public/javascript/app/route.js deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/src/public/javascript/library/library2.js b/src/public/javascript/library/library2.js new file mode 100644 index 0000000000000000000000000000000000000000..c542a2a6ff5367d37c6b1a6c83a306e65717c185 --- /dev/null +++ b/src/public/javascript/library/library2.js @@ -0,0 +1,108 @@ +"use strict"; + +function toggle(){ + const blur = document.getElementById("blur"); + const popup = document.getElementById("popup"); + blur.classList.toggle('active'); + popup.classList.toggle('active'); +} + +document.addEventListener("DOMContentLoaded", function () { + + const blurEl = document.getElementById("blur"); + const main = document.querySelector("main"); + const playlistTitleInput = document.getElementById("playlist-title"); + const playlistTitleAlert = document.getElementById("playlist-title-alert"); + const addPlaylistForm = document.getElementById("add-playlist-form"); + const deletePlaylistEl = document.querySelectorAll(".bx-trash"); + + let playlistTitleValid = false; + + main.addEventListener("click", (e) => { + + if(blurEl.classList.contains("active")){ + e.preventDefault(); + toggle(); + } + }); + + playlistTitleInput && playlistTitleInput.addEventListener("keyup", () => { + const playlistTitle = playlistTitleInput.value; + + + if(playlistTitle.length > 50){ + playlistTitleAlert.innerText = "Judul playlist tidak bisa lebih dari 50 karakter"; + playlistTitleAlert.className = "alert-show"; + playlistTitleValid = false; + }else{ + playlistTitleAlert.innerText = ""; + playlistTitleAlert.className = "alert-hide"; + playlistTitleValid = true; + } + }) + + + addPlaylistForm.addEventListener("submit", (e) => { + e.preventDefault(); + console.log("testing"); + + if(playlistTitleValid){ + + const playlistTitle = playlistTitleInput.value; + + const data = new FormData(); + data.append("playlistTitle", playlistTitle); + + const xhr = new XMLHttpRequest(); + + xhr.open("POST", "/public/library", true); + + xhr.onload = function () { + if (xhr.readyState === XMLHttpRequest.DONE) { + if (xhr.status === 201) { + toggle(); + location.reload(); + }else{ //status code 200 + toggle(); + alert("Ada yang aneh"); + } + } + } + xhr.send(data); + + } + }) + + if(deletePlaylistEl.length !== 0){ + deletePlaylistEl.forEach(function(trash){ + trash.addEventListener("click", (e) => { + e.preventDefault(); + const idPlaylist = trash.dataset.id; + + const xhr = new XMLHttpRequest(); + + xhr.open("DELETE", `/public/library?playlist_id=${idPlaylist}`, true); + + xhr.send(null); + + xhr.onload = function () { + if (xhr.readyState === XMLHttpRequest.DONE) { + if (xhr.status === 201) { + // showSuccessToast("Playlist berhasil dihapus dari library!"); + setTimeout(function(){ + location.reload(); + }, 500); + }else{ //status code 200 + // showErrorToast("Playlist gagal dihapus dari library!"); + console.log("ahai"); + } + } + } + }) + }) + } + + + + }); + diff --git a/src/public/styles/library/library.css b/src/public/styles/library/library.css index d641f13e1b8517df931668ee3b2d9b989c65ca30..ef37d80b8dd43b0978a40c768f47cceeb339d121 100644 --- a/src/public/styles/library/library.css +++ b/src/public/styles/library/library.css @@ -58,6 +58,94 @@ navbar { text-overflow: ellipsis; } +.wrapper { + visibility: hidden; + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + /* z-index: 999; To ensure it covers the playlist section */ + background: var(--GRAY-600); + color: var(--WHITE); + padding: 30px; + border-radius: 10px; +} + +.wrapper h2{ + font-size: 28px; + text-align: center; + text-transform: none; +} + +.wrapper .input-box{ + position: relative; + width: 100%; + height: 40px; + margin: 40px 0; +} + +.input-box input{ + width: 100%; + height: 100%; + background: var(--GRAY-500); + border: none; + outline: none; + border: 2px solid rgba(255, 255, 255, .4); + border-radius: 40px; + font-size: 16px; + color: var(--WHITE); + padding: 20px 45px 20px 20px; +} + + +.input-box input::placeholder{ + color: var(--WHITE); +} + + +.new-playlist-btn{ + margin-top: 30px; + margin-left: 30px; + width: 200px; + height: 45px; + background: rgba(206, 4, 161, 0.79); + border: none; + outline: none; + border-radius: 10px; + box-shadow: 0 0 10px rgba(0, 0, 0, .1); + cursor: pointer; + font-size: 16px; + color: var(--WHITE); + font-weight: 600; + text-align: center; +} + +.wrapper .btn{ + width: 100%; + height: 45px; + background: rgba(206, 4, 161, 0.79); + border: none; + outline: none; + border-radius: 40px; + box-shadow: 0 0 10px rgba(0, 0, 0, .1); + cursor: pointer; + font-size: 16px; + color: var(--WHITE); + font-weight: 600; + text-align: center; +} + +.bx-trash{ + display: flex; + align-self: center; + color: red; + font-size: 20px; + margin-top: -15px; + cursor: pointer; + border: 0.5px solid red; + padding: 2px; + border-radius: 5px; +} @media (min-width: 768px) { .user-playlist { @@ -94,4 +182,13 @@ navbar { } } +#popup.active{ + visibility: visible; + transition: 0.5s; +} +#blur.active{ + filter: blur(20px); + pointer-events: none; + user-select: none; +} \ No newline at end of file