Ben Langhinrichs

Photograph of Ben Langhinrichs

IBM Champion logo

E-mail address - Ben Langhinrichs






September, 2018
SMTWTFS
      01
02 03 04 05 06 07 08
09 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

Search the weblog





























Genii Weblog


Civility in critiquing the ideas of others is no vice. Rudeness in defending your own ideas is no virtue.


Thu 6 Sep 2018, 02:57 PM
Given Tim Davis' recent post, Things to know with JavaScript – JSON, let, const, and arrows, I thought it might be a good time to follow up my recent post on a RESTful interchange between Notes and Salesforce,  and show the JSON I used to push the Notes data to Salesforce. While the raw JSON data (generated using our Midas LSX) is shown below, I'll mention a few of the specifics so you know what you are seeing.
 
1) The Id is the Salesforce ID for the Contact sObject, saved from a previous push of the Salesforce data into Notes to make the roundtrip easier.
 
2) The NotesUNID__c is a custom Salesforce field I added to the ID for the Contact sObject. Salesforce always appends __c to such fields. This is used to make the roundtrip easier from the other direction. This item is created automatically when Midas is told to use JSONFormat='Salesforce'.
 
3)  The AccountID is taken from our document's CompanyName item. It is a native Saleforce field, so doesn't have the __c at the end. Below the JSON, I'll show the export directive which told Midas to call this AccountID. Note that JSON is in UTF8, so this looks Über Øst instead of like Über Øst.
 
4) Phone is a native Salesforce field on the Contact sObject. It is taken from our Tel item.
 
5) Name is a native Salesforce field on the Contact sObject. It is created from a formula language combination of the FirstName and LastName items on our Notes document.
 
6) Email is a native Salesforce field on the Contact sObject. It is taken from the Email item, so doesn't need a mapping.
 
7) SampleBody__c is another custom Salesforce rich text area field I added to the Contact sObject. It is taken from the Notes rich text item, rendered in high fidelity by Midas.
 
