Reimplement SaveButton disabled until input change

This commit is contained in:
leigh-mil 2019-06-13 14:34:55 -04:00
parent ab761d9d88
commit 5be4efb9d9
9 changed files with 323 additions and 267 deletions

View File

@ -20,6 +20,10 @@ export default {
mindate: { type: String }, mindate: { type: String },
maxdate: { type: String }, maxdate: { type: String },
nameTag: { type: String }, nameTag: { type: String },
watch: {
type: Boolean,
default: false,
},
}, },
data: function() { data: function() {
@ -138,7 +142,11 @@ export default {
methods: { methods: {
_emitChange: function(name, value, valid) { _emitChange: function(name, value, valid) {
emitEvent('field-change', this, { value, name }) emitEvent('field-change', this, {
value: value,
name: name,
watch: this.watch,
})
}, },
}, },

View File

@ -1,3 +1,5 @@
import stickybits from 'stickybits'
import ClinFields from '../clin_fields' import ClinFields from '../clin_fields'
import DateSelector from '../date_selector' import DateSelector from '../date_selector'
import FormMixin from '../../mixins/form' import FormMixin from '../../mixins/form'
@ -40,4 +42,12 @@ export default {
++this.clinIndex ++this.clinIndex
}, },
}, },
directives: {
sticky: {
inserted: el => {
stickybits(el)
},
},
},
} }

View File

@ -27,6 +27,10 @@ export default {
paragraph: String, paragraph: String,
noMaxWidth: String, noMaxWidth: String,
optional: Boolean, optional: Boolean,
watch: {
type: Boolean,
default: false,
},
}, },
data: function() { data: function() {
@ -122,6 +126,7 @@ export default {
value: this._rawValue(value), value: this._rawValue(value),
valid, valid,
name: this.name, name: this.name,
watch: this.watch,
}) })
}, },

View File

@ -1,6 +1,7 @@
import createNumberMask from 'text-mask-addons/dist/createNumberMask' import createNumberMask from 'text-mask-addons/dist/createNumberMask'
import { conformToMask } from 'vue-text-mask' import { conformToMask } from 'vue-text-mask'
import { emitEvent } from '../lib/emitters'
import FormMixin from '../mixins/form' import FormMixin from '../mixins/form'
import textinput from './text_input' import textinput from './text_input'
import optionsinput from './options_input' import optionsinput from './options_input'
@ -22,6 +23,10 @@ export default {
initialErrors: { initialErrors: {
type: Boolean, type: Boolean,
}, },
watch: {
type: Boolean,
default: false,
},
}, },
data: function() { data: function() {
@ -38,6 +43,12 @@ export default {
this.attachment = e.target.value this.attachment = e.target.value
this.showErrors = false this.showErrors = false
this.changed = true this.changed = true
emitEvent('field-change', this, {
value: e.target.value,
name: this.name,
watch: this.watch,
})
}, },
removeAttachment: function(e) { removeAttachment: function(e) {
e.preventDefault() e.preventDefault()
@ -47,6 +58,12 @@ export default {
} }
this.showErrors = false this.showErrors = false
this.changed = true this.changed = true
emitEvent('field-change', this, {
value: e.target.value,
name: this.name,
watch: this.watch,
})
}, },
}, },

View File

@ -74,7 +74,8 @@
max-width: unset; max-width: unset;
} }
.usa-input__title, .usa-input__title-inline { .usa-input__title,
.usa-input__title-inline {
font-weight: $font-normal; font-weight: $font-normal;
} }

View File

@ -5,7 +5,8 @@
label=field.label | striptags, label=field.label | striptags,
description=field.description, description=field.description,
mindate=None, mindate=None,
maxdate=None) -%} maxdate=None,
watch=False) -%}
<date-selector <date-selector
{% if maxdate %}maxdate="{{ maxdate.strftime("%Y-%m-%d") }}"{% endif %} {% if maxdate %}maxdate="{{ maxdate.strftime("%Y-%m-%d") }}"{% endif %}
@ -13,6 +14,7 @@
initialmonth="{{ field.data.month }}" initialmonth="{{ field.data.month }}"
initialday="{{ field.data.day }}" initialday="{{ field.data.day }}"
initialyear="{{ field.data.year }}" initialyear="{{ field.data.year }}"
v-bind:watch='{{ watch | string | lower }}'
inline-template> inline-template>
<fieldset class="usa-input date-picker" v-bind:class="{ 'usa-input--success': isDateValid }"> <fieldset class="usa-input date-picker" v-bind:class="{ 'usa-input--success': isDateValid }">

View File

