iManage is a Document Management System (DMS). SkabelonDesign can integrate to both iManage 9 and iManage 10 in Word, Excel and PowerPoint.
This article will explain all the different configuration options. Use the Table of Contents below to navigate the article.
The integration requires the document to be saved into iManage before data can be inserted into the bindings.
Contents
- General
- iManage 9
- General
- Module
- Opening
- Manual update
- ReUse
- iManage 10
- General
- Module
- Opening
- Manual update
- ReUse
- Skip defined content control bindings for current session
- Update specific range of content controls
General [Back to top]
Important: When fetching data from iManage, the document or presentation must be saved to iManage in order to receive data. Hence, upon opening a document we will initiate a Save dialogue, and only after the user has saved the document to iManage, will we continue to fetch data from iManage.
In this section, we list all values we can bind to.
Binding
Here is an example of the binding in iManage:
{"SkabelonDesign":{"type":"Text","binding":"IMan.LastUser.Name"}}
Keys for binding
iManage provides the following keys for binding (Note all prefixed with "IMan."):
AccessTime
Archived
CheckedOut
CheckoutComment
CheckoutDueDate
CheckoutLocation
CheckoutPath
CheckoutTime
Comment
CreationDate
Description
EditDate
EditProfileTime
Name
Number
Version
RetentionDays
Type
imProfileCustom1
imProfileCustom(1...30)
imProfileCustom30
Values
The following values exist for both the LastUser and the Author of the document. It is prefixed with either "IMan.Author." or "IMan.LastUser."
Name
Custom1
Custom2
Custom3
Email2
Email3
Email4
Email5
DomainName
FullName
Fax
Location
Mobile
Pager
Phone
The following database values exists:
IMan.Database.Name
IMan.Database.Description
The following class values exists:
IMan.Class.Name
IMan.Class.Description
IMan.Class.RetentionDays
For folders, the following values can be accessed by prefixing with IMan.Folders[index]., where index is a number from 0 to the number of folders for this document, e.g. IMan.Folders[0]. ... IMan.Folders[NumberOfFoldersHere].
Name
Description
UserProperty1
UserProperty2
UserProperty3
iManage 9 integration [Back to top]
This integration requires plugin for DocumentData and SkabelonDesign IManage 9 VSTO. Typical setup utilizes DocumentData + TemplafyEvents.
The integration requires the document to be saved into iManage before data can be inserted into the bindings.
In order to fetch data from iManage, make sure your SDUP is equipped with the following:
iManage 9 plugin:
\SD.Installers\Integrations\SDUP_iManage9\files\ProgramData\OfficeExtensions\Plugins
Grab the entire IManage
folder.
iManage 9 adapter files:
\SD.Installers\Integrations\SDUP_iManage9\files\ProgramData\SkabelonDesign
Grab the entire IManage9
folder.
iManage 9 registry keys:
\SD.Installers\Integrations\SDUP_iManage9\files\Registry entries
Grab only the keys you need: Word
, PowerPoint
and/or Excel
.
Module
Further below are listed a few module examples.
This case shows the save as dialogue from iManage, and calls DocumentData to refresh data once saved.
<Cmd case="SkabelonDesign.Templafy.IManage:TemplafyDocumentStarted" ClassValueDocProp="iManageDocumentType" NoCCUpdate-1="xx">
ClassValueDocProp
can be blank. If it has a value, the save dialogue will have the "Document Class” prefilled based on the value in the document property by the given name. In this example, it will fill the value from iManageDocumentType
.
NoCCUpdate-1
you are able to define any number of CC titles to NOT be updated. This is to avoid flushing CCs with empty data. Increment number by 1 for each CC. This parameter can be used for command case RenewData as well.
It is possible to insert content into this command, so the “sub-commands” are executed once saved:
<Cmd case="SkabelonDesign.Templafy.IManage:TemplafyDocumentStarted" ClassValueDocProp="iManageDocumentType">
<Cmd case="BaseExtensions:update-fields"/>
<Cmd case="BaseExtensions:If" if-1-type="documentprop" if-1-key="FirstRun" if-1-value="true">
<True>
<Cmd case="BaseExtensions:AlertOk" title="Notice" text="Since this is the first time you open this document, make sure to save it to iManage to populate fields."/>
</True>
</Cmd>
</Cmd>
Example 1, Document opens from Templafy
<event type="TemplafyEvents:documentopen">
<Cmd case="SkabelonDesign.Templafy.IManage:TemplafyDocumentStarted">
<Cmd case="SkabelonDesign.DocumentData:EnablePendingChanges"/>
<Cmd case="SkabelonDesign.Templafy.IManage:RenewData"/>
<Cmd case="SkabelonDesign.DocumentData:Commit"/>
</Cmd>
</event>
This event will initiate a Save dialogue and once the user has saved the document to iManage, the data will be fetched and and ready for the transform and output steps.
Example 2, Manual update
<Button label="Renew Data iManage" icon="TableSharePointListsRefreshList" size="large">
<Cmd case="SkabelonDesign.Templafy.IManage:AppendDocumentId"/>
<Cmd case="SkabelonDesign.Templafy.IManage:RenewData"/>
</Button>
This button will simply fetch the latest data from iManage and populate all relevant bindings in the document. This button will NOT prompt user with a "Save as new version" dialogue.
Example 3, Reuse module (Word Only)
<Button label="Re-use Document (unformatted)" icon="ImportOpml">
<Cmd case="SkabelonDesign.ReuseDoc:Copy"/>
<Cmd case="SkabelonDesign.Templafy.IManage:CopyDocumentId"/>
<Cmd case="SkabelonDesign.ReuseDoc:TemplafyReuse" relativePathDocPropName="DisplayName" relativePathFallback="documents" closeSourceDocument="true">
<ReplacementMap>
<DocPropValue value="US Client">documents/americas/_us-client</DocPropValue>
<DocPropValue value="Litigation Attachment">documents/amsterdam/_litigation-attachment</DocPropValue>
</ReplacementMap>
<!-- Happens before template is selected, active document is the one I have open --> <PreCommands>
<!-- Extract etc. -->
</PreCommands>
<!-- User selects template at this point, active document is the one I open (new) --> <PostCommands>
<Cmd case="SkabelonDesign.ReuseDoc:Paste" formatted="plain" bookmarkName="bmkStart"/> </PostCommands>
<!-- Happens after the old document has been closed -->
<PostPostCommands>
<Cmd case="SkabelonDesign.Templafy.IManage:AppendDocumentId"/>
<Cmd case="SkabelonDesign.Templafy.IManage:SaveAsRenew"/> <Cmd case="SkabelonDesign.Templafy.IManage:RenewData"/>
<Cmd case="BaseExtensions:update-fields"/>
</PostPostCommands>
</Cmd>
</Button>
Example 4, update document when saved to iManage
<event type="SkabelonDesign.Templafy.IManage:AfterSavedDialogSuccess" showInPowerPoint="false" showInExcel="false" showInWord="true" showInOutlook="false">
<Cmd case="SkabelonDesign.Templafy.IManage:AppendDocumentId"/>
<Cmd case="SkabelonDesign.Templafy.IManage:RenewData"/>
</event>
iManage 10 integration [Back to top]
This integration requires plugin for DocumentData and SkabelonDesign iManage 10 IMCC package. Typical setup utilizes DocumentData + TemplafyEvents.
With iManage 10 it is also possible to automatically refresh fields when saved as new version.
The integration requires the document to be saved into iManage before data can be inserted into the bindings.
In order to fetch data from iManage, make sure your SDUP is equipped with the following:
iManage 10 plugin:
SD.Installers\Integrations\iManage 10\SDUP_iManage10\files\ProgramData\OfficeExtensions\Plugins\
Grab the entire IManage
folder.
iManage 10 registry keys:
You don't need any additional registry keys to run the iManage 10 integration, as they are contained in the IMCC package:
iManage 10 IMCC package (not in SDUP):
Besides equipping the SDUP with the plugin, an iManage Control Center (IMCC) package must be deployed from iManage. The package is a .zip file located here:
\SD.Installers\Integrations\iManage 10\IMCC package
The package should be sent to the person managing the client's iManage setup and deployed via the iManage Control Center.
Module
This case shows the save as dialogue from iManage, and triggers the iManage save event after running.
<Cmd case="SkabelonDesign.Integrations:ShowSaveDialog"/>
If a document property with the key iManageDocumentType
is present, it is inserted into the save as dialogue as “class” (similarly to iManage 9).
Example 1: Document opens from Templafy OR is saved
<event type="TemplafyEvents:documentopen">
<Cmd case="SkabelonDesign.Integrations:ShowSaveDialog"/>
</event>
<event type="SkabelonDesign.Integrations:AfterSavedDialogSuccess">
<Cmd case="SkabelonDesign.DocumentData:EnablePendingChanges"/>
<Cmd case="SkabelonDesign.Integrations:InsertLastDocumentData" prefix="IMan"/>
<Cmd case="SkabelonDesign.DocumentData:Commit"/>
<Cmd case="SkabelonDesign.Integrations:SaveActiveDocument"/>
</event>
This event will initiate a Save dialogue and once the user has saved the document to iManage, the data will be fetched and ready for the transform and output steps. Notice that there are two different events running, the latter of which runs every time a user saves a document back to iManage.
Example 2: Manual update
<Button label="Renew Data iManage" icon="TableSharePointListsRefreshList">
<Cmd case="SkabelonDesign.DocumentData:EnablePendingChanges"/>
<Cmd case="SkabelonDesign.Integrations:FetchToInsertLastDocumentData"/>
<Cmd case="SkabelonDesign.Integrations:InsertLastDocumentData" prefix="IMan"/>
<Cmd case="SkabelonDesign.DocumentData:Commit"/>
</Button>
This button will simply fetch the latest data from iManage and populate all relevant bindings in the document. This button will NOT prompt user with a "Save as new version" dialogue.
Example 3: Reuse module (Word Only)
This module requires reuse. It must be used in conjunction with the AfterSavedDialogSuccess
event, since this part triggers the actual update of the document bindings.
<Button label="Re-use Document (unformatted)" icon="ImportOpml">
<Cmd case="SkabelonDesign.ReuseDoc:Copy"/>
<Cmd case="SkabelonDesign.ReuseDoc:TemplafyReuse" relativePathDocPropName="DisplayName" relativePathFallback="documents" closeSourceDocument="true">
<ReplacementMap>
<DocPropValue value="US Client">documents/americas/_us-client</DocPropValue>
<DocPropValue value="Litigation Attachment">documents/amsterdam/_litigation-attachment</DocPropValue>
</ReplacementMap>
<!-- Happens before template is selected, active document is the one I have open -->
<PreCommands>
<!-- Extract etc. -->
</PreCommands>
<!-- User selects template at this point, active document is the one I open (new) -->
<PostCommands>
<Cmd case="SkabelonDesign.ReuseDoc:Paste" formatted="plain" bookmarkName="bmkStart"/>
</PostCommands>
<!-- Happens after the old document has been closed -->
<PostPostCommands>
<Cmd case="SkabelonDesign.Integrations:ShowSaveDialog"/>
</PostPostCommands>
</Cmd>
</Button>
Skip defined content control bindings for current session
The following command is useful when some content control should be skipped when data from iManage are renewed (only Word).
<Cmd case="SkabelonDesign.DocumentData:SkipDefinedCcBindingsForCurrentSession" noccupdate-1="x"/>
Within the parameter noccupdate-1
we define the binding of the particular content controls that should be skipped. Notice that we are able to define as many content control bindings as needed by repeating the parameter and replacing 1
with 2
and so on.
Here is an example:
<Button label="Renew Data iManage" showInExcel="false" showInPowerPoint="false">
<Cmd case="SkabelonDesign.DocumentData:EnablePendingChanges"/>
<Cmd case="SkabelonDesign.Integrations:InsertLastDocumentData" prefix="IMan"/>
<Cmd case="SkabelonDesign.DocumentData:SkipDefinedCcBindingsForCurrentSession" noccupdate-1="QueryField.custom1_description" noccupdate-2="QueryField.custom2_description"/>
<Cmd case="SkabelonDesign.DocumentData:Commit"/>
</Button>
Update specific range of content controls
We are able to perform a lookup and ensure that only a specific range of content controls are updated with data from iManage with the following command:
<Cmd case="SkabelonDesign.Integrations:QueryFromNamedContentControl" ContentControlName="X"/>
This command takes a query from the particular content control which is defined in the parameter ContentControlName
. It will stop the chain of execution if there is no result.
The content control defined in the parameter must contain the following binding in its tag:
{"SkabelonDesign":{"keys":["key1", "key2"], "Delimiter":"."}}
The keys are what we search for (keys to query iManage for when searching) and the delimiter is the character used to separate the values. The delimiter can be omitted but only if there is only one key.
The key(s) must then be in the binding of the/those content control(s) that are to be updated based on the query.
Example of context and configuration
The following example is from a client solution. The case here is that the client has three fields in their template, Client Matter, Client Name and Matter Name. Based on what is defined in the Client Matter field (the QueryInput content control), the two remaining fields should be updated respectively.
The user will input the client matter (the File No. field), which is the query, and then the lookup writes to the content controls for client name and matter name. These two content controls have iManage bindings, and thus they will be updated.
<Button label="iManage Lookup">
<!-- Query, will stop the chain of execution if no result -->
<Cmd case="SkabelonDesign.Integrations:QueryFromNamedContentControl" ContentControlName="QueryInput"/>
<!-- Enable pending changes -->
<Cmd case="SkabelonDesign.DocumentData:EnablePendingChanges"/>
<!-- Fetch result from query -->
<Cmd case="SkabelonDesign.Integrations:InsertLastDocumentData" prefix="QueryField"/>
<!-- Insert into named contentcontrols only -->
<Cmd case="SkabelonDesign.DocumentData:Commit" InsertValueContentControls="QueryField"/>
</Button>
The query content control contains the following binding in its tag:
{"SkabelonDesign":{"keys":["custom1", "custom2"], "Delimiter":"."}}
This case with above entry will search for custom1=1001&custom2=004.
iManage 9 and 10 environments [Back to top]
The solution can support both iManage 9 and 10 environments in one configuration. The configuration needs to identify the environment and act as a iManage 9 or iManage 10 integration respectively.
Identify environment
There is no native property in iManage that OfficeExtensions can read to identify if it is iManage 9 or 10.
The solution to this is to have client IT set a registry key to mark an iManage 10 environment. BaseExtensions can then use events and commands in if-statements to run the appropriate commands based on whether it is 9 or 10.
Please note the following limitations for the registry key.
HKLM
It cannot be outside the Wow6432Node hive:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\
Example:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Clientname
"Work10_Installed"=dword:00000001
HKCU
REG_DWORD is not supported - use REG_SZ (string) type values
HKEY_CURRENT_USER\SOFTWARE\
Example:
HKEY_CURRENT_USER\Software\Clientname
"Work10_Installed"="True"
Coexisting Plugins
The plugin for iManage integrations for both 9 and 10 have the same name , IManage
. To accommodate both, change the name of the iManage 10 plugin to something else e.g. "Sd.Integrations".
Differences between iManage 9 and 10
One client experienced having the "Document Class” field paired custom document proptery, iManageDocumentType in the template caused saving to fail in iManage 10.
Full message:
Deleting the custom document property from the template made it work in iManage 10.
Changing the value to the alias for the class property allowed the template to work in both environments.
Comments
0 comments
Article is closed for comments.