{
   "Id": "0030b000023PlWQAA0",
   "NotesUNID__c": "E04775C6408795F4852582F8004945F7",
   "AccountID": "Über Øst",
   "Phone": "+31 025‒6206230",
   "Name": "Gunder van der Wilcox",
   "Email": "GvdWilcox@UberOst.com",
   "SampleBody__c": "<div style=\"line-height:normal;\"><span style=\"font-size: 10pt; font-family: sans-serif; \"><\/span><\/div><div align='left'><table cellspacing='0' cellpadding='0' style='width:430px;border-spacing:0;padding:none;border-collapse:collapse;table-layout:fixed;'><colgroup><col style=\"width:44%;\" \/><col style=\"width:26%;\" \/><col style=\"width:26%;\" \/><\/colgroup><tr style='vertical-align:top;'><td width='191' bgcolor=\"#ffffff\" rowspan='3' style=\"padding: 0.0000in 0.0201in; border:1px solid #000000;\"><div style=\"margin-left:1%; margin-right:1%; text-indent:1%;\" align='left'><img src=\"E04775C6408795F4852582F8004945F7_Notes_0_482.jpg\" alt=\"Inline JPEG image\" height=\"72\" width=\"39\" align='right' style=\"border:none;\" \/><span style=\"font-size: 8pt; font-family: sans-serif; \">Customer<br \/><\/span><span style=\"font-size: 10pt; font-family: sans-serif; \"><strong>Better Budgies Ltd<br \/><\/strong><\/span><span style=\"font-size: 10pt; font-family: sans-serif; \">The Aviary Group<br \/><br \/>Swallowdale 36, South Wutherford<br \/>ESSEX BB01 1BB<br \/>United Kingdom&nbsp;<\/span><\/div><\/td><td width='114' bgcolor=\"#ffffff\" style=\"padding: 0.0000in 0.0201in; border:1px solid #000000;\"><br style=\"clear:both;\"\/><div style=\"margin-left:1%; margin-right:1%; text-indent:1%;\" align='left'><span style=\"font-size: 10pt; font-family: sans-serif; \">Date<\/span><\/div><div style=\"margin-left:1%; margin-right:1%; text-indent:1%;\" align='left'><span style=\"font-size: 10pt; font-family: sans-serif; \">05\/17\/2002<\/span><\/div><\/td><td width='114' bgcolor=\"#ffffff\" style=\"padding: 0.0000in 0.0201in; border:1px solid #000000;\"><div style=\"margin-left:1%; margin-right:1%; text-indent:1%;\" align='left'><span style=\"font-size: 10pt; font-family: sans-serif; \">Quotation Number<\/span><\/div><div style=\"margin-left:1%; margin-right:1%; text-indent:1%;\" align='left'><span style=\"font-size: 10pt; font-family: sans-serif; \">QN&#8722;99283-MM2<\/span><\/div><\/td><\/tr><tr style='vertical-align:top;'><td width='114' bgcolor=\"#ffffff\" style=\"padding: 0.0000in 0.0201in; border:1px solid #000000;\"><div style=\"margin-left:1%; margin-right:1%; text-indent:1%;\" align='left'><span style=\"font-size: 10pt; font-family: sans-serif; \">Customer Reference<\/span><\/div><div style=\"margin-left:1%; margin-right:1%; text-indent:1%;\" align='left'><span style=\"font-size: 10pt; font-family: sans-serif; \">BL10923-B573<\/span><\/div><\/td><td width='114' bgcolor=\"#ffffff\" style=\"padding: 0.0000in 0.0201in; border:1px solid #000000;\"><div style=\"margin-left:1%; margin-right:1%; text-indent:1%;\" align='left'><span style=\"font-size: 10pt; font-family: sans-serif; \">Terms of Payment<\/span><\/div><div style=\"margin-left:1%; margin-right:1%; text-indent:1%;\" align='left'><span style=\"font-size: 10pt; font-family: sans-serif; \">30 days net<\/span><\/div><\/td><\/tr><tr style='vertical-align:top;'><td width='114' bgcolor=\"#ffffff\" style=\"padding: 0.0000in 0.0201in; border:1px solid #000000;\"><div style=\"margin-left:1%; margin-right:1%; text-indent:1%;\" align='left'><span style=\"font-size: 10pt; font-family: sans-serif; \">Valid to<\/span><\/div><div style=\"margin-left:1%; margin-right:1%; text-indent:1%;\" align='left'><span style=\"font-size: 10pt; font-family: sans-serif; \">06\/17\/2002<\/span><\/div><\/td><td width='114' bgcolor=\"#ffffff\" style=\"padding: 0.0000in 0.0201in; border:1px solid #000000;\"><div style=\"margin-left:1%; margin-right:1%; text-indent:1%;\" align='left'><span style=\"font-size: 10pt; font-family: sans-serif; \">Delivery Time<\/span><\/div><div style=\"margin-left:1%; margin-right:1%; text-indent:1%;\" align='left'><span style=\"font-size: 10pt; font-family: sans-serif; \">2 Wks<\/span><\/div><\/td><\/tr><\/table><\/div><div align='left'><span style=\"font-size: 10pt; font-family: Verdana; \"><\/span><\/div>"
}
 
To generate all this, I used our Export to JSON sample db. This is the Export Directive form, which allows a coding-free definition of what is to be exported.. I am only exporting a single document by UNID, but we can generate by view or selection formula or whatever. Note that with the fields to export, we start with the source item or formula, then an equals sign, then the name to use inside the JSON, so FirstName+" "+LastName=Name uses the formula FirstName+" "+LastName to added the Name in the JSON. This can be any Notes formula, including ones that use @DbLookup, for example.
 
Inline JPEG image
 
So, that is how I generated the JSON to use in the RESTful exchange going from Notes to Salesforce. I'll show the other way around in a future post.

Copyright © 2018 Genii Software Ltd.

Tags:

Wed 29 Aug 2018, 10:31 AM
Over the past few years, we have expanded our offerings at Genii to allow more exchanging of data. To be honest, most of it has been outgoing, whether migrating Notes data to SharePoint or many other systems, or simply rendering Notes information to be more consumable on the web. We have added support for CSV to allow large batch exports, but also JSON to allow more RESTful exchanges. Rich text is included, of course, but much of the focus is on powerful extraction of data of all sorts.
 
It is with that latter goal in mind that I have been working with a few different systems including SharePoint, Confluence, and Salesforce. But times are changing. There are many positive signs out of IBM and HCL about the soon-to-arrive Notes/Domino 10, as well as future, even more ambitious plans for Notes/Domino 11. With that in mind, I am focusing a little more energy on drawing date into Notes/Domino.
 
