Hello 

 

I want to set up a validator in the field when the length is greater than 10 characters, it does not allow saving that record. To achieve this I am basing myself on the following example: https://academy.creatio.com/docs/8.x/dev/development-on-creatio-platfor…

Placing it in the following way but it does not work correctly.

 

validators: /**SCHEMA_VALIDATORS*/{
          /* Implement a custom validator type. */
    "usr.ValidateFieldValue": {
        /* Business logic of the validator. */
        "validator": function (config) {
            return function (control) {
                return control.MaxLength !== config.invalidLength ? null: {
                    "usr.ValidateFieldValue": { message: config.message }
                };
            };
        },
        /* Validator parameters. */
        "params": [
            {
                "name": "invalidLength"
            },
            {
                "name": "message"
            }
        ],
        "async": false
    }
}/**SCHEMA_VALIDATORS*/
 
 
 

 

/**SCHEMA_VIEW_CONFIG_DIFF*/,
		viewModelConfigDiff: /**SCHEMA_VIEW_MODEL_CONFIG_DIFF*/[
			{
				"operation": "merge",
				"path": [
					"attributes"
				],
				"values": {
					"UsrnumerodeserieDS_Name_zb3wye6": {
						"modelConfig": {
							"path": "UsrnumerodeserieDS.Name"
						},
                       /* The property that contains the list of attribute validators. */
                        "validators": {
                            /* Custom validator. */
                            "ValidateFieldValue": {
                                /* Validator type. */
                                "type": "usr.ValidateFieldValue",
                                "params": {
                                    /* The field value that triggers the custom validator. */
                                    "invalidLength": "10",
                                    /* The tooltip that Creatio displays when the field contains the value specified in the “invalidName” property. */
                                    "message": "Invalid name."
                                }
                            }
                        }
					}
				}
			}

 

Also at some point I modify the code and save it but when I re-enter it does not save the changes and removes what I placed

 

Like 0

Like

1 comments

Hello Laura,

The described situation reminds me that you may apply changes to the unauthorized window. If you relogging into the application - you have to close the Code editor page and open it again after each new login, then changes will be applied.

Please try to modify the code according to the given recommendations and reply to my message if the error persists with additional details about the Error you see.

Show all comments

Hi Community,

 

I have to create a concatenated field based on two other fields in the object. Ex. Officer full name from officer first name and officer last name. Is there a way to do it in Creatio? Thanks in advance!

Like 0

Like

3 comments

An easy approach is to create a process that triggers on the record being added or being updated in the officer first name or officer last name fields. Read the record to get the values, then update it with the value concatenated. 

Entity-level calculated fields would be so helpful for these kinds of use cases. Needing to create business processes manually for every calculated field is quite cumbersome and can be the source of issues, and with the aim being less code, having configurable calculated fields at the entity level would surely be a win!

Harvey Adcock,

Completely agree. I would love for these types of values to be completely virtual and simply return the results of a calculation rather than be stored in the database.

Show all comments

Hi Team,

 

Could anyone please help me achieving the things below?

 

I have added two custom attributes in the client module.

 

One of lookup type and the other for text. As soon as the user selects the value in the Title Dropdown, the Description text field should be auto-populated with the corresponding value of description being fetched from a data source of Title.

 

The source lookup is as follows:

 

attributes: {

 "UsrTitle": {
         dataValueType: Terrasoft.DataValueType.LOOKUP,
         type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                  isSimpleLookup: true,

                   referenceSchemaName: "UsrTitle",

                   isRequired: true,
       },

          "UsrDescription": {
         dataValueType: Terrasoft.DataValueType.MAXSIZE_TEXT,
         type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN, 
         value: ""
       }

}

 

    diff: [
                
                {
                    "operation": "insert",
                    "name": "MyMenu",
                    "propertyName": "items",
                    "values": {
                        "generateId": false,
                        "itemType": Terrasoft.ViewItemType.CONTAINER,
                        "items": []
                    }
                },
      
              {
         "operation": "insert",
         "parentName": "MyMenu", // The container where the input box will be added
         "propertyName": "items",
         "name": "UsrTitle",
         "values": {
           "bindTo": "UsrTitle", 
           "labelConfig": {
             "caption": "Title"
           },
         },
           "bindTo": "UsrTitle",
                    
                "enabled": true,
                    
                "contentType": 3
       },
                  
            {
         "operation": "insert",
         "parentName": "MyMenu", 
         "propertyName": "items",
         "name": "UsrDescription",
         "values": {
           "bindTo": "UsrDescription", 
           "labelConfig": {
             "caption": "Description"
           },
            "contentType": 0,
        "layout": {
            "column": 4,
            "row": 5,
            "colSpan": 20,
            "rowSpan": 4
        },
           "controlConfig": {
             "placeholder": "Enter your text here"
           },
           "classes": {
             "wrapClassName": ["custom-input-box-class"]
           }
         }
       },
         {
       "operation": "insert",
       "parentName": "MyMenu",
       "propertyName": "items",
       "name": "MainContactButton",
      
       "values": {
      
           "itemType": Terrasoft.ViewItemType.BUTTON,
         
           "caption":"Create Ticket",
           
           "enabled": true
       }
   },
 ]

 

 

Please note that this is a custom client module which does not belong to a section, hence not able to achieve this using the OOTB business rules. Kindly help!

 

Thanks,

Sarika

Like 0

Like

2 comments
Best reply

First of all, you'll need to have a change event for when the lookup attribute it selected, add something like this to the lookuip attribute: 

"UsrTitle": {
    dataValueType: Terrasoft.DataValueType.LOOKUP,
    type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
    isSimpleLookup: true,
    referenceSchemaName: "UsrTitle",
    isRequired: true,
    onChange: "getTitleDescription"
}

Then, add the getTitleDescription method to the methods. When a value is selected this will get called and you can go retrieve the description via an EntitySchemaQuery to set in the other attribute:

getTitleDescription: function() {
    var title = this.get("UsrTitle");
    // now do an esq to get the description using title.value and then set in the description attribute
}

You could try adding the Description to the lookup attribute's lookupListConfig to avoid the esq, but I am not sure if that works for a virtual lookup attribute. However, doing an esq there would work fine.

Ryan

First of all, you'll need to have a change event for when the lookup attribute it selected, add something like this to the lookuip attribute: 

"UsrTitle": {
    dataValueType: Terrasoft.DataValueType.LOOKUP,
    type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
    isSimpleLookup: true,
    referenceSchemaName: "UsrTitle",
    isRequired: true,
    onChange: "getTitleDescription"
}

Then, add the getTitleDescription method to the methods. When a value is selected this will get called and you can go retrieve the description via an EntitySchemaQuery to set in the other attribute:

getTitleDescription: function() {
    var title = this.get("UsrTitle");
    // now do an esq to get the description using title.value and then set in the description attribute
}

You could try adding the Description to the lookup attribute's lookupListConfig to avoid the esq, but I am not sure if that works for a virtual lookup attribute. However, doing an esq there would work fine.

Ryan

Ryan Farley,

 

Thanks. it worked.

Show all comments

Hello,

 

I'm trying to create a rest service using the AFT Repository (2.0.2.4) and everything works as expected until I save the context when I get the error below. 

 

What I am missing?

 

Thanks,

Jose

 

Newtonsoft.Json.JsonSerializationException: Unable to find a constructor to use for type ATF.Repository.Providers.ResponseStatus. A class should either have a default constructor, one constructor with arguments or a constructor marked with the JsonConstructor attribute. Path 'responseStatus.ErrorCode', line 1, position 31.
  at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
  at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
  at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
  at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
  at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
  at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
  at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
  at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType)
  at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
  at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
  at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value)
  at ATF.Repository.Providers.RemoteDataProvider.BatchExecute(List`1 queries)
  at ATF.Repository.AppDataContext.Save()
  at C2C.CreatioDataIntegration.AppealDocumentManagement.Save() in C:\tfs\C2C_QLS\QLS\CreatioDataIntegration\CreatioDataIntegration\AppealDocumentManagement.cs:line 71
  at C2C.CreatioDataIntegration.AppealDocumentManagement.Add(AppealDocumentRequest request) in C:\tfs\C2C_QLS\QLS\CreatioDataIntegration\CreatioDataIntegration\AppealDocumentManagement.cs:line 65
  at Program.<>c.<<$>b__0_2>d.MoveNext() in C:\tfs\C2C_QLS\QLS\CreatioDataIntegration\CreatioDataIntegration\Program.cs:line 61
--- End of stack trace from previous location ---
  at Microsoft.AspNetCore.Http.RequestDelegateFactory.ExecuteTaskResult[T](Task`1 task, HttpContext httpContext)
  at Microsoft.AspNetCore.Http.RequestDelegateFactory.<>c__DisplayClass102_2.<b__2>d.MoveNext()
