mirror of
https://github.com/JonasunderscoreJones/K-Comebacks.git
synced 2025-10-23 18:09:20 +02:00
Compare commits
No commits in common. "master" and "v0.1.0" have entirely different histories.
4 changed files with 524 additions and 749 deletions
39
README.md
39
README.md
|
@ -1,5 +1,38 @@
|
||||||
# K-Comebacks
|
# create-svelte
|
||||||
|
|
||||||
A web-app featuring a (somewhat) complete and updated list of the latest K-/J-/C-Pop Comebacks.
|
Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte).
|
||||||
|
|
||||||
[Visit kcomebacks.jonasjones.dev](https://kcomebacks.jonasjones.dev)
|
## Creating a project
|
||||||
|
|
||||||
|
If you're seeing this, you've probably already done this step. Congrats!
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# create a new project in the current directory
|
||||||
|
npm create svelte@latest
|
||||||
|
|
||||||
|
# create a new project in my-app
|
||||||
|
npm create svelte@latest my-app
|
||||||
|
```
|
||||||
|
|
||||||
|
## Developing
|
||||||
|
|
||||||
|
Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run dev
|
||||||
|
|
||||||
|
# or start the server and open the app in a new browser tab
|
||||||
|
npm run dev -- --open
|
||||||
|
```
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
To create a production version of your app:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
You can preview the production build with `npm run preview`.
|
||||||
|
|
||||||
|
> To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment.
|
||||||
|
|
1155
package-lock.json
generated
1155
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,5 @@
|
||||||
<script>
|
<script>
|
||||||
import { onMount } from "svelte";
|
import { onMount } from "svelte";
|
||||||
import { recordRequest } from "./analytics";
|
|
||||||
|
|
||||||
let releases = [];
|
let releases = [];
|
||||||
let searchArtist = "";
|
let searchArtist = "";
|
||||||
|
@ -9,13 +8,11 @@
|
||||||
let startDate = null;
|
let startDate = null;
|
||||||
let endDate = null;
|
let endDate = null;
|
||||||
let filteredReleases = [];
|
let filteredReleases = [];
|
||||||
let pageSize = 50;
|
let pageSize = 10;
|
||||||
let currentPage = 1;
|
let currentPage = 1;
|
||||||
let releaseTypes = [];
|
let releaseTypes = [];
|
||||||
let totalPages = 1;
|
let totalPages = 1;
|
||||||
let pages = [];
|
let pages = [];
|
||||||
let last_update = "Loading...";
|
|
||||||
let loading = "Loading...";
|
|
||||||
|
|
||||||
function sortByColumn(column) {
|
function sortByColumn(column) {
|
||||||
// Sort releases based on the selected column
|
// Sort releases based on the selected column
|
||||||
|
@ -39,13 +36,12 @@
|
||||||
.includes(searchTitle.toLowerCase());
|
.includes(searchTitle.toLowerCase());
|
||||||
const releaseTypeMatch =
|
const releaseTypeMatch =
|
||||||
selectedRelease === "" ||
|
selectedRelease === "" ||
|
||||||
(release.types === null
|
(release.releaseType === null
|
||||||
? "Unknown"
|
? "Unknown"
|
||||||
: release.types) === selectedRelease ||
|
: release.releaseType) === selectedRelease;
|
||||||
release.types.includes(selectedRelease);
|
|
||||||
const dateMatch =
|
const dateMatch =
|
||||||
(!startDate || new Date(release.date) >= new Date(startDate)) &&
|
(!startDate || new Date(release.date) >= startDate) &&
|
||||||
(!endDate || new Date(release.date) <= new Date(endDate));
|
(!endDate || new Date(release.date) <= endDate);
|
||||||
return artistMatch && titleMatch && releaseTypeMatch && dateMatch;
|
return artistMatch && titleMatch && releaseTypeMatch && dateMatch;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -72,33 +68,20 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
recordRequest();
|
|
||||||
try {
|
try {
|
||||||
const response = await fetch('https://cdn.jonasjones.dev/api/kcomebacks/rkpop_data.json');
|
const response = await fetch('https://cdn.jonasjones.dev/api/kcomebacks/data.json');
|
||||||
//const response = await fetch('/rkpop_data.json')
|
|
||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
releases = await response.json();
|
releases = await response.json();
|
||||||
|
|
||||||
last_update = releases[0].last_update;
|
|
||||||
releases.shift();
|
|
||||||
|
|
||||||
// Extract unique release types from the releases array
|
// Extract unique release types from the releases array
|
||||||
releaseTypes = Array.from(new Set(releases.map(release => {
|
releaseTypes = Array.from(new Set(releases.map(release => {
|
||||||
return release.types === null ? 'Unknown' : release.types;
|
return release.releaseType === null ? 'Unknown' : release.releaseType;
|
||||||
})));
|
})));
|
||||||
|
|
||||||
// releaseTypes should be an array of all elements of all the release.types lists of all releases
|
|
||||||
releaseTypes = releaseTypes.flat();
|
|
||||||
|
|
||||||
// eliminate duplicates
|
|
||||||
releaseTypes = [...new Set(releaseTypes)];
|
|
||||||
|
|
||||||
// Sort releases by date from most recent to least recent
|
// Sort releases by date from most recent to least recent
|
||||||
releases.sort((a, b) => new Date(b.date) - new Date(a.date));
|
releases.sort((a, b) => new Date(b.date) - new Date(a.date));
|
||||||
|
|
||||||
filterReleases(); // Initial filtering based on default values
|
filterReleases(); // Initial filtering based on default values
|
||||||
|
|
||||||
loading = "";
|
|
||||||
} else {
|
} else {
|
||||||
console.error('Failed to fetch data:', response.status);
|
console.error('Failed to fetch data:', response.status);
|
||||||
}
|
}
|
||||||
|
@ -108,10 +91,7 @@
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<title>K-Pop Comebacks</title>
|
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<a href="https://jonasjones.dev" style="color: white;position:absolute;right:20px;text-decoration:underline" >Homepage -></a>
|
|
||||||
<div class="title-banner">
|
<div class="title-banner">
|
||||||
<h1 class="title">K-Comebacks</h1>
|
<h1 class="title">K-Comebacks</h1>
|
||||||
</div>
|
</div>
|
||||||
|
@ -214,7 +194,6 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<p>Click on the column title to filter by them</p>
|
<p>Click on the column title to filter by them</p>
|
||||||
<p>Last updated: {last_update}</p>
|
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -222,28 +201,26 @@
|
||||||
<th on:click={() => sortByColumn("date")}>Date</th>
|
<th on:click={() => sortByColumn("date")}>Date</th>
|
||||||
<th on:click={() => sortByColumn("artist")}>Artist</th>
|
<th on:click={() => sortByColumn("artist")}>Artist</th>
|
||||||
<th on:click={() => sortByColumn("title")}>Title</th>
|
<th on:click={() => sortByColumn("title")}>Title</th>
|
||||||
<th on:click={() => sortByColumn("type")}>Release Types</th>
|
<th on:click={() => sortByColumn("releaseType")}>Release Type</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{#each filteredReleases as release}
|
{#each filteredReleases as release}
|
||||||
<tr>
|
<tr>
|
||||||
<!--calculate the release number-->
|
<!--calculate the release number-->
|
||||||
<td>{releases.length - releases.indexOf(release)}</td>
|
<td>{releases.indexOf(release) + 1}</td>
|
||||||
<td>{release.date}</td>
|
<td>{release.date}</td>
|
||||||
<td>{release.artist}</td>
|
<td>{release.artist}</td>
|
||||||
<td>{release.title}</td>
|
<td>{release.title}</td>
|
||||||
<td
|
<td
|
||||||
>{release.types === null
|
>{release.releaseType === null
|
||||||
? "Unknown"
|
? "Unknown"
|
||||||
// show the release.types list as a comma separated string
|
: release.releaseType}</td
|
||||||
: release.types.join(", ")}</td
|
|
||||||
>
|
>
|
||||||
</tr>
|
</tr>
|
||||||
{/each}
|
{/each}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<h1>{loading}</h1>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
// Function to record the request with analytics
|
|
||||||
export async function recordRequest() {
|
|
||||||
|
|
||||||
const analyticsData = {
|
|
||||||
timestamp: Date.now(),
|
|
||||||
domain: window.location.hostname,
|
|
||||||
method: 'GET', // Assuming the request method is GET; adjust as necessary
|
|
||||||
path: window.location.pathname,
|
|
||||||
};
|
|
||||||
|
|
||||||
console.log('Recording request:', analyticsData);
|
|
||||||
|
|
||||||
const ANALYTICS_URL = 'https://analytics.jonasjones.dev/requests/record/ipunknown';
|
|
||||||
const ANALYTICS_API_KEY = import.meta.env.VITE_ANALYTICS_API_KEY;
|
|
||||||
|
|
||||||
try {
|
|
||||||
const response = await fetch(ANALYTICS_URL, {
|
|
||||||
method: 'POST',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'Authorization': ANALYTICS_API_KEY,
|
|
||||||
},
|
|
||||||
body: JSON.stringify(analyticsData),
|
|
||||||
});
|
|
||||||
|
|
||||||
if (response.ok) {
|
|
||||||
console.log('Request recorded successfully');
|
|
||||||
} else {
|
|
||||||
console.error('Failed to record request:', response.status, await response.text());
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Error recording request:', error);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Add table
Add a link
Reference in a new issue