From 3125d657dd016405f849e38c4f2a9d02fa828aec Mon Sep 17 00:00:00 2001 From: Jonas Date: Sun, 7 Dec 2025 12:07:10 +0100 Subject: [PATCH] Simple Database + Endpoints --- .gitignore | 5 +- .vs/JudoWeb/DesignTimeBuild/.dtbcache.v2 | Bin 146591 -> 174419 bytes ...8c05cf6d-77be-490d-9450-d64de0268f4b.vsidx | Bin 107 -> 0 bytes API/API.csproj | 22 +++++- API/API.csproj.Backup (1).tmp | 32 ++++++++ API/API.csproj.Backup.tmp | 25 ++++++ API/Controllers/AgeGroupController.cs | 73 ++++++++++++++++++ API/Database/ApplicationDbContext.cs | 14 ++++ .../20251206113128_InitialCreate.Designer.cs | 47 +++++++++++ .../20251206113128_InitialCreate.cs | 36 +++++++++ ...206220303_ChangeAgeFieldsToInt.Designer.cs | 45 +++++++++++ .../20251206220303_ChangeAgeFieldsToInt.cs | 50 ++++++++++++ .../ApplicationDbContextModelSnapshot.cs | 42 ++++++++++ .../Altersgruppen/AltersGruppeIngoing.cs | 28 +++++++ .../Internal/Altersgruppen/AltersGruppe.cs | 12 +++ API/Program.cs | 29 ++++++- API/Repository/AgeGroup/AgeGroupService.cs | 68 ++++++++++++++++ API/Repository/AgeGroup/IAgeGroupService.cs | 14 ++++ API/app.db-shm | Bin 0 -> 32768 bytes API/app.db-wal | Bin 0 -> 78312 bytes GUI/src/components/ResponsiveTabsOrList.vue | 43 +++++++++++ GUI/src/routes/Home.vue | 33 ++++---- 22 files changed, 595 insertions(+), 23 deletions(-) delete mode 100644 .vs/JudoWeb/FileContentIndex/8c05cf6d-77be-490d-9450-d64de0268f4b.vsidx create mode 100644 API/API.csproj.Backup (1).tmp create mode 100644 API/API.csproj.Backup.tmp create mode 100644 API/Controllers/AgeGroupController.cs create mode 100644 API/Database/ApplicationDbContext.cs create mode 100644 API/Migrations/20251206113128_InitialCreate.Designer.cs create mode 100644 API/Migrations/20251206113128_InitialCreate.cs create mode 100644 API/Migrations/20251206220303_ChangeAgeFieldsToInt.Designer.cs create mode 100644 API/Migrations/20251206220303_ChangeAgeFieldsToInt.cs create mode 100644 API/Migrations/ApplicationDbContextModelSnapshot.cs create mode 100644 API/Models/Ingoing/Altersgruppen/AltersGruppeIngoing.cs create mode 100644 API/Models/Internal/Altersgruppen/AltersGruppe.cs create mode 100644 API/Repository/AgeGroup/AgeGroupService.cs create mode 100644 API/Repository/AgeGroup/IAgeGroupService.cs create mode 100644 API/app.db-shm create mode 100644 API/app.db-wal create mode 100644 GUI/src/components/ResponsiveTabsOrList.vue diff --git a/.gitignore b/.gitignore index fd441c5..654072c 100644 --- a/.gitignore +++ b/.gitignore @@ -74,4 +74,7 @@ yarn-error.log* *.sln.docstates # JetBrains IDEs -.idea/ \ No newline at end of file +.idea/ + +# Claude Code +.claude \ No newline at end of file diff --git a/.vs/JudoWeb/DesignTimeBuild/.dtbcache.v2 b/.vs/JudoWeb/DesignTimeBuild/.dtbcache.v2 index 0246481c00c857f43fa3fca88ec5806eb49b8401..803c5eae0ea171317047e8b7062133a932745f51 100644 GIT binary patch literal 174419 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 literal 146591 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 diff --git a/.vs/JudoWeb/FileContentIndex/8c05cf6d-77be-490d-9450-d64de0268f4b.vsidx b/.vs/JudoWeb/FileContentIndex/8c05cf6d-77be-490d-9450-d64de0268f4b.vsidx deleted file mode 100644 index 70aef67a00f5a48bfb0d87044cf8f151e2685b5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 wcmZ>EaTnxZU~p%E02V0C38Z0cW+XOHDO{Wlsuo0n)bd05(ok9*N*hCI0FV0t;Q#;t diff --git a/API/API.csproj b/API/API.csproj index 0c56541..93fcf8a 100644 --- a/API/API.csproj +++ b/API/API.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -7,11 +7,29 @@ + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + - + diff --git a/API/API.csproj.Backup (1).tmp b/API/API.csproj.Backup (1).tmp new file mode 100644 index 0000000..e071122 --- /dev/null +++ b/API/API.csproj.Backup (1).tmp @@ -0,0 +1,32 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + diff --git a/API/API.csproj.Backup.tmp b/API/API.csproj.Backup.tmp new file mode 100644 index 0000000..9d39161 --- /dev/null +++ b/API/API.csproj.Backup.tmp @@ -0,0 +1,25 @@ + + + + net8.0 + enable + enable + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + diff --git a/API/Controllers/AgeGroupController.cs b/API/Controllers/AgeGroupController.cs new file mode 100644 index 0000000..89267d1 --- /dev/null +++ b/API/Controllers/AgeGroupController.cs @@ -0,0 +1,73 @@ +using API.Models.Ingoing.Altersgruppen; +using API.Repository.AgeGroup; +using Microsoft.AspNetCore.Mvc; + +namespace API.Controllers +{ + [ApiController] + [Route("api/ageGroups/")] + public class AgeGroupController : ControllerBase + { + private IAgeGroupService _ageGroupService; + + public AgeGroupController(IAgeGroupService ageGroupService) + { + _ageGroupService = ageGroupService; + } + + [HttpGet()] + public async Task GetAll() + { + var allAgeGroups = await _ageGroupService.GetAllAsync(); + + return Ok(allAgeGroups); + } + + [HttpGet("{id}")] + public async Task GetOne([FromRoute] int id) + { + var group = await _ageGroupService.GetAsync(id); + + if (group == null) + { + return NotFound(); + } + + return Ok(group); + } + + [HttpPost()] + public async Task Create([FromBody] AltersGruppeIngoing groupDto) + { + var group = await _ageGroupService.CreateAsync(groupDto.ToInternalFromIngoing()); + + return CreatedAtAction(nameof(GetOne), new { Id = group.Id }, group); + } + + [HttpPut("{id}")] + public async Task Update([FromRoute] int id, [FromBody] AltersGruppeIngoing groupDto) + { + var group = await _ageGroupService.UpdateAsync(id, groupDto.ToInternalFromIngoing()); + + if(group == null) + { + return NotFound(); + } + + return Ok(group); + } + + [HttpDelete("{id}")] + public async Task Delete([FromRoute] int Id) + { + var group = await _ageGroupService.DeleteAsync(Id); + + if (group == null) + { + return NotFound(); + } + + return NoContent(); + } + } +} diff --git a/API/Database/ApplicationDbContext.cs b/API/Database/ApplicationDbContext.cs new file mode 100644 index 0000000..1a9f69b --- /dev/null +++ b/API/Database/ApplicationDbContext.cs @@ -0,0 +1,14 @@ +using API.Models.Internal.Altersgruppen; +using Microsoft.EntityFrameworkCore; + +namespace API.Database +{ + public class ApplicationDbContext : DbContext + { + public ApplicationDbContext(DbContextOptions options) : base(options) + { + } + + public DbSet Altersgruppen { get; set; } + } +} diff --git a/API/Migrations/20251206113128_InitialCreate.Designer.cs b/API/Migrations/20251206113128_InitialCreate.Designer.cs new file mode 100644 index 0000000..8220cb4 --- /dev/null +++ b/API/Migrations/20251206113128_InitialCreate.Designer.cs @@ -0,0 +1,47 @@ +// +using API.Database; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace API.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20251206113128_InitialCreate")] + partial class InitialCreate + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "9.0.11"); + + modelBuilder.Entity("API.Models.Internal.Altersgruppen.Altergruppe", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("EndingAge") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StartingAge") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Altersgruppen"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/API/Migrations/20251206113128_InitialCreate.cs b/API/Migrations/20251206113128_InitialCreate.cs new file mode 100644 index 0000000..fa435ab --- /dev/null +++ b/API/Migrations/20251206113128_InitialCreate.cs @@ -0,0 +1,36 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace API.Migrations +{ + /// + public partial class InitialCreate : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Altersgruppen", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + Name = table.Column(type: "TEXT", nullable: false), + StartingAge = table.Column(type: "TEXT", nullable: false), + EndingAge = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Altersgruppen", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Altersgruppen"); + } + } +} diff --git a/API/Migrations/20251206220303_ChangeAgeFieldsToInt.Designer.cs b/API/Migrations/20251206220303_ChangeAgeFieldsToInt.Designer.cs new file mode 100644 index 0000000..1997ead --- /dev/null +++ b/API/Migrations/20251206220303_ChangeAgeFieldsToInt.Designer.cs @@ -0,0 +1,45 @@ +// +using API.Database; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace API.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20251206220303_ChangeAgeFieldsToInt")] + partial class ChangeAgeFieldsToInt + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "9.0.11"); + + modelBuilder.Entity("API.Models.Internal.Altersgruppen.AltersGruppe", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("EndingAge") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StartingAge") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("Altersgruppen"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/API/Migrations/20251206220303_ChangeAgeFieldsToInt.cs b/API/Migrations/20251206220303_ChangeAgeFieldsToInt.cs new file mode 100644 index 0000000..fccb536 --- /dev/null +++ b/API/Migrations/20251206220303_ChangeAgeFieldsToInt.cs @@ -0,0 +1,50 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace API.Migrations +{ + /// + public partial class ChangeAgeFieldsToInt : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "StartingAge", + table: "Altersgruppen", + type: "INTEGER", + nullable: false, + oldClrType: typeof(string), + oldType: "TEXT"); + + migrationBuilder.AlterColumn( + name: "EndingAge", + table: "Altersgruppen", + type: "INTEGER", + nullable: false, + oldClrType: typeof(string), + oldType: "TEXT"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "StartingAge", + table: "Altersgruppen", + type: "TEXT", + nullable: false, + oldClrType: typeof(int), + oldType: "INTEGER"); + + migrationBuilder.AlterColumn( + name: "EndingAge", + table: "Altersgruppen", + type: "TEXT", + nullable: false, + oldClrType: typeof(int), + oldType: "INTEGER"); + } + } +} diff --git a/API/Migrations/ApplicationDbContextModelSnapshot.cs b/API/Migrations/ApplicationDbContextModelSnapshot.cs new file mode 100644 index 0000000..4e1d4ce --- /dev/null +++ b/API/Migrations/ApplicationDbContextModelSnapshot.cs @@ -0,0 +1,42 @@ +// +using API.Database; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace API.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + partial class ApplicationDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "9.0.11"); + + modelBuilder.Entity("API.Models.Internal.Altersgruppen.AltersGruppe", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("EndingAge") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("StartingAge") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("Altersgruppen"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/API/Models/Ingoing/Altersgruppen/AltersGruppeIngoing.cs b/API/Models/Ingoing/Altersgruppen/AltersGruppeIngoing.cs new file mode 100644 index 0000000..d382c45 --- /dev/null +++ b/API/Models/Ingoing/Altersgruppen/AltersGruppeIngoing.cs @@ -0,0 +1,28 @@ +using API.Models.Internal.Altersgruppen; +using System.ComponentModel.DataAnnotations; + +namespace API.Models.Ingoing.Altersgruppen +{ + public class AltersGruppeIngoing + { + [Required] + public string Name { get; set; } + [Required] + public int StartingAge { get; set; } + [Required] + public int EndingAge { get; set; } + } + + public static class AltersgruppeMapper + { + public static AltersGruppe ToInternalFromIngoing(this AltersGruppeIngoing group) + { + return new AltersGruppe + { + Name = group.Name, + StartingAge = group.StartingAge, + EndingAge = group.EndingAge, + }; + } + } +} diff --git a/API/Models/Internal/Altersgruppen/AltersGruppe.cs b/API/Models/Internal/Altersgruppen/AltersGruppe.cs new file mode 100644 index 0000000..5914805 --- /dev/null +++ b/API/Models/Internal/Altersgruppen/AltersGruppe.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace API.Models.Internal.Altersgruppen +{ + public class AltersGruppe + { + public int Id { get; set; } + public string Name { get; set; } + public int StartingAge { get; set; } + public int EndingAge { get; set; } + } +} diff --git a/API/Program.cs b/API/Program.cs index 48863a6..3a9fcab 100644 --- a/API/Program.cs +++ b/API/Program.cs @@ -1,12 +1,29 @@ +using API.Database; +using API.Repository.AgeGroup; +using Microsoft.EntityFrameworkCore; + var builder = WebApplication.CreateBuilder(args); -// Add services to the container. - builder.Services.AddControllers(); -// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); +// Database +var postgreConnection = builder.Configuration.GetConnectionString("PostgresConnection"); +if (!string.IsNullOrEmpty(postgreConnection)) +{ + // Nutze PostgresSQL + builder.Services.AddDbContext(options => options.UseNpgsql(postgreConnection)); +} +else +{ + builder.Services.AddDbContext(options => options.UseSqlite("Data Source=app.db")); +} + + +builder.Services.AddScoped(); + +// Add Database Services var app = builder.Build(); // Configure the HTTP request pipeline. @@ -16,6 +33,12 @@ if (app.Environment.IsDevelopment()) app.UseSwaggerUI(); } +using(var scope = app.Services.CreateScope()) +{ + var dbContext = scope.ServiceProvider.GetRequiredService(); + dbContext.Database.Migrate(); +} + app.UseHttpsRedirection(); app.UseAuthorization(); diff --git a/API/Repository/AgeGroup/AgeGroupService.cs b/API/Repository/AgeGroup/AgeGroupService.cs new file mode 100644 index 0000000..5bdee6d --- /dev/null +++ b/API/Repository/AgeGroup/AgeGroupService.cs @@ -0,0 +1,68 @@ +using API.Database; +using API.Models.Internal.Altersgruppen; +using Microsoft.EntityFrameworkCore; + +namespace API.Repository.AgeGroup +{ + public class AgeGroupService : IAgeGroupService + { + private ApplicationDbContext _context; + + public AgeGroupService(ApplicationDbContext context) + { + _context = context; + } + + public async Task CreateAsync(AltersGruppe altersGruppe) + { + await _context.Altersgruppen.AddAsync(altersGruppe); + await _context.SaveChangesAsync(); + return altersGruppe; + } + + public async Task DeleteAsync(int id) + { + var group = await _context.Altersgruppen.FirstOrDefaultAsync(x => x.Id == id); + + if (group == null) + { + return null; + } + + _context.Altersgruppen.Remove(group); + _context.SaveChanges(); + + return group; + } + + public async Task> GetAllAsync() + { + var allGroups = await _context.Altersgruppen.ToListAsync(); + + return allGroups; + } + + public async Task GetAsync(int id) + { + return await _context.Altersgruppen.FindAsync(id); + } + + public async Task UpdateAsync(int id, AltersGruppe altersGruppe) + { + var existingGroup = await _context.Altersgruppen.FirstOrDefaultAsync(x => x.Id == id); + + if (existingGroup == null) + { + return null; + } + + existingGroup.Name = altersGruppe.Name; + existingGroup.StartingAge = altersGruppe.StartingAge; + existingGroup.EndingAge = altersGruppe.EndingAge; + + await _context.SaveChangesAsync(); + + return existingGroup; + } + } +} diff --git a/API/Repository/AgeGroup/IAgeGroupService.cs b/API/Repository/AgeGroup/IAgeGroupService.cs new file mode 100644 index 0000000..a350be0 --- /dev/null +++ b/API/Repository/AgeGroup/IAgeGroupService.cs @@ -0,0 +1,14 @@ +using API.Models.Internal.Altersgruppen; + +namespace API.Repository.AgeGroup +{ + public interface IAgeGroupService + { + public Task> GetAllAsync(); + + public Task GetAsync(int id); + public Task CreateAsync(AltersGruppe altersGruppe); + public Task DeleteAsync(int id); + public Task UpdateAsync(int id, AltersGruppe altersGruppe); + } +} diff --git a/API/app.db-shm b/API/app.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..97f3b4165dd46b645afe132f3d97fc658fc91dff GIT binary patch literal 32768 zcmeI)JxT*n5CGtb*~EVnO_NKA*Rb{qp1?~8Vl7s7xr@*%A*jcFa!Un`nc!dwX zfnnb6z8!||05g9%jS{<=gNW%Y>vrbV`}y*&yL?+M?=M~-9&c}+7T2F2&u8;L-p^L+ zD1E`C`QU5&5+GUn|oA1AC`9}~SK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PHVu(5-h&v@)$Z3DguA$Yx#MCVdvVRUor5JE^(w%csjx~=Py z;c&1mMiTIyW-1bmi4mhQ8o~I&1c)zurLQpPctZpUynsaIod$ibTg$HNmP%rz?E8dv z+}+dX?)ltxNq_tOuKvS?6H?_b>m+HFWVhe0PPJV*`Q5SdvFil~y!(!eRW9);Os)TH z%&(tX{qb0_SShR1lK4kM009ILKmY**5I_I{1Q0*~fxHvgAS+Ufshic6hFPiCXr@tL zT~}Z2^VS$ux>;pb=z6`bi)lIH0=qBnSB_k&+-1iF>`(%6fxJ8M954b1AbGg^J0O900IagfB*srAbX05R$*dA(Y5bL$F)*a4$mT9eRO*~Uux7}_#BW+2uTjrBD2So4QYbqPlL#MV$?x7g$CUQ?Ue6Onjg zq1P9CHnqA7ODihmJxP|K!CvucCOl*f4qLHKD`TV@w>w7V*kW<0Az{rRC-F zzqI1rNW4pi{-|b3XWfLvQsfWXX=XOSW;*mtOKQ^>I zI+W;-AI!Q^aZ+UMbC)DNrhU0Njv@0}TVS9$*Iep4X^r=H4R0 z$PqvQ0R#|0009ILKmY**5I`UY0Y@FdlbcU$t#iM4F^4(=w;0=gt(|XhZ*>I4YbE!J zbF*~>qKe=gbp$z_FS;Or00IagfB*srEMb9E9l=D&Y(2r&WbU#xJ|>p!r1zO+M=rZ# zA)}tavF+a_FK4`TPEPlOQAZ%Ep8uqdz^+ztrm0g$FjGkJpw$uBpYPLk1gF>cPsRQk zJGO*>)iQMi5I_I{1Q0*~0R#|0009J+l7Rj9{&XFITXkRgePk*!bAN$bl6q??Q7~5o z5I_I{1Q0*~0R#|0009IZM1j=(1y;#Q`7%eokC?6f{Q~KH0r|^qcS`?$`=}ikaH*e2 z>d)edh5!NxAb3o3;A9cG< zULE<#BUZZ9uO;=ec%mVI00IagfB*srAbUEJX zAf9LlAbTGS@0%tf&4nz94!I} cAb +import { ref } from 'vue'; +import { useDisplay } from 'vuetify'; + +export interface TabItem { + value: string; + label: string; +} + +defineProps<{ + items: TabItem[]; + tabColor?: string; +}>(); + +const display = useDisplay(); +const tab = ref('1'); + + + diff --git a/GUI/src/routes/Home.vue b/GUI/src/routes/Home.vue index ea2e05c..cad6ce7 100644 --- a/GUI/src/routes/Home.vue +++ b/GUI/src/routes/Home.vue @@ -2,9 +2,13 @@ import CarouselItemWithTitle from '@/components/CarouselItemWithTitle.vue'; import HomeEntrie from '@/components/HomeEntrie.vue'; import HomeEntrieWithImagePreset from '@/components/HomeEntrieWithImagePreset.vue'; -import { ref } from 'vue'; +import ResponsiveTabsOrList from '@/components/ResponsiveTabsOrList.vue'; -const tab = ref("1"); +const tabItems = [ + { value: '1', label: 'Nikolausturnier' }, + { value: '2', label: 'Wettkämpfe' }, + { value: '3', label: 'Kinoabende' }, +];