Add tag filtering for tag autocomplete

This commit is contained in:
Gaetan Craig-Riou
2025-10-01 11:27:05 +10:00
parent 6d7908e1f8
commit 3cffc5538a
2 changed files with 40 additions and 4 deletions

View File

@@ -1,4 +1,9 @@
%div{ "data-controller": "autocomplete", "data-autocomplete-url-value": autocomplete_url }
= render tag_list_input_component.new(name: , tags: , placeholder: , aria_label: , only_one: , input_field_data_options: {"data-autocomplete-target": "input"}) do
.autocomplete
%ul.suggestion-list{ "data-autocomplete-target": "results" }
%div{ "data-controller": "variant-tag-list-input", "data-variant-tag-list-input-url-value": autocomplete_url }
= render tag_list_input_component.new(name:,
tags:,
placeholder:,
aria_label:,
only_one:,
input_field_data_options: { "data-variant-tag-list-input-target": "input" },
hidden_field_data_options: { "data-variant-tag-list-input-target": "tags" }) do
%ul.suggestion-list{ "data-variant-tag-list-input-target": "results" }

View File

@@ -0,0 +1,31 @@
import { Autocomplete } from "stimulus-autocomplete";
// Extend the stimulus-autocomplete controller, so we can add the ability to filter out existing
// tag
export default class extends Autocomplete {
static targets = ["tags"];
replaceResults(html) {
const filteredHtml = this.#filterResults(html);
super.replaceResults(filteredHtml);
}
//private
#filterResults(html) {
const existingTags = this.tagsTarget.value.split(",");
// Parse the HTML
const parser = new DOMParser();
const doc = parser.parseFromString(html, "text/html");
const lis = doc.getElementsByTagName("li");
// Filter
let filteredHtml = "";
for (let li of lis) {
if (!existingTags.includes(li.dataset.autocompleteValue)) {
filteredHtml += li.outerHTML;
}
}
return filteredHtml;
}
}