Skip to content

Commit f9d4517

Browse files
authored
Merge pull request #365 from citation-file-format/209-keywords-validation
implement validation for keywords screen
2 parents e738dea + c4beeba commit f9d4517

4 files changed

Lines changed: 44 additions & 9 deletions

File tree

src/components/Keyword.vue

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
outlined
88
placeholder="Type a keyword"
99
v-bind:model-value="keyword"
10-
v-bind:error="FIXME.hasError"
11-
v-bind:error-message="FIXME.messages.join(', ')"
10+
v-bind:error="keywordError.hasError"
11+
v-bind:error-message="keywordError.messages.join(', ')"
1212
v-on:update:modelValue="$emit('update', $event)"
1313
/>
1414
</div>
@@ -41,7 +41,8 @@
4141
</template>
4242

4343
<script lang="ts">
44-
import { defineComponent } from 'vue'
44+
import { computed, defineComponent } from 'vue'
45+
import { getMyErrors } from 'src/store/validator'
4546
4647
export default defineComponent({
4748
name: 'KeywordCard',
@@ -59,9 +60,9 @@ export default defineComponent({
5960
default: 0
6061
}
6162
},
62-
setup () {
63+
setup (props) {
6364
return {
64-
FIXME: { hasError: false, messages: [] }
65+
keywordError: computed(() => getMyErrors(`/keywords/${props.index}`))
6566
}
6667
},
6768
emits: ['moveDown', 'moveUp', 'removePressed', 'update']

src/components/ScreenKeywords.vue

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,18 @@
4141
</q-btn>
4242
</div>
4343

44+
<q-banner
45+
v-if="keywordsErrors.hasError"
46+
class="bg-warning text-negative"
47+
>
48+
<div
49+
v-bind:key="index"
50+
v-for="(screenMessage, index) in keywordsErrors.messages"
51+
>
52+
{{ screenMessage }}
53+
</div>
54+
</q-banner>
55+
4456
<div id="form-button-bar">
4557
<StepperActions />
4658
</div>
@@ -51,10 +63,11 @@
5163
import Stepper from 'components/Stepper.vue'
5264
import StepperActions from 'components/StepperActions.vue'
5365
import Keyword from 'components/Keyword.vue'
54-
import { defineComponent, nextTick } from 'vue'
66+
import { computed, defineComponent, nextTick } from 'vue'
5567
import { moveDown, moveUp } from '../updown'
5668
import { useCff } from '../store/cff'
5769
import { scrollToBottom } from '../scroll-to-bottom'
70+
import { getMyErrors } from 'src/store/validator'
5871
5972
export default defineComponent({
6073
name: 'ScreenKeywords',
@@ -102,7 +115,8 @@ export default defineComponent({
102115
moveUp,
103116
removeKeyword,
104117
setKeyword,
105-
setKeywords
118+
setKeywords,
119+
keywordsErrors: computed(() => getMyErrors('/keywords'))
106120
}
107121
}
108122
})

src/components/Stepper.vue

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,14 @@
8080
/>
8181

8282
<q-step
83-
color="primary"
83+
error-color="negative"
84+
error-icon="warning"
8485
icon=""
8586
name="keywords"
8687
title="Keywords"
88+
v-bind:active-icon="isValidScreenKeywords.hasError ? 'warning' : 'edit'"
89+
v-bind:color="isValidScreenKeywords.hasError ? 'negative' : 'primary'"
90+
v-bind:error="isValidScreenKeywords.hasError"
8791
v-bind:order="6"
8892
v-if="showAdvanced"
8993
v-on:click="setStepName('keywords')"
@@ -133,14 +137,16 @@ import { computed } from 'vue'
133137
import { useCff } from 'src/store/cff'
134138
import { authorsErrors } from 'src/authors-errors'
135139
import { relatedResourcesErrors } from 'src/related-resources-errors'
140+
import { keywordsErrors } from 'src/keywords-errors'
136141
137142
export default {
138143
setup () {
139144
const { showAdvanced, stepName, setStepName } = useApp()
140-
const { authors } = useCff()
145+
const { authors, keywords } = useCff()
141146
return {
142147
isValidScreenAuthors: computed(() => authorsErrors(authors.value)),
143148
isValidScreenStart: computed(() => getMyErrors('', ['message', 'title'])),
149+
isValidScreenKeywords: computed(() => keywordsErrors(keywords.value)),
144150
isValidScreenVersionSpecific: computed(() => getMyErrors('/date-released')),
145151
isValidScreenRelatedResources: computed(relatedResourcesErrors),
146152
setStepName,

src/keywords-errors.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { KeywordsType } from 'src/types'
2+
import { getMyErrors } from 'src/store/validator'
3+
4+
export const keywordsErrors = (keywords: KeywordsType) => {
5+
const myErrors = [
6+
getMyErrors('/keywords')
7+
]
8+
const myChildrenErrors = keywords?.map((_, index) => getMyErrors(`/keywords/${index}`))
9+
const errors = myChildrenErrors === undefined ? myErrors : [...myErrors, ...myChildrenErrors]
10+
return {
11+
hasError: errors.some(result => result.hasError),
12+
messages: errors.map(result => result.messages.join(', '))
13+
}
14+
}

0 commit comments

Comments
 (0)