<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://community.appian.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>End-User Rich Text Editor Component</title><link>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component</link><description /><dc:language>en-US</dc:language><generator>Telligent Community 12</generator><item><title>End-User Rich Text Editor Component</title><link>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component</link><pubDate>Fri, 14 Jun 2024 20:07:11 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:3db951cf-ae18-4eb3-ade0-88ff9f63dc35</guid><dc:creator>Appian Max Team</dc:creator><comments>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component#comments</comments><description>Current Revision posted to Guide by Appian Max Team on 6/14/2024 8:07:11 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;div class="callout-box callout-info"&gt;Starting in 24.2, the &lt;a href="https://docs.appian.com/suite/help/latest/Styled_Text_Editor_Component.html"&gt;Styled Text Editor Component&lt;/a&gt; is available directly in the product. Consider using this component over the plug-in moving forward.&lt;/div&gt;
&lt;p&gt;This component is not part of the Appian base product. It is a component plugin managed by Appian Professional Services and it can be downloaded on the &lt;a href="/b/appmarket/posts/rich-text-editor"&gt;Appian AppMarket&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please see the &lt;a href="/w/guide/3321/rich-text-editor-component-troubleshooting-guide"&gt;Component Plug-in Troubleshooting Guide&lt;/a&gt;&amp;nbsp;if you have any issues.&amp;nbsp; If you have further questions please email &lt;a href="mailto:richtext-componentpluginsupport@appian.com"&gt;richtext-componentpluginsupport@appian.com&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="plugin_components"&gt;Plugin Components&lt;/h2&gt;
&lt;p&gt;As of version 1.5.3, this plugin includes two (2) components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fn!richTextField()&lt;/code&gt; - This is the plugin&amp;rsquo;s original component.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fn!richTextFieldWithTables()&lt;/code&gt; - This component is new as of version 1.5.3.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Refer to the&amp;nbsp;chart below to understand what formatting each component supports.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Component&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Text Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Table Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Image Uploads&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fn!richTextField()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fn!richTextFieldWithTables()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All information in this guide applies to both components, unless stated that it only applies to one of the components.&lt;/p&gt;
&lt;h3&gt;Why are there 2 components?&lt;/h3&gt;
&lt;p&gt;In order to provide table support, we needed to switch to a new underlying library that supports tables. This new library generates HTML that is different from the previous library. To prevent refactoring and unintended behavior for those using the plugin currently, we opted to keep the existing component as is If you want to migrate to the new component, refer to the &lt;a href="#migrate_components"&gt;How to migrate to fn!richTextFieldWithTables &lt;/a&gt;section below.&lt;/p&gt;
&lt;p&gt;Also, the new component, fn!richTextFieldWithTables(), strictly uses standard HTML attributes for all formats, which should simplify complexities with passing the output HTML to downstream systems, such as email or document generation.&lt;/p&gt;
&lt;h2 id="parameters"&gt;Parameters&lt;/h2&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Keyword&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Applicable Component(s)&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Label&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;label&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text to display as the field label.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Label Position&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;labelPosition&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text to determine where the label appears. Valid values include&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;ABOVE&amp;quot; (default) Displays the label above the component.&lt;/li&gt;
&lt;li&gt;&amp;quot;ADJACENT&amp;quot; Displays the label to the left of the component.&lt;/li&gt;
&lt;li&gt;&amp;quot;COLLAPSED&amp;quot; Hides the label. The label will still be read by screen readers.&lt;/li&gt;
&lt;li&gt;&amp;quot;JUSTIFIED&amp;quot; Aligns the label alongside the component starting at the edge of the page.&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text displayed below the field&amp;#39;s value.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Help Tooltip&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;helpTooltip&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Displays a help icon with the specified text as a tooltip. The tooltip displays a maximum of 500 characters. The help icon does not show when the label position is &amp;quot;COLLAPSED&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Required&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;required&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Shows or hides the asterisk indicating if the component is required but does not enforce requiredness. To enforce requiredness, use the parameter &amp;quot;validations&amp;quot;. To enforce requiredness only upon submission, use section or form-level validations.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Disabled&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;disabled&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if the user is prevented from changing the value. Default: false.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Validations&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;validations&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Validation errors to be displayed below the field when the value is not null.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Height&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;height&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines the field height. Valid values include &amp;quot;SHORT&amp;quot;, &amp;quot;MEDIUM&amp;quot; (default), and &amp;quot;TALL&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Show When&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;showWhen&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines whether the component is displayed on the interface. When set to false, the component is hidden and is not evaluated. Default: true.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rich Text Value&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;richTextValue&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Rich text to display in the field.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rich Text Save Into&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;richTextSaveInto&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Save Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;One or more variables that are updated with the richText value when the user changes it. Use a!save() to save a modified or alternative value to a variable.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Read Only&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;readOnly&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if the field should display as not editable. Default: false.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Max Size&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;maxSize&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Number (Integer)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Maximum size of the HTML formatted rich text data (not number of characters). Default: 10000.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Placeholder&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;placeholder&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text to display in the field when it is empty. Does not show if the field is read only.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Enable Progress Bar&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;enableProgressBar&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Whether to show the progress bar of what percent of rich text data users have entered. Default: true.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Allowed Formats&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;allowedFormats&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines which format styles are allowed. Note: these must be set on page load and cannot change. Valid values: &amp;quot;header&amp;quot;, &amp;quot;size&amp;quot;, &amp;quot;bold&amp;quot;, &amp;quot;italic&amp;quot;, &amp;quot;underline&amp;quot;, &amp;quot;strike&amp;quot;, &amp;quot;color&amp;quot;, &amp;quot;background&amp;quot;, &amp;quot;link&amp;quot;, &amp;quot;align&amp;quot;, &amp;quot;indent&amp;quot;, &amp;quot;list&amp;quot;. Default: All styles. See &lt;a href="#allowed-formats"&gt;more info&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;Note that fn!richTextFieldWithTables() sets this parameter to &amp;quot;All styles&amp;quot; by default on the back-end as this is the most common setting in the older component. If you&amp;#39;d like to parameterize allowed styles, please reach out with a request.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Table Border Style&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;tableBorderStyle&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextFieldWithTables()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines the style of the grid border. Valid values: &amp;quot;STANDARD&amp;quot; (default), &amp;quot;LIGHT&amp;quot;, &amp;quot;NONE&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Allow Images&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;allowImages&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;fn!richTextField()&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if images are allowed. Default: false.&amp;nbsp;See &lt;a href="#image-uploads"&gt;more info&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;Note that fn!richTextFieldWithTables() does not support image upload at this time. If you&amp;#39;d like to allow this behavior, please reach out with a request.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Image Storage Connected System&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;imageStorageConnectedSystem&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Connected System&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The instance of the &lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&amp;nbsp;used to store images from the rich text editor. This is required if allowImages is set to true.&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Uploaded Images&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;uploadedImages&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Map&amp;nbsp;Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;An array of images uploaded during this&amp;nbsp;session with metadata about the image. &amp;quot;wasRemovedFromField&amp;quot; is true when a user uploads an image but then removes it in the same session.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="notes"&gt;Notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Due to the potential large size of the HTML output of this component, do not save this value into a process variable or a node parameter. Instead, use an expression to load and persist the HTML output directly on the user interface.&lt;/li&gt;
&lt;li&gt;Do not use validations&amp;nbsp;to validate the maximum length of the HTML formatted rich text value. Instead, use the parameter maxSize.&lt;/li&gt;
&lt;li&gt;Use validations&amp;nbsp;to validate the maximum length of characters that an end-user can enter in the component. To calculate the number of characters, using the functions fn!len()&amp;nbsp;and fn!striphtml().&lt;/li&gt;
&lt;li&gt;When the rich text field is displayed in a read-only format, set the parameter height&amp;nbsp;to AUTO&amp;nbsp;for optimal results.&lt;/li&gt;
&lt;li&gt;The parameter required&amp;nbsp;doesn&amp;rsquo;t actually validate that the richTextValue is not null. This is a limitation of the component plug-in framework. Use section-level or form-level validations to validate the requiredness of the richTextValue.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="data_storage"&gt;Data Storage&lt;/h2&gt;
&lt;h3&gt;Database Column Type Options&lt;/h3&gt;
&lt;p&gt;There are two options for storing the HTML output of this component in your database; the considerations of which are listed below.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;VARCHAR column type, or equivalent&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;LONGTEXT column type, or equivalent&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Max Size&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Limits the maximum size of the HTML output to 4,000 characters (varies by database)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The maximum size of the HTML output can be as great as 50,000 characters, which is large enough to essentially be considered no limit to a user&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Persistence&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Designers can pass this output and the CDT with this field into process variables&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;It is strongly &lt;strong&gt;recommended to only use this option if you will be writing and reading from the database directly from SAIL interfaces&lt;/strong&gt;; never pass data of this column type into process variables&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Support&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;This is a standard database column type which can be exported, modified, and migrated easily&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;This is not a standard database column type, which could lead to difficulties when trying to export, modify, or migrate&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Querying&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Searching and sorting against this column type is performant (see Querying below for more information)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Searching and sorting against this column type is not performant, and might not be supported depending on your database&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="querying"&gt;Querying Against The Rich Text Data&lt;/h3&gt;
&lt;p&gt;For the use case of searching or sorting against the rich text data, it is recommended to separately create a column in your CDT to store the raw text. &amp;nbsp;The raw text column should be the same type and size of the HTML column. Whenever searching or sorting against the rich text data, search or sort against this column, not the HTML column.&lt;/p&gt;
&lt;p&gt;To populate the raw text column, there are two options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Using the&amp;nbsp;fn!striphtml() function in Appian. This is best used when&amp;nbsp;the size of your data is small, or when the contents of the rich text editor never hits a process variable.&lt;/li&gt;
&lt;li&gt;Using database triggers. This is best used when it&amp;#39;s important to avoid increasing the&amp;nbsp;memory&amp;nbsp;consumption of the process engines, such as when the rich text editor contents are large and passed through process.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To create database triggers to update this field on every INSERT or UPDATE to the database table, follow the instructions below for accomplishing this in MariaDB. For other databases, use the same design, just adjust to match your database&amp;rsquo;s syntax.&lt;/p&gt;
&lt;p&gt;Replace [RAWTEXT_COL] with the name of your raw text column, [HTML_COL] with the name of your html column, and [TABLE_NAME] with the name of your table.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="sql"&gt;-- Create a function to strip html tags given a string

DELIMITER &amp;amp;&amp;amp;

CREATE FUNCTION `strip_tags`($str text) RETURNS text
BEGIN
   DECLARE $start, $end INT DEFAULT 1;
   LOOP
       SET $start = LOCATE(&amp;quot;&amp;lt;&amp;quot;, $str, $start);
       IF (!$start) THEN RETURN $str; END IF;
       SET $end = LOCATE(&amp;quot;&amp;gt;&amp;quot;, $str, $start);
       IF (!$end) THEN SET $end = $start; END IF;
       SET $str = INSERT($str, $start, $end - $start + 1, &amp;quot;&amp;quot;);
       SET $str = REPLACE($str, &amp;quot;&amp;#160;&amp;quot;, &amp;quot; &amp;quot;);
   END LOOP;
END&amp;amp;&amp;amp;

DELIMITER ;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="sql"&gt;-- Create triggers to execute strip_tags() on the html column with every insert or update, and store the raw text

DELIMITER &amp;amp;&amp;amp;

CREATE TRIGGER `store_raw_input_insert`
BEFORE INSERT ON `[TABLE_NAME]`
FOR EACH ROW BEGIN
    SET NEW.`[RAWTEXT_COL]` = strip_tags(NEW.`[HTML_COL]`);
END&amp;amp;&amp;amp;

CREATE TRIGGER `store_raw_input_update`
BEFORE UPDATE ON `[TABLE_NAME]`
FOR EACH ROW BEGIN
    SET NEW.`[RAWTEXT_COL]` = strip_tags(NEW.`[HTML_COL]`);
END&amp;amp;&amp;amp;

DELIMITER ;&lt;/pre&gt;&lt;/p&gt;
&lt;h3 id="emails"&gt;Sending Emails&lt;/h3&gt;
&lt;p&gt;For the use case of sending formatted emails created by end users, a designer must consider the maximum size of the HTML output as well as the expected email volume.&lt;/p&gt;
&lt;p&gt;When sending emails with the Send Email node, the &amp;nbsp;HTML output is loaded and cached in the process execution engine as a string. &amp;nbsp;Over time, the cached values accumulate in memory and can lead to memory resource issues.&lt;/p&gt;
&lt;p&gt;It is recommended to perform non functional testing by sending representative emails at the expected email volume for at least 3 days to measure and evaluate the impacts on the system memory usage and ensure a scalable application in production.&lt;/p&gt;
&lt;p&gt;To configure in process, in the Send Email node, either pass the HTML output as an expression to the ad-hoc message body, or pass the HTML output as an input parameter to the HTML template message body.&lt;/p&gt;
&lt;h2 id="allowed_formats"&gt;Allowed Formats&lt;/h2&gt;
&lt;p&gt;Only applicable for &lt;code&gt;fn!richtextfield&lt;/code&gt;. This parameter to the function fn!richTextField()&amp;nbsp;allows the designer to configure which formatting options are available to the end users when entering rich text into the field such as &amp;ldquo;bold&amp;rdquo;, &amp;ldquo;italic&amp;rdquo;, &amp;ldquo;list&amp;rdquo;, etc.&lt;/p&gt;
&lt;h4 id="configuring"&gt;Configuring this Parameter&lt;/h4&gt;
&lt;p&gt;For consistency and ease of development/maintenance across the platform, the allowed formats should be stored in a constant and used in all instances of the rich text editor.&lt;/p&gt;
&lt;h4 id="modifying"&gt;Modifying Allowed Formats&lt;/h4&gt;
&lt;p&gt;Allowed format options should never be removed after users have already entered data in this field in a production setting (outside of special circumstances), since this means previously-entered text would not be backwards compatible with the updated component configuration. &amp;nbsp;For example, if a user had formatted using a numbered list, and &amp;ldquo;list&amp;rdquo; was removed as an allowed format, then all numbered lists that were previously saved would render incorrectly in the updated component configuration.&lt;/p&gt;
&lt;p&gt;If you do need to remove some allowed formats after users have already entered text in a production setting, it is recommended to pass the previously allowed formats to the component whenever it is rendered as read-only. &amp;nbsp;For example, picture a comment thread that supported &amp;ldquo;list&amp;rdquo; for a while, then removed &amp;ldquo;list&amp;rdquo; format. The read-only fields, displaying previously-entered comments, could still support &amp;ldquo;list&amp;rdquo; while the editable field for new comments would no longer support &amp;ldquo;list&amp;rdquo;. &amp;nbsp;However, this gets more complicated when editing of previously-entered data is considered (e.g. editing an existing comment).&lt;/p&gt;
&lt;h2 id="image_uploads"&gt;Image Uploads&lt;/h2&gt;
&lt;p&gt;Only applicable for &lt;code&gt;fn!richTextField&lt;/code&gt;. To enable image uploads, you must do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install the&amp;nbsp;&lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Create a knowledge center and folder to store uploaded documents and note the new folder&amp;#39;s UUID&lt;/li&gt;
&lt;li&gt;Create a new connected system object which leverages the&amp;nbsp;&lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Enter the folder&amp;#39;s UUID and the user context to use when uploading images&lt;/li&gt;
&lt;li&gt;Create a new Connected System constant which points to the new Connected System object in your application&lt;/li&gt;
&lt;li&gt;In your interface where you use&amp;nbsp;fn!richTextField(), set allowImages&amp;nbsp;to true and imageStorageConnectedSystem&amp;nbsp;to the constant created in the previous step&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note: only the URL to the uploaded image, not the image content itself, is stored in the generated HTML&amp;nbsp;from&amp;nbsp;fn!richTextField().&amp;nbsp; This means that if you use the generated HTML outside of Appian (e.g., in an email), the image will not display unless the outside viewer is already logged into Appian.&lt;/p&gt;
&lt;h2 id="migrate_components"&gt;Migrate Components&lt;/h2&gt;
&lt;p&gt;If you have not yet used either component, you can use whichever one suits your needs best. However, be mindful that it is non-trivial to migrate between fn!richTextField and fn!richTextFieldWithTables and the latter will likely receive more enhancements over time, as the underlying library which renders it is kept up-to-date more.&lt;/p&gt;
&lt;p&gt;The fn!richTextField component relied on non-standard HTML attributes to provide formatting, specifically indentation and nested list formatting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Indentation: fn!richTextField&amp;nbsp;uses the HTML class &amp;quot;ql-indent-N&amp;quot; (where N is the indentation level) for both line indents and for nested lists.&amp;nbsp;fn!richTextFieldWithTables uses the HTML standard style=&amp;#39;margin-left: Npx&amp;#39; for line indents and nested list tags for nested lists (e.g. &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Bullet&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Nested Bullet&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;). This means that if you were using fn!richTextField and saved end-user formatted indentation or nested lists, fn!richTextFieldWithTables will not recognize these specific formats when rendering and will drop the indentation and nested lists.&lt;/li&gt;
&lt;li&gt;Paragraphs: fn!richTextField relies on &amp;lt;div&amp;gt; tags to separate paragraphs, while fn!richTextFieldWithTables relies on &amp;lt;p&amp;gt; tags. This means that passing end-user formatting text from fn!richTextField to fn!richTextFieldWithTables will drop all paragraphs and carriage returns.&lt;/li&gt;
&lt;li&gt;Font Color:&amp;nbsp;fn!richTextField&amp;nbsp;relies on&amp;nbsp;&amp;lt;span&amp;gt;&amp;nbsp;tags with a&amp;nbsp;style attribute for font color (e.g. &amp;lt;span style=&amp;#39;color: rgb(153, 51, 255);&amp;#39;&amp;gt;), while&amp;nbsp;fn!richTextFieldWithTables&amp;nbsp;relies on&amp;nbsp;&amp;lt;font&amp;gt;&amp;nbsp;tags with a color attribute (e.g. &amp;lt;font color=&amp;#39;#9c00ff&amp;#39;&amp;gt;). This means that font colors will get dropped if you directly&amp;nbsp;pass end-user formatting text from&amp;nbsp;fn!richTextField&amp;nbsp;to&amp;nbsp;fn!richTextFieldWithTables.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;#39;d like to migrate end-user formatting text to fn!richTextFieldWithTables, you can write an expression which updates the non-standard indentation attributes and div tags to be recognized by the new component. However this may be more involved for nested lists which will require a more complicated update than just find and replace.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: Architecture, plugins&lt;/div&gt;
</description></item><item><title>End-User Rich Text Editor Component</title><link>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component/revision/10</link><pubDate>Tue, 23 Apr 2024 13:20:46 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:3db951cf-ae18-4eb3-ade0-88ff9f63dc35</guid><dc:creator>Appian Max Team</dc:creator><comments>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component#comments</comments><description>Revision 10 posted to Guide by Appian Max Team on 4/23/2024 1:20:46 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;p&gt;This component is not part of the Appian base product. It is a component plugin managed by Appian Professional Services and it can be downloaded on the &lt;a href="/b/appmarket/posts/rich-text-editor"&gt;Appian AppMarket&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please see the &lt;a href="/w/guide/3321/rich-text-editor-component-troubleshooting-guide"&gt;Component Plug-in Troubleshooting Guide&lt;/a&gt;&amp;nbsp;if you have any issues.&amp;nbsp; If you have further questions please email &lt;a href="mailto:richtext-componentpluginsupport@appian.com"&gt;richtext-componentpluginsupport@appian.com&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="plugin_components"&gt;Plugin Components&lt;/h2&gt;
&lt;p&gt;As of version 1.5.3, this plugin includes two (2) components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fn!richTextField()&lt;/code&gt; - This is the plugin&amp;rsquo;s original component.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fn!richTextFieldWithTables()&lt;/code&gt; - This component is new as of version 1.5.3.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Refer to the&amp;nbsp;chart below to understand what formatting each component supports.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Component&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Text Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Table Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Image Uploads&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fn!richTextField()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fn!richTextFieldWithTables()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All information in this guide applies to both components, unless stated that it only applies to one of the components.&lt;/p&gt;
&lt;h3&gt;Why are there 2 components?&lt;/h3&gt;
&lt;p&gt;In order to provide table support, we needed to switch to a new underlying library that supports tables. This new library generates HTML that is different from the previous library. To prevent refactoring and unintended behavior for those using the plugin currently, we opted to keep the existing component as is If you want to migrate to the new component, refer to the &lt;a href="#migrate_components"&gt;How to migrate to fn!richTextFieldWithTables &lt;/a&gt;section below.&lt;/p&gt;
&lt;p&gt;Also, the new component, fn!richTextFieldWithTables(), strictly uses standard HTML attributes for all formats, which should simplify complexities with passing the output HTML to downstream systems, such as email or document generation.&lt;/p&gt;
&lt;h2 id="parameters"&gt;Parameters&lt;/h2&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Keyword&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Applicable Component(s)&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Label&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;label&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text to display as the field label.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Label Position&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;labelPosition&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text to determine where the label appears. Valid values include&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;ABOVE&amp;quot; (default) Displays the label above the component.&lt;/li&gt;
&lt;li&gt;&amp;quot;ADJACENT&amp;quot; Displays the label to the left of the component.&lt;/li&gt;
&lt;li&gt;&amp;quot;COLLAPSED&amp;quot; Hides the label. The label will still be read by screen readers.&lt;/li&gt;
&lt;li&gt;&amp;quot;JUSTIFIED&amp;quot; Aligns the label alongside the component starting at the edge of the page.&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text displayed below the field&amp;#39;s value.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Help Tooltip&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;helpTooltip&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Displays a help icon with the specified text as a tooltip. The tooltip displays a maximum of 500 characters. The help icon does not show when the label position is &amp;quot;COLLAPSED&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Required&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;required&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Shows or hides the asterisk indicating if the component is required but does not enforce requiredness. To enforce requiredness, use the parameter &amp;quot;validations&amp;quot;. To enforce requiredness only upon submission, use section or form-level validations.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Disabled&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;disabled&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if the user is prevented from changing the value. Default: false.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Validations&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;validations&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Validation errors to be displayed below the field when the value is not null.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Height&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;height&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines the field height. Valid values include &amp;quot;SHORT&amp;quot;, &amp;quot;MEDIUM&amp;quot; (default), and &amp;quot;TALL&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Show When&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;showWhen&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines whether the component is displayed on the interface. When set to false, the component is hidden and is not evaluated. Default: true.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rich Text Value&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;richTextValue&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Rich text to display in the field.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rich Text Save Into&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;richTextSaveInto&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Save Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;One or more variables that are updated with the richText value when the user changes it. Use a!save() to save a modified or alternative value to a variable.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Read Only&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;readOnly&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if the field should display as not editable. Default: false.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Max Size&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;maxSize&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Number (Integer)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Maximum size of the HTML formatted rich text data (not number of characters). Default: 10000.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Placeholder&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;placeholder&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text to display in the field when it is empty. Does not show if the field is read only.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Enable Progress Bar&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;enableProgressBar&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Whether to show the progress bar of what percent of rich text data users have entered. Default: true.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Allowed Formats&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;allowedFormats&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines which format styles are allowed. Note: these must be set on page load and cannot change. Valid values: &amp;quot;header&amp;quot;, &amp;quot;size&amp;quot;, &amp;quot;bold&amp;quot;, &amp;quot;italic&amp;quot;, &amp;quot;underline&amp;quot;, &amp;quot;strike&amp;quot;, &amp;quot;color&amp;quot;, &amp;quot;background&amp;quot;, &amp;quot;link&amp;quot;, &amp;quot;align&amp;quot;, &amp;quot;indent&amp;quot;, &amp;quot;list&amp;quot;. Default: All styles. See &lt;a href="#allowed-formats"&gt;more info&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;Note that fn!richTextFieldWithTables() sets this parameter to &amp;quot;All styles&amp;quot; by default on the back-end as this is the most common setting in the older component. If you&amp;#39;d like to parameterize allowed styles, please reach out with a request.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Table Border Style&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;tableBorderStyle&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextFieldWithTables()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines the style of the grid border. Valid values: &amp;quot;STANDARD&amp;quot; (default), &amp;quot;LIGHT&amp;quot;, &amp;quot;NONE&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Allow Images&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;allowImages&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;fn!richTextField()&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if images are allowed. Default: false.&amp;nbsp;See &lt;a href="#image-uploads"&gt;more info&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;Note that fn!richTextFieldWithTables() does not support image upload at this time. If you&amp;#39;d like to allow this behavior, please reach out with a request.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Image Storage Connected System&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;imageStorageConnectedSystem&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Connected System&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The instance of the &lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&amp;nbsp;used to store images from the rich text editor. This is required if allowImages is set to true.&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Uploaded Images&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;uploadedImages&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Map&amp;nbsp;Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;An array of images uploaded during this&amp;nbsp;session with metadata about the image. &amp;quot;wasRemovedFromField&amp;quot; is true when a user uploads an image but then removes it in the same session.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="notes"&gt;Notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Due to the potential large size of the HTML output of this component, do not save this value into a process variable or a node parameter. Instead, use an expression to load and persist the HTML output directly on the user interface.&lt;/li&gt;
&lt;li&gt;Do not use validations&amp;nbsp;to validate the maximum length of the HTML formatted rich text value. Instead, use the parameter maxSize.&lt;/li&gt;
&lt;li&gt;Use validations&amp;nbsp;to validate the maximum length of characters that an end-user can enter in the component. To calculate the number of characters, using the functions fn!len()&amp;nbsp;and fn!striphtml().&lt;/li&gt;
&lt;li&gt;When the rich text field is displayed in a read-only format, set the parameter height&amp;nbsp;to AUTO&amp;nbsp;for optimal results.&lt;/li&gt;
&lt;li&gt;The parameter required&amp;nbsp;doesn&amp;rsquo;t actually validate that the richTextValue is not null. This is a limitation of the component plug-in framework. Use section-level or form-level validations to validate the requiredness of the richTextValue.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="data_storage"&gt;Data Storage&lt;/h2&gt;
&lt;h3&gt;Database Column Type Options&lt;/h3&gt;
&lt;p&gt;There are two options for storing the HTML output of this component in your database; the considerations of which are listed below.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;VARCHAR column type, or equivalent&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;LONGTEXT column type, or equivalent&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Max Size&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Limits the maximum size of the HTML output to 4,000 characters (varies by database)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The maximum size of the HTML output can be as great as 50,000 characters, which is large enough to essentially be considered no limit to a user&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Persistence&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Designers can pass this output and the CDT with this field into process variables&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;It is strongly &lt;strong&gt;recommended to only use this option if you will be writing and reading from the database directly from SAIL interfaces&lt;/strong&gt;; never pass data of this column type into process variables&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Support&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;This is a standard database column type which can be exported, modified, and migrated easily&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;This is not a standard database column type, which could lead to difficulties when trying to export, modify, or migrate&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Querying&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Searching and sorting against this column type is performant (see Querying below for more information)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Searching and sorting against this column type is not performant, and might not be supported depending on your database&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="querying"&gt;Querying Against The Rich Text Data&lt;/h3&gt;
&lt;p&gt;For the use case of searching or sorting against the rich text data, it is recommended to separately create a column in your CDT to store the raw text. &amp;nbsp;The raw text column should be the same type and size of the HTML column. Whenever searching or sorting against the rich text data, search or sort against this column, not the HTML column.&lt;/p&gt;
&lt;p&gt;To populate the raw text column, there are two options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Using the&amp;nbsp;fn!striphtml() function in Appian. This is best used when&amp;nbsp;the size of your data is small, or when the contents of the rich text editor never hits a process variable.&lt;/li&gt;
&lt;li&gt;Using database triggers. This is best used when it&amp;#39;s important to avoid increasing the&amp;nbsp;memory&amp;nbsp;consumption of the process engines, such as when the rich text editor contents are large and passed through process.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To create database triggers to update this field on every INSERT or UPDATE to the database table, follow the instructions below for accomplishing this in MariaDB. For other databases, use the same design, just adjust to match your database&amp;rsquo;s syntax.&lt;/p&gt;
&lt;p&gt;Replace [RAWTEXT_COL] with the name of your raw text column, [HTML_COL] with the name of your html column, and [TABLE_NAME] with the name of your table.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="sql"&gt;-- Create a function to strip html tags given a string

DELIMITER &amp;amp;&amp;amp;

CREATE FUNCTION `strip_tags`($str text) RETURNS text
BEGIN
   DECLARE $start, $end INT DEFAULT 1;
   LOOP
       SET $start = LOCATE(&amp;quot;&amp;lt;&amp;quot;, $str, $start);
       IF (!$start) THEN RETURN $str; END IF;
       SET $end = LOCATE(&amp;quot;&amp;gt;&amp;quot;, $str, $start);
       IF (!$end) THEN SET $end = $start; END IF;
       SET $str = INSERT($str, $start, $end - $start + 1, &amp;quot;&amp;quot;);
       SET $str = REPLACE($str, &amp;quot;&amp;#160;&amp;quot;, &amp;quot; &amp;quot;);
   END LOOP;
END&amp;amp;&amp;amp;

DELIMITER ;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="sql"&gt;-- Create triggers to execute strip_tags() on the html column with every insert or update, and store the raw text

DELIMITER &amp;amp;&amp;amp;

CREATE TRIGGER `store_raw_input_insert`
BEFORE INSERT ON `[TABLE_NAME]`
FOR EACH ROW BEGIN
    SET NEW.`[RAWTEXT_COL]` = strip_tags(NEW.`[HTML_COL]`);
END&amp;amp;&amp;amp;

CREATE TRIGGER `store_raw_input_update`
BEFORE UPDATE ON `[TABLE_NAME]`
FOR EACH ROW BEGIN
    SET NEW.`[RAWTEXT_COL]` = strip_tags(NEW.`[HTML_COL]`);
END&amp;amp;&amp;amp;

DELIMITER ;&lt;/pre&gt;&lt;/p&gt;
&lt;h3 id="emails"&gt;Sending Emails&lt;/h3&gt;
&lt;p&gt;For the use case of sending formatted emails created by end users, a designer must consider the maximum size of the HTML output as well as the expected email volume.&lt;/p&gt;
&lt;p&gt;When sending emails with the Send Email node, the &amp;nbsp;HTML output is loaded and cached in the process execution engine as a string. &amp;nbsp;Over time, the cached values accumulate in memory and can lead to memory resource issues.&lt;/p&gt;
&lt;p&gt;It is recommended to perform non functional testing by sending representative emails at the expected email volume for at least 3 days to measure and evaluate the impacts on the system memory usage and ensure a scalable application in production.&lt;/p&gt;
&lt;p&gt;To configure in process, in the Send Email node, either pass the HTML output as an expression to the ad-hoc message body, or pass the HTML output as an input parameter to the HTML template message body.&lt;/p&gt;
&lt;h2 id="allowed_formats"&gt;Allowed Formats&lt;/h2&gt;
&lt;p&gt;Only applicable for &lt;code&gt;fn!richtextfield&lt;/code&gt;. This parameter to the function fn!richTextField()&amp;nbsp;allows the designer to configure which formatting options are available to the end users when entering rich text into the field such as &amp;ldquo;bold&amp;rdquo;, &amp;ldquo;italic&amp;rdquo;, &amp;ldquo;list&amp;rdquo;, etc.&lt;/p&gt;
&lt;h4 id="configuring"&gt;Configuring this Parameter&lt;/h4&gt;
&lt;p&gt;For consistency and ease of development/maintenance across the platform, the allowed formats should be stored in a constant and used in all instances of the rich text editor.&lt;/p&gt;
&lt;h4 id="modifying"&gt;Modifying Allowed Formats&lt;/h4&gt;
&lt;p&gt;Allowed format options should never be removed after users have already entered data in this field in a production setting (outside of special circumstances), since this means previously-entered text would not be backwards compatible with the updated component configuration. &amp;nbsp;For example, if a user had formatted using a numbered list, and &amp;ldquo;list&amp;rdquo; was removed as an allowed format, then all numbered lists that were previously saved would render incorrectly in the updated component configuration.&lt;/p&gt;
&lt;p&gt;If you do need to remove some allowed formats after users have already entered text in a production setting, it is recommended to pass the previously allowed formats to the component whenever it is rendered as read-only. &amp;nbsp;For example, picture a comment thread that supported &amp;ldquo;list&amp;rdquo; for a while, then removed &amp;ldquo;list&amp;rdquo; format. The read-only fields, displaying previously-entered comments, could still support &amp;ldquo;list&amp;rdquo; while the editable field for new comments would no longer support &amp;ldquo;list&amp;rdquo;. &amp;nbsp;However, this gets more complicated when editing of previously-entered data is considered (e.g. editing an existing comment).&lt;/p&gt;
&lt;h2 id="image_uploads"&gt;Image Uploads&lt;/h2&gt;
&lt;p&gt;Only applicable for &lt;code&gt;fn!richTextField&lt;/code&gt;. To enable image uploads, you must do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install the&amp;nbsp;&lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Create a knowledge center and folder to store uploaded documents and note the new folder&amp;#39;s UUID&lt;/li&gt;
&lt;li&gt;Create a new connected system object which leverages the&amp;nbsp;&lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Enter the folder&amp;#39;s UUID and the user context to use when uploading images&lt;/li&gt;
&lt;li&gt;Create a new Connected System constant which points to the new Connected System object in your application&lt;/li&gt;
&lt;li&gt;In your interface where you use&amp;nbsp;fn!richTextField(), set allowImages&amp;nbsp;to true and imageStorageConnectedSystem&amp;nbsp;to the constant created in the previous step&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note: only the URL to the uploaded image, not the image content itself, is stored in the generated HTML&amp;nbsp;from&amp;nbsp;fn!richTextField().&amp;nbsp; This means that if you use the generated HTML outside of Appian (e.g., in an email), the image will not display unless the outside viewer is already logged into Appian.&lt;/p&gt;
&lt;h2 id="migrate_components"&gt;Migrate Components&lt;/h2&gt;
&lt;p&gt;If you have not yet used either component, you can use whichever one suits your needs best. However, be mindful that it is non-trivial to migrate between fn!richTextField and fn!richTextFieldWithTables and the latter will likely receive more enhancements over time, as the underlying library which renders it is kept up-to-date more.&lt;/p&gt;
&lt;p&gt;The fn!richTextField component relied on non-standard HTML attributes to provide formatting, specifically indentation and nested list formatting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Indentation: fn!richTextField&amp;nbsp;uses the HTML class &amp;quot;ql-indent-N&amp;quot; (where N is the indentation level) for both line indents and for nested lists.&amp;nbsp;fn!richTextFieldWithTables uses the HTML standard style=&amp;#39;margin-left: Npx&amp;#39; for line indents and nested list tags for nested lists (e.g. &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Bullet&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Nested Bullet&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;). This means that if you were using fn!richTextField and saved end-user formatted indentation or nested lists, fn!richTextFieldWithTables will not recognize these specific formats when rendering and will drop the indentation and nested lists.&lt;/li&gt;
&lt;li&gt;Paragraphs: fn!richTextField relies on &amp;lt;div&amp;gt; tags to separate paragraphs, while fn!richTextFieldWithTables relies on &amp;lt;p&amp;gt; tags. This means that passing end-user formatting text from fn!richTextField to fn!richTextFieldWithTables will drop all paragraphs and carriage returns.&lt;/li&gt;
&lt;li&gt;Font Color:&amp;nbsp;fn!richTextField&amp;nbsp;relies on&amp;nbsp;&amp;lt;span&amp;gt;&amp;nbsp;tags with a&amp;nbsp;style attribute for font color (e.g. &amp;lt;span style=&amp;#39;color: rgb(153, 51, 255);&amp;#39;&amp;gt;), while&amp;nbsp;fn!richTextFieldWithTables&amp;nbsp;relies on&amp;nbsp;&amp;lt;font&amp;gt;&amp;nbsp;tags with a color attribute (e.g. &amp;lt;font color=&amp;#39;#9c00ff&amp;#39;&amp;gt;). This means that font colors will get dropped if you directly&amp;nbsp;pass end-user formatting text from&amp;nbsp;fn!richTextField&amp;nbsp;to&amp;nbsp;fn!richTextFieldWithTables.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;#39;d like to migrate end-user formatting text to fn!richTextFieldWithTables, you can write an expression which updates the non-standard indentation attributes and div tags to be recognized by the new component. However this may be more involved for nested lists which will require a more complicated update than just find and replace.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: Architecture, plugins&lt;/div&gt;
</description></item><item><title>End-User Rich Text Editor Component</title><link>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component/revision/9</link><pubDate>Tue, 19 Dec 2023 16:53:18 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:3db951cf-ae18-4eb3-ade0-88ff9f63dc35</guid><dc:creator>joel.larin</dc:creator><comments>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component#comments</comments><description>Revision 9 posted to Guide by joel.larin on 12/19/2023 4:53:18 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;p&gt;This component is not part of the Appian base product. It is a component plugin managed by Appian Professional Services and it can be downloaded on the &lt;a href="/b/appmarket/posts/rich-text-editor"&gt;Appian AppMarket&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please see the &lt;a href="/w/guide/3321/rich-text-editor-component-troubleshooting-guide"&gt;Component Plug-in Troubleshooting Guide&lt;/a&gt;&amp;nbsp;if you have any issues.&amp;nbsp; If you have further questions please email &lt;a href="mailto:richtext-componentpluginsupport@appian.com"&gt;richtext-componentpluginsupport@appian.com&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="plugin_components"&gt;Plugin Components&lt;/h2&gt;
&lt;p&gt;As of version 1.5.3, this plugin includes two (2) components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fn!richTextField()&lt;/code&gt; - This is the plugin&amp;rsquo;s original component.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fn!richTextFieldWithTables()&lt;/code&gt; - This component is new as of version 1.5.3.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Refer to the&amp;nbsp;chart below to understand what formatting each component supports.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Component&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Text Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Table Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Image Uploads&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fn!richTextField()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fn!richTextFieldWithTables()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All information in this guide applies to both components, unless stated that it only applies to one of the components.&lt;/p&gt;
&lt;h3&gt;Why are there 2 components?&lt;/h3&gt;
&lt;p&gt;In order to provide table support, we needed to switch to a new underlying library that supports tables. This new library generates HTML that is different from the previous library. To prevent refactoring and unintended behavior for those using the plugin currently, we opted to keep the existing component as is If you want to migrate to the new component, refer to the &lt;a href="#migrate_components"&gt;How to migrate to fn!richTextFieldWithTables &lt;/a&gt;section below.&lt;/p&gt;
&lt;p&gt;Also, the new component, fn!richTextFieldWithTables(), strictly uses standard HTML attributes for all formats, which should simplify complexities with passing the output HTML to downstream systems, such as email or document generation.&lt;/p&gt;
&lt;h2 id="parameters"&gt;Parameters&lt;/h2&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Keyword&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Applicable Component(s)&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Label&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;label&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text to display as the field label.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Label Position&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;labelPosition&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text to determine where the label appears. Valid values include&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;ABOVE&amp;quot; (default) Displays the label above the component.&lt;/li&gt;
&lt;li&gt;&amp;quot;ADJACENT&amp;quot; Displays the label to the left of the component.&lt;/li&gt;
&lt;li&gt;&amp;quot;COLLAPSED&amp;quot; Hides the label. The label will still be read by screen readers.&lt;/li&gt;
&lt;li&gt;&amp;quot;JUSTIFIED&amp;quot; Aligns the label alongside the component starting at the edge of the page.&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text displayed below the field&amp;#39;s value.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Help Tooltip&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;helpTooltip&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Displays a help icon with the specified text as a tooltip. The tooltip displays a maximum of 500 characters. The help icon does not show when the label position is &amp;quot;COLLAPSED&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Required&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;required&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Shows or hides the asterisk indicating if the component is required but does not enforce requiredness. To enforce requiredness, use the parameter &amp;quot;validations&amp;quot;. To enforce requiredness only upon submission, use section or form-level validations.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Disabled&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;disabled&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if the user is prevented from changing the value. Default: false.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Validations&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;validations&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Validation errors to be displayed below the field when the value is not null.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Height&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;height&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines the field height. Valid values include &amp;quot;SHORT&amp;quot;, &amp;quot;MEDIUM&amp;quot; (default), and &amp;quot;TALL&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Show When&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;showWhen&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines whether the component is displayed on the interface. When set to false, the component is hidden and is not evaluated. Default: true.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rich Text Value&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;richTextValue&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Rich text to display in the field.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rich Text Save Into&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;richTextSaveInto&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Save Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;One or more variables that are updated with the richText value when the user changes it. Use a!save() to save a modified or alternative value to a variable.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Read Only&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;readOnly&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if the field should display as not editable. Default: false.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Max Size&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;maxSize&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Number (Integer)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Maximum size of the HTML formatted rich text data (not number of characters). Default: 10000.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Placeholder&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;placeholder&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text to display in the field when it is empty. Does not show if the field is read only.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Enable Progress Bar&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;enableProgressBar&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Whether to show the progress bar of what percent of rich text data users have entered. Default: true.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Allowed Formats&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;allowedFormats&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines which format styles are allowed. Note: these must be set on page load and cannot change. Valid values: &amp;quot;header&amp;quot;, &amp;quot;size&amp;quot;, &amp;quot;bold&amp;quot;, &amp;quot;italic&amp;quot;, &amp;quot;underline&amp;quot;, &amp;quot;strike&amp;quot;, &amp;quot;color&amp;quot;, &amp;quot;background&amp;quot;, &amp;quot;link&amp;quot;, &amp;quot;align&amp;quot;, &amp;quot;indent&amp;quot;, &amp;quot;list&amp;quot;. Default: All styles. See &lt;a href="#allowed-formats"&gt;more info&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;Note that fn!richTextFieldWithTables() sets this parameter to &amp;quot;All styles&amp;quot; by default on the back-end as this is the most common setting in the older component. If you&amp;#39;d like to parameterize allowed styles, please reach out with a request.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Table Border Style&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;tableBorderStyle&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextFieldWithTables()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines the style of the grid border. Valid values: &amp;quot;STANDARD&amp;quot; (default), &amp;quot;LIGHT&amp;quot;, &amp;quot;NONE&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Allow Images&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;allowImages&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;fn!richTextField()&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if images are allowed. Default: false.&amp;nbsp;See &lt;a href="#image-uploads"&gt;more info&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;Note that fn!richTextFieldWithTables() does not support image upload at this time. If you&amp;#39;d like to allow this behavior, please reach out with a request.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Image Storage Connected System&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;imageStorageConnectedSystem&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Connected System&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The instance of the &lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&amp;nbsp;used to store images from the rich text editor. This is required if allowImages is set to true.&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Uploaded Images&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;uploadedImages&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Map&amp;nbsp;Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;An array of images uploaded during this&amp;nbsp;session with metadata about the image. &amp;quot;wasRemovedFromField&amp;quot; is true when a user uploads an image but then removes it in the same session.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="notes"&gt;Notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Due to the potential large size of the HTML output of this component, do not save this value into a process variable or a node parameter. Instead, use an expression to load and persist the HTML output directly on the user interface.&lt;/li&gt;
&lt;li&gt;Do not use validations&amp;nbsp;to validate the maximum length of the HTML formatted rich text value. Instead, use the parameter maxSize.&lt;/li&gt;
&lt;li&gt;Use validations&amp;nbsp;to validate the maximum length of characters that an end-user can enter in the component. To calculate the number of characters, using the functions fn!len()&amp;nbsp;and fn!striphtml().&lt;/li&gt;
&lt;li&gt;When the rich text field is displayed in a read-only format, set the parameter height&amp;nbsp;to AUTO&amp;nbsp;for optimal results.&lt;/li&gt;
&lt;li&gt;The parameter required&amp;nbsp;doesn&amp;rsquo;t actually validate that the richTextValue is not null. This is a limitation of the component plug-in framework. Use section-level or form-level validations to validate the requiredness of the richTextValue.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="data_storage"&gt;Data Storage&lt;/h2&gt;
&lt;h3&gt;Database Column Type Options&lt;/h3&gt;
&lt;p&gt;There are two options for storing the HTML output of this component in your database; the considerations of which are listed below.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;VARCHAR column type, or equivalent&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;LONGTEXT column type, or equivalent&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Max Size&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Limits the maximum size of the HTML output to 4,000 characters (varies by database)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The maximum size of the HTML output can be as great as 50,000 characters, which is large enough to essentially be considered no limit to a user&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Persistence&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Designers can pass this output and the CDT with this field into process variables&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;It is strongly &lt;strong&gt;recommended to only use this option if you will be writing and reading from the database directly from SAIL interfaces&lt;/strong&gt;; never pass data of this column type into process variables&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Support&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;This is a standard database column type which can be exported, modified, and migrated easily&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;This is not a standard database column type, which could lead to difficulties when trying to export, modify, or migrate&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Querying&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Searching and sorting against this column type is performant (see Querying below for more information)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Searching and sorting against this column type is not performant, and might not be supported depending on your database&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="querying"&gt;Querying Against The Rich Text Data&lt;/h3&gt;
&lt;p&gt;For the use case of searching or sorting against the rich text data, it is recommended to separately create a column in your CDT to store the raw text. &amp;nbsp;The raw text column should be the same type and size of the HTML column. Whenever searching or sorting against the rich text data, search or sort against this column, not the HTML column.&lt;/p&gt;
&lt;p&gt;To populate the raw text column, there are two options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Using the&amp;nbsp;fn!striphtml() function in Appian. This is best used when&amp;nbsp;the size of your data is small, or when the contents of the rich text editor never hits a process variable.&lt;/li&gt;
&lt;li&gt;Using database triggers. This is best used when it&amp;#39;s important to avoid increasing the&amp;nbsp;memory&amp;nbsp;consumption of the process engines, such as when the rich text editor contents are large and passed through process.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To create database triggers to update this field on every INSERT or UPDATE to the database table, follow the instructions below for accomplishing this in MariaDB. For other databases, use the same design, just adjust to match your database&amp;rsquo;s syntax.&lt;/p&gt;
&lt;p&gt;Replace [RAWTEXT_COL] with the name of your raw text column, [HTML_COL] with the name of your html column, and [TABLE_NAME] with the name of your table.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="sql"&gt;-- Create a function to strip html tags given a string

DELIMITER &amp;amp;&amp;amp;

CREATE FUNCTION `strip_tags`($str text) RETURNS text
BEGIN
   DECLARE $start, $end INT DEFAULT 1;
   LOOP
       SET $start = LOCATE(&amp;quot;&amp;lt;&amp;quot;, $str, $start);
       IF (!$start) THEN RETURN $str; END IF;
       SET $end = LOCATE(&amp;quot;&amp;gt;&amp;quot;, $str, $start);
       IF (!$end) THEN SET $end = $start; END IF;
       SET $str = INSERT($str, $start, $end - $start + 1, &amp;quot;&amp;quot;);
       SET $str = REPLACE($str, &amp;quot;&amp;#160;&amp;quot;, &amp;quot; &amp;quot;);
   END LOOP;
END&amp;amp;&amp;amp;

DELIMITER ;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="sql"&gt;-- Create triggers to execute strip_tags() on the html column with every insert or update, and store the raw text

DELIMITER &amp;amp;&amp;amp;

CREATE TRIGGER `store_raw_input_insert`
BEFORE INSERT ON `[TABLE_NAME]`
FOR EACH ROW BEGIN
    SET NEW.`[RAWTEXT_COL]` = strip_tags(NEW.`[HTML_COL]`);
END&amp;amp;&amp;amp;

CREATE TRIGGER `store_raw_input_update`
BEFORE UPDATE ON `[TABLE_NAME]`
FOR EACH ROW BEGIN
    SET NEW.`[RAWTEXT_COL]` = strip_tags(NEW.`[HTML_COL]`);
END&amp;amp;&amp;amp;

DELIMITER ;&lt;/pre&gt;&lt;/p&gt;
&lt;h3 id="emails"&gt;Sending Emails&lt;/h3&gt;
&lt;p&gt;For the use case of sending formatted emails created by end users, a designer must consider the maximum size of the HTML output as well as the expected email volume.&lt;/p&gt;
&lt;p&gt;When sending emails with the Send Email node, the &amp;nbsp;HTML output is loaded and cached in the process execution engine as a string. &amp;nbsp;Over time, the cached values accumulate in memory and can lead to memory resource issues.&lt;/p&gt;
&lt;p&gt;It is recommended to perform non functional testing by sending representative emails at the expected email volume for at least 3 days to measure and evaluate the impacts on the system memory usage and ensure a scalable application in production.&lt;/p&gt;
&lt;p&gt;To configure in process, in the Send Email node, either pass the HTML output as an expression to the ad-hoc message body, or pass the HTML output as an input parameter to the HTML template message body.&lt;/p&gt;
&lt;h2 id="allowed_formats"&gt;Allowed Formats&lt;/h2&gt;
&lt;p&gt;Only applicable for &lt;code&gt;fn!richtextfield&lt;/code&gt;. This parameter to the function fn!richTextField()&amp;nbsp;allows the designer to configure which formatting options are available to the end users when entering rich text into the field such as &amp;ldquo;bold&amp;rdquo;, &amp;ldquo;italic&amp;rdquo;, &amp;ldquo;list&amp;rdquo;, etc.&lt;/p&gt;
&lt;h4 id="configuring"&gt;Configuring this Parameter&lt;/h4&gt;
&lt;p&gt;For consistency and ease of development/maintenance across the platform, the allowed formats should be stored in a constant and used in all instances of the rich text editor.&lt;/p&gt;
&lt;h4 id="modifying"&gt;Modifying Allowed Formats&lt;/h4&gt;
&lt;p&gt;Allowed format options should never be removed after users have already entered data in this field in a production setting (outside of special circumstances), since this means previously-entered text would not be backwards compatible with the updated component configuration. &amp;nbsp;For example, if a user had formatted using a numbered list, and &amp;ldquo;list&amp;rdquo; was removed as an allowed format, then all numbered lists that were previously saved would render incorrectly in the updated component configuration.&lt;/p&gt;
&lt;p&gt;If you do need to remove some allowed formats after users have already entered text in a production setting, it is recommended to pass the previously allowed formats to the component whenever it is rendered as read-only. &amp;nbsp;For example, picture a comment thread that supported &amp;ldquo;list&amp;rdquo; for a while, then removed &amp;ldquo;list&amp;rdquo; format. The read-only fields, displaying previously-entered comments, could still support &amp;ldquo;list&amp;rdquo; while the editable field for new comments would no longer support &amp;ldquo;list&amp;rdquo;. &amp;nbsp;However, this gets more complicated when editing of previously-entered data is considered (e.g. editing an existing comment).&lt;/p&gt;
&lt;h2 id="image_uploads"&gt;Image Uploads&lt;/h2&gt;
&lt;p&gt;Only applicable for &lt;code&gt;fn!richTextField&lt;/code&gt;. To enable image uploads, you must do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install the&amp;nbsp;&lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Create a knowledge center and folder to store uploaded documents and note the new folder&amp;#39;s UUID&lt;/li&gt;
&lt;li&gt;Create a new connected system object which leverages the&amp;nbsp;&lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Enter the folder&amp;#39;s UUID and the user context to use when uploading images&lt;/li&gt;
&lt;li&gt;Create a new Connected System constant which points to the new Connected System object in your application&lt;/li&gt;
&lt;li&gt;In your interface where you use&amp;nbsp;fn!richTextField(), set allowImages&amp;nbsp;to true and imageStorageConnectedSystem&amp;nbsp;to the constant created in the previous step&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note: only the URL to the uploaded image, not the image content itself, is stored in the generated HTML&amp;nbsp;from&amp;nbsp;fn!richTextField().&amp;nbsp; This means that if you use the generated HTML outside of Appian (e.g., in an email), the image will not display unless the outside viewer is already logged into Appian.&lt;/p&gt;
&lt;h2 id="migrate_components"&gt;Migrate Components&lt;/h2&gt;
&lt;p&gt;If you have not yet used either component, you can use whichever one suits your needs best. However, be mindful that it is non-trivial to migrate between fn!richTextField and fn!richTextFieldWithTables and the latter will likely receive more enhancements over time, as the underlying library which renders it is kept up-to-date more.&lt;/p&gt;
&lt;p&gt;The fn!richTextField component relied on non-standard HTML attributes to provide formatting, specifically indentation and nested list formatting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Indentation: fn!richTextField&amp;nbsp;uses the HTML class &amp;quot;ql-indent-N&amp;quot; (where N is the indentation level) for both line indents and for nested lists.&amp;nbsp;fn!richTextFieldWithTables uses the HTML standard style=&amp;#39;margin-left: Npx&amp;#39; for line indents and nested list tags for nested lists (e.g. &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Bullet&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Nested Bullet&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;). This means that if you were using fn!richTextField and saved end-user formatted indentation or nested lists, fn!richTextFieldWithTables will not recognize these specific formats when rendering and will drop the indentation and nested lists.&lt;/li&gt;
&lt;li&gt;Paragraphs: fn!richTextField relies on &amp;lt;div&amp;gt; tags to separate paragraphs, while fn!richTextFieldWithTables relies on &amp;lt;p&amp;gt; tags. This means that passing end-user formatting text from fn!richTextField to fn!richTextFieldWithTables will drop all paragraphs and carriage returns.&lt;/li&gt;
&lt;li&gt;Font Color:&amp;nbsp;fn!richTextField&amp;nbsp;relies on&amp;nbsp;&amp;lt;span&amp;gt;&amp;nbsp;tags with a&amp;nbsp;style attribute for font color (e.g. &amp;lt;span style=&amp;#39;color: rgb(153, 51, 255);&amp;#39;&amp;gt;), while&amp;nbsp;fn!richTextFieldWithTables&amp;nbsp;relies on&amp;nbsp;&amp;lt;font&amp;gt;&amp;nbsp;tags with a color attribute (e.g. &amp;lt;font color=&amp;#39;#9c00ff&amp;#39;&amp;gt;). This means that font colors will get dropped if you directly&amp;nbsp;pass end-user formatting text from&amp;nbsp;fn!richTextField&amp;nbsp;to&amp;nbsp;fn!richTextFieldWithTables.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;#39;d like to migrate end-user formatting text to fn!richTextFieldWithTables, you can write an expression which updates the non-standard indentation attributes and div tags to be recognized by the new component. However this may be more involved for nested lists which will require a more complicated update than just find and replace.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: Architecture, plugins&lt;/div&gt;
</description></item><item><title>End-User Rich Text Editor Component</title><link>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component/revision/8</link><pubDate>Tue, 31 Oct 2023 17:32:44 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:3db951cf-ae18-4eb3-ade0-88ff9f63dc35</guid><dc:creator>Kim Day</dc:creator><comments>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component#comments</comments><description>Revision 8 posted to Guide by Kim Day on 10/31/2023 5:32:44 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;p&gt;This component is not part of the Appian base product. It is a component plugin managed by Appian Professional Services and it can be downloaded on the &lt;a href="/b/appmarket/posts/rich-text-editor"&gt;Appian AppMarket&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please see the &lt;a href="/w/guide/3321/rich-text-editor-component-troubleshooting-guide"&gt;Component Plug-in Troubleshooting Guide&lt;/a&gt;&amp;nbsp;if you have any issues.&amp;nbsp; If you have further questions please email &lt;a href="mailto:richtext-componentpluginsupport@appian.com"&gt;richtext-componentpluginsupport@appian.com&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="plugin_components"&gt;Plugin Components&lt;/h2&gt;
&lt;p&gt;As of version 1.5.3, this plugin includes two (2) components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fn!richTextField()&lt;/code&gt; - This is the plugin&amp;rsquo;s original component.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fn!richTextFieldWithTables()&lt;/code&gt; - This component is new as of version 1.5.3.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Refer to the&amp;nbsp;chart below to understand what formatting each component supports.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Component&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Text Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Table Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Image Uploads&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fn!richTextField()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fn!richTextFieldWithTables()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All information in this guide applies to both components, unless stated that it only applies to one of the components.&lt;/p&gt;
&lt;h3&gt;Why are there 2 components?&lt;/h3&gt;
&lt;p&gt;In order to provide table support, we needed to switch to a new underlying library that supports tables. This new library generates HTML that is different from the previous library. To prevent refactoring and unintended behavior for those using the plugin currently, we opted to keep the existing component as is If you want to migrate to the new component, refer to the &lt;a href="#migrate_components"&gt;How to migrate to fn!richTextFieldWithTables &lt;/a&gt;section below.&lt;/p&gt;
&lt;p&gt;Also, the new component, fn!richTextFieldWithTables(), strictly uses standard HTML attributes for all formats, which should simplify complexities with passing the output HTML to downstream systems, such as email or document generation.&lt;/p&gt;
&lt;h2 id="parameters"&gt;Parameters&lt;/h2&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Keyword&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Applicable Component(s)&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Label&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;label&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text to display as the field label.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Label Position&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;labelPosition&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text to determine where the label appears. Valid values include&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;ABOVE&amp;quot; (default) Displays the label above the component.&lt;/li&gt;
&lt;li&gt;&amp;quot;ADJACENT&amp;quot; Displays the label to the left of the component.&lt;/li&gt;
&lt;li&gt;&amp;quot;COLLAPSED&amp;quot; Hides the label. The label will still be read by screen readers.&lt;/li&gt;
&lt;li&gt;&amp;quot;JUSTIFIED&amp;quot; Aligns the label alongside the component starting at the edge of the page.&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text displayed below the field&amp;#39;s value.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Help Tooltip&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;helpTooltip&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Displays a help icon with the specified text as a tooltip. The tooltip displays a maximum of 500 characters. The help icon does not show when the label position is &amp;quot;COLLAPSED&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Required&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;required&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Shows or hides the asterisk indicating if the component is required but does not enforce requiredness. To enforce requiredness, use the parameter &amp;quot;validations&amp;quot;. To enforce requiredness only upon submission, use section or form-level validations.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Disabled&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;disabled&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if the user is prevented from changing the value. Default: false.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Validations&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;validations&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Validation errors to be displayed below the field when the value is not null.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Height&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;height&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines the field height. Valid values include &amp;quot;SHORT&amp;quot;, &amp;quot;MEDIUM&amp;quot; (default), and &amp;quot;TALL&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Show When&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;showWhen&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines whether the component is displayed on the interface. When set to false, the component is hidden and is not evaluated. Default: true.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rich Text Value&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;richTextValue&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Rich text to display in the field.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rich Text Save Into&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;richTextSaveInto&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Save Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;One or more variables that are updated with the richText value when the user changes it. Use a!save() to save a modified or alternative value to a variable.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Read Only&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;readOnly&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if the field should display as not editable. Default: false.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Max Size&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;maxSize&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Number (Integer)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Maximum size of the HTML formatted rich text data (not number of characters). Default: 10000.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Placeholder&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;placeholder&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text to display in the field when it is empty. Does not show if the field is read only.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Enable Progress Bar&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;enableProgressBar&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Whether to show the progress bar of what percent of rich text data users have entered. Default: true.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Allowed Formats&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;allowedFormats&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines which format styles are allowed. Note: these must be set on page load and cannot change. Valid values: &amp;quot;header&amp;quot;, &amp;quot;size&amp;quot;, &amp;quot;bold&amp;quot;, &amp;quot;italic&amp;quot;, &amp;quot;underline&amp;quot;, &amp;quot;strike&amp;quot;, &amp;quot;color&amp;quot;, &amp;quot;background&amp;quot;, &amp;quot;link&amp;quot;, &amp;quot;align&amp;quot;, &amp;quot;indent&amp;quot;, &amp;quot;list&amp;quot;. Default: All styles. See &lt;a href="#allowed-formats"&gt;more info&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;Note that fn!richTextFieldWithTables() sets this parameter to &amp;quot;All styles&amp;quot; by default on the back-end as this is the most common setting in the older component. If you&amp;#39;d like to parameterize allowed styles, please reach out with a request.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Table Border Style&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;tableBorderStyle&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextFieldWithTables()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines the style of the grid border. Valid values: &amp;quot;STANDARD&amp;quot; (default), &amp;quot;LIGHT&amp;quot;, &amp;quot;NONE&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Allow Images&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;allowImages&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;fn!richTextField()&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if images are allowed. Default: false.&amp;nbsp;See &lt;a href="#image-uploads"&gt;more info&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;Note that fn!richTextFieldWithTables() does not support image upload at this time. If you&amp;#39;d like to allow this behavior, please reach out with a request.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Image Storage Connected System&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;imageStorageConnectedSystem&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Connected System&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The instance of the &lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&amp;nbsp;used to store images from the rich text editor. This is required if allowImages is set to true.&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Uploaded Images&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;uploadedImages&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Map&amp;nbsp;Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;An array of images uploaded during this&amp;nbsp;session with metadata about the image. &amp;quot;wasRemovedFromField&amp;quot; is true when a user uploads an image but then removes it in the same session.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="notes"&gt;Notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Due to the potential large size of the HTML output of this component, do not save this value into a process variable or a node parameter. Instead, use an expression to load and persist the HTML output directly on the user interface.&lt;/li&gt;
&lt;li&gt;Do not use validations&amp;nbsp;to validate the maximum length of the HTML formatted rich text value. Instead, use the parameter maxSize.&lt;/li&gt;
&lt;li&gt;Use validations&amp;nbsp;to validate the maximum length of characters that an end-user can enter in the component. To calculate the number of characters, using the functions fn!len()&amp;nbsp;and fn!striphtml().&lt;/li&gt;
&lt;li&gt;When the rich text field is displayed in a read-only format, set the parameter height&amp;nbsp;to AUTO&amp;nbsp;for optimal results.&lt;/li&gt;
&lt;li&gt;The parameter required&amp;nbsp;doesn&amp;rsquo;t actually validate that the richTextValue is not null. This is a limitation of the component plug-in framework. Use section-level or form-level validations to validate the requiredness of the richTextValue.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="data_storage"&gt;Data Storage&lt;/h2&gt;
&lt;h3&gt;Database Column Type Options&lt;/h3&gt;
&lt;p&gt;There are two options for storing the HTML output of this component in your database; the considerations of which are listed below.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;VARCHAR column type, or equivalent&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;LONGTEXT column type, or equivalent&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Max Size&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Limits the maximum size of the HTML output to 4,000 characters (varies by database)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The maximum size of the HTML output can be as great as 50,000 characters, which is large enough to essentially be considered no limit to a user&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Persistence&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Designers can pass this output and the CDT with this field into process variables&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;It is strongly &lt;strong&gt;recommended to only use this option if you will be writing and reading from the database directly from SAIL interfaces&lt;/strong&gt;; never pass data of this column type into process variables&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Support&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;This is a standard database column type which can be exported, modified, and migrated easily&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;This is not a standard database column type, which could lead to difficulties when trying to export, modify, or migrate&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Querying&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Searching and sorting against this column type is performant (see Querying below for more information)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Searching and sorting against this column type is not performant, and might not be supported depending on your database&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="querying"&gt;Querying Against The Rich Text Data&lt;/h3&gt;
&lt;p&gt;For the use case of searching or sorting against the rich text data, it is recommended to separately create a column in your CDT to store the raw text. &amp;nbsp;The raw text column should be the same type and size of the HTML column. Whenever searching or sorting against the rich text data, search or sort against this column, not the HTML column.&lt;/p&gt;
&lt;p&gt;To populate the raw text column, there are two options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Using the&amp;nbsp;fn!striphtml() function in Appian. This is best used when&amp;nbsp;the size of your data is small, or when the contents of the rich text editor never hits a process variable.&lt;/li&gt;
&lt;li&gt;Using database triggers. This is best used when it&amp;#39;s important to avoid increasing the&amp;nbsp;memory&amp;nbsp;consumption of the process engines, such as when the rich text editor contents are large and passed through process.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To create database triggers to update this field on every INSERT or UPDATE to the database table, follow the instructions below for accomplishing this in MariaDB. For other databases, use the same design, just adjust to match your database&amp;rsquo;s syntax.&lt;/p&gt;
&lt;p&gt;Replace [RAWTEXT_COL] with the name of your raw text column, [HTML_COL] with the name of your html column, and [TABLE_NAME] with the name of your table.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="sql"&gt;-- Create a function to strip html tags given a string

DELIMITER &amp;amp;&amp;amp;

CREATE FUNCTION `strip_tags`($str text) RETURNS text
BEGIN
   DECLARE $start, $end INT DEFAULT 1;
   LOOP
       SET $start = LOCATE(&amp;quot;&amp;lt;&amp;quot;, $str, $start);
       IF (!$start) THEN RETURN $str; END IF;
       SET $end = LOCATE(&amp;quot;&amp;gt;&amp;quot;, $str, $start);
       IF (!$end) THEN SET $end = $start; END IF;
       SET $str = INSERT($str, $start, $end - $start + 1, &amp;quot;&amp;quot;);
       SET $str = REPLACE($str, &amp;quot;&amp;#160;&amp;quot;, &amp;quot; &amp;quot;);
   END LOOP;
END&amp;amp;&amp;amp;

DELIMITER ;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="sql"&gt;-- Create triggers to execute strip_tags() on the html column with every insert or update, and store the raw text

DELIMITER &amp;amp;&amp;amp;

CREATE TRIGGER `store_raw_input_insert`
BEFORE INSERT ON `[TABLE_NAME]`
FOR EACH ROW BEGIN
    SET NEW.`[RAWTEXT_COL]` = strip_tags(NEW.`[HTML_COL]`);
END&amp;amp;&amp;amp;

CREATE TRIGGER `store_raw_input_update`
BEFORE UPDATE ON `[TABLE_NAME]`
FOR EACH ROW BEGIN
    SET NEW.`[RAWTEXT_COL]` = strip_tags(NEW.`[HTML_COL]`);
END&amp;amp;&amp;amp;

DELIMITER ;&lt;/pre&gt;&lt;/p&gt;
&lt;h3 id="emails"&gt;Sending Emails&lt;/h3&gt;
&lt;p&gt;For the use case of sending formatted emails created by end users, a designer must consider the maximum size of the HTML output as well as the expected email volume.&lt;/p&gt;
&lt;p&gt;When sending emails with the Send Email node, the &amp;nbsp;HTML output is loaded and cached in the process execution engine as a string. &amp;nbsp;Over time, the cached values accumulate in memory and can lead to memory resource issues.&lt;/p&gt;
&lt;p&gt;It is recommended to perform non functional testing by sending representative emails at the expected email volume for at least 3 days to measure and evaluate the impacts on the system memory usage and ensure a scalable application in production.&lt;/p&gt;
&lt;p&gt;To configure in process, in the Send Email node, either pass the HTML output as an expression to the ad-hoc message body, or pass the HTML output as an input parameter to the HTML template message body.&lt;/p&gt;
&lt;h2 id="allowed_formats"&gt;Allowed Formats&lt;/h2&gt;
&lt;p&gt;Only applicable for &lt;code&gt;fn!richtextfield&lt;/code&gt;. This parameter to the function fn!richTextField()&amp;nbsp;allows the designer to configure which formatting options are available to the end users when entering rich text into the field such as &amp;ldquo;bold&amp;rdquo;, &amp;ldquo;italic&amp;rdquo;, &amp;ldquo;list&amp;rdquo;, etc.&lt;/p&gt;
&lt;h4 id="configuring"&gt;Configuring this Parameter&lt;/h4&gt;
&lt;p&gt;For consistency and ease of development/maintenance across the platform, the allowed formats should be stored in a constant and used in all instances of the rich text editor.&lt;/p&gt;
&lt;h4 id="modifying"&gt;Modifying Allowed Formats&lt;/h4&gt;
&lt;p&gt;Allowed format options should never be removed after users have already entered data in this field in a production setting (outside of special circumstances), since this means previously-entered text would not be backwards compatible with the updated component configuration. &amp;nbsp;For example, if a user had formatted using a numbered list, and &amp;ldquo;list&amp;rdquo; was removed as an allowed format, then all numbered lists that were previously saved would render incorrectly in the updated component configuration.&lt;/p&gt;
&lt;p&gt;If you do need to remove some allowed formats after users have already entered text in a production setting, it is recommended to pass the previously allowed formats to the component whenever it is rendered as read-only. &amp;nbsp;For example, picture a comment thread that supported &amp;ldquo;list&amp;rdquo; for a while, then removed &amp;ldquo;list&amp;rdquo; format. The read-only fields, displaying previously-entered comments, could still support &amp;ldquo;list&amp;rdquo; while the editable field for new comments would no longer support &amp;ldquo;list&amp;rdquo;. &amp;nbsp;However, this gets more complicated when editing of previously-entered data is considered (e.g. editing an existing comment).&lt;/p&gt;
&lt;h2 id="image_uploads"&gt;Image Uploads&lt;/h2&gt;
&lt;p&gt;Only applicable for &lt;code&gt;fn!richTextField&lt;/code&gt;. To enable image uploads, you must do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install the&amp;nbsp;&lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Create a knowledge center and folder to store uploaded documents and note the new folder&amp;#39;s UUID&lt;/li&gt;
&lt;li&gt;Create a new connected system object which leverages the&amp;nbsp;&lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Enter the folder&amp;#39;s UUID and the user context to use when uploading images&lt;/li&gt;
&lt;li&gt;Create a new Connected System constant which points to the new Connected System object in your application&lt;/li&gt;
&lt;li&gt;In your interface where you use&amp;nbsp;fn!richTextField(), set allowImages&amp;nbsp;to true and imageStorageConnectedSystem&amp;nbsp;to the constant created in the previous step&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note: only the URL to the uploaded image, not the image content itself, is stored in the generated HTML&amp;nbsp;from&amp;nbsp;fn!richTextField().&amp;nbsp; This means that if you use the generated HTML outside of Appian (e.g., in an email), the image will not display unless the outside viewer is already logged into Appian.&lt;/p&gt;
&lt;h2 id="migrate_components"&gt;Migrate Components&lt;/h2&gt;
&lt;p&gt;If you have not yet used either component, you can use whichever one suits your needs best. However, be mindful that it is non-trivial to migrate between fn!richTextField and fn!richTextFieldWithTables and the latter will likely receive more enhancements over time, as the underlying library which renders it is kept up-to-date more.&lt;/p&gt;
&lt;p&gt;The fn!richTextField component relied on non-standard HTML attributes to provide formatting, specifically indentation and nested list formatting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Indentation: fn!richTextField&amp;nbsp;uses the HTML class &amp;quot;ql-indent-N&amp;quot; (where N is the indentation level) for both line indents and for nested lists.&amp;nbsp;fn!richTextFieldWithTables uses the HTML standard style=&amp;#39;margin-left: Npx&amp;#39; for line indents and nested list tags for nested lists (e.g. &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Bullet&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Nested Bullet&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;). This means that if you were using fn!richTextField and saved end-user formatted indentation or nested lists, fn!richTextFieldWithTables will not recognize these specific formats when rendering and will drop the indentation and nested lists.&lt;/li&gt;
&lt;li&gt;Paragraphs: fn!richTextField relies on &amp;lt;div&amp;gt; tags to separate paragraphs, while fn!richTextFieldWithTables relies on &amp;lt;p&amp;gt; tags. This means that passing end-user formatting text from fn!richTextField to fn!richTextFieldWithTables will drop all paragraphs and carriage returns.&lt;/li&gt;
&lt;li&gt;Font Color:&amp;nbsp;fn!richTextField&amp;nbsp;relies on&amp;nbsp;&amp;lt;span&amp;gt;&amp;nbsp;tags with a&amp;nbsp;style attribute for font color (e.g. &amp;lt;span style=&amp;#39;color: rgb(153, 51, 255);&amp;#39;&amp;gt;), while&amp;nbsp;fn!richTextFieldWithTables&amp;nbsp;relies on&amp;nbsp;&amp;lt;font&amp;gt;&amp;nbsp;tags with a color attribute (e.g. &amp;lt;font color=&amp;#39;#9c00ff&amp;#39;&amp;gt;). This means that font colors will get dropped if you directly&amp;nbsp;pass end-user formatting text from&amp;nbsp;fn!richTextField&amp;nbsp;to&amp;nbsp;fn!richTextFieldWithTables.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;#39;d like to migrate end-user formatting text to fn!richTextFieldWithTables, you can write an expression which updates the non-standard indentation attributes and div tags to be recognized by the new component. However this may be more involved for nested lists which will require a more complicated update than just find and replace.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: Architecture, plugins&lt;/div&gt;
</description></item><item><title>End-User Rich Text Editor Component</title><link>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component/revision/7</link><pubDate>Thu, 26 Oct 2023 18:59:07 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:3db951cf-ae18-4eb3-ade0-88ff9f63dc35</guid><dc:creator>joel.larin</dc:creator><comments>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component#comments</comments><description>Revision 7 posted to Guide by joel.larin on 10/26/2023 6:59:07 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;p&gt;This component is not part of the Appian base product. It is a component plugin managed by Appian Professional Services and it can be downloaded on the &lt;a href="/b/appmarket/posts/rich-text-editor"&gt;Appian AppMarket&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please see the &lt;a href="/w/guide/3321/rich-text-editor-component-troubleshooting-guide"&gt;Component Plug-in Troubleshooting Guide&lt;/a&gt;&amp;nbsp;if you have any issues.&amp;nbsp; If you have further questions please email &lt;a href="mailto:richtext-componentpluginsupport@appian.com"&gt;richtext-componentpluginsupport@appian.com&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="plugin_components"&gt;Plugin Components&lt;/h2&gt;
&lt;p&gt;As of version 1.5.3, this plugin includes two (2) components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fn!richTextField()&lt;/code&gt; - This is the plugin&amp;rsquo;s original component.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fn!richTextFieldWithTables()&lt;/code&gt; - This component is new as of version 1.5.3.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Refer to the&amp;nbsp;chart below to understand what formatting each component supports.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Component&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Text Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Table Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Image Uploads&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fn!richTextField()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fn!richTextFieldWithTables()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All information in this guide applies to both components, unless stated that it only applies to one of the components.&lt;/p&gt;
&lt;h3&gt;Why are there 2 components?&lt;/h3&gt;
&lt;p&gt;In order to provide table support, we needed to switch to a new underlying library that supports tables. This new library generates HTML that is different from the previous library. To prevent refactoring and unintended behavior for those using the plugin currently, we opted to keep the existing component as is If you want to migrate to the new component, refer to the &lt;a href="#migrate_components"&gt;How to migrate to fn!richTextFieldWithTables &lt;/a&gt;section below.&lt;/p&gt;
&lt;p&gt;Also, the new component, fn!richTextFieldWithTables(), strictly uses standard HTML attributes for all formats, which should simplify complexities with passing the output HTML to downstream systems, such as email or document generation.&lt;/p&gt;
&lt;h2 id="parameters"&gt;Parameters&lt;/h2&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Keyword&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Applicable Component(s)&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Label&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;label&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text to display as the field label.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Label Position&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;labelPosition&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text to determine where the label appears. Valid values include&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;ABOVE&amp;quot; (default) Displays the label above the component.&lt;/li&gt;
&lt;li&gt;&amp;quot;ADJACENT&amp;quot; Displays the label to the left of the component.&lt;/li&gt;
&lt;li&gt;&amp;quot;COLLAPSED&amp;quot; Hides the label. The label will still be read by screen readers.&lt;/li&gt;
&lt;li&gt;&amp;quot;JUSTIFIED&amp;quot; Aligns the label alongside the component starting at the edge of the page.&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text displayed below the field&amp;#39;s value.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Help Tooltip&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;helpTooltip&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Displays a help icon with the specified text as a tooltip. The tooltip displays a maximum of 500 characters. The help icon does not show when the label position is &amp;quot;COLLAPSED&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Required&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;required&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Shows or hides the asterisk indicating if the component is required but does not enforce requiredness. To enforce requiredness, use the parameter &amp;quot;validations&amp;quot;. To enforce requiredness only upon submission, use section or form-level validations.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Disabled&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;disabled&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if the user is prevented from changing the value. Default: false.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Validations&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;validations&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Validation errors to be displayed below the field when the value is not null.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Height&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;height&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines the field height. Valid values include &amp;quot;SHORT&amp;quot;, &amp;quot;MEDIUM&amp;quot; (default), and &amp;quot;TALL&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Show When&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;showWhen&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines whether the component is displayed on the interface. When set to false, the component is hidden and is not evaluated. Default: true.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rich Text Value&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;richTextValue&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Rich text to display in the field.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rich Text Save Into&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;richTextSaveInto&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Save Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;One or more variables that are updated with the richText value when the user changes it. Use a!save() to save a modified or alternative value to a variable.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Read Only&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;readOnly&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if the field should display as not editable. Default: false.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Max Size&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;maxSize&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Number (Integer)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Maximum size of the HTML formatted rich text data (not number of characters). Default: 10000.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Placeholder&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;placeholder&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text to display in the field when it is empty. Does not show if the field is read only.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Enable Progress Bar&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;enableProgressBar&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Whether to show the progress bar of what percent of rich text data users have entered. Default: true.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Allowed Formats&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;allowedFormats&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines which format styles are allowed. Note: these must be set on page load and cannot change. Valid values: &amp;quot;header&amp;quot;, &amp;quot;size&amp;quot;, &amp;quot;bold&amp;quot;, &amp;quot;italic&amp;quot;, &amp;quot;underline&amp;quot;, &amp;quot;strike&amp;quot;, &amp;quot;color&amp;quot;, &amp;quot;background&amp;quot;, &amp;quot;link&amp;quot;, &amp;quot;align&amp;quot;, &amp;quot;indent&amp;quot;, &amp;quot;list&amp;quot;. Default: All styles. See &lt;a href="#allowed-formats"&gt;more info&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;Note that fn!richTextFieldWithTables() sets this parameter to &amp;quot;All styles&amp;quot; by default on the back-end as this is the most common setting in the older component. If you&amp;#39;d like to parameterize allowed styles, please reach out with a request.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Table Border Style&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;tableBorderStyle&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextFieldWithTables()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines the style of the grid border. Valid values: &amp;quot;STANDARD&amp;quot; (default), &amp;quot;LIGHT&amp;quot;, &amp;quot;NONE&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Allow Images&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;allowImages&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;fn!richTextField()&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if images are allowed. Default: false.&amp;nbsp;See &lt;a href="#image-uploads"&gt;more info&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;Note that fn!richTextFieldWithTables() does not support image upload at this time. If you&amp;#39;d like to allow this behavior, please reach out with a request.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Image Storage Connected System&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;imageStorageConnectedSystem&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Connected System&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The instance of the &lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&amp;nbsp;used to store images from the rich text editor. This is required if allowImages is set to true.&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Uploaded Images&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;uploadedImages&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Map&amp;nbsp;Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;An array of images uploaded during this&amp;nbsp;session with metadata about the image. &amp;quot;wasRemovedFromField&amp;quot; is true when a user uploads an image but then removes it in the same session.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="notes"&gt;Notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Due to the potential large size of the HTML output of this component, do not save this value into a process variable or a node parameter. Instead, use an expression to load and persist the HTML output directly on the user interface.&lt;/li&gt;
&lt;li&gt;Do not use validations&amp;nbsp;to validate the maximum length of the HTML formatted rich text value. Instead, use the parameter maxSize.&lt;/li&gt;
&lt;li&gt;Use validations&amp;nbsp;to validate the maximum length of characters that an end-user can enter in the component. To calculate the number of characters, using the functions fn!len()&amp;nbsp;and fn!striphtml().&lt;/li&gt;
&lt;li&gt;When the rich text field is displayed in a read-only format, set the parameter height&amp;nbsp;to AUTO&amp;nbsp;for optimal results.&lt;/li&gt;
&lt;li&gt;The parameter required&amp;nbsp;doesn&amp;rsquo;t actually validate that the richTextValue is not null. This is a limitation of the component plug-in framework. Use section-level or form-level validations to validate the requiredness of the richTextValue.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="data_storage"&gt;Data Storage&lt;/h2&gt;
&lt;h3&gt;Database Column Type Options&lt;/h3&gt;
&lt;p&gt;There are two options for storing the HTML output of this component in your database; the considerations of which are listed below.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;VARCHAR column type, or equivalent&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;LONGTEXT column type, or equivalent&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Max Size&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Limits the maximum size of the HTML output to 4,000 characters (varies by database)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The maximum size of the HTML output can be as great as 50,000 characters, which is large enough to essentially be considered no limit to a user&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Persistence&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Designers can pass this output and the CDT with this field into process variables&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;It is strongly &lt;strong&gt;recommended to only use this option if you will be writing and reading from the database directly from SAIL interfaces&lt;/strong&gt;; never pass data of this column type into process variables&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Support&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;This is a standard database column type which can be exported, modified, and migrated easily&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;This is not a standard database column type, which could lead to difficulties when trying to export, modify, or migrate&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Querying&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Searching and sorting against this column type is performant (see Querying below for more information)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Searching and sorting against this column type is not performant, and might not be supported depending on your database&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="querying"&gt;Querying Against The Rich Text Data&lt;/h3&gt;
&lt;p&gt;For the use case of searching or sorting against the rich text data, it is recommended to separately create a column in your CDT to store the raw text. &amp;nbsp;The raw text column should be the same type and size of the HTML column. Whenever searching or sorting against the rich text data, search or sort against this column, not the HTML column.&lt;/p&gt;
&lt;p&gt;To populate the raw text column, there are two options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Using the&amp;nbsp;fn!striphtml() function in Appian. This is best used when&amp;nbsp;the size of your data is small, or when the contents of the rich text editor never hits a process variable.&lt;/li&gt;
&lt;li&gt;Using database triggers. This is best used when it&amp;#39;s important to avoid increasing the&amp;nbsp;memory&amp;nbsp;consumption of the process engines, such as when the rich text editor contents are large and passed through process.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To create database triggers to update this field on every INSERT or UPDATE to the database table, follow the instructions below for accomplishing this in MariaDB. For other databases, use the same design, just adjust to match your database&amp;rsquo;s syntax.&lt;/p&gt;
&lt;p&gt;Replace [RAWTEXT_COL] with the name of your raw text column, [HTML_COL] with the name of your html column, and [TABLE_NAME] with the name of your table.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="sql"&gt;-- Create a function to strip html tags given a string

DELIMITER &amp;amp;&amp;amp;

CREATE FUNCTION `strip_tags`($str text) RETURNS text
BEGIN
   DECLARE $start, $end INT DEFAULT 1;
   LOOP
       SET $start = LOCATE(&amp;quot;&amp;lt;&amp;quot;, $str, $start);
       IF (!$start) THEN RETURN $str; END IF;
       SET $end = LOCATE(&amp;quot;&amp;gt;&amp;quot;, $str, $start);
       IF (!$end) THEN SET $end = $start; END IF;
       SET $str = INSERT($str, $start, $end - $start + 1, &amp;quot;&amp;quot;);
       SET $str = REPLACE($str, &amp;quot;&amp;#160;&amp;quot;, &amp;quot; &amp;quot;);
   END LOOP;
END&amp;amp;&amp;amp;

DELIMITER ;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="sql"&gt;-- Create triggers to execute strip_tags() on the html column with every insert or update, and store the raw text

DELIMITER &amp;amp;&amp;amp;

CREATE TRIGGER `store_raw_input_insert`
BEFORE INSERT ON `[TABLE_NAME]`
FOR EACH ROW BEGIN
    SET NEW.`[RAWTEXT_COL]` = strip_tags(NEW.`[HTML_COL]`);
END&amp;amp;&amp;amp;

CREATE TRIGGER `store_raw_input_update`
BEFORE UPDATE ON `[TABLE_NAME]`
FOR EACH ROW BEGIN
    SET NEW.`[RAWTEXT_COL]` = strip_tags(NEW.`[HTML_COL]`);
END&amp;amp;&amp;amp;

DELIMITER ;&lt;/pre&gt;&lt;/p&gt;
&lt;h3 id="emails"&gt;Sending Emails&lt;/h3&gt;
&lt;p&gt;For the use case of sending formatted emails created by end users, a designer must consider the maximum size of the HTML output as well as the expected email volume.&lt;/p&gt;
&lt;p&gt;When sending emails with the Send Email node, the &amp;nbsp;HTML output is loaded and cached in the process execution engine as a string. &amp;nbsp;Over time, the cached values accumulate in memory and can lead to memory resource issues.&lt;/p&gt;
&lt;p&gt;It is recommended to perform non functional testing by sending representative emails at the expected email volume for at least 3 days to measure and evaluate the impacts on the system memory usage and ensure a scalable application in production.&lt;/p&gt;
&lt;p&gt;To configure in process, in the Send Email node, either pass the HTML output as an expression to the ad-hoc message body, or pass the HTML output as an input parameter to the HTML template message body.&lt;/p&gt;
&lt;h2 id="allowed_formats"&gt;Allowed Formats&lt;/h2&gt;
&lt;p&gt;Only applicable for &lt;code&gt;fn!richtextfield&lt;/code&gt;. This parameter to the function fn!richTextField()&amp;nbsp;allows the designer to configure which formatting options are available to the end users when entering rich text into the field such as &amp;ldquo;bold&amp;rdquo;, &amp;ldquo;italic&amp;rdquo;, &amp;ldquo;list&amp;rdquo;, etc.&lt;/p&gt;
&lt;h4 id="configuring"&gt;Configuring this Parameter&lt;/h4&gt;
&lt;p&gt;For consistency and ease of development/maintenance across the platform, the allowed formats should be stored in a constant and used in all instances of the rich text editor.&lt;/p&gt;
&lt;h4 id="modifying"&gt;Modifying Allowed Formats&lt;/h4&gt;
&lt;p&gt;Allowed format options should never be removed after users have already entered data in this field in a production setting (outside of special circumstances), since this means previously-entered text would not be backwards compatible with the updated component configuration. &amp;nbsp;For example, if a user had formatted using a numbered list, and &amp;ldquo;list&amp;rdquo; was removed as an allowed format, then all numbered lists that were previously saved would render incorrectly in the updated component configuration.&lt;/p&gt;
&lt;p&gt;If you do need to remove some allowed formats after users have already entered text in a production setting, it is recommended to pass the previously allowed formats to the component whenever it is rendered as read-only. &amp;nbsp;For example, picture a comment thread that supported &amp;ldquo;list&amp;rdquo; for a while, then removed &amp;ldquo;list&amp;rdquo; format. The read-only fields, displaying previously-entered comments, could still support &amp;ldquo;list&amp;rdquo; while the editable field for new comments would no longer support &amp;ldquo;list&amp;rdquo;. &amp;nbsp;However, this gets more complicated when editing of previously-entered data is considered (e.g. editing an existing comment).&lt;/p&gt;
&lt;h2 id="image_uploads"&gt;Image Uploads&lt;/h2&gt;
&lt;p&gt;Only applicable for &lt;code&gt;fn!richTextField&lt;/code&gt;. To enable image uploads, you must do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install the&amp;nbsp;&lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Create a knowledge center and folder to store uploaded documents and note the new folder&amp;#39;s UUID&lt;/li&gt;
&lt;li&gt;Create a new connected system object which leverages the&amp;nbsp;&lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Enter the folder&amp;#39;s UUID and the user context to use when uploading images&lt;/li&gt;
&lt;li&gt;Create a new Connected System constant which points to the new Connected System object in your application&lt;/li&gt;
&lt;li&gt;In your interface where you use&amp;nbsp;fn!richTextField(), set allowImages&amp;nbsp;to true and imageStorageConnectedSystem&amp;nbsp;to the constant created in the previous step&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note: only the URL to the uploaded image, not the image content itself, is stored in the generated HTML&amp;nbsp;from&amp;nbsp;fn!richTextField().&amp;nbsp; This means that if you use the generated HTML outside of Appian (e.g., in an email), the image will not display unless the outside viewer is already logged into Appian.&lt;/p&gt;
&lt;h2 id="migrate_components"&gt;Migrate Components&lt;/h2&gt;
&lt;p&gt;If you have not yet used either component, you can use whichever one suits your needs best. However, be mindful that it is non-trivial to migrate between fn!richTextField and fn!richTextFieldWithTables and the latter will likely receive more enhancements over time, as the underlying library which renders it is kept up-to-date more.&lt;/p&gt;
&lt;p&gt;The fn!richTextField component relied on non-standard HTML attributes to provide formatting, specifically indentation and nested list formatting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Indentation: fn!richTextField&amp;nbsp;uses the HTML class &amp;quot;ql-indent-N&amp;quot; (where N is the indentation level) for both line indents and for nested lists.&amp;nbsp;fn!richTextFieldWithTables uses the HTML standard style=&amp;#39;margin-left: Npx&amp;#39; for line indents and nested list tags for nested lists (e.g. &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Bullet&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Nested Bullet&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;). This means that if you were using fn!richTextField and saved end-user formatted indentation or nested lists, fn!richTextFieldWithTables will not recognize these specific formats when rendering and will drop the indentation and nested lists.&lt;/li&gt;
&lt;li&gt;Paragraphs: fn!richTextField relies on &amp;lt;div&amp;gt; tags to separate paragraphs, while fn!richTextFieldWithTables relies on &amp;lt;p&amp;gt; tags. This means that passing end-user formatting text from fn!richTextField to fn!richTextFieldWithTables will drop all paragraphs and carriage returns.&lt;/li&gt;
&lt;li&gt;Font Color:&amp;nbsp;fn!richTextField&amp;nbsp;relies on&amp;nbsp;&amp;lt;span&amp;gt;&amp;nbsp;tags with a&amp;nbsp;style attribute for font color (e.g. &amp;lt;span style=&amp;#39;color: rgb(153, 51, 255);&amp;#39;&amp;gt;), while&amp;nbsp;fn!richTextFieldWithTables&amp;nbsp;relies on&amp;nbsp;&amp;lt;font&amp;gt;&amp;nbsp;tags with a color attribute (e.g. &amp;lt;font color=&amp;#39;#9c00ff&amp;#39;&amp;gt;). This means that font colors will get dropped if you directly&amp;nbsp;pass end-user formatting text from&amp;nbsp;fn!richTextField&amp;nbsp;to&amp;nbsp;fn!richTextFieldWithTables.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;#39;d like to migrate end-user formatting text to fn!richTextFieldWithTables, you can write an expression which updates the non-standard indentation attributes and div tags to be recognized by the new component. However this may be more involved for nested lists which will require a more complicated update than just find and replace.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item><item><title>End-User Rich Text Editor Component</title><link>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component/revision/6</link><pubDate>Thu, 26 Oct 2023 18:57:50 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:3db951cf-ae18-4eb3-ade0-88ff9f63dc35</guid><dc:creator>joel.larin</dc:creator><comments>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component#comments</comments><description>Revision 6 posted to Guide by joel.larin on 10/26/2023 6:57:50 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;p&gt;This component is not part of the Appian base product. It is a component plugin managed by Appian Professional Services and it can be downloaded on the &lt;a href="/b/appmarket/posts/rich-text-editor"&gt;Appian AppMarket&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please see the &lt;a href="/w/guide/3321/rich-text-editor-component-troubleshooting-guide"&gt;Component Plug-in Troubleshooting Guide&lt;/a&gt;&amp;nbsp;if you have any issues.&amp;nbsp; If you have further questions please email &lt;a href="mailto:richtext-componentpluginsupport@appian.com"&gt;richtext-componentpluginsupport@appian.com&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="plugin_components"&gt;Plugin Components&lt;/h2&gt;
&lt;p&gt;As of version 1.5.3, this plugin includes two (2) components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fn!richTextField()&lt;/code&gt; - This is the plugin&amp;rsquo;s original component.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fn!richTextFieldWithTables()&lt;/code&gt; - This component is new as of version 1.5.3.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Refer to the&amp;nbsp;chart below to understand what formatting each component supports.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Component&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Text Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Table Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Image Uploads&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fn!richTextField()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fn!richTextFieldWithTables()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All information in this guide applies to both components, unless stated that it only applies to one of the components.&lt;/p&gt;
&lt;h3&gt;Why are there 2 components?&lt;/h3&gt;
&lt;p&gt;In order to provide table support, we needed to switch to a new underlying library that supports tables. This new library generates HTML that is different from the previous library. To prevent refactoring and unintended behavior for those using the plugin currently, we opted to keep the existing component as is If you want to migrate to the new component, refer to the &lt;a href="#migrate"&gt;How to migrate to fn!richTextFieldWithTables&lt;/a&gt; section below.&lt;/p&gt;
&lt;p&gt;Also, the new component, fn!richTextFieldWithTables(), strictly uses standard HTML attributes for all formats, which should simplify complexities with passing the output HTML to downstream systems, such as email or document generation.&lt;/p&gt;
&lt;h2 id="parameters"&gt;Parameters&lt;/h2&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Keyword&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Applicable Component(s)&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Label&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;label&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text to display as the field label.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Label Position&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;labelPosition&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text to determine where the label appears. Valid values include&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;ABOVE&amp;quot; (default) Displays the label above the component.&lt;/li&gt;
&lt;li&gt;&amp;quot;ADJACENT&amp;quot; Displays the label to the left of the component.&lt;/li&gt;
&lt;li&gt;&amp;quot;COLLAPSED&amp;quot; Hides the label. The label will still be read by screen readers.&lt;/li&gt;
&lt;li&gt;&amp;quot;JUSTIFIED&amp;quot; Aligns the label alongside the component starting at the edge of the page.&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text displayed below the field&amp;#39;s value.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Help Tooltip&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;helpTooltip&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Displays a help icon with the specified text as a tooltip. The tooltip displays a maximum of 500 characters. The help icon does not show when the label position is &amp;quot;COLLAPSED&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Required&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;required&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Shows or hides the asterisk indicating if the component is required but does not enforce requiredness. To enforce requiredness, use the parameter &amp;quot;validations&amp;quot;. To enforce requiredness only upon submission, use section or form-level validations.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Disabled&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;disabled&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if the user is prevented from changing the value. Default: false.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Validations&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;validations&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Validation errors to be displayed below the field when the value is not null.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Height&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;height&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines the field height. Valid values include &amp;quot;SHORT&amp;quot;, &amp;quot;MEDIUM&amp;quot; (default), and &amp;quot;TALL&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Show When&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;showWhen&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines whether the component is displayed on the interface. When set to false, the component is hidden and is not evaluated. Default: true.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rich Text Value&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;richTextValue&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Rich text to display in the field.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rich Text Save Into&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;richTextSaveInto&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Save Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;One or more variables that are updated with the richText value when the user changes it. Use a!save() to save a modified or alternative value to a variable.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Read Only&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;readOnly&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if the field should display as not editable. Default: false.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Max Size&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;maxSize&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Number (Integer)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Maximum size of the HTML formatted rich text data (not number of characters). Default: 10000.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Placeholder&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;placeholder&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text to display in the field when it is empty. Does not show if the field is read only.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Enable Progress Bar&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;enableProgressBar&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Whether to show the progress bar of what percent of rich text data users have entered. Default: true.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Allowed Formats&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;allowedFormats&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines which format styles are allowed. Note: these must be set on page load and cannot change. Valid values: &amp;quot;header&amp;quot;, &amp;quot;size&amp;quot;, &amp;quot;bold&amp;quot;, &amp;quot;italic&amp;quot;, &amp;quot;underline&amp;quot;, &amp;quot;strike&amp;quot;, &amp;quot;color&amp;quot;, &amp;quot;background&amp;quot;, &amp;quot;link&amp;quot;, &amp;quot;align&amp;quot;, &amp;quot;indent&amp;quot;, &amp;quot;list&amp;quot;. Default: All styles. See &lt;a href="#allowed-formats"&gt;more info&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;Note that fn!richTextFieldWithTables() sets this parameter to &amp;quot;All styles&amp;quot; by default on the back-end as this is the most common setting in the older component. If you&amp;#39;d like to parameterize allowed styles, please reach out with a request.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Table Border Style&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;tableBorderStyle&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextFieldWithTables()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines the style of the grid border. Valid values: &amp;quot;STANDARD&amp;quot; (default), &amp;quot;LIGHT&amp;quot;, &amp;quot;NONE&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Allow Images&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;allowImages&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;fn!richTextField()&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if images are allowed. Default: false.&amp;nbsp;See &lt;a href="#image-uploads"&gt;more info&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;Note that fn!richTextFieldWithTables() does not support image upload at this time. If you&amp;#39;d like to allow this behavior, please reach out with a request.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Image Storage Connected System&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;imageStorageConnectedSystem&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Connected System&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The instance of the &lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&amp;nbsp;used to store images from the rich text editor. This is required if allowImages is set to true.&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Uploaded Images&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;uploadedImages&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Map&amp;nbsp;Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;An array of images uploaded during this&amp;nbsp;session with metadata about the image. &amp;quot;wasRemovedFromField&amp;quot; is true when a user uploads an image but then removes it in the same session.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="notes"&gt;Notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Due to the potential large size of the HTML output of this component, do not save this value into a process variable or a node parameter. Instead, use an expression to load and persist the HTML output directly on the user interface.&lt;/li&gt;
&lt;li&gt;Do not use validations&amp;nbsp;to validate the maximum length of the HTML formatted rich text value. Instead, use the parameter maxSize.&lt;/li&gt;
&lt;li&gt;Use validations&amp;nbsp;to validate the maximum length of characters that an end-user can enter in the component. To calculate the number of characters, using the functions fn!len()&amp;nbsp;and fn!striphtml().&lt;/li&gt;
&lt;li&gt;When the rich text field is displayed in a read-only format, set the parameter height&amp;nbsp;to AUTO&amp;nbsp;for optimal results.&lt;/li&gt;
&lt;li&gt;The parameter required&amp;nbsp;doesn&amp;rsquo;t actually validate that the richTextValue is not null. This is a limitation of the component plug-in framework. Use section-level or form-level validations to validate the requiredness of the richTextValue.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="data_storage"&gt;Data Storage&lt;/h2&gt;
&lt;h3&gt;Database Column Type Options&lt;/h3&gt;
&lt;p&gt;There are two options for storing the HTML output of this component in your database; the considerations of which are listed below.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;VARCHAR column type, or equivalent&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;LONGTEXT column type, or equivalent&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Max Size&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Limits the maximum size of the HTML output to 4,000 characters (varies by database)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The maximum size of the HTML output can be as great as 50,000 characters, which is large enough to essentially be considered no limit to a user&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Persistence&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Designers can pass this output and the CDT with this field into process variables&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;It is strongly &lt;strong&gt;recommended to only use this option if you will be writing and reading from the database directly from SAIL interfaces&lt;/strong&gt;; never pass data of this column type into process variables&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Support&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;This is a standard database column type which can be exported, modified, and migrated easily&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;This is not a standard database column type, which could lead to difficulties when trying to export, modify, or migrate&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Querying&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Searching and sorting against this column type is performant (see Querying below for more information)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Searching and sorting against this column type is not performant, and might not be supported depending on your database&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="querying"&gt;Querying Against The Rich Text Data&lt;/h3&gt;
&lt;p&gt;For the use case of searching or sorting against the rich text data, it is recommended to separately create a column in your CDT to store the raw text. &amp;nbsp;The raw text column should be the same type and size of the HTML column. Whenever searching or sorting against the rich text data, search or sort against this column, not the HTML column.&lt;/p&gt;
&lt;p&gt;To populate the raw text column, there are two options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Using the&amp;nbsp;fn!striphtml() function in Appian. This is best used when&amp;nbsp;the size of your data is small, or when the contents of the rich text editor never hits a process variable.&lt;/li&gt;
&lt;li&gt;Using database triggers. This is best used when it&amp;#39;s important to avoid increasing the&amp;nbsp;memory&amp;nbsp;consumption of the process engines, such as when the rich text editor contents are large and passed through process.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To create database triggers to update this field on every INSERT or UPDATE to the database table, follow the instructions below for accomplishing this in MariaDB. For other databases, use the same design, just adjust to match your database&amp;rsquo;s syntax.&lt;/p&gt;
&lt;p&gt;Replace [RAWTEXT_COL] with the name of your raw text column, [HTML_COL] with the name of your html column, and [TABLE_NAME] with the name of your table.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="sql"&gt;-- Create a function to strip html tags given a string

DELIMITER &amp;amp;&amp;amp;

CREATE FUNCTION `strip_tags`($str text) RETURNS text
BEGIN
   DECLARE $start, $end INT DEFAULT 1;
   LOOP
       SET $start = LOCATE(&amp;quot;&amp;lt;&amp;quot;, $str, $start);
       IF (!$start) THEN RETURN $str; END IF;
       SET $end = LOCATE(&amp;quot;&amp;gt;&amp;quot;, $str, $start);
       IF (!$end) THEN SET $end = $start; END IF;
       SET $str = INSERT($str, $start, $end - $start + 1, &amp;quot;&amp;quot;);
       SET $str = REPLACE($str, &amp;quot;&amp;#160;&amp;quot;, &amp;quot; &amp;quot;);
   END LOOP;
END&amp;amp;&amp;amp;

DELIMITER ;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="sql"&gt;-- Create triggers to execute strip_tags() on the html column with every insert or update, and store the raw text

DELIMITER &amp;amp;&amp;amp;

CREATE TRIGGER `store_raw_input_insert`
BEFORE INSERT ON `[TABLE_NAME]`
FOR EACH ROW BEGIN
    SET NEW.`[RAWTEXT_COL]` = strip_tags(NEW.`[HTML_COL]`);
END&amp;amp;&amp;amp;

CREATE TRIGGER `store_raw_input_update`
BEFORE UPDATE ON `[TABLE_NAME]`
FOR EACH ROW BEGIN
    SET NEW.`[RAWTEXT_COL]` = strip_tags(NEW.`[HTML_COL]`);
END&amp;amp;&amp;amp;

DELIMITER ;&lt;/pre&gt;&lt;/p&gt;
&lt;h3 id="emails"&gt;Sending Emails&lt;/h3&gt;
&lt;p&gt;For the use case of sending formatted emails created by end users, a designer must consider the maximum size of the HTML output as well as the expected email volume.&lt;/p&gt;
&lt;p&gt;When sending emails with the Send Email node, the &amp;nbsp;HTML output is loaded and cached in the process execution engine as a string. &amp;nbsp;Over time, the cached values accumulate in memory and can lead to memory resource issues.&lt;/p&gt;
&lt;p&gt;It is recommended to perform non functional testing by sending representative emails at the expected email volume for at least 3 days to measure and evaluate the impacts on the system memory usage and ensure a scalable application in production.&lt;/p&gt;
&lt;p&gt;To configure in process, in the Send Email node, either pass the HTML output as an expression to the ad-hoc message body, or pass the HTML output as an input parameter to the HTML template message body.&lt;/p&gt;
&lt;h2 id="allowed_formats"&gt;Allowed Formats&lt;/h2&gt;
&lt;p&gt;Only applicable for &lt;code&gt;fn!richtextfield&lt;/code&gt;. This parameter to the function fn!richTextField()&amp;nbsp;allows the designer to configure which formatting options are available to the end users when entering rich text into the field such as &amp;ldquo;bold&amp;rdquo;, &amp;ldquo;italic&amp;rdquo;, &amp;ldquo;list&amp;rdquo;, etc.&lt;/p&gt;
&lt;h4 id="configuring"&gt;Configuring this Parameter&lt;/h4&gt;
&lt;p&gt;For consistency and ease of development/maintenance across the platform, the allowed formats should be stored in a constant and used in all instances of the rich text editor.&lt;/p&gt;
&lt;h4 id="modifying"&gt;Modifying Allowed Formats&lt;/h4&gt;
&lt;p&gt;Allowed format options should never be removed after users have already entered data in this field in a production setting (outside of special circumstances), since this means previously-entered text would not be backwards compatible with the updated component configuration. &amp;nbsp;For example, if a user had formatted using a numbered list, and &amp;ldquo;list&amp;rdquo; was removed as an allowed format, then all numbered lists that were previously saved would render incorrectly in the updated component configuration.&lt;/p&gt;
&lt;p&gt;If you do need to remove some allowed formats after users have already entered text in a production setting, it is recommended to pass the previously allowed formats to the component whenever it is rendered as read-only. &amp;nbsp;For example, picture a comment thread that supported &amp;ldquo;list&amp;rdquo; for a while, then removed &amp;ldquo;list&amp;rdquo; format. The read-only fields, displaying previously-entered comments, could still support &amp;ldquo;list&amp;rdquo; while the editable field for new comments would no longer support &amp;ldquo;list&amp;rdquo;. &amp;nbsp;However, this gets more complicated when editing of previously-entered data is considered (e.g. editing an existing comment).&lt;/p&gt;
&lt;h2 id="image_uploads"&gt;Image Uploads&lt;/h2&gt;
&lt;p&gt;Only applicable for &lt;code&gt;fn!richTextField&lt;/code&gt;. To enable image uploads, you must do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install the&amp;nbsp;&lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Create a knowledge center and folder to store uploaded documents and note the new folder&amp;#39;s UUID&lt;/li&gt;
&lt;li&gt;Create a new connected system object which leverages the&amp;nbsp;&lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Enter the folder&amp;#39;s UUID and the user context to use when uploading images&lt;/li&gt;
&lt;li&gt;Create a new Connected System constant which points to the new Connected System object in your application&lt;/li&gt;
&lt;li&gt;In your interface where you use&amp;nbsp;fn!richTextField(), set allowImages&amp;nbsp;to true and imageStorageConnectedSystem&amp;nbsp;to the constant created in the previous step&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note: only the URL to the uploaded image, not the image content itself, is stored in the generated HTML&amp;nbsp;from&amp;nbsp;fn!richTextField().&amp;nbsp; This means that if you use the generated HTML outside of Appian (e.g., in an email), the image will not display unless the outside viewer is already logged into Appian.&lt;/p&gt;
&lt;h2 id="migrate_components"&gt;Migrate Components&lt;/h2&gt;
&lt;p&gt;If you have not yet used either component, you can use whichever one suits your needs best. However, be mindful that it is non-trivial to migrate between fn!richTextField and fn!richTextFieldWithTables and the latter will likely receive more enhancements over time, as the underlying library which renders it is kept up-to-date more.&lt;/p&gt;
&lt;p&gt;The fn!richTextField component relied on non-standard HTML attributes to provide formatting, specifically indentation and nested list formatting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Indentation: fn!richTextField&amp;nbsp;uses the HTML class &amp;quot;ql-indent-N&amp;quot; (where N is the indentation level) for both line indents and for nested lists.&amp;nbsp;fn!richTextFieldWithTables uses the HTML standard style=&amp;#39;margin-left: Npx&amp;#39; for line indents and nested list tags for nested lists (e.g. &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Bullet&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Nested Bullet&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;). This means that if you were using fn!richTextField and saved end-user formatted indentation or nested lists, fn!richTextFieldWithTables will not recognize these specific formats when rendering and will drop the indentation and nested lists.&lt;/li&gt;
&lt;li&gt;Paragraphs: fn!richTextField relies on &amp;lt;div&amp;gt; tags to separate paragraphs, while fn!richTextFieldWithTables relies on &amp;lt;p&amp;gt; tags. This means that passing end-user formatting text from fn!richTextField to fn!richTextFieldWithTables will drop all paragraphs and carriage returns.&lt;/li&gt;
&lt;li&gt;Font Color:&amp;nbsp;fn!richTextField&amp;nbsp;relies on&amp;nbsp;&amp;lt;span&amp;gt;&amp;nbsp;tags with a&amp;nbsp;style attribute for font color (e.g. &amp;lt;span style=&amp;#39;color: rgb(153, 51, 255);&amp;#39;&amp;gt;), while&amp;nbsp;fn!richTextFieldWithTables&amp;nbsp;relies on&amp;nbsp;&amp;lt;font&amp;gt;&amp;nbsp;tags with a color attribute (e.g. &amp;lt;font color=&amp;#39;#9c00ff&amp;#39;&amp;gt;). This means that font colors will get dropped if you directly&amp;nbsp;pass end-user formatting text from&amp;nbsp;fn!richTextField&amp;nbsp;to&amp;nbsp;fn!richTextFieldWithTables.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;#39;d like to migrate end-user formatting text to fn!richTextFieldWithTables, you can write an expression which updates the non-standard indentation attributes and div tags to be recognized by the new component. However this may be more involved for nested lists which will require a more complicated update than just find and replace.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item><item><title>End-User Rich Text Editor Component</title><link>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component/revision/5</link><pubDate>Thu, 26 Oct 2023 18:57:20 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:3db951cf-ae18-4eb3-ade0-88ff9f63dc35</guid><dc:creator>joel.larin</dc:creator><comments>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component#comments</comments><description>Revision 5 posted to Guide by joel.larin on 10/26/2023 6:57:20 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;p&gt;This component is not part of the Appian base product. It is a component plugin managed by Appian Professional Services and it can be downloaded on the &lt;a href="/b/appmarket/posts/rich-text-editor"&gt;Appian AppMarket&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please see the &lt;a href="/w/guide/3321/rich-text-editor-component-troubleshooting-guide"&gt;Component Plug-in Troubleshooting Guide&lt;/a&gt;&amp;nbsp;if you have any issues.&amp;nbsp; If you have further questions please email &lt;a href="mailto:richtext-componentpluginsupport@appian.com"&gt;richtext-componentpluginsupport@appian.com&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="Plugin Components"&gt;Plugin Components&lt;/h2&gt;
&lt;p&gt;As of version 1.5.3, this plugin includes two (2) components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fn!richTextField()&lt;/code&gt; - This is the plugin&amp;rsquo;s original component.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fn!richTextFieldWithTables()&lt;/code&gt; - This component is new as of version 1.5.3.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Refer to the&amp;nbsp;chart below to understand what formatting each component supports.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Component&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Text Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Table Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Image Uploads&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fn!richTextField()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fn!richTextFieldWithTables()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All information in this guide applies to both components, unless stated that it only applies to one of the components.&lt;/p&gt;
&lt;h3&gt;Why are there 2 components?&lt;/h3&gt;
&lt;p&gt;In order to provide table support, we needed to switch to a new underlying library that supports tables. This new library generates HTML that is different from the previous library. To prevent refactoring and unintended behavior for those using the plugin currently, we opted to keep the existing component as is If you want to migrate to the new component, refer to the &lt;a href="#migrate"&gt;How to migrate to fn!richTextFieldWithTables&lt;/a&gt; section below.&lt;/p&gt;
&lt;p&gt;Also, the new component, fn!richTextFieldWithTables(), strictly uses standard HTML attributes for all formats, which should simplify complexities with passing the output HTML to downstream systems, such as email or document generation.&lt;/p&gt;
&lt;h2 id="parameters"&gt;Parameters&lt;/h2&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Keyword&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Applicable Component(s)&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Label&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;label&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text to display as the field label.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Label Position&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;labelPosition&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text to determine where the label appears. Valid values include&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;ABOVE&amp;quot; (default) Displays the label above the component.&lt;/li&gt;
&lt;li&gt;&amp;quot;ADJACENT&amp;quot; Displays the label to the left of the component.&lt;/li&gt;
&lt;li&gt;&amp;quot;COLLAPSED&amp;quot; Hides the label. The label will still be read by screen readers.&lt;/li&gt;
&lt;li&gt;&amp;quot;JUSTIFIED&amp;quot; Aligns the label alongside the component starting at the edge of the page.&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text displayed below the field&amp;#39;s value.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Help Tooltip&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;helpTooltip&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Displays a help icon with the specified text as a tooltip. The tooltip displays a maximum of 500 characters. The help icon does not show when the label position is &amp;quot;COLLAPSED&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Required&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;required&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Shows or hides the asterisk indicating if the component is required but does not enforce requiredness. To enforce requiredness, use the parameter &amp;quot;validations&amp;quot;. To enforce requiredness only upon submission, use section or form-level validations.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Disabled&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;disabled&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if the user is prevented from changing the value. Default: false.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Validations&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;validations&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Validation errors to be displayed below the field when the value is not null.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Height&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;height&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines the field height. Valid values include &amp;quot;SHORT&amp;quot;, &amp;quot;MEDIUM&amp;quot; (default), and &amp;quot;TALL&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Show When&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;showWhen&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines whether the component is displayed on the interface. When set to false, the component is hidden and is not evaluated. Default: true.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rich Text Value&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;richTextValue&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Rich text to display in the field.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rich Text Save Into&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;richTextSaveInto&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Save Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;One or more variables that are updated with the richText value when the user changes it. Use a!save() to save a modified or alternative value to a variable.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Read Only&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;readOnly&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if the field should display as not editable. Default: false.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Max Size&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;maxSize&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Number (Integer)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Maximum size of the HTML formatted rich text data (not number of characters). Default: 10000.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Placeholder&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;placeholder&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text to display in the field when it is empty. Does not show if the field is read only.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Enable Progress Bar&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;enableProgressBar&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Whether to show the progress bar of what percent of rich text data users have entered. Default: true.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Allowed Formats&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;allowedFormats&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines which format styles are allowed. Note: these must be set on page load and cannot change. Valid values: &amp;quot;header&amp;quot;, &amp;quot;size&amp;quot;, &amp;quot;bold&amp;quot;, &amp;quot;italic&amp;quot;, &amp;quot;underline&amp;quot;, &amp;quot;strike&amp;quot;, &amp;quot;color&amp;quot;, &amp;quot;background&amp;quot;, &amp;quot;link&amp;quot;, &amp;quot;align&amp;quot;, &amp;quot;indent&amp;quot;, &amp;quot;list&amp;quot;. Default: All styles. See &lt;a href="#allowed-formats"&gt;more info&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;Note that fn!richTextFieldWithTables() sets this parameter to &amp;quot;All styles&amp;quot; by default on the back-end as this is the most common setting in the older component. If you&amp;#39;d like to parameterize allowed styles, please reach out with a request.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Table Border Style&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;tableBorderStyle&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextFieldWithTables()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines the style of the grid border. Valid values: &amp;quot;STANDARD&amp;quot; (default), &amp;quot;LIGHT&amp;quot;, &amp;quot;NONE&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Allow Images&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;allowImages&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;fn!richTextField()&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if images are allowed. Default: false.&amp;nbsp;See &lt;a href="#image-uploads"&gt;more info&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;Note that fn!richTextFieldWithTables() does not support image upload at this time. If you&amp;#39;d like to allow this behavior, please reach out with a request.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Image Storage Connected System&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;imageStorageConnectedSystem&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Connected System&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The instance of the &lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&amp;nbsp;used to store images from the rich text editor. This is required if allowImages is set to true.&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Uploaded Images&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;uploadedImages&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Map&amp;nbsp;Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;An array of images uploaded during this&amp;nbsp;session with metadata about the image. &amp;quot;wasRemovedFromField&amp;quot; is true when a user uploads an image but then removes it in the same session.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="notes"&gt;Notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Due to the potential large size of the HTML output of this component, do not save this value into a process variable or a node parameter. Instead, use an expression to load and persist the HTML output directly on the user interface.&lt;/li&gt;
&lt;li&gt;Do not use validations&amp;nbsp;to validate the maximum length of the HTML formatted rich text value. Instead, use the parameter maxSize.&lt;/li&gt;
&lt;li&gt;Use validations&amp;nbsp;to validate the maximum length of characters that an end-user can enter in the component. To calculate the number of characters, using the functions fn!len()&amp;nbsp;and fn!striphtml().&lt;/li&gt;
&lt;li&gt;When the rich text field is displayed in a read-only format, set the parameter height&amp;nbsp;to AUTO&amp;nbsp;for optimal results.&lt;/li&gt;
&lt;li&gt;The parameter required&amp;nbsp;doesn&amp;rsquo;t actually validate that the richTextValue is not null. This is a limitation of the component plug-in framework. Use section-level or form-level validations to validate the requiredness of the richTextValue.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="data_storage"&gt;Data Storage&lt;/h2&gt;
&lt;h3&gt;Database Column Type Options&lt;/h3&gt;
&lt;p&gt;There are two options for storing the HTML output of this component in your database; the considerations of which are listed below.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;VARCHAR column type, or equivalent&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;LONGTEXT column type, or equivalent&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Max Size&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Limits the maximum size of the HTML output to 4,000 characters (varies by database)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The maximum size of the HTML output can be as great as 50,000 characters, which is large enough to essentially be considered no limit to a user&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Persistence&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Designers can pass this output and the CDT with this field into process variables&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;It is strongly &lt;strong&gt;recommended to only use this option if you will be writing and reading from the database directly from SAIL interfaces&lt;/strong&gt;; never pass data of this column type into process variables&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Support&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;This is a standard database column type which can be exported, modified, and migrated easily&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;This is not a standard database column type, which could lead to difficulties when trying to export, modify, or migrate&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Querying&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Searching and sorting against this column type is performant (see Querying below for more information)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Searching and sorting against this column type is not performant, and might not be supported depending on your database&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="querying"&gt;Querying Against The Rich Text Data&lt;/h3&gt;
&lt;p&gt;For the use case of searching or sorting against the rich text data, it is recommended to separately create a column in your CDT to store the raw text. &amp;nbsp;The raw text column should be the same type and size of the HTML column. Whenever searching or sorting against the rich text data, search or sort against this column, not the HTML column.&lt;/p&gt;
&lt;p&gt;To populate the raw text column, there are two options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Using the&amp;nbsp;fn!striphtml() function in Appian. This is best used when&amp;nbsp;the size of your data is small, or when the contents of the rich text editor never hits a process variable.&lt;/li&gt;
&lt;li&gt;Using database triggers. This is best used when it&amp;#39;s important to avoid increasing the&amp;nbsp;memory&amp;nbsp;consumption of the process engines, such as when the rich text editor contents are large and passed through process.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To create database triggers to update this field on every INSERT or UPDATE to the database table, follow the instructions below for accomplishing this in MariaDB. For other databases, use the same design, just adjust to match your database&amp;rsquo;s syntax.&lt;/p&gt;
&lt;p&gt;Replace [RAWTEXT_COL] with the name of your raw text column, [HTML_COL] with the name of your html column, and [TABLE_NAME] with the name of your table.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="sql"&gt;-- Create a function to strip html tags given a string

DELIMITER &amp;amp;&amp;amp;

CREATE FUNCTION `strip_tags`($str text) RETURNS text
BEGIN
   DECLARE $start, $end INT DEFAULT 1;
   LOOP
       SET $start = LOCATE(&amp;quot;&amp;lt;&amp;quot;, $str, $start);
       IF (!$start) THEN RETURN $str; END IF;
       SET $end = LOCATE(&amp;quot;&amp;gt;&amp;quot;, $str, $start);
       IF (!$end) THEN SET $end = $start; END IF;
       SET $str = INSERT($str, $start, $end - $start + 1, &amp;quot;&amp;quot;);
       SET $str = REPLACE($str, &amp;quot;&amp;#160;&amp;quot;, &amp;quot; &amp;quot;);
   END LOOP;
END&amp;amp;&amp;amp;

DELIMITER ;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="sql"&gt;-- Create triggers to execute strip_tags() on the html column with every insert or update, and store the raw text

DELIMITER &amp;amp;&amp;amp;

CREATE TRIGGER `store_raw_input_insert`
BEFORE INSERT ON `[TABLE_NAME]`
FOR EACH ROW BEGIN
    SET NEW.`[RAWTEXT_COL]` = strip_tags(NEW.`[HTML_COL]`);
END&amp;amp;&amp;amp;

CREATE TRIGGER `store_raw_input_update`
BEFORE UPDATE ON `[TABLE_NAME]`
FOR EACH ROW BEGIN
    SET NEW.`[RAWTEXT_COL]` = strip_tags(NEW.`[HTML_COL]`);
END&amp;amp;&amp;amp;

DELIMITER ;&lt;/pre&gt;&lt;/p&gt;
&lt;h3 id="emails"&gt;Sending Emails&lt;/h3&gt;
&lt;p&gt;For the use case of sending formatted emails created by end users, a designer must consider the maximum size of the HTML output as well as the expected email volume.&lt;/p&gt;
&lt;p&gt;When sending emails with the Send Email node, the &amp;nbsp;HTML output is loaded and cached in the process execution engine as a string. &amp;nbsp;Over time, the cached values accumulate in memory and can lead to memory resource issues.&lt;/p&gt;
&lt;p&gt;It is recommended to perform non functional testing by sending representative emails at the expected email volume for at least 3 days to measure and evaluate the impacts on the system memory usage and ensure a scalable application in production.&lt;/p&gt;
&lt;p&gt;To configure in process, in the Send Email node, either pass the HTML output as an expression to the ad-hoc message body, or pass the HTML output as an input parameter to the HTML template message body.&lt;/p&gt;
&lt;h2 id="allowed_formats"&gt;Allowed Formats&lt;/h2&gt;
&lt;p&gt;Only applicable for &lt;code&gt;fn!richtextfield&lt;/code&gt;. This parameter to the function fn!richTextField()&amp;nbsp;allows the designer to configure which formatting options are available to the end users when entering rich text into the field such as &amp;ldquo;bold&amp;rdquo;, &amp;ldquo;italic&amp;rdquo;, &amp;ldquo;list&amp;rdquo;, etc.&lt;/p&gt;
&lt;h4 id="configuring"&gt;Configuring this Parameter&lt;/h4&gt;
&lt;p&gt;For consistency and ease of development/maintenance across the platform, the allowed formats should be stored in a constant and used in all instances of the rich text editor.&lt;/p&gt;
&lt;h4 id="modifying"&gt;Modifying Allowed Formats&lt;/h4&gt;
&lt;p&gt;Allowed format options should never be removed after users have already entered data in this field in a production setting (outside of special circumstances), since this means previously-entered text would not be backwards compatible with the updated component configuration. &amp;nbsp;For example, if a user had formatted using a numbered list, and &amp;ldquo;list&amp;rdquo; was removed as an allowed format, then all numbered lists that were previously saved would render incorrectly in the updated component configuration.&lt;/p&gt;
&lt;p&gt;If you do need to remove some allowed formats after users have already entered text in a production setting, it is recommended to pass the previously allowed formats to the component whenever it is rendered as read-only. &amp;nbsp;For example, picture a comment thread that supported &amp;ldquo;list&amp;rdquo; for a while, then removed &amp;ldquo;list&amp;rdquo; format. The read-only fields, displaying previously-entered comments, could still support &amp;ldquo;list&amp;rdquo; while the editable field for new comments would no longer support &amp;ldquo;list&amp;rdquo;. &amp;nbsp;However, this gets more complicated when editing of previously-entered data is considered (e.g. editing an existing comment).&lt;/p&gt;
&lt;h2 id="image_uploads"&gt;Image Uploads&lt;/h2&gt;
&lt;p&gt;Only applicable for &lt;code&gt;fn!richTextField&lt;/code&gt;. To enable image uploads, you must do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install the&amp;nbsp;&lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Create a knowledge center and folder to store uploaded documents and note the new folder&amp;#39;s UUID&lt;/li&gt;
&lt;li&gt;Create a new connected system object which leverages the&amp;nbsp;&lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Enter the folder&amp;#39;s UUID and the user context to use when uploading images&lt;/li&gt;
&lt;li&gt;Create a new Connected System constant which points to the new Connected System object in your application&lt;/li&gt;
&lt;li&gt;In your interface where you use&amp;nbsp;fn!richTextField(), set allowImages&amp;nbsp;to true and imageStorageConnectedSystem&amp;nbsp;to the constant created in the previous step&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note: only the URL to the uploaded image, not the image content itself, is stored in the generated HTML&amp;nbsp;from&amp;nbsp;fn!richTextField().&amp;nbsp; This means that if you use the generated HTML outside of Appian (e.g., in an email), the image will not display unless the outside viewer is already logged into Appian.&lt;/p&gt;
&lt;h2 id="migrate_components"&gt;Migrate Components&lt;/h2&gt;
&lt;p&gt;If you have not yet used either component, you can use whichever one suits your needs best. However, be mindful that it is non-trivial to migrate between fn!richTextField and fn!richTextFieldWithTables and the latter will likely receive more enhancements over time, as the underlying library which renders it is kept up-to-date more.&lt;/p&gt;
&lt;p&gt;The fn!richTextField component relied on non-standard HTML attributes to provide formatting, specifically indentation and nested list formatting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Indentation: fn!richTextField&amp;nbsp;uses the HTML class &amp;quot;ql-indent-N&amp;quot; (where N is the indentation level) for both line indents and for nested lists.&amp;nbsp;fn!richTextFieldWithTables uses the HTML standard style=&amp;#39;margin-left: Npx&amp;#39; for line indents and nested list tags for nested lists (e.g. &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Bullet&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Nested Bullet&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;). This means that if you were using fn!richTextField and saved end-user formatted indentation or nested lists, fn!richTextFieldWithTables will not recognize these specific formats when rendering and will drop the indentation and nested lists.&lt;/li&gt;
&lt;li&gt;Paragraphs: fn!richTextField relies on &amp;lt;div&amp;gt; tags to separate paragraphs, while fn!richTextFieldWithTables relies on &amp;lt;p&amp;gt; tags. This means that passing end-user formatting text from fn!richTextField to fn!richTextFieldWithTables will drop all paragraphs and carriage returns.&lt;/li&gt;
&lt;li&gt;Font Color:&amp;nbsp;fn!richTextField&amp;nbsp;relies on&amp;nbsp;&amp;lt;span&amp;gt;&amp;nbsp;tags with a&amp;nbsp;style attribute for font color (e.g. &amp;lt;span style=&amp;#39;color: rgb(153, 51, 255);&amp;#39;&amp;gt;), while&amp;nbsp;fn!richTextFieldWithTables&amp;nbsp;relies on&amp;nbsp;&amp;lt;font&amp;gt;&amp;nbsp;tags with a color attribute (e.g. &amp;lt;font color=&amp;#39;#9c00ff&amp;#39;&amp;gt;). This means that font colors will get dropped if you directly&amp;nbsp;pass end-user formatting text from&amp;nbsp;fn!richTextField&amp;nbsp;to&amp;nbsp;fn!richTextFieldWithTables.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;#39;d like to migrate end-user formatting text to fn!richTextFieldWithTables, you can write an expression which updates the non-standard indentation attributes and div tags to be recognized by the new component. However this may be more involved for nested lists which will require a more complicated update than just find and replace.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item><item><title>End-User Rich Text Editor Component</title><link>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component/revision/4</link><pubDate>Thu, 26 Oct 2023 18:55:27 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:3db951cf-ae18-4eb3-ade0-88ff9f63dc35</guid><dc:creator>joel.larin</dc:creator><comments>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component#comments</comments><description>Revision 4 posted to Guide by joel.larin on 10/26/2023 6:55:27 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;p&gt;This component is not part of the Appian base product. It is a component plugin managed by Appian Professional Services and it can be downloaded on the &lt;a href="/b/appmarket/posts/rich-text-editor"&gt;Appian AppMarket&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please see the &lt;a href="/w/guide/3321/rich-text-editor-component-troubleshooting-guide"&gt;Component Plug-in Troubleshooting Guide&lt;/a&gt;&amp;nbsp;if you have any issues.&amp;nbsp; If you have further questions please email &lt;a href="mailto:richtext-componentpluginsupport@appian.com"&gt;richtext-componentpluginsupport@appian.com&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="Plugin Components"&gt;Plugin Components&lt;/h2&gt;
&lt;p&gt;As of version 1.5.3, this plugin includes two (2) components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fn!richTextField()&lt;/code&gt; - This is the plugin&amp;rsquo;s original component.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fn!richTextFieldWithTables()&lt;/code&gt; - This component is new as of version 1.5.3.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Refer to the&amp;nbsp;chart below to understand what formatting each component supports.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Component&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Text Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Table Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Image Uploads&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fn!richTextField()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fn!richTextFieldWithTables()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All information in this guide applies to both components, unless stated that it only applies to one of the components.&lt;/p&gt;
&lt;h3&gt;Why are there 2 components?&lt;/h3&gt;
&lt;p&gt;In order to provide table support, we needed to switch to a new underlying library that supports tables. This new library generates HTML that is different from the previous library. To prevent refactoring and unintended behavior for those using the plugin currently, we opted to keep the existing component as is If you want to migrate to the new component, refer to the &lt;a href="#migrate"&gt;How to migrate to fn!richTextFieldWithTables&lt;/a&gt; section below.&lt;/p&gt;
&lt;p&gt;Also, the new component, fn!richTextFieldWithTables(), strictly uses standard HTML attributes for all formats, which should simplify complexities with passing the output HTML to downstream systems, such as email or document generation.&lt;/p&gt;
&lt;h2 id="parameters"&gt;Parameters&lt;/h2&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Keyword&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Applicable Component(s)&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Label&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;label&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text to display as the field label.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Label Position&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;labelPosition&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text to determine where the label appears. Valid values include&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;ABOVE&amp;quot; (default) Displays the label above the component.&lt;/li&gt;
&lt;li&gt;&amp;quot;ADJACENT&amp;quot; Displays the label to the left of the component.&lt;/li&gt;
&lt;li&gt;&amp;quot;COLLAPSED&amp;quot; Hides the label. The label will still be read by screen readers.&lt;/li&gt;
&lt;li&gt;&amp;quot;JUSTIFIED&amp;quot; Aligns the label alongside the component starting at the edge of the page.&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text displayed below the field&amp;#39;s value.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Help Tooltip&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;helpTooltip&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Displays a help icon with the specified text as a tooltip. The tooltip displays a maximum of 500 characters. The help icon does not show when the label position is &amp;quot;COLLAPSED&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Required&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;required&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Shows or hides the asterisk indicating if the component is required but does not enforce requiredness. To enforce requiredness, use the parameter &amp;quot;validations&amp;quot;. To enforce requiredness only upon submission, use section or form-level validations.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Disabled&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;disabled&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if the user is prevented from changing the value. Default: false.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Validations&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;validations&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Validation errors to be displayed below the field when the value is not null.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Height&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;height&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines the field height. Valid values include &amp;quot;SHORT&amp;quot;, &amp;quot;MEDIUM&amp;quot; (default), and &amp;quot;TALL&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Show When&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;showWhen&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines whether the component is displayed on the interface. When set to false, the component is hidden and is not evaluated. Default: true.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rich Text Value&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;richTextValue&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Rich text to display in the field.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rich Text Save Into&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;richTextSaveInto&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Save Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;One or more variables that are updated with the richText value when the user changes it. Use a!save() to save a modified or alternative value to a variable.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Read Only&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;readOnly&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if the field should display as not editable. Default: false.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Max Size&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;maxSize&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Number (Integer)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Maximum size of the HTML formatted rich text data (not number of characters). Default: 10000.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Placeholder&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;placeholder&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text to display in the field when it is empty. Does not show if the field is read only.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Enable Progress Bar&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;enableProgressBar&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Whether to show the progress bar of what percent of rich text data users have entered. Default: true.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Allowed Formats&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;allowedFormats&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines which format styles are allowed. Note: these must be set on page load and cannot change. Valid values: &amp;quot;header&amp;quot;, &amp;quot;size&amp;quot;, &amp;quot;bold&amp;quot;, &amp;quot;italic&amp;quot;, &amp;quot;underline&amp;quot;, &amp;quot;strike&amp;quot;, &amp;quot;color&amp;quot;, &amp;quot;background&amp;quot;, &amp;quot;link&amp;quot;, &amp;quot;align&amp;quot;, &amp;quot;indent&amp;quot;, &amp;quot;list&amp;quot;. Default: All styles. See &lt;a href="#allowed-formats"&gt;more info&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;Note that fn!richTextFieldWithTables() sets this parameter to &amp;quot;All styles&amp;quot; by default on the back-end as this is the most common setting in the older component. If you&amp;#39;d like to parameterize allowed styles, please reach out with a request.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Table Border Style&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;tableBorderStyle&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextFieldWithTables()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines the style of the grid border. Valid values: &amp;quot;STANDARD&amp;quot; (default), &amp;quot;LIGHT&amp;quot;, &amp;quot;NONE&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Allow Images&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;allowImages&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;fn!richTextField()&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if images are allowed. Default: false.&amp;nbsp;See &lt;a href="#image-uploads"&gt;more info&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;Note that fn!richTextFieldWithTables() does not support image upload at this time. If you&amp;#39;d like to allow this behavior, please reach out with a request.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Image Storage Connected System&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;imageStorageConnectedSystem&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Connected System&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The instance of the &lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&amp;nbsp;used to store images from the rich text editor. This is required if allowImages is set to true.&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Uploaded Images&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;uploadedImages&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Map&amp;nbsp;Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;An array of images uploaded during this&amp;nbsp;session with metadata about the image. &amp;quot;wasRemovedFromField&amp;quot; is true when a user uploads an image but then removes it in the same session.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="notes"&gt;Notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Due to the potential large size of the HTML output of this component, do not save this value into a process variable or a node parameter. Instead, use an expression to load and persist the HTML output directly on the user interface.&lt;/li&gt;
&lt;li&gt;Do not use validations&amp;nbsp;to validate the maximum length of the HTML formatted rich text value. Instead, use the parameter maxSize.&lt;/li&gt;
&lt;li&gt;Use validations&amp;nbsp;to validate the maximum length of characters that an end-user can enter in the component. To calculate the number of characters, using the functions fn!len()&amp;nbsp;and fn!striphtml().&lt;/li&gt;
&lt;li&gt;When the rich text field is displayed in a read-only format, set the parameter height&amp;nbsp;to AUTO&amp;nbsp;for optimal results.&lt;/li&gt;
&lt;li&gt;The parameter required&amp;nbsp;doesn&amp;rsquo;t actually validate that the richTextValue is not null. This is a limitation of the component plug-in framework. Use section-level or form-level validations to validate the requiredness of the richTextValue.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="data_storage"&gt;Data Storage&lt;/h2&gt;
&lt;h3&gt;Database Column Type Options&lt;/h3&gt;
&lt;p&gt;There are two options for storing the HTML output of this component in your database; the considerations of which are listed below.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;VARCHAR column type, or equivalent&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;LONGTEXT column type, or equivalent&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Max Size&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Limits the maximum size of the HTML output to 4,000 characters (varies by database)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The maximum size of the HTML output can be as great as 50,000 characters, which is large enough to essentially be considered no limit to a user&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Persistence&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Designers can pass this output and the CDT with this field into process variables&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;It is strongly &lt;strong&gt;recommended to only use this option if you will be writing and reading from the database directly from SAIL interfaces&lt;/strong&gt;; never pass data of this column type into process variables&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Support&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;This is a standard database column type which can be exported, modified, and migrated easily&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;This is not a standard database column type, which could lead to difficulties when trying to export, modify, or migrate&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Querying&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Searching and sorting against this column type is performant (see Querying below for more information)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Searching and sorting against this column type is not performant, and might not be supported depending on your database&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="querying"&gt;Querying Against The Rich Text Data&lt;/h3&gt;
&lt;p&gt;For the use case of searching or sorting against the rich text data, it is recommended to separately create a column in your CDT to store the raw text. &amp;nbsp;The raw text column should be the same type and size of the HTML column. Whenever searching or sorting against the rich text data, search or sort against this column, not the HTML column.&lt;/p&gt;
&lt;p&gt;To populate the raw text column, there are two options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Using the&amp;nbsp;fn!striphtml() function in Appian. This is best used when&amp;nbsp;the size of your data is small, or when the contents of the rich text editor never hits a process variable.&lt;/li&gt;
&lt;li&gt;Using database triggers. This is best used when it&amp;#39;s important to avoid increasing the&amp;nbsp;memory&amp;nbsp;consumption of the process engines, such as when the rich text editor contents are large and passed through process.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To create database triggers to update this field on every INSERT or UPDATE to the database table, follow the instructions below for accomplishing this in MariaDB. For other databases, use the same design, just adjust to match your database&amp;rsquo;s syntax.&lt;/p&gt;
&lt;p&gt;Replace [RAWTEXT_COL] with the name of your raw text column, [HTML_COL] with the name of your html column, and [TABLE_NAME] with the name of your table.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="sql"&gt;-- Create a function to strip html tags given a string

DELIMITER &amp;amp;&amp;amp;

CREATE FUNCTION `strip_tags`($str text) RETURNS text
BEGIN
   DECLARE $start, $end INT DEFAULT 1;
   LOOP
       SET $start = LOCATE(&amp;quot;&amp;lt;&amp;quot;, $str, $start);
       IF (!$start) THEN RETURN $str; END IF;
       SET $end = LOCATE(&amp;quot;&amp;gt;&amp;quot;, $str, $start);
       IF (!$end) THEN SET $end = $start; END IF;
       SET $str = INSERT($str, $start, $end - $start + 1, &amp;quot;&amp;quot;);
       SET $str = REPLACE($str, &amp;quot;&amp;#160;&amp;quot;, &amp;quot; &amp;quot;);
   END LOOP;
END&amp;amp;&amp;amp;

DELIMITER ;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="sql"&gt;-- Create triggers to execute strip_tags() on the html column with every insert or update, and store the raw text

DELIMITER &amp;amp;&amp;amp;

CREATE TRIGGER `store_raw_input_insert`
BEFORE INSERT ON `[TABLE_NAME]`
FOR EACH ROW BEGIN
    SET NEW.`[RAWTEXT_COL]` = strip_tags(NEW.`[HTML_COL]`);
END&amp;amp;&amp;amp;

CREATE TRIGGER `store_raw_input_update`
BEFORE UPDATE ON `[TABLE_NAME]`
FOR EACH ROW BEGIN
    SET NEW.`[RAWTEXT_COL]` = strip_tags(NEW.`[HTML_COL]`);
END&amp;amp;&amp;amp;

DELIMITER ;&lt;/pre&gt;&lt;/p&gt;
&lt;h3 id="emails"&gt;Sending Emails&lt;/h3&gt;
&lt;p&gt;For the use case of sending formatted emails created by end users, a designer must consider the maximum size of the HTML output as well as the expected email volume.&lt;/p&gt;
&lt;p&gt;When sending emails with the Send Email node, the &amp;nbsp;HTML output is loaded and cached in the process execution engine as a string. &amp;nbsp;Over time, the cached values accumulate in memory and can lead to memory resource issues.&lt;/p&gt;
&lt;p&gt;It is recommended to perform non functional testing by sending representative emails at the expected email volume for at least 3 days to measure and evaluate the impacts on the system memory usage and ensure a scalable application in production.&lt;/p&gt;
&lt;p&gt;To configure in process, in the Send Email node, either pass the HTML output as an expression to the ad-hoc message body, or pass the HTML output as an input parameter to the HTML template message body.&lt;/p&gt;
&lt;h2 id="allowed_formats"&gt;Allowed Formats&lt;/h2&gt;
&lt;p&gt;Only applicable for &lt;code&gt;fn!richtextfield&lt;/code&gt;. This parameter to the function fn!richTextField()&amp;nbsp;allows the designer to configure which formatting options are available to the end users when entering rich text into the field such as &amp;ldquo;bold&amp;rdquo;, &amp;ldquo;italic&amp;rdquo;, &amp;ldquo;list&amp;rdquo;, etc.&lt;/p&gt;
&lt;h4 id="configuring"&gt;Configuring this Parameter&lt;/h4&gt;
&lt;p&gt;For consistency and ease of development/maintenance across the platform, the allowed formats should be stored in a constant and used in all instances of the rich text editor.&lt;/p&gt;
&lt;h4 id="modifying"&gt;Modifying Allowed Formats&lt;/h4&gt;
&lt;p&gt;Allowed format options should never be removed after users have already entered data in this field in a production setting (outside of special circumstances), since this means previously-entered text would not be backwards compatible with the updated component configuration. &amp;nbsp;For example, if a user had formatted using a numbered list, and &amp;ldquo;list&amp;rdquo; was removed as an allowed format, then all numbered lists that were previously saved would render incorrectly in the updated component configuration.&lt;/p&gt;
&lt;p&gt;If you do need to remove some allowed formats after users have already entered text in a production setting, it is recommended to pass the previously allowed formats to the component whenever it is rendered as read-only. &amp;nbsp;For example, picture a comment thread that supported &amp;ldquo;list&amp;rdquo; for a while, then removed &amp;ldquo;list&amp;rdquo; format. The read-only fields, displaying previously-entered comments, could still support &amp;ldquo;list&amp;rdquo; while the editable field for new comments would no longer support &amp;ldquo;list&amp;rdquo;. &amp;nbsp;However, this gets more complicated when editing of previously-entered data is considered (e.g. editing an existing comment).&lt;/p&gt;
&lt;h2 id="image_uploads"&gt;Image Uploads&lt;/h2&gt;
&lt;p&gt;Only applicable for &lt;code&gt;fn!richTextField&lt;/code&gt;. To enable image uploads, you must do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install the&amp;nbsp;&lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Create a knowledge center and folder to store uploaded documents and note the new folder&amp;#39;s UUID&lt;/li&gt;
&lt;li&gt;Create a new connected system object which leverages the&amp;nbsp;&lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Enter the folder&amp;#39;s UUID and the user context to use when uploading images&lt;/li&gt;
&lt;li&gt;Create a new Connected System constant which points to the new Connected System object in your application&lt;/li&gt;
&lt;li&gt;In your interface where you use&amp;nbsp;fn!richTextField(), set allowImages&amp;nbsp;to true and imageStorageConnectedSystem&amp;nbsp;to the constant created in the previous step&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note: only the URL to the uploaded image, not the image content itself, is stored in the generated HTML&amp;nbsp;from&amp;nbsp;fn!richTextField().&amp;nbsp; This means that if you use the generated HTML outside of Appian (e.g., in an email), the image will not display unless the outside viewer is already logged into Appian.&lt;/p&gt;
&lt;h2 id="how_to_migrate_to_fn!richtextfieldwithtables"&gt;How to migrate to fn!richTextFieldWithTables&lt;/h2&gt;
&lt;p&gt;If you have not yet used either component, you can use whichever one suits your needs best. However, be mindful that it is non-trivial to migrate between fn!richTextField and fn!richTextFieldWithTables and the latter will likely receive more enhancements over time, as the underlying library which renders it is kept up-to-date more.&lt;/p&gt;
&lt;p&gt;The fn!richTextField component relied on non-standard HTML attributes to provide formatting, specifically indentation and nested list formatting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Indentation: fn!richTextField&amp;nbsp;uses the HTML class &amp;quot;ql-indent-N&amp;quot; (where N is the indentation level) for both line indents and for nested lists.&amp;nbsp;fn!richTextFieldWithTables uses the HTML standard style=&amp;#39;margin-left: Npx&amp;#39; for line indents and nested list tags for nested lists (e.g. &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Bullet&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Nested Bullet&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;). This means that if you were using fn!richTextField and saved end-user formatted indentation or nested lists, fn!richTextFieldWithTables will not recognize these specific formats when rendering and will drop the indentation and nested lists.&lt;/li&gt;
&lt;li&gt;Paragraphs: fn!richTextField relies on &amp;lt;div&amp;gt; tags to separate paragraphs, while fn!richTextFieldWithTables relies on &amp;lt;p&amp;gt; tags. This means that passing end-user formatting text from fn!richTextField to fn!richTextFieldWithTables will drop all paragraphs and carriage returns.&lt;/li&gt;
&lt;li&gt;Font Color:&amp;nbsp;fn!richTextField&amp;nbsp;relies on&amp;nbsp;&amp;lt;span&amp;gt;&amp;nbsp;tags with a&amp;nbsp;style attribute for font color (e.g. &amp;lt;span style=&amp;#39;color: rgb(153, 51, 255);&amp;#39;&amp;gt;), while&amp;nbsp;fn!richTextFieldWithTables&amp;nbsp;relies on&amp;nbsp;&amp;lt;font&amp;gt;&amp;nbsp;tags with a color attribute (e.g. &amp;lt;font color=&amp;#39;#9c00ff&amp;#39;&amp;gt;). This means that font colors will get dropped if you directly&amp;nbsp;pass end-user formatting text from&amp;nbsp;fn!richTextField&amp;nbsp;to&amp;nbsp;fn!richTextFieldWithTables.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;#39;d like to migrate end-user formatting text to fn!richTextFieldWithTables, you can write an expression which updates the non-standard indentation attributes and div tags to be recognized by the new component. However this may be more involved for nested lists which will require a more complicated update than just find and replace.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item><item><title>End-User Rich Text Editor Component</title><link>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component/revision/3</link><pubDate>Thu, 26 Oct 2023 18:52:15 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:3db951cf-ae18-4eb3-ade0-88ff9f63dc35</guid><dc:creator>joel.larin</dc:creator><comments>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component#comments</comments><description>Revision 3 posted to Guide by joel.larin on 10/26/2023 6:52:15 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;p&gt;This component is not part of the Appian base product. It is a component plugin managed by Appian Professional Services and it can be downloaded on the &lt;a href="/b/appmarket/posts/rich-text-editor"&gt;Appian AppMarket&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please see the &lt;a href="/w/guide/3321/rich-text-editor-component-troubleshooting-guide"&gt;Component Plug-in Troubleshooting Guide&lt;/a&gt;&amp;nbsp;if you have any issues.&amp;nbsp; If you have further questions please email &lt;a href="mailto:richtext-componentpluginsupport@appian.com"&gt;richtext-componentpluginsupport@appian.com&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="Plugin Components"&gt;Plugin Components&lt;/h2&gt;
&lt;p&gt;As of version 1.5.3, this plugin includes two (2) components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fn!richTextField()&lt;/code&gt; - This is the plugin&amp;rsquo;s original component.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fn!richTextFieldWithTables()&lt;/code&gt; - This component is new as of version 1.5.3.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Refer to the&amp;nbsp;chart below to understand what formatting each component supports.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Component&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Text Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Table Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Image Uploads&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fn!richTextField()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fn!richTextFieldWithTables()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All information in this guide applies to both components, unless stated that it only applies to one of the components.&lt;/p&gt;
&lt;h3&gt;Why are there 2 components?&lt;/h3&gt;
&lt;p&gt;In order to provide table support, we needed to switch to a new underlying library that supports tables. This new library generates HTML that is different from the previous library. To prevent refactoring and unintended behavior for those using the plugin currently, we opted to keep the existing component as is If you want to migrate to the new component, refer to the &lt;a href="#migrate"&gt;How to migrate to fn!richTextFieldWithTables&lt;/a&gt; section below.&lt;/p&gt;
&lt;p&gt;Also, the new component, fn!richTextFieldWithTables(), strictly uses standard HTML attributes for all formats, which should simplify complexities with passing the output HTML to downstream systems, such as email or document generation.&lt;/p&gt;
&lt;h2 id="parameters"&gt;Parameters&lt;/h2&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Keyword&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Applicable Component(s)&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Label&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;label&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text to display as the field label.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Label Position&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;labelPosition&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text to determine where the label appears. Valid values include&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;ABOVE&amp;quot; (default) Displays the label above the component.&lt;/li&gt;
&lt;li&gt;&amp;quot;ADJACENT&amp;quot; Displays the label to the left of the component.&lt;/li&gt;
&lt;li&gt;&amp;quot;COLLAPSED&amp;quot; Hides the label. The label will still be read by screen readers.&lt;/li&gt;
&lt;li&gt;&amp;quot;JUSTIFIED&amp;quot; Aligns the label alongside the component starting at the edge of the page.&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text displayed below the field&amp;#39;s value.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Help Tooltip&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;helpTooltip&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Displays a help icon with the specified text as a tooltip. The tooltip displays a maximum of 500 characters. The help icon does not show when the label position is &amp;quot;COLLAPSED&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Required&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;required&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Shows or hides the asterisk indicating if the component is required but does not enforce requiredness. To enforce requiredness, use the parameter &amp;quot;validations&amp;quot;. To enforce requiredness only upon submission, use section or form-level validations.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Disabled&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;disabled&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if the user is prevented from changing the value. Default: false.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Validations&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;validations&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Validation errors to be displayed below the field when the value is not null.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Height&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;height&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines the field height. Valid values include &amp;quot;SHORT&amp;quot;, &amp;quot;MEDIUM&amp;quot; (default), and &amp;quot;TALL&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Show When&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;showWhen&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines whether the component is displayed on the interface. When set to false, the component is hidden and is not evaluated. Default: true.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rich Text Value&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;richTextValue&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Rich text to display in the field.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rich Text Save Into&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;richTextSaveInto&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Save Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;One or more variables that are updated with the richText value when the user changes it. Use a!save() to save a modified or alternative value to a variable.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Read Only&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;readOnly&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if the field should display as not editable. Default: false.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Max Size&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;maxSize&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Number (Integer)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Maximum size of the HTML formatted rich text data (not number of characters). Default: 10000.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Placeholder&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;placeholder&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text to display in the field when it is empty. Does not show if the field is read only.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Enable Progress Bar&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;enableProgressBar&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Whether to show the progress bar of what percent of rich text data users have entered. Default: true.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Allowed Formats&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;allowedFormats&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines which format styles are allowed. Note: these must be set on page load and cannot change. Valid values: &amp;quot;header&amp;quot;, &amp;quot;size&amp;quot;, &amp;quot;bold&amp;quot;, &amp;quot;italic&amp;quot;, &amp;quot;underline&amp;quot;, &amp;quot;strike&amp;quot;, &amp;quot;color&amp;quot;, &amp;quot;background&amp;quot;, &amp;quot;link&amp;quot;, &amp;quot;align&amp;quot;, &amp;quot;indent&amp;quot;, &amp;quot;list&amp;quot;. Default: All styles. See &lt;a href="#allowed-formats"&gt;more info&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;Note that fn!richTextFieldWithTables() sets this parameter to &amp;quot;All styles&amp;quot; by default on the back-end as this is the most common setting in the older component. If you&amp;#39;d like to parameterize allowed styles, please reach out with a request.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Table Border Style&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;tableBorderStyle&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextFieldWithTables()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines the style of the grid border. Valid values: &amp;quot;STANDARD&amp;quot; (default), &amp;quot;LIGHT&amp;quot;, &amp;quot;NONE&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Allow Images&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;allowImages&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;fn!richTextField()&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if images are allowed. Default: false.&amp;nbsp;See &lt;a href="#image-uploads"&gt;more info&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;Note that fn!richTextFieldWithTables() does not support image upload at this time. If you&amp;#39;d like to allow this behavior, please reach out with a request.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Image Storage Connected System&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;imageStorageConnectedSystem&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Connected System&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The instance of the &lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&amp;nbsp;used to store images from the rich text editor. This is required if allowImages is set to true.&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Uploaded Images&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;uploadedImages&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Map&amp;nbsp;Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;An array of images uploaded during this&amp;nbsp;session with metadata about the image. &amp;quot;wasRemovedFromField&amp;quot; is true when a user uploads an image but then removes it in the same session.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="notes"&gt;Notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Due to the potential large size of the HTML output of this component, do not save this value into a process variable or a node parameter. Instead, use an expression to load and persist the HTML output directly on the user interface.&lt;/li&gt;
&lt;li&gt;Do not use validations&amp;nbsp;to validate the maximum length of the HTML formatted rich text value. Instead, use the parameter maxSize.&lt;/li&gt;
&lt;li&gt;Use validations&amp;nbsp;to validate the maximum length of characters that an end-user can enter in the component. To calculate the number of characters, using the functions fn!len()&amp;nbsp;and fn!striphtml().&lt;/li&gt;
&lt;li&gt;When the rich text field is displayed in a read-only format, set the parameter height&amp;nbsp;to AUTO&amp;nbsp;for optimal results.&lt;/li&gt;
&lt;li&gt;The parameter required&amp;nbsp;doesn&amp;rsquo;t actually validate that the richTextValue is not null. This is a limitation of the component plug-in framework. Use section-level or form-level validations to validate the requiredness of the richTextValue.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="data_storage"&gt;Data Storage&lt;/h2&gt;
&lt;h3&gt;Database Column Type Options&lt;/h3&gt;
&lt;p&gt;There are two options for storing the HTML output of this component in your database; the considerations of which are listed below.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;VARCHAR column type, or equivalent&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;LONGTEXT column type, or equivalent&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Max Size&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Limits the maximum size of the HTML output to 4,000 characters (varies by database)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The maximum size of the HTML output can be as great as 50,000 characters, which is large enough to essentially be considered no limit to a user&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Persistence&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Designers can pass this output and the CDT with this field into process variables&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;It is strongly &lt;strong&gt;recommended to only use this option if you will be writing and reading from the database directly from SAIL interfaces&lt;/strong&gt;; never pass data of this column type into process variables&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Support&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;This is a standard database column type which can be exported, modified, and migrated easily&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;This is not a standard database column type, which could lead to difficulties when trying to export, modify, or migrate&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Querying&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Searching and sorting against this column type is performant (see Querying below for more information)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Searching and sorting against this column type is not performant, and might not be supported depending on your database&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="querying"&gt;Querying Against The Rich Text Data&lt;/h3&gt;
&lt;p&gt;For the use case of searching or sorting against the rich text data, it is recommended to separately create a column in your CDT to store the raw text. &amp;nbsp;The raw text column should be the same type and size of the HTML column. Whenever searching or sorting against the rich text data, search or sort against this column, not the HTML column.&lt;/p&gt;
&lt;p&gt;To populate the raw text column, there are two options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Using the&amp;nbsp;fn!striphtml() function in Appian. This is best used when&amp;nbsp;the size of your data is small, or when the contents of the rich text editor never hits a process variable.&lt;/li&gt;
&lt;li&gt;Using database triggers. This is best used when it&amp;#39;s important to avoid increasing the&amp;nbsp;memory&amp;nbsp;consumption of the process engines, such as when the rich text editor contents are large and passed through process.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To create database triggers to update this field on every INSERT or UPDATE to the database table, follow the instructions below for accomplishing this in MariaDB. For other databases, use the same design, just adjust to match your database&amp;rsquo;s syntax.&lt;/p&gt;
&lt;p&gt;Replace [RAWTEXT_COL] with the name of your raw text column, [HTML_COL] with the name of your html column, and [TABLE_NAME] with the name of your table.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="sql"&gt;-- Create a function to strip html tags given a string

DELIMITER &amp;amp;&amp;amp;

CREATE FUNCTION `strip_tags`($str text) RETURNS text
BEGIN
   DECLARE $start, $end INT DEFAULT 1;
   LOOP
       SET $start = LOCATE(&amp;quot;&amp;lt;&amp;quot;, $str, $start);
       IF (!$start) THEN RETURN $str; END IF;
       SET $end = LOCATE(&amp;quot;&amp;gt;&amp;quot;, $str, $start);
       IF (!$end) THEN SET $end = $start; END IF;
       SET $str = INSERT($str, $start, $end - $start + 1, &amp;quot;&amp;quot;);
       SET $str = REPLACE($str, &amp;quot;&amp;#160;&amp;quot;, &amp;quot; &amp;quot;);
   END LOOP;
END&amp;amp;&amp;amp;

DELIMITER ;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="sql"&gt;-- Create triggers to execute strip_tags() on the html column with every insert or update, and store the raw text

DELIMITER &amp;amp;&amp;amp;

CREATE TRIGGER `store_raw_input_insert`
BEFORE INSERT ON `[TABLE_NAME]`
FOR EACH ROW BEGIN
    SET NEW.`[RAWTEXT_COL]` = strip_tags(NEW.`[HTML_COL]`);
END&amp;amp;&amp;amp;

CREATE TRIGGER `store_raw_input_update`
BEFORE UPDATE ON `[TABLE_NAME]`
FOR EACH ROW BEGIN
    SET NEW.`[RAWTEXT_COL]` = strip_tags(NEW.`[HTML_COL]`);
END&amp;amp;&amp;amp;

DELIMITER ;&lt;/pre&gt;&lt;/p&gt;
&lt;h3 id="emails"&gt;Sending Emails&lt;/h3&gt;
&lt;p&gt;For the use case of sending formatted emails created by end users, a designer must consider the maximum size of the HTML output as well as the expected email volume.&lt;/p&gt;
&lt;p&gt;When sending emails with the Send Email node, the &amp;nbsp;HTML output is loaded and cached in the process execution engine as a string. &amp;nbsp;Over time, the cached values accumulate in memory and can lead to memory resource issues.&lt;/p&gt;
&lt;p&gt;It is recommended to perform non functional testing by sending representative emails at the expected email volume for at least 3 days to measure and evaluate the impacts on the system memory usage and ensure a scalable application in production.&lt;/p&gt;
&lt;p&gt;To configure in process, in the Send Email node, either pass the HTML output as an expression to the ad-hoc message body, or pass the HTML output as an input parameter to the HTML template message body.&lt;/p&gt;
&lt;h2 id="allowed_formats_(only_applicable_for&amp;nbsp;fn!richtextfield)"&gt;Allowed Formats (Only applicable for&amp;nbsp;fn!richTextField)&lt;/h2&gt;
&lt;p&gt;This parameter to the function fn!richTextField()&amp;nbsp;allows the designer to configure which formatting options are available to the end users when entering rich text into the field such as &amp;ldquo;bold&amp;rdquo;, &amp;ldquo;italic&amp;rdquo;, &amp;ldquo;list&amp;rdquo;, etc.&lt;/p&gt;
&lt;h4 id="configuring"&gt;Configuring this Parameter&lt;/h4&gt;
&lt;p&gt;For consistency and ease of development/maintenance across the platform, the allowed formats should be stored in a constant and used in all instances of the rich text editor.&lt;/p&gt;
&lt;h4 id="modifying"&gt;Modifying Allowed Formats&lt;/h4&gt;
&lt;p&gt;Allowed format options should never be removed after users have already entered data in this field in a production setting (outside of special circumstances), since this means previously-entered text would not be backwards compatible with the updated component configuration. &amp;nbsp;For example, if a user had formatted using a numbered list, and &amp;ldquo;list&amp;rdquo; was removed as an allowed format, then all numbered lists that were previously saved would render incorrectly in the updated component configuration.&lt;/p&gt;
&lt;p&gt;If you do need to remove some allowed formats after users have already entered text in a production setting, it is recommended to pass the previously allowed formats to the component whenever it is rendered as read-only. &amp;nbsp;For example, picture a comment thread that supported &amp;ldquo;list&amp;rdquo; for a while, then removed &amp;ldquo;list&amp;rdquo; format. The read-only fields, displaying previously-entered comments, could still support &amp;ldquo;list&amp;rdquo; while the editable field for new comments would no longer support &amp;ldquo;list&amp;rdquo;. &amp;nbsp;However, this gets more complicated when editing of previously-entered data is considered (e.g. editing an existing comment).&lt;/p&gt;
&lt;h2 id="image_uploads_(only_applicable_for_fn!richtextfield)"&gt;Image Uploads (Only applicable for fn!richTextField)&lt;/h2&gt;
&lt;p&gt;To enable image uploads, you must do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install the&amp;nbsp;&lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Create a knowledge center and folder to store uploaded documents and note the new folder&amp;#39;s UUID&lt;/li&gt;
&lt;li&gt;Create a new connected system object which leverages the&amp;nbsp;&lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Enter the folder&amp;#39;s UUID and the user context to use when uploading images&lt;/li&gt;
&lt;li&gt;Create a new Connected System constant which points to the new Connected System object in your application&lt;/li&gt;
&lt;li&gt;In your interface where you use&amp;nbsp;fn!richTextField(), set allowImages&amp;nbsp;to true and imageStorageConnectedSystem&amp;nbsp;to the constant created in the previous step&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note: only the URL to the uploaded image, not the image content itself, is stored in the generated HTML&amp;nbsp;from&amp;nbsp;fn!richTextField().&amp;nbsp; This means that if you use the generated HTML outside of Appian (e.g., in an email), the image will not display unless the outside viewer is already logged into Appian.&lt;/p&gt;
&lt;h2 id="how_to_migrate_to_fn!richtextfieldwithtables"&gt;How to migrate to fn!richTextFieldWithTables&lt;/h2&gt;
&lt;p&gt;If you have not yet used either component, you can use whichever one suits your needs best. However, be mindful that it is non-trivial to migrate between fn!richTextField and fn!richTextFieldWithTables and the latter will likely receive more enhancements over time, as the underlying library which renders it is kept up-to-date more.&lt;/p&gt;
&lt;p&gt;The fn!richTextField component relied on non-standard HTML attributes to provide formatting, specifically indentation and nested list formatting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Indentation: fn!richTextField&amp;nbsp;uses the HTML class &amp;quot;ql-indent-N&amp;quot; (where N is the indentation level) for both line indents and for nested lists.&amp;nbsp;fn!richTextFieldWithTables uses the HTML standard style=&amp;#39;margin-left: Npx&amp;#39; for line indents and nested list tags for nested lists (e.g. &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Bullet&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Nested Bullet&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;). This means that if you were using fn!richTextField and saved end-user formatted indentation or nested lists, fn!richTextFieldWithTables will not recognize these specific formats when rendering and will drop the indentation and nested lists.&lt;/li&gt;
&lt;li&gt;Paragraphs: fn!richTextField relies on &amp;lt;div&amp;gt; tags to separate paragraphs, while fn!richTextFieldWithTables relies on &amp;lt;p&amp;gt; tags. This means that passing end-user formatting text from fn!richTextField to fn!richTextFieldWithTables will drop all paragraphs and carriage returns.&lt;/li&gt;
&lt;li&gt;Font Color:&amp;nbsp;fn!richTextField&amp;nbsp;relies on&amp;nbsp;&amp;lt;span&amp;gt;&amp;nbsp;tags with a&amp;nbsp;style attribute for font color (e.g. &amp;lt;span style=&amp;#39;color: rgb(153, 51, 255);&amp;#39;&amp;gt;), while&amp;nbsp;fn!richTextFieldWithTables&amp;nbsp;relies on&amp;nbsp;&amp;lt;font&amp;gt;&amp;nbsp;tags with a color attribute (e.g. &amp;lt;font color=&amp;#39;#9c00ff&amp;#39;&amp;gt;). This means that font colors will get dropped if you directly&amp;nbsp;pass end-user formatting text from&amp;nbsp;fn!richTextField&amp;nbsp;to&amp;nbsp;fn!richTextFieldWithTables.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;#39;d like to migrate end-user formatting text to fn!richTextFieldWithTables, you can write an expression which updates the non-standard indentation attributes and div tags to be recognized by the new component. However this may be more involved for nested lists which will require a more complicated update than just find and replace.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item><item><title>End-User Rich Text Editor Component</title><link>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component/revision/2</link><pubDate>Thu, 26 Oct 2023 18:50:53 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:3db951cf-ae18-4eb3-ade0-88ff9f63dc35</guid><dc:creator>joel.larin</dc:creator><comments>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component#comments</comments><description>Revision 2 posted to Guide by joel.larin on 10/26/2023 6:50:53 PM&lt;br /&gt;
&lt;div style="margin:8px 16% 8px 8%;"&gt;
&lt;p&gt;This component is not part of the Appian base product. It is a component plugin managed by Appian Professional Services and it can be downloaded on the &lt;a href="/b/appmarket/posts/rich-text-editor"&gt;Appian AppMarket&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please see the &lt;a href="/w/guide/3321/rich-text-editor-component-troubleshooting-guide"&gt;Component Plug-in Troubleshooting Guide&lt;/a&gt;&amp;nbsp;if you have any issues.&amp;nbsp; If you have further questions please email &lt;a href="mailto:richtext-componentpluginsupport@appian.com"&gt;richtext-componentpluginsupport@appian.com&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="what_components_does_this_plugin_include?"&gt;What components does this plugin include?&lt;/h2&gt;
&lt;p&gt;As of version 1.5.3, this plugin includes two (2) components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fn!richTextField()&lt;/code&gt; - This is the plugin&amp;rsquo;s original component.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fn!richTextFieldWithTables()&lt;/code&gt; - This component is new as of version 1.5.3.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Refer to the&amp;nbsp;chart below to understand what formatting each component supports.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Component&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Text Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Table Formatting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Image Uploads&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fn!richTextField()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fn!richTextFieldWithTables()&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="emoticon" data-url="https://community.appian.com/cfs-file/__key/system/emoji/2705.svg" title="White check mark"&gt;&amp;#x2705;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All information in this guide applies to both components, unless stated that it only applies to one of the components.&lt;/p&gt;
&lt;h3&gt;Why are there 2 components?&lt;/h3&gt;
&lt;p&gt;In order to provide table support, we needed to switch to a new underlying library that supports tables. This new library generates HTML that is different from the previous library. To prevent refactoring and unintended behavior for those using the plugin currently, we opted to keep the existing component as is If you want to migrate to the new component, refer to the &lt;a href="#migrate"&gt;How to migrate to fn!richTextFieldWithTables&lt;/a&gt; section below.&lt;/p&gt;
&lt;p&gt;Also, the new component, fn!richTextFieldWithTables(), strictly uses standard HTML attributes for all formats, which should simplify complexities with passing the output HTML to downstream systems, such as email or document generation.&lt;/p&gt;
&lt;h2 id="parameters"&gt;Parameters&lt;/h2&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Keyword&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Applicable Component(s)&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Label&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;label&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text to display as the field label.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Label Position&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;labelPosition&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text to determine where the label appears. Valid values include&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;ABOVE&amp;quot; (default) Displays the label above the component.&lt;/li&gt;
&lt;li&gt;&amp;quot;ADJACENT&amp;quot; Displays the label to the left of the component.&lt;/li&gt;
&lt;li&gt;&amp;quot;COLLAPSED&amp;quot; Hides the label. The label will still be read by screen readers.&lt;/li&gt;
&lt;li&gt;&amp;quot;JUSTIFIED&amp;quot; Aligns the label alongside the component starting at the edge of the page.&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;instructions&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Optional text displayed below the field&amp;#39;s value.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Help Tooltip&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;helpTooltip&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Displays a help icon with the specified text as a tooltip. The tooltip displays a maximum of 500 characters. The help icon does not show when the label position is &amp;quot;COLLAPSED&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Required&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;required&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Shows or hides the asterisk indicating if the component is required but does not enforce requiredness. To enforce requiredness, use the parameter &amp;quot;validations&amp;quot;. To enforce requiredness only upon submission, use section or form-level validations.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Disabled&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;disabled&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if the user is prevented from changing the value. Default: false.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Validations&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;validations&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Validation errors to be displayed below the field when the value is not null.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Height&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;height&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines the field height. Valid values include &amp;quot;SHORT&amp;quot;, &amp;quot;MEDIUM&amp;quot; (default), and &amp;quot;TALL&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Show When&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;showWhen&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines whether the component is displayed on the interface. When set to false, the component is hidden and is not evaluated. Default: true.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rich Text Value&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;richTextValue&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Rich text to display in the field.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Rich Text Save Into&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;richTextSaveInto&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Save Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;One or more variables that are updated with the richText value when the user changes it. Use a!save() to save a modified or alternative value to a variable.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Read Only&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;readOnly&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if the field should display as not editable. Default: false.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Max Size&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;maxSize&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Number (Integer)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Maximum size of the HTML formatted rich text data (not number of characters). Default: 10000.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Placeholder&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;placeholder&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Both&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text to display in the field when it is empty. Does not show if the field is read only.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Enable Progress Bar&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;enableProgressBar&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Boolean&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Whether to show the progress bar of what percent of rich text data users have entered. Default: true.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Allowed Formats&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;allowedFormats&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines which format styles are allowed. Note: these must be set on page load and cannot change. Valid values: &amp;quot;header&amp;quot;, &amp;quot;size&amp;quot;, &amp;quot;bold&amp;quot;, &amp;quot;italic&amp;quot;, &amp;quot;underline&amp;quot;, &amp;quot;strike&amp;quot;, &amp;quot;color&amp;quot;, &amp;quot;background&amp;quot;, &amp;quot;link&amp;quot;, &amp;quot;align&amp;quot;, &amp;quot;indent&amp;quot;, &amp;quot;list&amp;quot;. Default: All styles. See &lt;a href="#allowed-formats"&gt;more info&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;Note that fn!richTextFieldWithTables() sets this parameter to &amp;quot;All styles&amp;quot; by default on the back-end as this is the most common setting in the older component. If you&amp;#39;d like to parameterize allowed styles, please reach out with a request.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Table Border Style&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;tableBorderStyle&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Text&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextFieldWithTables()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines the style of the grid border. Valid values: &amp;quot;STANDARD&amp;quot; (default), &amp;quot;LIGHT&amp;quot;, &amp;quot;NONE&amp;quot;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Allow Images&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;allowImages&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;fn!richTextField()&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Determines if images are allowed. Default: false.&amp;nbsp;See &lt;a href="#image-uploads"&gt;more info&lt;/a&gt; below.&lt;/p&gt;
&lt;p&gt;Note that fn!richTextFieldWithTables() does not support image upload at this time. If you&amp;#39;d like to allow this behavior, please reach out with a request.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Image Storage Connected System&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;imageStorageConnectedSystem&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Connected System&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The instance of the &lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&amp;nbsp;used to store images from the rich text editor. This is required if allowImages is set to true.&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Uploaded Images&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;uploadedImages&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Map&amp;nbsp;Array&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;fn!richTextField()&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;An array of images uploaded during this&amp;nbsp;session with metadata about the image. &amp;quot;wasRemovedFromField&amp;quot; is true when a user uploads an image but then removes it in the same session.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="notes"&gt;Notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Due to the potential large size of the HTML output of this component, do not save this value into a process variable or a node parameter. Instead, use an expression to load and persist the HTML output directly on the user interface.&lt;/li&gt;
&lt;li&gt;Do not use validations&amp;nbsp;to validate the maximum length of the HTML formatted rich text value. Instead, use the parameter maxSize.&lt;/li&gt;
&lt;li&gt;Use validations&amp;nbsp;to validate the maximum length of characters that an end-user can enter in the component. To calculate the number of characters, using the functions fn!len()&amp;nbsp;and fn!striphtml().&lt;/li&gt;
&lt;li&gt;When the rich text field is displayed in a read-only format, set the parameter height&amp;nbsp;to AUTO&amp;nbsp;for optimal results.&lt;/li&gt;
&lt;li&gt;The parameter required&amp;nbsp;doesn&amp;rsquo;t actually validate that the richTextValue is not null. This is a limitation of the component plug-in framework. Use section-level or form-level validations to validate the requiredness of the richTextValue.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="data_storage"&gt;Data Storage&lt;/h2&gt;
&lt;h3&gt;Database Column Type Options&lt;/h3&gt;
&lt;p&gt;There are two options for storing the HTML output of this component in your database; the considerations of which are listed below.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;VARCHAR column type, or equivalent&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;strong&gt;LONGTEXT column type, or equivalent&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Max Size&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Limits the maximum size of the HTML output to 4,000 characters (varies by database)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;The maximum size of the HTML output can be as great as 50,000 characters, which is large enough to essentially be considered no limit to a user&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Persistence&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Designers can pass this output and the CDT with this field into process variables&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;It is strongly &lt;strong&gt;recommended to only use this option if you will be writing and reading from the database directly from SAIL interfaces&lt;/strong&gt;; never pass data of this column type into process variables&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Support&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;This is a standard database column type which can be exported, modified, and migrated easily&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;This is not a standard database column type, which could lead to difficulties when trying to export, modify, or migrate&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;Querying&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Searching and sorting against this column type is performant (see Querying below for more information)&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Searching and sorting against this column type is not performant, and might not be supported depending on your database&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="querying"&gt;Querying Against The Rich Text Data&lt;/h3&gt;
&lt;p&gt;For the use case of searching or sorting against the rich text data, it is recommended to separately create a column in your CDT to store the raw text. &amp;nbsp;The raw text column should be the same type and size of the HTML column. Whenever searching or sorting against the rich text data, search or sort against this column, not the HTML column.&lt;/p&gt;
&lt;p&gt;To populate the raw text column, there are two options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Using the&amp;nbsp;fn!striphtml() function in Appian. This is best used when&amp;nbsp;the size of your data is small, or when the contents of the rich text editor never hits a process variable.&lt;/li&gt;
&lt;li&gt;Using database triggers. This is best used when it&amp;#39;s important to avoid increasing the&amp;nbsp;memory&amp;nbsp;consumption of the process engines, such as when the rich text editor contents are large and passed through process.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To create database triggers to update this field on every INSERT or UPDATE to the database table, follow the instructions below for accomplishing this in MariaDB. For other databases, use the same design, just adjust to match your database&amp;rsquo;s syntax.&lt;/p&gt;
&lt;p&gt;Replace [RAWTEXT_COL] with the name of your raw text column, [HTML_COL] with the name of your html column, and [TABLE_NAME] with the name of your table.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="sql"&gt;-- Create a function to strip html tags given a string

DELIMITER &amp;amp;&amp;amp;

CREATE FUNCTION `strip_tags`($str text) RETURNS text
BEGIN
   DECLARE $start, $end INT DEFAULT 1;
   LOOP
       SET $start = LOCATE(&amp;quot;&amp;lt;&amp;quot;, $str, $start);
       IF (!$start) THEN RETURN $str; END IF;
       SET $end = LOCATE(&amp;quot;&amp;gt;&amp;quot;, $str, $start);
       IF (!$end) THEN SET $end = $start; END IF;
       SET $str = INSERT($str, $start, $end - $start + 1, &amp;quot;&amp;quot;);
       SET $str = REPLACE($str, &amp;quot;&amp;#160;&amp;quot;, &amp;quot; &amp;quot;);
   END LOOP;
END&amp;amp;&amp;amp;

DELIMITER ;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="sql"&gt;-- Create triggers to execute strip_tags() on the html column with every insert or update, and store the raw text

DELIMITER &amp;amp;&amp;amp;

CREATE TRIGGER `store_raw_input_insert`
BEFORE INSERT ON `[TABLE_NAME]`
FOR EACH ROW BEGIN
    SET NEW.`[RAWTEXT_COL]` = strip_tags(NEW.`[HTML_COL]`);
END&amp;amp;&amp;amp;

CREATE TRIGGER `store_raw_input_update`
BEFORE UPDATE ON `[TABLE_NAME]`
FOR EACH ROW BEGIN
    SET NEW.`[RAWTEXT_COL]` = strip_tags(NEW.`[HTML_COL]`);
END&amp;amp;&amp;amp;

DELIMITER ;&lt;/pre&gt;&lt;/p&gt;
&lt;h3 id="emails"&gt;Sending Emails&lt;/h3&gt;
&lt;p&gt;For the use case of sending formatted emails created by end users, a designer must consider the maximum size of the HTML output as well as the expected email volume.&lt;/p&gt;
&lt;p&gt;When sending emails with the Send Email node, the &amp;nbsp;HTML output is loaded and cached in the process execution engine as a string. &amp;nbsp;Over time, the cached values accumulate in memory and can lead to memory resource issues.&lt;/p&gt;
&lt;p&gt;It is recommended to perform non functional testing by sending representative emails at the expected email volume for at least 3 days to measure and evaluate the impacts on the system memory usage and ensure a scalable application in production.&lt;/p&gt;
&lt;p&gt;To configure in process, in the Send Email node, either pass the HTML output as an expression to the ad-hoc message body, or pass the HTML output as an input parameter to the HTML template message body.&lt;/p&gt;
&lt;h2 id="allowed_formats_(only_applicable_for&amp;nbsp;fn!richtextfield)"&gt;Allowed Formats (Only applicable for&amp;nbsp;fn!richTextField)&lt;/h2&gt;
&lt;p&gt;This parameter to the function fn!richTextField()&amp;nbsp;allows the designer to configure which formatting options are available to the end users when entering rich text into the field such as &amp;ldquo;bold&amp;rdquo;, &amp;ldquo;italic&amp;rdquo;, &amp;ldquo;list&amp;rdquo;, etc.&lt;/p&gt;
&lt;h4 id="configuring"&gt;Configuring this Parameter&lt;/h4&gt;
&lt;p&gt;For consistency and ease of development/maintenance across the platform, the allowed formats should be stored in a constant and used in all instances of the rich text editor.&lt;/p&gt;
&lt;h4 id="modifying"&gt;Modifying Allowed Formats&lt;/h4&gt;
&lt;p&gt;Allowed format options should never be removed after users have already entered data in this field in a production setting (outside of special circumstances), since this means previously-entered text would not be backwards compatible with the updated component configuration. &amp;nbsp;For example, if a user had formatted using a numbered list, and &amp;ldquo;list&amp;rdquo; was removed as an allowed format, then all numbered lists that were previously saved would render incorrectly in the updated component configuration.&lt;/p&gt;
&lt;p&gt;If you do need to remove some allowed formats after users have already entered text in a production setting, it is recommended to pass the previously allowed formats to the component whenever it is rendered as read-only. &amp;nbsp;For example, picture a comment thread that supported &amp;ldquo;list&amp;rdquo; for a while, then removed &amp;ldquo;list&amp;rdquo; format. The read-only fields, displaying previously-entered comments, could still support &amp;ldquo;list&amp;rdquo; while the editable field for new comments would no longer support &amp;ldquo;list&amp;rdquo;. &amp;nbsp;However, this gets more complicated when editing of previously-entered data is considered (e.g. editing an existing comment).&lt;/p&gt;
&lt;h2 id="image_uploads_(only_applicable_for_fn!richtextfield)"&gt;Image Uploads (Only applicable for fn!richTextField)&lt;/h2&gt;
&lt;p&gt;To enable image uploads, you must do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install the&amp;nbsp;&lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Create a knowledge center and folder to store uploaded documents and note the new folder&amp;#39;s UUID&lt;/li&gt;
&lt;li&gt;Create a new connected system object which leverages the&amp;nbsp;&lt;a title="Rich Text Editor Image Upload Connected System on the App Market" href="/b/appmarket/posts/rich-text-editor-image-upload-connected-system" rel="noopener noreferrer" target="_blank"&gt;Rich Text Editor Image Upload Connected System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Enter the folder&amp;#39;s UUID and the user context to use when uploading images&lt;/li&gt;
&lt;li&gt;Create a new Connected System constant which points to the new Connected System object in your application&lt;/li&gt;
&lt;li&gt;In your interface where you use&amp;nbsp;fn!richTextField(), set allowImages&amp;nbsp;to true and imageStorageConnectedSystem&amp;nbsp;to the constant created in the previous step&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note: only the URL to the uploaded image, not the image content itself, is stored in the generated HTML&amp;nbsp;from&amp;nbsp;fn!richTextField().&amp;nbsp; This means that if you use the generated HTML outside of Appian (e.g., in an email), the image will not display unless the outside viewer is already logged into Appian.&lt;/p&gt;
&lt;h2 id="how_to_migrate_to_fn!richtextfieldwithtables"&gt;How to migrate to fn!richTextFieldWithTables&lt;/h2&gt;
&lt;p&gt;If you have not yet used either component, you can use whichever one suits your needs best. However, be mindful that it is non-trivial to migrate between fn!richTextField and fn!richTextFieldWithTables and the latter will likely receive more enhancements over time, as the underlying library which renders it is kept up-to-date more.&lt;/p&gt;
&lt;p&gt;The fn!richTextField component relied on non-standard HTML attributes to provide formatting, specifically indentation and nested list formatting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Indentation: fn!richTextField&amp;nbsp;uses the HTML class &amp;quot;ql-indent-N&amp;quot; (where N is the indentation level) for both line indents and for nested lists.&amp;nbsp;fn!richTextFieldWithTables uses the HTML standard style=&amp;#39;margin-left: Npx&amp;#39; for line indents and nested list tags for nested lists (e.g. &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Bullet&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Nested Bullet&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;). This means that if you were using fn!richTextField and saved end-user formatted indentation or nested lists, fn!richTextFieldWithTables will not recognize these specific formats when rendering and will drop the indentation and nested lists.&lt;/li&gt;
&lt;li&gt;Paragraphs: fn!richTextField relies on &amp;lt;div&amp;gt; tags to separate paragraphs, while fn!richTextFieldWithTables relies on &amp;lt;p&amp;gt; tags. This means that passing end-user formatting text from fn!richTextField to fn!richTextFieldWithTables will drop all paragraphs and carriage returns.&lt;/li&gt;
&lt;li&gt;Font Color:&amp;nbsp;fn!richTextField&amp;nbsp;relies on&amp;nbsp;&amp;lt;span&amp;gt;&amp;nbsp;tags with a&amp;nbsp;style attribute for font color (e.g. &amp;lt;span style=&amp;#39;color: rgb(153, 51, 255);&amp;#39;&amp;gt;), while&amp;nbsp;fn!richTextFieldWithTables&amp;nbsp;relies on&amp;nbsp;&amp;lt;font&amp;gt;&amp;nbsp;tags with a color attribute (e.g. &amp;lt;font color=&amp;quot;#9c00ff&amp;quot;&amp;gt;). This means that font colors will get dropped if you directly&amp;nbsp;pass end-user formatting text from&amp;nbsp;fn!richTextField&amp;nbsp;to&amp;nbsp;fn!richTextFieldWithTables.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;#39;d like to migrate end-user formatting text to fn!richTextFieldWithTables, you can write an expression which updates the non-standard indentation attributes and div tags to be recognized by the new component. However this may be more involved for nested lists which will require a more complicated update than just find and replace.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item><item><title>End-User Rich Text Editor Component</title><link>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component/revision/1</link><pubDate>Thu, 07 Sep 2023 16:06:29 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:3db951cf-ae18-4eb3-ade0-88ff9f63dc35</guid><dc:creator>joel.larin</dc:creator><comments>https://community.appian.com/success/w/guide/3320/end-user-rich-text-editor-component#comments</comments><description>Revision 1 posted to Guide by joel.larin on 9/7/2023 4:06:29 PM&lt;br /&gt;
&lt;p&gt;dfsd&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item></channel></rss>