Use Autocomplete instead of Select in Add to List screen
This commit is contained in:
@@ -5,27 +5,31 @@
|
||||
<div class="text-sm font-bold text-gray-800">Add Item to {{ list.name }}</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block head_scripts %}
|
||||
<script type="module">
|
||||
import JtAutocomplete from "https://unpkg.com/@jadetree/ui/dist/components/autocomplete.js";
|
||||
JtAutocomplete.register();
|
||||
</script>
|
||||
<link rel="stylesheet" href="https://unpkg.com/@jadetree/ui/css/index.css" />
|
||||
{% endblock %}
|
||||
{% block main %}
|
||||
<form method="post">
|
||||
<div class="py-2 px-4 flex flex-col">
|
||||
<fieldset class="flex flex-col" x-data="{productId:''}">
|
||||
<fieldset class="flex flex-col" x-data="{productName:'',newProduct:false}">
|
||||
<legend class="sr-only">Select Product to Add</legend>
|
||||
<div class="flex flex-col pb-4">
|
||||
<label for="product" class="py-1 text-xs text-gray-700 font-semibold">Product:</label>
|
||||
<select id="product" name="product" class="flex-grow p-1 text-sm bg-white border rounded" x-model='productId'>
|
||||
<option value="" disabled selected>Select a Product</option>
|
||||
<option value="new">Create a New Product</option>
|
||||
{% for p in products|sort(attribute='category')|sort(attribute='name') %}
|
||||
<option value="{{ p.id }}">{{ p.name }}{% if p.category %} (in {{ p.category }}){% endif %}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<jt-autocomplete clearable>
|
||||
<input id="product" name="productName" class="p-1 text-sm border border-gray-200 rounded" list="product-list" x-model="productName" @blur="newProduct=!isExistingProduct(productName)" />
|
||||
</jt-autocomplete>
|
||||
<span class="text-xs text-blue-300" x-show="newProduct">New Product</span>
|
||||
</div>
|
||||
<div class="flex flex-col sm:flex-row sm:justify-between" x-show="productId == 'new'">
|
||||
<div class="w-full sm:mr-1 flex flex-col pb-4">
|
||||
<label for="productName" class="py-1 text-xs text-gray-700 font-semibold">Product Name:</label>
|
||||
<input type="text" id="productName" name="productName" class="p-1 text-sm border border-gray-200 rounded" />
|
||||
</div>
|
||||
<div class="w-full sm:ml-1 flex flex-col pb-4">
|
||||
<div class="flex flex-row align-center justify-start gap-2 pb-4" x-show="newProduct">
|
||||
<input type="checkbox" id="rememberProduct" name="remember" class="appearance-none h-4 w-4 border border-gray-300 rounded-sm bg-white checked:bg-blue-600 checked:border-blue-600 focus:outline-none transition duration-200 bg-no-repeat bg-center bg-contain cursor-pointer" />
|
||||
<label for="rememberProduct" class="text-xs text-gray-700 font-semibold">Remember Product</label>
|
||||
</div>
|
||||
<div class="flex flex-col sm:flex-row sm:justify-between" x-show="newProduct">
|
||||
<div class="w-full flex flex-col pb-4">
|
||||
<label for="productCategory" class="py-1 text-xs text-gray-700 font-semibold">Category:</label>
|
||||
<input type="text" id="productCategory" name="productCategory" class="p-1 text-sm border border-gray-200 rounded" />
|
||||
</div>
|
||||
@@ -49,4 +53,19 @@
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<datalist id="product-list">
|
||||
{% for p in products|sort(attribute='category')|sort(attribute='name') %}
|
||||
<option{% if p.category %} data-category="{{ p.category }}"{% endif %}>{{ p.name }}</option>
|
||||
{% endfor %}
|
||||
</datalist>
|
||||
{% endblock %}
|
||||
{% block body_scripts %}
|
||||
<script language="javascript">
|
||||
function isExistingProduct(product) {
|
||||
if (!product) return true;
|
||||
const products = Array.from(document.querySelectorAll('#product-list option'))
|
||||
.map((opt) => opt.textContent.toLowerCase().trim());
|
||||
return products.includes(product.toLowerCase().trim());
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user