@ -15,7 +15,8 @@
classes='', classes='',
noMaxWidth=False, noMaxWidth=False,
optional=False, optional=False,
showLabel=True) -%} showLabel=True,
watch=False) -%}
<textinput <textinput
v-cloak v-cloak
@ -27,6 +28,7 @@
{% if field.errors %}v-bind:initial-errors='{{ field.errors | list }}'{% endif %} {% if field.errors %}v-bind:initial-errors='{{ field.errors | list }}'{% endif %}
v-bind:optional={{ optional|lower }} v-bind:optional={{ optional|lower }}
key='{{ field.name }}' key='{{ field.name }}'
:watch='{{ watch | string | lower }}'
inline-template> inline-template>
<div <div

View File

@ -1,6 +1,6 @@
{% from "components/icon.html" import Icon %} {% from "components/icon.html" import Icon %}
{% macro UploadInput(field, show_label=False) -%} {% macro UploadInput(field, show_label=False, watch=False) -%}
<uploadinput <uploadinput
inline-template inline-template
{% if not field.errors %} {% if not field.errors %}
@ -8,6 +8,7 @@
{% else %} {% else %}
v-bind:initial-errors='true' v-bind:initial-errors='true'
{% endif %} {% endif %}
v-bind:watch='{{ watch | string | lower }}'
> >
<div> <div>
<div v-show="hasAttachment" class="uploaded-file"> <div v-show="hasAttachment" class="uploaded-file">

View File

