Let's suppose you have created a new web-service UsrCustomService.svc and you need to disable cookie authentication. Here is the

list of changes to be done:

Make changes to the site folder

  • In folder \Terrasoft.WebApp\ServiceModel\ create file UsrCustomService.svc with text:
<%@ ServiceHost Language="C#" Debug="true" Service="Terrasoft.Configuration.UsrCustomService" %>

Important! Specify full service name including the namespace

  • In file \Terrasoft.WebApp\ServiceModel\http\services.config and \Terrasoft.WebApp\ServiceModel\https\services.config add section:

    
  • In file \Terrasoft.WebApp\Web.config in the  section  to the value of the key AllowedLocations append ;ServiceModel/UsrCustomService.svc and add next section into configuration section:

  
    
      
    
    
    
  

Example different requests

UsrCustomService.cs

namespace Terrasoft.Configuration
{
    using System;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Web;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.Collections.Specialized;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.ServiceModel.Activation;
    using Terrasoft.Common;
    using Terrasoft.Core;
  
    #region Class: UsrCustomService
  
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class UsrCustomService {
          
        #region Constructors
  
        public UsrCustomService() {
        }
  
        public UsrCustomService(HttpContextBase httpContext, UserConnection userConnection) {
            _httpContext = httpContext;
            _userConnection = userConnection;
        }
  
        #endregion
  
        #region Properties: Protected
  
        private const int StreamReaderBufferSize = 65536;
  
        private HttpContextBase _httpContext;
        protected virtual HttpContextBase CurrentHttpContext {
            get { return _httpContext ?? (_httpContext = new HttpContextWrapper(HttpContext.Current)); }
        }
  
        private UserConnection _userConnection;
        protected UserConnection UserConnection {
            get {
                if (_userConnection != null) {
                    return _userConnection;
                }
                _userConnection = CurrentHttpContext.Session["UserConnection"] as UserConnection;
                if (_userConnection != null) {
                    return _userConnection;
                }
                var appConnection = (AppConnection)CurrentHttpContext.Application["AppConnection"];
                _userConnection = appConnection.SystemUserConnection;
                return _userConnection;
            }
        }
        #endregion
  
        #region Methods: Private
  
        private void SetOptionsCORS() {
            CurrentHttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
            CurrentHttpContext.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
            CurrentHttpContext.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
        }
  
        private void SetHeaderCORS() {
            CurrentHttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
        }
  
        private NameValueCollection ParseQueryParameters(Stream stream) {
            var rawPostData = new StringBuilder();
            char[] buffer = new char[StreamReaderBufferSize];
            int readLength = 0;
            using (StreamReader streamReader = new StreamReader(stream)) {
                while ((readLength = streamReader.ReadBlock(buffer, 0, StreamReaderBufferSize)) > 0) {
                    if (readLength < StreamReaderBufferSize) {
                        char[] bufferLast = buffer.Take(readLength).ToArray();
                        rawPostData.Append(bufferLast);
                        bufferLast = null;
                    } else {
                        rawPostData.Append(buffer);
                    }
                }
            }
            buffer = null;
            NameValueCollection queryParameters = HttpUtility.ParseQueryString(rawPostData.ToString(), Encoding.UTF8);
            rawPostData.Clear();
            return queryParameters;
        }
  
        #endregion
  
        #region Methods: Public
  
        [OperationContract]
        [WebInvoke(Method = "OPTIONS", UriTemplate = "*")]
        public void GetWebRequestOptions() {
            SetOptionsCORS();
        }
  
        #region POST: Content-Type: "application/x-www-form-urlencoded"
  
        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "UsrFormRequest", ResponseFormat = WebMessageFormat.Json)]
        public ConfigurationServiceResponse UsrFormRequest(Stream stream) {
            SetHeaderCORS();
            ConfigurationServiceResponse response = new ConfigurationServiceResponse();
            if (UserConnection == null || stream == null) {
                response.Success = false;
                return response;
            }
            try {
                NameValueCollection queryParameters = ParseQueryParameters(stream);
                ///TODO: your code here
            } catch (Exception e) {
                response.Exception = e;
            }
            return response;
        }
  
        #endregion
  
        #region POST: Content-Type: "application/json"
  
        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "UsrJsonRequest",
            RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        public ConfigurationServiceResponse UsrJsonRequest(JsonDataRequest request) {
            SetHeaderCORS();
            ConfigurationServiceResponse response = new ConfigurationServiceResponse();
            if (UserConnection == null || request == null) {
                response.Success = false;
                return response;
            }
            try {
                ///TODO: your code here
            } catch (Exception e) {
                response.Exception = e;
            }
            return response;
        }
  
        #endregion
  
        #region GET
  
        [OperationContract]
        [WebInvoke(Method = "GET", UriTemplate = "UsrGetRequest/{request}/", ResponseFormat = WebMessageFormat.Json)]
        public ConfigurationServiceResponse UsrGetRequest(string request) {
            SetHeaderCORS();
            ConfigurationServiceResponse response = new ConfigurationServiceResponse();
            if (UserConnection == null || string.IsNullOrEmpty(request)) {
                response.Success = false;
                return response;
            }
            try {
                ///TODO: your code here
            } catch (Exception e) {
                response.Exception = e;
            }
            return response;
        }
  
        #endregion
  
        #endregion
  
    }
  
    #endregion
  
    #region Class: JsonDataRequest (Example)
  
    [DataContract]
    public class JsonDataRequest {
  
        [DataMember(Name = "first_name")]
        public string FirstName { get; set; }
  
        [DataMember(Name = "last_name")]
        public string LastName { get; set; }
  
    }
  
    #endregion
  
}

 