--- End of stack trace from previous location ---
  at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
  at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
  at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
  at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
  at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)

 

File attachments
Like 0

Like

3 comments

Hello,

 

I'm following the clio tutorial to install Creatio from CLI, but I'm getting the error below. Any ideas on what I'm missing?
 

Thanks,

Jose 
 

clio version '6.1.0.37'


[ERR] - The requested service 'Clio.Command.CreatioInstallCommand.InstallerCommand' has not been registered. To avoid this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.
 

Like 0

Like

1 comments

Hello,
 

The clio application is supported directly by the application developers on the github page.

We encourage you to consult our comprehensive documentation and engage with our GitHub community for assistance.


You can also ask your question and describe the error using this link.

 

https://github.com/Advance-Technologies-Foundation/clio/issues?q=is%3Ai…
 

Thank you.

Show all comments

Hello,

 

I'm following this tutorial Lesson 1 - Installing clio (youtube.com) on VS Code, but when I get to the clio apps step I get this error:

 

[ERR] - Environment with key 'dev' not found. Check youre config file or command arguments.

Any ideas what I'm missing?

Thanks,
Jose

Like 0

Like

3 comments

Basically, clio creates it's own config file where it writes the configured environments to (on windows typically stored at C:\Users[username]\AppData\local\creatio\clio\appsettings.json). I believe by default it has an environment named "dev", but you can remove that. Can you give more info on the command you're running when you get the error? 

