Watermark textbox met Javascript en CSS

25 08 2008

Een van de onderdelen van de ASP.Net Ajax control toolkit is de watermark textbox. Voor hen die deze nog niet kennen, de watermark textbox is een texbox waarin bijvoorbeeld een hint staat wat je moet invullen in die textbox. De bedoeling is natuurlijk dat die hint verdwijnt als je er iets invult, en weer tevoorschijn komt als je je invoer weer verwijdert. Wat er vaak ook bij wordt gemaakt is een aparte opmaak voor die textbox, zodat je duidelijk kunt zien dat je in die textbox nog niets hebt ingevoerd.
Dit zou er als volgt uit kunnen zien:

(er is ook een mini-filmpje van hoe het er uit ziet, maar ik kan bij deze overigens fijne blog dienst geen Flash of Avi’s hosten. Als je het mini-filmpje wilt zien moet je even dit linkje openen.)

Dus, gebruiken en klaar zou je zeggen.
Helaas… de control toolkit is in Visual Studio 2008 als ’standaard’ opgenomen, maar in Visual Studio 2005 is het nog een aparte download, en dat wil niet elke beheerder installeren. En in mijn huidige project, met Visual Studio 2003, is het niet eens beschikbaar.
De oplossing is snel gemaakt, want heel complex is het niet.
Wat hebben we nodig:

  • Een CSS voor de opmaak als de watermerk-text zichtbaar is en eentje voor als de watermerk-text niet zichtbaar is
  • Een stukje Javascript om bij de onBlur te kijken of de textbox leeg is of de watermerk-text bevat of een ingevoerde tekst bevat en dan de juiste CSS te zetten
  • Een stukje Javascript om bij het selecteren van een textbox (focus verkrijgen) de watermerk-CSS weg te halen
  • Een stukje code behind om bij het renderen van de pagina de juiste style te zetten en de Javascript aan de textboxen te knopen.

Als eerste de CSS. Is natuurlijk een voorzet, style het the way you like it.

.watermarkOn
{
  font-size: 0.8em;
  font-family : Verdana, Helvetica, sans-serif;
  background-color : #ddffaa;
  font-variant: small-caps

}
.watermarkOff
{
}

Als tweede de Javascript. Mag in de pagina zelf of in een externe file:

function OnWatermarkFocus(elementId, defaultText)
{
  //als de control de focus krijgt kijken of de waarde gelijk is aan de defaulttext
  //dan heeft de control de watermarkOn style maar tijdens invoer moet de control de
  //watermarkOn value hebben en leeg zijn

  if (document.getElementById(elementId).value == defaultText)
  {
    document.getElementById(elementId).className = “watermarkOff”;
    document.getElementById(elementId).value = “”;
  }
}

function OnWatermarkBlur(elementId, defaultText)
{
  //als de textbox leeg is of de waarde van de defaultValue heeft
  //dan de watermarkOn style toepassen
  var textValue = document.getElementById(elementId).value;
  if (textValue == defaultText || textValue.length == 0)
  {
    document.getElementById(elementId).className = “watermarkOn”;
    document.getElementById(elementId).value = defaultText;
  }
  //in alle andere gevallen de watermarkOff style toepassen

  else
  {
    document.getElementById(elementId).className = “watermarkOff”;
  }
}

En tot slot de code behind. Naamgeving is natuurlijk afhankelijk van de namen van je textbox controls die je hebt ingevoegd.

private void Page_Load(object sender, System.EventArgs e)
{
  SetWatermark();

}

private void SetWatermark()
{
  CreateWatermarkCode(TextBoxWoonplaats , “Uw woonplaats aub in hoofdletters”);
  CreateWatermarkCode(TextBoxNaam , “Vul hier uw volledige naam in”);

}
private void CreateWatermarkCode(TextBox textbox, string defaultValue)
{
  //als de textbox leeg is of de waarde van de defaultValue heeft
  //dan de watermarkOn style toepassen
  if ((textbox.Text == defaultValue) || (textbox.Text.Length ==0))
  {
    textbox.Attributes.Add(“class”, “watermarkOn”);
  }
  else //in alle andere gevallen de watermarkOff style toepassen
  {
    textbox.Attributes.Add(“class”, “watermarkOff” );
  }
  //de eerste keer bij het laden van de pagina
  //een hook zetten naar de focus en blur events
  //en de default waarde zetten
  if (!IsPostBack)
  {
    textbox.Attributes.Add(”onfocus”, string.Format(”OnWatermarkFocus(’{0}’, ‘{1}’)”, textbox.ClientID, defaultValue));
    textbox.Attributes.Add(”onblur”, string.Format(”OnWatermarkBlur(’{0}’, ‘{1}’)”, textbox.ClientID, defaultValue));
    textbox.Text = defaultValue;
  }
}
Dit soort grafische zaken heeft natuurlijk eigenlijk niet zo veel met Ajax van doen. Het wordt wel vaak in één adem genoemd en zoals gezegd is het ook onderdeel van de Ajax control toolkit, maar het doet niets a-synchroons en ook al niets Xml’s.
Laatst las ik iemand en die noemde het: JAC (Javascript and CSS). Dat klinkt al beter, en dan noemen we het beestje tenminste bij zijn naam.




