diff --git a/.codeclimate.yml b/.codeclimate.yml index c81eb7960..9b1220682 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -1,18 +1,19 @@ version: "2" exclude_patterns: + - components/ - config/ - - "**/db/" - dist/ - features/ - - "**/node_modules/" - script/ + - Tests/ + - "**/*.d.ts" + - "**/*_test.go" + - "**/db/" + - "**/node_modules/" - "**/spec/" - "**/test/" - "**/tests/" - - Tests/ - "**/vendor/" - - "**/*_test.go" - - "**/*.d.ts" plugins: csslint: enabled: true diff --git a/.github/workflows/unit-tests.yaml b/.github/workflows/unit-tests.yaml index 9e03ebfea..407a63a58 100644 --- a/.github/workflows/unit-tests.yaml +++ b/.github/workflows/unit-tests.yaml @@ -142,5 +142,5 @@ jobs: CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }} with: coverageLocations: | - ${{ github.workspace }}/**/lcov.info:lcov + ${{ github.workspace }}/**/clover.xml:clover prefix: ${{ github.workplace }} diff --git a/app/frontend/src/components/designer/settings/FormScheduleSettings.vue b/app/frontend/src/components/designer/settings/FormScheduleSettings.vue index 872bc187d..68909117f 100644 --- a/app/frontend/src/components/designer/settings/FormScheduleSettings.vue +++ b/app/frontend/src/components/designer/settings/FormScheduleSettings.vue @@ -555,7 +555,7 @@ defineExpose({ cols="12" md="12" > - + {{ $t('trans.formSettings.submissionsOpenDateRange') }} {{ form.schedule.openSubmissionDateTime }} {{ $t('trans.formSettings.to') }} @@ -567,9 +567,7 @@ defineExpose({ AVAILABLE_DATES[0]['closeDate'] && AVAILABLE_DATES[0]['closeDate'].split(' ')[0] : '' - }} - - {{ + }}{{ form.schedule.scheduleType === SCHEDULE_TYPE.CLOSINGDATE ? form.schedule.closeSubmissionDateTime : '' @@ -577,11 +575,13 @@ defineExpose({ - {{ + {{ form.schedule.allowLateSubmissions.enabled && form.schedule.allowLateSubmissions.forNext.intervalType && form.schedule.allowLateSubmissions.forNext.term - ? $t('trans.formSettings.allowLateSubmissnInterval') + + ? ' ' + + $t('trans.formSettings.allowLateSubmissnInterval') + + ' ' + form.schedule.allowLateSubmissions.forNext.term + ' ' + form.schedule.allowLateSubmissions.forNext.intervalType + @@ -599,9 +599,11 @@ defineExpose({ AVAILABLE_DATES[1] " :lang="locale" - >{{ $t('trans.formSettings.scheduleRepetition') }} - {{ form.schedule.repeatSubmission.everyTerm }} - {{ form.schedule.repeatSubmission.everyIntervalType }} + >{{ ' ' + $t('trans.formSettings.scheduleRepetition') }} + + {{ form.schedule.repeatSubmission.everyTerm }} + {{ form.schedule.repeatSubmission.everyIntervalType }} + {{ $t('trans.formSettings.until') }} {{ form.schedule.repeatSubmission.repeatUntil }}. diff --git a/app/frontend/src/components/forms/manage/TeamManagement.vue b/app/frontend/src/components/forms/manage/TeamManagement.vue index 335e9b1a4..bd9a8d927 100644 --- a/app/frontend/src/components/forms/manage/TeamManagement.vue +++ b/app/frontend/src/components/forms/manage/TeamManagement.vue @@ -295,6 +295,7 @@ function addNewUsers(users, roles) { notificationStore.addNotification({ text: `${user.username}@${user.idpCode}` + + ' ' + t('trans.teamManagement.idpMessage'), }); } diff --git a/app/frontend/src/components/forms/submission/ManageSubmissionUsers.vue b/app/frontend/src/components/forms/submission/ManageSubmissionUsers.vue index d14b40971..b62ce74e7 100644 --- a/app/frontend/src/components/forms/submission/ManageSubmissionUsers.vue +++ b/app/frontend/src/components/forms/submission/ManageSubmissionUsers.vue @@ -174,8 +174,10 @@ async function modifyPermissions(userId, permissions) { ...NotificationTypes.SUCCESS, text: permissions.length ? t('trans.manageSubmissionUsers.sentInviteEmailTo') + + ' ' + `${selectedEmail}` : t('trans.manageSubmissionUsers.sentUninvitedEmailTo') + + ' ' + `${selectedEmail}`, }); } diff --git a/app/frontend/tests/unit/components/designer/settings/FormScheduleSettings.spec.js b/app/frontend/tests/unit/components/designer/settings/FormScheduleSettings.spec.js index 5c3ec9f1e..f0a8845ae 100644 --- a/app/frontend/tests/unit/components/designer/settings/FormScheduleSettings.spec.js +++ b/app/frontend/tests/unit/components/designer/settings/FormScheduleSettings.spec.js @@ -4,6 +4,8 @@ import { setActivePinia } from 'pinia'; import moment from 'moment'; import { beforeEach, describe, expect, it } from 'vitest'; import { ref } from 'vue'; +import { useI18n } from 'vue-i18n'; +const { t } = useI18n({ useScope: 'global' }); import { useFormStore } from '~/store/form'; import FormScheduleSettings from '~/components/designer/settings/FormScheduleSettings.vue'; @@ -749,4 +751,76 @@ describe('FormScheduleSettings.vue', () => { expect(wrapper.vm.AVAILABLE_PERIOD_OPTIONS).toEqual(['quarters', 'years']); }); + + it('renders submission schedule and late submission text with correct spacing', async () => { + const TODAY = moment().format('YYYY-MM-DD HH:MM:SS'); + const wrapper = mount(FormScheduleSettings, { + global: { + plugins: [pinia], + stubs: { + BaseInfoCard: { + name: 'BaseInfoCard', + template: '
', + }, + BasePanel: { + name: 'BasePanel', + template: '
', + }, + }, + }, + }); + + // Set up the form store with necessary data + const formStore = useFormStore(); + formStore.form = { + schedule: { + enabled: true, + openSubmissionDateTime: TODAY, + closeSubmissionDateTime: moment(TODAY).add(2, 'days').format('YYYY-MM-DD HH:MM:SS'), + scheduleType: ScheduleType.CLOSINGDATE, + allowLateSubmissions: { + enabled: true, + forNext: { + term: 2, + intervalType: 'days' + } + } + } + }; + + await flushPromises(); + + // Check submission schedule text + const submissionScheduleText = wrapper.find('[data-test="submission-schedule-text"]'); + expect(submissionScheduleText.exists()).toBe(true); + + const scheduleTextContent = submissionScheduleText.text(); + expect(scheduleTextContent).toContain(t('trans.formSettings.submissionsOpenDateRange')); + expect(scheduleTextContent).toContain(TODAY); + expect(scheduleTextContent).toContain(t('trans.formSettings.to')); + expect(scheduleTextContent).toContain(formStore.form.schedule.closeSubmissionDateTime); + + // Check that there's exactly one space before and after the "to" text + const toIndex = scheduleTextContent.indexOf(t('trans.formSettings.to')); + expect(scheduleTextContent[toIndex - 1]).toBe(' '); + expect(scheduleTextContent[toIndex + t('trans.formSettings.to').length]).toBe(' '); + + // Check late submission text + const lateSubmissionText = wrapper.find('[data-test="late-submission-text"]'); + expect(lateSubmissionText.exists()).toBe(true); + + const lateTextContent = lateSubmissionText.text(); + const expectedLateText = `${t('trans.formSettings.allowLateSubmissnInterval')} 2 days.`; + expect(lateTextContent).toBe(expectedLateText); + + // Check that there's exactly one space before and after the term and interval type + const termIndex = lateTextContent.indexOf('2'); + expect(lateTextContent[termIndex - 1]).toBe(' '); + expect(lateTextContent[termIndex + 1]).toBe(' '); + + const intervalTypeIndex = lateTextContent.indexOf('days'); + expect(lateTextContent[intervalTypeIndex - 1]).toBe(' '); + expect(lateTextContent[intervalTypeIndex + 4]).toBe('.'); + }); + }); diff --git a/app/frontend/tests/unit/components/forms/manage/TeamManagement.spec.js b/app/frontend/tests/unit/components/forms/manage/TeamManagement.spec.js index c166430e6..79ff2df6f 100644 --- a/app/frontend/tests/unit/components/forms/manage/TeamManagement.spec.js +++ b/app/frontend/tests/unit/components/forms/manage/TeamManagement.spec.js @@ -902,7 +902,7 @@ describe('TeamManagement.vue', () => { expect(addNotificationSpy).toBeCalledTimes(1); expect(addNotificationSpy).toBeCalledWith({ - text: `${IDIR_USER.username}@${IDIR_USER.idpCode}trans.teamManagement.idpMessage`, + text: `${IDIR_USER.username}@${IDIR_USER.idpCode} trans.teamManagement.idpMessage`, }); }); diff --git a/app/frontend/tests/unit/components/forms/submission/ManageSubmissionUsers.spec.js b/app/frontend/tests/unit/components/forms/submission/ManageSubmissionUsers.spec.js index bfb3ff7c0..d62b1d979 100644 --- a/app/frontend/tests/unit/components/forms/submission/ManageSubmissionUsers.spec.js +++ b/app/frontend/tests/unit/components/forms/submission/ManageSubmissionUsers.spec.js @@ -294,7 +294,7 @@ describe('ManageSubmissionUsers.vue', () => { expect(addNotificationSpy).toHaveBeenCalledWith({ color: 'success', icon: 'mdi:mdi-check-circle', - text: 'trans.manageSubmissionUsers.sentInviteEmailTojohn@email.com', + text: 'trans.manageSubmissionUsers.sentInviteEmailTo john@email.com', type: 'success', }); });