[addon tagcontrol] TagControl

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Mikulas Dite
Člen | 756
+
0
-

Rozšířený input text pro vkládání tagů.

Používá stejný design jako obdobná komponenta pro Mac. (Facebook měl totéž, ale nedávno vzhled téhle komponenty změnil).

Docela už jsem si s tím vyhrál, ale určitě by to chtělo opravit/přidat několik věcí.

Editoval Mikulas Dite (11. 12. 2010 18:23)

redhead
Člen | 1313
+
0
-

Většina jich po najetí/označení ukáže křížek na smazání. Bylo by to dobrý, než mít jen backspace/delete.

Jinak velice dobré!

Honza Marek
Člen | 1664
+
0
-

Přijde mi to hrozně neintuitivní. Tagům by neškodilo tlačítko × na mazání. Přidávání jsem taky dlouho koumal, než jsem přišel na to, že funguje enter. Vůbec je divné to oddělení, že někam píšeš tag a on se pak přidá o řádek vedle. Pořád jsem zkoumal, jak něco napsat do toho vrchního řádku.

Ondřej Brejla
Člen | 746
+
0
-

Jsem na tom podobně jako Honza. Tagy bych tvořil po napsání čárky , a nechával bych je ve stejném řádku. Jinak pěkné.

Honza Marek
Člen | 1664
+
0
-

Ondra: Na to bych taky nepřišel. Myslim, že problém je v tom, že tohle UI bylo vytvořeno pro výběr tagů s tim, že máš našeptávač, kde můžeš tag vybrat a on se pak udělá takovej modrej a kulatej. Ne pro vytváření nových tagů.

Ondřej Brejla
Člen | 746
+
0
-

Já to „čárkované vytváření“ kdesi viděl, používal a přišlo mi to ok… To je sice pravda, ale pokud chceš vytvářet, tak s tím nic moc nenaděláš, nějak to zprovoznit musíš :-) Nevím no, chce to odzkoušet…nějaké řešení se určitě najde.

redhead
Člen | 1313
+
0
-

Hodně povedené to má Last.fm při tagování skladby/autora (tuším).

Mikulas Dite
Člen | 756
+
0
-

Paráda, dík : )
Přidal jsem hezčí mazání a dal input na stejnou řádku.

Nové demo:
http://taginput.injectionsoft.com/

Editoval Mikulas Dite (11. 12. 2010 13:03)

Mikulas Dite
Člen | 756
+
0
-

Přidal jsem podporu pro validaci. Jak v PHP, tak i v JS. Unikátní pravidlo je TagInput::UNIQUE, které dělá tagy unikátní (omezuje už vepisování tagů). Stejně tak pravidla :LENGTH a :MAX_LENGTH omezují počet tagů jako input text počet znaků – nedovolí napsat víc.

Další cesta bude asi přidání napovídání přes ajax, protože to se na tagy hodí nejvíc.

Honza Marek
Člen | 1664
+
0
-

Teď to vypadá o mnoho líp. Jen mi vadí, jak to v chromu skáče, když se objeví křížek. A taky jeden tag může být rozdělen do dvou řádek, což taky nevypadá dobře.

Mikulas Dite
Člen | 756
+
0
-

Skáče? Ten tag by měl zůstat stejně dlouhej, akorát se posune ten text a udělá místo pro křížek. Rozdělení mě taky štve, ale ještě nevim co s tim.

Kromě toho jsem přidal ajax našeptávátko a úplně nové demo: http://taginput.injectionsoft.com/

Aurielle
Člen | 1281
+
0
-

Nerozdělování: white-space: nowrap

Mikulas Dite
Člen | 756
+
0
-

Ono je to trochu složitější, ale dík, tohle by spolu s dalším nastavením pomoct mohlo. Pak tam jsou ale různé bugy ve zpracovávání round-corners když se to přelamuje (a v různých prohlížečích jinak) – když je ten tag delší než celý řádek, tak se zalomit musí (to sice skoro nikdy není, ale nastat to může).

Edit: v kombinaci s ‌ to stačilo dík : )

Editoval Mikulas Dite (11. 12. 2010 14:14)

cuga
Člen | 210
+
0
-

zkouseli jste to nekdo ve FF 3.6.13? mi to teda nefunguje… v chrome to vali jak ma

PJK
Člen | 70
+
0
-

