Crestron Components Lib - Showcase App

ch5-select: template processing

Component Configuration (click to expand)
{
  "templatevariables": {
    "id": {
      "direction_select": [
          {"description": "North", "fa-icon": "up"},
          {"description": "South", "fa-icon": "down"},
          {"description": "East", "fa-icon": "right"},
          {"description": "West", "fa-icon": "left"}
        ]
    }
  }
}

Press the Load button to load the configuration.

Ch5 components can be preconfigured with default values for attributes and for templatevariables. The configuration can be done using Ch5Config and its methods:

  • loadConfig(config:TCh5Config) loads a new configuration and overrides the existing one.
  • setAttributeForId(elementId:string, attributeName:string, attributeValue:string) sets an attributeValue for an attributeName of the specified HTML elementId.
  • setAttributeForComponent(componentName:string, attributeName:string, attributeValue:string) sets an attributeValue for an attributeName of the specified ch5 component (componentName).
  • setTemplateVarsForId(elementId:string, tempVarsItems:any[]) sets the template variables for the ch5 component that have the specified elementId.
  • getConfig() returns the current configuration object.
  • getAttributesForId(elementId:string):TCh5ConfigAttributes returns the configrued attributes for the component that have the specified elementId.
  • getAttributesForComponent(componentName:string):TCh5ConfigAttributes returns all configured attributes for the component specified in componentName ( for example 'ch5-button').
  • getTemplateVarsForElementById(elementId:string):TCh5ConfigTemplateVars[] returns the configured template variables for the component that have the specified elementId.
  • getAttributesForElement(cr:Ch5Common):TCh5ConfigAttributes returns all configured attributes for a CH5 component.
  • getTemplateVarsForElement(cr:Ch5Common):TCh5ConfigTemplateVars[] returns all configured templatevariables for a CH5 component.


type TCh5ConfigAttributes={
    [attrName:string]: string
}
type TCh5ConfigTemplateVars={
    [varName:string]: string
}
type TCh5Config={
    "attributes": {
        "id": {
            [id:string]:TCh5ConfigAttributes
        },
        "component": {
            [component:string]:TCh5ConfigAttributes
        }
    },
    "templatevariables": {
        "id": {
            [id:string]:TCh5ConfigTemplateVars[]
        }
    }
}

ch5-select: template processing

Creating options is dependent on the following attributes: size, indexId, receiveStateTemplateVars and "templatevariables" from global the config data.


By default, when a template is defined, the option is created using "templatevariables" data and can be updated by the receiveStateTemplateVars signal data. When an option is selected, the top line will display the entire option HTML (singleselection case) or a list of comma separated labels/"N items selected" (multiselect case). NOTE: For multiselect, ensure receiveStateLabel is used to provide option labels. If this signal attribute is not used, the multiselect top line will display empty values as a label.

<div class="custom-div">
		<p><strong>Example 1:</strong> ch5-select in mode plain. Each option description is set from global config
		"templatevariables" (in this case).</p>
		
		<ch5-select id="direction_select" size="4" indexId="Index" noneSelectedPrompt="Select">
				<template>
						<ch5-select-option>
								<div>
										<i class="fas fa-arrow-{{fa-icon}}"></i>
										<span>item_{{Index}} {{description}}</span>
								</div>
						</ch5-select-option>
				</template>
		</ch5-select>
		
</div>

<div class="custom-div">
		<p><strong>Example 2:</strong> ch5-select, multiselect=false, default template, iconPosition=first</p>
		
		<ch5-select id="singleselect-icon-first" size="4" indexId="Index" noneSelectedPrompt="Select">
				<template>
						<ch5-select-option sendEventOnClick="user_select_clicked_{{Index}}" useDefaultTmpl
																receiveStateLabel="label_signal_{{Index}}"
																receiveStateUrl="receive_image_url_{{Index}}">
						</ch5-select-option>
				</template>
		</ch5-select>
		
</div>

<div class="custom-div">
		<p><strong>Example 3:</strong> ch5-select, multiselect=false, default template, iconPosition=last</p>
		
		<ch5-select id="singleselect-icon-last" size="4" indexId="Index" noneSelectedPrompt="Select"
				mode="panel">
				<template>
						<ch5-select-option sendEventOnClick="user_select_clicked_{{Index}}"
																useDefaultTmpl iconPosition="last"
																receiveStateLabel="label_signal_{{Index}}"
																receiveStateUrl="receive_image_url_{{Index}}">
						</ch5-select-option>
				</template>
		</ch5-select>
		
</div>

<div class="custom-div">
		<p><strong>Example 4:</strong> ch5-select, multiselect=true, default template and iconPosition=first</p>
		<p>
				<strong>Note: </strong> for all multiselect examples option labels are set using the same receiveStateLabel
				signals set. Also, receiveStateUrl signals are providing default template image URL.<br><br>
				Since ch5-toggle has no receiveStateSelected attribute, ch5-select-option.receiveStateSelected is also used
				to set ch5-toggle.receiveStateValue.<br><br>
				For multiselect with default template ch5-select-option.sendEventOnClick
				is not sent by option element, it is assigned to ch5-toggle.
		</p>
		
		<ch5-select id="multiselect_1" size="4" indexId="Index" noneSelectedPrompt="Select"
				mode="panel" multiselect>
				<template>
						<ch5-select-option sendEventOnClick="multiselect_1_clicked_{{Index}}"
																receiveStateSelected="multiselect_1_selected_{{Index}}"
																useDefaultTmpl
																receiveStateLabel="label_signal_{{Index}}"
																receiveStateUrl="receive_image_url_{{Index}}">
						</ch5-select-option>
				</template>
		</ch5-select>
		