Like 0

Like

Share

2 comments

I have a problem with CORS with cookies value "samesite". How I can fix it?

Daer Nataliia, 

Please see the article below on how to deal with CORS: 

https://community.creatio.com/articles/web-service-available-without-authorization-cors

Show all comments

Question

How can I get information form an account page via the [Addresses] detail? For example, I need to call a function or retrieve information from a field (e.g., name) or learn the field status (e.g., enabled).

Answer

To connect a detail with a page, use the message mechanism. You can use base messages or create custom ones (you will have to create a replacing module in this case).

For example, you can execute a ReloadDetail message subscription in the implementation of the init() method of the detail code as follows:

this.methods.init = function() {
 ...
 this.sandbox.subscribe("ReloadDetail", function(customArgs) {
 // executing actions with function arguments
 }, [this.sandbox.id]);
}

Further, you can publish the message in the parent page code by an action:

this.methods.myAction = function() {
 Terrasoft.each(this.entitySchemaInfo.details, function(detailInfo) {
 if (detailInfo.name === "addresses") {
 sandbox.publish("ReloadDetail", this, [detailInfo.moduleId]);
 }
 }, this);
}

Passing this as a parameter when publishing enables accessing the page object in a detail as well as accessing all its attributes and methods, etc. – this object will be passed in the customArgs parameter. You can pass a set of only the needed data instead of this.

You do not need to create ReloadDetail, it is already contained in the base modules of pages and details.

We recommend receiving the values of needed conditions before this moment, since after you perform getCustomItemView(), the control will be passed over to the base detail module (DetailModule), where the model is linked to the view and detail rendering is performed.

Like 0

Like

Share

0 comments
Show all comments

Symptoms

Type: Terrasoft.SourceCodeException

Message: SyntaxError: Unexpected identifier 'Invoices'. Expected '}' to end a object literal.

Additional information:

Script: file:///var/mobile/Containers/Data/Application/5971FB51-E199-46E3-8004-22E3199C246B/Documents/BPMonline700/AppStructure/rev_1/src/UsrInvoicesType.js?hash=c033cb8c-ace4-4766-b865-88fc6882274f%0D%0A%09Line:8 

Cause

The title of the Activity includes double quotation marks, but at the present moment, the system does not know how to process them.

Solution

The ability to work with double quotation marks will be implemented in the next versions of bpm'online. At the moment, a workaround is the following:

1. Go to the configuration

2. Open the UsrInvoicesType schema

