AngularJS

This page provides information specifically related to AngularJS in SanteDB applets.

SanteDB applets are written using the AngularJS framework. SanteDB's uicore (org.santedb.uicore) applet provides a series of useful Angular filters, directives and factories which can be used to write and compose user interfaces.

Directives

There are a series of directives in the SanteDB AngularJS library which are used to render components.

The entity-search directive is used to render a search box which can be used to search any SanteDB resource on the SanteDB API. This directive is used when you wish to provide simple searches to users. The structure of this directive is:

<entity-search
    type="[Patient|Person|Place|Organization|Act|AssigningAuthority|SecurityUser|..]"
    display="'property.to.display'"
    search-field="'field-to-search-resources-on'"
    default-results="{ results to show by default }"
    filter="'hdsi expression'"
    group-display="'Group Display Selector'"
    group-by="[Group Selector]"
    key="'property path in ng-model to use as value'"
    selector="'property path to use as <option value='"
    value-property="path on scope to set selected value"
    value-selector="path on returned objects to set as selected value"
    multi-select="true|false"
    auto-tab-next="true|false"
    copy-nulls="true|false"
    min-render="10"
    change-clear="other object to watch - if its value changes then clear this"
    is-required="true|false"
    filter="[Filter Expression]"
  />  

For example, if you were to provide a search for all Places which are of type ServiceDeliveryLocation and grouped by their State the following entity-search could be used:

<entity-search
    type="Place"
    group-by="address.Direct.component.State"
    filter="{ &quot;classConcept.mnemonic&quot;:ServiceDeliveryLocation }"
/>

Address Edit (address-edit)

The address editing control provides a common input control for EntityAddress types.

<address-edit address="address-to-update"
    no-add="true|false"
    no-type="true|false"
    simple-entry="true|false"
    is-required="true|false"
    owner-form="name-of-form"
    control-prefix="'some-prefix'"/>

Example of Use

<div role="tabpanel" class="tab-pane fade" id="demoAddress">
    <address-edit owner-form="panel.editForm" address="editObject.address" is-required="true" />
</div>

Geographic Edit (geo-edit)

Allows for the editing of a geo-tag on an object.

<geo-edit geo="entity.geo"
     is-required="true|false"
     owner-form="nameOfForm"
     control-prefix="'some-prefix'" />

Name Edit (name-edit)

The name edit input control allows for the common reuse of a name entry component.

<name-edit
    name="name-to-bind-to"
    simple-entry="true|false"
    no-add="true|false"
    no-type="true|false"
    is-required="true|false"
    owner-form="'name-of-form'"
    input-style="tag|simple"
    allowed-components="prefix,given,family,suffix"
    control-prefix="'prefix-to-add'" />

Telecom Edit (telecom-edit)

The telecom editing control allows the UI to capture telecommunications addresses for an entity.

<telecom-edit telecom="entity.telecom"
    single-edit="true|false"
    owner-form="true|false"
    no-label="true|false" />

Identifier List Editor (identifier-list-edit)

The identifier list editing control allows the UI to capture identiifers on a key/value pair entry.

<identifier-list-edit identifier="entity.identifier"
    owner-form="form that owns this control"
    container-class="entity.classConcept" />

Identifier Edit (identifier-edit)

The identifier edit allows for the easy capture of a single identifier.

<identifier-edit identifier="entity.identifier['SSN']"
    owner-form="name of owner form"
    container-class="entity.classConcept"
    no-domain="true|false"
    is-required="true|false"
    no-scan="true|false"
    no-label="true|false" />

Relationship Edit (admin-relation-edit)

The relationship editor provides a generic entry for relationships to/from entities with one another.

<admin-relation-edit 
    relationship="entity.relationship"
    container-class="entity.classConcept" />

Schedule Editor (schedule-edit)

The schedule editor allows for editing of a PlaceService entry.

<schedule-edit
    json-schedule="json object | PlaceService.schedule" />

Entity History (entity-history)

The entity history control allow for the display of a table outlining the history of an object.

<entity-history target="object_to_display_history" />

Entity Policy Assignment (entity-policy-admin)

The policy assignment directive allows the UI to assign policies to any of the securable objects in SanteDB such as SecurityDevice, SecurityRole, SecurityApplication, Entity, and Act.

<entity-policy-admin securable="object-to-apply-policy-to"
    policy="collection of policy objects" />

Demand (demand)

The demand directive is an attribute that can be attached to any button or link and is used to easily disable the link whenever the currently authenticated user does not have adequate permission to access the function.

<[button|a]
    demand="[Policy OID]"
>[text]</[button|a]>

For example, if you want to place a button on the page that will delete something important and wish to ensure that the user has been granted the "Unrestricted Administrative Function" policy (1.3.6.1.4.1.33349.3.1.5.9.2.0) you would use this syntax:

<button
    ng-click="deleteSomethingImportant()"
    demand="1.3.6.1.4.1.33349.3.1.5.9.2.0"
>{{ 'ui.myapp.deleteImportantThings' | i18n }}</button>

Entity Table (entity-table)

The entity table is used to render a dynamic client side table which allows for filtering, sorting, and performing actions on lists (tables) of Entities. The entity table directive is used as follows:

