Index: src/templates/acc/charts/accounts/selector.tpl
==================================================================
--- src/templates/acc/charts/accounts/selector.tpl
+++ src/templates/acc/charts/accounts/selector.tpl
@@ -3,40 +3,42 @@
{if empty($grouped_accounts) && empty($accounts)}
Le plan comptable ne comporte aucun compte de ce type. Pour afficher des comptes ici, les modifier dans le plan comptable en sélectionnant le type de compte favori voulu.
{elseif isset($grouped_accounts)}
+
{foreach from=$grouped_accounts item="group"}
{$group.label}
{foreach from=$group.accounts item="account"}
-
+
{$account.code}
{$account.label}
{$account.description}
Sélectionner
+
{/foreach}
{/foreach}
{else}
- {input type="checkbox" name="typed_only" value=1 default=1} N'afficher que les comptes favoris
+ {input type="checkbox" name="typed_only" value=0 default=0 default=$all} N'afficher que les comptes favoris
{foreach from=$accounts item="account"}
-
+
{$account.code}
{$account.label}
{if $account.type}
{icon shape="star"} =Entities\Accounting\Account::TYPES_NAMES[$account->type]?>
@@ -50,74 +52,8 @@
{/if}
-{literal}
-
-{/literal}
+
{include file="admin/_foot.tpl"}
Index: src/www/admin/acc/charts/accounts/selector.php
==================================================================
--- src/www/admin/acc/charts/accounts/selector.php
+++ src/www/admin/acc/charts/accounts/selector.php
@@ -39,14 +39,17 @@
$accounts = $chart->accounts();
$tpl->assign(compact('chart', 'targets'));
+$all = (bool) qg('all');
+
if (!$targets) {
- $tpl->assign('accounts', $accounts->listAll());
+ $tpl->assign('accounts', !$all ? $accounts->listCommonTypes() : $accounts->listAll());
}
else {
$tpl->assign('grouped_accounts', $accounts->listCommonGrouped(explode(':', $targets)));
}
+$tpl->assign('all', $all);
$tpl->display('acc/charts/accounts/selector.tpl');
ADDED src/www/admin/static/scripts/selector.js
Index: src/www/admin/static/scripts/selector.js
==================================================================
--- src/www/admin/static/scripts/selector.js
+++ src/www/admin/static/scripts/selector.js
@@ -0,0 +1,115 @@
+RegExp.escape = function(string) {
+ return string.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
+};
+
+function normalizeString(str) {
+ return str.normalize('NFD').replace(/[\u0300-\u036f]/g, "")
+}
+
+var buttons = document.querySelectorAll('button');
+
+buttons.forEach((e) => {
+ e.onclick = () => {
+ window.parent.g.inputListSelected(e.value, e.getAttribute('data-label'));
+ };
+});
+
+var rows = document.querySelectorAll('table tr');
+
+rows.forEach((e, k) => {
+ e.classList.add('clickable');
+ var l = e.querySelector('td').innerText + ' ' + e.querySelector('th').innerText;
+ e.setAttribute('data-search-label', normalizeString(l));
+
+ e.querySelector('button').onfocus = () => {
+ rows.forEach((r) => {
+ if (r == e) {
+ return;
+ }
+
+ r.classList.remove('focused');
+ });
+
+ e.classList.add('focused');
+ };
+
+ e.onclick = (evt) => {
+ if (evt.target.tagName && evt.target.tagName == 'BUTTON') {
+ return;
+ }
+
+ e.querySelector('button').click();
+ };
+});
+
+document.onkeydown = (evt) => {
+ let focus = document.activeElement;
+ let new_focus;
+
+ // Get first element
+ if (focus.tagName != 'BUTTON') {
+ new_focus = document.querySelector('table tr');
+ }
+
+ if (evt.key == 'ArrowUp' && !new_focus) {
+ let idx = focus.parentNode.parentNode.dataset.idx - 1;
+
+ if (idx == 0) {
+ return true;
+ }
+
+ new_focus = rows[idx - 1];
+ }
+ else if (evt.key == 'ArrowDown' && !new_focus) {
+ let idx = focus.parentNode.parentNode.dataset.idx - 1;
+
+ if (idx >= rows.length - 1) {
+ return true;
+ }
+
+ new_focus = rows[idx + 1];
+ }
+ else {
+ new_focus = null;
+ }
+
+ if (!new_focus) {
+ return true;
+ }
+
+ new_focus.querySelector('button').focus();
+ return false;
+};
+
+buttons[0].focus();
+
+var q = document.getElementById('lookup');
+
+if (q) {
+ q.onkeyup = (e) => {
+ var query = new RegExp(RegExp.escape(normalizeString(q.value)), 'i');
+
+ rows.forEach((elm) => {
+ if (elm.getAttribute('data-search-label').match(query)) {
+ elm.style.display = null;
+ }
+ else {
+ elm.style.display = 'none';
+ }
+ });
+
+ return false;
+ };
+
+ q.focus();
+}
+
+var o = document.getElementById('f_typed_only_0');
+
+if (o) {
+ o.onchange = () => {
+ let s = new URLSearchParams(window.location.search);
+ s.set("all", o.checked ? 0 : 1);
+ window.location.search = s.toString();
+ };
+}