diff --git a/.gitignore b/.gitignore index 438cb08..1fdccea 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ node_modules .output .env dist + +.idea diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index df7825d..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index f589ca3..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml deleted file mode 100644 index e0c73d1..0000000 --- a/.idea/php.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/prettier.xml b/.idea/prettier.xml deleted file mode 100644 index 0c83ac4..0000000 --- a/.idea/prettier.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/web.iml b/.idea/web.iml deleted file mode 100644 index c956989..0000000 --- a/.idea/web.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index 80cc288..0000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { - "associatedIndex": 8 -} - - - - - - - { - "keyToString": { - "RunOnceActivity.OpenProjectViewOnStart": "true", - "RunOnceActivity.ShowReadmeOnStart": "true", - "RunOnceActivity.git.unshallow": "true", - "WebServerToolWindowFactoryState": "false", - "code.cleanup.on.save": "true", - "git-widget-placeholder": "showings-updates", - "last_opened_file_path": "/home/tiradoe/Projects/movie-night/web/src/types", - "list.type.of.created.stylesheet": "CSS", - "node.js.detected.package.eslint": "true", - "node.js.detected.package.standard": "true", - "node.js.detected.package.tslint": "true", - "node.js.selected.package.eslint": "(autodetect)", - "node.js.selected.package.standard": "", - "node.js.selected.package.tslint": "(autodetect)", - "nodejs_package_manager_path": "npm", - "npm.dev.executor": "Run", - "prettierjs.PrettierConfiguration.Package": "/home/tiradoe/Projects/movie-night/web/src/node_modules/prettier", - "rearrange.code.on.save": "true", - "settings.editor.selected.configurable": "settings.vue", - "ts.external.directory.path": "/home/tiradoe/Projects/movie-night/web/src/node_modules/typescript/lib", - "vue.rearranger.settings.migration": "true" - } -} - - - - - - - - - - - - - - - - - - + + diff --git a/src/components/Modal.vue b/src/components/Modal.vue deleted file mode 100644 index 23886af..0000000 --- a/src/components/Modal.vue +++ /dev/null @@ -1,23 +0,0 @@ - - - - - diff --git a/src/components/MoviePoster.vue b/src/components/MoviePoster.vue new file mode 100644 index 0000000..0b07063 --- /dev/null +++ b/src/components/MoviePoster.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/src/components/MovieQuote.vue b/src/components/MovieQuote.vue new file mode 100644 index 0000000..53bc3bd --- /dev/null +++ b/src/components/MovieQuote.vue @@ -0,0 +1,54 @@ + + + + diff --git a/src/components/admin/lists.vue b/src/components/admin/lists.vue index afdcc2c..8472348 100644 --- a/src/components/admin/lists.vue +++ b/src/components/admin/lists.vue @@ -3,90 +3,101 @@
- +
  • - {{ list.name }}
    - + {{ list.name }}
    +
