<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.aras.com/community/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>neil.lindberg さんのアクティビティ</title><link>https://www.aras.com/community/members/neil.lindberg</link><description>neil.lindberg さんの最近のアクティビティ</description><dc:language>ja-JP</dc:language><generator>Telligent Community 12</generator><item><title>Override IType Property auto-label</title><link>https://www.aras.com/community/f/development/35755/override-itype-property-auto-label</link><pubDate>Tue, 07 Jul 2020 19:02:13 GMT</pubDate><guid isPermaLink="false">916d3f7e-8ddc-42f8-8d45-380822f51406:29f4ef53-5282-40ef-802a-185c2010d95d</guid><dc:creator>neil.lindberg</dc:creator><description>&lt;p&gt;&lt;img src="/resized-image/__size/320x240/__key/communityserver-discussions-components-files/3/pastedimage1594147778340v1.png" alt=" " /&gt;&lt;/p&gt;
&lt;p&gt;After adding a property to an ItemType and tabbing from the property Name to the property Label there is the annoying behaviour I would like very much to override. I&amp;#39;d rather it stay blank than constantly needing to: Select all, delete, and finally enter a sensible label. I&amp;#39;m only critical of this annoyance because all the default labels are sensible, but whoever put together this auto-label didn&amp;#39;t seem to take that into account.&lt;/p&gt;
&lt;p&gt;For instance, the default label for &amp;quot;team_id&amp;quot; is simply &amp;quot;Team&amp;quot;, and the default label for &amp;quot;release_date&amp;quot; is &amp;quot;Release Date&amp;quot;. So, why would tab-to automatically copy the property name?&lt;/p&gt;
&lt;p&gt;I&amp;#39;d like if tab to split on underscore and did a caps op on every word. Then, rather than constantly needing to delete the auto-label to enter one that conforms to the default look of out-the-box Innovator IType labels, it would actually be helpful!&lt;/p&gt;
&lt;p&gt;This is a quick JS example, and I think if ANY auto-label this should be it:&lt;/p&gt;
&lt;p&gt;```&lt;/p&gt;
&lt;p&gt;// Change &amp;quot;release_date&amp;quot; property name to desired default-looking, &amp;quot;Release Date&amp;quot;:&lt;/p&gt;
&lt;p&gt;&amp;quot;release_date&amp;quot;.split(&amp;quot;_&amp;quot;).map(x =&amp;gt; x.charAt(0).toUpperCase() + x.substr(1,)).join(&amp;#39; &amp;#39;)&lt;/p&gt;
&lt;p&gt;````&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Aras 12: Error: Cannot access OAuth Server due to 500 (Internal Server Error)</title><link>https://www.aras.com/community/f/community/6060/aras-12-error-cannot-access-oauth-server-due-to-500-internal-server-error</link><pubDate>Fri, 14 Jun 2019 06:51:47 GMT</pubDate><guid isPermaLink="false">916d3f7e-8ddc-42f8-8d45-380822f51406:3689f2a2-1beb-475e-8dcc-8375e031ef58</guid><dc:creator>SunilReddy</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;We are getting an error as &amp;quot;&lt;span&gt;Error: Cannot access OAuth Server due to 500 (Internal Server Error)&amp;quot; while accessing Aras12. Please help me how to resolve this error.I&amp;#39;m attaching screenshot for your reference.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Thanks&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Sunil&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-discussions-components-files/10/Aras-12-error.png" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Force user to delete their browser cache?</title><link>https://www.aras.com/community/f/development/3475/force-user-to-delete-their-browser-cache</link><pubDate>Wed, 22 Nov 2017 03:36:31 GMT</pubDate><guid isPermaLink="false">916d3f7e-8ddc-42f8-8d45-380822f51406:10dd1172-f926-4514-90d6-da83a1c6216f</guid><dc:creator>AngelaIp</dc:creator><description>Hi,

When adding new features to an Aras instance, it is sometimes necessary for users to clear their browser cache.

What is the best way to force users to delete their browser cache? I don´t think it´s technically possible to do this automatically, is it?

How do other users deal with it? Are their any best practice tips (except sending a notification message)?

Thanks!!&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Running ARAS Innovator on Docker</title><link>https://www.aras.com/community/f/getting-started/6282/running-aras-innovator-on-docker</link><pubDate>Tue, 03 Sep 2019 11:03:27 GMT</pubDate><guid isPermaLink="false">916d3f7e-8ddc-42f8-8d45-380822f51406:964d6449-9efa-4dbe-a3fb-1ec0f5b9a871</guid><dc:creator>AlBer</dc:creator><description>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;I found these two web pages about running ARAS Innovator on Docker:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.software-vision.com/blog/2018/10/08/dockerinzing-aras-innovator.html"&gt;https://www.software-vision.com/blog/2018/10/08/dockerinzing-aras-innovator.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dejan-siedle/innovator-docker"&gt;https://github.com/dejan-siedle/innovator-docker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I was wondering if your corporation has any advices or solutions for this option?&lt;/p&gt;
&lt;p&gt;Best regards&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Token Authentication using the REST API</title><link>https://www.aras.com/community/b/english/posts/token-authentication-using-the-rest-api</link><pubDate>Thu, 02 May 2019 12:30:00 GMT</pubDate><guid isPermaLink="false">916d3f7e-8ddc-42f8-8d45-380822f51406:3cef7e0d-c20c-4e1d-8938-82e633d39d2e</guid><dc:creator>Christopher Gillis</dc:creator><description>&lt;p&gt;Aras Innovator&amp;nbsp;introduced an Authentication Server feature in 11.0 SP12 and has been fleshing it out with each new service pack. In 11.0 SP15, it is possible to request an OAuth token from this server that can be used with the &lt;a href="/b/english/posts/tech-tip-using-the-aras-restful-api"&gt;RESTful API&lt;/a&gt; as an alternative to basic authentication.&amp;nbsp;Using tokens is preferred for external apps as they don&amp;#39;t require you to keep your users&amp;#39; passwords in memory while your app runs. Because tokens expire after a set time, you can also rest assured that if a malicious party later acquires&amp;nbsp;the token, they won&amp;#39;t have access to your system.&lt;/p&gt;
&lt;p&gt;In this blog post, we&amp;#39;ll be going over examples of both requesting an OAuth token from the Aras Innovator server as well as using that token to authenticate additional requests. You can also check out this&amp;nbsp;&lt;a href="https://github.com/ArasLabs/rest-auth-example"&gt;Authentication Example&lt;/a&gt; on GitHub for a simple app that will&amp;nbsp;request a token and use that token to query the Parts in a database.&lt;/p&gt;
&lt;h2 id="register-your-app"&gt;Register Your App&lt;/h2&gt;
&lt;p&gt;One of the features of the Authentication Server is to limit what apps can request a token.&amp;nbsp;The Authentication Server keeps a list of registered apps that are able to request tokens, so external applications cannot get tokens by default. If you don&amp;#39;t wish to do any additional configuration, you can use the default &amp;quot;IOMApp&amp;quot; client registry.&amp;nbsp;However, we recommend adding a new client registry to register your app with the server by following the steps below.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the \OAuthServer\OAuth.config in your preferred text editor&lt;/li&gt;
&lt;li&gt;Scroll down to the bottom until you see &lt;strong&gt;&amp;lt;clientRegistry id=&amp;quot;IOMApp&amp;quot;&amp;gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;/strong&gt;Copy this node and all of its child nodes&lt;/li&gt;
&lt;li&gt;Paste them as a new section just below the original node&lt;/li&gt;
&lt;li&gt;Give a new ID to this registry corresponding to the purpose of your app&lt;/li&gt;
&lt;li&gt;Make sure this new registry has&amp;nbsp;&lt;strong&gt;enabled=&amp;quot;true&amp;quot;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;Make note of the ID you give this new registry. You will need to use it in the body of your request for a token which is covered later in this blog.&lt;/p&gt;
&lt;h2&gt;Get the OAuthServer URL&lt;/h2&gt;
&lt;p&gt;The first thing we&amp;#39;ll want to do is query for the location of the OAuthServer.&amp;nbsp;Because Aras Innovator allows most of its components to exist on separate servers, the OAuthServer may not be available from the same server as our Instance URL. However, the Innovator Server does have a way to query for this information by appending&amp;nbsp;&lt;strong&gt;/Server/OAuthServerDiscovery.aspx&lt;/strong&gt; to the end of your Instance URL:&amp;nbsp;&lt;strong&gt;&lt;/strong&gt;http://localhost/InnovatorServer/Server/OAuthServerDiscovery.aspx&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you&amp;#39;re using something like &lt;a href="https://www.getpostman.com/"&gt;Postman&lt;/a&gt;&amp;nbsp;to follow along with this blog, you can simply perform a get request on this URL with an empty body. The result of this request should look something like below.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;{&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;quot;locations&amp;quot;: [&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; {&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "uri": "http://localhost/InnovatorServer/oauthserver/"&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;nbsp; }&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; ]&lt;/code&gt;&lt;br /&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The URL we will use is stored in the&amp;nbsp;&lt;strong&gt;uri&lt;/strong&gt; property of the JSON returned from our request. The JSON path you can use to retrieve this information is&amp;nbsp;&lt;em&gt;locations[0].uri&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Get the Token Endpoint&lt;/h2&gt;
&lt;p&gt;Now that we have the URL of the OAuthServer, we will need to retrieve the exact URL that we can use to query for the token. This next URL is based on the &lt;a href="https://openid.net/specs/openid-connect-discovery-1_0.html"&gt;OpenID discovery specification&lt;/a&gt;. We will take the OAuthServer URL from our previous step and append&amp;nbsp;&lt;em&gt;.well-known/openid-configuration&lt;/em&gt; to the end of it: http://localhost/InnovatorServer/oauthserver/.well-known/openid-configuration. Again, we can query on this URL with a simple GET request without passing anything through the body.&lt;/p&gt;
&lt;p&gt;The response to this request is significantly longer, but it should contain our token endpoint somewhere near the top.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;{&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;quot;issuer&amp;quot;: &amp;quot;OAuthServer&amp;quot;,&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;quot;jwks_uri&amp;quot;: &amp;quot;http://localhost/InnovatorServer/oauthserver/.well-known/openid-configuration/jwks&amp;quot;,&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;quot;authorization_endpoint&amp;quot;: &amp;quot;http://localhost/&lt;span&gt;InnovatorServer&lt;/span&gt;/oauthserver/connect/authorize&amp;quot;,&lt;/code&gt;&lt;br /&gt;&lt;strong&gt;&lt;code&gt;&amp;nbsp; &amp;quot;token_endpoint&amp;quot;: &amp;quot;http://localhost/&lt;span&gt;InnovatorServer&lt;/span&gt;/oauthserver/connect/token&amp;quot;&lt;/code&gt;&lt;/strong&gt;&lt;code&gt;,&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;quot;userinfo_endpoint&amp;quot;: &amp;quot;http://localhost/&lt;span&gt;InnovatorServer&lt;/span&gt;/oauthserver/connect/userinfo&amp;quot;,&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;quot;end_session_endpoint&amp;quot;: &amp;quot;http://localhost/&lt;span&gt;InnovatorServer&lt;/span&gt;/oauthserver/connect/endsession&amp;quot;,&lt;/code&gt;&lt;br /&gt;&lt;code&gt;...&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The JSON path to retrieve this data is simply&amp;nbsp;&lt;em&gt;token_endpoint&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Get Token&lt;/h2&gt;
&lt;p&gt;The final request we&amp;#39;ll use to retrieve our token will use the token endpoint URL retrieved in the previous step. Because this token will be linked to a user&amp;#39;s credentials, we will need to pass in additional information before making our request. If you&amp;#39;re following along with Postman, you can use the Multipart Form to specify the following pieces of information in your body.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;grant_type&lt;/strong&gt; : &amp;quot;password&amp;quot;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Currently, I believe&amp;nbsp;&lt;strong&gt;&lt;/strong&gt;&amp;quot;password&amp;quot; is the only authentication type allows. Aras as a whole is moving towards more types of authentication in 12.0, so this is likely to change in the upcoming releases.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;scope&lt;/strong&gt; : &amp;quot;Innovator&amp;quot;
&lt;ul&gt;
&lt;li&gt;The scope of information this token will be able to access. &amp;quot;Innovator&amp;quot; will be used for almost all purposes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;client_id&lt;/strong&gt; : &amp;quot;IOMApp&amp;quot;
&lt;ul&gt;
&lt;li&gt;The ID of your client app you configured in the first step of this blog.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;username&lt;/strong&gt; : &amp;quot;YOUR_USER_NAME&amp;quot;
&lt;ul&gt;
&lt;li&gt;Any requests made using the returned token will share the same permissions as this user&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;password&lt;/strong&gt; : &amp;quot;YOUR_MD5_HASHED_PASSWORD&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;database&lt;/strong&gt; : &amp;quot;YOUR_DATABASE_NAME&amp;quot;
&lt;ul&gt;
&lt;li&gt;This should be the name of the database that this token will be able to access. &amp;quot;InnovatorSolutions&amp;quot; is the default name of Aras databases.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After configuring your body, you can send a POST request to the token endpoint URL with the body containing the properties defined above. The response will contain both the OAuth token as well as how long you will have until that token expires.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;{&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;quot;access_token&amp;quot;: &amp;quot;YOUR_TOKEN&amp;quot;,&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;quot;expires_in&amp;quot;: 3600,&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; &amp;quot;token_type&amp;quot;: &amp;quot;Bearer&amp;quot;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;}&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The JSON path to this token will be&amp;nbsp;&lt;em&gt;access_token&lt;/em&gt;. By default, the IOMApp token expires in 3600 seconds or 1 hour.&lt;/p&gt;
&lt;h2&gt;Make Request with Token&lt;/h2&gt;
&lt;p&gt;If you&amp;#39;ve ever used our previous &lt;a href="/b/english/posts/tech-tip-using-the-aras-restful-api"&gt;RESTful blog&lt;/a&gt;, you&amp;#39;ll know that we authenticated previously by passing in the username and hashed password into the &lt;strong&gt;AUTHUSER&lt;/strong&gt; and &lt;strong&gt;AUTHPASSWORD&lt;/strong&gt; headers respectively. With the token, we will authenticate using the standard HTTP&amp;nbsp;&lt;strong&gt;Authorization&lt;/strong&gt; header. Token authentication using this header follows the format below.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;Authorization : Bearer {YOUR_TOKEN}&lt;/p&gt;
&lt;p&gt;Note that the word &amp;quot;Bearer&amp;quot; must come before your token in the header. If you&amp;#39;re using Postman, there should be a way to configure authentication differently than other headers which should automatically add in this word for you. Alternatively, depending on the programming language you&amp;#39;re using to perform this request, there may be a special authentication class or library which will automatically add &amp;quot;Bearer&amp;quot; into the header for you as well.&lt;/p&gt;
&lt;p&gt;Regardless, once you have your Authorization header configured,&amp;nbsp;you can follow along with our previous RESTful blog, and you should notice that you can query for all of the same information. You can also confirm that the permission model is still in place by querying for items to which you do not have access.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;LOOKING FOR MORE ARAS INSPIRATION?&lt;/h3&gt;
&lt;p&gt;Subscribe to our blog and follow&amp;nbsp;&lt;a href="https://twitter.com/araslabs"&gt;@ArasLabs on Twitter&lt;/a&gt;&amp;nbsp;for more helpful content! You can also find our latest open-source projects and sample code on the&amp;nbsp;&lt;a href="https://github.com/ArasLabs"&gt;Aras Labs&amp;nbsp;GitHub&amp;nbsp;page&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>DEV - Optimizing ways and means of Import/Export</title><link>https://www.aras.com/community/f/development/35936/dev---optimizing-ways-and-means-of-import-export</link><pubDate>Fri, 04 Sep 2020 19:45:21 GMT</pubDate><guid isPermaLink="false">916d3f7e-8ddc-42f8-8d45-380822f51406:cbc6589b-323a-46e2-9044-dc70eaa4b875</guid><dc:creator>neil.lindberg</dc:creator><description>&lt;p&gt;As an admin/developer of Innovator I want to pretend I&amp;#39;m working in a repo where I can identify and track changes, or at the very least see all my changes so I can not miss a thing on Export.&lt;/p&gt;
&lt;p&gt;I&amp;#39;m still a noob. I&amp;#39;m not unfamiliar with Dbs of various flavors, and while I&amp;#39;ve a love of JS, I&amp;#39;m well versed in PHP and have used some other programming languages. I&amp;#39;m especially a fan of recognizing needs and making work easier and more streamlined.&amp;nbsp;For me, making life easier might come in the form of a bash one-liner, or a NodeJS server/app, or PostMan collection.&lt;/p&gt;
&lt;p&gt;I think Import/Export is lacking and there should be one tool in the end, and that tool should be built-in, not dissimilar to Nash Utility, but a whole lot prettier!&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s a summary of why I believe things should change.&lt;/p&gt;
&lt;p&gt;IMPORT&lt;/p&gt;
&lt;p&gt;In my experience there&amp;#39;s a mess when working with other developers in that sometimes a packages infers it should be imported using Nash Utility, or sometimes I&amp;#39;m to use the package tools Import tool.&lt;/p&gt;
&lt;p&gt;In my most recent battle I was given a package and the developer specified I had to use v12SP6 import tool. I just grabbed the latest, which I think was that associated with the SP9 package. It didn&amp;#39;t work, so I methodically tracked every step and took screenshots and all. Well, it ended up that when I got to the step that emphasizes a specific SP Import Tool, this time, I went to the FTP site and grabbed the Import tool of SP6, specifically, and the import worked. One of the greatest difficulties that I thought absurd during this headache was that I couldn&amp;#39;t even just simply select the text of errors in the popup of the Import Tool, so I always had to go open the log to get to the error. To me, that&amp;#39;s silly.&lt;/p&gt;
&lt;p&gt;All of these things have been very frustrating and highlighting a deficiency. And, then there&amp;#39;s the challenge of the necessity of doing things this way.&lt;/p&gt;
&lt;p&gt;EXPORT&lt;/p&gt;
&lt;p&gt;Well, I would bet many people have gone through this, but I just made my first package! I click all around and gather the pieces. The thing is looking robust and I think I&amp;#39;m done. I goto the Export tool and specify my package, and I check the box to export dependencies. I&amp;#39;m thinking there&amp;#39;s no way I can export this new ItemType wrong now.&lt;/p&gt;
&lt;p&gt;The created package will not import to the same Db, after restoring to pre-work, that my work started on. This is very frustrating. After days I just use Nash as an alternate means and start pasting the XML and importing, slowly, while sometimes importing the new pieces into the Db in the wrong order. I finally get to the new ItemType itself! My first ItemType! ...and I&amp;#39;m missing my Methods and my Lists from my export. I just missed them and they weren&amp;#39;t pulled in, and I can&amp;#39;t restore the Db I backed up where I did my work, exported, and replaced with the original Db, pre-work. I don&amp;#39;t know why... but, ouch. I can&amp;#39;t get to pieces of my first ItemType.&lt;/p&gt;
&lt;p&gt;----------&lt;/p&gt;
&lt;p&gt;SOLUTION DISCUSSION&lt;/p&gt;
&lt;p&gt;First of all, I wish my employer would pay me to just fix whatever I run into. Isn&amp;#39;t that a dev&amp;#39;s dream? I don&amp;#39;t mean Aras, I mean like just spend my day on StackOverflow and fix ***. But, that&amp;#39;s not the case.&lt;/p&gt;
&lt;p&gt;I never want to miss an ItemType -OR- any relationships be it Method, List, Permissions, Identities, and even PolyItems, etc. Miss nothing, always!&lt;/p&gt;
&lt;p&gt;I want to be able to see a picture of all my changes from a certain date like I&amp;#39;d checked out a branch.&lt;/p&gt;
&lt;p&gt;In the end I think there should be no need for separate Import/Export programs!&lt;br /&gt;There should be something to Export that utilizes authentication of &amp;quot;root&amp;quot; that works in the browser (like a Nash Utility) that can bundle changes a user has selected. That bundle should work as an Import in a browser-based tool that either: Knows the set order things need to import in -or- is order agnostic. I&amp;#39;m using the proper order, I think. Here&amp;#39;s a solution in the works. Feel free to contribute!&lt;/p&gt;
&lt;pre&gt;// Find all Innovator edit since time&lt;br /&gt;const inn = this.getInnovator();&lt;br /&gt;// Create Dialog.]&lt;br /&gt;const param = {&lt;br /&gt; aras,&lt;br /&gt; dialogWidth: 250,&lt;br /&gt; resizable: true,&lt;br /&gt; title: &amp;#39;Modified Since&amp;#39;&lt;br /&gt;};&lt;br /&gt;const wnd = aras.getMainWindow();&lt;br /&gt;const dialog = wnd.ArasModules.Dialog.show(&amp;#39;div&amp;#39;, param);&lt;br /&gt;/////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;// TODO: Edit to query for any new ItemTypes and tack onto itemTypes list to look for new instances. //&lt;br /&gt;/////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;const itemTypes = ['LIST', 'SEQUENCE', 'REVISION', 'VARIABLE', 'IDENTITY', 'MEMBER', 'USER', 'PERMISSION', 'METHOD', 'EMAIL MESSAGE', 'ACTION', 'REPORT', 'FORM', 'WORKFLOW MAP', 'LIFE CYCLE MAP', 'GRID', 'ITEMTYPE', 'RELATIONSHIPTYPE', 'FIELD', 'PROPERTY', 'VIEW', 'SQL', 'METRIC', 'CHART', 'DASHBOARD'];&lt;br /&gt;const badgeStyle = &amp;#39;style=&amp;quot;font-weight:200;background:#999;color:#fff;border-radius:5px;font-size:12px;padding:5px;margin-left:.5em;letter-spacing:.1em;padding-bottom:3px;position:absolute;top: 12px;text-align:center;&amp;quot;&amp;#39;;&lt;br /&gt;const table = &amp;#39;style=&amp;quot;display:table;width:100%;border-collapse:collapse;&amp;quot;&amp;#39;;&lt;br /&gt;const tableCell = &amp;#39;style=&amp;quot;display:table-cell;border:#000 1px solid;padding:.25em;&amp;quot;&amp;#39;;&lt;br /&gt;const tableCheckbox = &amp;#39;style=&amp;quot;display:table-cell;border:#000 1px solid;padding:.25em;text-align:center;&amp;quot;&amp;#39;;&lt;br /&gt;const tableHead = &amp;#39;style=&amp;quot;display:table-cell;border:#000 1px solid;font-weight:bold;background:#000;color:#fff;padding:.25em;&amp;quot;&amp;#39;;&lt;br /&gt;const yesterday = (d =&amp;gt; new Date(d.setDate(d.getDate() - 1)).toISOString().split(&amp;quot;T&amp;quot;)[0])(new Date());&lt;br /&gt;//&lt;br /&gt;let dateInputDiv, dateInputDOM, dialogDOM, contentDOM, changesList, changesListText, titleDOM, formFooterAdded = false;&lt;br /&gt;//&lt;br /&gt;const alternateRowBG = (i) =&amp;gt; `style=&amp;quot;display:table-row;${i % 2 ? &amp;#39;background: #e7e7e7;&amp;#39; : &amp;#39;&amp;#39;}&amp;quot;`;&lt;br /&gt;const formatRow = (itemType, id, name, modifiedOn) =&amp;gt; `&amp;lt;div ${tableCheckbox}&amp;gt;${getRowCheckbox(id, name, itemType)}&amp;lt;/div&amp;gt;&amp;lt;div ${tableCell}&amp;gt;${name}&amp;lt;/div&amp;gt;&amp;lt;div ${tableCell}&amp;gt;${itemType}&amp;lt;/div&amp;gt;&amp;lt;div ${tableCell}&amp;gt;${modifiedOn}&amp;lt;/div&amp;gt;`;&lt;br /&gt;const getBadge = (num) =&amp;gt; `&amp;lt;span ${badgeStyle}&amp;gt;${num}&amp;lt;/span&amp;gt;`;&lt;br /&gt;const getRowCheckbox = (id, name, itemType) =&amp;gt; {&lt;br /&gt; const checkboxName = `${name}---${itemType}`&lt;br /&gt; return `&amp;lt;input type=&amp;#39;checkbox&amp;#39; id=&amp;#39;${id}&amp;#39; name=&amp;#39;${checkboxName}&amp;#39;&amp;gt;`&lt;br /&gt;};&lt;br /&gt;const styleMe = (elem, styles) =&amp;gt; {&lt;br /&gt; for (const [key, value] of Object.entries(styles)) elem.style[key] = value;&lt;br /&gt;};&lt;br /&gt;// Build date input text box/style it&lt;br /&gt;const buildDateInput = () =&amp;gt; {&lt;br /&gt; dateInputDiv = document.createElement(&amp;#39;div&amp;#39;);&lt;br /&gt; const dateInput = document.createElement(&amp;#39;input&amp;#39;);&lt;br /&gt; dateInput.id = &amp;#39;modified-since-date-input&amp;#39;;&lt;br /&gt; dateInput.type = &amp;#39;date&amp;#39;;&lt;br /&gt; dateInput.max = yesterday;&lt;br /&gt; styleMe(dateInputDiv, {paddingLeft: &amp;#39;16px&amp;#39;, paddingRight: &amp;#39;16px&amp;#39;, maxHeight: &amp;#39;70vh&amp;#39;, overflowX: &amp;#39;hidden&amp;#39;, overflowY: &amp;#39;auto&amp;#39;});&lt;br /&gt; styleMe(dateInput, {width: &amp;#39;222px&amp;#39;, marginBottom: &amp;#39;16px&amp;#39;, marginTop: &amp;#39;8px&amp;#39;});&lt;br /&gt; dateInputDiv.appendChild(dateInput);&lt;br /&gt;};&lt;br /&gt;// Loop through the returned methods and return the list&lt;br /&gt;const buildChangesTable = (value) =&amp;gt; {&lt;br /&gt; changesListText = &amp;#39;&amp;#39;;&lt;br /&gt; const changesTable = document.getElementById(&amp;#39;changes-table&amp;#39;);&lt;br /&gt; if (changesTable) changesTable.remove();&lt;br /&gt; let changesList = `&amp;lt;div id=&amp;#39;changes-table&amp;#39; ${table}&amp;gt;&amp;lt;div ${alternateRowBG(-1)}&amp;gt;&amp;lt;div ${tableHead}&amp;gt;&amp;amp;nbsp;&amp;lt;/div&amp;gt;&amp;lt;div ${tableHead}&amp;gt;Item&amp;lt;/div&amp;gt;&amp;lt;div ${tableHead}&amp;gt;ItemType&amp;lt;/div&amp;gt;&amp;lt;div ${tableHead}&amp;gt;Modified On&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;`;&lt;br /&gt; let sinceDate = value + &amp;#39;T00:00:00&amp;#39;;&lt;br /&gt; let rowCount = 0;&lt;br /&gt; for (let i = 0; i &amp;lt; itemTypes.length; i++) {&lt;br /&gt; const itemType = itemTypes[i];&lt;br /&gt; const item = this.newItem(itemType, &amp;#39;get&amp;#39;);&lt;br /&gt; item.setAttribute(&amp;#39;select&amp;#39;, &amp;#39;id,name,modified_on&amp;#39;);&lt;br /&gt; // FIXME: We want unique results. It seems IT properties are heavily versioned. &lt;br /&gt; // groupBy doesn&amp;#39;t error, but doesn&amp;#39;t appear to do anything&lt;br /&gt; // item.setAttribute(&amp;#39;groupBy&amp;#39;, &amp;#39;id&amp;#39;);&lt;br /&gt; item.setProperty(&amp;#39;modified_on&amp;#39;, sinceDate);&lt;br /&gt; item.setPropertyAttribute(&amp;#39;modified_on&amp;#39;, &amp;#39;condition&amp;#39;, &amp;#39;gt&amp;#39;);&lt;br /&gt; const results = item.apply();&lt;br /&gt; if (results.isError()) {&lt;br /&gt; const errorDetail = results.getErrorDetail();&lt;br /&gt; // No items of type&lt;br /&gt; if (!/No items of type/.test(errorDetail)) {&lt;br /&gt; aras.AlertError(&amp;#39;results.isError(): &amp;#39; + errorDetail);&lt;br /&gt; return;&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; for (let j = 0; j &amp;lt; results.getItemCount(); j++) {&lt;br /&gt; const id = results.getItemByIndex(j).getProperty(&amp;#39;id&amp;#39;, &amp;#39;-id missing-&amp;#39;);&lt;br /&gt; const name = results.getItemByIndex(j).getProperty(&amp;#39;name&amp;#39;, &amp;#39;-name missing-&amp;#39;);&lt;br /&gt; const modifiedOn = results.getItemByIndex(j).getProperty(&amp;#39;modified_on&amp;#39;, &amp;#39;-modified_on missing-&amp;#39;);&lt;br /&gt; const row = formatRow(itemType, id, name, new Date(modifiedOn).format(&amp;#39;MM/dd/yyyy HH:MM&amp;#39;));&lt;br /&gt; changesListText += [id,itemType,name,modifiedOn].join() + &amp;#39;\n&amp;#39;;&lt;br /&gt; changesList += `&amp;lt;div ${alternateRowBG(rowCount)}&amp;gt;${row}&amp;lt;/div&amp;gt;`;&lt;br /&gt; rowCount++;&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt; changesList += &amp;#39;&amp;lt;/div&amp;gt;&amp;#39;;&lt;br /&gt; styleMe(dialogDOM, { width: &amp;#39;720px&amp;#39; });&lt;br /&gt; // TODO: Test that this: Why can&amp;#39;t we assign this once upon opening and keep the ref?&lt;br /&gt; contentDOM = document.querySelector(&amp;#39;.aras-dialog__content&amp;#39;);&lt;br /&gt; dateInputDOM = document.querySelector(&amp;#39;#modified-since-date-input&amp;#39;);&lt;br /&gt; titleDOM = document.querySelector(&amp;#39;.aras-dialog__title&amp;#39;);&lt;br /&gt; //&lt;br /&gt; titleDOM.innerText = &amp;#39;Modified Since &amp;#39; + value;&lt;br /&gt; titleDOM.insertAdjacentHTML(&amp;#39;beforeend&amp;#39;, getBadge(rowCount));&lt;br /&gt; const viewButton = document.createElement(&amp;#39;button&amp;#39;);&lt;br /&gt; viewButton.innerText = &amp;#39;View CSV&amp;#39;;&lt;br /&gt; viewButton.classList.add(&amp;#39;aras-button&amp;#39;);&lt;br /&gt; styleMe(viewButton, { position: &amp;#39;absolute&amp;#39;, top: &amp;#39;10px&amp;#39;, right: &amp;#39;40px&amp;#39;, paddingLeft: &amp;#39;.5em&amp;#39;, paddingRight: &amp;#39;.5em&amp;#39;, background: &amp;#39;transparent&amp;#39;, color: &amp;#39;darkblue&amp;#39;, boxShadow: &amp;#39;none&amp;#39;, border: &amp;#39;none&amp;#39;, cursor: &amp;#39;zoom-in&amp;#39; });&lt;br /&gt; viewButton.onclick = () =&amp;gt; {&lt;br /&gt; const resultsWindow = window.open(&amp;quot;about:blank&amp;quot;, &amp;quot;_blank&amp;quot;);&lt;br /&gt; // contentDOM = document.querySelector(&amp;#39;.aras-dialog__content&amp;#39;);&lt;br /&gt; resultsWindow.document.write(`&amp;lt;pre&amp;gt;${changesListText}&amp;lt;/pre&amp;gt;`);&lt;br /&gt; };&lt;br /&gt; titleDOM.appendChild(viewButton);&lt;br /&gt; // contentDOM.innerHTML += changesList;&lt;br /&gt; dateInputDOM.insertAdjacentHTML(&amp;#39;afterend&amp;#39;, changesList);&lt;br /&gt; // FIXME: Or... understand me? I don&amp;#39;t know why the onchange gets dropped between calls to this_function...? But, it does, so:&lt;br /&gt; dateInputDOM.onchange = ({ target }) =&amp;gt; {&lt;br /&gt; console.log(target.value, target.valueAsNumber);&lt;br /&gt; buildChangesTable(target.value);&lt;br /&gt; };&lt;br /&gt; if (!formFooterAdded) buildFormFooter();&lt;br /&gt;};&lt;br /&gt;// Add footer with Package Name input and Create Package button&lt;br /&gt;const buildFormFooter = () =&amp;gt; {&lt;br /&gt; const button = document.createElement(&amp;#39;button&amp;#39;);&lt;br /&gt; const packageNameInput = document.createElement(&amp;#39;input&amp;#39;);&lt;br /&gt; const submitDiv = document.createElement(&amp;#39;div&amp;#39;);&lt;br /&gt; styleMe(submitDiv, { padding: &amp;#39;16px&amp;#39;, display: &amp;#39;flex&amp;#39; });&lt;br /&gt; styleMe(packageNameInput, { width: &amp;#39;220px&amp;#39;, padding: &amp;#39;0.3em 0.3em 0.3em 0.5em&amp;#39;, flexGrow: 1, marginRight: &amp;#39;16px&amp;#39;, background: &amp;#39;#e7e7e7&amp;#39;, color: &amp;#39;#000&amp;#39;, marginRight: &amp;#39;16px&amp;#39;, letterSpacing: &amp;#39;.1em&amp;#39;, fontSize: &amp;#39;1.5em&amp;#39; });&lt;br /&gt; button.innerText = &amp;#39;Create Package&amp;#39;;&lt;br /&gt; button.classList.add(&amp;#39;aras-button&amp;#39;, &amp;#39;aras-button_primary&amp;#39;);&lt;br /&gt; styleMe(button, { padding: &amp;#39;.6em&amp;#39;, borderRadius: &amp;#39;.25em&amp;#39;, width: &amp;#39;auto&amp;#39;, background: &amp;#39;#000&amp;#39; });&lt;br /&gt; button.onclick = () =&amp;gt; {&lt;br /&gt; // Get checkbox values&lt;br /&gt; const checked = Array.from(document.querySelector(&amp;#39;.aras-dialog__content&amp;#39;).querySelectorAll(&amp;#39;input[type="checkbox"]:checked&amp;#39;)).map(x =&amp;gt; x.id);&lt;br /&gt; // Get Package (to create) name&lt;br /&gt; const name = packageNameInput.value;&lt;br /&gt; // Create package&lt;br /&gt; alert(`Put these:\n${checked.join(&amp;#39;\n&amp;#39;)}\nin package\n${name}\n`);&lt;br /&gt; /* FIXME: The following doesn&amp;#39;t error, but it also doesn&amp;#39;t actually create a PackageDefinition...?&lt;br /&gt; const newPackage = inn.newItem(&amp;#39;PackageDefinition&amp;#39;);&lt;br /&gt; newPackage.setAttribute(&amp;#39;name&amp;#39;, name);&lt;br /&gt; const result = newPackage.apply();&lt;br /&gt; */&lt;br /&gt; // LOGS, &amp;quot;More than one item&amp;quot;: console.log(result.getAttribute(&amp;#39;id&amp;#39;));&lt;br /&gt; };&lt;br /&gt; // aras-button aras-button_primary&lt;br /&gt; packageNameInput.id = &amp;#39;package-name&amp;#39;;&lt;br /&gt; packageNameInput.name = &amp;#39;package-name&amp;#39;;&lt;br /&gt; submitDiv.id = &amp;#39;modified-since-package&amp;#39;;&lt;br /&gt; //&lt;br /&gt; submitDiv.appendChild(packageNameInput)&lt;br /&gt; submitDiv.appendChild(button);&lt;br /&gt; contentDOM.appendChild(submitDiv);&lt;br /&gt; formFooterAdded = true;&lt;br /&gt;};&lt;br /&gt;// Seems necessary.&lt;br /&gt;setTimeout(() =&amp;gt; {&lt;br /&gt; buildDateInput();&lt;br /&gt; dialogDOM = document.querySelector(&amp;#39;.aras-dialog&amp;#39;);&lt;br /&gt; styleMe(dialogDOM, { height: &amp;#39;auto&amp;#39;});&lt;br /&gt; contentDOM = document.querySelector(&amp;#39;.aras-dialog__content&amp;#39;);&lt;br /&gt; contentDOM.appendChild(dateInputDiv);&lt;br /&gt; dateInputDOM = document.querySelector(&amp;#39;#modified-since-date-input&amp;#39;);&lt;br /&gt; dateInputDOM.onchange = ({ target }) =&amp;gt; {&lt;br /&gt; buildChangesTable(target.value);&lt;br /&gt; };&lt;br /&gt;}, 100);&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;Anwyway, the above results in a list with checkboxes and an input for package name, and all of that is collected and so badly wants to be a package, but I can&amp;#39;t seem to even create the package that I want to add all these things to.&lt;br /&gt;&lt;br /&gt;Ideas?&lt;/p&gt;
&lt;p&gt;&lt;img src="/resized-image/__size/320x240/__key/communityserver-discussions-components-files/3/pastedimage1600803303432v1.png" alt=" " /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-discussions-components-files/3/pastedimage1600441648263v1.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="/resized-image/__size/320x240/__key/communityserver-discussions-components-files/3/pastedimage1600803358414v2.png" alt=" " /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;...but, you just get an alert that tells me that I want to make a package with this stuff. I don&amp;#39;t get an error when trying to create a PackageDefinition, but it apparently isn&amp;#39;t created. Next steps:&lt;/p&gt;
&lt;p&gt;&lt;img src="/resized-image/__size/320x240/__key/communityserver-discussions-components-files/3/pastedimage1600803412324v3.png" alt=" " /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Actually create PackageDefinition&lt;/li&gt;
&lt;li&gt;Add selections to the new package (using id?)&lt;/li&gt;
&lt;/ol&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Fixed vs hard fixed difference</title><link>https://www.aras.com/community/f/development/35917/fixed-vs-hard-fixed-difference</link><pubDate>Mon, 31 Aug 2020 18:24:21 GMT</pubDate><guid isPermaLink="false">916d3f7e-8ddc-42f8-8d45-380822f51406:6995ded0-48fa-406d-a3dd-cc6f0f96612f</guid><dc:creator>hkhan</dc:creator><description>&lt;p&gt;whats the difference between fixed and hard fixed relatioship&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>MAKE SOME NOISE: community vs. /subscriber-portal - Logins are different and cannot set own password</title><link>https://www.aras.com/community/f/community/35909/make-some-noise-community-vs-subscriber-portal---logins-are-different-and-cannot-set-own-password</link><pubDate>Tue, 25 Aug 2020 18:44:13 GMT</pubDate><guid isPermaLink="false">916d3f7e-8ddc-42f8-8d45-380822f51406:ded3f30f-1b79-4e73-9eac-341cd02b2ba8</guid><dc:creator>neil.lindberg</dc:creator><description>&lt;p&gt;Both the Subscriber Portal and these community pages are under the domain community.aras.com&lt;/p&gt;
&lt;p&gt;Well, I was in class and I said I could never login to the subscriber portal. It was suggested that I use &amp;quot;Reset Password&amp;quot;, so I did.&lt;/p&gt;
&lt;p&gt;I thought it was broken because the spinner never stopped, but I did end up getting an email with a short scrambled password in it.&lt;/p&gt;
&lt;p&gt;I was expecting to not be able to login here, to Community, with my old credentials. But, I can. And, if I go to the Subscriber Portal at:&amp;nbsp;&lt;a href="/subscriber-portal/p/login"&gt;https://community.aras.com/subscriber-portal/p/login&lt;/a&gt;&amp;nbsp;I need to go lookup the email and use that new password.&lt;/p&gt;
&lt;p&gt;Well, I hope I can get some community voices supporting my problem as a must-fix! Having two logins for the same domain is silly.&lt;/p&gt;
&lt;p&gt;It wouldn&amp;#39;t be a problem if the login credentials worked for both and it appeared seamless. Even if there were two &amp;quot;buckets&amp;quot; at the very least I could then changed my Subscriber login password to one I can remember (and has more complexity than what is sent in a &amp;quot;reset&amp;quot; email)!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>User Preference Bundler</title><link>https://www.aras.com/community/f/development/35918/user-preference-bundler</link><pubDate>Mon, 31 Aug 2020 19:05:17 GMT</pubDate><guid isPermaLink="false">916d3f7e-8ddc-42f8-8d45-380822f51406:307bc84e-8b06-4a9f-be0e-fb13fd80a05b</guid><dc:creator>neil.lindberg</dc:creator><description>&lt;p&gt;In switching Dbs delivered by developers and also in our attempts to finalize the v11-to-v12 migration I&amp;#39;m irked by constantly needing to re-fix tables and save layouts.&lt;/p&gt;
&lt;p&gt;I think there should be a preference bundler so we can, as developers, export a little preferences package and load it into various Aras Innovator instances.&lt;/p&gt;
&lt;p&gt;Just layouts would save me time dragging around handles and re-saving.&lt;/p&gt;
&lt;p&gt;But, what would be fantastic is if the issue of the Pins being sorted by ID (so they don&amp;#39;t stay where you first added them unless you go edit the ItemType ItemType to sort by &amp;quot;created_on&amp;quot; instead of ID) were resolved via sort field change OR implementing a list or sequence to manage your pin layout, it would be so great not to need to go do the hack and then re-add pins every new system (especially as admin).&lt;/p&gt;
&lt;p&gt;Anyway, what do you think of: Preferences &amp;gt; Bundle for Import ???&lt;/p&gt;
&lt;p&gt;&lt;img src="/resized-image/__size/320x240/__key/communityserver-discussions-components-files/3/pastedimage1598900689674v1.png" alt=" " /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Issue in ARAS Innovator 12 localhost - very slow</title><link>https://www.aras.com/community/f/development/9596/issue-in-aras-innovator-12-localhost---very-slow</link><pubDate>Wed, 22 Apr 2020 09:24:43 GMT</pubDate><guid isPermaLink="false">916d3f7e-8ddc-42f8-8d45-380822f51406:ca55caca-61c5-41bb-bbf3-e6fbca2058ee</guid><dc:creator>SowmyaK</dc:creator><description>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;I have installed ARAS Innovator 12 in my laptop which is windows 10. After successful login, TOC page takes more than 30mins to load. Tried in all browsers but facing same issue.&lt;/p&gt;
&lt;p&gt;Tried couple of browser settings but none of them are working. Just to create an itemtype it would probably take 15mins. Could you pls suggest some solution for localhost speed up.&lt;/p&gt;
&lt;p&gt;Thanks&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Where are CSS minified?</title><link>https://www.aras.com/community/f/development/35888/where-are-css-minified</link><pubDate>Mon, 17 Aug 2020 16:54:46 GMT</pubDate><guid isPermaLink="false">916d3f7e-8ddc-42f8-8d45-380822f51406:f79e000a-54ea-4ba2-8fe6-1dbf0565a752</guid><dc:creator>neil.lindberg</dc:creator><description>&lt;p&gt;I just got off the horn with support for an hour because I thought it important that they know some:&lt;/p&gt;
&lt;p&gt;1. CSS classes are injected at view use of form on the creation/edit/view of an ItemType.&lt;/p&gt;
&lt;p&gt;2. Inline styles are injected with a default (for at least dropdowns) width of 89px;&lt;/p&gt;
&lt;p&gt;In the end you can spend all day perfecting the layout of a form in the WYSIWYG-ish editor for Forms and then you go to create the related ItemType only to see all your efforts crash and burn because of the injected CSS classes and inline styles.&lt;/p&gt;
&lt;p&gt;The call went fine, but in the end it was a case of: You found a workaround so have a nice day and feel free to file specific CSS changes as a change request with Aras.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Okay, well, I can go and add these to the main.css or the default.css and they&amp;#39;ll never show. This, of course, is because the minified css is what is being loaded - even if you&amp;#39;ve updated web.config to an new number (and you can see that number in the salt=NEW_NUMBER of the URL - learned that today!).&lt;/p&gt;
&lt;p&gt;But, guess what? There is no re-minification. I&amp;#39;ve been digging through the rollup used in the Client, but I am not finding where the minified command happens? The package.json doesn&amp;#39;t specifically have any package I&amp;#39;ve used for this. So... other than editing minified files (I use sed to slap on overrides at the end of whatever.css as a work-around, and I don&amp;#39;t like needing to do that because I&amp;#39;m just overriding other styles defined earlier in said CSS...).&lt;/p&gt;
&lt;p&gt;My ask is: Where are CSS minified? Also, if this isn&amp;#39;t something kicked off by version change in web.config, well, why not!?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>UX - Delete/Change &amp;quot;My*&amp;quot; ItemType default search</title><link>https://www.aras.com/community/f/development/35753/ux---delete-change-my-itemtype-default-search</link><pubDate>Tue, 07 Jul 2020 15:46:36 GMT</pubDate><guid isPermaLink="false">916d3f7e-8ddc-42f8-8d45-380822f51406:24e26db6-ef18-4e3b-b34a-c2db9d59e083</guid><dc:creator>neil.lindberg</dc:creator><description>&lt;p&gt;&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-discussions-components-files/3/pastedimage1594136486331v1.png" /&gt;&lt;/p&gt;
&lt;p&gt;Where I&amp;#39;m doing Aras development work I need to put company initials on all our ItemTypes.&lt;/p&gt;
&lt;p&gt;But, when I go to search ITs there are these pesky behaviours:&lt;/p&gt;
&lt;p&gt;1. I always need to delete &amp;quot;My*&amp;quot; and enter the company initials.&lt;/p&gt;
&lt;p&gt;2. I still need to click search - and I cannot set &amp;quot;Auto Search&amp;quot; to true as admin user.&lt;/p&gt;
&lt;p&gt;How would I go about changing or deleting &amp;quot;My*&amp;quot; as a default?&lt;/p&gt;
&lt;p&gt;Bonus: How to enable &amp;quot;Auto Search&amp;quot; on ITs?&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;UX: To me it is silly to default a search term and still require user interaction to actually run the query.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;UPDATE:&lt;/p&gt;
&lt;p&gt;I managed number 2 using root user credentials and AML post. I&amp;#39;ve confirmed and now ITypes &lt;strong&gt;have results right away, as desired&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-discussions-components-files/3/pastedimage1597434641222v1.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Now, if I could only identify the AML representation to update the IType -&amp;gt; Properties -&amp;gt; name &amp;quot;Default Search&amp;quot;... oh, Properties is a Relationship, right? I&amp;#39;ll start there.&lt;/p&gt;
&lt;p&gt;I got a hint from my Method IType, where I was able to use the GUI to define a default search that works just fine (matching a naming convention for this company &amp;quot;BL&amp;quot;.&lt;br /&gt;&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-discussions-components-files/3/pastedimage1597435431051v1.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Haha! This works - but you have to be &amp;quot;root&amp;quot;, not just &amp;quot;admin&amp;quot;:&lt;/p&gt;
&lt;p&gt;&lt;img src="/resized-image/__size/320x240/__key/communityserver-discussions-components-files/3/pastedimage1597435849440v1.png" alt=" " /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>Uploading Files via the Aras Innovator REST API</title><link>https://www.aras.com/community/b/english/posts/uploading-files-via-the-aras-innovator-rest-api</link><pubDate>Tue, 25 Jun 2019 19:30:00 GMT</pubDate><guid isPermaLink="false">916d3f7e-8ddc-42f8-8d45-380822f51406:326b3e74-cc63-4611-9b65-4bf0abad21c3</guid><dc:creator>Eli Donahue</dc:creator><description>&lt;p&gt;If you&amp;#39;ve been following our previous posts on the Aras Innovator RESTful API, you know just about everything you need to implement your own custom integrations, clients, tools, and mobile applications. You can perform basic &lt;a title="What is CRUD?" href="https://www.codecademy.com/articles/what-is-crud" rel="noopener noreferrer" target="_blank"&gt;CRUD&lt;/a&gt; operations to &lt;a title="Using the Aras RESTful API" href="/b/english/posts/tech-tip-using-the-aras-restful-api" rel="noopener noreferrer" target="_blank"&gt;create and modify Innovator data&lt;/a&gt;, and you can &lt;a title="Token Authentication using Aras Innovator" href="/b/english/posts/token-authentication-using-the-rest-api" rel="noopener noreferrer" target="_blank"&gt;use OAuth tokens to authenticate requests&lt;/a&gt;. All that&amp;#39;s missing is file handling!&lt;/p&gt;
&lt;p&gt;Files behave a little differently than other items in Innovator, so the Aras Innovator RESTful API includes some special actions for uploading files to the vault. In this post, we&amp;#39;ll cover these vault-specific endpoints to show how you can add file uploading to your custom projects.&lt;/p&gt;
&lt;p&gt;As in our previous posts about the RESTful API, we&amp;#39;re using an API development tool to demonstrate the HTTP requests needed to upload files. That way each, the example is language-agnostic and you can follow along without jumping right into code. If you want to follow along with the blog, you can download &lt;a title="Postman homepage" href="https://www.getpostman.com/" rel="noopener noreferrer" target="_blank"&gt;Postman&lt;/a&gt; for free.&lt;/p&gt;
&lt;p&gt;If you want to see how you can use these HTTP requests in code, check out &lt;a title="Uploading Files via the Aras RESTful API" href="https://github.com/ArasLabs/rest-upload-example" rel="noopener noreferrer" target="_blank"&gt;the rest-upload-example project&lt;/a&gt; on the &lt;a title="Aras Labs GitHub page" href="https://github.com/ArasLabs" rel="noopener noreferrer" target="_blank"&gt;Aras Labs GitHub&lt;/a&gt;. The project provides a simple HTML form that allows the user to enter the credentials for an Aras Innovator instance and select a file to upload. The included submitForm() JavaScript function authenticates the user and uploads the file to the specified vault via the HTTP requests covered below.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of the rest-upload-example community project on GitHub" src="https://github.com/ArasLabs/rest-upload-example/blob/master/Screenshots/screenshot.png?raw=true" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Screenshot of &lt;a title="Uploading Files via the Aras RESTful API" href="https://github.com/ArasLabs/rest-upload-example" rel="noopener noreferrer" target="_blank"&gt;the rest-upload-example community project&lt;/a&gt; on the Aras Labs GitHub&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Authentication&lt;/h2&gt;
&lt;p&gt;We&amp;#39;ll use OAuth to authenticate the HTTP requests in this example, so the first thing we need to do is get a new token from Innovator&amp;#39;s OAuth server. We&amp;#39;ve covered using OAuth tokens with Aras Innovator in &lt;a title="Token Authentication in Aras Innovator" href="/b/english/posts/token-authentication-using-the-rest-api" rel="noopener noreferrer" target="_blank"&gt;a previous blog post&lt;/a&gt;, so I won&amp;#39;t dive into the details here. Basically, you&amp;#39;ll need a POST request with the following information passed in the body:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;grant_type&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: &amp;quot;password&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;scope&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: &amp;quot;Innovator&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;client_id&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: &amp;quot;IOMApp&amp;quot;
&lt;ul&gt;
&lt;li&gt;&amp;quot;IOMApp&amp;quot; is the default client id for new Aras Innovator instances. You can find out how to change it or add a new client id &lt;a title="Register Your App" href="/b/english/posts/token-authentication-using-the-rest-api#register-your-app" rel="noopener noreferrer" target="_blank"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;username&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: &amp;lt;Innovator User&amp;gt;
&lt;ul&gt;
&lt;li&gt;Any requests made using the returned token will share the same permissions as this user&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;password&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: &amp;lt;MD5 password hash&amp;gt;
&lt;ul&gt;
&lt;li&gt;The rest-upload-example project demonstrates one way to create the hash from the password string entered by the user. Check out&amp;nbsp;&lt;span class="pl-en"&gt;getConnectionInput&lt;/span&gt;&lt;span&gt;() in &lt;a title="my-upload.js in the rest-upload-example project on GitHub" href="https://github.com/ArasLabs/rest-upload-example/blob/master/Code/js/my-upload.js" rel="noopener noreferrer" target="_blank"&gt;my-upload.js&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;database&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: &amp;lt;database name&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;#39;re using Postman to test or follow along, your request and reply should look something like this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Postman screenshot showing the token request" border="0" src="/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-04/1768.get_2D00_token.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Request a new OAuth token from the Aras Innovator OAuth server.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Once you get the request back from the vault server, you can get the token from the JSON object that&amp;#39;s returned. To authenticate our subsequent requests, we just need to include this token in the &amp;quot;Authorization&amp;quot; header.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p style="text-align:left;"&gt;&lt;span style="background-color:transparent;color:#11171a;float:none;font-family:inherit;font-size:inherit;font-weight:400;letter-spacing:normal;line-height:24.64px;text-align:left;text-decoration:none;text-indent:0px;text-transform:none;white-space:normal;"&gt;Note: You could use basic authentication to send these requests, but OAuth tokens are the preferred authentication approach moving forward.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Uploading the File&lt;/h2&gt;
&lt;p&gt;Now that we have our token for authenticating requests, there are just three basic steps to upload a file to Innovator via the RESTful API: get a transaction id, upload the file contents, and commit the transaction.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;1. Begin the Upload Transaction&lt;/h3&gt;
&lt;p&gt;The first step to upload a file to Innovator is to get a transaction id from the vault server. All we need to do to is send a POST request, authenticated with our token, to the vault.BeginTransaction endpoint. The result will be a JSON object with a &amp;quot;transactionId&amp;quot; property.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Postman screenshot showing the call to retrieve a transaction id from the vault server" border="0" src="/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-04/0211.start_2D00_transaction.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Get a new transaction id from the vault server with the vault.BeginTransaction endpoint.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We&amp;#39;ll include the transaction id in all of the calls to upload the file. This string should be unique to each file that you upload. If you need to upload multiple files, you&amp;#39;ll need to request a new transaction id for each. This helps the vault server process each file upload transaction.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="background-color:transparent;color:#000000;float:none;font-family:inherit;font-size:inherit;font-style:normal;font-weight:400;letter-spacing:normal;text-align:left;text-decoration:none;text-indent:0px;text-transform:none;white-space:normal;"&gt;Note: Postman does have an &amp;quot;Authorization&amp;quot; tab where you can choose the type of authentication you want to use and enter the token or credentials. That works, but I&amp;#39;ve opted to explicitly define the Authorization header to show how to use the OAuth token without a specific client feature.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2. Upload the File&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;Now that we have started a transaction with the vault server, we can start uploading the file. In this example, we&amp;#39;re uploading a small, simple text file to Innovator with a single HTTP request. However, you can also upload a file in &amp;quot;chunks&amp;quot; if you have a large file or network constraints. The &lt;a title="rest-upload-example source code" href="https://github.com/ArasLabs/rest-upload-example/blob/master/Code/js/my-upload.js" rel="noopener noreferrer" target="_blank"&gt;uploadFile() function&lt;/a&gt; in the rest-upload-example community project demonstrates how you can programmatically split your file upload into multiple requests.&lt;/p&gt;
&lt;p&gt;In the screenshot below, you can see we&amp;#39;re passing 5 headers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Content-Disposition:&lt;/strong&gt; attachment; filename*=utf-8&amp;#39;&amp;#39;&amp;lt;filename&amp;gt;
&lt;ul&gt;
&lt;li&gt;If your filename includes spaces or special characters, you&amp;#39;ll need to encode them. Check out &lt;a title="W3Scools url encoding" href="https://www.w3schools.com/tags/ref_urlencode.asp" rel="noopener noreferrer" target="_blank"&gt;this reference&lt;/a&gt; for character codes.&lt;/li&gt;
&lt;li&gt;Be sure to include the two single quotes before the file name (not a single double quote).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content-Range:&lt;/strong&gt; bytes &amp;lt;start index&amp;gt;-&amp;lt;end index&amp;gt;/&amp;lt;length&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content-Type:&lt;/strong&gt; &amp;quot;application/octet-stream&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;transactionid:&lt;/strong&gt; &amp;lt;transaction id from previous step&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family:inherit;font-size:inherit;"&gt;&lt;strong&gt;Authorization:&lt;/strong&gt; Bearer &amp;lt;OAuth token&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;#39;re uploading a file in a single HTTP request, setting the Content-Range header is pretty simple. The start index will be 0, end index will be length-1, and length will be the file size in bytes. For a 53 byte file, the Content-Range header will be set to &amp;quot;bytes 0-52/53&amp;quot;.&lt;/p&gt;
&lt;p&gt;If you&amp;#39;re uploading a file with multiple HTTP requests, you&amp;#39;ll need to calculate the Content-Range for &lt;em&gt;each&lt;/em&gt; request. If I were uploading the 53 byte file in 10 byte chunks, I would use the chunk&amp;#39;s original start and end index, as well as the file size. For example, the third 10 byte chunk of a 53 byte file would have the Content-Range header &amp;quot;bytes 20-29/53&amp;quot;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:inherit;font-size:inherit;"&gt;The body of each request should contain the bytes referenced by the Content-Range header. In this case, I&amp;#39;m uploading a whole text file so I can just paste the contents into the body of the Postman request.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Postman screenshot showing the headers for the vault.UploadFile request" border="0" src="/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-04/3835.upload_2D00_chunk.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Upload one or more file chunks using the vault.UploadFile endpoint.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;/i&gt;You&amp;#39;ll notice that the vault.FileUpload request above returned an empty body. This is expected. To check whether the upload succeeded or failed, check the status code that is returned. A 200 status code indicates success. If you&amp;#39;re getting a 40* or 500 error, double check your server credentials and request headers.&lt;/p&gt;
&lt;h3&gt;3. Commit the Upload Transaction&lt;/h3&gt;
&lt;p&gt;Once the contents of the file have been uploaded, we can commit the transaction. Committing the transaction tells the server we&amp;#39;re done uploading file content and the file can be moved from the transaction folder to its final destination in the vault. The file doesn&amp;#39;t exist in the vault until we get a successful response from the commit transaction request.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:inherit;font-size:inherit;"&gt;The headers of the vault.CommitTransaciton request are pretty straightforward. We&amp;#39;ll use the same transactionid and Authorization headers that we used to upload the file contents, however the Content-Type header will look a little different.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family:inherit;font-size:inherit;"&gt;&lt;strong&gt;Content-Type:&lt;/strong&gt; multipart/mixed; boundary=&amp;lt;boundary string&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family:inherit;font-size:inherit;"&gt;&lt;strong&gt;transactionid:&lt;/strong&gt; &amp;lt;transaction id&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family:inherit;font-size:inherit;"&gt;&lt;strong&gt;Authorization:&lt;/strong&gt; Bearer &amp;lt;OAuth token&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="font-family:inherit;font-size:inherit;"&gt;We need to define a boundary string to help the vault server parse the contents of the request body. You can use a randomly generated GUID, the item id, etc. Just make sure that the boundary you define in the header and the string you use in the request body match.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Postman screenshot showing the headers of the vault.CommitTransaction request" border="0" src="/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-04/3835.commit_2D00_transaction_2D00_headers.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Headers for the vault.CommitTransaction endpoint&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;The body of the vault.CommitTransaction request is composed of specially formatted text. Here&amp;#39;s the general format:&lt;/p&gt;
&lt;p&gt;&lt;span style="background-color:#ffff00;"&gt;&lt;code&gt;--&amp;lt;boundary string&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt; &lt;code&gt;Content-Type: application/http&lt;/code&gt;&lt;br /&gt;&lt;br /&gt; &lt;code&gt;POST http://&lt;span style="background-color:#ffff00;"&gt;&amp;lt;server&amp;gt;&lt;/span&gt;/&lt;span style="background-color:#ffff00;"&gt;&amp;lt;web alias&amp;gt;&lt;/span&gt;/Server/odata/File HTTP/1.1&lt;/code&gt;&lt;br /&gt; &lt;code&gt;Content-Type: application/json&lt;/code&gt;&lt;br /&gt;&lt;br /&gt; &lt;code&gt;{&amp;quot;id&amp;quot;:&amp;quot;&lt;span style="background-color:#ffff00;"&gt;&amp;lt;file item id&amp;gt;&lt;/span&gt;&amp;quot;,&amp;quot;filename&amp;quot;:&amp;quot;&lt;span style="background-color:#ffff00;"&gt;&amp;lt;filename&amp;gt;&lt;/span&gt;&amp;quot;,&amp;quot;file_size&amp;quot;:&lt;span style="background-color:#ffff00;"&gt;&amp;lt;total size in bytes&amp;gt;&lt;/span&gt;,&amp;quot;Located&amp;quot;:[{"file_version":1,"related_id":"&lt;span style="background-color: #ffff00;"&gt;&amp;lt;vault id&amp;gt;&lt;/span&gt;"}]}&lt;/code&gt;&lt;br /&gt; &lt;code&gt;&lt;span style="background-color:#ffff00;"&gt;--&amp;lt;boundary string&amp;gt;&lt;/span&gt;--&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;A couple things to note about the body format:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The strings highlighted in yellow will specific to your Innovator instance and the file you&amp;#39;re uploading.&lt;/li&gt;
&lt;li&gt;The &amp;lt;boundary string&amp;gt; parameter should be replaced with the boundary string defined in the request&amp;#39;s Content-Type header.&lt;/li&gt;
&lt;li&gt;The spacing in the body text is very important. All line endings should be carriage returns (\r\n). Depending on how you&amp;#39;re building the request body, you may or may not need to explicitly enter these line ending characters.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Postman screenshot showing the body of the vault.CommitTransaction request" border="0" src="/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-04/6558.commit_2D00_transaction_2D00_body.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;A sample request body and result for vault.CommitTransaction&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;/i&gt;A successful request will return a 200 status code and some body text about the new File item. You can parse the body text to get the JSON object and access the item&amp;#39;s properties.&lt;/p&gt;
&lt;h2&gt;Confirming the Upload&lt;/h2&gt;
&lt;p&gt;The commit request will return some metadata about the new File item, but you can perform a GET request if you want to get specific metadata. The screenshot below shows how to request a File item from Innovator, just like any other ItemType. You can also retrieve the contents of a file by adding &amp;quot;/$value&amp;quot; to the end of the request url.&lt;/p&gt;
&lt;h2&gt;&lt;img alt="Postman screenshot showing how to get the file we just uploaded" border="0" src="/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-04/6558.confirm_2D00_file_2D00_upload.png" /&gt;&lt;/h2&gt;
&lt;p&gt;&lt;i&gt;GET request to retrieve a File item from the Innovator server&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:inherit;font-size:inherit;"&gt;&lt;i&gt;&lt;span style="background-color:transparent;color:#000000;float:none;font-style:normal;font-weight:400;letter-spacing:normal;text-align:left;text-decoration:none;text-indent:0px;text-transform:none;white-space:normal;"&gt;Now you can include file uploading in your custom projects that use the Aras Innovator RESTful API! What are you going to try first? Share your ideas and questions in the comments below.&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Looking for more Aras inspiration?&lt;/h3&gt;
&lt;p&gt;Subscribe to our blog and follow&amp;nbsp;&lt;a href="https://twitter.com/araslabs"&gt;@ArasLabs on Twitter&lt;/a&gt;&amp;nbsp;for more helpful content! You can also find our latest open-source projects and sample code on the&amp;nbsp;&lt;a href="https://github.com/ArasLabs"&gt;Aras Labs&amp;nbsp;GitHub&amp;nbsp;page&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>AngelaIp</title><link>https://www.aras.com/community/members/neil.lindberg/activities/74f59be5-0f2f-4b6f-8f61-39bf721f95a9</link><pubDate>Mon, 03 Aug 2020 11:07:02 GMT</pubDate><guid isPermaLink="false">916d3f7e-8ddc-42f8-8d45-380822f51406:74f59be5-0f2f-4b6f-8f61-39bf721f95a9</guid><dc:creator>AngelaIp</dc:creator><description>&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>ERROR: client-side validation method: (intermediate value).format is not a function</title><link>https://www.aras.com/community/f/development/35805/error-client-side-validation-method-intermediate-value-format-is-not-a-function</link><pubDate>Wed, 22 Jul 2020 22:41:29 GMT</pubDate><guid isPermaLink="false">916d3f7e-8ddc-42f8-8d45-380822f51406:5e5cad45-cf5d-498e-81cd-3a4b3e838e24</guid><dc:creator>neil.lindberg</dc:creator><description>&lt;div&gt;&lt;span&gt;I can&amp;#39;t figure this out. I simply want a ... ceiling on a calendar input value.What is happening to this? I can take the same passed value and do the same operation in Chrome dev tools and it works perfectly as expected.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;What is Innovator doing here? It logs the inputTime, as a number, and I can take the same value and pass it to the same formatting function outside of this onChange listener function.&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;/*&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;@description:&amp;nbsp;Date&amp;nbsp;must&amp;nbsp;be&amp;nbsp;&amp;lt;=&amp;nbsp;today&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;
&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;@params:&amp;nbsp;this&amp;nbsp;[form&amp;nbsp;element]&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;//&amp;nbsp;Clean&amp;nbsp;clone&amp;nbsp;of&amp;nbsp;value&amp;nbsp;prop,&amp;nbsp;disconnecting&amp;nbsp;any&amp;nbsp;reference.&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;//&amp;nbsp;const&amp;nbsp;value&amp;nbsp;=&amp;nbsp;JSON.parse(JSON.stringify(this.value));&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;#39;BL_NotTomorrow&amp;#39;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;inn&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;Innovator&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;fieldMap&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;{&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;pr_found_date&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;#39;Problem&amp;nbsp;Report&amp;nbsp;found&amp;nbsp;date&amp;#39;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;created_on&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;#39;Opened&amp;nbsp;Date&amp;#39;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt;&amp;nbsp;{&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;}&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;#39;name/value:&amp;nbsp;&amp;#39;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;inputTime&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;getTime&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;typeof&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;inputTime&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;inputTime&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;formatted&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt;&amp;nbsp;{&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;//&amp;nbsp;FIXME:&amp;nbsp;sees&amp;nbsp;error&amp;nbsp;TypeError:&amp;nbsp;(intermediate&amp;nbsp;value).format&amp;nbsp;is&amp;nbsp;not&amp;nbsp;a&amp;nbsp;function&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;/*&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Yet&amp;nbsp;in&amp;nbsp;dev&amp;nbsp;tools&amp;nbsp;with&amp;nbsp;simple&amp;nbsp;expression&amp;nbsp;that&amp;nbsp;should&amp;nbsp;match&amp;nbsp;the&amp;nbsp;following&amp;nbsp;we&amp;nbsp;have&amp;nbsp;no&amp;nbsp;problems:&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new&amp;nbsp;Date(1595221200000).format(&amp;#39;MM/dd/yyyy&amp;#39;)&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;07/20/2020&amp;quot;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;formatted&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;inputTime&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;#39;MM/dd/yyyy&amp;#39;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;quot;END&amp;nbsp;TRY&amp;quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;catch&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;)&amp;nbsp;{&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;#39;:&amp;nbsp;&amp;#39;&lt;/span&gt;&lt;span&gt;&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&amp;#39;formatted,&amp;nbsp;inputTime,&amp;nbsp;now:&amp;nbsp;&amp;#39;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;formatted&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;inputTime&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;&amp;nbsp;?&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;#39;sees&amp;nbsp;error&amp;#39;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&amp;#39;does&amp;nbsp;not&amp;nbsp;see&amp;nbsp;error&amp;#39;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;); // sees error every time.&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;)&amp;nbsp;{&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;aras&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;AlertError&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;inn&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;newError&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`ERROR&amp;nbsp;&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;}&amp;nbsp;&lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;{&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;formatted&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&lt;/span&gt;&lt;span&gt;inputTime&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;)&amp;nbsp;?&amp;nbsp;&lt;/span&gt;&lt;span&gt;inn&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;newError&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`Value&amp;nbsp;of&amp;nbsp;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;fieldMap&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;]&amp;nbsp;||&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;#39;calendar&amp;#39;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&amp;nbsp;must&amp;nbsp;be&amp;nbsp;in&amp;nbsp;the&amp;nbsp;past.`&lt;/span&gt;&lt;span&gt;)&amp;nbsp;:&amp;nbsp;&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;^^^^^End code, but you wouldn&amp;#39;t know because this editor is as unfriendly as the code editor. Who wants to tab from the title to the print button!? Why would you have tabIndexes on your main form inputs like 128 and 256!? Everything about this thing takes extra time. Goodness gracious. Aras Innovator is going to kill me.&lt;br /&gt;&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-discussions-components-files/3/pastedimage1595458029645v1.png" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>