diff --git a/public/globals.js b/public/globals.js index ff87fcc1f..6c06be909 100644 --- a/public/globals.js +++ b/public/globals.js @@ -100,6 +100,10 @@ window.pkp = { STATUS_PUBLISHED: 3, STATUS_DECLINED: 4, STATUS_SCHEDULED: 5, + PUBLICATION_STATUS_QUEUED: 1, + PUBLICATION_STATUS_PUBLISHED: 3, + PUBLICATION_STATUS_DECLINED: 4, + PUBLICATION_STATUS_SCHEDULED: 5, WORKFLOW_STAGE_ID_SUBMISSION: 1, WORKFLOW_STAGE_ID_INTERNAL_REVIEW: 2, WORKFLOW_STAGE_ID_EXTERNAL_REVIEW: 3, diff --git a/src/components/Form/Form.vue b/src/components/Form/Form.vue index 59302e6da..7e5d115d3 100644 --- a/src/components/Form/Form.vue +++ b/src/components/Form/Form.vue @@ -13,6 +13,7 @@ type="hidden" :name="name" :value="value" + @change="fieldChanged" /> @@ -160,6 +162,7 @@ export default { currentPage: '', isSaving: false, lastSaveTimestamp: -1, + fieldRequiredStates: {}, // track field required states for dynamic fields }; }, computed: { @@ -384,7 +387,19 @@ export default { ) { return; } + + // Check if field has custom required state + if (field.name in this.fieldRequiredStates) { + const isFieldRequired = this.fieldRequiredStates[field.name]; + // check if Field is required by dynamic update and return if not + // otherwise continue with default checks + if (!isFieldRequired) { + return; + } + } + let missingValue = false; + // Only require the primary locale by default for multilingual fields let value = field.isMultilingual ? field.value[this.primaryLocale] @@ -490,18 +505,29 @@ export default { * @param {String} localeKey Optional locale key for multilingual props */ fieldChanged: function (name, prop, value, localeKey) { - const newFields = this.fields.map((field) => { - if (field.name === name) { - if (localeKey) { - field[prop][localeKey] = value; - } else { - field[prop] = value; + // Check if this is a hidden field or normal field + const isHiddenField = this.hiddenFields && name in this.hiddenFields; + + if (isHiddenField) { + const newHiddenFields = {...this.hiddenFields}; + newHiddenFields[name] = value; + this.$emit('set', this.id, {hiddenFields: newHiddenFields}); + } else { + const newFields = this.fields.map((field) => { + if (field.name === name) { + if (localeKey) { + field[prop][localeKey] = value; + } else { + field[prop] = value; + } } - } - return field; - }); - this.$emit('set', this.id, {fields: newFields}); - this.removeError(name, localeKey); + return field; + }); + this.$emit('set', this.id, {fields: newFields}); + + // Remove any errors for this field + this.removeError(name, localeKey); + } }, /** @@ -631,6 +657,13 @@ export default { setErrors: function (errors) { this.$emit('set', this.id, {errors: errors}); }, + + /** + * Set the required state for a specific field + */ + setFieldRequired(fieldName, isRequired) { + this.fieldRequiredStates[fieldName] = isRequired; + }, }, }; diff --git a/src/components/Form/FormGroup.vue b/src/components/Form/FormGroup.vue index afe9b2a1e..4f46c1d39 100644 --- a/src/components/Form/FormGroup.vue +++ b/src/components/Form/FormGroup.vue @@ -45,6 +45,7 @@ :locales="availableLocales" @change="fieldChanged" @set-errors="setFieldErrors" + @set-field-required="setFieldRequired" > @@ -60,6 +61,7 @@ :locales="availableLocales" @change="fieldChanged" @set-errors="setFieldErrors" + @set-field-required="setFieldRequired" > @@ -88,8 +90,8 @@ import FieldRadioInput from './fields/FieldRadioInput.vue'; import FieldRichTextarea from './fields/FieldRichTextarea.vue'; import FieldRichText from './fields/FieldRichText.vue'; import FieldSelect from './fields/FieldSelect.vue'; -import FieldSelectIssue from './fields/FieldSelectIssue.vue'; import FieldSelectIssues from './fields/FieldSelectIssues.vue'; +import FieldIssueSelection from './fields/FieldIssueSelection.vue'; import FieldSelectSubmissions from './fields/FieldSelectSubmissions.vue'; import FieldSelectUsers from './fields/FieldSelectUsers.vue'; import FieldShowEnsuringLink from './fields/FieldShowEnsuringLink.vue'; @@ -125,8 +127,8 @@ export default { FieldRichTextarea, FieldRichText, FieldSelect, - FieldSelectIssue, FieldSelectIssues, + FieldIssueSelection, FieldSelectSubmissions, FieldSelectUsers, FieldShowEnsuringLink, @@ -240,6 +242,13 @@ export default { } this.$emit('set-errors', {...newErrors}); }, + + /** + * Forward field required events to the form page + */ + setFieldRequired: function (fieldName, isRequired) { + this.$emit('set-field-required', fieldName, isRequired); + }, }, }; diff --git a/src/components/Form/FormPage.vue b/src/components/Form/FormPage.vue index 836b181e8..4930a3c5e 100644 --- a/src/components/Form/FormPage.vue +++ b/src/components/Form/FormPage.vue @@ -13,6 +13,7 @@ :form-id="formId" @change="fieldChanged" @set-errors="setErrors" + @set-field-required="setFieldRequired" /> diff --git a/src/components/Form/fields/FieldIssueSelection.vue b/src/components/Form/fields/FieldIssueSelection.vue new file mode 100644 index 000000000..08c640ec9 --- /dev/null +++ b/src/components/Form/fields/FieldIssueSelection.vue @@ -0,0 +1,460 @@ + + + + + diff --git a/src/components/Form/fields/FieldSelectIssue.mdx b/src/components/Form/fields/FieldSelectIssue.mdx deleted file mode 100644 index 435a37151..000000000 --- a/src/components/Form/fields/FieldSelectIssue.mdx +++ /dev/null @@ -1,23 +0,0 @@ -import { - Primary, - Controls, - Stories, - Meta, - ArgTypes, -} from '@storybook/addon-docs/blocks'; - -import * as FieldSelectIssueStories from './FieldSelectIssue.stories.js'; - - - -# FieldSelectIssue - -## Usage - -A special component for selecting an issue. When a publication is scheduled or published, this field will no longer show the selection options and will instead show a message indicating the issue it was scheduled or published in. - -In the example above, the "Assign to Issue" button will not work. This depends on the old JavaScript framework within the application. - - - - diff --git a/src/components/Form/fields/FieldSelectIssue.stories.js b/src/components/Form/fields/FieldSelectIssue.stories.js deleted file mode 100644 index e8c4c7f51..000000000 --- a/src/components/Form/fields/FieldSelectIssue.stories.js +++ /dev/null @@ -1,45 +0,0 @@ -import FieldSelectIssue from './FieldSelectIssue.vue'; -import FieldBaseMock from '../mocks/field-base'; -import FieldSelectIssueMock from '../mocks/field-select-issue'; - -export default { - title: 'Forms/FieldSelectIssue', - component: FieldSelectIssue, - render: (args) => ({ - components: {FieldSelectIssue}, - setup() { - function change(name, prop, newValue, localeKey) { - if (localeKey) { - args[prop][localeKey] = newValue; - } else { - args[prop] = newValue; - } - } - - return {args, change}; - }, - template: ` - - `, - }), -}; - -export const Base = { - args: {...FieldBaseMock, ...FieldSelectIssueMock}, -}; - -export const Published = { - args: { - ...Base.args, - publicationStatus: 3, // PKPSubmission::STATUS_PUBLISHED - value: 3, - }, -}; - -export const Scheduled = { - args: { - ...Base.args, - publicationStatus: 5, // PKPSubmission::STATUS_SCHEDULED - value: 4, - }, -}; diff --git a/src/components/Form/fields/FieldSelectIssue.vue b/src/components/Form/fields/FieldSelectIssue.vue index 9dffd4d5f..c206fb835 100644 --- a/src/components/Form/fields/FieldSelectIssue.vue +++ b/src/components/Form/fields/FieldSelectIssue.vue @@ -1,3 +1,4 @@ +