One example of the work I have been doing is between Notes/Domino and Salesforce, because the latter has grown by leaps and bounds in popularity. But most companies don't get to choose either Notes/Domino OR Salesforce. Instead, they are left with Notes/Domino AND Saleforce. With that in mind, I am working on how to use a REST interface as well as events in Notes/Domino and the Streaming API in Salesforce to move data back and forth, either keeping it in sync or storing the appropriate pieces of one system in the other as needed. Notes/Domino has its advantages, Salesforce has different ones. Companies which can easily share and exchange information between them can pick and choose where an application or data resides, which may not be the same place it is collected.
 
Getting all of that in place will take a while, and I hope to document some of the steps. Obviously, we would welcome any companies that want to use our products now to move data, but we will also try to be transparent about the advances we make. As a simple example of how extensive this can be, I show here some fields including a Notes rich text field moved to a Salesforce Contact with a rich text area field.
 
The following is after the POST to Salesforce (red arrows show updated fields).
 
Inline JPEG image
 
 
 
And this is the source in Notes/Domino (red arrows show fields to use for REST).
 
Inline JPEG image
 
So far, it is pretty good, but we intend to improve it. If you would like to be part of a test with some of your data, contact me and we'll work it out.
 

Copyright © 2018 Genii Software Ltd.

Tags:

Mon 20 Aug 2018, 02:32 PM
I've spent the past couple of weeks working with Trailhead, the excellent (and free) gamified learning system provided by Salesforce. As I dive deeper into Salesforce, I am impressed by the parallels with Notes/Domino, but also intrigued by the differences. My goal is not to leave Notes/Domino, but to provide our customers with the appropriate solutions for their needs. That might be Notes/Domino or might be Salesforce, but it also might be that they need Salesforce with a dash of Domino, or Domino with a soupçon of Salesforce.
 
We fill the needs our customers have. If we need to extend Salesforce or extend Notes/Domino, we can do it; So, if you are one of our Notes/Domino customers and see my Salesforce posts, know that I am learning from the competition (imitation being the sincerest form of flattery). If you used to be on Notes/Domino and remember our products, but have moved to Salesforce since, know that I am looking at ways to bring the best of both Genii Software's products and Notes/Domino to Salesforce where appropriate.
 
Of course, there is also an excellent chance that your company has both Salesforce and Notes/Domino. In that case, know that one focus will be on moving data back and forth seamlessly on demand. I have already been playing with the Bulk Load API in Salesforce and the Midas LSX to move data quickly and easily. The JSON support built into Genii's products allows for RESTful interchanges and high fidelity. More on that later, but if you would like to discuss your needs or ask any questions, don't hesitate to contact me.

Copyright © 2018 Genii Software Ltd.

Tue 7 Aug 2018, 03:59 PM
I am working with a Notes/Domino customer with a large quantity of email in Notes databases they wanted archived outside of Notes, and they are considering  CoexLinks Migrate. At first, they seemed dubious about the importance of how well email renders (a topic as exciting as mixing cement), but one of the people in the meeting had come across a blog post I made about forms that had been mailed where data disappeared when rendered. Disappearing data caught the attention of the lead person, who asked that I demonstrate. The only problem is, the customer is still not sure whether they want the email archived as EML or HTML, possibly both. 
 
The scenario is quite simple and happens all the time. A user is looking at a form, and forwards it to somebody else with a question or request for action. Since Notes rich text forwards well, they think nothing of it, and the content shows just as it did in the database. But when it leaves Notes, whether right then as an email or later when archived to another format, more than the appearance is lost.
 
I can't share customer data, so I used a simple example from a Notes database I use to track orders and maintenance. It has some common form elements, nothing fancy. Note that this same engine with some variants is used for CoexLinks FidelityCoexLinks Journal and CoexLinks Migrate, and a similar engine is used for application data with AppsFidelity.
 
As I mentioned before, the compelling part of this is not just what is preserved, but that it may be your last chance to preserve it. The customer never wants to deal with the Notes databases again, so this is a last chance to get the data out. It better all be there, or it is effectively lost.
 
What may be lost when archiving/emailing outside of Domino without CoexLinks
Inline JPEG image
 
 
1) Notes form open in Notes client (original data+looks)
Inline JPEG image
 
 
 
2) The form forwarded via Notes email, still in rich text (data+looks preserved)
Inline JPEG image
 
 
 
3) The email archived to EML using simple File Save... or native API (data+looks lost)
Inline JPEG image
 
 
 
