| |
| Post-It's in je applicatie
|
|
|
Location: Blogs Ferry Onderwater - Developer |
 |
| Posted by: Ferry Onderwater |
10-2-2006 0:00 |
Wat zou het toch leuk zijn (en laten we eerlijk zijn, iedereen wil het meer voor het leuke dan voor de functionaliteit) als we in onze web-applicatie ervoor konden zorgen dat we bij een collega een virtuele post-it op zijn of haar scherm zouden plakken. In dit artikel bescrijf ik de stappen die ik heb genomen om een applicatie te bouwen waarin in ik, als gebruiker, zelf post-its kan definieren en laten tonen op het scherm. Wat zou het toch leuk zijn (en laten we eerlijk zijn, iedereen wil het meer voor het leuke dan voor de functionaliteit) als we in onze web-applicatie ervoor konden zorgen dat we bij een collega een virtuele post-it op zijn of haar scherm zouden plakken. In dit artikel bescrijf ik de stappen die ik heb genomen om een applicatie te bouwen waarin in ik, als gebruiker, zelf post-its kan definieren en laten tonen op het scherm. Het aanmaken van de post-its gebeurt server-side. De post-its bliven bestaan zolang de applicatie bestaat (viewstate) en de gebruiker ze niet weg gooit. In een 'echte' applicatie zouden de post-its in een database gezet worden en periodiek opgehaald door de client. Daarmee zou deze op het moment dat hij een post-it sluit ook bijvoorbeeld de geschiedenis van aan hem/haar getoonde post-its kunnen bekijken. Dit zou echter te ver gaan voor dit artikel dus een simpele applicatie waarmee ik server-side post-its kan creeren is ons doel. Vanuit deze gedachte ben ik gaan zoeken op het internet.
Ik kwam op de volgende site terecht: http://www.javascriptkit.com/script/script2/postit.shtml. Hier wordt het javascript getoond waarmee je een post-it kunt plaatsen en slepen. De code van deze pagina kun je vinden in het bijgevoegde bestand onder de naam PostIt.htm.

Wat zijn de 'gebreken' aan deze code? Er zijn er een paar: - Er kan maar één post-it zijn - De code is statisch - De code is volledig client-based - Het is HTML, geen aspx.
Aan de slag dus. Ik ben begonnen om de code te splitsen in een aspx pagina, een css-bestand en een js-bestand. Let op! Vanwege tijdgebrek en mijn einddoel (dit projectje is alleen een try-out) heb ik alle functies om browsers anders dan IE te ondersteunen er uit gesloopt. Het zou je echter niet veel tijd moeten kosten om de hier beschreven oplossing weer 'multiple-browser-aware' te maken aangezien de code in de originele postit.htm is bijgevoegd.
Ik geef per bestand aan hoe het werkt.
PostIt.css
Code:
.postit{ position:absolute; width:250; padding:5px; background-color:lightyellow; border:1px solid black; visibility:hidden; cursor:hand; }
We hebben het #postit vervangen door .postit zodat meerdere elementen tegelijk gebruik kunnen maken van deze class. Daarnaast hebben we de z-index verwijderd zodat we deze per post-it aan kunnen geven.
PostIt.aspx