Pěkné! Ale abych si taky rýpnul: asi by bylo dobré, kdyby se návrhy daly procházet šipkami… Pokud by jsi byl takový filantrop, že byses rozhodl to udělat, koukni se na http://docs.jquery.com/…autocomplete, tam je to myslím automaticky, nebo v nějakém nastavení.

Mikulas Dite
Člen | 756
+
0
-

cuga napsal(a):

zkouseli jste to nekdo ve FF 3.6.13? mi to teda nefunguje… v chrome to vali jak ma

Zkoušel jsem nejnovější Chrome, Firefox a Safari pod Mac, na Windows jenom IE8 + IE9 preview. Zkusím na windows i další, ale všude to zatím fungovalo dobře.

Edit: zkusil jsem nový Chrome a Firefox pod Windows 7 a oboje funguje správně. Rád to fixnu, ale pošli mi ten problém pls.

PJK napsal(a):

Pěkné! Ale abych si taky rýpnul: asi by bylo dobré, kdyby se návrhy daly procházet šipkami… Pokud by jsi byl takový filantrop, že byses rozhodl to udělat, koukni se na http://docs.jquery.com/…autocomplete, tam je to myslím automaticky, nebo v nějakém nastavení.

He : ) to už tam dávno je. Akorát se to pokazilo na jednom selectoru, jak je jich na stránce víc. Už to běží… Dík

Editoval Mikulas Dite (12. 12. 2010 16:31)

PJK
Člen | 70
+
0
-

He : ) to už tam dávno je. Akorát se to pokazilo na jednom selectoru, jak je jich na stránce víc. Už to běží… Dík

A já si říkal… :D Díky!

Matúš Matula
Člen | 257
+
0
-

Ahoj, nestudoval som to do hlbky, ale nie je to mladsi brat suggestpickeru ?

Mikulas Dite
Člen | 756
+
0
-

Asi ano, ale je to o dost jinde. To cos posílal je i podle názvu spíš suggest, oproti tomu TagInput je záležitost úplně jiná – psaní tagů. Autocomplete je tady jako třešnička na dortu. Hodně důležité jsou i validace, které tady tvoří tak třetinu kódu a které jsem u suggestpickeru úplně neviděl.

Matúš Matula
Člen | 257
+
0
-

Oki, dik za objasnenie. Kazdopadne dobra praca ;)

Matúš Matula
Člen | 257
+
0
-

Ahoj,

demopage vyzera byt nefunkcna..

Mikulas Dite
Člen | 756
+
0
-

Díky, opraveno.

Matúš Matula
Člen | 257
+
0
-

Ahoj, dalo by sa pri nasepkavani v danom momente posielat vzdy max. 1 ajax dotaz? Momentalne je situacia taka, ze ked napisem rychlo slovo a server ma pomalsiu odpoved (localhost doma), tak mi to obcas skape. Tie ostatne sa aj tak posielaju zbytocne, kedze je potrebny aj tak iba ten posledny. T.z. ze pred vytvorenim noveho ajax requestu by sa vzdy checklo, ci je nejaky aktivny dotaz a ak ano, tak zrusit a az potom vytvorit novy.

BTW. v doplnkoch chyba link na toto forum

Matúš Matula
Člen | 257
+
0
-

Tiez myslim, ze by bolo fajn, keby metoda setSuggest zohladnovala asociativne pole a nasledne by asociativne pole vracala metoda getValue(). Vyuzitie to ma pri nasepkavani existujucich tagov, kedy ako index pouzijem napr. jeho id z databazy

Mikulas Dite
Člen | 756
+
0
-

Díky, to s tím abort request jsem přidal https://github.com/…84405cc5d6ba.

To s asoc přidávat asi zatím nebudu. Suggested hodnoty nejsou povinné a user si může vyplnit co chce (hlavně ti bez JS). Proto nemá cenu vracet id, když některé hodnoty by ho neměly.

Matúš Matula
Člen | 257
+
0
-

ad abort: Dik

ad asoc: Ono v principe nevadi, ze su nepovinne. Urobil som to tak, ze ak je to hodnota z nasepkavaca, tak getValue jej priradi prisluchajuce id a ak nie, tak ho jednoducho zaradi na koniec pola [s automatickym indexom]. V spracovani odoslanych dat si to uz mozem spracovat ako chcem, napr. zistit id, kt. nie su v nasepkavaci a tie vlozit do databazy ako novovytvorene.

