Extraattributes
Documentation
Inhalt
======
1. ExtraAttributes Classification Plugin 6
2.4 Number (with Optional Mask) 10
2.7 Date with only Day,Month,Year 11
2.12 Lookup RepositoryId (pre-defined) 15
2.12.1 Dependent Lookups (2018.3) 16
2.13 FullText Lookup (2018.3) 17
2.14 Embedded multiple entries (grid) 17
2.15 Dynamic image based on value of an Attribute 19
4.1 Input Masks (Text / Number) 22
4.3 Grid Summary (Fulltext indexing) 27
4.4 Expressions and the Expression Builder [2018.1] 28
4.5 Required/Readonly Expressions [2018.1] 29
4.5.1 Security based expression [2018.3] 29
4.5.2 Example: Required Expression based on a Checkbox 30
4.7 Grid Control Button Bar 30
4.7.1 Grid Control Bar -- AddLink Dialog 31
4.10.1 RegularExpressionValidationRule 33
4.10.2 OnlineIBANValidationRule [2018.1] 33
4.10.3 DateHigherThanValidationRule 33
5.1 Attribute's DisplayName 34
6.4 Layout Boxes Configuration -- Experimental [2018.1] 35
6.4.1 Example: GroupBox visibility based on Checkbox 36
6.6 Example Tab Layout [2018.1] 39
7. DataProviders and Sources 40
7.1 Folder_* and Document_* 41
7.2 SearchValue and EditValue [2018.1] 41
9. Recipes (Examples, Use Cases, etc...) 46
9.1 RE-Use a Repository Lookup in Multiple Folders 46
9.2 Editing a Repository Lookup from the Client 46
ExtraAttributes Classification Plugin
The ExtraAttributes and ExtraDocAttributes implement the inPoint IClassification Plugin in order to extend the standard Forms, and are also extensible with their own Plugins (in fact, almost everything inside the ExtraAttributes is implemented as a Plugin).
TL;DR
The ExtraAttributes Classification Plugin:
-
can be used either for Folders (ExtraAttributes) or Documents (ExtraDocAttributes)
-
supports an unlimited number of Attributes
-
support multiple types (aka EditorControl -- built-in or extensible)
-
each loading/saving data from any DataSource (built-in or extensible)
-
supports fields Validators (built-in or extensible)
-
supports Expressions (e.g. for Readonly or Required flags)
-
show a custom Layout (with groups, tabs, columns, etc...)
Setup
The ExtraAttributes Classification plugin is part of the core installation and resides inside the inPoint.Plugins.dll so you only need to add to your chosen Format:
-
Create a new ElementFormat (or New Folder with new Element Format)
-
In the Plugins Tab, click the + Button (on the right) to add a new Plugin
-
Choose the ExtraAttributes or ExtraDocAttributes
-
Check the Box under the column „Enable" (otherwise it will not be visible)
-
Click the gear Button (on the right) to open the ExtraAttributes Configuration Dialog
Editors
Editors (aka EditorControls) are the visible part that let the user interact with a certain Attribute.
Each Attribute can only have one EditorControl, and their functionality greatly varies.
inPoint comes with a pre-defined set of EditorControls, but it's „easy" to extend and create new ones.
All Attributes share the following properties:
-
Common Name (required): identifier (no spaces nor special characters, must begin with a letter)
-
Display Name (optional): the label to show to the user (will eventually be language based)
-
If none set it will convert adjust the Common Name (replace _ with spaces, capitalize letters)
-
enter one space to „hide" it (e.g. for Grids)!
-
-
Editor Type (required, Default: Text): which editor to use
-
Editor Parameters: each Editor has it's own set of properties
-
Data Source (required, Default: Blob): storage of this attribute's value(s)
-
[2018.1] ReadOnly (required, Default: No): whether the user is allowed to edit this; can specify an Expression to be evaluated only at startup (no dynamic evaluation)
-
[2018.1] Required (required, Default: No): whether a value is required; can specify an Expression to be evaluated only at startup (no dynamic evaluation)
-
Validation/Validation Properties (optional): which Validation Plugin to use
-
[2018.1] Default Value (optional): which value to initially assign
Text - one line
Parameters: [2018.1]
-
Max Length: maximum number of characters allowed (as a Validation step), use 0 for no limit
-
Input Mask: what the user is allowed to type (which characters, which length). See Input Masks (Text / Number)
Default Value:
- You can use an Expression or set a string (with single quotes!)
NOTES:
-
you cannot use both Max Length and Input Mask or you'll get inconsistencies in the validation.
-
The Mask is practically limits what the user can type -- so even before Validation kicks in
Examples:
- ###### - only 6 numbers allowed
Memo (multi-line)
Parameters:
-
Max Length: maximum number of characters allowed (as a Validation step), use 0 for no limit
-
Height: the default initial height (will auto-grow)
Default Value:
- You can use an Expression or set a string (with single quotes!)
Email Address
Notes:
-
Automatic validation of email address
-
Will be included in ArchiveDialog suggestions (future plans)
-
Can be used to directly email (in the Contacts grid)
Default Value:
- You can use an Expression or set a string (with single quotes!)
Number (with Optional Mask)
Parameters: [2018.1]
- Input Mask: what the user is allowed to type (which characters, which length). See Input Masks (Text / Number)
Default Value:
- You can use an Expression or set a number
Slider
Currency
Parameters:
- Input Mask: what the user is allowed to type (which characters, which length). See Input Masks (Text / Number)
Default Value:
- You can use an Expression or set a number
Examples:
- double:5.2 €
Date with only Day,Month,Year
Notes:
-
DateTime Picker -- per default in Edit Mode will include Date & Time -- but in View Mode will show only Date
-
The „Editor Parameter" here specifies the Edit Mode Mask
Default Value:
- You can set today's date by using an Expression; {Date}
Examples:
- dd.MM.yyyy
Boolean as Toggle
Default Value:
- You can a Boolean Expression or set a value, True or False
Boolean as Checkbox
Notes:
- A Checkbox has 3 states:
- Unset
- Checked (True)
- Unchecked (False)
- The „Unset" state is what allows the „Is Required" validation to
work -- meaning the user did not select anything yet.
- If you do not wish to have the Unset state set a Default Value
of either True or False (depending on your needs)
Default Value:
- You can a Boolean Expression or set a value, True or False
List as Dropdown
Will show the user a locally pre-defined dropdown selection list with a search-as-you-type filter function.
Parameters:
-
Values: enter all Values the user can choose from
-
Multiple?: whether multiple selection is allowed -- if checked will show checkboxes in the list next to each item, and the final Value is a CSV (Comma-Separated) list of all the selected Values
-
Contains Operator?: whether Search-as-you-type should use a „Starts With" (Default) or „Contains"
Default Parameter:
-
You can use an Expression or set a string (with single quotes!)
-
In case of Multiple Selection you can enter a CSV list of values (each wrapped in single quotes)
List of Radio Buttons
Parameters:
-
Values: enter all Values the user can choose from
-
Orientation: Horizontal or Vertical
Default Parameter:
- You can use an Expression or set a string (with single quotes!)
Lookup RepositoryId (pre-defined)
Will show the user a remote Lookup Repository (SQL) pre-defined dropdown selection list with a search-as-you-type filter function.
Parameters:
-
Repository: select a pre-defined Lookup Repository
-
Multiple?: whether multiple selection is allowed -- if checked will show checkboxes in the list next to each item, and the final Value is a CSV (Comma-Separated) list of all the selected Values
-
Contains Operator?: whether Search-as-you-type should use a „Starts With" (Default) or „Contains"
-
Display Column: which column to use for the display value (Default: VALUE)
-
Value Column: which column to use for the key value (Default: VALUE)
-
[2018.1] Search Value: when using a different „Display Column" you can configure here which rows to filter based on the VALUE column (see SearchValue and EditValue)
Default Parameter:
- Does not work here (yet)
Dependent Lookups (2018.3)
You can now define the „parent" lookup (e.g. for a Geography) shown as multiple attributes. For this to work you need to setup the Lookup Repository PARENT_SEQID correctly (in the DB).
This works in both directions -- top-down will limit the available values, bottom-up will update all related fields.
FullText Lookup (2018.3)
Just as the other lookups, only the values are retrieved from a specific named field from the Fulltext index.
Embedded multiple entries (grid)
Parameters:
-
[2018.1] Max Height (default: 150): the Grid's maximal height (in pixels), after that scrollbars (inside the Grid) will appear. Use -1 to let the Grid grow as needed (so never show scrollbars in the Grid itself)
-
SEQID Column: which column (from the defined Columns) to use as the SEQID identifier (used by GridRepository and LinkedGridRepository when saving/loading from the data source -- if you use BLOB as a DataSource then you can leave this empty)
-
Sort Column: which column (from the defined Columns) to sort per Default.
-
Sort Direction: in which direction (Ascending/Descending) to sort per Default.
-
Columns: the list of Columns (=Attributes) to include in the Grid. Note that these must first be created as Attributes (with the correct format, DataSource can be set to None) before you can add them in here. Each column can then:
-
Field: which attribute to use from the predefined Attributes
-
Visible (default: Yes): whether it's shown to the user
-
Outlook Contact (default: None): mapping to a VCard field when dropping an Outlook Contact card onto the Grid
-
[2018.1] Width (default: 0): the column's width (in pixels) in the grid, use 0 for auto adjust. Note that if you want to avoid scrolling jumps (since column contents change) you should set this to a value (user can always resize those columns later)
-
Default Parameter:
- Does not work here (yet)
Readonly:
- ReadOnly Grids are used for the Master/Detail view
Required:
- Setting the Required Validation for a Grid means it must have at least one (validated) row
Drag&Drop:
- You can Drop an Outlook Contact directly onto the Grid and if the mapped Outlook Columns will be filled (see Outlook Contacts)
Context Menu:
-
Right click on a Row (or Multiple Rows) will show a Context Menu with following commands:
-
Delete -- delete row(s)
-
Email -- only visible if any of the Columns is an Attribute using Format "Email"
-
Export to Excel -- will export the Grid contents (current Page) to Excel
-
Notes:
-
If the Name is prefixed with Folder_ (or Document_) as described in Folder_* and Document_*) the inPoint Field must be of type TEXT and the Grid will write back all visible text (As if it was a Memo field) into the specified inPoint Field; this is used as simple alternative for Fulltext Indexing of Grid contents (as a whole, without an Attribute split)
-
GridControlBar allows to visualize Grid commands (see Grid Control Button Bar)
-
Grids can use special DataSources written specifically for the Grid (GridRepository and LinkedGridRepository) to save/load data from a Repository Lookup (SQL Table)
-
[2018.1] Server-Side Paging/Filtering also available, they can be enabled at the Datasources configuration (see GridRepository and LinkedGridRepository)
Dynamic image based on value of an Attribute
Show an image whereby the name is based on values of other attributes.
Notes:
-
The image file must exist on the Server side web\plugin\client\core and will be automatically downloaded to the client
-
The optional "=50" specifies the max image height
-
Works now also as Column in Embedded Grid
Hyperlink
Notes:
-
Support any http:// URLs, as well as pam-item:// links -- the latter will open it inside the running instance of inPoint.Client and not launch a new one
-
can be filled either by:
-
a Plugin
-
linked Folder_* field
-
pre-defined in the Editor Parameters
-
-
if it's empty and the user clicks the Link an error Dialog will popup
Button
Parameters:
- CommandAction: one pre-defined (and included in the Plugins) CommandAction that will be executed once the user clicks the button
Lookup Repositories
A Lookup Repositories is basically a custom user-specified SQL Table (inside the inPoint DB Default Schema) that MUST include at the bare minimum those 3 columns:
-
SEQID (pkey, int, auto, not null) -- SequenceID to identify the Row; automatically set by the DB
-
PARENTSEQID (int, null) -- SequenceID or the parent row
-
VALUE (nvarchar, null) -- the display value
You can add any custom column you wish. Such a Table is then either imported (or optionally created from scratch) using the inPoint.Admin (see external documentation) -- only then it can be used in inPoint as a Lookup Repository.
Such a Repository can then be used:
-
To feed values to a selection list (e.g. Lookup RepositoryId (pre-defined))
-
As datasource for the Grids GridRepository and LinkedGridRepository)
Note that there is no type mapping between ExtraAttributes values and the columns -- it's your responsibility to make sure Text data is used in nvarchar columns, Date in DateTime and so on...
Editors Advanced Topics
Input Masks (Text / Number)
https://www.infragistics.com/help/wpf/xaminputs-masks
Mask Character Title Use with: Description # Digit placeholder xamCurrencyInput xamNumericInput xamMaskedInput Characters must be numeric (0-9) and entry is required. Example: (###)-###-####. . Decimal placeholder xamCurrencyInput xamNumericInput xamMaskedInput Characters are required as specified as the decimal placeholder as defined by the system's international settings. Characters are treated as literals for masking purposes. , Thousands separator xamCurrencyInput xamNumericInput xamMaskedInput Characters are delimited by the thousands separator as defined by the system's international settings. This character is treated as a literal for masking purposes. : Time separator xamMaskedInput Characters are delimited by the time separator as defined by the system's international settings. This character is treated as a literal for masking purposes. / Date separator xamMaskedInput This character is also treated as a literal for masking purposes. \ Escape next chatacter xamMaskedInput This character instructs the mask to treat the next character in the mask string as a literal. This allows you to include the '#', '&', 'A', and '?' as well as other characters with special meanings in the mask. This character is treated as a literal for masking purposes. & Character placeholder xamMaskednput Valid values for this placeholder are ANSI characters in the following ranges: 32-126 and 128-255 (keyboard and foreign symbol characters). > xamMaskedInput Converts all characters that follow to uppercase < xamMaskedInput Converts all characters that follow to lowercase A Alphanumeric character placeholder xamMaskedInput Represents an alphanumeric character. For example: a-z, A-Z, or 0-9. Character entry is required . a Alphanumeric character placeholder xamMaskedInput For example: a-z, A-Z, or 0-9. Character entry is not required . 9 Digit placeholder xamCurrencyInput xamNumericInput xamMaskedInput Character must be numeric (0-9) but entry is not required. h Hexadecimal digit placeholder xamNumericInput xamMaskedInput Character must be a hexadecimal digit (0-9 or a-f). The entry is required. A-F digits will be converted to lower case. H Hexadecimal digit placeholder xamNumericInput xamMaskedInput Same as 'h' placeholder however the a-f digits are converted to upper case. - Minus sign (optional) xamCurrencyInput xamNumericInput xamMaskedInput Minus sign when followed by a number section defined by series of 'n's (like in "-nn,nnn.nn") indicates that negative numbers are allowed. When not followed by a series of 'n's, it's taken as a literal. Minus sign is only shown when the number is actually negative. + Plus sign (optional) xamCurrencyInput xamNumericInput xamMaskedInput Plus sign when followed by a number section defined by series of 'n's (like in "nn,nnn.nn") indicates that negative numbers are allowed. However, it differs from '-' in the respect that it always shows a '' or a '-' sign depending on whether the number is positive or negative. C Character or space placeholder xamMaskedInput Character entry is not required. This operates exactly like the '&' placeholder, and ensures compatibility with Microsoft Access. ? Letter placeholder xamMaskedInput For example: a-z or A-Z. Character entry is not required. n Digit placeholder xamCurrencyInput xamNumericInput xamMaskedInput A group of n's can be used to create a numeric section where numbers are entered from right to left. Character must be numeric (0-9) but entry is not required. char:n:s Arbitrary set of accepted characters xamMaskedInput The char:n:s mask allows you to define a placeholder with arbitrary set of acceptable characters. The 'n' in the mask specifies the number of character placeholders in the mask. The 's' specifies the set of acceptable characters. The following are some examples of this mask: char:1:abc - This mask will have single character placeholder that will accept 'a', 'b' or 'c' characters only. char:4:abc - Same as above except 4 character placeholders is created. char:8:0-9a-f - 8 character placeholders where each will allow 0-9 and a-f characters (in effect hexadecimal characters). mm, dd, yy Date characters xamMaskedInput The combination of these three tokens is used to define a date mask. The mm is for month, dd for day, yy for two-digit years and yyyy for four-digit years. Examples: mm/dd/yyyy, yyyy/mm/dd, mm/yy. hh, mm, ss, tt Time characters xamMaskedInput The combination of these tokens is used to define a time mask. The hh is for hour, mm for minute, ss for second, and tt for AM/PM. Examples: hh:mm, hh:mm tt, hh:mm:ss. date:s Short date xamMaskedInput The {date} token is a placeholder for short date input. The date mask is derived using the underlying culture settings. {time} Short time xamMaskedInput The {time} token is a placeholder for short time input. Short time typically does not include the seconds portion of time. The time mask is derived using the underlying culture settings. longtime Long time xamMaskedInput The {longtime} token is a placeholder for long time input. Long time typically includes the seconds portion of the time. The long time mask is derived using the underlying culture settings. double:-i.f:c Customized floating poing input xamNumericInput xamMaskedInput The double:i.f:c token is a placeholder for a mask that allows floating point input where i and f specify the number of digits in the integer and fraction portions respectively. The :c portion of the mask is optional and specifies that the value must be continuous across fraction and integer portions. For example, with :c in the mask, in order to enter 12.34 the user types in "1234". Notice that the decimal separator character is missing. This alleviates the user from having to manually type in the decimal separator. The "-" (minus) symbol before i.f is also optional. Presence of '-' symbol indicates that the negative values are allowed. If '-' symbol is not included then only non-negative values will be allowed. currency:-i.f:c Customized currency input xamCurrencyInput Same as double:i.f:c except the mask is constructed based on currency formatting information of the underlying format provider or the culture. It typically has the currency symbol and also displays the group characters. number:min-max Range of numbers xamCurrencyInput xamNumericInput xamMaskedInput The number:min-max placeholder is used for a number section that can accept values in the range from min to max. Examples: number:0-255, number:-10-10. Literal All input controls All other symbols are displayed as literals; that is, they appear as themselves.
Note: You can also escape the mask with {LOC} character sequence to indicate that symbols in the following table should be mapped to the associated symbols in the underlying culture settings.
Mask Character Description $ Currency symbol / Date separator : Time separator , Thousands separator . Decimal separator + Positive sign - Negative sign
Outlook Contacts
Allows Drag&Drop of an Outlook Contact directly on the Grid and will fill out accordingly.
For each column in the Grid you can setup the Outlook Contact field mapping.
Single/Multiple select rows, and context menu "Send Email" will open the DocTemplates Email Templates, if any files are selected in the current DocList then those will also be attached.
"Export to Excel" will export the whole Grid to an Excel file saved locally (path chosen by user).
Grid Summary (Fulltext indexing)
You can now use the Folder_ prefix for Grids (linking to a standard Folder Text Attribute), which fills the Folder attribute with a text summary of ALL grid contents -- basically allowing you to index the grid's contents as a whole (in case it's marked for Search).
Expressions and the Expression Builder [2018.1]
Expressions are an „easy" way to replace an hard-coded value and add some logic to be evaluated at run time. There are currently two kinds of Expressions:
-
Boolean Expressions: return a True or False value (e.g. for IsReadonly or IsRequired properties)
-
Text Expressions: return a Text made up of Tokens to be further used
An Expressions is made up of:
-
Tokens: evaluated and replaced on runtime, can be
-
References to other Attributes
-
References to any Folder/Document Field
-
Dynamic Values (like the current Time and/or Date, ItemUri)
-
User properties (like his name or id)
-
Unique GUID
-
-
Arithmetic Operators: add,subtract,multiple,divide
-
Comparision Operators: =, <>, <, <=, >, >=, IN, LIKE
-
Logical Operators: And,Or,Not
-
String Operators: Length, IsNull, Substring, Trim, IIF
You can either type this directly by yourself (there is also a Token helper for that), or show the Expression Builder Dialog which will list all available Tokens and Operators.
Notes:
-
In order to avoid user confusion, there are no detailed error messages Dialogs to the user when an Expression Evaluation error occurs -- those are only visible in the Debug log
-
Be wary of invalid/missing values -- if a Token cannot be found it will be removed which might cause unexpected results in the evaluation
Required/Readonly Expressions [2018.1]
You can now set the Required and/or Readonly flags for any Editor to be an Expression; this will be evaluated at startup only (no dynamic changes).
Security based expression [2018.3]
Example: Required Expression based on a Checkbox
Use Case: have the selection of a checkbox affect another attribute's Required property.
Note: a Checkbox has 3 states: Unset, True and False so you need to either:
-
Set a Default value of True or False
-
Handle the Unset state in the Expression (which also results in a True or False)
Setup: Field1 is a Checkbox, Field2 is Text.
Field2.Required set to Custom with the following Expression:
IIF( LEN({Field1}) = 0, False, {Field1}) <> False
In this case if the Checkbox is unset (length = 0) we'll handle it as a False.
That is then compared and if NOT False, the whole Expression will return True.
So to summarize, if Field1 (the Checkbox) is:
-
Unset -- will return false
-
True -- will return true
-
False -- will return false
Default Value [2018.1]
You can now set a default value to any Editor:
-
If it's a checkbox/toggle (boolean), you can use True or False
-
To use a string you must quote it in single quotes
-
You can enter an Expression to be evaluated on startup (no dynamic changes)
-
In case of a Multiple selection, you can also set multiple default values (CSV -- comma separated)
Grid Control Button Bar
A Toolbar to allow the User to manage the Master/Details View
Parameters:
-
Grid: select an existing Grid which this ControlBar should reference
-
Clear: whether to show the „Clear Details View" button
-
Add: whether to show the „Add as new" button
-
Add Link: whether to show the „Add as Link" button
- Add Link: the „Grid Control Bar -- AddLink Dialog" Editor to use
-
Delete: whether to show the „Delete" button (Delete is always available by the keyboard Del button or right-clicking in the Grid)
-
Export / E-Mail: whether to show the extra actions (related to the Grid itself)
Grid Control Bar -- AddLink Dialog
This Editor is required when using the Master/Details view in combination with the LinkedGridRepository and will show a Dialog for the User to choose an existing row for „adding as a link" to the current Master View.
Master/Details View
TODO screenshots / configuration
Notes:
-
The Grid must be READONLY -- no editing in place allowed
-
The Grid must contain ALL columns -- otherwise the load/save will miss those -- you can hide specific ones in the Column configuration
-
GridRepository vs LinkedGridRepository
Multiple Selections
The List* Family of Editors supports multiple selections; the value will then be converted into a CSV list showing up as Text.
There is currently no support for splitting those in the Document Lists, Filtering or Fulltext search.
Validation
Die Felder Einstellungen für den ExtraAttributes Plugin würden erweitert mit eine Optionale Auswahl von:
-
einen Validierung Plugin (eine Liste von verfügbare wird angezeigt)
-
einen Validierung Parameter
Note the difference between a Validation and an Input Mask
-
a Validation will allow the user to enter any value, but will show a red border (and a Validation warning) if the value fails validation; in this case the Save button will also be disabled
-
an Input Mask will NOT allow the user to enter anything that wont match the Mask, and will revert to the previous valid value if the value fails
RegularExpressionValidationRule
Der „RegularExpressionValidationRule" akzeptiert als Parameter die RegularExpressions dagegen der Wert überprüft wird.
OnlineIBANValidationRule [2018.1]
Der „OnlineIBANValidationRule" benötigt keine Parameter, die Validierung erfolgt ONLINE mit hilfe von https://openiban.com
Beim Fehler / nicht erreichbarkeit wird es einen Fehler popup geben.
DateHigherThanValidationRule
Der „DateHigherThanValidationRule" akzeptiert als Parameter nur den Namen von ersten Datumfeld (wird in der Zukunft erweitert).
Im Formular wird dann eine Lokalisierte Fehlermeldung angezeigt, z.B.:
Localization
Not yet available! Planned for 2018.
Attribute's DisplayName
Not currently available -- the plan is to have a dialog next to the DisplayName to allow customization per language identifier.
Repository Lookups
Not currently available -- the plan is to have ONE extra Value column per language identifier.
Layout
Form Title, Captions, Box's titles are under discussion.
Layout
Empty
All the Attributes will be automatically be shown (one per row)
CSV Layout
You can use the „Name" of the Attribute to specify which ones to show.
You can show multiple Attributes on the same row by separating them with a comma (that's why it's called the CSV Layout).
ONLY the Attributes you are including will be shown.
Rows can either start with:
-
„#" -> title
-
„_" -> separator
-
Name of Attribute; you can change the default length by setting name=pxWidth
XML Layout
This is by far the most advanced layout which allows groups, tabs, columns, etc...
Note that this is not real XML, since:
-
Names are case-insensitive
-
Values are case-insensitive
-
There is no XML validation -- any errors and the Form will not show
-
... but still requires close tags!
Follows a very basic structure:
-
On the top the <layout> tag
-
Then as many as you wish <box> tags
Inside each <box> you can either:
-
nest more <box> tags (as deep as you want)
-
specify a CSV Layout (enclosed in <csv> tags)
-
create layout columns using the <cols> element, each child <box> then becomes a Column
The <box> tag has many properties (some specific to the Type), the only ones shared across all:
-
Type: specifies the type of the Box
-
Name: identifier (used to reference this Box)
Currently following <box> Types are supported:
-
clear -- no border and NO header (used for layouting)
-
border -- frame (thin border) with NO title
-
expander -- user can expand/collapse
-
isOpen=true/false to set default state
-
title to set the header
-
-
groupbox -- framed (thin border) with title
- title to set the header
-
[2018.1] tab to specify a Tab host
- isFullscreen=true/false when only one Tab host is used and it should fill the whole screen (scrollbars are then only scrolling the inside area and not the whole page)
-
[2018.1] tabItem (only inside <box type="tab">) per Tab
-
isSelected=true/false to set default tab (last one selected „wins")
-
title to set the header
-
Layout Boxes Configuration -- Experimental [2018.1]
A special EditorControl called „Layout Boxes Configuration" allows you to dynamically show/hide a whole <box> section by evaluating an Expression.
In order to set it up:
-
Name the <box> you would like to dynamically show/hide
-
Add an Attribute using the EditorType: „Layout Boxes Configuration"
-
Expand the Editor's Parameters and add a Box item:
-
Configure the name (as above)
-
Configure the Visible property: set to Custom and enter an Expression
-
-
Add it somewhere to your layout (even though it has no visual output)
Notes:
-
these are dynamic and evaluated in real-time
-
if hidden a box will not take up any space; if shown it will take as much as it needs (so scrollbars might appear)
-
if all TabItems are hidden in a specific Tab host, the Tab host itself will also be hidden
Example: GroupBox visibility based on Checkbox
Use Case: a Feedback checkbox -- once checked the a Comments field will be visible
Setup:
-
Rename Field1 to „Feedback", set EditorType to „Boolean as Checkbox", DefaultValue to „False"
-
Add Field2 and rename to „Comments", set EditorType to „Memo"
-
Add Field3, set EditorType: „Layout Boxes Configuration", expand Editor Parameters and set:
-
Box name: „commentsBox"
-
Visibile: Custom, Expression:
- {Feedback}
-
-
Set Layout to following:
<layout>
<box>
<csv>Field3
Feedback</csv>
</box>
<box name="commentsBox">
<csv>Comments</csv>
</box>
</layout>
Example CSV Layout
Example Tab Layout [2018.1]
NOTE: starting 2018.1 the Tab layout has been simplified and now looks like this: (no more special Tab/TabItems -- only new Box types):
<layout>
<box type="tab" isFullscreen="true">
<box title="Contacts" isSelected="true" type="tabItem">
<csv>
GRID_CONTACTS
GRID_CONTACTS_COMMANDBAR
</csv>
</box>
<box title="Contact Details" type="tabItem">
<csv>
SEQID
ANREDE,TITLE
FUNCTION
DEPARTMENT
ROLE
COMMENT
STATUS
NAME,LAST_NAME
TEL_WORK,TEL_MOBILE
COMPANY,ADDRESS
GRID_CONTACTS_DETAILS_COMMANDBAR
</csv>
</box>
</box>
</layout>
Box type „Tab" Properties (the host for all TabItems):
-
Name (optional): box identifier
-
isFullscreen (optional, default: „false"): when this Tab host is the ONLY one in whole layout (no inPoint Classification, etc...) the scrollbar will be WITHIN the tabItem and not outside -- meaning the Tabs themselves will stay in place while scrolling
-
NOTE that this Box can ONLY include Box type="TabItem"!
Box type "TabItem" Properties (each individual Tab):
-
Name (optional): box identifier
-
isSelected (optional, default: „false"): whether this Tab should be pre-selected when first time loading
DataProviders and Sources
ExtraAttributes supports multiple Data Sources, meaning it can load/save ANY of it's Attributes from a different data source. The way this works;
-
inPoint Core provides a default set of „Data Providers"
-
you then define a „Data Source" that uses any of those „Data Providers" and any addition configuration as required
-
each Attribute can then reference a „Data Source"
Every DataSource can be set as READONLY to (optionally temporarly) disable any saving (loading would still work). They are executed alphabetically (based on their name) -- the last one „wins".
There are 2 major kinds of DataProviders, those that:
-
provide ONE row of Data -- for example to map to a certain Attribute (Repository, ExternalSource)
-
provide MULTIPLE rows of Data -- for example to fill a Grid (GridRepository, LinkedGridRepository)
-
some can handle both -- like for example the Blob or ItemFields DataProviders
Note that most of them use Lookup Repositories for the Back-end (so require some setup), the ExternalSource is currently the only one that can query any SQL Table.
Folder_* and Document_*
In previous versions we added the feature that if the CommonName of an Attribute starts with the prefix „Folder_" then the loading / saving of the value will be applied to whichever Folder attribute exists with the same name. That enabled use cases like:
-
Fulltext indexing of any ExtraAttributes (since those are not yet included in the normal FT Index)
-
Pre-loading values from the back-end
-
Accessing values set from ExtraAttributes (since only BLOB storage was used)
Today we have the ItemFields DataSource that allows you the same without re-naming your attributes.
SearchValue and EditValue [2018.1]
Those parameters are used throughout the DataSources and allow to configure how the VALUE column in the LookupRepository is filtered (when loading data) or filled (when saving/updating data).
[2018.1] They can now also be evaluated as Expressions.
Column Mappings
This allows to define a mapping between how columns are named as coming from the DataProvider and how they are identified (by CommonName) in the ExtraAttributes.
Data Providers
Following the pre-installed Data Providers as installed with inPoint.Core. Note that those are also Plugins and can extended based on your needs.
None
This is used to exclude „special" fields from being evaluated, for example Button/Links/CommandBar/etc...
Blob
Uses a Binary Serialization to load/save data into PAM_USERDATA (an inPoint.Core Table)
Advantages:
-
No need to configure anything on the server
-
Supports any Editor type
-
Easy cleanup (SQL table rows easy to identify)
Disadvantages:
-
The data is not accessible - no way to query the data on the SQL side, tricky to deserialize in other (external) controls
-
Performance -- depending on how many Attributes there are
-
All resides on one big SQL table
-
No FullText indexing!
ItemFields
Supports loading/saving directly from inPoint fields (Folder/Document).
Advantages:
-
Such inPoint fields can be marked for the Search and are thus available in the FullText index
-
Easier to load existing data into an ExtraAttributes form
Disadvantages:
-
Each field needs to be defined twice -- once in inPoint and once in the ExtraAttributes (types must match!)
-
The inPoint Fields cannot be used for editing (they get overwritten by the ExtraAttributes) -- so basically they must remain hidden
Repository
Uses a pre-defined Lookup Repository (a custom SQL Table) to save/load data. Basically if you have a normal (non-repeating) Form with a list of Fields.
Advantages:
-
Fast
-
Easy to migrate existing data into ExtraAttributes forms
-
One Row -- One Item (Folder or Document) -- makes it easy to identify (per default by ItemUri)
Disadvantages:
-
Lookup Repository need to be pre-created and pre-defined in inPoint.Core
-
SQL Columns must be manually created in the ExtraAttributes (names must match!)
Notes:
- SEQID column also needs to be defined as an Attribute
GridRepository
When using the Grid Editor, you could basically have multiple rows all attached to the same item (Folder/Document). As such the Repository DataProvider is not enough, and instead (just for the Grid) you need to use the GridRepository DataProvider.
Advantages:
- Separate store of Grid data, which allows external access to the data (for migrations/reporting)
Disadvantages:
- If you have multiple Grids, you need to start using ColumnMappings to map the different SEQIDs
Parameters:
-
Repository: which pre-defined Lookup Repository to use
-
SearchValue: when LOADING data will filter the VALUE column with this SearchValue
-
EditValue: when SAVING data will fill the VALUE column with this EditValue
-
[2018.1] ShowFilter (default: no): whether to allow to the user to filter the data using a text keyword
-
[2018.1] PageSize (default: 0): how many rows to returns at once, using 0 will use the configured server LookupLimit Server Setting (default: 10000), or use a number to force paging
-
Column Mappings: see Column Mappings
Notes:
- SEQID column also needs to be defined as an Attribute
LinkedGridRepository
When using the Grid Editor, you could basically have a Master table (e.g. Employees) and a linked table (e.g. ProjectEmployess) where you want to select from the Master Employess table without duplicating the data, and optionally have extra fields in the Linked table that only relate to the current Item (Folder/Document).
Advantages:
-
Allows advanced data models joined by parent/id relationship (1 to many)
-
Allows central administration of data without duplicating it all over the place
-
Best used with the Master/Detail view feature and GridButtonBar
Disadvantages:
-
More complex to setup (2x Lookup Repository, 2x Folders, 2x Datasources, etc...)
-
You cannot edit the Master data in the Linked Grid -- as such you would need two separate Folders to edit the Master data (which is actually a good security feature as well)
-
Can feel more complex for the users
-
If you have multiple Grids, you need to start using ColumnMappings to map the different SEQIDs and PARENTSEQIDs
Parameters:
-
Master Repository: which pre-defined Lookup Repository to use (readonly -- when joining based on the PARENTSEQID column)
-
Link Repository: which pre-defined Lookup Repository to use as the "joined" writable Repository
-
SearchValue: when LOADING data will filter the VALUE column with this SearchValue
-
EditValue: when SAVING data will fill the VALUE column with this EditValue
-
[2018.1] ShowFilter (default: no): whether to allow to the user to filter the data using a text keyword
-
[2018.1] PageSize (default: 0): how many rows to returns at once, using 0 will use the configured server LookupLimit Server Setting (default: 10000), or use a number to force paging
-
Column Mappings: see Column Mappings
Notes:
- SEQID, PARENTSEQID columns also needs to be defined as an Attribute
ExternalSource
This DataProvider connects directly from the Client to any Server (based on the provided SQL Connection string) and queries the configured „SQL Table". Since this must return ONE row of the data, the „SQL Search Column" is filtered based on the „Search Value" (which can be an Expression).
General Settings
Recipes (Examples, Use Cases, etc...)
TBD
RE-Use a Repository Lookup in Multiple Folders
TODO using the SearchValue filter
Editing a Repository Lookup from the Client
TODO using a GridRepository
Development
Interfaces
ExtraAttributeDefinition -- definition of each attribute (or Field)
ExtraAttributeConfigBase -- base implementation of an Attribute's Configuration (including UI)
ExtraAttributeNOCONFIG -- in case no custom Configuration is needed (only EditorParam is available as a text field)
IExtraAttributeIsMultiple -- marker interface in case the Attribute supports multiple values (almost converted to a csv list from an object[] list)
IExtraAttributesValidationRule -- Validation plugins
IExtraAttributeEditor -- definition of the Control actually rendering a certain Type
Plugin SDK
VisualStudio Project/Item Templates available for creating inPoint Plugins, including ExtraAttributes specific Plugins (Editors, Validations, Datasources).
Available as a .VSIX download (Installer Package).