Je ziet dat we een veld hebben waarin we de aanwezige post-its bijhouden. In dit voorbeeld is dit een textbox en maken we gebruik van hashtables welke omgezet worden naar een string en vice-versa die middels viewstate in dit veld wordt bewaard. Het veld wordt zowel server- als clientside bewerkt en mag dus niet read-only zijn. Hier maken we geen probleem van aangezien de postits normaal gesproken vanuit een database zullen komen. Daarnaast hebben we een veld waarin de gebruiker de content van de post-it kan plaatsen. Ook kan de X, de Y en de Z-positie worden ingegeven. Er is geen controle whatsoever in deze applicatie, die mag je er zelf bijbedenken. X en Y móeten gevuld zijn met een integer, Z mág gevuld zijn. Als Z niet gevuld is kijkt de applicatie zelf wat tot nu toe de hoogst gebruikte Z is. Ook hebben we een knop om de post-it te plaatsen én een knop die niets doet, alleen maar een postback genereerd (voor testen). Tenslotte hebben we twee placeholders. De eerste placeholder, Notes, bevindt zich zo laag mogelijk in ons form. Hierin komen de 'DIV's welke de post-its vormen. De tweede placeholder, PostFormScript, zal de code bevatten waarmee de post-its daadwerkelijk getoond worden.
PostIt.aspx.vb Deze trekken we in stukjes om te bespreken. Als eerste maken we een nieuwe class waarin we de post-its gaan bewaren.
Code:
Public Class PostItInfo Private _Id As String Private _Text As String Private _X As Integer Private _Y As Integer Private _Z As Integer = -1 Public Property Id() As String Get Return _Id End Get Set(ByVal value As String) _Id = value End Set End Property Public Property Text() As String Get Return _Text End Get Set(ByVal value As String) _Text = value End Set End Property Public Property X() As Integer Get Return _X End Get Set(ByVal value As Integer) _X = value End Set End Property Public Property Y() As Integer Get Return _Y End Get Set(ByVal value As Integer) _Y = value End Set End Property Public Property Z() As Integer Get Return _Z End Get Set(ByVal value As Integer) _Z = value End Set End Property Public ReadOnly Property DivTag() As String Get Return "
"
" & _ " " & _ _Text & _ " " & _ " " End Get End Property Public ReadOnly Property ShowScript() As String Get Return "
" End Get End Property Public Sub New() End Sub Public Sub New(ByVal Id As String, ByVal Text As String, ByVal X As Integer, ByVal Y As Integer) _Id = Id _Text = Text _X = X _Y = Y _Z = 100 End Sub Public Sub New(ByVal Id As String, ByVal Text As String, ByVal X As Integer, ByVal Y As Integer, ByVal Z As Integer) _Id = Id _Text = Text _X = X _Y = Y _Z = Z End Sub End Class We hebben binnen de class een vijftal properties, namelijk het id, de tekst en de drie postitioneringsproperties. Daarnaast hebben we twee readonly-properties, DivTag en ShowScript. Deze twee genereren op basis van de eerstgenoemde vijf properties de HTML welke we in de pagina injecteren om de post-it te tonen. Tenslotte hebben we twee New-methods, een 'lege' om gewoon een instance te kunnen maken van een postit en eentje waar we daadwerkelijk gebruik van gaan maken.
De hashtable en de functies om van een hashtable een string te maken en vice versa laat ik even buiten beschouwing, de code is meegeleverd uiteraard maar het is echt een totaal ander onderwerp.
Met de code die overblijft maken en tonen we daadwerkelijk de post-its:
Code:
Protected Sub btnPostIt_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPostIt.Click Dim newId As String = "postit_" & Guid.NewGuid.ToString.ToUpper If tbPostIt.Text.Length > 0 Then
'Create the hashtable Dim ht As New Hashtable ht = GetHashTableFromString(PostItNotes.Text)
Dim pii As PostItInfo If tbZ.Text.Length > 0 Then pii = New PostItInfo(newId, tbPostIt.Text.Replace(vbNewLine, " "), CInt(tbX.Text), CInt(tbY.Text), CInt(tbZ.Text)) Else 'Determine the highest Z-value Dim MaxZ As Integer = 100 For Each htKey As Object In ht.Keys If CType(ht(htKey), PostItInfo).Z > MaxZ Then MaxZ = CType(ht(htKey), PostItInfo).Z Next pii = New PostItInfo(newId, tbPostIt.Text.Replace(vbNewLine, " "), CInt(tbX.Text), CInt(tbY.Text), MaxZ + 1) End If
'Add this note to the hashtable ht.Add(newId, pii) PostItNotes.Text = GetStringFromHashTable(ht)
ShowNotes(ht) End If End Sub
Private Sub ShowNotes(ByVal ht As Hashtable) Dim pii As PostItInfo Notes.Controls.Clear() PostFormScript.Controls.Clear() For Each HashKey As Object In ht.Keys pii = ht(HashKey) Notes.Controls.Add(New LiteralControl(pii.DivTag)) PostFormScript.Controls.Add(New LiteralControl(pii.ShowScript)) Next End Sub
Ook deze code is redelijk 'self-explaining'. Op het moment dat de knop om de post-it te tonen ingedrukt wordt kijken we of er tekst is ingevoerd welke getoond moet worden. Alleen als dit zo is creeren we een nieuwe post-it en plaatsen we deze in de hashtable. Als de Z-positie niet is ingevuld kijken we wat tot nu toe de hoogst ingevoerde Z-waarde is, hogen deze op met 1 en gebruiken de berekende waarde. We slaan de hashtable op in onze textbox (ten behoeve van de viewstate) en roepen ShowNotes aan om de post-it daadwerkelijk te tonen.
Aangezien er een postback heeft plaatsgevonden moeten we alle te tonen post-its opnieuw 'tonen'. Voor alle post-it's uit de hashtable wordt een post-it geïnstancieerd en wordt gebruik gemaakt van de eerdergenoemde read-only properties DivTag en ShowScript om HTML-code te injecteren in de pagina. Dit doen we door LiteralControls toe te voegen aan de placeholders welke we bij de aspx-pagina bespraken.
PostIt.js De code binnen dit javascript kunnen we in drie onderdelen hakken, het 'show en close' deel, 'drag and drop' en 'hashtable'.
show en close
Code:
function closeit(PostItId){ document.getElementById(PostItId).style.visibility="hidden"; htDelete(PostItId); }
function showit(PostItId){ document.getElementById(PostItId).style.visibility="visible" document.getElementById(PostItId).onmousedown=initializedrag; } Zoals je ziet hebben beide functies een parameter meegekregen. Deze bevat het id van de post-it welke getoond of gesloten moet worden. Door (onder andere) deze wijziging kunnen we nu meerdere post-its aan. Om een post-it te tonen wordt de showIt functie aangeroepen. Deze maakt de betreffende post-it 'visible' en hangt een functie aan het 'onmousedown' event om drag en drop mogelijk te maken. Om een post-it te sluiten wordt de functie closeIt aangeroepen. Deze maakt de betreffende post-it 'hidden' én verwijderd deze uit de hashtable zodat hij niet meer terugkomt.
drag and drop
Code:
function drag_drop(e){ if (dragapproved){ event.srcElement.style.left=tempx+event.clientX-offsetx event.srcElement.style.top=tempy+event.clientY-offsety return false } }
function initializedrag(e){ if (event.srcElement.id.substring(0,6)=="postit"){ offsetx=event.clientX; offsety=event.clientY;
tempx=parseInt(event.srcElement.style.left) tempy=parseInt(event.srcElement.style.top)
dragapproved=true event.srcElement.onmousemove=drag_drop event.srcElement.onmouseup=drop; } }
function drop(e) { dragapproved=false; if (tempx) { changePos(event.srcElement.id, tempx+event.clientX-offsetx, tempy+event.clientY-offsety); } }
De functie drag_drop controleert of we echt aan het draggen zijn aan de hand van een variabele die in de volgende functie, initializedrag, wordt gezet. Daarnaast verplaatst hij alleen maar de post-it naar de positie waar de muis heen bewogen is.
De functie initializedrag controleert eerst of het element waarop het even betrekking heeft echt een post-it is door te kijken of de eerste zes karakters van het id gelijk zijn aan 'postit'. Als dit zo is wordt de huidige positie van de muis opgeslagen (event.clientX en event.clientY). Ook wordt de huidige positie van het linkerbovenhoekje van de post-it opgeslagen. De zonet genoemde variabele dragapproved wordt op true gezet om aan te geven dat we een drag operatie opstarten. Tenslotte worden er twee handlers gezet, drag_drop aan het event onmousemove en drop aan het event onmouseup.
De functie drop zorgt er voor dat de variabele dragapproved weer op false wordt gezet, en de nieuwe positie van de post-it wordt opgeslagen in de viewstate.
Kortom, wat doen de bovenstaande javascript functies? We hebben een html-pagina met een div.
showIt toont de div en zorgt dat als we er met de muis op klikken initializedrag wordt aangeroepen. Na het klikken zorgt initializedrag dat bij bewegen van de muis drag_drop wordt aangeroepen en bij het loslaten van de linkermuisknop drop wordt aangeroepen.
De hashtable functies vallen ook hier buiten de scope van dit artikel. Indien er behoefte is aan meer uitleg hierover, laat een berichtje achter.
Hoe ziet onze applicatie er uiteindelijk nou uit?
Bijlagen:
PostIt.rar |
| Copyright ©2006 Ferry Onderwater |
| Permalink |
Trackback |
Comments (3)
Add Comment
|
|
|
If you want tougg classic tall boot pewter equivalent ugg classic tall sunflowera undefeated web
By ugg boots outlet on
19-8-2010 8:01 |
| If you want tougg classic tall boot pewter equivalent ugg classic tall sunflowera undefeated web ugg classic tall chestnut,designer, you exigency go into,usable, functionalugg classic tall black,,interface designs at the ugg classic tall chocolate,crux of your work. , ugg classic tall bomber boot This will contribute ,to the fleshingugg classic tall grey , out of ,not humle , ,ugg classic tall navy, your convoy ugg classic short sand, (or whatever vigor you design for),ugg classic short chestnut,,but moreoverugg classic short ultramarine,mini ugg boots, ugg classic short spiced coral ,besides,ugg classic short chocolate, furthermore,ugg classic short sale, further yourself.ugg classic short fancy,A popularugg classic short metallic, interconfront designugg classic cardy boots grey,is crucialugg classic cardy grey ,you can takeugg classic cardy black,pride in ugg classic cardy oatmeal,and leave getugg classic cardy boots black,you futureugg classic cardy fig,contracts.ugg classic cardy tall ,Clickable ugg classic cardy sale,Wireframes, ugg bailey button triplet,Usability ugg bailey boots, Testing andugg bailey button bomber,Digital Paper ugg bailey button side boots,Prototyping.ugg bailey button uk, Fast wireframeugg bailey button bomber boots,creation andugg bailey button grey,remote website ugg bailey button sale,usability testing lead to anugg bailey button boots,larger conversion! . |
|
|
|
|
|
|
|
|
|