3. Change its caption so that it does not have double quotation marks

For example, Section object type 'Invoices'

Necessary conditions

Admin rights.

Like 0

Like

Share

0 comments
Show all comments
knowledge base
SDK
Q&A
support

Question

In version 7.8, details do not work correctly in a detail.

Answer

The parent Id is not passed over from detail to a detail, if useRelationship is not specified. If you declare another detail in a detail, specify: "useRelationship": true

"UsrDetail2": {
    "schemaName": "UsrSchema2Detail",
    "entitySchemaName": "UsrDetail2",
    "filter": {
        "detailColumn": "UsrDetail1",
        "masterColumn": "Id"
    },
    "useRelationship": true
}

Another detail's connection column specified in detailColumn, will be populatd with the value from the parent detail (the first detail) page, from the collumn, specified in masterColumn. The column types should match.

Do not forget to set up columns in the second detail. By default, a detail of a detail does not contain any columns.

Like 0

Like

Share

0 comments
Show all comments

Question

In the mobile app, I only see a single opportunity created by the Supervisor user. Why I do not see the rest?

Answer

In bpmonline sales omnichannel (the "Opportunities" section), we use the following base logic:

1) While synchronizing, the mobile app only downloads opportunity records for the current user.

This is done to save memory and reduce synchronization time.

2) The data is filtered by the "Opportunity stage.Final = FALSE" condition in the “Opportunities” section of the mobile app.

This is done for convenience - the user only sees all his incomplete tasks.

Note: If the "Stage" field is empty, the opportunity will not be displayed at all. 

At the same time, such opportunities are stored in the mobile application and can be accessed from other sections (for example, from the “Activities” section to view the related opportunity record).

Like 0

Like

Share

0 comments
Show all comments
knowledge base
SDK
Q&A
support

Question

The profile completion in accounts displays incorrectly (thousands instead of %). As a solution, we were recommended resaving each record (which indeed helps), but we have more than 5000 accounts – resaving is not a good option for us.

Answer

The record is updated upon opening the page as a result of calling the GetRecordCompleteness() method of the CompletenessService service.

You can get all records for the further processing from the browser console. For this, execute:

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "Account"});
esq.addColumn("Id");
esq.getEntityCollection(function(result) {
   var items = null;
   if (result.success) {
      items = result.collection;
      document.testResult = items;
      console.log("testResult added");
   }
}, this);

After this, call the service method for every record (it will take some time).

document.iter = 0;
document.myLoop = function() {
    var item = document.testResult.collection.items[document.iter];
    setTimeout(function () {  
      // ---------
      console.log(item.values.Id);
      var config = {
       recordId: item.values.Id,
       schemaName: "Account"
      };
      require(["ServiceHelper"], function(ServiceHelper) {
       ServiceHelper.callService("CompletenessService",
        "GetRecordCompleteness",
         function(response) {
         },
         config,
       this);
      });
      // ---------  
      document.iter++;                  
      if (document.iter < document.testResult.collection.items.length) {         
         document.myLoop();            
      }                       
   }, 1000)
};
document.myLoop();

 

Like 0

Like

Share

0 comments
Show all comments

Question

How can I create a ComboBox and populate it with values by developer means?

Answer

Example of a code:

