From 43bed5c4095e3434d88d1d1b423325e4fdd8decf Mon Sep 17 00:00:00 2001 From: Allan Kong Date: Mon, 8 Sep 2025 15:34:34 -0600 Subject: [PATCH 01/11] Quality of Life --- .gitignore | 3 +- .../Controllers/TagFrequencyController.php | 2 +- resources/js/Components/Form/TagSelector.vue | 9 ++-- .../js/Components/Resources/FilterBar.vue | 1 + .../Resources/SubmissionGuidelines.vue | 3 ++ .../Pages/Resources/Form/MandatoryFields.vue | 48 +++++++++++++++++-- 6 files changed, 55 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index f74763e0..47f2ed3d 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,5 @@ yarn-error.log /.nova /.vscode /.zed -sail \ No newline at end of file +sail +/prod_backups diff --git a/app/Http/Controllers/TagFrequencyController.php b/app/Http/Controllers/TagFrequencyController.php index d1f098f1..11b37252 100644 --- a/app/Http/Controllers/TagFrequencyController.php +++ b/app/Http/Controllers/TagFrequencyController.php @@ -21,7 +21,7 @@ public function search(string $type, string $query = '') $prefixed_tags = TagFrequency::where('tag', 'like', $escaped.'%') ->where('type', $type) ->orderByDesc('count') - ->limit(30) + ->limit(50) ->get(); return response()->json([ diff --git a/resources/js/Components/Form/TagSelector.vue b/resources/js/Components/Form/TagSelector.vue index f90fed58..73285966 100644 --- a/resources/js/Components/Form/TagSelector.vue +++ b/resources/js/Components/Form/TagSelector.vue @@ -69,7 +69,8 @@ onBeforeUnmount(() => { // computed properties const availableTags = computed(() => { - const query = searchQuery.value.trim().toLowerCase(); + // Use a filtered/sanitized query for searching tags + const filteredQuery = sanitizeTag(searchQuery.value); return allTags.value .filter((tagName) => { @@ -77,10 +78,10 @@ const availableTags = computed(() => { if (selectedTags.value.includes(tagName)) return false; // if no query, show all - if (!query) return true; + if (!filteredQuery) return true; - // filter by query - return tagName.toLowerCase().includes(query); + // filter by filtered query (sanitized) + return tagName.toLowerCase().includes(filteredQuery); }) .map((tagName) => ({ name: tagName, diff --git a/resources/js/Components/Resources/FilterBar.vue b/resources/js/Components/Resources/FilterBar.vue index caa9cdc2..54b18847 100644 --- a/resources/js/Components/Resources/FilterBar.vue +++ b/resources/js/Components/Resources/FilterBar.vue @@ -257,6 +257,7 @@ function resetFilters() { +
  • + Pirated or illegal resources are strictly prohibited. Only submit resources that are legal to share and access. +
  • In the end, we trust you to be reasonable. diff --git a/resources/js/Pages/Resources/Form/MandatoryFields.vue b/resources/js/Pages/Resources/Form/MandatoryFields.vue index b517248d..a8b0edd2 100644 --- a/resources/js/Pages/Resources/Form/MandatoryFields.vue +++ b/resources/js/Pages/Resources/Form/MandatoryFields.vue @@ -6,6 +6,7 @@ import PrimeVueFormError from "@/Components/Form/PrimeVueFormError.vue"; import PictureInput from "vue-picture-input"; import Select from "primevue/select"; import { defineEmits, ref, watch } from "vue"; +import ConfirmationModal from '@/Components/ConfirmationModal.vue'; import { platformsObject, pricingsObject, @@ -25,6 +26,7 @@ const props = defineProps({ const emit = defineEmits(["change", "next"]); const errors = ref({}); +const showDescriptionHelp = ref(false); function onImageChange(event) { const file = event.target.files[0]; @@ -127,6 +129,7 @@ watch(

    - +
    + + +