News & Activity Feed

New Video: Offline Mobile App Development »
Learn how to build an online database app and have it magically transformed into a native mobile app capable of running in offline mode.
Tuesday, January 21, 2020 1:40 PM | JJ Lottering
Hi All,

I've built a stand alone report in SSRS using two parameters as filters. The report is multi-dimensional and consumes data from 4 different views, which is filtered by two parameters, EventID and SiteID. It works perfectly.

I've spent over a week already trying to incorporate this into the CoT App, but simply cannot get a single model to correctly contain the data. I've tried custom controller with dataviews which also did not work.

I've tried to use the Event model as a base and added more datasets to the report (using VS), but this broke the app complaining something about serialisation that's already implemented...

Is there a way to get this report to operate by passing the two parameters from the app?

Any advice / guidance would be appreciated.
Tuesday, January 21, 2020 2:52 AM | justin
Question as above.

We still can link controllers together (Nested DataView etc) in COT application.

Monday, January 20, 2020 11:23 PM | sdms
The only article I found on this was over 8 years old (link below) and I couldn't find anything in the online user guide. I am using Touch UI, unlimited and custom membership and role providers. Can someone advise on the following questions:
(1) what is the current process to use a different value for login and failed password attempts e.g. changing them from 5 to 10
(2) Other documentation I found mentions changing user locked out from yes to no which is straight forward but their failed password attempt is still "5". It doesn't seem to reset back to 0, do you have to do this manually or does it start to increase to the next value of 10?
(3) should you reset the counter from 5 back to 0?
(4) If it remains at 5 how does the user get locked out for future failed password attempt or attempts?

Monday, January 20, 2020 11:07 PM | Scott Allen
I have tried to edit the descriptions in the file daf-resources.en-US.js to change the default descriptions that are listed as:

_dvr.Views = {
DefaultDescriptions: {
'$DefaultGridViewDescription': 'This is a list of {0}.',
'$DefaultEditViewDescription': 'Please review {0} information below. Press Edit to change this record, press Delete to delete the record, or press Cancel/Close to return back.',
'$DefaultCreateViewDescription': 'Please fill this form and press Save button to create a new {0} record. Press Cancel to return to the previous screen.'

Despite the fact that I change the text above, when I return to the file, the default descriptions appear again.

Is there another step required?

Thanks in advance
Monday, January 20, 2020 3:15 PM | display operator
Is there any documentation on how to handle importing files into a database table. I see a blog post,
But it is short on programming details.

Also, it shows 'download a template' which is not present in my app in the latest release.

I searched on COT and didn't get see any info other than above.

Ultimately, I need to process each record on import and do some database stuff with the info before/after it is added to the table.
Monday, January 20, 2020 1:49 AM | justin
Question as above.

$app.touch.progress('show', { text: 'Loading...', background: '#fff', accent: '#000', estimate: 4000});
Currently i can manage to display 

Is that possible to display a custom logo just like COT demo website?


Sunday, January 19, 2020 3:23 PM | toni cop
I try to use mysql.
In data connection -> connection-> i klik add in content management section.

when i run cot, the error as below. i try change editForm1 to public, but the error stil exists. why does cot have problems with databases other than sqlserver. not to mention in my other thread the problem in postgres. Does Cot really support a database other than SQL Server?

[Exception: Not authorized to access private view 'editForm1' in data controller 'site_content'. Set 'Access' property of the view to 'Public' or enable 'Idle User Detection' to automatically logout user after a period of inactivity.]
FreeTrial.Data.DataControllerBase.SelectView(String controller, String view) +899
FreeTrial.Data.DataControllerBase.FreeTrial.Data.IDataEngine.ExecuteReader(PageRequest request) +82
FreeTrial.Services.ApplicationServicesBase.ReadSiteContent(String relativePath, String fileName, Int32 maxCount) +1312
FreeTrial.Services.ApplicationServicesBase.LoadContent(HttpRequest request, HttpResponse response, SortedDictionary`2 content) +1507
FreeTrial.Services.ApplicationServicesBase.LoadContent() +119
FreeTrial.Handlers.SiteBase.OnInit(EventArgs e) +911
System.Web.UI.Control.InitRecursive(Control namingContainer) +360
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1506
Sunday, January 19, 2020 8:02 AM | toni cop
I use postgres as database connection.
I have table users which fields are : id,user_name,user_password,email.
In setting->Authentication and membership , i check Enable custom membership ,
with this setting :

table Users = users
column [int|uiid] UserID = id
column [text] UserName =user_name
column [text] Password = user_password
column [text] Email = Email1

table Roles = acl_roles
column [int|uiid] RoleID = id
column [text] RoleName = name

But, when i run in browser , it still looking for userid,username,password column.
if i rename my column to userid,username,password,email, the error gone. i got this error :

PostgresException (0x80004005): 42703: column "userid" does not exist]
FreeTrial.Data.SqlStatement.Log(Exception ex) +302
FreeTrial.Data.SqlStatement.Read() +65
FreeTrial.Security.ApplicationMembershipProviderBase.GetUser(String username, Boolean userIsOnline) +75
System.Web.Security.Membership.GetUser(String username, Boolean userIsOnline) +61
FreeTrial.Services.ApplicationServicesBase.RegisterStandardMembershipAccounts() +651
FreeTrial.Services.ApplicationServicesBase.CreateStandardMembershipAccounts() +5
FreeTrial.Services.ApplicationServicesBase.RegisterServices() +16
FreeTrial.Services.EnterpriseApplicationServicesBase.RegisterServices() +23
FreeTrial.Services.ApplicationServices.Initialize() +584
FreeTrial.Services.ApplicationServices.InstanceStart() +79
ASP.global_asax.Application_Start(Object sender, EventArgs e) +21

[HttpException (0x80004005): 42703: column "userid" does not exist]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +428
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +118
System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +176
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +202
System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +178

[HttpException (0x80004005): 42703: column "userid" does not exist]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +558
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +89
Saturday, January 18, 2020 10:43 AM | justin
Hey, guys.

Recently I planned to start a new project using C# code only.
Just curious, is there any performance issue if all the business rules written in C# compared to JavaScript and SQL?
Also, I found that it is much more convenience to manage the functions just like MyProfileBusinessRules.cs which generated by COT automatically.

Known Exception:
- Attachment validation (naturalWidth, naturalHeight, set byte[] to null) can only be done in JavaScript.

Friday, January 17, 2020 2:29 PM | justin
Hey guys.

I would like to share a little additional customized functions based on touchUI.
/* custom.css - for logo aligning purpose */
.app-bar-toolbar .app-logo > * {
    cursor: pointer;
.app-bar-toolbar .app-logo img {
    max-height: 56px;
    background: #fff;
// custom.js explanation
  • $app.custom.user.getProfilePicture() // return current user picture in base64 format (oAuth provider included)
  • $app.custom.user.sync() // sync user data with server. Eg. retrieving email, refresh user avatar etc
  • $app.custom.ui.refreshLogo() // refresh logo (top left) - it grabs image logo from touch-settings.json, path: splash.logo | You may override DefaultSettings (C# backend) to display your logo dynamically.
  • $app.custom.ui.switchTheme(name, accent) // Eg. switchTheme('dark', 'summer') | switchTheme('light', 'darkknight') | switchTheme('dark') | switchTheme('classic') etc
  • You may seek for line - Customize behavior #1 - to add your own behavior
    Eg. Open a modal box

  • Hyperlink (home) added on logo (line: Customize behavior #2) 

// custom.js - js code
(function () {
    let custom = $app.custom = {}, util = custom.util = {}, user = custom.user = {}, ui = custom.ui = {};
    // current agent = IE browser?
    util.isBrowserIE = function () {
        return navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0
    // get user info
    user.getProfileInfo = function () {
        let username = $app.userName();
        if (username.length) {
            return eval('$app.AccountManager.list().' + username);
    // get user picture
    user.getProfilePicture = function () {
        let user = $app.custom.user.getProfileInfo();
        if (typeof user !== 'undefined') {
            if (typeof user.Handler !== 'undefined')
                return user.picture;
            else {
                let localUserPicture = eval('$app.AccountManager._avatars.' +;
                if (typeof localUserPicture !== 'undefined')
                    return localUserPicture;
            return 'text:' +, 1).toUpperCase();
        return '';
    user.sync = function (reloadPage) {
        if (typeof reloadPage === 'undefined') reloadPage = true;
        let user = $app.custom.user.getProfileInfo();
        if (typeof user !== 'undefined') {
            if (reloadPage) window.location.reload();
    // refresh layout alignment
    ui.refreshAlignment = function () {
        if ($app.custom.util.isBrowserIE()) {
            let evt = document.createEvent('UIEvents');
            evt.initUIEvent('resize', true, false, window, 0);
        } else {
            window.dispatchEvent(new Event('resize'));
    // dynamic Logo
    ui.refreshLogo = function () {
        let appLogo = $('.app-bar-toolbar .app-logo');
        if (appLogo.length) {
            let appTitle = __settings.appName, appLogoPath = __settings.splash.logo;
            if (appLogoPath.length) {
                appLogo.html('<img src="' + appLogoPath + '" title="' + appTitle + '" />');
            else {
                appLogo.html('<span>' + appTitle + '</span>');
    // switch theme
    ui.switchTheme = function (name, accent) {
        accent = typeof name !== 'undefined' && typeof accent === 'undefined' && name.toLowerCase() != 'light' && name.toLowerCase() != 'dark' ? name : typeof accent !== 'undefined' ? accent[0].toUpperCase() + accent.slice(1).toLowerCase() : $app.touch.settings('ui.theme.accent');
        name = typeof name !== 'undefined' && (name.toLowerCase() == 'light' || name.toLowerCase() == 'dark') ? name[0].toUpperCase() + name.slice(1).toLowerCase() : $app.touch.settings('');
        $app.touch._changeThemeLink(name + '.' + accent, name + '.' + accent, function () {
            $app.touch.settings('', name);
            $app.touch.settings('ui.theme.accent', accent);
    // customize behaviours
    $(document).on('click touchstart', '.ui-popup-container.ui-popup-active, #app-panel-menu-scope [data-panel="#app-panel-profile-context"]', function () {
        // Customize behavior #1 - Perhaps open a modal box
        return false;
    }).on('click touchstart', '.app-bar-toolbar .app-logo > *', function () {
// Customize behavior #2 - Add hyperlink to logo
        setTimeout(function () {
            $app._navigated = true;
            var returnUrl = window.location.href.match(/\?ReturnUrl=(.+)$/);
            window.location.replace(returnUrl && decodeURIComponent(returnUrl[1]) || __baseUrl);
        return false;
    }).ready(function () {

That's all from me.
If you guys have other ideas, please do share it.

Friday, January 17, 2020 11:46 AM | sdms
Is it possible to place some sort of character counter underneath a text box which counts down the number of characters available as you type into the text box. I have searched the forum and online help but could find anything.
COT Unlimited, TouchUI
Friday, January 17, 2020 6:50 AM | toni cop
in the gridview is it possible to not load all data when opened ?
Because i have tens of thousand records ,
Data load only when user click refresh or search.
Friday, January 17, 2020 6:17 AM | Saz
Dear Cot,

Now that ODP and Offline Sync are done, could you please focus on other data manipulation features of your product like:

-Reading Pane
-Group Aggregates
-Drawers in List/Card/Grid (Touch UI 3.0)
-Data Driven Surveys
-Survey Add-on
-Form Builder Add-on

Please update roadmap for 2020.
Friday, January 17, 2020 5:47 AM | justin
Does anyone have the full list of touch-settings.json?
If yes, please share it. TQ.

Here is mine: 
  "defaultUI": "TouchUI",
  "appName": "APP_TITLE",
  "map": {
    "apiKey": null
  "server": {
    "geocoding": {
      "google": {
        "key": "API_KEY"
  "charts": {
    "maxPivotRowCount": 100
  "ui": {
    "theme": {
      "name": "Light",
      "accent": "Azure",
      "preview": null
    "displayDensity": {
      "mobile": "Auto",
      "desktop": "Condensed"
    "list": {
      "labels": {
        "display": "DisplayedBelow"
      "initialMode": "SeeAll"
    "menu": {
      "tabbar": null,
      "apps": {
        "tiles": true,
        "location": "toolbar"
    "actions": {
      "promote": true,
      "reverse": null,
      "autoReverse": null
    "transitions": {
      "style": "slide"
    "sidebar": {
      "icons": true,
      "mini": true,
      "toolbar": true,
      "views": {
        "styles": null,
        "names": null,
        "collapsed": false
      "when": "Landscape"
    "toolbar": {
      "apps": true
    "scrollbars": {
      "wide": true
    "apps": {
      "location": "toolbar"
    "showSystemButtons": true,
    "smartDates": true,
    "notify": {
      "enabled": true,
      "location": "center",
      "duration": {
        "short": 2500,
        "medium": 5000,
        "long": 7500
    "thumbnail": {
      "width": 100,
      "height": 100,
      "crop": true
  "settings": {
    "enabled": true,
    "options": {
      "displayDensity": true,
      "theme": false,
      "transitions": false,
      "sidebar": false,
      "labelsInList": false,
      "showSystemButtons": false,
      "promoteActions": false,
      "smartDates": false,
      "initialListMode": false
  "membership": {
    "enabled": true,
    "profile": "view switch logout login",
    "help": true,
    "accountManager": {
      "enabled": true,
      "accessTokenDuration": 15,
      "refreshTokenDuration": 10080
  "help": {
    "enabled": true
  "search": {
    "quickFind": {
      "history": {
        "enabled": true,
        "depth": 25
  "splash": {
    "enabled": true,
    "logo": "../images/logo.png",
    "background": "../images/splash-screen.jpg",
    "duration": 2500
  "dates": {
    "localTime": {
      "enabled": true

Btw, can I know the difference between map.apiKey and

Thursday, January 16, 2020 3:22 PM | Ray Mueller
Your video's that you create are very useful. Is it possible to create a video on how to create a user control? I tried a couple of times which failed.

Thursday, January 16, 2020 3:09 PM | Adam Lark
I suppose I didn't really expect this to work, but I was wondering if anyone has found a work around.

I have a controller that is populated via a stored proc. The stored proc is a recursive query that generates a BOM. I have no other way to get this information organized the way this stored proc does.

Here is a look:

The sproc does all the math and sorting and indenting and its awesome.

I can produce the regular PDF report, but it looks terrible!

So, I figured I'd give the custom report template tutorial a shot. I wanted to gather a bunch of data from different controllers, but I can't create a data set with either of the example methods, because the data is coming from the stored procedure, not from a table in my database.

So then I figured id just create the custom report based solely on the SQL generated controller. I made a new view, set the Show in View Selector to false, checked the Create custom report template box and generated the COT app.

Then, I clicked the Develop Button in COT, VS opened up, i saw the RDLC for the custom report I just created annnnnnddddd:
Thursday, January 16, 2020 2:51 PM | toni cop
I get this error "Keyword not supported: 'host'." in browser when click Browse.
I use npgsql connection as data source.

I can make models in the designer, but when I click browse, the error as above in the browser
Thursday, January 16, 2020 6:37 AM | sdms
I have created a Google MAP API and configured it in COT after which the map icon appeared down the hand side of my grid. When I select the map icon a map opens but (1) the map is of the world i.e. zoomed right out and (2) there are no pins showing for the 5 records.
The grid comes from a database view which has a VPK, as well as field with alias names of Name, Address, City, State, Country and PostalCode
I am assuming the map is zoomed out because there are no pins displaying.
Wednesday, January 15, 2020 1:56 PM | Andy Wilbourn
If you have a many to many table and show the results in the grid, why do the choices not show up as a filter for the grid, or the search not find them? I was following a guide from and have the checkboxes working and the values show in the grid, just need my search to find records based on choices.
Tuesday, January 14, 2020 9:20 AM | uremovic
It seems that action columns are not supported in TouchUI. Is that true? If it is so, is there some other option for dealing with users clicking on specific field in grid? Has somebody made something similar?
Thanks in advance.
See All Posts