Version: 2019.4.2

Extraattributes

Documentation

Inhalt

======

1. ExtraAttributes Classification Plugin 6

1.1 TL;DR 6

1.2 Setup 6

2. Editors 7

2.1 Text -- one line 7

2.2 Memo (multi-line) 8

2.3 Email Address 9

2.4 Number (with Optional Mask) 10

2.5 Slider 10

2.6 Currency 11

2.7 Date with only Day,Month,Year 11

2.8 Boolean as Toggle 12

2.9 Boolean as Checkbox 13

2.10 List as Dropdown 13

2.11 List of Radio Buttons 14

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

2.16 Hyperlink 20

2.17 Button 21

3. Lookup Repositories 22

4. Editors Advanced Topics 22

4.1 Input Masks (Text / Number) 22

4.2 Outlook Contacts 25

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.6 Default Value [2018.1] 30

4.7 Grid Control Button Bar 30

4.7.1 Grid Control Bar -- AddLink Dialog 31

4.8 Master/Details View 31

4.9 Multiple Selections 32

4.10 Validation 32

4.10.1 RegularExpressionValidationRule 33

4.10.2 OnlineIBANValidationRule [2018.1] 33

4.10.3 DateHigherThanValidationRule 33

5. Localization 34

5.1 Attribute's DisplayName 34

5.2 Repository Lookups 34

5.3 Layout 34

6. Layout 34

6.1 Empty 34

6.2 CSV Layout 34

6.3 XML Layout 34

6.4 Layout Boxes Configuration -- Experimental [2018.1] 35

6.4.1 Example: GroupBox visibility based on Checkbox 36

6.5 Example CSV Layout 38

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

7.3 Column Mappings 41

7.4 Data Providers 41

7.4.1 None 41

7.4.2 Blob 41

7.4.3 ItemFields 42

7.4.4 Repository 42

7.4.5 GridRepository 43

7.4.6 LinkedGridRepository 44

7.4.7 ExternalSource 45

8. General Settings 46

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

10. Development 46

10.1 Interfaces 46

10.2 Plugin SDK 47

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]

Default Value:

  • You can use an Expression or set a number

Slider

Currency

Parameters:

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

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:

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)

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:

  1. einen Validierung Plugin (eine Liste von verfügbare wird angezeigt)

  2. 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

EMAIL

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:

  • Grid Summary (Fulltext indexing)

  • 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).