The Pragmatic Programmer: From Journeyman to Master

15 08 2008

Altijd fijn, als je een boek koopt waar je met plezier in leest. Deze dus ook. Had ‘m volgens mij op aanraden van iemand anders aangeschaft, en toen ik ‘m in handen kreeg was ik gelijk teleurgesteld: het boek was uit 1999! Zal me lekker pragmatisch zijn, zeker tips hoe je moet omgaan met klachten op je MS-Dos scherm? Niets was minder waar.
Een boek geschreven om een tip-lijst heen (dat zie je tegenwoordig ook wel veel, in elke paragraaf een ‘tip’, dus in dat opzicht waren zo ook al bij). Oftewel: het boek vertelt hoe je een goed pragmatisch developer kan zijn en worden, en vat alle stukjes aan het einde van de paragraaf samen als een tip. Het leuke is dat al die tips, met korte omschrijving, ook als uitscheur lijst achterin het boek zit.
En ik heb het nu twee weken uit, en sindsdien markeer ik op die lijst als ik de tip ook in andere artikelen lees, en ik de tip ook van waarde acht. Zo krijg je zo maar je eigen Agile-wiki op papier.
Anyway, het boek bevat 70 tips die variëren van ‘inkoppers’ tot ‘oh ja’ tot ‘oeps in de valkuil stap ik ook’ tot ‘waarom heb ik dat zelf niet bedacht’.
Soms wel een beetje achterhaald als ze het hebben over tooling en dergelijke, maar de principes staan nog altijd overeind.





Functioneel testen

12 08 2008


Ik heb even moeten denken over deze blog. Het is namelijk niet iets om even te lezen en weer verder te gaan, niet iets grappigs, maar iets dat je kunt gaan doen.
Om je dus over de drempel heen te helpen om wat tijd te investeren, zit er aan het einde van dit artikel ook een link naar een klein intro filmpje (2 min) over het onderwerp. En wat is dan het onderwerp? Functioneel testen.
Zoef, weg ogen, op naar de volgende blog….
Aha, voor de lezer die dit afhaakpunt heeft overleefd: sinds enige tijd gebruik ik een open source (2e afhaakpunt ? :-) ) applicatie voor het uitvoeren van functioneel testen. En ik moet zeggen: dat werkt heel plezierig. Niet alleen dat er wordt getest, maar als je code hebt aangepast en je eigen unit tests hebt uitgevoerd, dan is het fijn om even de functionele tests te runnen om te zien of niet alleen jouw service nog goed werkt, maar of ook de applicatie, de front-end, nog doet wat je verwacht.
En daarvoor dus: Selenium web application testing system.

Er zijn drie varianten beschikbaar:
Selenium IDE
Een plugin voor Firefox waarmee je acties in je browser kunt opnemen en daarna weer afspelen. Als je hier even induikt en je kijkt naar het filmpje dan ben je binnen een half uur klaar voor de eerste test van je eigen applicatie. Voorbeeldje van een tijdschrijfapplicatie: inloggen in de applicatie, nieuw project aanmaken, controle of die is aangemaakt, tijdschrijven vijf tijdschrijfregels, edit van een tijdschrijfregel, verwijderen alle tijdschrijfregels, verwijderen project en done! Als je binnenkort wat in die code verandert en je runt dit script, dan geeft dat toch net wat meer vertrouwen (hoe gedetailleerder de test, hoe meer vertrouwen natuurlijk). Als je dan met dit testscript de smaak te pakken hebt en je hebt er een stuk of wat gemaakt, dan is het tijd voor stap 2:

Selenium remote control the beginning
Hiermee kun je de scripts die je aanmaakt met de Selenium IDE achter elkaar afspelen in je browser. Druk op de knop, runnen, en klaar. De scripts worden opgeslagen als tekst, dus een parameter is zo veranderd. Helemaal de smaak te pakken en je wilt bv een test 500 keer uitvoeren met verschillende parameters? Check stap 3:

Selenium remote control the sequel
Hiermee kun je de testscripts opslaan in je favoriete code en kun je vanuit Visual Studio testing met deze scripts je functionele tests runnen. De Selenium code zorgt er voor dat je browser wordt opgestart en alles wordt uitgevoerd. De resultaten komen gewoon in je Visual Studio unit test resultaat scherm te staan.

Wat hield mij destijds tegen om ermee aan de slag te gaan? Toch weer wat tijd om te investeren. Maar met de IDE ben je zo aan de slag, en in een half uur krijg je in ieder geval een idee wat er mogelijk is en of het wat voor je is.

En ja, Visual Studio test edition is natuurlijk ook heel mooi, maar door de kosten ook weer niet zo vbaak beschikbaar voor de developer.

Zoals beloofd hier de link naar het instructiefilmpje van Selenium





Boekbespreking ‘Scrum and XP from the trenches, how we do scrum’

1 08 2008

Op een vorig project werkte ik samen met Mark. Mark is iemand die ik zeer bewonder en die veel inzicht heeft in het proces van software development en software architectuur. Samen hebben we menig gesprek gehad over software architectuur. Voor allebei was dat leuk en leerzaam, het is prettig om collega’s te hebben waarmee je over dergelijke onderwerpen kunt sparren.
Later kwam John er ook bij, en het onderwerp waar we samen met hem over praatten was Agile Development. En als je praat en leest over Agile Development, dan kom je vaak uit bij Scrum en XP. Een leuk onderwerp, want het gaat over hoe we kunnen doen wat wij doen: software bouwen. We hebben er alle drie veel over gelezen en zijn er individueel al deels mee bezig op projecten, maar we hadden geen van allen een project gedaan waar er echt dedicated Agile wordt ontwikkeld.
Zelf heb ik o.a. het boek ‘Agile Project Management with Scrum’ gelezen met daarin case studies over Scrum, en als je dat leest lijkt het wel alsof een Agile project niet kan mislukken.
En dan komt in de discussie over Agile dus steeds de vraag naar boven: hoe zou het in de praktijk werken ? (dit waren dus meer theoretische discussies in tegenstelling tot de archtitectuurdiscussies met Mark, waar je echt de praktijk van alledag naast elkaar kan leggen)
En toen was er het boek ‘Scrum and XP from the trenches, how we do scrum’ met daarin een schat aan ervaringen uit ‘het echte Agile leven’. Dit boek is na registratie gratis te downloaden en is desgewenst ook als hardcopy te verkrijgen, wat ik ook heb gedaan als fijner naslagwerk en om de schrijver te steunen.
En zoals de schrijver Henrik Kniberg aangeeft: “er is niet de manier om een project met XP en Scrum aan te pakken, en zoals wij (de schrijver en zijn teams) het doen is niet per definitie de juiste manier (zelf zegt hij: misschien vind je onze werkwijze wel waardeloos) maar we kunnen in ieder geval leren van zijn ervaringen”. Want de schrijver heeft verschillende projecten gedaan met Scrum en XP en zijn meest belangrijke ervaringen en keuzes heeft hij in dit boek gebundeld.
Ikzelf las het in één ruk uit: al die vragen die je zelf hebt worden grotendeels beantwoord, of in ieder geval voorzien van argumentatie. Welke detaillering breng ik aan in de backlog, en waarom heeft hij bepaalde details er juist uit weggelaten. Hoe schatten we de tijd van user stories in, en waarom op die manier. En dat is prettig om te lezen: waarom ze bepaalde zaken hebben gekozen, en waarom ze bepaalde zaken hebben gelaten. Het mooie is dat je de argumentatie gewoon kunt volgen, en zelf een andere conclusie kunt trekken als je een andere mening toebedeeld bent.
Een minpuntje is dat er niets in staat over de mensen er om heen, hoe die het ervaren. Hoe ervaart een gebruiker het als hij van te voren alleen een inschatting krijgt wat er gebouwd wordt, alleen een grof idee van de functionaliteit, en alleen een inschatting van de kosten? Hoe breng je deze cultuuromslag bij mensen?
Maar ook zonder deze informatie een zeer nuttig boek.
 
Boekinfo:
168 pages, 6″ x 9″
ISBN: 978-1-4303-2264-1
Gratis copy te downloaden van de InfoQ minibooks site
In Nederland o.a. te koop bij comcol.nl en bol.com