Skip to content
Snippets Groups Projects
Verified Commit 6de78747 authored by Miniontoby's avatar Miniontoby :writing_hand_tone1:
Browse files

Added Artist field to Songs

parent 8d3d29cb
No related tags found
No related merge requests found
......@@ -53,6 +53,7 @@ model Playlist {
model Song {
id Int @id @default(autoincrement())
name String @unique
artist String?
lyrics String?
playlists Playlist[]
sheets MusicSheet[]
......
......@@ -10,6 +10,7 @@ export async function getAll() {
select: {
id: true,
name: true,
artist: true,
lyrics: true,
sheets: true,
}
......@@ -29,6 +30,7 @@ export async function getAllByTeam(teamId: number) {
select: {
id: true,
name: true,
artist: true,
lyrics: true,
sheets: true,
}
......@@ -49,6 +51,7 @@ export async function findById(id: number) {
select: {
id: true,
name: true,
artist: true,
lyrics: true,
sheets: true,
}
......@@ -69,6 +72,7 @@ export async function findByName(name: string) {
select: {
id: true,
name: true,
artist: true,
lyrics: true,
sheets: true,
}
......@@ -78,14 +82,16 @@ export async function findByName(name: string) {
/**
* Create song
*
* @param name
* @param description
* @param name The name/title of the song (Required)
* @param artist The artist of the song (Optional)
* @param lyrics The lyrics of the song (Optional)
* @returns { object } created song
*/
export async function create(name: string, lyrics: string|undefined = undefined) {
export async function create(name: string, artist: string|undefined = undefined, lyrics: string|undefined = undefined) {
return await db.song.create({
data: {
name,
artist,
lyrics,
}
})
......@@ -95,17 +101,19 @@ export async function create(name: string, lyrics: string|undefined = undefined)
* Edit song
*
* @param id
* @param name
* @param description
* @param name The name/title of the song (Required)
* @param artist The artist of the song (Optional)
* @param lyrics The lyrics of the song (Optional)
* @returns { object } edited song
*/
export async function edit(id: number, name: string, lyrics: string) {
export async function edit(id: number, name: string, artist: string|undefined = undefined, lyrics: string|undefined = undefined) {
return await db.song.update({
where: {
id,
},
data: {
name,
artist,
lyrics,
}
})
......
......@@ -20,17 +20,18 @@ export const actions = {
const data = await request.formData();
const formData = parseAndCheckFormData(data, [
{ name: 'name', required: true, type: 'string' },
{ name: 'artist', required: false, type: 'string' },
{ name: 'lyrics', required: true, type: 'string' },
]);
if (!formData.success) return formData.data;
const { name, lyrics } = formData.data;
const { name, artist, lyrics } = formData.data;
const song = await Song.findById(Number(params.id));
if (song.name !== name && await Song.findByName(name))
return fail(400, { unique: true });
const songNew = await Song.edit(song.id, name, lyrics);
const songNew = await Song.edit(song.id, name, artist ?? '', lyrics);
return { success: true, song: songNew };
}
}
......@@ -14,11 +14,13 @@
/** @type {import('./$types').PageData} */
export let data;
$: song = data.song;
/** @type {import('./$types').ActionData} */
$: form = $page.form;
/** @type {string} */ $: name = song?.name;
/** @type {string} */ $: lyrics = song?.lyrics;
/** @type {string} */ $: name = form?.name ?? song?.name;
/** @type {string} */ $: artist = form?.artist ?? song?.artist ?? '';
/** @type {string} */ $: lyrics = form?.lyrics ?? song?.lyrics;
let working = false;
......@@ -69,6 +71,15 @@
bind:value={name}
disabled={working}
/>
<TextField
id="artist"
type="text"
placeholder={$_('fields.song.artist.placeholder')}
label={true}
labelText={$_('fields.song.artist.label')}
bind:value={artist}
disabled={working}
/>
<TextField
id="lyrics"
type="textarea"
......
......@@ -14,8 +14,9 @@
/** @type {import('./$types').ActionData} */
$: form = $page.form;
/** @type {string} */ let name;
/** @type {string} */ let lyrics;
/** @type {string} */ $: name = form?.name ?? '';
/** @type {string} */ $: artist = form?.artist ?? '';
/** @type {string} */ $: lyrics = form?.lyrics ?? '';
let working = false;
......@@ -66,6 +67,15 @@
bind:value={name}
disabled={working}
/>
<TextField
id="artist"
type="text"
placeholder={$_('fields.song.artist.placeholder')}
label={true}
labelText={$_('fields.song.artist.label')}
bind:value={artist}
disabled={working}
/>
<TextField
id="lyrics"
type="textarea"
......
......@@ -26,7 +26,7 @@
{:else}
<ul>
{#each songs as song}
<li><a href={$page.url.pathname + "/" + song.id}>{song.name}</a></li>
<li><a href={$page.url.pathname + "/" + song.id}><strong>{song.name}</strong>{song.artist ? ` by ${song.artist}` : ''}</a></li>
{/each}
</ul>
{/if}
......
<script>
import Roles from '$lib/roles';
import { Song } from '$lib/Song';
import { goto } from '$app/navigation';
import { slide } from 'svelte/transition';
import { _ } from 'svelte-i18n';
import { Song } from '$lib/Song';
import { getContext } from 'svelte';
/** @type {import('./$types').PageData} */
......@@ -22,6 +22,9 @@
<button class="btn-action" on:click={() => goto(location?.pathname + '/edit', { replaceState: false })}>{$_('page.songs.info.edit.button')}</button>
{/if}
<p><strong>{$_('fields.song.name.label')}:</strong> {song.name}</p>
{#if song.artist}
<p><strong>{$_('fields.song.artist.label')}:</strong> {song.artist}</p>
{/if}
<br><hr /><br>
<h3>{$_('fields.song.lyrics.label')}:</h3><br>
<div class="song_container">
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment