Best Practice - Do's and Don'ts

Best Practice - Do's and Don'ts

Solution Management

DO...

Create Site Collections for staging
It is highly recommended to build the solution in a dev/test environment before deploying it into production. You don't have to use a different tenant for this, but a dedicated site collection is sufficient. The Teamsware Studio offers the possibility to easily roll out complete solutions from dev to test to production step by step and update them later with ease.

Create only one solution per site.
If needed create sub-sites for connected solutions.


Disable alternative languages on source and target sites, because we can only package and publish the base language and it leads to confusion



Add existing lists to your solution to get them enhanced and/or packaged
If you create a solution in a site where lists already exist and you want to extend them with Teamsware functionality or just package and roll them out, you can easily make them part of your solution. In the Dossier/List creation wizard select the option 'Use an existing list from SharePoint site'. This will add it as a solution element. Only lists and libraries listed in the Teamsware Studio will be packaged.



Create packages from time to time
A solution package is like a version of your solution. Create a package if you did a major change at least. You can start from a package version to create another solution or if you or someone else accidentally deletes your site or site collection there is a chance to recreate it based on your latest package. Without a package there is nothing for us to restore since it is all stored in your site.
Don't forget to give it a helpful description that you know what you've added or changed later on.

Update your solution (features) and deployments from time to time
Teamsware is releasing Teamsware Studio updates twice a month. Find all the 
Release Notes here.
An update can include Teamsware Studio improvements or feature updates. Solution Studio is updated automatically, but if there are updates for the features you've used in your solution, there will be an update option in the lower left corner below the solution elements. If you click on update, this will only update the features used in the current site, but not the deployments. To bring the feature updates to your deployments as well, create a new package version after your Solution Studio is up-to-date, and update the deployments with the latest package.

Package Quick Launch navigation links
To package quick launch navigation links go to your SharePoint site and configure the left navigation to your needs. Then go back to your solution in Teamsware Studio -> Other Assets -> Navigation and select the navigation links you want to get packaged and deployed. If there are different links in the target site, they will remain, as there are not links deleted during deployment.

Use lookup fields if the user is to make customizations/extensions independently
If you want to give the user the possibility to extend a drop down list manually after deployment, choose a lookup column and a corresponding lookup list which allows them to add their own values.

Use choice fields for fixed values only
For a selection of fixed values e.g. to be used in your process like a status or phase use choice fields. They are packaged and therefore you can always rely on their existence.

Need a CAML query e.g. in a Teamsware GetFirstValueForQuery function? (What's CAML?)
Using the Teamsware Expression Language you have those powerful functions in the context objects in the right panel to query a list.


One parameter is the CAML query, but there is no Query Builder like on other places. Of course you could install one of the available CAML Query Builder tools out there, but there is a much easier way by using the built-in Query Builder in the Scheduled Actions wizard.
In Teamsware Studio click on the list/library you want to query and navigate to 'Things in background' -> 'Scheduled Actions' and add a Scheduled Action. In this wizard click on the Filter icon to open up the query builder.


Configure the desired filter and click 'Save'. This will write the appropriate CAML query into the filter field. From there you can copy the CAML and cancel the Scheduled Action wizard again.
For the query to be used in an expression function like GetFirstValueForQuery you have to crop it to have the <Where>...</Where> part only and remove the ProviderType property (which is only used in the query builder case)


Use icons on tabs and actions to improve user guidance and usability

Share your solutions with others
Each solution has a solution owner who created it initially. In it's default state the solution is only visible to it's owner on their Teamsware Studio dashboard
. To make sure the solution can be edited if you are on holiday or you leave the company, create a generic dev Teamsware Studio user to share with or simply share it with your deputy. Another option would be to create each solution with this generic dev account and share it from there with yourself. Make sure the email address you share the solution with has a Teamsware Studio account and is owner on your SharePoint site to make changes.
Once you have accepted a shared solution by clicking on the corresponding link in the sharing email, you will find the solution in your "Shared Solutions" section.


DON'T...


Do not use hard-coded URLs or IDs
e.g. If you have to add a list URL or ID somewhere use out-of-the-box or Teamsware Placeholders (e.g. [[@Web.ServerRelativeUrl]] or [[@Form.ListId]]) to make it dynamic.
Or if you have deployed items in a list (list content activated for package & publish) you want reference/get it in an Expression use one of the 
Teamsware Query Functions
 in combination with a custom unique column value since the ID is most likely not the same in another site after deployment.
Always keep in mind that those things will change when you deploy a solution to another place and it won't work anymore if they are hard-coded.

Do not use spaces or special characters when creating columns or lists
The initial name will be used as internal name which cannot be changed later on. When adding business logic using the Teamsware Expression Language the internal names are used. If you've used spaces or special characters these expressions are not easy to write and it's not very legible.
You can change the display name later if you click on edit again.



 

Features

Forms

DO...

Use Regex to validate form inputs (What is Regex?)
In a Teamsware Validation Expression you can use Regex to validate form inputs

Show/hide something on a form based on a group membership
Using a Teamsware Form (classic or modern) there is a visible expression configuration on each control, not just on fields. In the Teamsware Expression Builder there is a powerful function in the Context Objects -> User section that can be used to check if a user is in a specific SharePoint Group (AD Groups cannot be supported). The result of this function can be used to show/hide a control on a form.



Cascading lookups (Link zu Artikel How to configure a cascaded lookup in Forms)

Visualize the current process status or phase using an image in a rich text control

Hide fields on NewFor/EditForm when they are calculated in the background

Rich Forms: Signature field

Rich Forms (classic): After export/import from NewForm to an EditForm, add the toolbar again, as there are additional placeholders (ct, version, author, editor) on an EditForm, which are empty if they are not loaded
 

Actions

DO...

Create your custom action type if you need an action which does not exist over and over again instead of using an execute script action


Indicate to the user what actions are being executed using show message actions in between


Use console.log(); or debugger; in Execute Code Expressions in Teamsware Expression Builder to check variable values during development
 

List View Search

Do...

Disable the out-of-the-box full text search box of views when using a Teamsware List View Search
It does not make sense to have two different search boxes. Therefore edit the list view webpart and uncheck the "Display search box" option in the Miscellaneous section



Pass default values as URL parameters
If you want to open a list view having LVS automatically populated with a filter value, there is an option to pass them using the following format: s[InputName]=[Value]
To execute this filter immediately add s_runImmediate=true to the URL.


    • Related Articles

    • Action: Send email

      SenSend email action with extended configuration allows dynamically sending emails from your SharePoint site to any email address. Example of Send email action configuration on the current site For more information about Action Builder read Action ...
    • Provisioning of Language settings

      The SharePoint multilingual feature allows users to create and manage multilingual sites, enabling viewing content to be shown in different languages based on a user’s preferred language settings. In the site language settings you can enable your ...
    • Send internal email action retirement

      Send internal email action retirement Microsoft announced the retirement SharePoint SendEmail API, known as SP.Utilities.Utility.SendEmail, which is utilized to send internal SharePoint emails. It is getting retired on October 31, 2025. This means ...
    • Action: Send Mail in Rich Forms and Action Links

      Send Mail action allows dynamically sending emails from your SharePoint site to any email address. Example: * Configurations are available for actions that use the Microsoft Graph Send Mail API. Note: In order to use the Send Mail action in Rich ...
    • Field Validation Examples using Regex

      The SharePoint out-of-the-box field validation is very limited and you can't use regex to validate the value entered in the form. Using teamsware rich forms as add-in but as well in solution studio you can configure a validation on each form field ...