Editoval Matúš Matula (6. 2. 2011 12:27)

Matúš Matula
Člen | 257
+
0
-

Zdravim, myslim, ze som nasiel bug.
Podmienka na tomto riadku https://github.com/…/tagInput.js#L65 by mala myslim byt

if (!($value.parent().data('tag-length') != 'false' && $value.parent().getTagInputValues().length >= parseInt($value.parent().daat('tag-length')))) {

(!=false)

Mikulas Dite
Člen | 756
+
0
-

Díky, fixed.

Matúš Matula
Člen | 257
+
0
-

Pred volanim parent::getValue() v metode getValue() je potrebne odstranit html atribut maxlength pretoze v TextInput::sanitize by to zobralo ako String a urezalo tagy na danu hodnotu (V pripade ze sme nastavili pravidlo Form::MAX_LENGTH)

<?php
public function getValue()
{
	unset($this->control->maxlength);
	$value = String::split(parent::getValue(), "\x01" . $this->delimiter . "\x01");
	if ($value[0] == '' && count($value) === 1) {
		$value = array();
	}
	return $value;
}
?>
Matúš Matula
Člen | 257
+
0
-

A pri zvoleni tagu pomocou sipiek a enteru by sa ponuka mala schovat predpokladam. Cize pred return pichnut este

$('.tag-suggest').hide();

https://github.com/…/tagInput.js#L219

Nechcem tu zasierat forum, tak snad v blizkej dobe si najdem cas a skamaratim sa s git(hub)om a budem to riesit tam.

Mikulas Dite
Člen | 756
+
0
-

Implementoval jsem raději upravenou sanitize, která trimne ty jednotlivé prvky. Thx

Edit: to hide() funguje trošku jinak, testoval jsem Mac Chrome/Safari/FF a Win IE8 a mělo by to být funkčí takhle.

Editoval Mikulas Dite (11. 2. 2011 19:54)

twingosh
Člen | 10
+
0
-

Nazdarte,
co kdybych tímto doplňkem potřeboval našeptávat (autocomplete) položky z pole, které má cca 50000 záznamů?

To už je asi potřeba přímo sestavovat dotaz do DB a hledat string tam a ne prohledávat takto velké pole, že?

Díky

Mikulas Dite
Člen | 756
+
0
-

Určitě, tahle implementace dělaná na tagy, max stovky záznamů, každopádně jsem to psal tak, aby to šlo snadno rozšířit.

twingosh
Člen | 10
+
0
-

Toho jsem se bál :-) Tak jdu rozšiřovat :-)

Matúš Matula
Člen | 257
+
0
-

cauko, co sa tyka rozsirovania, tak by bolo fajn, keby si private vars dal ako protected, pripadne k nim dal gettery a settery, aby sa s nimi dalo z potomka pracovat.

Matúš Matula
Člen | 257
+
0
-

Mikulas Dite napsal(a):

Implementoval jsem raději upravenou sanitize, která trimne ty jednotlivé prvky. Thx

Funguje ti to s tou upravou? Ked sa pozriem do zdrojaku https://api.nette.org/…ase.php.html#50 tak najprv sa aplikuju filtre (sanitize, kt. vzdy vrati array), kt. navratova hodnota je pretypovana na string. Cize podla mna vzdy dostanes vysledok „Array“. Alebo mi nieco unika?

Mikulas Dite
Člen | 756
+
0
-

Aha, nějak jsem na to zapomněl. Fixnul jsem to s filtry a předávání pole změnil na callback s parametry $filter, $count. Teď se mi to docela líbí. Díky : )

Matúš Matula
Člen | 257
+
0
-

Matúš Matula napsal(a):

cauko, co sa tyka rozsirovania, tak by bolo fajn, keby si private vars dal ako protected, pripadne k nim dal gettery a settery, aby sa s nimi dalo z potomka pracovat.

@Mikulas Dite: Co ty na to?

Mikulas Dite
Člen | 756
+
0
-

Tak můžu, ale teď už to imho není potřeba, protože není potřebova to rozšiřovat – data se tahají z modelu přes ten callback.

Matúš Matula
Člen | 257
+
0
-

Aha, to som nejako prehliadol :)
Kazdopadne napr. nastavit payloadLimit by bolo dobre vediet nejak inak, ako natvrdo v kode :)