- - \ No newline at end of file + diff --git a/src/components/admin/search.vue b/src/components/admin/search.vue index 638f4ea..8e94c10 100644 --- a/src/components/admin/search.vue +++ b/src/components/admin/search.vue @@ -1,4 +1,5 @@ diff --git a/src/components/modal-content/AddMovie.vue b/src/components/modal-content/AddMovie.vue index 5a67020..b74f8fc 100644 --- a/src/components/modal-content/AddMovie.vue +++ b/src/components/modal-content/AddMovie.vue @@ -1,22 +1,18 @@ @@ -54,15 +54,14 @@ import AddMovie from "~/components/modal-content/AddMovie.vue"; import Search from "~/components/admin/search.vue"; import Showings from "~/components/admin/showings.vue"; import Lists from "~/components/admin/lists.vue"; -import type { MovieList } from "~/types/movielist"; -import { useCookie } from "#app"; import type { Movie } from "~/types/movie"; -import Modal from "~/components/Modal.vue"; +import Modal from "~/components/common/ui/Modal.vue"; +import { logout } from "~/composables/logout"; -const lists = defineModel("movie-lists", { default: [] }); -const modal_movie = defineModel("#movie-modal"); +const modal_movie = ref(null); const movie_modal = ref | null>(null); +const current_view = ref("search"); const closeModal = function () { movie_modal?.value?.toggleModal(); @@ -72,7 +71,8 @@ const showModal = function (movie: Movie) { movie_modal?.value?.toggleModal(); }; const toggleDisplay = function (element_id: string) { - let tabs = ["search", "showings", "lists"]; + if (element_id === current_view.value) return; + const tabs = ["search", "showings", "lists"]; tabs.forEach((value) => { if (value === element_id) { @@ -80,36 +80,13 @@ const toggleDisplay = function (element_id: string) { document .getElementById(element_id + "-tab") ?.classList.toggle("underline"); + current_view.value = element_id; } else if (!document.getElementById(value)?.classList.contains("hidden")) { document.getElementById(value)?.classList.toggle("hidden"); document.getElementById(value + "-tab")?.classList.toggle("underline"); } }); }; -const logout = () => { - let config = useRuntimeConfig(); - fetch(`${config.public.apiURL}/auth/logout/`, { - method: "POST", - headers: { - "Content-type": "application/json", - Authorization: `Token ${useCookie("token").value}`, - }, - }) - .then((response) => response) - .then((_json) => { - let token = useCookie("token"); - token.value = null; - navigateTo("/"); - }) - .catch((err) => console.log(err)); -}; - -onMounted(() => { - const token = useCookie("token").value; - if (!token) { - navigateTo("/"); - } -}); diff --git a/src/pages/lists/[id].vue b/src/pages/lists/[id].vue index f59be6e..34c7da8 100644 --- a/src/pages/lists/[id].vue +++ b/src/pages/lists/[id].vue @@ -1,65 +1,81 @@ @@ -68,56 +84,58 @@ import ShowMovie from "~/components/modal-content/ShowMovie.vue"; import "lazysizes"; import type { MovieList } from "~/types/movielist"; import type { Movie } from "~/types/movie"; -import Modal from "~/components/Modal.vue"; +import Modal from "~/components/common/ui/Modal.vue"; +import { useCookie } from "#app"; +import { $fetch } from "ofetch"; +import MoviePoster from "~/components/MoviePoster.vue"; +import ScrollToTop from "~/components/common/navigation/ScrollToTop.vue"; const list_id = ref(0); -const list = defineModel("movie_list", { default: [] }); +const list = ref(null); +const loading = ref(true); const modal_movie: Ref = ref(null); -const movies = defineModel("movies", { - default: [], -}); -const filtered_movies = defineModel("filtered_movies"); +const movies = ref(new Array()); +const filtered_movies = ref(new Array()); const movie_query = ref(""); const logged_in = ref(false); const hide_scheduled = ref(false); const getList = async function (list_id: number) { + loading.value = true; let config = useRuntimeConfig(); - const { data, error } = await useFetch( - `${config.public.apiURL}/lists/${list_id}`, - { - method: "GET", - headers: { - "Content-type": "application/json", - Authorization: `Token ${useCookie("token").value}`, - }, - }, - ); + let headers: any = { + "Content-type": "application/json", + }; - if (error.value) { - if (error.value.statusCode === 401) { - navigateTo("/"); - } - if (error.value.statusCode === 404) { - alert("List not found"); - navigateTo("/lists"); - } - } else { - if (!data.value) { - alert("List not found"); - navigateTo("/lists"); - } else { - list.value = data.value; - movies.value = data.value?.movies || []; - filtered_movies.value = movies.value; - } + if (typeof useCookie("token").value !== "undefined") { + headers["Authorization"] = `Token ${useCookie("token").value}`; } + + $fetch(`${config.public.apiURL}/lists/${list_id}`, { + method: "GET", + headers: headers, + }) + .then((data) => { + list.value = data; + movies.value = data?.movies || new Array(); + filtered_movies.value = movies.value; + loading.value = false; + }) + .catch((err) => { + if (err.statusCode === 401) { + navigateTo("/"); + } + if (err.statusCode === 404) { + alert("List not found"); + navigateTo("/lists"); + } + }); }; const hideScheduled = function () { - if (hide_scheduled && movies.value.length > 0) { + if (hide_scheduled.value && movies.value.length > 0) { let filtered = movies.value.filter((movie) => { - return movie.last_watched === null; + return !movie.has_been_scheduled; }); if (typeof filtered != "undefined") { filtered_movies.value = filtered; @@ -127,7 +145,7 @@ const hideScheduled = function () { } }; -const removeMovie = async function (movie_id: number) { +const removeMovie = async function (movie_id: string) { let config = useRuntimeConfig(); let confirmed = confirm("Remove movie from list?"); @@ -166,6 +184,38 @@ const removeMovie = async function (movie_id: number) { } }; +const updating = ref(false); +const updateMovie = async function (movie: Movie) { + let config = useRuntimeConfig(); + updating.value = true; + + $fetch(`${config.public.apiURL}/movies/${movie.id}/`, { + method: "PUT", + headers: { + "Content-type": "application/json", + Authorization: `Token ${useCookie("token").value}`, + }, + body: JSON.stringify(movie), + }) + .then((data) => { + modal_movie.value = data || []; + movies.value = movies.value.map((movie) => { + return movie.id === data.id ? data : movie; + }); + filtered_movies.value = movies.value; + updating.value = false; + }) + .catch((err) => { + if (err.statusCode === 401) { + navigateTo("/"); + } + if (err.statusCode === 404) { + alert("Unable to update movie"); + } + updating.value = false; + }); +}; + const filterMovies = function () { if (!movie_query) { filtered_movies.value = movies.value; @@ -193,6 +243,7 @@ onMounted(() => { const route = useRoute(); if (typeof route.params.id === "string") { const list_param: string = route.params.id; + list_id.value = parseInt(list_param); getList(list_id.value); } diff --git a/src/pages/lists/index.vue b/src/pages/lists/index.vue index 55ede0e..d48d9c1 100644 --- a/src/pages/lists/index.vue +++ b/src/pages/lists/index.vue @@ -1,8 +1,16 @@