Ah, missed you said you're running clio apps. Try opening the config file I mentioned and change "ActiveEnvironmentKey" from "dev" to blank ""

Ryan Farley,

Thanks Ryan. That worked.

Show all comments

diff: /**SCHEMA_DIFF*/[
         {
            
       "operation": "merge",
       "name": "DataGrid",
       "values": {
               "activeRowAction": {bindTo: "onActiveRowAction"},
               "activeRowActions": [
                       {
                               "className": "Terrasoft.Button",
                               "style":this.Terrasoft.controls.ButtonEnums.style.BLUE,
                               "markerValue": "myButtonAction",
                               "tag": "myAction",
                               "caption": "View image",
                               "enabled": false,
                               "visible":{bindTo: "IsButtonVisible"},
                         
                                 
                       }
               ],
               // "visible": {"bindTo": "isButtonVisible"},
               
       }
}
       ]/**SCHEMA_DIFF*/,
        methods: {
            isButtonVisible: function()
            {
           console.log("hello");
           const activerow= this.get("ActiveRow");
           if(activerow)
            {
 
              var msg= this.getActiveRow().get("UsrMessage") ;
               if(msg==="hello"){return false;}
               
            }
           return true;
             
         }
       }
    };

I tried adding button, and when giving visible:true, it is working fine, now i want to hide that button from some records of detail based on some condition so i bind it with the function, but it is not working, the function is not getting called/executed, when i am doing it at grid level then it is working fine, but not working on button, is there something am i missing or doing wrong, i even tried it using attribute and setting it's value in the function

Like 0

Like

2 comments

I've never been successful with binding values in ActiveRowActions to attributes to change them after render. They don't seem to have the same bindings as other view model elements do. The only way I've been able to get this to work is to modify the dom elements on row select to manipulate, which is a bit hacky. Alternatively, just add logic to the button click to validate if the action can be performed or not, which isn't ideal either.

Ryan

Ryan Farley,

Can you please elaborate on modifying dom elements, how can i do that, because that's the only option i can see too

 

Show all comments

Hi Community Members,

 

I have two tables: contact & account details (banking products) one to many mapping linked via customer id (sample data attached). I need to find all the contacts that don't have a particular account type say IRA SAVINGS in the given example. When I am applying filters (screenshot attached) - it gives me cust_id 2 as well since it has checking account as well although I want it to give me only cust_id 1. How can I apply this filter? Thanks

Like 0

Like

2 comments

Try changing

  1. "count > 0" to "count = 0" 
  2. then change "AccountType != IRA SAVINGS" to "AccountType = IRA SAVINGS"

Ryan

Ryan Farley,

That worked, thanks Ryan

Show all comments

Hello community,

 

is it possible to show on widget indicator the sign + when the number is positive?

I tried to setting the format formula "+0;-#" but it doesn't work.

Like 1

Like

2 comments

Yes please , or have it change to green/red if positive/negative --> in nocode :P

Hello,

 

Unfortunately there's no possibility to set this up in the system at the moment. However, we have registered this idea for our R&D team so they could review the possibility of adding such functionality in future releases.

Show all comments

I need to add a PushButton for all records, but I didnt find solution only in Classic UI

Like 0

Like

1 comments