define("CasePage", ["CasePageResources", "terrasoft"],
    function(resources, Terrasoft) {
    return {
        entitySchemaName: "Case",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        attributes: {
            "myEnum": {
                "dataValueType": Terrasoft.DataValueType.ENUM,
                "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                "caption": "myEnum"
            },
            "myList": {
                "dataValueType": Terrasoft.DataValueType.ENUM,
                "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                "isCollection": true
            }
        },
        diff: /**SCHEMA_DIFF*/[
            {
                "operation": "insert",
                "name": "myEnum",
                "values": {
                    "caption": "myEnum",
                    "dataValueType": this.Terrasoft.DataValueType.ENUM,
                    "bindTo": "myEnum",
                    "layout": { "colSpan": 24, "rowSpan": 1, "column": 0, "row": 4 },
                    "controlConfig": {
                        "className": "Terrasoft.ComboBoxEdit",
                        "list": {
                            "bindTo": "myList"
                        },
                        "change": {
                            "bindTo": "onMyValueChange"
                        },
                        "prepareList": {
                            "bindTo": "prepareMyList"
                        }
                    }
                },
                "parentName": "SolutionTab_gridLayout",
                "propertyName": "items",
                "index": 1
            }
        ]/**SCHEMA_DIFF*/,
        methods: {
            onPageInitialized: function(callback, scope) {
                if (!this.get("myList")) {
                    this.set("myList", this.Ext.create("Terrasoft.Collection"));
                }
 
                if (callback) {
                    callback.call(scope || this);
                }
            },
            onEntityInitialized: function() {
                this.callParent(arguments);
 
                // and just for debug:
                document.scope = this;
            },
            prepareMyList: function(filter, list) {
                if (list === null) {
                    return;
                }
                list.clear();
                var columns = {};
 
                var value1 = {
                    displayValue: "a123",
                    value: "1"
                };
                var value2 = {
                    displayValue: "b234",
                    value: "2"
                };
                var value3 = {
                    displayValue: "c345",
                    value: "3"
                };
 
                columns[1] = value1;
                columns[2] = value2;
                columns[3] = value3;
 
                list.loadAll(columns);
            },
            onMyValueChange: function(val) {
                if (val && val.displayValue) {
                    console.log("you pick: ", val.displayValue);
                }
            }
        },
        rules: {}
    };
});

 

Like 0

Like

Share

0 comments
Show all comments
SDK
support
cases

Case description:

We want to add lookup with edit page.

This lookup looks like this:

Edit page:

How to do it:

1) Create section schema with parent object “Base lookup configuration section” and add method “addRecord” if you want to open edit page when you click on “New” button.

Example:

For example I created object schema “Automobile” with columns: Manufacturer (Text), Brand (Text), Date of issue (Date), Country of issue (Lookup: Country):

After that I created new Schema of the Section View Model for lookup and set parent object “Base lookup configuration section”:

And added next code to “Source code”:

define("GlbAutomobileLookupSectionV2", ["ConfigurationEnums", "ConfigurationGrid", "ConfigurationGridGenerator",
    "ConfigurationGridUtilities"],
    function(ConfigurationEnums) {
        return {
            entitySchemaName: "GlbAutomobile",
            attributes: {},
            diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
            messages: {},
            methods: {
                addRecord: function(typeColumnValue) {
                    if (!typeColumnValue) {
                        if (this.get("EditPages").getCount() > 1) {
                            return false;
                        }
                        var tag = this.get("AddRecordButtonTag");
                        typeColumnValue = tag || this.Terrasoft.GUID_EMPTY;
                    }
                    var schemaName = this.getEditPageSchemaName(typeColumnValue);
                    if (!schemaName) {
                        return;
                    }
                    this.openCardInChain({
                        schemaName: schemaName,
                        operation: ConfigurationEnums.CardStateV2.ADD,
                        moduleId: this.getChainCardModuleSandboxId(typeColumnValue)
                    });
                }
            }
        };
    });

If you don’t want open edit page when you click on “New” button then remove method “addRecord”:

define("GlbAutomobileLookupSectionV2", ["ConfigurationEnums", "ConfigurationGrid", "ConfigurationGridGenerator",
    "ConfigurationGridUtilities"],
    function(ConfigurationEnums) {
        return {
            entitySchemaName: "GlbAutomobile",
            attributes: {},
            diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
            messages: {},
            methods: {}
        };
    });

Saved schema.

2) Create edit page schema with parent object “Base lookup page”. And add your controls.

Example:

Created new Schema of the Edit Page View Model for lookup and set parent object “Base lookup page”

And added next code to “Source code” with columns of my object:

define("GlbAutomobileLookupEditPageV2", [],
    function() {
        return {
            entitySchemaName: "GlbAutomobile",
            details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
            attributes: {},
            methods: {},
            rules: {},
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "merge",
                    "name": "Name",
                    "parentName": "GeneralInfoControlGroup",
                    "propertyName": "items",
                    "values": {
                        "layout": {
                            "colSpan": 12,
                            "column": 0,
                            "row": 0
                        }
                    }
                },
                {
                    "operation": "insert",
                    "name": "GlbManufacturer",
                    "values": {
                        "layout": {
                            "colSpan": 12,
                            "rowSpan": 1,
                            "column": 0,
                            "row": 2,
                            "layoutName": "GeneralInfoControlGroup"
                        },
                        "bindTo": "GlbManufacturer"
                    },
                    "parentName": "GeneralInfoControlGroup",
                    "propertyName": "items",
                    "index": 1
                },
                {
                    "operation": "insert",
                    "name": "GlbBrand",
                    "values": {
                        "layout": {
                            "colSpan": 12,
                            "rowSpan": 1,
                            "column": 0,
                            "row": 3,
                            "layoutName": "GeneralInfoControlGroup"
                        },
                        "bindTo": "GlbBrand"
                    },
                    "parentName": "GeneralInfoControlGroup",
                    "propertyName": "items",
                    "index": 1
                },
                {
                    "operation": "insert",
                    "name": "GlbDateOfIssue",
                    "values": {
                        "layout": {
                            "colSpan": 12,
                            "rowSpan": 1,
                            "column": 0,
                            "row": 4,
                            "layoutName": "GeneralInfoControlGroup"
                        },
                        "bindTo": "GlbDateOfIssue"
                    },
                    "parentName": "GeneralInfoControlGroup",
                    "propertyName": "items",
                    "index": 1
                },
                {
                    "operation": "insert",
                    "name": "GlbCountryIssue",
                    "values": {
                        "layout": {
                            "colSpan": 12,
                            "rowSpan": 1,
                            "column": 0,
                            "row": 5,
                            "layoutName": "GeneralInfoControlGroup"
                        },
                        "bindTo": "GlbCountryIssue"
                    },
                    "parentName": "GeneralInfoControlGroup",
                    "propertyName": "items",
                    "index": 1
                }
            ]/**SCHEMA_DIFF*/
        };
    });

Saved schema.

3) Register edit page in your database by SQL script.

Example:

DECLARE
-- Name of edit page schema.
@CardSchemaName NCHAR(100) = 'GlbAutomobileLookupEditPageV2',
-- Name of object schema.
@EntitySchemaName NCHAR(100) = 'GlbAutomobile',
-- Caption of your page.
@PageCaption NCHAR(100) = 'Automobiles lookup pagee',
-- Empty string.
@Blank NCHAR(100) = ''
  
-- Adding record in table SysModuleEntity.
INSERT INTO SysModuleEntity(
    ProcessListeners,
    SysEntitySchemaUId
)
VALUES(
    0,
    (SELECT TOP 1 UId
    FROM SysSchema
    WHERE Name = @EntitySchemaName
    )
)
  
-- Adding record in table SysModuleEdit
INSERT INTO SysModuleEdit(
    SysModuleEntityId,
    UseModuleDetails,
    Position,
    HelpContextId,
    ProcessListeners,
    CardSchemaUId,
    ActionKindCaption,
    ActionKindName,
    PageCaption
)
VALUES (
    (SELECT TOP 1 Id
    FROM SysModuleEntity
    WHERE SysEntitySchemaUId = (
        SELECT TOP 1 UId
        FROM SysSchema
        WHERE Name = @EntitySchemaName
        )
    ),
    1,
    0,
    @Blank,
    0,
    (SELECT TOP 1 UId
     FROM SysSchema
     WHERE name = @CardSchemaName
    ),
    @Blank,
    @Blank,
    @PageCaption
)

And add record in Localizable string table. For it you should know your RecordId by special query

Example:

I need add localizable string in table “SysModuleEditLcz” by next SQL script:

DECLARE
-- Caption of your page.
@PageCaption NCHAR(100) = 'Automobiles lookup pagee'
 
