pointing to base.ini in the JS file resulted in the raw string content of base.ini to be in the JS bundle
195 lines
4.6 KiB
JavaScript
195 lines
4.6 KiB
JavaScript
import * as R from 'ramda'
|
|
import { format } from 'date-fns'
|
|
|
|
import DateSelector from './date_selector'
|
|
import { emitEvent } from '../lib/emitters'
|
|
import Modal from '../mixins/modal'
|
|
import optionsinput from './options_input'
|
|
import textinput from './text_input'
|
|
|
|
const START_DATE = 'start_date'
|
|
const END_DATE = 'end_date'
|
|
const POP = 'period_of_performance'
|
|
const NUMBER = 'number'
|
|
|
|
export default {
|
|
name: 'clin-fields',
|
|
|
|
components: {
|
|
DateSelector,
|
|
optionsinput,
|
|
textinput,
|
|
},
|
|
|
|
mixins: [Modal],
|
|
|
|
props: {
|
|
initialClinIndex: Number,
|
|
initialStartDate: {
|
|
type: String,
|
|
default: null,
|
|
},
|
|
initialEndDate: {
|
|
type: String,
|
|
default: null,
|
|
},
|
|
initialClinNumber: {
|
|
type: String,
|
|
default: null,
|
|
},
|
|
contractStart: {
|
|
type: String,
|
|
required: true,
|
|
},
|
|
contractEnd: {
|
|
type: String,
|
|
required: true,
|
|
},
|
|
},
|
|
|
|
data: function() {
|
|
const start = !!this.initialStartDate
|
|
? new Date(this.initialStartDate)
|
|
: undefined
|
|
const end = !!this.initialEndDate
|
|
? new Date(this.initialEndDate)
|
|
: undefined
|
|
const popValidation = !this.initialStartDate ? false : start < end
|
|
const clinNumber = !!this.initialClinNumber
|
|
? this.initialClinNumber
|
|
: undefined
|
|
const contractStartDate = new Date(this.contractStart)
|
|
const contractEndDate = new Date(this.contractEnd)
|
|
|
|
return {
|
|
clinIndex: this.initialClinIndex,
|
|
startDate: start,
|
|
endDate: end,
|
|
popValid: popValidation,
|
|
startDateValid: false,
|
|
endDateValid: false,
|
|
contractStartDate: contractStartDate,
|
|
contractEndDate: contractEndDate,
|
|
clinNumber: clinNumber,
|
|
showClin: true,
|
|
popErrors: [],
|
|
validations: [
|
|
{
|
|
func: this.popDateOrder,
|
|
message: 'PoP start date must be before end date.',
|
|
},
|
|
{
|
|
func: this.popStartsAfterContract,
|
|
message: `PoP start date must be on or after ${format(
|
|
contractStartDate,
|
|
'MMM D, YYYY'
|
|
)}.`,
|
|
},
|
|
{
|
|
func: this.popEndsBeforeContract,
|
|
message: `PoP end date must be before or on ${format(
|
|
contractEndDate,
|
|
'MMM D, YYYY'
|
|
)}.`,
|
|
},
|
|
],
|
|
}
|
|
},
|
|
|
|
mounted: function() {
|
|
this.$root.$on('field-change', this.handleFieldChange)
|
|
},
|
|
|
|
created: function() {
|
|
emitEvent('field-mount', this, {
|
|
optional: false,
|
|
name: 'clins-' + this.clinIndex + '-' + POP,
|
|
valid: this.checkPopValid(),
|
|
})
|
|
},
|
|
|
|
methods: {
|
|
checkPopValid: function() {
|
|
return (
|
|
this.popDateOrder() &&
|
|
this.popStartsAfterContract() &&
|
|
this.popEndsBeforeContract()
|
|
)
|
|
},
|
|
|
|
validatePop: function() {
|
|
this.popValid = this.checkPopValid()
|
|
emitEvent('field-change', this, {
|
|
name: 'clins-' + this.clinIndex + '-' + POP,
|
|
valid: this.popValid,
|
|
})
|
|
|
|
this.popErrors = R.pipe(
|
|
R.map(validation =>
|
|
!validation.func() ? validation.message : undefined
|
|
),
|
|
R.filter(Boolean)
|
|
)(this.validations)
|
|
},
|
|
|
|
popStartsAfterContract: function() {
|
|
if (this.startDateValid) {
|
|
return this.startDate >= this.contractStartDate
|
|
}
|
|
return true
|
|
},
|
|
|
|
popEndsBeforeContract: function() {
|
|
if (this.endDateValid) {
|
|
return this.endDate <= this.contractEndDate
|
|
}
|
|
return true
|
|
},
|
|
|
|
popDateOrder: function() {
|
|
if (!!this.startDate && !!this.endDate) {
|
|
return this.startDate < this.endDate
|
|
}
|
|
return true
|
|
},
|
|
|
|
handleFieldChange: function(event) {
|
|
if (this._uid === event.parent_uid) {
|
|
if (event.name.includes(START_DATE)) {
|
|
if (!!event.value) this.startDate = new Date(event.value)
|
|
if (!!event.valid) this.startDateValid = event.valid
|
|
this.validatePop()
|
|
} else if (event.name.includes(END_DATE)) {
|
|
if (!!event.value) this.endDate = new Date(event.value)
|
|
if (!!event.valid) this.endDateValid = event.valid
|
|
this.validatePop()
|
|
} else if (event.name.includes(NUMBER)) {
|
|
this.clinNumber = event.value
|
|
}
|
|
}
|
|
},
|
|
|
|
removeClin: function() {
|
|
this.showClin = false
|
|
emitEvent('remove-clin', this, {
|
|
clinIndex: this.clinIndex,
|
|
})
|
|
this.closeModal('remove_clin')
|
|
},
|
|
},
|
|
|
|
computed: {
|
|
clinTitle: function() {
|
|
if (!!this.clinNumber) {
|
|
return `CLIN ${this.clinNumber}`
|
|
} else {
|
|
return `CLIN`
|
|
}
|
|
},
|
|
|
|
removeModalId: function() {
|
|
return `remove-clin-${this.clinIndex}`
|
|
},
|
|
},
|
|
}
|