</div>

<div class="custom-div">
		<p><strong>Example 5:</strong> ch5-select, multiselect=true, default template and iconPosition=last</p>
		
		<ch5-select id="multiselect_2" size="4" indexId="Index" noneSelectedPrompt="Select"
				mode="panel" multiselect>
				<template>
						<ch5-select-option sendEventOnClick="multiselect_2_clicked_{{Index}}"
																receiveStateSelected="multiselect_2_selected_{{Index}}"
																useDefaultTmpl iconPosition="last"
																receiveStateLabel="label_signal_{{Index}}"
																receiveStateUrl="receive_image_url_{{Index}}">
						</ch5-select-option>
				</template>
		</ch5-select>
		
</div>

<div class="custom-div">
		<p><strong>Example 6:</strong> ch5-select, multiselect=true, default template and receiveStateScriptLabelHTML</p>
		<p>- receiveStateScriptLabelHTML signal is used to set ch5-toggle label</p>
		
		<ch5-select id="multiselect_3" size="4" indexId="Index" noneSelectedPrompt="Select"
				mode="panel" multiselect>
				<template>
						<ch5-select-option sendEventOnClick="multiselect_3_clicked_{{Index}}"
																receiveStateSelected="multiselect_3_selected_{{Index}}"
																useDefaultTmpl
																receiveStateLabel="label_signal_{{Index}}"
																receiveStateScriptLabelHTML="receive_html_script_label_{{Index}}"
																receiveStateUrl="receive_image_url_{{Index}}">
						</ch5-select-option>
				</template>
		</ch5-select>
		
</div>

<div class="custom-div">
		<p><strong>Example 7:</strong> ch5-select, multiselect=false, feedbackMode=submit and default template.</p>
		
				<ch5-select id="default_tmpl_f_submit_single"
										 size="4" indexId="Idx"
										 receiveStateValue="item_selected_after_click"
										 feedbackMode="submit"
										 noneSelectedPrompt="Select"
										 mode="panel">
						 <template>
								<ch5-select-option sendEventOnClick="select_item_{{Idx}}_on_click"
																		useDefaultTmpl
																		receiveStateLabel="label_signal_{{Idx}}"
																		receiveStateUrl="receive_image_url_{{Idx}}">
								</ch5-select-option>
						 </template>
				</ch5-select>
		
		<p style="margin-top: 24px;">
				Dirty: <span id="dirty-select-1"></span><br><br>
				<ch5-button id="submit-btn-1" label="Submit"></ch5-button>
				<ch5-button id="reset-btn-1" label="Reset"></ch5-button>
		</p>
</div>

<div class="custom-div">
		<p><strong>Example 8:</strong> ch5-select, multiselect=true, feedbackMode=submit and default template.</p>
		
				<ch5-select id="default_tmpl_f_submit_multi"
										 size="4" indexId="Idx"
										 feedbackMode="submit"
										 noneSelectedPrompt="Select options(s)"
										 mode="panel" multiselect>
						 <template>
								<ch5-select-option sendEventOnClick="multiselect_4_clicked_{{Idx}}"
																		receiveStateSelected="multiselect_4_selected_{{Idx}}"
																		useDefaultTmpl
																		receiveStateLabel="label_signal_{{Idx}}"
																		receiveStateUrl="receive_image_url_{{Idx}}">
								</ch5-select-option>
						 </template>
				</ch5-select>
		
		<p style="margin-top: 24px;">
				Dirty: <span id="dirty-select-2"></span><br><br>
				<ch5-button id="submit-btn-2" label="Submit"></ch5-button>
				<ch5-button id="reset-btn-2" label="Reset"></ch5-button>
		</p>
</div>

<div class="custom-div">
		<!-- TODO: remove this after issues are fixed -->
		<strong>Issues using default template for multiselect:</strong>
		<ul>
				<li>using receiveStateScriptLabelHTML, UI looks bad with 2 labels (option label provided by receiveStateLabel) and
				ch5-toggle label (provided by receiveStateScriptLabelHTML)</li>
				<li>No way to set on/off ch5-toggle labels, unless we add 2 more new attributes on ch5-select-option</li>
		</ul>
</div>

Example 1: ch5-select in mode plain. Each option description is set from global config "templatevariables" (in this case).

Example 2: ch5-select, multiselect=false, default template, iconPosition=first

Example 3: ch5-select, multiselect=false, default template, iconPosition=last

Example 4: ch5-select, multiselect=true, default template and iconPosition=first

Note: for all multiselect examples option labels are set using the same receiveStateLabel signals set. Also, receiveStateUrl signals are providing default template image URL.

Since ch5-toggle has no receiveStateSelected attribute, ch5-select-option.receiveStateSelected is also used to set ch5-toggle.receiveStateValue.

For multiselect with default template ch5-select-option.sendEventOnClick is not sent by option element, it is assigned to ch5-toggle.

Example 5: ch5-select, multiselect=true, default template and iconPosition=last

Example 6: ch5-select, multiselect=true, default template and receiveStateScriptLabelHTML

- receiveStateScriptLabelHTML signal is used to set ch5-toggle label

Example 7: ch5-select, multiselect=false, feedbackMode=submit and default template.

Dirty:

Example 8: ch5-select, multiselect=true, feedbackMode=submit and default template.

Dirty:

Issues using default template for multiselect:
  • using receiveStateScriptLabelHTML, UI looks bad with 2 labels (option label provided by receiveStateLabel) and ch5-toggle label (provided by receiveStateScriptLabelHTML)
  • No way to set on/off ch5-toggle labels, unless we add 2 more new attributes on ch5-select-option