<entity-table
    id="[id of table]"
    type="SecurityUser|SecurityRole|Patient|Place|..."
    search-field="'field-to-search-on'"
    properties="[ 'list', 'of', 'properties', 'as', 'columns' ]"
    upstream="true|false"
    default-query="{ 'filter':value, 'filter': value }"
    item-actions="[{ name: 'button_name', 
        sref: 'nav-to-state', 
        action: 'callback',
        demand: 'required policy',
        className: 'button css class',
        icon: 'button icon',
        when: 'expression-when-to-show' 
    }]"
    actions="see item-actions"
    render="{ 'columnName' : 'renderingFunction' }",
    i18n-prefix="prefix-for-columns-in-translation"
    sort="true|false"
    default-filter="default search filter value"
    can-filter="true|false"
    can-size="true|false"
    no-buttons="true|false"
    button-bar="#refToButtonBarDiv"
    item-class="css class for items"
    stateless="true|false"
    sub-resource-holder="id-of-parent-resource"
    key-property="property of table key"
/>

The properties are described in more detail below:

Rendering Buttons

Buttons are rendered on the entity-table using a series of control objects. Each control object is placed into an Array on either the item-actions or actions attributes in this format:

{
    name: 'displayName',
    sref: 'ng-route state reference to use on button',
    action: 'javascript function to call on click',
    className: 'btn-* class to use on the button',
    icon: 'fa-* icon to use on button',
    demand: 'policy OID required to use button'
}

Authority Select (authority-select)

The authority select directive creates a drop-down selection which allows a user to select an assigning authority based on a particular scope.

<authority-select identity-scope="'bacd9c6f-3fa9-481e-9636-37457962804d'"
   key="[ property to extract key from ]" 
   ng-scope="[value]" />

Concept Select (concept-select)

The concept select shows a searchable input which is bound to a concept set.

<concept-select 
    ng-scope="[value]"
    concept-set="'name-of-concept-set'"
    exclude-concepts="[ 'uuid-of-concept-to-exclude' ]"
    add-concept="[ 'uuid-of-extra-concepts' ]"
    key="'path-to-key'"
/>

Parameters

Example Use

<concept-select class="form-control" required="required" concept-set="'PlaceClass'" ng-model="target.classConceptModel"/>

Security Provenance (provenance)

The provenance filter is used to render the provenance data related to the object (create, update, or delete). Provenance is covered in more detail in architecture documentation. This filter renders in HTML so it should be bound as follows (the example shows the provenance for the user's creation data):

<div>
    <strong>Created:</strong>
    <provenance provenance-id="user.createdBy" provenance-time="user.creationTime"></provenance>
</div>

The output of this is a control which allows examination of the event including user, application, device, timestamp and session id.

Entity List

This feature is new to SanteDB 3.0

The entity-list directive behaves much like the entity-table only it presents a more mobile friendly view of results to the user. The entity-list can operate as a list, or as a grid of paged search results.

<entity-list
    id="[id of list]"
    type="Person|SubstanceAdministration|Patient|Place|..."
    display="'list'|'grid'"
    search-field="'field-to-search-on'"
    upstream="true|false"
    default-query="{ 'filter':value, 'filter': value }"
    item-actions="[{ name: 'button_name', 
        sref: 'nav-to-state', 
        action: 'callback',
        demand: 'required policy',
        className: 'button css class',
        icon: 'button icon',
        when: 'expression-when-to-show' 
    }]"
    actions="see item-actions"
    item-supplement="function_to_call_for_each_record"
    order-by="sorting-order"
    can-filter="true|false"
    can-size="true|false"
    item-class="css class for items"
    stateless="true|false"
    sub-resource-scope="id-of-parent-resource"
    sub-resource="name_of_sub_resource"
    operation="name_of_operation"
    operation-scope="id-of-parent-resource"
    key-property="property of item key"
    >
    <!-- Template for each result card here -->
</entity-list>

For example, to display all Place in a grid of results:

<entity-list type="Place" display="'grid'" search-field="'name.component.value'" 
   item-actions="[
      {
         name: 'view',
         sref: 'santedb-admin.data.place.view',
         className: 'btn-primary',
         icon: 'fa-eye'
   ]">
   <div class="card-header">
       <h5 class="card-title">{{ item.name | name }}</h5>
    </div>
 </entity-list>

Filters

SanteDB also provides a series of filters which are useful for rendering common objects. The filters are explained below.

Localize (i18n)

The localize or i18n filter is used to automatically find the specified translation string in the global list of translations for the current locale. For example, to render string ui.action.save in the current locale:

{{ 'ui.action.save' | i18n }}

Note: One of the benefits of using SanteSuite's i18n filter rather than other AngularJS localization filters is that the server side will pre-process these tags and save the result of localization when deployed in production mode. This saves lower powered clients from re-running the filter on repeat views.

Identifier (identifier)

The identifier filter is used to render the the specified identifier value from the specified domain (given a series of identifiers or a single identifier). For example, to render a patient's national health identifier:

{{ patient.identifier | identifier: 'NHID' }}

Concept (concept)

The concept filter is used to render the preferred display name for a concept in the current locale. For example, to render the preferred display name of gender in the current locale:

{{ patient.genderConcept | concept }}

Entity Name (name)

The name filter is used to render the specified type of name from the provided patient name collection. For example, to render a patient's legal name:

{{ patient.name | name: 'Legal' }}

Entity Address (address)

The address filter, like the name filter, is used to render an entity's name. For example, to render the direct address of a place:

{{ place.address | address: 'Direct' }}

Extended Date (ext-date)

The extended date (ext-date) filter is used to render dates according to the current user locale. This allows the developer to specify custom formats and custom precision. For example, the below code will show a patient's date of birth to the precision it was captured:

{{ patient.dateOfBirth | extDate: patient.dateOfBirthPrecision }}

Last updated