Thursday, July 22, 2010

xpages: In an effort to make mass emails from IBM less sucky looking

Since i complained about how bad the IBM emails from supoort looked, i decided to make an easy way for people to create html emails.

I created a simple xpages application where you paste in your html(may i suggest something based on OneUI) into a field, preview it, and then send it to yourself as an html email( so you can then forward it to whoever), It took 30 minutes.

Here is the form, i copied the source html from planet lotus and pasted into the html field. Of course not all images are full paths, so they are broken, but could be fixed easily.



The Xpage source Code :
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" style="padding-left:20px;padding-right:20px;padding-top:10px">

<xp:this.data>
<xp:dominoDocument var="document1" formName="main"></xp:dominoDocument>
</xp:this.data>
<xp:table style="width:100.0%">
<xp:tr>
<xp:td>
<xp:button value="Close" id="button4"><xp:eventHandler event="onclick" submit="true" refreshMode="complete">
<xp:this.action>
<xp:openPage name="/view.xsp"></xp:openPage>
</xp:this.action></xp:eventHandler></xp:button>
<xp:button id="button2">
<xp:this.value><![CDATA[Save & Close]]></xp:this.value>
<xp:eventHandler event="onclick" submit="true" refreshMode="complete">
<xp:this.action>

<xp:actionGroup>
<xp:saveDocument></xp:saveDocument>
<xp:openPage name="/view.xsp"></xp:openPage>
</xp:actionGroup>
</xp:this.action></xp:eventHandler></xp:button>
<xp:button id="button3" value="Send"><xp:eventHandler event="onclick" submit="true" refreshMode="complete">
<xp:this.action>
<xp:executeScript>
<xp:this.script><![CDATA[#{javascript:
doc1 = database.createDocument()
doc1.appendItemValue("Form","Memo")
var3 = document1.getItemValueString('html')
body = doc1.createMIMEEntity()
subject = body.createHeader("Subject")
subject.setHeaderVal(document1.getItemValueString('subject'))

stream = session.createStream()
stream.writeText(var3)


body.setContentFromText(stream, "text/html; charset=iso-8859-1", 0)

doc1.appendItemValue("SendTo", document1.getItemValueString('creator'))
doc1.send()
}]]></xp:this.script>
</xp:executeScript>
</xp:this.action></xp:eventHandler></xp:button>
</xp:td>
</xp:tr>
</xp:table>
<xp:br></xp:br>
<xp:label value="Mail To:" id="label3" style="font-weight:bold"></xp:label>
<xp:br></xp:br>
<xp:inputText id="inputText1" value="#{document1.creator}" disabled="true"><xp:this.defaultValue><![CDATA[#{javascript:@Name('[CN]', session.getEffectiveUserName())}]]></xp:this.defaultValue></xp:inputText>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:label value="Subject" id="label2" style="font-weight:bold"></xp:label>
<xp:br></xp:br>
<xp:inputText id="inputText2" style="width:400px" value="#{document1.subject}"></xp:inputText>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:label value="Paste in HTML" id="label1" style="font-weight:bold"></xp:label>
<xp:br></xp:br>
<xp:inputTextarea id="inputTextarea1"
style="width:610.0px;height:326.0px" value="#{document1.html}">
</xp:inputTextarea>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:button value="Refresh Preview" id="button1">
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete">
</xp:eventHandler></xp:button>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:label value="Preview" id="label4" style="font-weight:bold"></xp:label><xp:br></xp:br>__________________________________________________________________________________________________
<xp:br></xp:br>
<xp:br></xp:br>
<xp:text escape="false" id="computedField1"><xp:this.value><![CDATA[#{javascript:'<div id = "test me">' + document1.getItemValueString('html')+ '</div>'}]]></xp:this.value></xp:text></xp:view>

Tuesday, July 20, 2010

Why customers think Lotus is Legacy Software!

because they get emails like this from IBM about there products

Notice the 1995 era html table


Now here is an example from cdw, not the greatest but not bad either


Tuesday, July 6, 2010

New Blog Series - Taking Notes data offline(Add, Delete, Change) - HTML5

I am starting this new blog series with the intent of showing how to take Lotus Notes data offline on mobile devices, and have them "Replicate" back to the server sending and receiving any changes that have been made.

For this example i will use the Lotus Notes Journal/Notebook or whatever we are calling it these days, but we will not modify that template. Instead we will create a new database that will act as a proxy on the users behalf of locating and "Replicating" the journal file for the user who is logged in. It will store the data locally on the mobile device in a SQLite database.

When i am finished with this project my intent is to post the resulting code on OpenNTF.

So one caveat to begin with, and it really sucks, You must have Domino 8.5.2 beta to make this work. We need to use the cache manifest file which is an upcoming feature in 8.5.2.

Here is a link to the default database, there is way too much formatting, and that is not what this blog series is about.


This database contains an xpage, that is formatted really for any device. It will size to whatever size you need it. The xpage name is MyJournal.xsp. BTW use Google Chrome or Safari for correct rendering.



In the next post i will show how we will get our data from the journal file.





Wednesday, June 30, 2010

Lazy Admins and Notes Apps -' feed them to the wood chipper'

I am frustrated. I get emails like this all the time.

Hi

Mark,

Our Lotus Notes administrators block access to posting a new database on email server, such as the ITANA DB mentioned in your product write up....

I am using eProductivity template v2... and trying to get To Dos onto my iPhone.

Is there some way to run this locally or change mail template to include ITANA so I can update my iPhone?

Any other suggestions?

It reminds me of a video I watched yesterday. I did not create the video and have no idea who did.

Warning Language alert!



Friday, June 18, 2010

XPages Challenges with multiple data sources on one page, a UI example

I have a new project to write an expense report application. The requirements are a little different than normal, the users do not want dialog boxes for entries and they dont want to leave the page.

So i created an Xpage that is the expense form, it has the usual header information that this company likes. Then it has a data table to show the entries for each expense item. And it also has a form to enter new items in. Inside the data table is another form to edit that line item. This approach might look better in a grid format(excel style), but i have too little horizontal space for all my info. And of you course you could set edit mode to onclick of the row. This vertical style formatting of this app is because it will also be viewed for approval on iPhones.



Since the main expense form is open and in edit mode(document1 datasource) i leave all the settings for it alone.

For the form(document3 datasource) that actually enters new data in, i have to make some changes. In the properties of the panel that holds the data source for document3, i need to change the scope for the data to "request". That way after i save that document it sets that data source to a new document ready to be saved.




For the inside the data table edit form, i have to change some things as well. This datasource(document2), has to have the property "ignore request parameter", in the all properties panel under the datasource, set to true.



Why, i am not too sure, this data source is set to a document computed to edit document, with a computed docid, which is set by the button to edit that line item in the datatable. It all works now, it was just a little tedious finding out how to make it that way.

Tuesday, June 1, 2010

SQL Lite replication engine for HTML5(iPhone & Domino Data)

I have been working on ITANA to give it the ability to edit and add and delete records while offline. To do this i am using SQL lite as the data store for the iPhone or HTML5 enabled device. Then i "Replicate" it to the notes server via xhr requests.

Please help me with my logic, does this outline work? Am i missing something? What might be better?

Sql lite Replication engine


1. Get all documents from notes db and unids

2. For each notes doc check if local record exist

3. If local record exists check the last updated time of local record
and notes doc, if server doc is newer update local record, if the
local record is newer update the server record.

Check the delete status on the local record, if set to delete, delete
the server record and remove the local record.

4. If local record does not exist create one

5. Get all local records and unids.

6. Check if they exist on server, if local record has unid = new doc,
create doc on server and update the local record with real unid, else
delete the local record because it has been deleted on the server.

Monday, May 31, 2010

Thankful for freedom

I am truly blessed, on this day i remember all who have served our great Country in the cause of liberty and freedom. From their sacrifices we are given freedom here on Earth, so that we might have life, liberty and the pursuit of happiness.

My Lord and Savior shed his blood and gave His life, so that who ever believes in Him shall not perish but have eternal life, and that we may be free from the bondage of sin forever.

So it is up to us as free men and women, to honor these sacrifices with our lives- how we choose to live each day is our testament to what we have been given.

Let us make them proud.