The UBIK® clients support data replication mechanism so that users can create and maintain data more efficiently. For example, a user can quickly replicate a local branch and create multiple copies of it in other parts of the hierarchy.
The feature is demonstrated below using UBIK.UWP. However, with some XAML customizings, it is also available in UBIK.Xamarin because of the shared XAML commands. |
Copy & paste
On way to replicate data is through the copy & paste mechanism. A typical use case is as the following.
- Navigates to the branch that should be replicated;
- Brings up the bottom app bar and press Copy;
- Navigates to the destination where the branch should be replicated;
- Brings up the bottom app bar and press Paste.
In principal, the usage is comparable to the copy & paste mechanisms in any other apps out there. However, there are some unique UBIK® details worthing mentioning.
Regarding copy
When copying, an entire branch is involved. This includes
- The branch root object and all its local children (direct or indirect);
- Queries, offline queries and all their children are ignored;
- Files of all (in)direct child documents. However, there are exceptions to this, namely
- if a file download fails;
- if the app is in offline mode.
- The data of the above mentioned objects: Display strings, user rights, etc.;
- The properties of the above mentioned objects: Their values, user rights, validations, etc.;
- All data users can interact with (e.g. values, validations) will only be copied if the MetaProperty allows.
The Copy action is only available when the app initialization is complete and there is something to copy in the specified branch.
Regarding paste
When pasting, an entirely independent copy of the specified branch is created and added as a child of the destination object. The Paste action is only available when
- The user has triggered a copy and it is still valid (see Hint|Validity of a copy);
- And the destination object allows modification. In other words, it is not locked due to user rights, MRO status or scan status;
- And the destination object allows the root of the copied branch as a child object. Namely the creation of the branch root's MetaClass should be allowed in the destination MetaClass. (See step 8).
Data templates
On top of the standard copy & paste mechanism, UBIK® also supports a certain type of objects, namely data templates to help organize and present what the users can replicate under different hierarchical contexts.
Selecting & Querying data templates
A major issue with the standard copy & paste mechanism is its relatively low efficiency when users need to copy & paste the same object instances to different locations in the hierarchy many times, especially when the total number of available source instances grows larger. The users would have to find the instance they want to replicate out of the many and repeat that process for every round of copy & paste.
To improve the usability in this case, UBIK® allows classifying objects in a way that they are queried against and presented when users want to see what they can copy & paste under a certain hierarchical context. More specifically, it works as the following.
- The users browse to a certain context in the hierarchy where creating a certain type of objects (classified as templatable data) is allowed;
- There is at least one offline query configured that queries against that type of objects;
- The users click a button (see example "Show available data templates") to check what can be copied and pasted under the current context;
- The result list is determined by the configured offline query. UBIK® will try to automatically fill out all query criteria by extracting relevant information from the context (those that cannot be found will simply be ignored/skipped);
- If the users do not find the data templates they are looking for, or there are still too many in the list, they can manually enter values (either to overrule the context filter value or add extra filter values) and reevaluate the query for results.
Replicating data templates
Essentially, replicating using data templates is nothing more than regular copying & pasting objects instances. They will carry the same information (property values, display strings, etc.) as the original data templates. However, according to whether the replicated instances appear in the selection list afterwards, the replication can be divided into two types.
As regular data
In this case, the replicated instances will not appear in the template selection list.
A typical user scenario of this is field workers generating a large number of work packages out of existing data templates.
As data templates
In this case, the replicated instances will appear in the template selection list.
A typical user scenario of this is administrators/work planners creating work package data templates from similar templates that already exist.
XAML Commands
Show available data templates
The AddTemplatableDataCommand can be used for this. It supports the following parameters.
- Uid: Mandatory, specifies the Uid of the offline data template query;
- FilterContext: Optional, specifies the Uid of the context object from which the filter criteria values should be extracted and used. If unspecified, the current parent/context object where the command is triggered is used;
- EnableFilloutCriteria: Optional, whether the filter criteria of the offline data template query should be automatically filled out using the FilterContext. False if unspecified.
UWP
...
xmlns:controls="using:UBIK.WinX.Controls"
x:Name="SomeRandomButton"
DataContext="{Binding}"
Command="{Binding AddTemplatableDataCommand}">
<Button.CommandParameter>
<controls:KeyValueList>
<controls:KeyValueParameter Key="Uid" Value="UID_OF_YOUR_CHOSEN_QUERY" />
<controls:KeyValueParameter Key="FilterContext" Value="UID_OF_YOUR_CHOSEN_CONTEXT_OBJECT" />
<controls:KeyValueParameter Key="EnableFillOutCriteria" Value="true" />
</controls:KeyValueList>
</Button.CommandParameter>
</Button>
Xamarin
...
xmlns:classes="clr-namespace:UBIK.CPL.Classes;assembly=UBIK.CPL"
x:Name="SomeRandomButton"
BindingContext="{Binding}"
Command="{Binding AddTemplatableDataCommand}">
<Button.CommandParameter>
<classes:KeyValueList>
<classes:KeyValueParameter Key="Uid" Value="UID_OF_YOUR_CHOSEN_QUERY" />
<classes:KeyValueParameter Key="FilterContext" Value="UID_OF_YOUR_CHOSEN_CONTEXT_OBJECT" />
<classes:KeyValueParameter Key="EnableFillOutCriteria" Value="true" />
</classes:KeyValueList>
</Button.CommandParameter>
</Button>
Replicating data templates
There are two commands for this.
- ReplicateAsDataCommand
- ReplicateAsTemplateCommand
Both replicate the current context object/branch and require no additional parameters. Their differences are explained above.