[[t.latitude]]: [[currentLatitude]]
@@ -150,6 +151,11 @@ class TangyGps extends PolymerElement {
observer: 'reflect',
reflectToAttribute: true
},
+ label: {
+ type: String,
+ observer: 'reflect',
+ value: ''
+ },
hintText: {
type: String,
value: '',
@@ -259,6 +265,7 @@ class TangyGps extends PolymerElement {
this.shadowRoot.querySelector('#qnum-number').innerHTML = this.hasAttribute('question-number')
? `
`
: ''
+ this.shadowRoot.querySelector('#label').innerHTML = this.label
}
disconnectedCallback() {
diff --git a/input/tangy-toggle.js b/input/tangy-toggle.js
new file mode 100644
index 00000000..c2801481
--- /dev/null
+++ b/input/tangy-toggle.js
@@ -0,0 +1,230 @@
+import { PolymerElement, html } from '@polymer/polymer/polymer-element.js';
+import '../util/html-element-props.js'
+import '@polymer/paper-toggle-button/paper-toggle-button.js'
+import '../style/tangy-common-styles.js'
+import '../style/tangy-element-styles.js'
+
+ /**
+ * `tangy-toggle`
+ *
+ *
+ * @customElement
+ * @polymer
+ * @demo demo/index.html
+ */
+export class TangyToggle extends PolymerElement {
+ static get template () {
+ return html`
+
+
+
+
+ `
+ }
+
+ static get is () {
+ return 'tangy-toggle'
+ }
+
+ static get properties () {
+ return {
+ name: {
+ type: String,
+ value: '',
+ reflectToAttribute: true
+ },
+ label: {
+ type: String,
+ value: '',
+ observer: 'applyLabel',
+ reflectToAttribute: true
+ },
+ required: {
+ type: Boolean,
+ value: false,
+ observer: 'onRequiredChange',
+ reflectToAttribute: true
+ },
+ disabled: {
+ type: Boolean,
+ value: false,
+ observer: 'onDisabledChange',
+ reflectToAttribute: true
+ },
+ invalid: {
+ type: Boolean,
+ value: false,
+ observer: 'onInvalidChange',
+ reflectToAttribute: true
+ },
+ hasWarning: {
+ type: Boolean,
+ value: false,
+ observer: 'onWarnChange',
+ reflectToAttribute: true
+ },
+ hasDiscrepancy: {
+ type: Boolean,
+ value: false,
+ observer: 'onDiscrepancyChange',
+ reflectToAttribute: true
+ },
+ incomplete: {
+ type: Boolean,
+ value: true,
+ reflectToAttribute: true
+ },
+ hidden: {
+ type: Boolean,
+ value: false,
+ reflectToAttribute: true
+ },
+ skipped: {
+ type: Boolean,
+ value: false,
+ observer: 'onSkippedChange',
+ reflectToAttribute: true
+ },
+ value: {
+ type: String,
+ value: '',
+ observer: 'onValueChange',
+ reflectToAttribute: true
+ },
+ errorText: {
+ type: String,
+ value: '',
+ reflectToAttribute: true
+ },
+ warnText: {
+ type: String,
+ value: '',
+ reflectToAttribute: true
+ },
+ discrepancyText: {
+ type: String,
+ value: '',
+ reflectToAttribute: true
+ }
+ }
+ }
+
+ connectedCallback () {
+ super.connectedCallback()
+ this.render()
+ }
+
+ render() {
+ if (this.value) {
+ this.$.toggle.checked = true
+ } else {
+ this.$.toggle.checked = false
+ }
+ if (this.label == '' && this.innerHTML !== '') {
+ this.label = this.innerHTML
+ }
+ this.$.toggle.addEventListener('change', (e) => {
+ e.stopPropagation()
+ let incomplete = (!e.target.checked)
+ this.value = e.target.checked ? 'on' : ''
+ this.dispatchEvent(new Event('change', { bubbles: true }))
+ this.dispatchEvent(new CustomEvent('INPUT_VALUE_CHANGE', {
+ bubbles: true,
+ detail: {
+ inputName: this.name,
+ inputValue: !!(e.target.checked),
+ inputIncomplete: incomplete,
+ inputInvalid: !this.$.toggle.validate()
+ }
+ }))
+ })
+ this.shadowRoot.querySelector('.hint-text').innerHTML = this.hasAttribute('hint-text')
+ ? this.getAttribute('hint-text')
+ : ''
+ this.shadowRoot.querySelector('#qnum-number').innerHTML = this.hasAttribute('question-number')
+ ? `
`
+ : ''
+
+ }
+
+ applyLabel(label) {
+ this.$.toggle.children['toggle-text'].innerHTML = this.label
+ }
+
+ onRequiredChange (value) {
+ if (value === false) {
+ this.$.toggle.removeAttribute('required')
+ } else {
+ this.$.toggle.setAttribute('required', true)
+ }
+ }
+
+ onInvalidChange(value) {
+ this.shadowRoot.querySelector('#error-text').innerHTML = this.invalid
+ ? `
${ this.hasAttribute('error-text') ? this.getAttribute('error-text') : ''}
`
+ : ''
+ }
+
+ onDiscrepancyChange(value) {
+ this.shadowRoot.querySelector('#discrepancy-text').innerHTML = this.hasDiscrepancy
+ ? `
${ this.hasAttribute('discrepancy-text') ? this.getAttribute('discrepancy-text') : ''}
`
+ : ''
+ }
+
+ onWarnChange(value) {
+ this.shadowRoot.querySelector('#warn-text').innerHTML = this.hasWarning
+ ? `
${ this.hasAttribute('warn-text') ? this.getAttribute('warn-text') : ''}
`
+ : ''
+ }
+
+ onDisabledChange (value) {
+ if (value === false) {
+ this.$.toggle.removeAttribute('disabled')
+ } else {
+ this.$.toggle.setAttribute('disabled', true)
+ }
+ }
+
+ onValueChange (value) {
+ if (value) this.$.toggle.setAttribute('checked', true)
+ if (!value) this.$.toggle.removeAttribute('checked')
+ }
+
+ onSkippedChange(newValue) {
+ if (newValue === true) {
+ this.value = this.constructor.properties.value.value
+ this.render()
+ }
+ }
+
+ validate() {
+ if (this.required === true &&
+ this.value === '' &&
+ this.disabled === false &&
+ this.hidden === false) {
+ this.invalid = true
+ return false
+ } else {
+ this.invalid = false
+ return true
+ }
+ }
+}
+window.customElements.define(TangyToggle.is, TangyToggle)
diff --git a/style/tangy-element-styles.js b/style/tangy-element-styles.js
index 31b3541c..6b92153b 100644
--- a/style/tangy-element-styles.js
+++ b/style/tangy-element-styles.js
@@ -147,7 +147,7 @@ $_documentStyleContainer.innerHTML = `
}
.m-y-25 {
- margin: 25px 0;
+ margin: var(--tangy-form-widget--margin, 25px 0);
}
diff --git a/tangy-form-item.js b/tangy-form-item.js
index 42045080..528559e1 100644
--- a/tangy-form-item.js
+++ b/tangy-form-item.js
@@ -180,6 +180,16 @@ export class TangyFormItem extends PolymerElement {
font-size: 1.2rem;
line-height: 1rem;
}
+
+ paper-card {
+ --paper-card-header: {
+ @apply --tangy-form-item--paper-card--header;
+ };
+ }
+ paper-card .card-content {
+ padding: var(--tangy-form-item--paper-card-content--padding, 15px);
+ }
+