{"id":4993,"date":"2022-09-27T16:04:09","date_gmt":"2022-09-27T14:04:09","guid":{"rendered":"https:\/\/gpmfactory.com\/?p=4993"},"modified":"2022-09-28T13:56:11","modified_gmt":"2022-09-28T11:56:11","slug":"form-builder-tool-for-oracle-apex","status":"publish","type":"post","link":"https:\/\/gpmfactory.com\/index.php\/2022\/09\/27\/form-builder-tool-for-oracle-apex\/","title":{"rendered":"Form Builder Tool for Oracle APEX"},"content":{"rendered":"\n<p>Last revision: 27 sept 2022<\/p>\n\n\n\n<p>The purpose of this project is to give to <em>business users<\/em> a <em>no-code<\/em> tool for generating forms.<\/p>\n\n\n\n<p>This project called <em>GFM Builder<\/em> is at prototype stage. It relies mainly on API wich are not documented, even if there are widely used in APEX export App files (before 22.1 version). This approach is clearly no supported, so this tool must be considered as a playground and used in a sandbox only. <\/p>\n\n\n\n<p>The <a href=\"https:\/\/github.com\/patrickmonaco\/GFM-Builder\">application GFM Builder is available from Github<\/a>. <\/p>\n\n\n\n<p>Target audience<\/p>\n\n\n\n<p>GFM Builder addresses mainly companies intranet requirements but citizen portals needs as well.<\/p>\n\n\n\n<p>A common use case is to trigger an administrative process based on informations provided by an employee or a citizen. ie: renewal contrat, ordering internal good, signaling problem in a district, etc.<\/p>\n\n\n\n<p>This tool will leverage, in a next version, the new approval task process which can be embeded in a page.<\/p>\n\n\n\n<p>Once these limitations given, let&rsquo;s see the functionnal aspects.<\/p>\n\n\n\n\n\n<h2 class=\"wp-block-heading\">High level design<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Persona and Role definitions<\/h3>\n\n\n\n<p>GFM Builder is dedicated to <em>business users<\/em>. <br>That means that <strong>we haven&rsquo;t to declare users as APEX developers.<\/strong> Users will be able to author and publish forms without any knowledge of Oracle APEX.  <\/p>\n\n\n\n<p>We consider the following roles:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Regular APEX Roles<ul><li>APEX Workspace Administrator<\/li><li>APEX Developer<\/li><li>APEX End User<\/li><\/ul><\/li><li>Application Roles brougth with the tool<ul><li>GFM Builder Administrator  <\/li><li>GFM Builder Developer<\/li><li>Final user ( means an APEX End User or an anonymous user)<\/li><\/ul><\/li><\/ul>\n\n\n\n<p>The GFM Builder Role is implemented as a <em>Contributor<\/em> Role in the APEX simplifed ACL model.<\/p>\n\n\n\n<p>The GFM Builder Administrator role is maped on <em>Admin<\/em> Role<\/p>\n\n\n\n<p>In order to build a form, the <strong>GFM Builder Developer<\/strong> role must be granted to an APEX End user.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Generated Form Samples<\/h4>\n\n\n\n<p>Below are sample of forms generated with GFM Builder. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"559\" src=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-1-1024x559.png\" alt=\"\" class=\"wp-image-4999\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-1-1024x559.png 1024w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-1-300x164.png 300w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-1-768x420.png 768w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-1.png 1197w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>In this case, we choosed to display fields grouped by sections (GENERAL, RH, ..)<\/figcaption><\/figure>\n\n\n\n<p>A form can embed a detail array for multivalued informations. In this case, it&rsquo;s a historic of entries.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"549\" src=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-2-1024x549.png\" alt=\"\" class=\"wp-image-5000\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-2-1024x549.png 1024w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-2-300x161.png 300w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-2-768x412.png 768w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-2.png 1220w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Using a detail array inside a form<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Apps Store<\/h3>\n\n\n\n<p>A sample catalog application (GFM Store) is provided as an exemple.  Each time a form is tagged as <em>Published<\/em>, it will be displayed in this catalog.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"562\" src=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-5-1024x562.png\" alt=\"\" class=\"wp-image-5004\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-5-1024x562.png 1024w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-5-300x165.png 300w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-5-768x422.png 768w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-5.png 1204w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Data collecting<\/h3>\n\n\n\n<p>All data are stored in a unique table GFM_DATA.<\/p>\n\n\n\n<p>The data can be displayed by GFM Builder Admin and Forms owners. <\/p>\n\n\n\n<p>Final users will not be able to display data. We suppose that a process will send  data to the user, by any feedback way, email for instance. It&rsquo;s not in the scope of the project.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-14.png\" alt=\"\" class=\"wp-image-5025\" width=\"840\" height=\"423\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-14.png 977w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-14-300x151.png 300w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-14-768x387.png 768w\" sizes=\"auto, (max-width: 840px) 100vw, 840px\" \/><figcaption>Simplified report displaying data collected through a form<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Form design<\/h2>\n\n\n\n<p>The design process is mainly declarative. It&rsquo;s a matter of designing the items which constiture the form.<\/p>\n\n\n\n<p>Instead of creating a data set then building the form (in in standard way), we create there both the data set and the form in the same user interface.<\/p>\n\n\n\n<p>A form is comprised of items. An items is either a simple attribute (like text Field, date) or a multivalued attribute. This second kind of items is implemented as an Interactive Grid. This technical choice provides more flexibility during fields filling.<\/p>\n\n\n\n<p>Items must be pick up from a predifined collection of components which are: <\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Basic items <\/strong><br>Text,Number, Date, email, Inline List (List of values declared inline) <br><\/li><li><strong>Predifined List of values<\/strong><br>These lists are created in a dedicated page called &lsquo;Components&rsquo;, either by an administrator or the user himself.<br><\/li><li><strong>Grids <\/strong><br>It&rsquo;a an existing form wich is declared as been usable as a grid inside an other form. ie: Historic of positions, list of contracts, etc.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"528\" src=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-17-1024x528.png\" alt=\"\" class=\"wp-image-5041\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-17-1024x528.png 1024w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-17-300x155.png 300w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-17-768x396.png 768w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-17.png 1223w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Reusing existing form definitions<\/h4>\n\n\n\n<p>It&rsquo;s possible to copy all items of an existing form into an other form. <\/p>\n\n\n\n<p><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Inline declaration<br>value and label are given the same value.<\/li><li>Specification declaration in component module<\/li><li>External declaration <br>per declaring the name of the external table or view.<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Sections<\/h3>\n\n\n\n<p>A section is a logical group of items which will be rendered as either a tab or a paragraph, depending a preference.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"577\" src=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-6-1024x577.png\" alt=\"\" class=\"wp-image-5008\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-6-1024x577.png 1024w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-6-300x169.png 300w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-6-768x433.png 768w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-6.png 1184w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Fields are spreaded in sub-regions if there are two sections at least referenced by items. Navigation is provided by tabs, either with regular tabs or tabs and a first overall tab.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"575\" height=\"156\" src=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-16.png\" alt=\"\" class=\"wp-image-5031\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-16.png 575w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-16-300x81.png 300w\" sizes=\"auto, (max-width: 575px) 100vw, 575px\" \/><figcaption>Example of navigation with preference $REGION_SECTION =DISPLAY_SELECTOR<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">User Interface<\/h2>\n\n\n\n<p>The user interface is very classic with very minimum usage of Drag n Drop. This is a weakness if we compare with other no-code tools on the market. But on an other hand, the tool priviliges flexibility in rendering, that is not the case with \u00ab\u00a0Google Forms\u00a0\u00bb, for instance.<br>At the minimum, it&rsquo;s possible by Drag&rsquo;n Drop to re-order displayed items. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"568\" src=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-3-1024x568.png\" alt=\"\" class=\"wp-image-5001\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-3-1024x568.png 1024w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-3-300x166.png 300w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-3-768x426.png 768w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-3.png 1202w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"566\" src=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-4-1024x566.png\" alt=\"\" class=\"wp-image-5002\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-4-1024x566.png 1024w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-4-300x166.png 300w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-4-768x425.png 768w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-4.png 1199w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Rendering<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"565\" src=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-7-1024x565.png\" alt=\"\" class=\"wp-image-5010\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-7-1024x565.png 1024w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-7-300x165.png 300w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-7-768x423.png 768w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-7.png 1199w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Very Minimal Decoration<\/figcaption><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-8-1024x547.png\" alt=\"This image has an empty alt attribute; its file name is image-8-1024x547.png\"\/><figcaption>Minimal decoration<\/figcaption><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Generation options<\/h4>\n\n\n\n<p>a set of preferences drives the generation process. We have reused APEX terminology in order to be in line with the regular Developer Interface.<\/p>\n\n\n\n<p>For the moment, there are a few preferences:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>$ITEM_TEMPLATE (FLOATING, ABOVE, BESIDE)<\/li><li>$ITEM_HELP (Y,N)<\/li><li>$PAGE_TEMPLATE (MINIMAL_NO_NAVIGATION)<\/li><li>$REGION_SECTION (STANDARD, TABS_CONTAINER,DISPLAY_SELECTOR<\/li><\/ul>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"571\" src=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-9-1024x571.png\" alt=\"\" class=\"wp-image-5013\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-9-1024x571.png 1024w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-9-300x167.png 300w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-9-768x429.png 768w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-9.png 1199w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Below are some variants depending on \u00ab\u00a0Navigation between sections\u00a0\u00bb preference<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-10-1024x582.png\" alt=\"\" class=\"wp-image-5015\" width=\"840\" height=\"477\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-10-1024x582.png 1024w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-10-300x171.png 300w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-10-768x437.png 768w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-10.png 1191w\" sizes=\"auto, (max-width: 840px) 100vw, 840px\" \/><figcaption>Section in a standard rendering<\/figcaption><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"563\" src=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-11-1024x563.png\" alt=\"\" class=\"wp-image-5017\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-11-1024x563.png 1024w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-11-300x165.png 300w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-11-768x422.png 768w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-11.png 1189w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Sections rendered with Tabs<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">List of Values<\/h3>\n\n\n\n<p>The creation of list of values is done by creating a new component with a LIST type. Then, a second page is used for entering the values.  <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"499\" src=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-13-1024x499.png\" alt=\"\" class=\"wp-image-5024\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-13-1024x499.png 1024w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-13-300x146.png 300w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-13-768x374.png 768w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-13.png 1203w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>List of components (The predefined lists are tagged List)<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"435\" src=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-15-1024x435.png\" alt=\"\" class=\"wp-image-5027\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-15-1024x435.png 1024w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-15-300x128.png 300w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-15-768x327.png 768w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-15.png 1122w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Entering the values for a List of Values component.<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Conditionnal displaying<\/h3>\n\n\n\n<p>An item can be displayed or not depending the value of an other item. If the driving item is based upon a List, the list of values will be proposed for choosing a specific value which will trigger displaying of slave item. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Technical design<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Data Model<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"914\" height=\"582\" src=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/Form-Builder.png\" alt=\"\" class=\"wp-image-5043\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/Form-Builder.png 914w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/Form-Builder-300x191.png 300w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/Form-Builder-768x489.png 768w\" sizes=\"auto, (max-width: 914px) 100vw, 914px\" \/><\/figure>\n\n\n\n<p>Implementation<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>A data model for the form\/Sections\/Items, preferences and components<\/li><li>A main data store (GFM_DATA), designed in the same way that the apex_collection table. There are 50 items at maximum.<\/li><li>As many views there are forms. Each view is given an <em>instead<\/em> trigger.<\/li><li>For each form, a specific view maps columns on given columns of the gfm_data table.   <\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Generating process<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>Re-generate specific view<\/li><li>Re-generate specific Trigger<\/li><li>Generate the corresponding Page in a target Application. <\/li><\/ul>\n\n\n\n<p>The target application must belong to an arbitrary Application Group called &lsquo;GFM Apps&rsquo; and must be choosed in the setup page. The &lsquo;GFM Apps&rsquo; is automatically created during installation of GFM Store application.<\/p>\n\n\n\n<p>List of Values<\/p>\n\n\n\n<p>All the data are stored in a dedicated table: GFM_LOV.<\/p>\n\n\n\n<p>Objects are named in Oracle database with <strong>GFM_<\/strong> prefix<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Lifecycle<\/h3>\n\n\n\n<p>If an item is renamed, there are no impact in the mapping<\/p>\n\n\n\n<p>If an item is dropped, the mapped column in the GFM_DATA table is preserved, and no other item won&rsquo;t be mapped on it. The reason it that we want avoid to display old data with the new item.<br>An option menu allow to reset data and column mapping.  <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Security<\/h3>\n\n\n\n<p>Before form are deployed, they must by set \u00ab\u00a0Published\u00a0\u00bb state.<\/p>\n\n\n\n<p>A form can be accessible either in a anonymous mode (no need to be authenticated)  or in an authenticated mode.<\/p>\n\n\n\n<p>because GFM Builder relies intensively on internal APEX API, some important flags have been set:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"438\" height=\"141\" src=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-12.png\" alt=\"\" class=\"wp-image-5021\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-12.png 438w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2022\/09\/image-12-300x97.png 300w\" sizes=\"auto, (max-width: 438px) 100vw, 438px\" \/><\/figure>\n\n\n\n<p>A compagnon Application called &lsquo;GFM Store&rsquo; is provided as an example of an Apps store. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Appendices<\/h2>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Non documented APIs used in this project<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>wwv_flow_api.create_page<\/li><li>wwv_flow_api.create_page_plug<\/li><li>wwv_flow_api.create_page_button<\/li><li>wwv_flow_api.create_page_branch<\/li><li>wwv_flow_api.create_page_item<\/li><li>wwv_flow_api.create_page_process<\/li><li>wwv_flow_api.create_page_da_event<\/li><li>wwv_flow_api.create_page_da_action<\/li><li>wwv_flow_api.create_region_column<\/li><li>wwv_flow_api.create_interactive_grid<\/li><li>wwv_flow_api.create_ig_report_column<\/li><\/ul>\n\n\n\n<p>APEX export API have been rewritten in 22.1 (wwv_flow_imp). That means that the previous API are not garanteed to be working in the future, and therefore neither is this tool GFM Builder.<\/p>\n\n\n\n<p>Plugins used in the project<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/blog.foex.at\/drag-drop-in-apex-made-easy\/\">FOEX Drag n Drop <\/a><\/li><li><a href=\"https:\/\/fos.world\/ords\/f?p=10000:1080:::NO:::\">FOEX Redirect and Message Actions<\/a><\/li><\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Last revision: 27 sept 2022 The purpose of this project is to give to business users a no-code tool for generating forms. This project&#8230;<\/p>\n","protected":false},"author":1,"featured_media":5052,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"ppma_author":[150],"class_list":["post-4993","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-non-classe"],"authors":[{"term_id":150,"user_id":1,"is_guest":0,"slug":"admin8700","display_name":"Patrick","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/209d5ed69b74d288390621ab4c1d3773?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/posts\/4993","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/comments?post=4993"}],"version-history":[{"count":39,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/posts\/4993\/revisions"}],"predecessor-version":[{"id":5054,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/posts\/4993\/revisions\/5054"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/media\/5052"}],"wp:attachment":[{"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/media?parent=4993"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/categories?post=4993"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/tags?post=4993"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/ppma_author?post=4993"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}