UNPKG

@rxap/form-system

Version:

This package provides a set of directives, decorators, mixins, and validators to simplify the creation of dynamic forms in Angular applications. It offers features such as automatic control creation, data source integration, component customization, and h

711 lines (579 loc) 26.4 kB
<!doctype html> <html class="no-js" lang=""> <head> <meta charset="utf-8"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <title>angular-form-system</title> <meta name="description" content=""> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="icon" type="image/x-icon" href="../images/favicon.ico"> <link rel="stylesheet" href="../styles/style.css"> <link rel="stylesheet" href="../styles/dark.css"> </head> <body> <script> // Blocking script to avoid flickering dark mode // Dark mode toggle button var useDark = window.matchMedia('(prefers-color-scheme: dark)'); var darkModeState = useDark.matches; var $darkModeToggleSwitchers = document.querySelectorAll('.dark-mode-switch input'); var $darkModeToggles = document.querySelectorAll('.dark-mode-switch'); var darkModeStateLocal = localStorage.getItem('compodoc_darkmode-state'); function checkToggle(check) { for (var i = 0; i < $darkModeToggleSwitchers.length; i++) { $darkModeToggleSwitchers[i].checked = check; } } function toggleDarkMode(state) { if (window.localStorage) { localStorage.setItem('compodoc_darkmode-state', state); } checkToggle(state); const hasClass = document.body.classList.contains('dark'); if (state) { for (var i = 0; i < $darkModeToggles.length; i++) { $darkModeToggles[i].classList.add('dark'); } if (!hasClass) { document.body.classList.add('dark'); } } else { for (var i = 0; i < $darkModeToggles.length; i++) { $darkModeToggles[i].classList.remove('dark'); } if (hasClass) { document.body.classList.remove('dark'); } } } useDark.addEventListener('change', function (evt) { toggleDarkMode(evt.matches); }); if (darkModeStateLocal) { darkModeState = darkModeStateLocal === 'true'; } toggleDarkMode(darkModeState); </script> <div class="navbar navbar-default navbar-fixed-top d-md-none p-0"> <div class="d-flex"> <a href="../" class="navbar-brand">angular-form-system</a> <button type="button" class="btn btn-default btn-menu ion-ios-menu" id="btn-menu"></button> </div> </div> <div class="xs-menu menu" id="mobile-menu"> <div id="book-search-input" role="search"><input type="text" placeholder="Type to search"></div> <compodoc-menu></compodoc-menu> </div> <div class="container-fluid main"> <div class="row main"> <div class="d-none d-md-block menu"> <compodoc-menu mode="normal"></compodoc-menu> </div> <!-- START CONTENT --> <div class="content class"> <div class="content-data"> <ol class="breadcrumb"> <li class="breadcrumb-item">Classes</li> <li class="breadcrumb-item" >ExtractOptionsDataSourceMixin</li> </ol> <ul class="nav nav-tabs" role="tablist"> <li class="nav-item"> <a href="#info" class="nav-link" class="nav-link active" role="tab" id="info-tab" data-bs-toggle="tab" data-link="info">Info</a> </li> <li class="nav-item"> <a href="#source" class="nav-link" role="tab" id="source-tab" data-bs-toggle="tab" data-link="source">Source</a> </li> </ul> <div class="tab-content"> <div class="tab-pane fade active in" id="info"> <p class="comment"> <h3>File</h3> </p> <p class="comment"> <code>src/lib/mixins/extract-options-data-source.mixin.ts</code> </p> <section data-compodoc="block-index"> <h3 id="index">Index</h3> <table class="table table-sm table-bordered index-table"> <tbody> <tr> <td class="col-md-4"> <h6><b>Properties</b></h6> </td> </tr> <tr> <td class="col-md-4"> <ul class="index-list"> <li> <span class="modifier">Protected</span> <span class="modifier">Optional</span> <a href="#dataSource" >dataSource</a> </li> <li> <span class="modifier">Protected</span> <span class="modifier">Readonly</span> <a href="#dataSourceLoader" >dataSourceLoader</a> </li> <li> <span class="modifier">Protected</span> <span class="modifier">Readonly</span> <a href="#injector" >injector</a> </li> <li> <span class="modifier">Protected</span> <span class="modifier">Optional</span> <a href="#metadata" >metadata</a> </li> <li> <span class="modifier">Protected</span> <span class="modifier">Optional</span> <a href="#settings" >settings</a> </li> <li> <span class="modifier">Protected</span> <span class="modifier">Optional</span> <a href="#useDataSourceValue" >useDataSourceValue</a> </li> <li> <span class="modifier">Protected</span> <span class="modifier">Optional</span> <a href="#viewer" >viewer</a> </li> </ul> </td> </tr> <tr> <td class="col-md-4"> <h6><b>Methods</b></h6> </td> </tr> <tr> <td class="col-md-4"> <ul class="index-list"> <li> <span class="modifier">Protected</span> <a href="#extractOptionsDatasource" >extractOptionsDatasource</a> </li> </ul> </td> </tr> </tbody> </table> </section> <section data-compodoc="block-properties"> <h3 id="inputs"> Properties </h3> <table class="table table-sm table-bordered"> <tbody> <tr> <td class="col-md-4"> <a name="dataSource"></a> <span class="name"> <span class="modifier">Protected</span> <span class="modifier">Optional</span> <span ><b>dataSource</b></span> <a href="#dataSource"><span class="icon ion-ios-link"></span></a> </span> </td> </tr> <tr> <td class="col-md-4"> <i>Type : </i> <code>BaseDataSource&lt;ControlOptions | Record&gt;</code> </td> </tr> <tr> <td class="col-md-4"> <div class="io-line">Defined in <a href="" data-line="70" class="link-to-prism">src/lib/mixins/extract-options-data-source.mixin.ts:70</a></div> </td> </tr> </tbody> </table> <table class="table table-sm table-bordered"> <tbody> <tr> <td class="col-md-4"> <a name="dataSourceLoader"></a> <span class="name"> <span class="modifier">Protected</span> <span class="modifier">Readonly</span> <span ><b>dataSourceLoader</b></span> <a href="#dataSourceLoader"><span class="icon ion-ios-link"></span></a> </span> </td> </tr> <tr> <td class="col-md-4"> <i>Type : </i> <code>DataSourceLoader</code> </td> </tr> <tr> <td class="col-md-4"> <div class="io-line">Defined in <a href="" data-line="64" class="link-to-prism">src/lib/mixins/extract-options-data-source.mixin.ts:64</a></div> </td> </tr> </tbody> </table> <table class="table table-sm table-bordered"> <tbody> <tr> <td class="col-md-4"> <a name="injector"></a> <span class="name"> <span class="modifier">Protected</span> <span class="modifier">Readonly</span> <span ><b>injector</b></span> <a href="#injector"><span class="icon ion-ios-link"></span></a> </span> </td> </tr> <tr> <td class="col-md-4"> <i>Type : </i> <code>Injector</code> </td> </tr> <tr> <td class="col-md-4"> <div class="io-line">Defined in <a href="" data-line="72" class="link-to-prism">src/lib/mixins/extract-options-data-source.mixin.ts:72</a></div> </td> </tr> </tbody> </table> <table class="table table-sm table-bordered"> <tbody> <tr> <td class="col-md-4"> <a name="metadata"></a> <span class="name"> <span class="modifier">Protected</span> <span class="modifier">Optional</span> <span ><b>metadata</b></span> <a href="#metadata"><span class="icon ion-ios-link"></span></a> </span> </td> </tr> <tr> <td class="col-md-4"> <i>Type : </i> <code>BaseDataSourceMetadata</code> </td> </tr> <tr> <td class="col-md-4"> <div class="io-line">Defined in <a href="" data-line="66" class="link-to-prism">src/lib/mixins/extract-options-data-source.mixin.ts:66</a></div> </td> </tr> </tbody> </table> <table class="table table-sm table-bordered"> <tbody> <tr> <td class="col-md-4"> <a name="settings"></a> <span class="name"> <span class="modifier">Protected</span> <span class="modifier">Optional</span> <span ><b>settings</b></span> <a href="#settings"><span class="icon ion-ios-link"></span></a> </span> </td> </tr> <tr> <td class="col-md-4"> <i>Type : </i> <code><a href="../miscellaneous/typealiases.html#UseOptionsDataSourceSettings" target="_self" >UseOptionsDataSourceSettings&lt;any&gt;</a></code> </td> </tr> <tr> <td class="col-md-4"> <div class="io-line">Defined in <a href="" data-line="62" class="link-to-prism">src/lib/mixins/extract-options-data-source.mixin.ts:62</a></div> </td> </tr> </tbody> </table> <table class="table table-sm table-bordered"> <tbody> <tr> <td class="col-md-4"> <a name="useDataSourceValue"></a> <span class="name"> <span class="modifier">Protected</span> <span class="modifier">Optional</span> <span ><b>useDataSourceValue</b></span> <a href="#useDataSourceValue"><span class="icon ion-ios-link"></span></a> </span> </td> </tr> <tr> <td class="col-md-4"> <i>Type : </i> <code><a href="../interfaces/UseDataSourceValue.html" target="_self" >UseDataSourceValue&lt;ControlOptions | Record&gt;</a></code> </td> </tr> <tr> <td class="col-md-4"> <div class="io-line">Defined in <a href="" data-line="74" class="link-to-prism">src/lib/mixins/extract-options-data-source.mixin.ts:74</a></div> </td> </tr> </tbody> </table> <table class="table table-sm table-bordered"> <tbody> <tr> <td class="col-md-4"> <a name="viewer"></a> <span class="name"> <span class="modifier">Protected</span> <span class="modifier">Optional</span> <span ><b>viewer</b></span> <a href="#viewer"><span class="icon ion-ios-link"></span></a> </span> </td> </tr> <tr> <td class="col-md-4"> <i>Type : </i> <code>BaseDataSourceViewer</code> </td> </tr> <tr> <td class="col-md-4"> <div class="io-line">Defined in <a href="" data-line="68" class="link-to-prism">src/lib/mixins/extract-options-data-source.mixin.ts:68</a></div> </td> </tr> </tbody> </table> </section> <section data-compodoc="block-methods"> <h3 id="methods"> Methods </h3> <table class="table table-sm table-bordered"> <tbody> <tr> <td class="col-md-4"> <a name="extractOptionsDatasource"></a> <span class="name"> <span class="modifier">Protected</span> <span ><b>extractOptionsDatasource</b></span> <a href="#extractOptionsDatasource"><span class="icon ion-ios-link"></span></a> </span> </td> </tr> <tr> <td class="col-md-4"> <span class="modifier-icon icon ion-ios-reset"></span> <code>extractOptionsDatasource(control?: AbstractControl)</code> </td> </tr> <tr> <td class="col-md-4"> <div class="io-line">Defined in <a href="" data-line="76" class="link-to-prism">src/lib/mixins/extract-options-data-source.mixin.ts:76</a></div> </td> </tr> <tr> <td class="col-md-4"> <div class="io-description"> <b>Parameters :</b> <table class="params"> <thead> <tr> <td>Name</td> <td>Type</td> <td>Optional</td> </tr> </thead> <tbody> <tr> <td>control</td> <td> <code>AbstractControl</code> </td> <td> Yes </td> </tr> </tbody> </table> </div> <div class="io-description"> <b>Returns : </b> <code>BaseDataSource&lt;ControlOptions | Record&gt;</code> </div> <div class="io-description"> </div> </td> </tr> </tbody> </table> </section> </div> <div class="tab-pane fade tab-source-code" id="source"> <pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import { Injector, isDevMode, } from &#x27;@angular/core&#x27;; import { AbstractControl } from &#x27;@angular/forms&#x27;; import { BaseDataSource, BaseDataSourceMetadata, BaseDataSourceViewer, DataSourceLoader, PipeDataSource, } from &#x27;@rxap/data-source&#x27;; import { IdOrInstanceOrToken } from &#x27;@rxap/definition&#x27;; import { RxapFormControl } from &#x27;@rxap/forms&#x27;; import { Mixin } from &#x27;@rxap/mixin&#x27;; import { ControlOptions } from &#x27;@rxap/utilities&#x27;; import { map, tap, } from &#x27;rxjs/operators&#x27;; import { UseDataSource, UseDataSourceSettings, UseDataSourceValue, } from &#x27;../decorators/use-data-source&#x27;; import { InputSelectOptionsSettings } from &#x27;../directives/input-select-options.directive&#x27;; import { ExtractControlMixin } from &#x27;./extract-control.mixin&#x27;; import { ExtractDataSourcesMixin } from &#x27;./extract-data-sources.mixin&#x27;; import { ExtractFormDefinitionMixin } from &#x27;./extract-form-definition.mixin&#x27;; export type UseOptionsDataSourceSettings&lt;Source&gt; &#x3D; UseDataSourceSettings&lt;Source, ControlOptions | Record&lt;string, any&gt;&gt; export const DATA_SOURCE_NAME &#x3D; &#x27;options&#x27;; export function ComposeOptionsTransformers(...fnc: Array&lt;(value: any) &#x3D;&gt; any&gt;): (value: any) &#x3D;&gt; any { return base &#x3D;&gt; fnc.reduce((source, transform) &#x3D;&gt; transform(source), base); } export function UseOptionsDataSource&lt;Source&gt;( dataSource: IdOrInstanceOrToken&lt;BaseDataSource&lt;Source&gt;&gt;, settings?: InputSelectOptionsSettings&lt;Source&gt;, ): ( target: any, propertyKey: string, ) &#x3D;&gt; any; export function UseOptionsDataSource( dataSource: IdOrInstanceOrToken&lt;BaseDataSource&gt;, settings?: InputSelectOptionsSettings&lt;ControlOptions&gt;, ) { return function (target: any, propertyKey: string) { UseDataSource(dataSource, DATA_SOURCE_NAME, settings)(target, propertyKey); }; } export interface ExtractOptionsDataSourceMixin extends ExtractFormDefinitionMixin, ExtractDataSourcesMixin, ExtractControlMixin { } @Mixin(ExtractControlMixin, ExtractFormDefinitionMixin, ExtractDataSourcesMixin) export class ExtractOptionsDataSourceMixin { protected settings?: UseOptionsDataSourceSettings&lt;any&gt;; protected readonly dataSourceLoader!: DataSourceLoader; protected metadata?: BaseDataSourceMetadata; protected viewer?: BaseDataSourceViewer; protected dataSource?: BaseDataSource&lt;ControlOptions | Record&lt;string, any&gt;&gt;; protected readonly injector!: Injector; protected useDataSourceValue?: UseDataSourceValue&lt;ControlOptions | Record&lt;string, any&gt;&gt;; protected extractOptionsDatasource(control?: AbstractControl): BaseDataSource&lt;ControlOptions | Record&lt;string, any&gt;&gt; { control ??&#x3D; this.extractControl(); if (!(control instanceof RxapFormControl)) { throw new Error(&#x27;Ensure to use a RxapFromControl&#x27;); } const formDefinition &#x3D; this.extractFormDefinition(control); const useDataSourceValueMap &#x3D; this.extractDataSources(formDefinition, control.controlId); if (!useDataSourceValueMap.has(&#x27;options&#x27;)) { throw new Error(&#x60;The data source with the name &#x27;options&#x27; is not defined&#x60;); } const useDataSourceValue &#x3D; this.useDataSourceValue &#x3D; useDataSourceValueMap.get(&#x27;options&#x27;)!; this.settings &#x3D; this.useDataSourceValue.settings ?? {}; let dataSource: BaseDataSource; try { dataSource &#x3D; this.dataSourceLoader.load( useDataSourceValue.dataSource, this.metadata, this.injector, ); } catch (e: any) { if (e.name &amp;&amp; e.name &#x3D;&#x3D;&#x3D; &#x27;NullInjectorError&#x27;) { if (isDevMode()) { console.error(&#x27;Cloud not inject the options data source&#x27;, this.useDataSourceValue); } throw new Error(&#x27;Cloud not inject the options data source:\n&#x27; + e.message); } throw e; } if (this.settings?.transformer) { dataSource &#x3D; new PipeDataSource( dataSource, map(this.settings.transformer), tap(options &#x3D;&gt; useDataSourceValue.lastValue &#x3D; options), ); } else { dataSource &#x3D; new PipeDataSource( dataSource, tap(options &#x3D;&gt; useDataSourceValue.lastValue &#x3D; options), ); } return this.dataSource &#x3D; dataSource; } } </code></pre> </div> </div> </div><div class="search-results"> <div class="has-results"> <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1> <ul class="search-results-list"></ul> </div> <div class="no-results"> <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1> </div> </div> </div> <!-- END CONTENT --> </div> </div> <label class="dark-mode-switch"> <input type="checkbox"> <span class="slider"> <svg class="slider-icon" viewBox="0 0 24 24" fill="none" height="20" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" width="20" xmlns="http://www.w3.org/2000/svg"> <path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"></path> </svg> </span> </label> <script> var COMPODOC_CURRENT_PAGE_DEPTH = 1; var COMPODOC_CURRENT_PAGE_CONTEXT = 'class'; var COMPODOC_CURRENT_PAGE_URL = 'ExtractOptionsDataSourceMixin.html'; var MAX_SEARCH_RESULTS = 15; </script> <script> $darkModeToggleSwitchers = document.querySelectorAll('.dark-mode-switch input'); checkToggle(darkModeState); if ($darkModeToggleSwitchers.length > 0) { for (var i = 0; i < $darkModeToggleSwitchers.length; i++) { $darkModeToggleSwitchers[i].addEventListener('change', function (event) { darkModeState = !darkModeState; toggleDarkMode(darkModeState); }); } } </script> <script src="../js/libs/custom-elements.min.js"></script> <script src="../js/libs/lit-html.js"></script> <script src="../js/menu-wc.js" defer></script> <script nomodule src="../js/menu-wc_es5.js" defer></script> <script src="../js/libs/bootstrap-native.js"></script> <script src="../js/libs/es6-shim.min.js"></script> <script src="../js/libs/EventDispatcher.js"></script> <script src="../js/libs/promise.min.js"></script> <script src="../js/libs/zepto.min.js"></script> <script src="../js/compodoc.js"></script> <script src="../js/tabs.js"></script> <script src="../js/menu.js"></script> <script src="../js/libs/clipboard.min.js"></script> <script src="../js/libs/prism.js"></script> <script src="../js/sourceCode.js"></script> <script src="../js/search/search.js"></script> <script src="../js/search/lunr.min.js"></script> <script src="../js/search/search-lunr.js"></script> <script src="../js/search/search_index.js"></script> <script src="../js/lazy-load-graphs.js"></script> </body> </html>