Este mam otazku k casti https://github.com/…TagInput.php#L169

<?php
if (String::startsWith(String::lower($tag), String::lower($filter))) {
    $data[] = $tag;
}
?>

ci to tam je treba. Kedze mam callback, kt. mi na zaklade $filtra vrati len tie tagy, co chcem (napr. chcem vratit aj vysledky so zhodou hocikde v retazci, %like% ).

Btw. aj taky nazov parametru filtra https://github.com/…TagInput.php#L103 sa hodi nastavit (narazil som na to, ked sa mi zacal byt s persistentnym $filter)

Ale to uz su drobnosti ;)

Mikulas Dite
Člen | 756
+
0
-

Jé, takovou blbost jsem tam nechal. Ok, odstranil jsem tu nadbytečnou kontrolu v response a filter přejmenoval na word_filter. To není zdaleka tak univerzální a shody s property by se to nemělo (resp. za ten setter to nestojí), pro payloadLimit jsem to přidal.

Matúš Matula
Člen | 257
+
0
-

Diiky ;)

Matúš Matula
Člen | 257
+
0
-

Tak zase ja :) Skusal som to otestovat v IE7 a zda sa ze to pada na pseudoselektoroch :hover a :focus, kedy to v IE vrati undefined

<script>
$('.tag-control-helper:focus')
</script>

, a netusim preco, kedze jquery by to malo mat vyriesene a vratit prazdny objekt. Napada ta nejaky fix, resp. nefunguje ti to nahodou? (skusam to v IETesteri)

Mikulas Dite
Člen | 756
+
0
-

Aha, to je sice smutný, ale já moc s tim nenadělám, protože se to prakticky nedá debugnout. Jestli na to přijdeš, tak to bude výborný, ale mně zatím bude stačit podpora pro IE8+.

Protože je tam jQuery tak očekávám, že mi graceful degradation zařídí. Tohle chování v IE7 je nějaké podivné. Google na to něco vrací, ale těžko říct, jak to opravit.

Matúš Matula
Člen | 257
+
0
-

No, pojdem v tvojich slapajach a budem sa musiet uspokojit tiez s IE8+. Stravil som teraz 3hodiny refaktorovanim, aby to aspon nehadzalo chyby – :focus staci jednoducho nahradit triedou .focus pre kontajner.

:hover som dal do try/catch pre ie7 – jQuery hodi "Syntax error, unrecognized expression: "
moznost debugovat je u mna nulova, takze som rad, ze to ‚chodi‘ aspon takto. Aj by som to niekam zavesil, ale je to tak prekopane (pouzil som to 1.krat pred par mesiacmi a odvtedy vela krat upravil), ze to asi nikomu nepomoze. Ale planujem sa zoznamit s GitHubom a forknut to, len ako to uz byva, nie je cas :)

pepakriz
Člen | 246
+
0
-

Díky za skvělou komponentu. Narazil jsem na drobný problém při vícenásobném použití inputu v jednom formuláři s rozdílnou metodou pro napovídání. Všem těmto inputům se vyheneruje v HTML stejný data-tag-suggest, ikdyž by měl mít každý svůj vlastní rozdílný.

pepakriz
Člen | 246
+
0
-

Chybku jsem opravil zde: https://github.com/…801664dd42d9

Omlouvám se za zřejmě špatný postup opravy, s hitgubem jsem pracoval prvně :D

Edit: Aha, tak už jsem poslal pull request.

Editoval pepakriz (12. 5. 2011 14:23)

Mikulas Dite
Člen | 756
+
0
-

Díky za fix, pullnuto.

pepakriz
Člen | 246
+
0
-

Přišel jsem ještě na jednu drobnou chybku. Při nastavení jiného delimiteru, který neobsahuje znak „,“ (například ‚[;]+‘) se při nastavení defaultních hodnot špatně rozdělej prvky, jelikož metoda setDefaultValue() spoléhá na oddělovací znak čárky. Řešením bude pravděpodobně zavedení nové proměnné pro defaultní oddělovač. Zkusím opět napsat patch.

Edit: Poslán pull request

Editoval pepakriz (13. 5. 2011 23:26)

cuga
Člen | 210
+
0
-

hoj, ta verze 2.0 co je na GitHubu, je funkcni nebo jeste neco musis dodelat? v FF6 mi to haze chybu

input.control.get(0).type = "tag"; // not working in IE

radek 329