4) The email archived to EML using CoexLinks Migrate (data+looks preserved)
Inline JPEG image
 
 
5) The email archived to HTML using CoexLinks Migrate (data+looks preserved)
Inline JPEG image
 
 
Fill out a CoexLinks Migrate evaluation request and try for yourself,
 
 
6) The email as it arrived in Outlook 365 using Domino email (data+looks lost)
Inline JPEG image
 
 
 
7) The email as it arrived in Outlook 365 with CoexLinks Fidelity (data+looks preserved)
Inline JPEG image
 
 
Fill out a CoexLinks Fidelity evaluation request and try for yourself,
 

Copyright © 2018 Genii Software Ltd.

Tags:

Fri 27 Jul 2018, 03:02 PM
Inline JPEG image
 
Had a great conference. Loved seeing everybody and hearing more about Domino 10 (though I'd have liked to see more demos). Optimism was running higher than in the past few years. Now HCL just has to deliver (which they seem hellbent on doing, and having a fair degree of success by most accounts). This time next year, I should be writing my blog post on Notes 10 and talking about Notes 11 features, which seems nigh on miraculous after the past few years.
 
Thanks to Richard Moy and all the sponsors for the hard work, money and commitment such a conference takes. Well done!
 
My slides and samples are up on http://geniisoft.com/db/CollabSphere2018 for download. If anybody has any questions, don't hesitate to ask, as some of the slides may require additional explanation.

Copyright © 2018 Genii Software Ltd.

Thu 14 Jun 2018, 11:23 AM
This is the sixth in a series on configuring and customizing CKEditor. While some applications such as discussions may have a single rich text field, there are many where multiple rich text fields are available to include different steps or kinds of information. In these applications, the repeated toolbars and attachment sections may overwhelm the page. In this post, I'll show how you can disconnect the toolbar from the top (or bottom) of the rich text, and then share the same toolbar between multiple rich text fields.
 
1) Our goal is one toolbar which will work with multiple different rich text fields
The toolbar will understand where the cursor is, so the toolbar actions will act on that rich text.
 
Three rich text fields with one shared toolbar
 
 
2) Setting up the location of the toolbar and bottom status bar
There are actually three parts of the CKEditor to worry about. The first is the editor area itself, which is defined by where the rich text field appears. That's the obvious one. The other two are the toolbar and the bottom bar, which is the status line which appears at the bottom of the editor space in a standard CKEditor configuration. Both the toolbar and bottom bar can be shared. In this case, I went one further and hid the bottom bar. There may be a better way to disable it (let us know in the comments!), but this is what I came up with.
 
Three rich text fields with one shared toolbar
 
 
3) Adding and setting the 'sharedspaces' addin
Now that we have the divs set where we want the toolbar and bottom bar, we go ahead and add an extraplugin for 'sharedspaces'. You'll notice I also added 'autogrow' which is a useful feature that allows the rich text field editor to grow with the content. I set the minimum and maximum height for the autogrow so that it worked well with the page. Then I set the sharedspaces top and bottom values to the ids of the divs. Again, there is likely a better solution to redefining the toolbar the exact same way for each field, but this worked.
 
Three rich text fields with one shared toolbar
 
 
4) There is a great deal of flexibility possible, including side-by-side fields and a vertical toolbar
This example shows three rich text fields side-by-side. At first, I put the toolbar at the top as in my earlier example, but then decided it would be more useful to have a vertical toolbar. I should note that I spent way too long trying to make the toolbar go vertical with separators and such before realizing I just needed to put it in a column with only room for one icon at a time.
 
Three rich text fields with one shared toolbar
 
 
5) XPages, a fixed location toolbar and other thoughts
While I only showed Classic design for this demo, the process is very similar for XPages. The extraplugins get added with dojoattributes, while the shared spaces are set like a custom tooIbar with another dojo attribute. The only trick is making sure your div ids work properly in XPages, which likes to mess with such things. As for a fixed location toolbar, I didn't create an example for it, but it would be easy to put the toolbar div into a non-scrolling area of the form while the rich text fields were in a scrolling part. Do you have other ideas about how and where to use the toolbar that might not be obvious? Do you have specialized fields that are implemented other ways such as popups or floating pages? Leave a comment and let us know.
 
 
All topics in the series
 
 

Copyright © 2018 Genii Software Ltd.

Tags: