App Studio

Learn about the all-new App Studio tools, Live UI Inspection, and numerous application framework enhancements.

Labels
AJAX(112) App Studio(9) Apple(1) Application Builder(245) Application Factory(207) ASP.NET(95) ASP.NET 3.5(45) ASP.NET Code Generator(72) ASP.NET Membership(28) Azure(18) Barcode(2) Barcodes(3) BLOB(18) Business Rules(1) Business Rules/Logic(140) BYOD(13) Caching(2) Calendar(5) Charts(29) Cloud(14) Cloud On Time(2) Cloud On Time for Windows 7(2) Code Generator(54) Collaboration(11) command line(1) Conflict Detection(1) Content Management System(12) COT Tools for Excel(26) CRUD(1) Custom Actions(1) Data Aquarium Framework(122) Data Sheet(9) Data Sources(22) Database Lookups(50) Deployment(22) Designer(178) Device(1) DotNetNuke(12) EASE(20) Email(6) Features(101) Firebird(1) Form Builder(14) Globalization and Localization(6) How To(1) Hypermedia(2) Inline Editing(1) Installation(5) JavaScript(20) Kiosk(1) Low Code(3) Mac(1) Many-To-Many(4) Maps(6) Master/Detail(36) Microservices(4) Mobile(63) Mode Builder(3) Model Builder(3) MySQL(10) Native Apps(5) News(18) OAuth(9) OAuth Scopes(1) OAuth2(13) Offline(20) Offline Apps(4) Offline Sync(5) Oracle(11) PKCE(2) Postgre SQL(1) PostgreSQL(2) PWA(2) QR codes(2) Rapid Application Development(5) Reading Pane(2) Release Notes(184) Reports(48) REST(29) RESTful(29) RESTful Workshop(15) RFID tags(1) SaaS(7) Security(81) SharePoint(12) SPA(6) SQL Anywhere(3) SQL Server(26) SSO(1) Stored Procedure(4) Teamwork(15) Tips and Tricks(87) Tools for Excel(3) Touch UI(93) Transactions(5) Tutorials(183) Universal Windows Platform(3) User Interface(338) Video Tutorial(37) Web 2.0(100) Web App Generator(101) Web Application Generator(607) Web Form Builder(40) Web.Config(9) Workflow(28)
Archive
Blog
App Studio
Tuesday, October 17, 2023PrintSubscribe
Scrollbars, Booleans, Placeholders

Code On Time release 8.9.33.0 delivers on the promise of the app development nirvana with the new tools embedded directly in the live applications. Numerous enhancements and bug fixes are also here to make your apps better. Get the latest release and try them out!

New Embedded Development Tools

The new iteration of the App Studio introduces the project configuration hierarchies that are giving developers one-click access to the project settings, data models, and data controllers. The metadata with the hierarchy descriptors is embedded in the App Studio source code, which is just another web application created with Code On Time. Custom applications created with Code On Time have a tiny script that connects them to the App Studio when running on the localhost address. Microsoft IIS Express web server hosts the App Studio on the developer’s workstation.

The primary objective of the App Studio is to eliminate the learning curve and deliver unprecedented productivity with the live UI inspection and project configuration.

App Studio tools are activated when developers click on the icons surrounding the application boundaries. The Inspection tool activates the live UI inspection mode. The corresponding hierarchy with the pre-selected configuration item is displayed instantly in response to a click on a user interface element of the app. Developers make changes to the app configuration in the Properties Window attached to the hierarchy This eliminates the learning curve completely and delivers unprecedented productivity to novice and experienced developers alike.

image3.png
App Studio tools blend into the user interface of the live application. Developers use various hierarchies with the attached Properties Window to make changes to the app configuration. The RESTful API of the App Studio manipulates the project configuration in the response to the requests form the embedded development environment.

Both the Hierarchy and the Properties WIndow are making use of the RESTful hypermedia of the App Studio application. Its API allows manipulation of the project configuration elements.

App Studio is metadata-driven. The core configuration tools are fully functional with this release. The future releases of Code On Time will expand the metadata database delivering new capabilities to developers.

The current configuration of the metadata demonstrates only a small subset of the future capabilities. Code On Time will deliver the new feature drops at least once a month while we execute on the App Studio Roadmap.

Scrollbars

The main scrollable area of Touch UI forms and pages is provided with the programmatic vertical scrollbar. Grids also display the programmatic horizontal scrollbar that allows scrolling the grid columns. This ensured the uniform appearance of the app in the different browsers.

There are many other scrollable areas such as panels, lists, and menus that had the system scrollbars visible on the touch-screen devices only. The new release addresses this deficiency and provides the uniformly styled system scrollbars for the webkit browsers controlled with the pointer devices.

image6.png
All scrollable areas are now provided with the uniformly styled system scrollbars that match the presentation of the programmatic horizontal and vertical scrollbars of the Touch UI pages and forms. The system vertical scrollbar is visible in the Category Name context menu of the Products grid in this screenshot. The programmatic horizontal and vertical scrollbars are also visible.

Boolean Fields

The options of the Boolean fields are now as follows: N/A, Yes, No. Previously the options were N/A, No, and Yes. The framework will render checkboxes as the Drop Down List by default. The other input modes include the Check Box and Radio Button List.

image1.png
Here is an example of the RadioButtonList input style for the boolean. Previously the options were rendered vertically as No and Yes. Set the Rows property of the data field to 2 if you want the radio button list options to render vertically.

Future release will allow an easy change of the Boolean input style directly in the live application. Developers can set the input style in the legacy Project Explorer by selecting the corresponding lookup style in the field settings.

image2.png
The new embedded development tools provide the Input Style option with the supported choices when a Boolean field is inspected. The Properties Window adjusts the available configuration options according to the current state of the inspected object. Objects of the same type may have a different set of properties.

Native Placeholders

Starting with this release we are replacing the programmatic placeholders of the single-line input fields with the standard “placeholder” attribute.

Touch UI creates only one physical text input for the entire form. The input is activated for the focused field. The other fields are presented with the custom HTML, which significantly improves the performance of the form. Moreover the invisible form content remains in a raw unformatted state until activated. This enables enormous tabbed and wizard style forms with the partially hidden areas.

image4.png
The single-line inputs rely on the standard placeholder attribute.

Multi-Level Context Panels

The transitioning between levels in the context panels has been improved to ensure that relative vertical scrolling of a level remains the same during the transition and when users are returning back to the previous level. The panel contents were scrolled up during the transition in the Touch UI framework prior to this release.

Sync.*.xml File Formatting

The individual transactions in the Sync.*.xml files are saved with the formatting to simplify comparison when committing changes to the source control systems.

This is the significant improvement introduced to simply the team development with Code On Time. Previously the formatting was not performed on the sync files.

image5.png
The Sync.*.xml files of the project are keeping track of the Project Explorer transactions. Now the individual transactions are saved with the formatting to simplify the comparison in the visual tools when developers commit the project changes or review the history of changes.

The future releases of the new App Studio tools will also generate the sync transactions when developers manipulate the configuration hierarchies or change values in the Properties Window.

The legacy Windows-based Project Explorer and Project Wizard will be “retired” when the metadata database of the App Studio is completed.

“Visible When” and “ReadOnly When” Expressions

The JavaScript expressions specified in the Visible When and Read Only When properties of fields and actions can be written with the following syntax:

JavaScript
1234this.Country == 'USA'  // new syntax
/* the obsolete syntax examples */
[Country] == 'USA'     // old syntax
$row.Country == 'USA'  // old syntax

Use this new syntax instead of the older variations. Place “this.” in front of the field names. There is no need to change the code in the existing expressions though.

RESTful API Engine

The hypermedia expressions of the $app.restful() method now support the ".field-name" syntax that allows hypermedia navigation through the links in the resource field values. For example, the .definition >> .dataModel.columns path specified in the hypermedia key of the $app.restful(options) method will use the resource data values to figure the navigation path and final object of the result. The context option of the $app.restful method allows specifying the resource data for the field-level hypermedia navigation.

The API endpoint includes the correct self link for the dashboard data controllers with the form view tagged as rest-api-root.

The endpoint also includes the search link for the data controllers that can return a collection resource.

TreeView and PropGrid

The new $app.touch.treeView and $app.touch.propGrid methods are implementing the hierarchical and the properties presentation styles for data. Presently both APIs are being used by the App Studio. We are planning to integrate the APIs in the framework for general purpose usage. The hierarchy will be available in the UI of the data views with the self-referring lookup data fields and DataView fields. The property grid will become one of the optional presentation styles for the form views.

The App Studio tools rely on the Touch UI of the host application to render themselves. It shows the power of framework in the foundation of the applications created with Code On Time.

Release Notes

The following features and enhancements are included in this release:

  • (Touch UI) Fixed the incorrect positioning of the horizontal scrollbar in the grid views when the mouse pointer is detected.
  • (App Gen) The app generator window is brought to front when the App Studio completes synchronization actions.
  • (Touch UI) The new UI features PropGrid and TreeView are not a part of the framework. Both are integrated into the Properties Window of the App Studio.
  • (Universal Input) The native "placeholder" is now applied to the active data inputs. The synthetic multiline placeholder is applied to the multi-line and rich text.
  • (Touch UI) The options of the Boolean fields are now as follows: N/A, Yes, No. Previously the options were N/A, No, and Yes. The framework will render checkboxes as the DropDownList by default. The UI will present a toggle. Another option is to use CheckBox or RadioButtonList style of items.
  • (Universal Input) Browsers will not offer to autofill or autocomplete the values in the text fields.
  • (Universal Input) The dynamic input created when a field is gaining focus has the "name" attribute matching the name of the field. Previously there was neither the 'name' or 'id'
  • (Touch UI) The Drop Down List input does not display N/A text when the field has no value in edit mode.
  • (Touch UI) The multi-level context panels restore the vertical scroll position of the previous slide when users return back and provide a natural placement of the next slide. Previously both the previous and next slides were scrolled to the top before the start of the slide transition.
  • (Touch UI) Native scrollbars are now displayed in all scrollable areas of the UI with the exception of the "main" scrollable area with the content of the active page or form.
  • (Touch UI) Removed support for ui.scrollbars.modern property. Scrollbars are always modern going forward.
  • (Touch UI) Unified the styling of the synthetic and native scrollbars in the app.
  • (Touch UI) All scrollable areas of the UI are tagged with app-has-scrollbars class. It ensures the appearance of the system scrollbars.
  • (Reading Pane) The reading pane master toolbar trims the menu width correctly when previewed in the App Studio.
  • (Touch UI) Setting both ui.form.lines.horizontal and ui.form.lines.input to true will hide the horizontal lines in the forms in the edit mode. The inputs will appear outlined.
  • (Advanced Search) Auto-complete cache lists are cleared whenever there are changes to the other criteria in the form.
  • (Advanced Search) The value is not assigned a single-item list when the operation is changed unless there are sample values.
  • (Advanced Search) The "text" version of the value is formatted when the operation of the field is changed and there are sample values.
  • (RESTful) The $app.restful(options) method accepts the cacheTrimDepth key in opinions. If the key is not specified, then the cache trim depth is assumed to be 2. The previously cached resources are removed if their path matches the resource URL which is gradually trimmed the specified number of times per cacheTrimDepth value.
  • (RESTful) The system query parameters 'limit', sort, count, filter, and fields are never treated as possible field value filters.
  • (RESTful) The $app.restful(options) method will convert the object-style options.fields to the format compatible with the RESTful API fields parameter, which is modeled after the GraphQL.
  • (RESTful) The core framework propagates the exceptions when a RESTfulResource.IsRequested returns true. Otherwise the internal exception handling is performed. This improves the error reporting of the RESTful API Engine.
  • (RESTful) The warning to specify the 'value' key for a blob is not displayed if the content type of the request is multipart/form-data.
  • (RESTful) Method $app.restful() accepts the cache option. If the value of the option is true then the response is cached for 10 minutes while the page is loaded in the browsers. The value or the cache option can be specified as the number of seconds that will cause the response caching.
  • (RESTful) Extended the hypermedia expressions to support the ".fieldname" syntax that allows hypermedia navigation through the links in the resource field values.
  • (REStful) The data resource schema includes the "values" array with the possible list of values if the field defines a static set of items.
  • (RESTful) The API endpoint includes the correct self link for the dashboard data controllers with the form view tagged as rest-api-root.
  • (RESTful) The API endpoint includes the search link for the data controllers that can return a collection resource.
  • (REStful) The data resource schema includes the "values" array with the possible list of values if the field defines a static set of items.
  • (RESTful) The RESTfulResource.Current.LookupNavigationIdentifier(controller) method will locate the first data controller identifier by traversing the navigation history of the RESTful resource.
  • (RESTful) Generic exception handler will scan the "inner" exception for the RESTfulREsourceException instance. It is returned in the result if found. Otherwise the "general_error" is returned.
  • (Framework) The automation, form, and input keys are removed from the app settings when running in the App Studio mode.
  • (Framework) The ApplicationServicesBase.UserThemes(string) method will return the themes available at the specified root. App Studio uses this method to fetch the themes and accents of the active project.
  • (Touch UI) The appName key always has a value on the client. Previously, setting the key to null would have resulted in null value in the settings embedded in the page.
  • (Touch UI) The form layout engine has been changed to correctly reveal the collapsible categories that are not visible when the form is rendered for the first time.
  • (Touch UI) The "ghost" outlines of the collapsible categories with the invisible content are not visible anymore.
  • (Touch UI) Simplified the positioning of the app-wrapper and app-bar-actions.
  • (Touch UI) The $app.touch.show() method always clears the "forward' history when invoked. The forward history may contain previous instances of the forms when users cancel out.
  • (Touch U) The $app.touch.show(options) method accepts the mapped defaultValues object in the options argument.
  • (Touch UI) The $app.touch.show() method correctly executes Select|Edit|New commands if the parent view is not the same controller as the controller specified in the method options.
  • (Touch UI) The $app.touch.show() method returns an instance of a promise that will execute "then" if the form is closed with the Update or Insert action. Otherwise the promise is rejected.
  • (Touch UI) The $app.touch.activeElement(trigger) method returns the wrapped active element of the document. If the trigger parameter is specified then the namesake event is triggered on the active element.
  • (Touch UI) The standard links a[href] are not handled by the framework in any way if they point to an external resource.
  • (App Gen) Changed the format of the database connection exception for the metabuilder.
  • (Touch UI) The specific form width can be specified with the modal-width-NNN tag.
  • (Touch UI) Replaced the obsolete calls to focus/blur/select/click with the trigger method and the corresponding string value.
  • (Touch Core) Removed the legacy processing of Escape key in the panel implementation.
  • (Touch UI) The synthetic vertical scrollbar is positioned 1px away from the right side of the scrollable page area.
  • (Touch UI) The surrounding line around the list of values in autocomplete/dropdown/lookup is slightly darker in Touch UI.
  • (Touch UI) Fields with the names that include phone|fax, email, or url will have the system actions "call", "email" or "url" associated with them unless the field type is not 'String' or the corresponding data field is tagged as action-call-disabled, action-email-disabled, or action-url-disabled. Use action-call, action-email, or action-url on the fields that do not meet the "name" match criteria to force the system actions related to their values.
  • (Touch UI) The $app.input._refocus() method ensures that the original field can be focused unless the focus has moved elsewhere.
  • (Touch UI) The operating system context menu is allowed on any content that has the data-context-menu="true" applied to any of its closest descendants or self.
  • (Universal Input) A data field input that has lost focus is marked as app-was-focused. The class is removed when another input receives focus.
  • (Touch UI) The legacy scrollablepageready.app event has been removed from the framework. It existed to provide support for legacy PropGrid. The new implementation of the Property Grid relies on the pagereadycomlete.app event triggered on the shared instance of the survey.
  • (Universal Input) A click on the partial "glass pane" will not return to the previous modal screen if the current input value is not valid.
  • (Data Aquarium) The client library issues invoke(getpage|execute|getpagelist).app client-side events that allow the alternative execution of requests. App Studio uses this feature to access its own RESTful API.
  • (Touch UI) The $app.touch.whenPageShown(callback(page)) method now passes the “shown” page to the callback.
  • (Touch UI) The beforemodalcancel.app event is triggered on the document when users press the Escape key. If the default is prevented on the event, then the modal form will remain visible. The property grid uses this event to gradually remove the focus from the property before allowing itself to be closed with the next press of the Escape key.
  • (Touch UI) The data input fields are assigned the app-has-changed class if the default value is defined for the field and the current value is not equal to the default value. Input values are displayed in the "bold" font if the value has changed. The default values can be specified in the surveys only in the default property of a question.
  • (Touch UI) JavaScript expressions specified in the Visible When and Read Only When properties of fields and action can be written with the following syntax: this.Country === 'USA'
  • (Framework) The $app.eval method can handle inline (single-line) expressions for "get" and "set" operations when two or three arguments are specified. App Studio uses inline get/set expressions specified on the hierarchy nodes and object properties.
  • (Touch UI) The class app-field-label-other is applied to the "aside" and "count" field headers in the list/cards. This eliminates the styling conflicts with the fields named "Label".
  • (Touch UI) The new method dataView.extension().layout() will refresh the layout of the "shared" survey. Used by the Property Window to display the properties of the selected hierarchy node.
  • (Touch UI) Removed the code that was interacting with the window.external since the framework does not make use of Cloud On TIme anymore.
  • (Touch UI) Update icons to the latest Google Material Symbols.
  • (App Gen) The Sync.*.xml files are saved with indentation to simplify comparison during check in with source control (Git).
  • (Touch UI) Removed the code that was interacting with the window.external since the framework does not make use of Cloud On Time native app shell anymore.
Monday, August 7, 2023PrintSubscribe
Browser-Based Installer in App Studio

Code On Time release 8.9.30.0 moves the installation of the code generation library from the Windows-based executable to the browser-based App Studio. The studio homepage performs the check for updates when Code On Time starts on the developer’s workstation. The code generation library files are downloaded automatically. Developers are prompted to install the update when the new product releases become available.

Learn about the new Installer in the App Studio.
image1.png
App Studio home page will display a prompt when the new product update is available. Developers can opt to continue using the current version of Code On Time or proceed with the installation.

App Studio offers the new option to generate the HTML template for the active form. Select the “more” menu in the top toolbar of the App Studio and choose the Form Template command. You will see a prompt to save the HTML file with the corresponding form layout. The layout will be configured to render when the window matches the width of the selected device. Make sure to choose the right device and experiment with device orientation.

image2.png
The Form Template command will create the form layout for the active form or survey. The prompt to save the HTML file will appear when the command is selected while a form is the top-most view in the app.

The following features and enhancements are included in the release:

  • (App Studio) The 'Form Template' command in the studio context menu will create an HTML file with the template of the active form.
  • (Touch UI) The radio button list and checkbox list with horizontal scrolling and cascading dependency on another field will not cause the fields below to shift while the values are fetched in response to the changed parent field.
  • (App Gen) A tap on the product activation code will send the default browser to https://my.codeontime.com with "studio parameters". Developers must sign in with their credentials to activate the product.
  • (App Gen) Up to 10 attempts to access the started app are performed before the default browser is launched at the app URL. This eliminates the “site not found” error displayed by the browsers while the app is being configured for the first time to run with Microsoft IIS Express.
  • (App Gen) The news feed has been removed from the start page of the app generator. The newsfeed is now displayed in the App Studio application that will be launched when Code On Time is started on the workstation.
  • (App Gen) The news feed area provides the links to the v9 roadmap.
  • (App Gen) The installation of the code generation library is now performed by the App Studio application. The app generator will hide when the installation of the code generation library and product updates are performed. The app generator will reappear when the updates are completed.
  • (Touch UI) Content pages preserve the scroll top with the new $app.touch.contentScrollTip('save|restore') API.
  • (Touch UI) Notification toasts appear above the active progress screen.
  • (Touch UI) The width of the progress text depends on the view port of the device.
  • (RESTful) The binary parameter values can be specified in multipart/form-data payload in the custom actions of the RESTful API. The name of the parameter is specified as "parameters.PARAM_NAME". The value of the parameter is set to file://request/FILE_NAME by the RESTful API Engine where the FILE_NAME is the name of the file. Custom business rules can fetch the binary value from HttpContext.Current.Request.Files by using the value of the FILE_NAME as file index.
  • (RESTful) An improved detection of the invalid link name specified in the 'hypermedia' option.
  • (RESTful) The action ID specified in the path with the POST method will trigger the action identification on collections.
  • (RESTful) The arguments in the path are validated against the primary key fields if the target is the singleton object.
  • (Touch UI) The "cancel" icon on the form toolbar will call the _cancelCallback property of the dataview if specified. Otherwise the navigation will return one step back.
  • (App Gen) Library downloader included the builderVersion key into the studio.json exchange file. The builder version is used to install the code generation from App Studio.
  • (App Gen) Metadata builder now reports errors when the data provider is not able to return the requested information. Metadata builder queries the database to find information about data types, reserved words, tables, columns, relationships, etc. On rare occasions an exception may be raised if the database server is missing some configuration settings, which makes it impossible to fetch the metadata.
Our next goal is to deliver the hierarchy of the project settings directly in the live apps. The new Properties Window and Project Explorer will make it easy to configure the apps.
Monday, July 3, 2023PrintSubscribe
App Studio and SSO

App Studio

Code On Time release 8.9.29.0 introduces the first iteration of App Studio, the new integrated development environment is available directly in the live apps. It delivers unparalleled productivity and transforms an individual with the basic database management skills into an expert UI and API developer. Users without an account are required to sign in when they run the app generator. Authenticated users will see a brief prompt when the App Studio is starting locally. App Studio will become the primary user interface for the app builder starting with the version 9.

View the App Studio Roadmap and delivery schedule.

Single Sign-On

Any app with the ability to execute HTTP requests can implement the Single Sign-On with the Code On Time application configured for Federated Identity Management. An app created with Code On Time now has the ability to use another Code On Time application as an identity provider.

Federated Identity Management facilitates the Single Sign-On for internal and external applications.
image1.png
The sign-in user experience of the “identity provider” application becomes the only way to access the protected content in an “identity consumer” app when the provider is forced as the sole login option.

GetPage / Login Loop

End users of your apps may have experienced their session hang if they have signed into the app on several tabs and not selected the “Remember Me” option in the login prompt.. The redirection loop used to happen when the access token was refreshed. The framework may have used the old access token to make the requests for data. The infinite sequence of Login / GetPage or Login / Logout requests could be observed in the network log of the browser when this was taking place. The problem has been resolved!

The token refresh is possible for up to seven days after the initial login unless an attentive value is specified in the membership.accountManager.refreshTokenDuration option in the ~/app/touch-settings.json configuration file. If the app is being used for longer than that, then users will see a prompt to sign in again. Note that offline users can continuously work with the app for up to 180 days.

Miscellaneous

The following features, enhancements, and bug fixes are included in the release:

  • (PWA) Service worker installation closes the "offline" IndexedDB database upon installation and when a blob is fetched. The former will prevent the occasional locking of the "offline" database when Offline Sync attempts to update it with the required data stored.
  • (PWA) The "offline" database is closed when the blob "GET" request is raising an error.
  • (Login) Resolved the GetPage/Login loop issue.
  • (Touch UI) The "Cancel" icon is displayed in the correct position in the filter of child data views.
  • (Framework) jQuery 3.6.4 is now included in the apps..
  • (Universal Input) Multi-line placeholders remain wrapped to the next line when the input becomes focused.
  • (Touch UI) Event panelclosed.app is raised on the document object. The canceled event property specifies if the panel was closed without a menu item selected .
  • (Touch UI) QR-Code input and Scanner input are using "thennable" $app.getScript when loading the corresponding 3rd-party libraries.
  • (App Gen) Files restful.min.js is placed in the ~/app/js/sys folder in the apps with the framework encapsulated in the Class Library. This enables correct uploading of BLOBs and signatures.
  • (Touch UI) The child DataView fields are not refreshed during transition between forms when the data fetch timeout is zero.
  • (Touch UI) The entire page is marked with 'data-form-max' attribute. Previously only the "form" inside of the page was marked with this attribute.
  • (Touch UI) Tag a "form" view with data-form-max-(xs|sm|md) to ensure that the form content will not exceed the specified logical width of 480, 576, 768, and 992 pixels when the page is wider than the specified value. The contents of the form will be centered horizontally.
  • (Touch UI) Fixed the position of the ">" icon in the group menu items of the minimized sidebar.
  • (Touch UI) Survey will not crash if both 'text' and 'text2' headers are specified and the pre-compiled survey is displayed more than once.
  • (Offline Sync) The "broken" "cloud" icon will not be displayed when the app is preparing to download the frontend.
  • (Data Aquarium) The Authorization header is not specified when Login and Logout methods are invoked by the framework
  • (Data Aquarium) The session-level user identity is correctly replaced when the user access token is renewed.
  • (Data Aquarium) The session-level token is removed when the user signs in with another identity and selects to have it remembered.
  • (Touch UI) Method $app.touch.notify() will force all messages by default. Previously the 'force:true' option had to be specified.
  • (App Gen) Sensitive values of Connection String and Secret Key parameters are obscured in the code generation log.
  • (App Gen) Command -Refresh will cause the app to rebuild the source code base.
  • (App Gen) The -Refresh switch will not re-create the data models if the -Session option is specified.
  • (Touch UI) Method $app.touch.show() accepts the definition of a survey as an argument. Use 'then' and 'fail' chain methods to handle the user selection. The 'then' method will have the data object representing the data values of the survey as an argument.
  • (RESTful) The "services" hypermedia is present in the RESTful API. The resource will always include the oauth2 link and an optional collection of hypermedia for the microservices.
  • (RESTful) Access tokens are validated against AppIdentity provider if the access token is not found in the app database. This enables microservices architecture based on multiple modular RESTful apps created with Code On Time. The cluster of the modules validates the tokens with the Federated Identity Management provider app.
  • (OAuth2) Endpoint /oauth2/v2/userinfo accepts the 'auth' parameter in the body. The value must be encoded in the Basic HTTP Authorization format. If there is a client with the 'client_id' and 'client_secret' values that match the auth parameter, then the 'appidentity' key is included in the output to complement the claims of the user specified in the Authorization header of the request.
  • (OAuth2) RESTful API engine enhances the OAuth data with 'auth_remote_addr' and 'token_remote_addr' to keep track of the access token authorization and refresh requests.
  • (Touch UI) The "login" app state will force the app to navigate to the state.redirect_uri. This state is activated when an OAuth provider is detected in the ID_PROVIDER cookie and the user is not authenticated. This state will cause the anonymous user to be redirected to the identity provider.
  • (Framework) OAuth providers allow switching accounts and adding new accounts in the app by default. Previously, only the "logout" option was available.
  • (Framework) Property 'RemoteAddress' of the ApplicationServices class returns the remote address of the client.
  • (OAuth Identity Providers) The '.TOKEN' and '.PROVIDER' cookies are renamed to '.ID_TOKEN' and '.ID_PROVIDER'.
  • (OAuth) Endpoint /oauth2/v2 included the "self" hyperlink and 'issuer' key that represents the display name of the application.
  • (OAuth) The 'appidentity' claim is included in the JWT (id_token) when the 'urn:appidentity:user' is requested. The claim includes the 'username', 'email', 'roles', and 'picture' keys.
  • (OAuth) The 'aud' claim in JWT (id_token) specifies the URI of the client application.
  • (Framework) Controller MyProfile will fetch the "display name" of the identity provider if the "App Identity" authorization is supported in the app.
  • (Touch UI) The built-in login form will persist the display name of the "App Identity" provider in the local storage. The name is configured in the server-side business rule of MyProfile data controller.
  • (App Identity) App Identity provider can be registered in the CMS of the app.
  • (App Identity) The self-referring App Identity is not visible as the login option in the identity provider application.
  • (RESTful) The property BusinessRules.RESTfulResult can be used to produce the "result" key in the resource output.
  • (Framework) Method ActionResult.Add(name, value) will add an instance of a FieldValue to the result.
  • (RESTful) The related errors have the error in the message property. Previously the related error descriptions were specified in the description property.
  • (App Gen) The Session parameter specified in the command line as "sessionid:frequence" will create a collection of the session log entries. Used by the App Studio to display the progress.
  • (RESTful API) The "PrimaryKey" field is removed from the confirmation controller schema in the parameters of a custom action.
  • (App Gen) The "builderLocation" key is added to the studio.json file. App Studio uses its value to start Code On Time app builder in the command line mode.
  • (RESTful) The engine will not include the 'count' key in the collection resource unless the 'count=true' query parameter is specified. Previously the count was produced when the parameter was not specified. The 'count' key is included in the collection if the 'page' query parameter is specified.
  • (Framework) Property ViewPage.TotalRowCount will not cause an exception when the value is assigned to the ViewPage instance with the PageSize equal to zero.
  • (RESTful) The engine will access the limt=0 parameter and return no data when a request to a collection is made. Previously only the positive 'limit' values where allowed
  • (RESTful) Method $app.restful performs enhanced parameter processing for hypermedia during transition. The transition properties 'query', 'body', 'files', and 'headers' can be specified as the object properties in the options. The name of the object must match the transition segment, e.g 'customers >>'.
  • (RESTful) Method $app.restful will use the 'transit' link in the current object during the hypermedia transition. Otherwise the 'self' link is used to figure the next request.
  • (RESTful) Filtering is supported on the data controllers based on "code" business rules.
  • (RESTful) Fixed business rules processing with the RESTful API when the data controller is based on "code" business rules. Previously only the GET operations were possible. The framework attempted to open a non-existing database connection for the custom data controllers.
  • (Framework) App "id" is embedded as 'appStudio/self/id' in the __settings variable.
  • (App Gen) The -Develop command line switch will start Visual Studio with project source code loaded.
  • (Framework) NUglify is used to compress the primary set of JS files.
  • (Framework) The appstudio.json file is located above the ~/app folder.
  • (CMS) The standard JavaScript business rules are removed from the definition of the SiteContent data controller. The rules are migrated to the ~/js/surveys/cms/site-content.js.
  • (Data Aquarium) Method $app.getScript returns an instance of the Promise object.
  • (Data Aquarium) The map of controllers with custom JavaScript business rules is specified in $app.getScript.controllers key. The framework will automatically load the rules when the data is selected via GetPage method.
  • (Data Aquarium) Definition of $app.cms is externalized to ~\app\js\surveys\cms\site-content.js.
  • (Data Aquarium) Implementation of $app.survey is moved from ~/app/js/daf/daf.js to ~/app/js/daf/daf-survey.js.
  • (Touch UI) Fixed teh vertical alignment of "check mark" in the checkboxes.
  • (Bootstrap) Vertical alignment of material icons matches the vertical alignment of display flow.
  • (Display Flow) Fixed icon positioning in display flow headers.