diff --git a/.gitignore b/.gitignore index 1fdccea..438cb08 100644 --- a/.gitignore +++ b/.gitignore @@ -6,5 +6,3 @@ node_modules .output .env dist - -.idea diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..df7825d --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..f589ca3 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml new file mode 100644 index 0000000..e0c73d1 --- /dev/null +++ b/.idea/php.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/prettier.xml b/.idea/prettier.xml new file mode 100644 index 0000000..0c83ac4 --- /dev/null +++ b/.idea/prettier.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/web.iml b/.idea/web.iml new file mode 100644 index 0000000..c956989 --- /dev/null +++ b/.idea/web.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..80cc288 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + "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 new file mode 100644 index 0000000..23886af --- /dev/null +++ b/src/components/Modal.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/components/MoviePoster.vue b/src/components/MoviePoster.vue deleted file mode 100644 index 0b07063..0000000 --- a/src/components/MoviePoster.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - - - diff --git a/src/components/MovieQuote.vue b/src/components/MovieQuote.vue deleted file mode 100644 index 53bc3bd..0000000 --- a/src/components/MovieQuote.vue +++ /dev/null @@ -1,54 +0,0 @@ - - - - diff --git a/src/components/admin/lists.vue b/src/components/admin/lists.vue index 8472348..afdcc2c 100644 --- a/src/components/admin/lists.vue +++ b/src/components/admin/lists.vue @@ -3,101 +3,90 @@
- +
  • - {{ 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 8e94c10..638f4ea 100644 --- a/src/components/admin/search.vue +++ b/src/components/admin/search.vue @@ -1,5 +1,4 @@ diff --git a/src/components/modal-content/AddMovie.vue b/src/components/modal-content/AddMovie.vue index b74f8fc..5a67020 100644 --- a/src/components/modal-content/AddMovie.vue +++ b/src/components/modal-content/AddMovie.vue @@ -1,18 +1,22 @@ @@ -54,14 +54,15 @@ 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/common/ui/Modal.vue"; -import { logout } from "~/composables/logout"; +import Modal from "~/components/Modal.vue"; -const modal_movie = ref(null); +const lists = defineModel("movie-lists", { default: [] }); +const modal_movie = defineModel("#movie-modal"); const movie_modal = ref | null>(null); -const current_view = ref("search"); const closeModal = function () { movie_modal?.value?.toggleModal(); @@ -71,8 +72,7 @@ const showModal = function (movie: Movie) { movie_modal?.value?.toggleModal(); }; const toggleDisplay = function (element_id: string) { - if (element_id === current_view.value) return; - const tabs = ["search", "showings", "lists"]; + let tabs = ["search", "showings", "lists"]; tabs.forEach((value) => { if (value === element_id) { @@ -80,13 +80,36 @@ 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 34c7da8..f59be6e 100644 --- a/src/pages/lists/[id].vue +++ b/src/pages/lists/[id].vue @@ -1,81 +1,65 @@ @@ -84,58 +68,56 @@ 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/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"; +import Modal from "~/components/Modal.vue"; const list_id = ref(0); -const list = ref(null); -const loading = ref(true); +const list = defineModel("movie_list", { default: [] }); const modal_movie: Ref = ref(null); -const movies = ref(new Array()); -const filtered_movies = ref(new Array()); +const movies = defineModel("movies", { + default: [], +}); +const filtered_movies = defineModel("filtered_movies"); 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(); - let headers: any = { - "Content-type": "application/json", - }; + const { data, error } = await useFetch( + `${config.public.apiURL}/lists/${list_id}`, + { + method: "GET", + headers: { + "Content-type": "application/json", + Authorization: `Token ${useCookie("token").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(); + 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; - 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.value && movies.value.length > 0) { + if (hide_scheduled && movies.value.length > 0) { let filtered = movies.value.filter((movie) => { - return !movie.has_been_scheduled; + return movie.last_watched === null; }); if (typeof filtered != "undefined") { filtered_movies.value = filtered; @@ -145,7 +127,7 @@ const hideScheduled = function () { } }; -const removeMovie = async function (movie_id: string) { +const removeMovie = async function (movie_id: number) { let config = useRuntimeConfig(); let confirmed = confirm("Remove movie from list?"); @@ -184,38 +166,6 @@ const removeMovie = async function (movie_id: string) { } }; -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; @@ -243,7 +193,6 @@ 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 d48d9c1..55ede0e 100644 --- a/src/pages/lists/index.vue +++ b/src/pages/lists/index.vue @@ -1,16 +1,8 @@