-- SysCultureId - Id for en-US from table SysCulture
INSERT INTO SysModuleEditLcz(Id, ModifiedOn, RecordId, SysCultureId, ActionKindCaption, PageCaption)
    VALUES(NEWID(), GETUTCDATE(), 'RecordId you can get by script below', 'A5420246-0A8E-E111-84A3-00155D054C03', 'Add', @PageCaption)

Here I need “RecordId” and use next script to know it:

SELECT sme.Id, sme.CreatedOn
                --SELECT DISTINCT sme.Id, sme.CreatedOn
                FROM SysModuleEdit as sme
                    JOIN SysModuleEntity as sment on sment.Id = sme.SysModuleEntityId
                    JOIN SysSchema as sse on sse.UId = sment.SysEntitySchemaUId
                    JOIN SysSchema as ss on ss.UId = sme.CardSchemaUId
                WHERE sse.Name = 'GlbAutomobile'
                    AND ss.Name = 'GlbAutomobileLookupEditPageV2'
                ORDER BY sme.CreatedOn DESC

And i have got RecordId:

After that I execute script above with RecordId:

4) Register lookup in system and choose your section in "List page" field.

Example:

As result, I have Lookup with Edit Page:

When I click “Add”, it opens my edit page (Because I added method “addRecord” in schema “GlbAutomobileLookupSectionV2”. If you don’t want it – remove this method):

Like 1

Like

Share

1 comments

Tatiana Rogova, this article is really helpful. It would be of more useful if the scripts are shared for other db as well - PostgreSQL . Kindly consider this. 

Show all comments

Case description:

Inserting different fields in the same place, depending on the values of the other field

Algorithm of realization:

  1. Create replacing client schema for your page.
  2. Insert container into the place, where you want to have that fields. Write following code into "diff"

    {
        "operation": "insert",
        "name": "MyContainer",
        "parentName": "Header",
        "propertyName": "items",
        "values": {
            "layout": {"column": 0, "row": 3, "colSpan": 12},
            "itemType": Terrasoft.ViewItemType.CONTAINER,
            "items": []
        }
    }

     

  3. Add visibility attributes for each field and define onChange handler for field which will change fields in your container. Write following code into "attributes":

    "Field1Visible": {
        "dataValueType": Terrasoft.DataValueType.BOOLEAN,
        "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
    },
    "Field2Visible": {
        "dataValueType": Terrasoft.DataValueType.BOOLEAN,
        "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
    },
    "MainField": {
        "onChange": "onMainFieldChanged"
    }

     

  4. Insert your fields and bind their visibility to added attributes. Important! "parentName" must be equal to name of container which was added at the step 2:

    {
        "operation": "insert",
        "name": "Field1",
        "values": {
            "visible": {"bindTo": "Field1Visible"},
            "bindTo": "Field1"
        },
        "parentName": "MyContainer",
        "propertyName": "items",
        "index": 2
    },
    {
        "operation": "insert",
        "name": "Field2",
        "values": {
            "visible": {"bindTo": "Field2Visible"},
            "bindTo": "Field2"
        },
        "parentName": "MyContainer",
        "propertyName": "items",
        "index": 1
    }

     

  5. Add two methods: onMainFieldChange and method which will set visibility of you fields.

    setVisibility: function() {
        this.set("Field1Visible", false);
        this.set("Field2Visible", false);
                     
        var param = this.get("MainField");
                     
        if (param === "SomeValue") {
            this.set("Field1Visible", true);
        } else {
            this.set("Field2Visible", true);
        }
    },
    onStdNameChanged: function() {
        this.setVisibility();
    }

     

Like 1

Like

Share

0 comments
Show all comments
knowledge base
SDK
Q&A
support

Question

How can I make the [Resolution] field of a case page required? 

Answer

The issue is that an HTML-control of a RICHTEXT type, which is the [Resolution] field, does not support business rule functionality.

Nevertheless, you can use a work-around solution. Override the save() method and verify whether the specified field is populated therein, as follows;

save: function () {
    if (this.get("Solution")) {
        this.callParent(arguments);
    } else {
        this.showInformationDialog("Populate the [Resolution] field");
    }
}

 

Like 0

Like

Share

0 comments
Show all comments