Implemented suggestions for product field contents

based on existing contents of the same field on other products.
Also changed datalist IDs to be more descriptive
This commit is contained in:
Erik Thuning 2019-08-15 11:34:59 +02:00
parent bb8666a2d7
commit 45eb32c70b
4 changed files with 78 additions and 12 deletions

@ -117,7 +117,7 @@
<h2>Mallar</h2>
<form class="dark templates"
onSubmit="JavaScript:loadTemplate(event)">
<datalist id="templatelist"></datalist>
<datalist id="template_suggest"></datalist>
<input type="hidden"
name="page"
value="products" />
@ -125,7 +125,7 @@
name="action"
value="new" />
<input onFocus="JavaScript:suggest(this, 'template')"
list="templatelist"
list="template_suggest"
autocomplete="off"
type="text"
name="template"
@ -150,8 +150,8 @@
<input type="hidden"
name="id"
value="¤id¤" />
<datalist id="fieldlist"></datalist>
<datalist id="taglist"></datalist>
<datalist id="field_suggest"></datalist>
<datalist id="tag_suggest"></datalist>
<table>
<tfoot>
<tr>
@ -177,7 +177,11 @@
<td>
<input type="text"
name="name"
value="¤name¤" />
value="¤name¤"
onFocus="JavaScript:suggestContent(this)"
list="name_suggest"
autocomplete="off" />
<datalist id="name_suggest"></datalist>
</td>
</tr>
<tr>
@ -187,7 +191,11 @@
<td>
<input type="text"
name="brand"
value="¤brand¤" />
value="¤brand¤"
onFocus="JavaScript:suggestContent(this)"
list="brand_suggest"
autocomplete="off" />
<datalist id="brand_suggest"></datalist>
</td>
</tr>
<tr>
@ -215,7 +223,7 @@
<td>
<input onKeyPress="JavaScript:addField(event)"
onFocus="JavaScript:suggest(this, 'field')"
list="fieldlist"
list="field_suggest"
autocomplete="off"
class="newfield"
type="text"
@ -237,7 +245,7 @@
¤tags¤
<input onKeyPress="JavaScript:addTag(event)"
onFocus="JavaScript:suggest(this, 'tag')"
list="taglist"
list="tag_suggest"
autocomplete="off"
class="newtag"
type="text"
@ -301,7 +309,11 @@
<input type="text"
class="info_item"
name="¤key¤"
value="¤value¤" />
value="¤value¤"
onFocus="JavaScript:suggestContent(this)"
list="¤key¤_suggest"
autocomplete="off" />
<datalist id="¤key¤_suggest"></datalist>
</td>
</tr>
@ -447,7 +459,7 @@
<form class="dark"
action="./"
method="GET">
<datalist id="userlist"></datalist>
<datalist id="user_suggest"></datalist>
<input type="hidden"
name="page"
value="checkout" />
@ -458,7 +470,7 @@
<input onFocus="JavaScript:suggest(this, 'user')"
type="text"
name="user"
list="userlist"
list="user_suggest"
autocomplete="off"
placeholder="Användarnamn"
value="¤user¤"

@ -51,6 +51,9 @@ class Ajax extends Responder {
case 'suggest':
$out = $this->suggest();
break;
case 'suggestcontent':
$out = $this->suggest_content();
break;
case 'discardproduct':
$out = $this->discard_product();
break;
@ -339,6 +342,10 @@ class Ajax extends Responder {
return new Success(suggest($_POST['type']));
}
private function suggest_content() {
return new Success(suggest_content($_POST['fieldname']));
}
private function discard_product() {
$product = new Product($_POST['id']);
if(!$product->get_discardtime()) {

@ -218,6 +218,37 @@ function suggest($type) {
return $out;
}
function suggest_content($fieldname) {
$search = '';
$resultfield = $fieldname;
switch($fieldname) {
case 'name':
$search = prepare('select distinct `name`
from `product` order by `name`');
break;
case 'brand':
$search = prepare('select distinct `brand`
from `product` order by `brand`');
break;
default:
$search = prepare("select distinct `data` from `product_info`
where `field` = ? order by `data`");
bind($search, 's', $fieldname);
$resultfield = 'data';
}
$out = array();
execute($search);
try {
$results = result_list($search);
} catch(Exception $e) {
return array();
}
foreach($results as $row) {
$out[] = $row[$resultfield];
}
return $out;
}
function match($testvalues, $matchvalues) {
# match only presence of field (if no value given)
if(!$testvalues && $matchvalues) {

@ -201,7 +201,7 @@ function suggest(input, type) {
break
}
var render = function(result) {
var suggestlist = document.querySelector('#' + type + 'list')
var suggestlist = input.list
while(suggestlist.firstChild) {
suggestlist.removeChild(suggestlist.firstChild)
}
@ -223,6 +223,22 @@ function suggest(input, type) {
ajaxRequest('suggest', [['type', type]], render)
}
function suggestContent(input) {
var render = function(result) {
var suggestlist = input.list
while(suggestlist.firstChild) {
suggestlist.removeChild(suggestlist.firstChild)
}
var suggestions = result.message
for(var i = 0; i < suggestions.length; i++) {
var next = document.createElement('option')
next.value = suggestions[i]
suggestlist.appendChild(next)
}
}
ajaxRequest('suggestcontent', [['fieldname', input.name]], render)
}
function addField(event) {
if(event.key && event.key != "Enter") {
return