feat: 🎉 Rating Orama!
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
node_modules
|
||||
dist
|
||||
dist-ssr
|
||||
*.local
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
.DS_Store
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
@@ -0,0 +1,5 @@
|
||||
*.js
|
||||
*.cjs
|
||||
build/
|
||||
coverage/
|
||||
node_modules/
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"attributeGroups": ["^x-*", "$CODE_GUIDE", "^placeholder"]
|
||||
}
|
||||
@@ -0,0 +1,236 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<link href="./src/styles/index.css" rel="stylesheet" />
|
||||
<title>Inicio</title>
|
||||
</head>
|
||||
|
||||
<body class="min-h-screen bg-gray-100">
|
||||
<p class="mb-6 bg-yellow-400">
|
||||
Work in progress - API 0.1.0 / Harvester 0.1.0 / Views 0.1.0
|
||||
<a class="text-blue-800" href="mailto:hola@pedroperez.dev"
|
||||
>Have you found any bugs or is it not working with a specific tv
|
||||
show?</a
|
||||
>
|
||||
</p>
|
||||
|
||||
<div class="flex w-full flex-col items-center">
|
||||
<h1 class="mb-6 text-3xl font-bold">Breaking Bad</h1>
|
||||
|
||||
<div class="mb-6 rounded-lg bg-white p-6 shadow-md">
|
||||
<div class="mb-4 text-center">
|
||||
<span class="text-gray-600">IMDb ID:</span>
|
||||
<span class="font-semibold text-gray-800">0903747</span>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-2 gap-8">
|
||||
<ul class="space-y-2">
|
||||
<li>
|
||||
<span class="text-gray-600">Title:</span>
|
||||
<span class="font-semibold text-gray-800">Breaking Bad</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="text-gray-600">Runtime:</span>
|
||||
<span class="font-semibold text-gray-800">49 min</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="text-gray-600">Seasons:</span>
|
||||
<span class="font-semibold text-gray-800">5</span>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="space-y-2">
|
||||
<li>
|
||||
<span class="text-gray-600">Total votes:</span>
|
||||
<span class="font-semibold text-gray-800">1970456</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="text-gray-600">Average rating:</span>
|
||||
<span class="font-semibold text-gray-800">8.95</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="text-gray-600">Median rating:</span>
|
||||
<span class="font-semibold text-gray-800">8.85</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-6 w-2/3">
|
||||
<h2 class="mb-6 text-center text-2xl font-bold">Seasons overall</h2>
|
||||
<canvas id="seasons"></canvas>
|
||||
</div>
|
||||
|
||||
<div class="mb-6 w-2/3">
|
||||
<div x-data="{ selectedSeasonNumber: 1}">
|
||||
<h2 class="mb-6 text-center text-2xl font-bold">
|
||||
Season <span x-text="selectedSeasonNumber"></span>
|
||||
</h2>
|
||||
<canvas id="episodes"></canvas>
|
||||
<div class="mt-4 flex items-center justify-center space-x-2">
|
||||
<button
|
||||
x-on:click="selectedSeasonNumber = 1; loadSeason(1)"
|
||||
class="rounded-md border-2 border-black px-4 py-2 font-semibold text-black hover:bg-black hover:text-white"
|
||||
:class="selectedSeasonNumber === 1 ? 'bg-black text-white' : 'text-black'"
|
||||
>
|
||||
S1
|
||||
</button>
|
||||
<button
|
||||
x-on:click="selectedSeasonNumber = 2; loadSeason(2)"
|
||||
class="rounded-md border-2 border-black px-4 py-2 font-semibold text-black hover:bg-black hover:text-white"
|
||||
:class="selectedSeasonNumber === 2 ? 'bg-black text-white' : 'text-black'"
|
||||
>
|
||||
S2
|
||||
</button>
|
||||
<button
|
||||
x-on:click="selectedSeasonNumber = 3; loadSeason(3)"
|
||||
class="rounded-md border-2 border-black px-4 py-2 font-semibold text-black hover:bg-black hover:text-white"
|
||||
:class="selectedSeasonNumber === 3 ? 'bg-black text-white' : 'text-black'"
|
||||
>
|
||||
S3
|
||||
</button>
|
||||
<button
|
||||
x-on:click="selectedSeasonNumber = 4; loadSeason(4)"
|
||||
class="rounded-md border-2 border-black px-4 py-2 font-semibold text-black hover:bg-black hover:text-white"
|
||||
:class="selectedSeasonNumber === 4 ? 'bg-black text-white' : 'text-black'"
|
||||
>
|
||||
S4
|
||||
</button>
|
||||
<button
|
||||
x-on:click="selectedSeasonNumber = 5; loadSeason(5)"
|
||||
class="rounded-md border-2 border-black px-4 py-2 font-semibold text-black hover:bg-black hover:text-white"
|
||||
:class="selectedSeasonNumber === 5 ? 'bg-black text-white' : 'text-black'"
|
||||
>
|
||||
S5
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer class="bg-gray-200" aria-label="Site Footer">
|
||||
<ul class="mt-12 flex justify-center gap-6 p-12">
|
||||
<li>
|
||||
<a
|
||||
class="text-gray-700 transition hover:text-gray-700/75"
|
||||
href="https://www.instagram.com/zepyrshut/"
|
||||
rel="noreferrer"
|
||||
target="_blank"
|
||||
>
|
||||
<span class="sr-only">Instagram</span>
|
||||
<svg
|
||||
class="h-6 w-6"
|
||||
aria-hidden="true"
|
||||
fill="currentColor"
|
||||
viewBox="0 0 24 24"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M12.315 2c2.43 0 2.784.013 3.808.06 1.064.049 1.791.218 2.427.465a4.902 4.902 0 011.772 1.153 4.902 4.902 0 011.153 1.772c.247.636.416 1.363.465 2.427.048 1.067.06 1.407.06 4.123v.08c0 2.643-.012 2.987-.06 4.043-.049 1.064-.218 1.791-.465 2.427a4.902 4.902 0 01-1.153 1.772 4.902 4.902 0 01-1.772 1.153c-.636.247-1.363.416-2.427.465-1.067.048-1.407.06-4.123.06h-.08c-2.643 0-2.987-.012-4.043-.06-1.064-.049-1.791-.218-2.427-.465a4.902 4.902 0 01-1.772-1.153 4.902 4.902 0 01-1.153-1.772c-.247-.636-.416-1.363-.465-2.427-.047-1.024-.06-1.379-.06-3.808v-.63c0-2.43.013-2.784.06-3.808.049-1.064.218-1.791.465-2.427a4.902 4.902 0 011.153-1.772A4.902 4.902 0 015.45 2.525c.636-.247 1.363-.416 2.427-.465C8.901 2.013 9.256 2 11.685 2h.63zm-.081 1.802h-.468c-2.456 0-2.784.011-3.807.058-.975.045-1.504.207-1.857.344-.467.182-.8.398-1.15.748-.35.35-.566.683-.748 1.15-.137.353-.3.882-.344 1.857-.047 1.023-.058 1.351-.058 3.807v.468c0 2.456.011 2.784.058 3.807.045.975.207 1.504.344 1.857.182.466.399.8.748 1.15.35.35.683.566 1.15.748.353.137.882.3 1.857.344 1.054.048 1.37.058 4.041.058h.08c2.597 0 2.917-.01 3.96-.058.976-.045 1.505-.207 1.858-.344.466-.182.8-.398 1.15-.748.35-.35.566-.683.748-1.15.137-.353.3-.882.344-1.857.048-1.055.058-1.37.058-4.041v-.08c0-2.597-.01-2.917-.058-3.96-.045-.976-.207-1.505-.344-1.858a3.097 3.097 0 00-.748-1.15 3.098 3.098 0 00-1.15-.748c-.353-.137-.882-.3-1.857-.344-1.023-.047-1.351-.058-3.807-.058zM12 6.865a5.135 5.135 0 110 10.27 5.135 5.135 0 010-10.27zm0 1.802a3.333 3.333 0 100 6.666 3.333 3.333 0 000-6.666zm5.338-3.205a1.2 1.2 0 110 2.4 1.2 1.2 0 010-2.4z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a
|
||||
class="text-gray-700 transition hover:text-gray-700/75"
|
||||
href="https://github.com/zepyrshut"
|
||||
rel="noreferrer"
|
||||
target="_blank"
|
||||
>
|
||||
<span class="sr-only">GitHub</span>
|
||||
<svg
|
||||
class="h-6 w-6"
|
||||
aria-hidden="true"
|
||||
fill="currentColor"
|
||||
viewBox="0 0 24 24"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a
|
||||
class="text-gray-700 transition hover:text-gray-700/75"
|
||||
href="https://pedroperez.dev/"
|
||||
rel="noreferrer"
|
||||
target="_blank"
|
||||
>
|
||||
<span class="sr-only">Website</span>
|
||||
<svg
|
||||
class="h-6 w-6"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M12 21a9.004 9.004 0 008.716-6.747M12 21a9.004 9.004 0 01-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 017.843 4.582M12 3a8.997 8.997 0 00-7.843 4.582m15.686 0A11.953 11.953 0 0112 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0121 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0112 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 013 12c0-1.605.42-3.113 1.157-4.418"
|
||||
/>
|
||||
</svg>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
class="text-gray-700 transition hover:text-gray-700/75"
|
||||
href="https://github.com/zepyrshut/rating-orama"
|
||||
rel="noreferrer"
|
||||
target="_blank"
|
||||
>
|
||||
<span class="sr-only">Source</span>
|
||||
<svg
|
||||
class="h-6 w-6"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M17.25 6.75L22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3l-4.5 16.5"
|
||||
/>
|
||||
</svg>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</footer>
|
||||
|
||||
<script src="./src/main.js" type="module"></script>
|
||||
<script
|
||||
src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.2.1/chart.umd.js"
|
||||
integrity="sha512-vCUbejtS+HcWYtDHRF2T5B0BKwVG/CLeuew5uT2AiX4SJ2Wff52+kfgONvtdATqkqQMC9Ye5K+Td0OTaz+P7cw=="
|
||||
crossorigin="anonymous"
|
||||
referrerpolicy="no-referrer"
|
||||
></script>
|
||||
<script type="module">
|
||||
import { initCharts, loadSpecificSeason } from "./src/components/charts.js";
|
||||
import { data } from "./src/data/breaking-bad.js";
|
||||
|
||||
const tvShowParsed = data;
|
||||
|
||||
function loadSeason(season) {
|
||||
const currentScrollY = window.scrollY;
|
||||
loadSpecificSeason(tvShowParsed, season);
|
||||
window.scrollTo(0, currentScrollY);
|
||||
}
|
||||
|
||||
window.loadSeason = loadSeason;
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
initCharts(tvShowParsed);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,80 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<link href="./src/styles/index.css" rel="stylesheet" />
|
||||
<title>Inicio</title>
|
||||
</head>
|
||||
|
||||
<body class="min-h-screen bg-gray-100">
|
||||
<p class="mb-6 bg-yellow-400">
|
||||
Work in progress - API 0.1.0 / Harvester 0.1.0 / Views 0.1.0
|
||||
<a class="text-blue-800" href="mailto:hola@pedroperez.dev"
|
||||
>Have you found any bugs or is it not working with a specific tv
|
||||
show?</a
|
||||
>
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<div class="flex min-h-screen flex-col items-center justify-center">
|
||||
<h1 class="mb-6 text-3xl font-bold">Rating Orama</h1>
|
||||
|
||||
|
||||
<div class="w-full max-w-md">
|
||||
<form x-data="search" @submit.prevent="submit" class="flex items-center gap-3" >
|
||||
<input
|
||||
x-model="ttID"
|
||||
class="rounded-md border-2 border-black bg-white px-4 py-2 w-11/12"
|
||||
id="search"
|
||||
name="search"
|
||||
type="text"
|
||||
placeholder="tt0903747"
|
||||
required
|
||||
/>
|
||||
<button
|
||||
:disabled="isLoading"
|
||||
class="rounded-md border-2 border-black bg-white px-4 py-2 font-bold text-black w-2/12"
|
||||
type="submit"
|
||||
:class="isLoading ? '' : 'hover:bg-black hover:text-white'"
|
||||
>
|
||||
<div class="flex items-center justify-center">
|
||||
<template x-if="isLoading">
|
||||
<div role="status">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="h-6 w-6 animate-spin fill-black text-white"
|
||||
aria-hidden="true"
|
||||
viewBox="0 0 100 101"
|
||||
fill="none"
|
||||
>
|
||||
<path
|
||||
d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
<path
|
||||
d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z"
|
||||
fill="currentFill"
|
||||
/>
|
||||
</svg>
|
||||
<span class="sr-only">Cargando...</span>
|
||||
</div>
|
||||
</template>
|
||||
<template x-if="!isLoading" class="lorem">
|
||||
<span>Go!</span>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
</button>
|
||||
</form>
|
||||
<p class="mt-2">
|
||||
Please input <span class="font-bold">tt id</span> from IDMb
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script src="./src/main.js" type="module"></script>
|
||||
</body>
|
||||
</html>
|
||||
Generated
+4128
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"name": "views-dev",
|
||||
"private": true,
|
||||
"version": "0.1.0",
|
||||
"type": "module",
|
||||
"author": "Pedro Pérez",
|
||||
"license": "EUPL",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/forms": "^0.5.3",
|
||||
"autoprefixer": "^10.4.14",
|
||||
"postcss": "^8.4.21",
|
||||
"prettier": "^2.8.7",
|
||||
"prettier-plugin-organize-attributes": "^0.0.5",
|
||||
"prettier-plugin-tailwindcss": "^0.2.7",
|
||||
"standard": "^17.0.0",
|
||||
"tailwindcss": "^3.3.1",
|
||||
"vite": "^4.2.1"
|
||||
},
|
||||
"standard": {
|
||||
"ignore": [
|
||||
"node_modules",
|
||||
"dist",
|
||||
"*.config.js"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
module.exports = {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
autoprefixer: {}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
export function initCharts (tvShowParsed) {
|
||||
new EpisodeChart(tvShowParsed, 'episodes', 0)
|
||||
new SeasonsChart(tvShowParsed, 'seasons')
|
||||
}
|
||||
|
||||
export function loadSpecificSeason (tvShowParsed, seasonId) {
|
||||
new EpisodeChart(tvShowParsed, 'episodes', seasonId - 1)
|
||||
}
|
||||
|
||||
let chartInstance
|
||||
|
||||
class SeasonsChart {
|
||||
constructor (tvShowParsed, canvasId) {
|
||||
this.tvShowParsed = tvShowParsed
|
||||
this.canvasId = canvasId
|
||||
this.createChart()
|
||||
}
|
||||
|
||||
createChart () {
|
||||
const seasons = this.tvShowParsed.seasons
|
||||
const labels = seasons.map((season) => `Season ${season.number}`)
|
||||
const averageRating = seasons.map((season) => season.avg_rating)
|
||||
const medianRating = seasons.map((season) => season.median_rating)
|
||||
const votes = seasons.map((season) => season.votes)
|
||||
const title = 'Seasons'
|
||||
const ctx = document.getElementById(this.canvasId)
|
||||
|
||||
new Chart(ctx, {
|
||||
type: 'bar',
|
||||
data: {
|
||||
labels,
|
||||
datasets: [
|
||||
{
|
||||
label: 'Average rating',
|
||||
data: averageRating,
|
||||
backgroundColor: 'rgba(75, 192, 192, 0.5)',
|
||||
borderColor: 'rgba(75, 192, 192, 1)',
|
||||
borderWidth: 1,
|
||||
Range: 10,
|
||||
yAxisID: 'y-axis-ratings'
|
||||
},
|
||||
{
|
||||
label: 'Median rating',
|
||||
data: medianRating,
|
||||
backgroundColor: 'rgba(255, 206, 86, 0.5)',
|
||||
borderColor: 'rgba(255, 206, 86, 1)',
|
||||
borderWidth: 1,
|
||||
Range: 10,
|
||||
yAxisID: 'y-axis-ratings'
|
||||
|
||||
},
|
||||
{
|
||||
label: 'Votes',
|
||||
data: votes,
|
||||
type: 'line',
|
||||
tension: 0.4,
|
||||
fill: false,
|
||||
borderColor: 'rgba(255, 99, 132, 1)',
|
||||
borderWidth: 2,
|
||||
yAxisID: 'y-axis-votes'
|
||||
}
|
||||
]
|
||||
},
|
||||
options: {
|
||||
animation: {
|
||||
duration: 0
|
||||
},
|
||||
y: {
|
||||
stacked: true
|
||||
},
|
||||
scales: {
|
||||
'y-axis-ratings': {
|
||||
min: 0,
|
||||
max: 10,
|
||||
type: 'linear',
|
||||
display: true,
|
||||
position: 'left',
|
||||
beginAtZero: true
|
||||
},
|
||||
'y-axis-votes': {
|
||||
type: 'linear',
|
||||
display: true,
|
||||
position: 'right',
|
||||
beginAtZero: true
|
||||
}
|
||||
}
|
||||
},
|
||||
plugins: {
|
||||
title: {
|
||||
display: true,
|
||||
text: title
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
class EpisodeChart {
|
||||
constructor (tvShowParsed, canvasId, seasonId) {
|
||||
this.tvShowParsed = tvShowParsed
|
||||
this.canvasId = canvasId
|
||||
this.seasonId = seasonId
|
||||
this.createChart()
|
||||
}
|
||||
|
||||
createChart () {
|
||||
if (chartInstance) {
|
||||
chartInstance.destroy()
|
||||
}
|
||||
|
||||
const episodes = this.tvShowParsed.seasons[this.seasonId].episodes
|
||||
const labels = episodes.map((episode) => `Ep. ${episode.number}`)
|
||||
const ratings = episodes.map((episode) => episode.avg_rating)
|
||||
const votes = episodes.map((episode) => episode.votes)
|
||||
const title = `Episodes of season ${this.seasonId + 1}`
|
||||
const ctx = document.getElementById(this.canvasId)
|
||||
|
||||
chartInstance = new Chart(ctx, {
|
||||
type: 'bar',
|
||||
data: {
|
||||
labels,
|
||||
datasets: [
|
||||
{
|
||||
label: 'Average rating',
|
||||
data: ratings,
|
||||
backgroundColor: 'rgba(75, 192, 192, 0.5)',
|
||||
borderColor: 'rgba(75, 192, 192, 1)',
|
||||
borderWidth: 1,
|
||||
Range: 10,
|
||||
yAxisID: 'y-axis-ratings'
|
||||
},
|
||||
{
|
||||
label: 'Votes',
|
||||
data: votes,
|
||||
type: 'line',
|
||||
tension: 0.4,
|
||||
fill: false,
|
||||
borderColor: 'rgba(255, 99, 132, 1)',
|
||||
borderWidth: 2,
|
||||
yAxisID: 'y-axis-votes'
|
||||
}
|
||||
]
|
||||
},
|
||||
options: {
|
||||
animation: {
|
||||
duration: 0
|
||||
},
|
||||
scales: {
|
||||
'y-axis-ratings': {
|
||||
min: 0,
|
||||
max: 10,
|
||||
type: 'linear',
|
||||
display: true,
|
||||
position: 'left',
|
||||
beginAtZero: true
|
||||
},
|
||||
'y-axis-votes': {
|
||||
type: 'linear',
|
||||
display: true,
|
||||
position: 'right',
|
||||
beginAtZero: true
|
||||
}
|
||||
},
|
||||
plugins: {
|
||||
tooltip: {
|
||||
callbacks: {
|
||||
title: function (context) {
|
||||
const index = context[0].dataIndex
|
||||
const episode = episodes[index]
|
||||
return `${episode.title} (${episode.aired.split('T')[0]})`
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
export function search() {
|
||||
return {
|
||||
url: '/tv-show?id=',
|
||||
ttID: '',
|
||||
isLoading: false,
|
||||
isError: false,
|
||||
submit() {
|
||||
this.isLoading = true;
|
||||
fetch(this.url+this.ttID)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,546 @@
|
||||
export const data = {
|
||||
show_id: '0903747',
|
||||
title: 'Breaking Bad',
|
||||
runtime: '49',
|
||||
votes: 1970456,
|
||||
avg_rating: 8.957686180794227,
|
||||
median_rating: 8.851234567891,
|
||||
seasons: [
|
||||
{
|
||||
number: 1,
|
||||
avg_rating: 8.701234567891,
|
||||
median_rating: 8.701234567891,
|
||||
votes: 202551,
|
||||
episodes: [
|
||||
{
|
||||
number: 1,
|
||||
episode_id: '0959621',
|
||||
title: 'Pilot',
|
||||
aired: '2008-01-20T00:00:00Z',
|
||||
avg_rating: 9.001234567891,
|
||||
votes: 38574
|
||||
},
|
||||
{
|
||||
number: 2,
|
||||
episode_id: '1054724',
|
||||
title: "Cat's in the Bag...",
|
||||
aired: '2008-01-27T00:00:00Z',
|
||||
avg_rating: 8.601234567891,
|
||||
votes: 28116
|
||||
},
|
||||
{
|
||||
number: 3,
|
||||
episode_id: '1054725',
|
||||
title: "...And the Bag's in the River",
|
||||
aired: '2008-02-10T00:00:00Z',
|
||||
avg_rating: 8.701234567891,
|
||||
votes: 27227
|
||||
},
|
||||
{
|
||||
number: 4,
|
||||
episode_id: '1054726',
|
||||
title: 'Cancer Man',
|
||||
aired: '2008-02-17T00:00:00Z',
|
||||
avg_rating: 8.201234567891,
|
||||
votes: 26251
|
||||
},
|
||||
{
|
||||
number: 5,
|
||||
episode_id: '1054727',
|
||||
title: 'Gray Matter',
|
||||
aired: '2008-02-24T00:00:00Z',
|
||||
avg_rating: 8.301234567891,
|
||||
votes: 25788
|
||||
},
|
||||
{
|
||||
number: 6,
|
||||
episode_id: '1054728',
|
||||
title: "Crazy Handful of Nothin'",
|
||||
aired: '2008-03-02T00:00:00Z',
|
||||
avg_rating: 9.301234567891,
|
||||
votes: 30318
|
||||
},
|
||||
{
|
||||
number: 7,
|
||||
episode_id: '1054729',
|
||||
title: 'A No-Rough-Stuff-Type Deal',
|
||||
aired: '2008-03-09T00:00:00Z',
|
||||
avg_rating: 8.801234567891,
|
||||
votes: 26277
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
number: 2,
|
||||
avg_rating: 8.793542260198691,
|
||||
median_rating: 8.801234567891,
|
||||
votes: 314689,
|
||||
episodes: [
|
||||
{
|
||||
number: 1,
|
||||
episode_id: '1232244',
|
||||
title: 'Seven Thirty-Seven',
|
||||
aired: '2009-03-08T00:00:00Z',
|
||||
avg_rating: 8.601234567891,
|
||||
votes: 23829
|
||||
},
|
||||
{
|
||||
number: 2,
|
||||
episode_id: '1232249',
|
||||
title: 'Grilled',
|
||||
aired: '2009-03-15T00:00:00Z',
|
||||
avg_rating: 9.301234567891,
|
||||
votes: 27376
|
||||
},
|
||||
{
|
||||
number: 3,
|
||||
episode_id: '1232250',
|
||||
title: 'Bit by a Dead Bee',
|
||||
aired: '2009-03-22T00:00:00Z',
|
||||
avg_rating: 8.301234567891,
|
||||
votes: 22927
|
||||
},
|
||||
{
|
||||
number: 4,
|
||||
episode_id: '1232251',
|
||||
title: 'Down',
|
||||
aired: '2009-03-29T00:00:00Z',
|
||||
avg_rating: 8.201234567891,
|
||||
votes: 23044
|
||||
},
|
||||
{
|
||||
number: 5,
|
||||
episode_id: '1232252',
|
||||
title: 'Breakage',
|
||||
aired: '2009-04-05T00:00:00Z',
|
||||
avg_rating: 8.301234567891,
|
||||
votes: 22405
|
||||
},
|
||||
{
|
||||
number: 6,
|
||||
episode_id: '1232253',
|
||||
title: 'Peekaboo',
|
||||
aired: '2009-04-12T00:00:00Z',
|
||||
avg_rating: 8.801234567891,
|
||||
votes: 24596
|
||||
},
|
||||
{
|
||||
number: 7,
|
||||
episode_id: '1232254',
|
||||
title: 'Negro y Azul',
|
||||
aired: '2009-04-19T00:00:00Z',
|
||||
avg_rating: 8.601234567891,
|
||||
votes: 22516
|
||||
},
|
||||
{
|
||||
number: 8,
|
||||
episode_id: '1232255',
|
||||
title: 'Better Call Saul',
|
||||
aired: '2009-04-26T00:00:00Z',
|
||||
avg_rating: 9.201234567891,
|
||||
votes: 26928
|
||||
},
|
||||
{
|
||||
number: 9,
|
||||
episode_id: '1232256',
|
||||
title: '4 Days Out',
|
||||
aired: '2009-05-03T00:00:00Z',
|
||||
avg_rating: 9.101234567891,
|
||||
votes: 25676
|
||||
},
|
||||
{
|
||||
number: 10,
|
||||
episode_id: '1232245',
|
||||
title: 'Over',
|
||||
aired: '2009-05-10T00:00:00Z',
|
||||
avg_rating: 8.501234567891,
|
||||
votes: 21990
|
||||
},
|
||||
{
|
||||
number: 11,
|
||||
episode_id: '1232246',
|
||||
title: 'Mandala',
|
||||
aired: '2009-05-17T00:00:00Z',
|
||||
avg_rating: 8.901234567891,
|
||||
votes: 22706
|
||||
},
|
||||
{
|
||||
number: 12,
|
||||
episode_id: '1232247',
|
||||
title: 'Phoenix',
|
||||
aired: '2009-05-24T00:00:00Z',
|
||||
avg_rating: 9.301234567891,
|
||||
votes: 25512
|
||||
},
|
||||
{
|
||||
number: 13,
|
||||
episode_id: '1232248',
|
||||
title: 'ABQ',
|
||||
aired: '2009-05-31T00:00:00Z',
|
||||
avg_rating: 9.201234567891,
|
||||
votes: 25184
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
number: 3,
|
||||
avg_rating: 8.73200379866023,
|
||||
median_rating: 8.501234567891,
|
||||
votes: 321759,
|
||||
episodes: [
|
||||
{
|
||||
number: 1,
|
||||
episode_id: '1528116',
|
||||
title: 'No Más',
|
||||
aired: '2010-03-21T00:00:00Z',
|
||||
avg_rating: 8.501234567891,
|
||||
votes: 21788
|
||||
},
|
||||
{
|
||||
number: 2,
|
||||
episode_id: '1615186',
|
||||
title: 'Caballo sin Nombre',
|
||||
aired: '2010-03-28T00:00:00Z',
|
||||
avg_rating: 8.601234567891,
|
||||
votes: 21259
|
||||
},
|
||||
{
|
||||
number: 3,
|
||||
episode_id: '1615187',
|
||||
title: 'I.F.T.',
|
||||
aired: '2010-04-04T00:00:00Z',
|
||||
avg_rating: 8.401234567891,
|
||||
votes: 21128
|
||||
},
|
||||
{
|
||||
number: 4,
|
||||
episode_id: '1615554',
|
||||
title: 'Green Light',
|
||||
aired: '2010-04-11T00:00:00Z',
|
||||
avg_rating: 8.201234567891,
|
||||
votes: 21304
|
||||
},
|
||||
{
|
||||
number: 5,
|
||||
episode_id: '1615555',
|
||||
title: 'Más',
|
||||
aired: '2010-04-18T00:00:00Z',
|
||||
avg_rating: 8.501234567891,
|
||||
votes: 20681
|
||||
},
|
||||
{
|
||||
number: 6,
|
||||
episode_id: '1615556',
|
||||
title: 'Sunset',
|
||||
aired: '2010-04-25T00:00:00Z',
|
||||
avg_rating: 9.301234567891,
|
||||
votes: 24259
|
||||
},
|
||||
{
|
||||
number: 7,
|
||||
episode_id: '1615944',
|
||||
title: 'One Minute',
|
||||
aired: '2010-05-02T00:00:00Z',
|
||||
avg_rating: 9.601234567891,
|
||||
votes: 29760
|
||||
},
|
||||
{
|
||||
number: 8,
|
||||
episode_id: '1615557',
|
||||
title: 'I See You',
|
||||
aired: '2010-05-09T00:00:00Z',
|
||||
avg_rating: 8.701234567891,
|
||||
votes: 21246
|
||||
},
|
||||
{
|
||||
number: 9,
|
||||
episode_id: '1615558',
|
||||
title: 'Kafkaesque',
|
||||
aired: '2010-05-16T00:00:00Z',
|
||||
avg_rating: 8.401234567891,
|
||||
votes: 20956
|
||||
},
|
||||
{
|
||||
number: 10,
|
||||
episode_id: '1615550',
|
||||
title: 'Fly',
|
||||
aired: '2010-05-23T00:00:00Z',
|
||||
avg_rating: 7.801234567891,
|
||||
votes: 37113
|
||||
},
|
||||
{
|
||||
number: 11,
|
||||
episode_id: '1615551',
|
||||
title: 'Abiquiu',
|
||||
aired: '2010-05-30T00:00:00Z',
|
||||
avg_rating: 8.401234567891,
|
||||
votes: 20848
|
||||
},
|
||||
{
|
||||
number: 12,
|
||||
episode_id: '1615552',
|
||||
title: 'Half Measures',
|
||||
aired: '2010-06-06T00:00:00Z',
|
||||
avg_rating: 9.501234567891,
|
||||
votes: 28966
|
||||
},
|
||||
{
|
||||
number: 13,
|
||||
episode_id: '1615553',
|
||||
title: 'Full Measure',
|
||||
aired: '2010-06-13T00:00:00Z',
|
||||
avg_rating: 9.601234567891,
|
||||
votes: 32451
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
number: 4,
|
||||
avg_rating: 8.962773029429462,
|
||||
median_rating: 8.801234567891,
|
||||
votes: 360823,
|
||||
episodes: [
|
||||
{
|
||||
number: 1,
|
||||
episode_id: '1683084',
|
||||
title: 'Box Cutter',
|
||||
aired: '2011-07-17T00:00:00Z',
|
||||
avg_rating: 9.201234567891,
|
||||
votes: 25917
|
||||
},
|
||||
{
|
||||
number: 2,
|
||||
episode_id: '1683089',
|
||||
title: 'Thirty-Eight Snub',
|
||||
aired: '2011-07-24T00:00:00Z',
|
||||
avg_rating: 8.201234567891,
|
||||
votes: 21491
|
||||
},
|
||||
{
|
||||
number: 3,
|
||||
episode_id: '1683090',
|
||||
title: 'Open House',
|
||||
aired: '2011-07-31T00:00:00Z',
|
||||
avg_rating: 8.001234567891,
|
||||
votes: 21780
|
||||
},
|
||||
{
|
||||
number: 4,
|
||||
episode_id: '1683091',
|
||||
title: 'Bullet Points',
|
||||
aired: '2011-08-07T00:00:00Z',
|
||||
avg_rating: 8.601234567891,
|
||||
votes: 20664
|
||||
},
|
||||
{
|
||||
number: 5,
|
||||
episode_id: '1683092',
|
||||
title: 'Shotgun',
|
||||
aired: '2011-08-14T00:00:00Z',
|
||||
avg_rating: 8.601234567891,
|
||||
votes: 20719
|
||||
},
|
||||
{
|
||||
number: 6,
|
||||
episode_id: '1683093',
|
||||
title: 'Cornered',
|
||||
aired: '2011-08-21T00:00:00Z',
|
||||
avg_rating: 8.401234567891,
|
||||
votes: 20950
|
||||
},
|
||||
{
|
||||
number: 7,
|
||||
episode_id: '1683094',
|
||||
title: 'Problem Dog',
|
||||
aired: '2011-08-28T00:00:00Z',
|
||||
avg_rating: 8.801234567891,
|
||||
votes: 21642
|
||||
},
|
||||
{
|
||||
number: 8,
|
||||
episode_id: '1683095',
|
||||
title: 'Hermanos',
|
||||
aired: '2011-09-04T00:00:00Z',
|
||||
avg_rating: 9.201234567891,
|
||||
votes: 24356
|
||||
},
|
||||
{
|
||||
number: 9,
|
||||
episode_id: '1683096',
|
||||
title: 'Bug',
|
||||
aired: '2011-09-11T00:00:00Z',
|
||||
avg_rating: 8.801234567891,
|
||||
votes: 21930
|
||||
},
|
||||
{
|
||||
number: 10,
|
||||
episode_id: '1683085',
|
||||
title: 'Salud',
|
||||
aired: '2011-09-18T00:00:00Z',
|
||||
avg_rating: 9.601234567891,
|
||||
votes: 30819
|
||||
},
|
||||
{
|
||||
number: 11,
|
||||
episode_id: '1683086',
|
||||
title: 'Crawl Space',
|
||||
aired: '2011-09-25T00:00:00Z',
|
||||
avg_rating: 9.701234567891,
|
||||
votes: 35874
|
||||
},
|
||||
{
|
||||
number: 12,
|
||||
episode_id: '1683087',
|
||||
title: 'End Times',
|
||||
aired: '2011-10-02T00:00:00Z',
|
||||
avg_rating: 9.501234567891,
|
||||
votes: 27683
|
||||
},
|
||||
{
|
||||
number: 13,
|
||||
episode_id: '1683088',
|
||||
title: 'Face Off',
|
||||
aired: '2011-10-09T00:00:00Z',
|
||||
avg_rating: 9.901234567891,
|
||||
votes: 66998
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
number: 5,
|
||||
avg_rating: 9.382484567891,
|
||||
median_rating: 9.451234567891,
|
||||
votes: 770634,
|
||||
episodes: [
|
||||
{
|
||||
number: 1,
|
||||
episode_id: '2081647',
|
||||
title: 'Live Free or Die',
|
||||
aired: '2012-07-15T00:00:00Z',
|
||||
avg_rating: 9.201234567891,
|
||||
votes: 29240
|
||||
},
|
||||
{
|
||||
number: 2,
|
||||
episode_id: '2301457',
|
||||
title: 'Madrigal',
|
||||
aired: '2012-07-22T00:00:00Z',
|
||||
avg_rating: 8.801234567891,
|
||||
votes: 25392
|
||||
},
|
||||
{
|
||||
number: 3,
|
||||
episode_id: '2301459',
|
||||
title: 'Hazard Pay',
|
||||
aired: '2012-07-29T00:00:00Z',
|
||||
avg_rating: 8.801234567891,
|
||||
votes: 24811
|
||||
},
|
||||
{
|
||||
number: 4,
|
||||
episode_id: '2301461',
|
||||
title: 'Fifty-One',
|
||||
aired: '2012-08-05T00:00:00Z',
|
||||
avg_rating: 8.801234567891,
|
||||
votes: 25002
|
||||
},
|
||||
{
|
||||
number: 5,
|
||||
episode_id: '2301463',
|
||||
title: 'Dead Freight',
|
||||
aired: '2012-08-12T00:00:00Z',
|
||||
avg_rating: 9.701234567891,
|
||||
votes: 36260
|
||||
},
|
||||
{
|
||||
number: 6,
|
||||
episode_id: '2301465',
|
||||
title: 'Buyout',
|
||||
aired: '2012-08-19T00:00:00Z',
|
||||
avg_rating: 9.001234567891,
|
||||
votes: 25440
|
||||
},
|
||||
{
|
||||
number: 7,
|
||||
episode_id: '2301467',
|
||||
title: 'Say My Name',
|
||||
aired: '2012-08-26T00:00:00Z',
|
||||
avg_rating: 9.501234567891,
|
||||
votes: 32854
|
||||
},
|
||||
{
|
||||
number: 8,
|
||||
episode_id: '2301469',
|
||||
title: 'Gliding Over All',
|
||||
aired: '2012-09-02T00:00:00Z',
|
||||
avg_rating: 9.601234567891,
|
||||
votes: 32564
|
||||
},
|
||||
{
|
||||
number: 9,
|
||||
episode_id: '2301471',
|
||||
title: 'Blood Money',
|
||||
aired: '2013-08-11T00:00:00Z',
|
||||
avg_rating: 9.401234567891,
|
||||
votes: 31146
|
||||
},
|
||||
{
|
||||
number: 10,
|
||||
episode_id: '2301443',
|
||||
title: 'Buried',
|
||||
aired: '2013-08-18T00:00:00Z',
|
||||
avg_rating: 9.201234567891,
|
||||
votes: 27751
|
||||
},
|
||||
{
|
||||
number: 11,
|
||||
episode_id: '2301445',
|
||||
title: 'Confessions',
|
||||
aired: '2013-08-25T00:00:00Z',
|
||||
avg_rating: 9.601234567891,
|
||||
votes: 33390
|
||||
},
|
||||
{
|
||||
number: 12,
|
||||
episode_id: '2301447',
|
||||
title: 'Rabid Dog',
|
||||
aired: '2013-09-01T00:00:00Z',
|
||||
avg_rating: 9.101234567891,
|
||||
votes: 28993
|
||||
},
|
||||
{
|
||||
number: 13,
|
||||
episode_id: '2301449',
|
||||
title: "To'hajiilee",
|
||||
aired: '2013-09-08T00:00:00Z',
|
||||
avg_rating: 9.801234567891,
|
||||
votes: 49153
|
||||
},
|
||||
{
|
||||
number: 14,
|
||||
episode_id: '2301451',
|
||||
title: 'Ozymandias',
|
||||
aired: '2013-09-15T00:00:00Z',
|
||||
avg_rating: 10.001234567891,
|
||||
votes: 193236
|
||||
},
|
||||
{
|
||||
number: 15,
|
||||
episode_id: '2301453',
|
||||
title: 'Granite State',
|
||||
aired: '2013-09-22T00:00:00Z',
|
||||
avg_rating: 9.701234567891,
|
||||
votes: 48290
|
||||
},
|
||||
{
|
||||
number: 16,
|
||||
episode_id: '2301455',
|
||||
title: 'Felina',
|
||||
aired: '2013-09-29T00:00:00Z',
|
||||
avg_rating: 9.901234567891,
|
||||
votes: 127112
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
import Alpine from 'https://cdn.jsdelivr.net/npm/alpinejs@3.12.0/dist/module.esm.min.js'
|
||||
import { search } from './components/search'
|
||||
|
||||
window.Alpine = Alpine
|
||||
|
||||
Alpine.data('search', search)
|
||||
|
||||
Alpine.start()
|
||||
@@ -0,0 +1,3 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
@@ -0,0 +1,11 @@
|
||||
/** @type {import('tailwindcss').Config} */
|
||||
module.exports = {
|
||||
darkMode: 'class',
|
||||
content: ['./*.html', './src/**/*.{js,ts,jsx,tsx}'],
|
||||
theme: {
|
||||
extend: {}
|
||||
},
|
||||
plugins: [require('@tailwindcss/forms')({
|
||||
strategy: 'class'
|
||||
})]
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
import { defineConfig } from 'vite'
|
||||
|
||||
export default defineConfig({
|
||||
base: './'
|
||||
})
|
||||
Reference in New Issue
Block a user