diff --git a/Kiss.Bff/Beheer/Data/BeheerDbContext.cs b/Kiss.Bff/Beheer/Data/BeheerDbContext.cs index 61954e362..e6f2c8ce5 100644 --- a/Kiss.Bff/Beheer/Data/BeheerDbContext.cs +++ b/Kiss.Bff/Beheer/Data/BeheerDbContext.cs @@ -44,6 +44,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) modelBuilder.Entity(l => { l.HasIndex(x => x.Vraag); + l.HasIndex(x => x.VerantwoordelijkeAfdeling); }); modelBuilder.Entity() diff --git a/Kiss.Bff/Beheer/Data/Migrations/20230830131130_CmDetailsVerantwoordelijkeAfdeling.Designer.cs b/Kiss.Bff/Beheer/Data/Migrations/20230830131130_CmDetailsVerantwoordelijkeAfdeling.Designer.cs new file mode 100644 index 000000000..3bdd9fa7a --- /dev/null +++ b/Kiss.Bff/Beheer/Data/Migrations/20230830131130_CmDetailsVerantwoordelijkeAfdeling.Designer.cs @@ -0,0 +1,319 @@ +// +using System; +using Kiss.Bff.Beheer.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Kiss.Bff.NieuwsEnWerkinstructies.Migrations +{ + [DbContext(typeof(BeheerDbContext))] + [Migration("20230830131130_CmDetailsVerantwoordelijkeAfdeling")] + partial class CmDetailsVerantwoordelijkeAfdeling + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.16") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("BerichtSkill", b => + { + b.Property("BerichtenId") + .HasColumnType("integer"); + + b.Property("SkillsId") + .HasColumnType("integer"); + + b.HasKey("BerichtenId", "SkillsId"); + + b.HasIndex("SkillsId"); + + b.ToTable("BerichtSkill"); + }); + + modelBuilder.Entity("Kiss.Bff.Beheer.Gespreksresultaten.Data.Entities.Gespreksresultaat", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DateCreated") + .HasColumnType("timestamp with time zone"); + + b.Property("DateUpdated") + .HasColumnType("timestamp with time zone"); + + b.Property("Definitie") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Definitie") + .IsUnique(); + + b.ToTable("Gespreksresultaten"); + }); + + modelBuilder.Entity("Kiss.Bff.Beheer.Links.Data.Entities.Link", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Categorie") + .IsRequired() + .HasColumnType("text"); + + b.Property("DateCreated") + .HasColumnType("timestamp with time zone"); + + b.Property("DateUpdated") + .HasColumnType("timestamp with time zone"); + + b.Property("Titel") + .IsRequired() + .HasColumnType("text"); + + b.Property("Url") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Links"); + }); + + modelBuilder.Entity("Kiss.Bff.Beheer.Verwerking.VerwerkingsLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApiEndpoint") + .IsRequired() + .HasColumnType("text"); + + b.Property("InsertedAt") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("NOW()"); + + b.Property("Method") + .IsRequired() + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("VerwerkingsLogs"); + }); + + modelBuilder.Entity("Kiss.Bff.NieuwsEnWerkinstructies.Data.Entities.Bericht", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateCreated") + .HasColumnType("timestamp with time zone"); + + b.Property("DateUpdated") + .HasColumnType("timestamp with time zone"); + + b.Property("Inhoud") + .IsRequired() + .HasColumnType("text"); + + b.Property("IsBelangrijk") + .HasColumnType("boolean"); + + b.Property("PublicatieDatum") + .HasColumnType("timestamp with time zone"); + + b.Property("PublicatieEinddatum") + .HasColumnType("timestamp with time zone"); + + b.Property("Titel") + .IsRequired() + .HasColumnType("text"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("character varying(200)"); + + b.HasKey("Id"); + + b.HasIndex("Type"); + + b.ToTable("Berichten"); + }); + + modelBuilder.Entity("Kiss.Bff.NieuwsEnWerkinstructies.Data.Entities.BerichtGelezen", b => + { + b.Property("UserId") + .HasColumnType("text"); + + b.Property("BerichtId") + .HasColumnType("integer"); + + b.Property("GelezenOp") + .HasColumnType("timestamp with time zone"); + + b.HasKey("UserId", "BerichtId"); + + b.HasIndex("BerichtId"); + + b.ToTable("Gelezen"); + }); + + modelBuilder.Entity("Kiss.Bff.NieuwsEnWerkinstructies.Data.Entities.Skill", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateCreated") + .HasColumnType("timestamp with time zone"); + + b.Property("DateUpdated") + .HasColumnType("timestamp with time zone"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("Naam") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Skills"); + }); + + modelBuilder.Entity("Kiss.Bff.ZaakGerichtWerken.Contactmomenten.ContactmomentDetails", b => + { + b.Property("Id") + .HasColumnType("text"); + + b.Property("Einddatum") + .HasColumnType("timestamp with time zone"); + + b.Property("EmailadresKcm") + .HasColumnType("text"); + + b.Property("Gespreksresultaat") + .HasColumnType("text"); + + b.Property("SpecifiekeVraag") + .HasColumnType("text"); + + b.Property("Startdatum") + .HasColumnType("timestamp with time zone"); + + b.Property("VerantwoordelijkeAfdeling") + .HasColumnType("text"); + + b.Property("Vraag") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("VerantwoordelijkeAfdeling"); + + b.HasIndex("Vraag"); + + b.ToTable("ContactMomentDetails"); + }); + + modelBuilder.Entity("Kiss.Bff.ZaakGerichtWerken.Contactverzoeken.ContactVerzoekVragenSet", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AfdelingId") + .HasColumnType("text"); + + b.Property("JsonVragen") + .HasColumnType("json"); + + b.Property("Naam") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("ContactVerzoekVragenSets"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FriendlyName") + .HasColumnType("text"); + + b.Property("Xml") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("DataProtectionKeys"); + }); + + modelBuilder.Entity("BerichtSkill", b => + { + b.HasOne("Kiss.Bff.NieuwsEnWerkinstructies.Data.Entities.Bericht", null) + .WithMany() + .HasForeignKey("BerichtenId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kiss.Bff.NieuwsEnWerkinstructies.Data.Entities.Skill", null) + .WithMany() + .HasForeignKey("SkillsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Kiss.Bff.NieuwsEnWerkinstructies.Data.Entities.BerichtGelezen", b => + { + b.HasOne("Kiss.Bff.NieuwsEnWerkinstructies.Data.Entities.Bericht", null) + .WithMany("Gelezen") + .HasForeignKey("BerichtId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Kiss.Bff.NieuwsEnWerkinstructies.Data.Entities.Bericht", b => + { + b.Navigation("Gelezen"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Kiss.Bff/Beheer/Data/Migrations/20230830131130_CmDetailsVerantwoordelijkeAfdeling.cs b/Kiss.Bff/Beheer/Data/Migrations/20230830131130_CmDetailsVerantwoordelijkeAfdeling.cs new file mode 100644 index 000000000..bc0612a14 --- /dev/null +++ b/Kiss.Bff/Beheer/Data/Migrations/20230830131130_CmDetailsVerantwoordelijkeAfdeling.cs @@ -0,0 +1,34 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Kiss.Bff.NieuwsEnWerkinstructies.Migrations +{ + public partial class CmDetailsVerantwoordelijkeAfdeling : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "VerantwoordelijkeAfdeling", + table: "ContactMomentDetails", + type: "text", + nullable: true); + + migrationBuilder.CreateIndex( + name: "IX_ContactMomentDetails_VerantwoordelijkeAfdeling", + table: "ContactMomentDetails", + column: "VerantwoordelijkeAfdeling"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_ContactMomentDetails_VerantwoordelijkeAfdeling", + table: "ContactMomentDetails"); + + migrationBuilder.DropColumn( + name: "VerantwoordelijkeAfdeling", + table: "ContactMomentDetails"); + } + } +} diff --git a/Kiss.Bff/Beheer/Data/Migrations/BeheerDbContextModelSnapshot.cs b/Kiss.Bff/Beheer/Data/Migrations/BeheerDbContextModelSnapshot.cs index 8a21b00bf..ee6e0463f 100644 --- a/Kiss.Bff/Beheer/Data/Migrations/BeheerDbContextModelSnapshot.cs +++ b/Kiss.Bff/Beheer/Data/Migrations/BeheerDbContextModelSnapshot.cs @@ -226,11 +226,16 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("Startdatum") .HasColumnType("timestamp with time zone"); + b.Property("VerantwoordelijkeAfdeling") + .HasColumnType("text"); + b.Property("Vraag") .HasColumnType("text"); b.HasKey("Id"); + b.HasIndex("VerantwoordelijkeAfdeling"); + b.HasIndex("Vraag"); b.ToTable("ContactMomentDetails"); diff --git a/Kiss.Bff/ZaakGerichtWerken/Contactmomenten/ContactmomentDetails.cs b/Kiss.Bff/ZaakGerichtWerken/Contactmomenten/ContactmomentDetails.cs index 2ac89cc90..6d1072de2 100644 --- a/Kiss.Bff/ZaakGerichtWerken/Contactmomenten/ContactmomentDetails.cs +++ b/Kiss.Bff/ZaakGerichtWerken/Contactmomenten/ContactmomentDetails.cs @@ -14,5 +14,6 @@ public class ContactmomentDetails public string? Vraag { get; set; } public string? SpecifiekeVraag { get; set; } public string? EmailadresKcm { get; set; } + public string? VerantwoordelijkeAfdeling { get; set; } } } diff --git a/README.md b/README.md index 4bd3f99da..02d393152 100644 --- a/README.md +++ b/README.md @@ -47,8 +47,9 @@ KISS uses Elastic search. Building a search query is composed of two steps: This is why both Enterprise Search and Elasticsearch need to be accessed by KISS. Follow these steps to connect your local development environment to an Elastic search instance hosted in Azure/kubernetes. +(Note: before you follow these steps make sure you have the role "Co-Administrator" with the corresponding subscription. if you dont, search in the azure subsription and add in the tab 'Access Control', your user with the role 'Co-Administator'. this can be found under the sub tab 'classic administrator'. otherwise redo the steps below) 1. Install the azure cli -1. `az login (once)` +1. `az login` (once, and make sure that the account you're logging in with, has a the correct role with the corresponding subscription) 1. `az account set --subscription [...your subscriptionid...]` (once) 1. `az aks get-credentials --resource-group [for example: KISS_Kubernetes_Dev] --name [for example: KISS_Kubernetes_Dev]` 1. `kubectl config set-context --current --namespace=[for example: kiss-namespace]` @@ -66,4 +67,4 @@ To resolve this, follow these steps: 1. Right-click on kiss.bff and select 'Set as StartUp Project'. Now, you should be able to add new migrations. The kiss.bff project contains the migrations, and setting this project as your startup project should resolve the above error. -Make sure to switch back to the original startup project configuration after adding the migrations, if required for your development process. \ No newline at end of file +Make sure to switch back to the original startup project configuration after adding the migrations, if required for your development process. diff --git a/helm/kiss-frontend/kiss.prod.yaml b/helm/kiss-frontend/kiss.prod.yaml index a8f969391..838b92050 100644 --- a/helm/kiss-frontend/kiss.prod.yaml +++ b/helm/kiss-frontend/kiss.prod.yaml @@ -4,7 +4,7 @@ ingress: enabled: true className: "nginx" annotations: - nginx.ingress.kubernetes.io/proxy-buffer-size: 16k #ivm azure open id connect > nginx default buffer 8k te laag + nginx.ingress.kubernetes.io/proxy-buffer-size: 32k #ivm azure open id connect > nginx default buffer 8k te laag hosts: - host: prod.kiss-demo.nl paths: diff --git a/helm/kiss-frontend/kiss.template.yaml b/helm/kiss-frontend/kiss.template.yaml index aa4a67fa8..7da6d4b87 100644 --- a/helm/kiss-frontend/kiss.template.yaml +++ b/helm/kiss-frontend/kiss.template.yaml @@ -6,7 +6,7 @@ ingress: enabled: true className: "nginx" annotations: - nginx.ingress.kubernetes.io/proxy-buffer-size: 16k #ivm azure open id connect > nginx default buffer 8k te laag + nginx.ingress.kubernetes.io/proxy-buffer-size: 32k #ivm azure open id connect > nginx default buffer 8k te laag hosts: - host: dev.kiss-demo.nl paths: diff --git a/package-lock.json b/package-lock.json index 35b8e39f7..15fafdd3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,6 +39,7 @@ "@vitejs/plugin-basic-ssl": "^1.0.1", "@vitejs/plugin-vue": "^4.2.3", "@vitest/coverage-c8": "^0.32.2", + "@vitest/coverage-v8": "^0.34.3", "@vue/eslint-config-typescript": "^11.0.3", "@vue/test-utils": "^2.4.1", "@vue/tsconfig": "^0.4.0", @@ -1626,6 +1627,31 @@ "vitest": ">=0.30.0 <1" } }, + "node_modules/@vitest/coverage-v8": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-0.34.3.tgz", + "integrity": "sha512-bNjP0RHe8UxdklCigZlk6FVCNbOiqVjWnpZJ1zKixpvb7YHSaZiN/w+mzpvXIoqyxyePzKC+L+G1oj7SB20PJw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@bcoe/v8-coverage": "^0.2.3", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.1.5", + "magic-string": "^0.30.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": ">=0.32.0 <1" + } + }, "node_modules/@vitest/expect": { "version": "0.33.0", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", @@ -4483,17 +4509,31 @@ } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/istanbul-reports": { @@ -4745,15 +4785,15 @@ } }, "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6250,6 +6290,15 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -8468,7 +8517,7 @@ "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", + "semver": "^7.5.4", "tsutils": "^3.21.0" } }, @@ -8523,7 +8572,7 @@ "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", + "semver": "^7.5.4", "tsutils": "^3.21.0" } }, @@ -8540,7 +8589,7 @@ "@typescript-eslint/types": "5.60.1", "@typescript-eslint/typescript-estree": "5.60.1", "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { @@ -8592,6 +8641,25 @@ "std-env": "^3.3.3" } }, + "@vitest/coverage-v8": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-0.34.3.tgz", + "integrity": "sha512-bNjP0RHe8UxdklCigZlk6FVCNbOiqVjWnpZJ1zKixpvb7YHSaZiN/w+mzpvXIoqyxyePzKC+L+G1oj7SB20PJw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.1", + "@bcoe/v8-coverage": "^0.2.3", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.1.5", + "magic-string": "^0.30.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.1.0" + } + }, "@vitest/expect": { "version": "0.33.0", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", @@ -9665,7 +9733,7 @@ "@one-ini/wasm": "0.1.1", "commander": "^10.0.0", "minimatch": "9.0.1", - "semver": "^7.5.3" + "semver": "^7.5.4" }, "dependencies": { "brace-expansion": { @@ -10663,16 +10731,27 @@ "dev": true }, "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "requires": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" } }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, "istanbul-reports": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", @@ -10867,12 +10946,12 @@ } }, "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "requires": { - "semver": "^6.0.0" + "semver": "^7.5.4" } }, "map-obj": { @@ -11132,7 +11211,7 @@ "requires": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", - "semver": "^7.3.4", + "semver": "^7.5.4", "validate-npm-package-license": "^3.0.1" } }, @@ -11876,6 +11955,12 @@ "is-fullwidth-code-point": "^3.0.0" } }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, "source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -12090,7 +12175,7 @@ "integrity": "sha512-DVJqyX2KvMCn9U0+keL12r7xlsH26K4Vg8NrIZuq5MoF7g82DpMp326Om4E0Q+Il1o+bTHuUyejf2XAI0iD04Q==", "dev": true, "requires": { - "semver": "^7.3.5", + "semver": "^7.5.4", "stylelint-config-html": ">=1.0.0", "stylelint-config-recommended": ">=6.0.0" } @@ -12541,7 +12626,7 @@ "espree": "^9.3.1", "esquery": "^1.4.0", "lodash": "^4.17.21", - "semver": "^7.3.6" + "semver": "^7.5.4" }, "dependencies": { "eslint-scope": { @@ -12588,7 +12673,7 @@ "requires": { "@vue/language-core": "1.8.8", "@vue/typescript": "1.8.8", - "semver": "^7.3.8" + "semver": "^7.5.4" } }, "w3c-xmlserializer": { diff --git a/package.json b/package.json index 7d4ec74a2..9f59d92e0 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "@vitejs/plugin-basic-ssl": "^1.0.1", "@vitejs/plugin-vue": "^4.2.3", "@vitest/coverage-c8": "^0.32.2", + "@vitest/coverage-v8": "^0.34.3", "@vue/eslint-config-typescript": "^11.0.3", "@vue/test-utils": "^2.4.1", "@vue/tsconfig": "^0.4.0", @@ -68,4 +69,4 @@ "overrides": { "semver": "^7.5.4" } -} \ No newline at end of file +} diff --git a/src/App.vue b/src/App.vue index a8fb13c82..1cc467d41 100644 --- a/src/App.vue +++ b/src/App.vue @@ -13,7 +13,13 @@
- + + +
@@ -26,7 +32,7 @@ import TheToastSection from "@/components/TheToastSection.vue"; import TheSidebar from "./layout/TheSidebar.vue"; import TheHeader from "./layout/TheHeader.vue"; import { SwitchableStoreProvider } from "./stores/switchable-store"; - +import BackLinkProvider from "./components/BackLinkProvider.vue"; const contactmomentStore = useContactmomentStore(); const route = useRoute(); diff --git a/src/assets/design-tokens.scss b/src/assets/design-tokens.scss index 9c6e1cf57..e8e43b219 100644 --- a/src/assets/design-tokens.scss +++ b/src/assets/design-tokens.scss @@ -5,17 +5,20 @@ --color-secondary: #eceff1; --color-tertiary: #778da9; --color-headings: #1b263b; - --color-accent: #258839; - --color-accent-hover: #89cf5e; + --color-accent: #acc8e5; + --color-accent-text: var(--color-headings); + --color-accent-hover: #cfe4f7; --color-accent-hover-text: var(--color-headings); - --color-error: #c82d2d; - --color-error-hover: #f47171; + --color-error: #ff8585; + --color-error-hover: #ffb8b8; --color-error-hover-text: var(--color-headings); --color-warning: orange; + --color-success: #89cf5e; --color-category-default: hsl(184deg 54% 70%); --color-category-website: hsl(285deg 56% 83%); --color-white: #fff; --color-white-hover: #e4e8ee; + --color-black: var(--color-headings); --sidebar-color-1: var(--color-headings); --sidebar-color-2: var(--color-primary); --color-grey: #999; @@ -36,27 +39,27 @@ --spacing-extralarge: 6rem; --header-height: 6rem; --text-margin: 1.5rem; - --line-height-default: 1.5; + --line-height-default: 1.5rem; // other --radius-default: 0.4rem; --radius-large: 1.5rem; --height-body: 100vh; --shadow-default: 0 0 4.5714px 0 rgb(0 0 0 / 20%); - --outline-color: rgb(16 16 16); + --outline-color: var(--color-black); --outline-width: 1px; --outline-style: auto; - --outline-offset: 1px; + --outline-offset: 3px; } .kiss-theme { --font-family: "Open Sans", sans-serif; --utrecht-paragraph-font-family: var(--font-family); - --utrecht-paragraph-color: black; + --utrecht-paragraph-color: var(--color-black); --utrecht-heading-font-family: var(--font-family); --utrecht-document-font-family: var(--font-family); --utrecht-document-font-size: 1rem; - --utrecht-document-color: black; + --utrecht-document-color: var(--color-black); --utrecht-heading-color: var(--color-headings); --utrecht-paragraph-font-size: 1rem; --utrecht-heading-font-weight: 600; @@ -122,8 +125,8 @@ --utrecht-form-input-border-color: var(--color-primary); --utrecht-form-input-border-radius: var(--radius-default); --utrecht-form-input-border-width: 1px; - --utrecht-form-input-color: black; - --utrecht-form-input-font-size: 1.125rem; + --utrecht-form-input-color: var(--color-black); + --utrecht-form-input-font-size: 1rem; --utrecht-form-input-padding-block-end: var(--spacing-small); --utrecht-form-input-padding-block-start: var(--spacing-small); --utrecht-form-input-padding-inline-end: var(--spacing-small); @@ -153,10 +156,6 @@ --utrecht-primary-action-focus-outline-style: none; } - .utrecht-button:not(.utrecht-button--subtle) { - box-shadow: var(--shadow-default); - } - .utrecht-button:active:not(:disabled) { box-shadow: inset 0 4px 4px rgb(0 0 0 / 15%) !important; scale: 98%; diff --git a/src/assets/icons/exit.svg b/src/assets/icons/exit.svg new file mode 100644 index 000000000..cc6ec307a --- /dev/null +++ b/src/assets/icons/exit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/icons.scss b/src/assets/icons/icons.scss index fa93aeb7d..f2abc01c0 100644 --- a/src/assets/icons/icons.scss +++ b/src/assets/icons/icons.scss @@ -1,19 +1,23 @@ .icon-only { - font-weight: bold; - display: flex; - align-items: center; - justify-content: center; - border-radius: 50%; - --utrecht-button-inline-size: var(--spacing-large); - - aspect-ratio: 1; - --utrecht-button-padding-inline-start: 0; --utrecht-button-padding-inline-end: 0; --utrecht-button-padding-block-start: 0; --utrecht-button-padding-block-end: 0; --utrecht-button-min-inline-size: var(--spacing-default); + --utrecht-button-active-color: var(--color-black); + --utrecht-button-active-border-color: currentcolor; + --utrecht-button-hover-color: var(--color-black); + --utrecht-button-hover-border-color: currentcolor; + --utrecht-button-focus-color: var(--color-black); + --utrecht-button-focus-border-color: transparent; + + aspect-ratio: 1; + font-weight: bold; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; } .icon-before, @@ -40,7 +44,9 @@ .icon-before.chevron-down::before, .icon-after.chevron-down::after, .icon-before.chevron-right::before, -.icon-after.chevron-right::after { +.icon-after.chevron-right::after, +.icon-before.chevron-left::before, +.icon-after.chevron-left::after { min-block-size: 0.6rem; mask-image: url("@/assets/icons/chevron-down.svg"); } @@ -50,6 +56,11 @@ rotate: (-90deg); } +.icon-before.chevron-left::before, +.icon-after.chevron-left::after { + rotate: (90deg); +} + .icon-before.circle-xmark::before, .icon-after.circle-xmark::after { mask-image: url("@/assets/icons/circle-xmark.svg"); @@ -111,3 +122,32 @@ .icon-after.loupe::after { mask-image: url("@/assets/icons/loupe.svg"); } + +.icon-before.sort-descending::before, +.icon-after.sort-descending::after, +.icon-before.sort-ascending::before, +.icon-after.sort-ascending::after { + mask-image: url("@/assets/icons/sort.svg"); + min-inline-size: 0.5rem; + min-block-size: 0.5rem; +} + +.icon-before.sort-descending::before, +.icon-before.sort-ascending::before { + margin-inline-end: 0.5ch; +} + +.icon-after.sort-descending::after, +.icon-after.sort-ascending::after { + margin-inline-start: 0.5ch; +} + +.icon-before.sort-ascending::before, +.icon-after.sort-ascending::after { + rotate: 180deg; +} + +.icon-before.exit::before, +.icon-after.exit::after { + mask-image: url("@/assets/icons/exit.svg"); +} diff --git a/src/assets/icons/sort.svg b/src/assets/icons/sort.svg new file mode 100644 index 000000000..b4e1c98fb --- /dev/null +++ b/src/assets/icons/sort.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/main.scss b/src/assets/main.scss index 579012ce2..e8c3c597e 100644 --- a/src/assets/main.scss +++ b/src/assets/main.scss @@ -1,5 +1,17 @@ @import "./icons/icons"; +* { + outline-offset: -2px; + outline-color: var(--utrecht-focus-outline-color); + transition: outline-offset 200ms; + outline-width: 0; + + &:focus-visible { + outline-offset: var(--utrecht-focus-outline-offset); + outline-width: var(--utrecht-focus-outline-width); + } +} + html, body { height: 100%; @@ -91,8 +103,8 @@ h2 { label:first-child > select, > label:first-child + input, label:first-child + select { - border-start-start-radius: var(--radius-large); - border-end-start-radius: var(--radius-large); + border-start-start-radius: var(--radius-default); + border-end-start-radius: var(--radius-default); border-inline-start: var(--border-style); } @@ -101,8 +113,9 @@ h2 { } > :last-child { - border-radius: 0 var(--radius-large) var(--radius-large) 0; + border-radius: 0 var(--radius-default) var(--radius-default) 0; border-inline-end: var(--border-style); + display: flex; } button { @@ -116,7 +129,9 @@ h2 { input, select { - padding: var(--spacing-small); + padding: var(--utrecht-form-input-padding-block-start); + font-size: var(--utrecht-form-input-font-size); + line-height: var(--utrecht-button-line-height); } label { @@ -138,7 +153,8 @@ h2 { padding-inline-start: var(--spacing-default); &::placeholder { - color: black; + color: var(--color-primary); + font-style: italic; } } } @@ -205,31 +221,66 @@ details { gap: var(--utrecht-button-icon-gap); cursor: default; + + &:focus-visible { + outline-style: auto; + } } &[open] > summary::after { transform: rotate(180deg); } + + summary + * { + margin-block-start: 1px; + } } /* TABLES */ -table.overview { +table.overview, +ul.overview { + --column-padding: var(--spacing-default); + width: 100%; - thead { - color: var(--color-white); - background-color: var(--color-tertiary); + thead, + .header-row { + color: var(--color-accent-text); + background: var(--color-accent); + font-weight: 600; } - tr { - border: 1px solid var(--color-tertiary); + > tbody > tr, + > li:not(:first-child) { + border-bottom: 1px solid var(--color-accent); + } + thead > tr > th { + vertical-align: middle; + } + + th, + td, + dt, + dd, + summary > *, + .header-row > * { + padding-block: var(--spacing-small); + padding-inline: var(--column-padding); + } + + li:nth-of-type(odd) summary, + li:nth-of-type(odd) details, + tbody > tr:nth-of-type(even) { + background-color: var(--color-secondary); + } + + tr { th, td { text-align: left; - padding-inline: var(--spacing-default); &:not(.wrap) { white-space: nowrap; @@ -237,12 +288,10 @@ table.overview { } td { - padding-block: var(--spacing-default); font-weight: normal; } th { - padding-block: var(--spacing-small); font-weight: 600; } @@ -260,10 +309,20 @@ table.overview { a, button { - color: var(--color-tertiary); + color: inherit; } } +th[aria-sort="descending"] { + @extend .icon-after; + @extend .sort-descending; +} + +th[aria-sort="ascending"] { + @extend .icon-after; + @extend .sort-ascending; +} + tr.row-link { position: relative; @@ -411,3 +470,8 @@ dt { margin-block-start: var(--spacing-small); } } + +// TABS ON DETAIL PAGE +main > h1 + [role="tablist"] { + margin-block-start: var(--spacing-small); +} diff --git a/src/assets/reset.css b/src/assets/reset.css index 98c79567a..b9125338b 100644 --- a/src/assets/reset.css +++ b/src/assets/reset.css @@ -78,7 +78,6 @@ video { margin: 0; padding: 0; border: 0; - outline: 0; vertical-align: baseline; background: transparent; box-sizing: border-box; diff --git a/src/components/BackLink.vue b/src/components/BackLink.vue new file mode 100644 index 000000000..8f283da9d --- /dev/null +++ b/src/components/BackLink.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/src/components/BackLinkProvider.vue b/src/components/BackLinkProvider.vue new file mode 100644 index 000000000..b5c60dfbf --- /dev/null +++ b/src/components/BackLinkProvider.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/ExpandableTableList.vue b/src/components/ExpandableTableList.vue index 04147dd80..e83b64679 100644 --- a/src/components/ExpandableTableList.vue +++ b/src/components/ExpandableTableList.vue @@ -1,20 +1,20 @@ diff --git a/src/components/SearchCombobox.vue b/src/components/SearchCombobox.vue index 03551a718..c39e559a1 100644 --- a/src/components/SearchCombobox.vue +++ b/src/components/SearchCombobox.vue @@ -255,22 +255,26 @@ function scrollIntoView() { diff --git a/src/features/contactmoment/ContactmomentStarter.vue b/src/features/contactmoment/ContactmomentStarter.vue index b50e6e659..3a4e8e8c5 100644 --- a/src/features/contactmoment/ContactmomentStarter.vue +++ b/src/features/contactmoment/ContactmomentStarter.vue @@ -54,8 +54,8 @@ const onStartContactMoment = async () => { .start-button { --utrecht-button-min-inline-size: 15rem; --utrecht-button-background-color: var(--color-accent); - --utrecht-button-color: var(--color-white); + --utrecht-button-color: var(--color-accent-text); --utrecht-button-hover-background-color: var(--color-accent-hover); - --utrecht-button-hover-color: black; + --utrecht-button-hover-color: var(--color-black); } diff --git a/src/features/contactmoment/ContactmomentSwitcher.vue b/src/features/contactmoment/ContactmomentSwitcher.vue index 9d69d0347..535a1db5e 100644 --- a/src/features/contactmoment/ContactmomentSwitcher.vue +++ b/src/features/contactmoment/ContactmomentSwitcher.vue @@ -73,7 +73,7 @@ const moments = computed(() => closeDetails(); }, }; - }) + }), ); const detailsEl = ref(); @@ -99,16 +99,16 @@ details { menu { position: absolute; z-index: 1; - margin-block-start: var(--spacing-small); padding-inline: var(--spacing-default); padding-block-end: var(--spacing-default); background: var(--color-white); inline-size: 100%; border-radius: var(--radius-default); box-shadow: var(--shadow-default); + justify-content: flex-start; li { - border-block-end: 1px solid black; + border-block-end: 1px solid var(--color-black); padding-block: var(--spacing-default); } @@ -133,12 +133,11 @@ menu { } .current-moment { - color: var(--color-accent); font-style: italic; } .name { - font-weight: bold; + font-weight: 400; } .contact, diff --git a/src/features/contactmoment/ContactmomentVraag.vue b/src/features/contactmoment/ContactmomentVraag.vue new file mode 100644 index 000000000..69b7016bd --- /dev/null +++ b/src/features/contactmoment/ContactmomentVraag.vue @@ -0,0 +1,71 @@ + + + diff --git a/src/features/contactmoment/ContactmomentenOverzicht.vue b/src/features/contactmoment/ContactmomentenOverzicht.vue index 1cf2e8255..816679c54 100644 --- a/src/features/contactmoment/ContactmomentenOverzicht.vue +++ b/src/features/contactmoment/ContactmomentenOverzicht.vue @@ -2,10 +2,11 @@
-
@@ -402,7 +391,7 @@ diff --git a/src/views/BedrijfDetailView.vue b/src/views/BedrijfDetailView.vue index be541dc61..5ebb14f5e 100644 --- a/src/views/BedrijfDetailView.vue +++ b/src/views/BedrijfDetailView.vue @@ -1,78 +1,66 @@ - - diff --git a/src/views/Beheer/contactverzoek-formulieren/ContactverzoekFormulierBeheer.vue b/src/views/Beheer/contactverzoek-formulieren/ContactverzoekFormulierBeheer.vue index 2fdbf48d2..33539687c 100644 --- a/src/views/Beheer/contactverzoek-formulieren/ContactverzoekFormulierBeheer.vue +++ b/src/views/Beheer/contactverzoek-formulieren/ContactverzoekFormulierBeheer.vue @@ -60,7 +60,8 @@
Vraag {{ index + 1 }} - {{ setVraagTypeLabel(vraag.type) }}Vraag {{ index + 1 }} - + {{ setVraagTypeDescription(vraag.questiontype) }}
@@ -87,7 +88,7 @@ class="utrecht-textbox utrecht-textbox--html-input" required type="text" - v-model="vraag.label" + v-model="vraag.description" placeholder="Vul hier een label voor de vraag in" />
@@ -257,8 +258,8 @@ const afdelingen = ref([ type Vraag = { id: number; - type: string; - label: string; + questiontype: string; + description: string; }; type InputVraag = Vraag; @@ -293,11 +294,14 @@ const selectedVraag = ref("Vraag toevoegen"); const submit = async () => { loading.value = true; + const generatedSchema = createJsonSchema(vragen.value); + console.log(JSON.stringify(generatedSchema, null, 2)); + try { const payload = { Naam: title.value, AfdelingId: selectedAfdeling.value, - JsonVragen: JSON.stringify(vragen.value), + JsonVragen: JSON.stringify(generatedSchema, null, 2), }; let result; @@ -337,14 +341,52 @@ onMounted(() => { load(); }); +function toSchemaFromVraag( + vraag: InputVraag | TextareaVraag | DropdownVraag | CheckboxVraag, +): Record { + const baseSchema = { + description: vraag.description, + questiontype: vraag.questiontype, + additionalProperties: false, + type: "string", + }; + + if (vraag.questiontype === "dropdown" || vraag.questiontype === "checkbox") { + const optionsVraag = vraag as DropdownVraag | CheckboxVraag; + return { + ...baseSchema, + items: { type: "array", options: optionsVraag.options }, + }; + } else { + return baseSchema; + } +} + +function createJsonSchema(vragen: Vraag[]): Record { + const schema = { + $schema: "https://json-schema.org/draft-04/schema", + title: "ContactVerzoekVragenSets", + references: {}, + type: "object", + additionalProperties: false, + properties: {}, + }; + + vragen.forEach((vraag) => { + const descriptionWithoutSpaces = vraag.description.replace(/\s/g, ""); + schema.properties[descriptionWithoutSpaces] = toSchemaFromVraag(vraag); + }); + return schema; +} + let vraagCounter = 0; const handleVraagChange = () => { vraagCounter++; const nieuweVraag: Vraag = { id: vraagCounter, - type: selectedVraag.value, - label: "", + questiontype: selectedVraag.value, + description: "", ...(selectedVraag.value === "dropdown" || selectedVraag.value === "checkbox" ? { options: ["", ""] } : {}), @@ -367,16 +409,16 @@ const removeVraag = (id: number) => { }; const isInputVraag = (question: Vraag): question is InputVraag => - question.type === "input"; + question.questiontype === "input"; const isTextareaVraag = (question: Vraag): question is TextareaVraag => - question.type === "textarea"; + question.questiontype === "textarea"; const isCheckboxVraag = (question: Vraag): question is CheckboxVraag => - question.type === "checkbox" && "options" in question; + question.questiontype === "checkbox" && "options" in question; const isDropdownVraag = (question: Vraag): question is DropdownVraag => - question.type === "dropdown" && "options" in question; + question.questiontype === "dropdown" && "options" in question; const removeOption = (vraagId: number, optionIndex: number) => { const vraag = vragen.value.find((v) => v.id === vraagId); @@ -411,8 +453,7 @@ async function load() { title.value = data.naam; selectedAfdeling.value = data.afdelingId; - vragen.value = JSON.parse(data.jsonVragen); - vraagCounter = vragen.value.length; + vragen.value = ToSchemaFromVragen(JSON.parse(data.jsonVragen)); } } catch { handleError(); @@ -421,6 +462,49 @@ async function load() { } } +function ToSchemaFromVragen(schema: any): Vraag[] { + const results = []; + + if (schema && schema.properties) { + let idCounter = 1; + + for (const key in schema.properties) { + const property = schema.properties[key]; + const questionType = property.questiontype; + + switch (questionType) { + case "dropdown": + results.push({ + id: idCounter, + questiontype: questionType, + description: property.description, + options: (property.items && property.items.options) || [], + } as DropdownVraag); + break; + + case "checkbox": + results.push({ + id: idCounter, + questiontype: questionType, + description: property.description, + options: (property.items && property.items.options) || [], + } as CheckboxVraag); + break; + + default: + results.push({ + id: idCounter, + questiontype: questionType, + description: property.description, + } as Vraag); + } + idCounter++; + } + } + + return results; +} + const handleError = () => { toast({ text: "Er is een fout opgetreden. Probeer het later opnieuw.", @@ -435,7 +519,7 @@ const handleSuccess = () => { router.push("/Beheer/Contactverzoekformulieren/"); }; -const setVraagTypeLabel = (type: string) => { +const setVraagTypeDescription = (type: string) => { switch (type) { case "input": return "Open vraag kort"; @@ -499,6 +583,7 @@ menu { .question-container-button { width: 65%; + margin-top: 0.5rem; } .options-button-wrapper { diff --git a/src/views/ContactDetailView.vue b/src/views/ContactDetailView.vue index dc7036a1f..0d5615958 100644 --- a/src/views/ContactDetailView.vue +++ b/src/views/ContactDetailView.vue @@ -1,62 +1,52 @@ + - - + + - - diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 7c050eb99..36cfae70b 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -29,13 +29,13 @@ - @@ -57,13 +57,10 @@ v-model="userStore.preferences.skills" /> -
  • +