@ -12,7 +12,7 @@
{% macro LOAInput() %} {% macro LOAInput() %}
<div v-for="loa in loas"> <div v-for="loa in loas">
<textinput :name="'clins-' + clinIndex + '-loas-' + loaIndex(loa)" inline-template> <textinput :name="'clins-' + clinIndex + '-loas-' + loaIndex(loa)" :watch='true' inline-template>
<div class="usa-input usa-input--validation--anything"> <div class="usa-input usa-input--validation--anything">
<masked-input <masked-input
v-on:input='onInput' v-on:input='onInput'
@ -62,10 +62,10 @@
<div> <div>
<div class="form-row"> <div class="form-row">
<div class="form-col form-col--two-thirds"> <div class="form-col form-col--two-thirds">
{{ OptionsInput(fields.jedi_clin_type) }} {{ OptionsInput(fields.jedi_clin_type, watch=True) }}
</div> </div>
<div class="form-col form-col--third"> <div class="form-col form-col--third">
{{ TextInput(fields.number) }} {{ TextInput(fields.number, watch=True) }}
</div> </div>
</div> </div>
@ -77,16 +77,16 @@
</div> </div>
</legend> </legend>
{% for loa in fields.loas %} {% for loa in fields.loas %}
{{ TextInput(loa, showLabel=False) }} {{ TextInput(loa, showLabel=False, watch=True) }}
{% endfor %} {% endfor %}
{{ LOAInput() }} {{ LOAInput() }}
</fieldset> </fieldset>
</div> </div>
{{ DatePicker(fields.start_date) }} {{ DatePicker(fields.start_date, watch=True) }}
{{ DatePicker(fields.end_date) }} {{ DatePicker(fields.end_date, watch=True) }}
{{ TextInput(fields.obligated_amount, validation='dollars') }} {{ TextInput(fields.obligated_amount, validation='dollars', watch=True) }}
</div> </div>
</clin-fields> </clin-fields>
{% endmacro %} {% endmacro %}
@ -101,11 +101,19 @@
{% endif %} {% endif %}
<form id="new-task-order" action='{{ action }}' method="POST" autocomplete="off" enctype="multipart/form-data"> <form id="new-task-order" action='{{ action }}' method="POST" autocomplete="off" enctype="multipart/form-data">
{{ form.csrf_token }} {{ form.csrf_token }}
<to-form inline-template v-bind:initial-clin-count="{{ form.clins.data | length }}">
<div>
{% call StickyCTA(text="Add Funding") %} {% call StickyCTA(text="Add Funding") %}
<span class="action-group"> <span class="action-group">
<!-- todo: implement the review button -->
<input type="submit" formaction="{{ review_action }}" tabindex="0" value="Review task order" form="new-task-order" class="usa-button usa-button-primary"> <input type="submit" formaction="{{ review_action }}" tabindex="0" value="Review task order" form="new-task-order" class="usa-button usa-button-primary">
<input type="submit" tabindex="0" value="Save" form="new-task-order" class="usa-button usa-button-secondary"> <input
type="submit"
class="usa-button usa-button-secondary"
tabindex="0"
:disabled="!changed"
value="{{ 'common.save' | translate }}"
form="new-task-order"/>
<a <a
href="{{ cancel_url }}" href="{{ cancel_url }}"
class="action-group__action icon-link"> class="action-group__action icon-link">
@ -114,7 +122,6 @@
</span> </span>
{% endcall %} {% endcall %}
<to-form inline-template v-bind:initial-clin-count="{{ form.clins.data | length }}">
<div class="task-order task_order__form"> <div class="task-order task_order__form">
<p class="section-description"> <p class="section-description">
{{ "task_orders.new.form_help_text" | translate }} {{ "task_orders.new.form_help_text" | translate }}
@ -146,14 +153,15 @@
<div> <div>
<div class="form-row"> <div class="form-row">
<div class="form-col form-col--two-thirds"> <div class="form-col form-col--two-thirds">
<optionsinput :name="'clins-' + clinIndex + '-jedi_clin_type'" :watch='true' inline-template>
<div class="usa-input"> <div class="usa-input">
<fieldset data-ally-disabled="true" class="usa-input__choices"> <fieldset data-ally-disabled="true" class="usa-input__choices" v-on:change="onInput">
<legend> <legend>
<div class="usa-input__title"> <div class="usa-input__title">
CLIN type CLIN type
</div> </div>
</legend> </legend>
<select :id="'clins-' + clinIndex + '-jedi_clin_type'" :name="'clins-' + clinIndex + '-jedi_clin_type'"> <select :id='name' :name='name'>
<option value="JEDI_CLIN_1">{{ "forms.task_order.clin_01_label" | translate }}</option> <option value="JEDI_CLIN_1">{{ "forms.task_order.clin_01_label" | translate }}</option>
<option value="JEDI_CLIN_2">{{ "forms.task_order.clin_02_label" | translate }}</option> <option value="JEDI_CLIN_2">{{ "forms.task_order.clin_02_label" | translate }}</option>
<option value="JEDI_CLIN_3">{{ "forms.task_order.clin_03_label" | translate }}</option> <option value="JEDI_CLIN_3">{{ "forms.task_order.clin_03_label" | translate }}</option>
@ -161,9 +169,10 @@
</select> </select>
</fieldset> </fieldset>
</div> </div>
</optionsinput>
</div> </div>
<div class="form-col form-col--third"> <div class="form-col form-col--third">
<textinput :name="'clins-' + clinIndex + '-number'" inline-template> <textinput :name="'clins-' + clinIndex + '-number'" :watch='true' inline-template>
<div class="usa-input"> <div class="usa-input">
<label :for="name"> <label :for="name">
<span v-show='showError'>{{ Icon('alert',classes="icon-validation") }}</span> <span v-show='showError'>{{ Icon('alert',classes="icon-validation") }}</span>
@ -209,7 +218,7 @@
</fieldset> </fieldset>
</div> </div>
<date-selector :name-tag="'clins-' + clinIndex + '-start_date'" inline-template> <date-selector :name-tag="'clins-' + clinIndex + '-start_date'" :watch='true' inline-template>
<fieldset class="usa-input date-picker" v-bind:class="{ 'usa-input--success': isDateValid }"> <fieldset class="usa-input date-picker" v-bind:class="{ 'usa-input--success': isDateValid }">
<legend> <legend>
<div class="usa-input__title"> <div class="usa-input__title">
@ -264,7 +273,7 @@
</fieldset> </fieldset>
</date-selector> </date-selector>
<date-selector :name-tag="'clins-' + clinIndex + '-end_date'" inline-template> <date-selector :name-tag="'clins-' + clinIndex + '-end_date'" :watch='true' inline-template>
<fieldset class="usa-input date-picker" v-bind:class="{ 'usa-input--success': isDateValid }"> <fieldset class="usa-input date-picker" v-bind:class="{ 'usa-input--success': isDateValid }">
<legend> <legend>
<div class="usa-input__title"> <div class="usa-input__title">
@ -319,7 +328,7 @@
</fieldset> </fieldset>
</date-selector> </date-selector>
<textinput :name="'clins-' + clinIndex + '-obligated_amount'" validation="dollars" inline-template> <textinput :name="'clins-' + clinIndex + '-obligated_amount'" validation="dollars" :watch='true' inline-template>
<div class="usa-input usa-input--validation--dollars noMaxWidth"> <div class="usa-input usa-input--validation--dollars noMaxWidth">
<label :for="name"> <label :for="name">
<div class="usa-input__title">Funds obligated for cloud</div> <div class="usa-input__title">Funds obligated for cloud</div>
@ -369,11 +378,12 @@
<div class="task-order__pdf-help-text"> <div class="task-order__pdf-help-text">
Upload a single PDF containing all relevant information. {{ Icon('help')}} Upload a single PDF containing all relevant information. {{ Icon('help')}}
</div> </div>
{{ UploadInput(form.pdf) }} {{ UploadInput(form.pdf, watch=True) }}
</div> </div>
{{ TotalsBox(task_order=task_order) }} {{ TotalsBox(task_order=task_order) }}
</div> </div>
</div> </div>
</div>
</to-form> </to-form>
</form> </form>