Skip to content

Commit

Permalink
Merge branch 'main' into test/forms-1547
Browse files Browse the repository at this point in the history
  • Loading branch information
nimya-aot authored Nov 6, 2024
2 parents 42bea1a + cc6a871 commit 861758a
Show file tree
Hide file tree
Showing 69 changed files with 1,868 additions and 350 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ dist
**/src/formio
**/cypress/**/videos
screenshots
downloads
node_modules

# Ignore only top-level package-lock.json
Expand Down
3 changes: 3 additions & 0 deletions app/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ const querystring = require('querystring');
const log = require('./src/components/log')(module.filename);
const httpLogger = require('./src/components/log').httpLogger;
const middleware = require('./src/forms/common/middleware');
const rateLimiter = require('./src/forms/common/middleware').apiKeyRateLimiter;
const v1Router = require('./src/routes/v1');

const DataConnection = require('./src/db/dataConnection');
Expand Down Expand Up @@ -52,6 +53,8 @@ app.use((_req, res, next) => {
}
});

app.use(config.get('server.basePath') + config.get('server.apiPath'), rateLimiter);

// Frontend configuration endpoint
apiRouter.use('/config', (_req, res, next) => {
try {
Expand Down
1 change: 1 addition & 0 deletions app/frontend/src/components/designer/FormDesigner.vue
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,7 @@ async function schemaCreateNew() {
apiIntegration: form.value.apiIntegration,
useCase: form.value.useCase,
labels: form.value.labels,
formMetadata: form.value.formMetadata,
});
// update user labels with any new added labels
if (
Expand Down
4 changes: 4 additions & 0 deletions app/frontend/src/components/designer/FormSettings.vue
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import FormAccessSettings from '~/components/designer/settings/FormAccessSetting
import FormFunctionalitySettings from '~/components/designer/settings/FormFunctionalitySettings.vue';
import FormSubmissionSettings from '~/components/designer/settings/FormSubmissionSettings.vue';
import FormScheduleSettings from '~/components/designer/settings/FormScheduleSettings.vue';
import FormMetadataSettings from '~/components/designer/settings/FormMetadataSettings.vue';
import { useFormStore } from '~/store/form';
defineProps({
Expand Down Expand Up @@ -36,6 +37,9 @@ const { form, isFormPublished, isRTL } = storeToRefs(useFormStore());
<v-col v-if="form.schedule.enabled && isFormPublished" cols="12" md="6">
<FormScheduleSettings />
</v-col>
<v-col cols="12" md="6">
<FormMetadataSettings :disabled="disabled" />
</v-col>
</v-row>
</v-container>
</template>
4 changes: 3 additions & 1 deletion app/frontend/src/components/designer/FormViewer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,9 @@ const { authenticated, keycloak, tokenParsed, user } = storeToRefs(authStore);
const { downloadedFile, isRTL } = storeToRefs(formStore);
const formScheduleExpireMessage = computed(() =>
t('trans.formViewer.formScheduleExpireMessage')
form?.value?.schedule?.message
? form.value.schedule.message
: t('trans.formViewer.formScheduleExpireMessage')
);
const formUnauthorizedMessage = computed(() =>
Expand Down
122 changes: 122 additions & 0 deletions app/frontend/src/components/designer/settings/FormMetadataSettings.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
<script setup>
import { storeToRefs } from 'pinia';
import { useI18n } from 'vue-i18n';
import { onMounted, ref } from 'vue';
import { useFormStore } from '~/store/form';
const { t, locale } = useI18n({ useScope: 'global' });
const { form, isRTL } = storeToRefs(useFormStore());
const techdocsLink =
'https://developer.gov.bc.ca/docs/default/component/chefs-techdocs/Capabilities/Integrations/Form-Metadata/';
const jsonStr = ref(null);
onMounted(async () => {
jsonStr.value = JSON.stringify(form.value.formMetadata.metadata, null, 2);
});
function toJSON(str) {
let result = null;
try {
if (Object.prototype.toString.call(str) === '[object String]') {
let o = JSON.parse(str);
// JSON.parse can return values that are strings not objects...
if (Object.prototype.toString.call(o) === '[object Object]') {
result = o;
}
}
} catch {
/* empty */
}
return result;
}
function updateMetadata(v) {
const o = toJSON(v);
if (o) {
form.value.formMetadata.metadata = JSON.parse(v);
}
}
function formatJSON(focus) {
if (!focus) {
const o = toJSON(jsonStr.value);
if (o) {
jsonStr.value = JSON.stringify(o, null, 2);
}
}
}
/* c8 ignore start */
const metadataRules = ref([
(v) => {
const o = toJSON(v);
if (o) {
return true;
}
return t('trans.formSettings.formMetadataJsonError');
},
]);
/* c8 ignore stop */
defineExpose({ jsonStr, updateMetadata, formatJSON });
</script>

<template>
<BasePanel class="fill-height">
<template #title
><span :lang="locale">{{
$t('trans.formSettings.formMetadataTitle')
}}</span></template
>
<div class="mb-6 ml-1 font-weight-bold" :lang="locale">
{{ $t('trans.formSettings.formMetadataMessage') }}
<v-tooltip location="bottom">
<template #activator="{ props }">
<v-icon
color="primary"
class="mx-1"
:class="{ 'mx-1': isRTL }"
v-bind="props"
icon="mdi:mdi-help-circle-outline"
></v-icon>
</template>
<span>
<a
:href="techdocsLink"
class="preview_info_link_field_white"
target="_blank"
:hreflang="locale"
>
{{ $t('trans.formSettings.learnMore') }}
<v-icon icon="mdi:mdi-arrow-top-right-bold-box-outline"></v-icon>
</a>
</span>
</v-tooltip>
</div>

<v-container class="px-0" :class="{ 'dir-rtl': isRTL }">
<v-row>
<v-col cols="12" md="12" class="p-0">
<v-row class="mb-0 mt-0">
<v-col class="mb-0 mt-0 pb-0 pt-0">
<v-textarea
v-model="jsonStr"
density="compact"
rows="4"
solid
variant="outlined"
auto-grow
:class="{ 'dir-rtl': isRTL, label: isRTL }"
:lang="locale"
:rules="metadataRules"
data-test="json-test"
@update:focused="formatJSON"
@update:model-value="updateMetadata"
/>
</v-col>
</v-row>
</v-col>
</v-row>
</v-container>
</BasePanel>
</template>
13 changes: 8 additions & 5 deletions app/frontend/src/internationalization/trans/chefs/ar/ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,10 @@
"eventSubscription": "اشتراك الحدث",
"validEndpointRequired": "الرجاء إدخال نقطة نهاية https://",
"validBearerTokenRequired": "89abddfb-2cff-4fda-83e6-13221f0c3d4f أدخل مثال رمز حامل صالح",
"wideFormLayout": "تخطيط نموذج واسع"
"wideFormLayout": "تخطيط نموذج واسع",
"formMetadataTitle": "بيانات تعريف النموذج",
"formMetadataMessage": "معلومات منظمة لوصف أو شرح هذا النموذج للأنظمة الخارجية. ستتضمن الاستدعاءات للأنظمة الخارجية هذه البيانات التعريفية في حمولاتها.",
"formMetadataJsonError": "يجب أن تكون البيانات الوصفية للنموذج JSON صالحة. استخدم علامات الاقتباس المزدوجة حول السمات والقيم."
},
"formProfile": {
"message": "تقوم فرق CHEFS بجمع وتنظيم المعلومات لتكون مدخلات حاسمة لصياغة حالات أعمال شاملة. ستلعب هذه الحالات دورًا حيويًا في توجيه العمليات الاستراتيجية وتحسين CHEFS المستمر في السنوات القادمة. هذه المبادرة لجمع البيانات ضرورية لإعلام القرارات الحاسمة وتشكيل مسار CHEFS ، مما يضمن قابليتها للتكيف وفعاليتها في التعامل مع الاحتياجات والتحديات المتطورة.",
Expand Down Expand Up @@ -199,7 +202,7 @@
"selectDeploymentErr": "يرجى اختيار مستوى النشر",
"selectMinistryErr": "يرجى اختيار وزارتك",
"selectUseCaseErr": "يرجى إدخال حالة استخدام النموذج الخاص بك",
"labelSizeErr":"لا يمكن أن تتجاوز التسميات 25 حرفًا"
"labelSizeErr": "لا يمكن أن تتجاوز التسميات 25 حرفًا"
},
"ministries": {
"AF": "الزراعة والغذاء (AF)",
Expand Down Expand Up @@ -266,7 +269,7 @@
"regenerate": "تجديد",
"generate": "يولد",
"secret": "سر",
"filesAPIAccess":"السماح لمفتاح API هذا بالوصول إلى الملفات المرسلة"
"filesAPIAccess": "السماح لمفتاح API هذا بالوصول إلى الملفات المرسلة"
},
"manageVersions": {
"important": "مهم!",
Expand Down Expand Up @@ -549,7 +552,7 @@
"sentUninvitedEmailTo": "أرسل بريدًا إلكترونيًا غير مدعو إلى",
"updateUserErrMsg": "حدث خطأ أثناء محاولة تحديث المستخدمين لهذا الإرسال.",
"updateUserConsoleErrMsg": "خطأ في تعيين أذونات المستخدم. Sub: {submitId} المستخدم: {userId} خطأ: {error}",
"searchInputLength": "يجب أن يكون إدخال البحث عن اسم المستخدم / البريد الإلكتروني BCeID أكبر من 6 أحرف.",
"searchInputLength": "يجب أن يكون إدخال البحث لاسم المستخدم/البريد الإلكتروني BCeID أكبر من 4 أحرف.",
"exactBCEIDSearch": "يجب أن تكون عمليات البحث في البريد الإلكتروني عن BCeID دقيقة.",
"getUsersErrMsg": "خطأ في الحصول على المستخدمين: {error}",
"exactEmailOrUsername": "أدخل البريد الإلكتروني أو اسم المستخدم بالضبط.",
Expand Down Expand Up @@ -1081,4 +1084,4 @@
"user": "مستخدم"
}
}
}
}
10 changes: 6 additions & 4 deletions app/frontend/src/internationalization/trans/chefs/de/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,10 @@
"eventSubscription": "Ereignisabonnement",
"validEndpointRequired": "Bitte geben Sie einen gültigen Endpunkt ein, beginnend mit https://",
"validBearerTokenRequired": "Bitte geben Sie ein gültiges Token ein. Beispiel: 89abddfb-2cff-4fda-83e6-13221f0c3d4f",
"wideFormLayout": "Breites Formularlayout"
"wideFormLayout": "Breites Formularlayout",
"formMetadataTitle": "Formularmetadaten",
"formMetadataMessage": "Strukturierte Informationen, um diese Form externen Systemen zu beschreiben oder zu erklären. Aufrufe an externe Systeme enthalten diese Metadaten in ihren Nutzdaten.",
"formMetadataJsonError": "Formularmetadaten müssen gültiges JSON sein. Verwenden Sie doppelte Anführungszeichen um Attribute und Werte."
},
"formProfile": {
"message": "Das CHEFS-Team sammelt und organisiert Informationen, um als entscheidende Grundlage für die Erstellung umfassender Geschäftsfälle zu dienen. Diese Fälle werden eine Schlüsselrolle dabei spielen, den strategischen Betrieb und die laufende Verbesserung von CHEFS in den kommenden Jahren zu leiten. Diese Initiative zur Datensammlung ist entscheidend, um kritische Entscheidungen zu informieren und die Trajektorie von CHEFS zu formen, um seine Anpassungsfähigkeit und Wirksamkeit bei der Bewältigung sich wandelnder Bedürfnisse und Herausforderungen zu gewährleisten.",
Expand Down Expand Up @@ -549,7 +552,7 @@
"sentUninvitedEmailTo": "Uneingeladene E-Mail an gesendet",
"updateUserErrMsg": "Beim Versuch, Benutzer für diese Übermittlung zu aktualisieren, ist ein Fehler aufgetreten.",
"updateUserConsoleErrMsg": "Fehler beim Festlegen der Benutzerberechtigungen. Sub: {submissionId} Benutzer: {userId} Fehler: {error}",
"searchInputLength": "Die Sucheingabe für BCeID-Benutzername/E-Mail-Adresse muss mehr als 6 Zeichen umfassen.",
"searchInputLength": "Die Sucheingabe für BCeID-Benutzername/E-Mail-Adresse muss mehr als 4 Zeichen umfassen.",
"exactBCEIDSearch": "E-Mail-Suchen nach BCeID müssen genau sein.",
"getUsersErrMsg": "Fehler beim Abrufen von Benutzern: {error}",
"exactEmailOrUsername": "Geben Sie eine genaue E-Mail-Adresse oder einen Benutzernamen ein.",
Expand Down Expand Up @@ -605,7 +608,6 @@
"note": "Notiz",
"maxChars": "Maximal 4000 Zeichen",
"totalNotes": "Gesamtanzahl Notizen:"

},
"statusPanel": {
"currentStatus": "Aktueller Status:",
Expand Down Expand Up @@ -1082,4 +1084,4 @@
"user": "Benutzer"
}
}
}
}
7 changes: 5 additions & 2 deletions app/frontend/src/internationalization/trans/chefs/en/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,10 @@
"eventSubscription": "Event Subscription",
"validEndpointRequired": "Please enter a valid endpoint starting with https://",
"validBearerTokenRequired": "Enter a valid bearer token example: 89abddfb-2cff-4fda-83e6-13221f0c3d4f",
"wideFormLayout": "Wide Form Layout"
"wideFormLayout": "Wide Form Layout",
"formMetadataTitle": "Form Metadata",
"formMetadataMessage": "Structured information to describe or explain this form to external systems. Calls to external systems will include this metadata in their payloads.",
"formMetadataJsonError": "Form metadata must be valid JSON. Use double-quotes around attributes and values."
},
"formProfile": {
"message": "The CHEFS team is collecting and organizing information to serve as crucial input for crafting comprehensive business cases. These cases will play a pivotal role in guiding the strategic operation and ongoing improvement of CHEFS in the coming years. This initiative to gather data is essential for informing critical decisions and molding the trajectory of CHEFS, ensuring its adaptability and effectiveness in addressing evolving needs and challenges.",
Expand Down Expand Up @@ -595,7 +598,7 @@
"sentUninvitedEmailTo": "Sent uninvited email to",
"updateUserErrMsg": "An error occurred while trying to update users for this submission.",
"updateUserConsoleErrMsg": "Error setting user permissions. Sub: {submissionId} User: {userId} Error: {error}",
"searchInputLength": "Search input for BCeID username/email must be greater than 6 characters.",
"searchInputLength": "Search input for BCeID username/email must be greater than 4 characters.",
"exactBCEIDSearch": "Email searches for BCeID must be exact.",
"getUsersErrMsg": "Error getting users: {error}",
"exactEmailOrUsername": "Enter an exact email or username.",
Expand Down
9 changes: 6 additions & 3 deletions app/frontend/src/internationalization/trans/chefs/es/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,10 @@
"eventSubscription": "Suscripción a eventos",
"validEndpointRequired": "Ingrese un punto final válido que comience con https://",
"validBearerTokenRequired": "Introduzca un ejemplo de token de portador válido: 89abddfb-2cff-4fda-83e6-13221f0c3d4f",
"wideFormLayout": "Diseño de formulario amplio"
"wideFormLayout": "Diseño de formulario amplio",
"formMetadataTitle": "Metadatos del formulario",
"formMetadataMessage": "Información estructurada para describir o explicar este formulario a sistemas externos. Las llamadas a sistemas externos incluirán estos metadatos en sus cargas útiles.",
"formMetadataJsonError": "Los metadatos del formulario deben ser JSON válidos. Utilice comillas dobles alrededor de atributos y valores."
},
"formProfile": {
"message": "El equipo de CHEFS está recopilando y organizando información para servir como entrada crucial para la elaboración de casos de negocio integrales. Estos casos jugarán un papel fundamental en la guía de la operación estratégica y la mejora continua de CHEFS en los próximos años. Esta iniciativa de recopilación de datos es esencial para informar decisiones críticas y dar forma a la trayectoria de CHEFS, asegurando su adaptabilidad y efectividad para abordar necesidades y desafíos en constante evolución.",
Expand Down Expand Up @@ -549,7 +552,7 @@
"sentUninvitedEmailTo": "Enviado correo electrónico no invitado a",
"updateUserErrMsg": "Se produjo un error al intentar actualizar los usuarios para este envío.",
"updateUserConsoleErrMsg": "Error al establecer los permisos de usuario. Sub: {submissionId} Usuario: {userId} Error: {error}",
"searchInputLength": "La entrada de búsqueda para el nombre de usuario/correo electrónico de BCeID debe tener más de 6 caracteres.",
"searchInputLength": "La entrada de búsqueda para el nombre de usuario/correo electrónico de BCeID debe tener más de 4 caracteres.",
"exactBCEIDSearch": "Las búsquedas de correo electrónico para BCeID deben ser exactas.",
"getUsersErrMsg": "Error al obtener usuarios: {error}",
"exactEmailOrUsername": "Ingrese un correo electrónico o nombre de usuario exacto.",
Expand Down Expand Up @@ -1081,4 +1084,4 @@
"user": "Usuario"
}
}
}
}
11 changes: 7 additions & 4 deletions app/frontend/src/internationalization/trans/chefs/fa/fa.json
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,10 @@
"eventSubscription": "اشتراک رویداد",
"validEndpointRequired": "لطفاً یک نقطه پایان معتبر که با شروع آن شروع می شود وارد کنید https://",
"validBearerTokenRequired": "89abddfb-2cff-4fda-83e6-13221f0c3d4f یک نمونه توکن حامل معتبر وارد کنید",
"wideFormLayout": "طرح فرم گسترده"
"wideFormLayout": "طرح فرم گسترده",
"formMetadataTitle": "فراداده فرم",
"formMetadataMessage": "اطلاعات ساختاریافته برای توصیف یا توضیح این فرم برای سیستم های خارجی. تماس‌ها با سیستم‌های خارجی این ابرداده را در محموله‌های خود شامل می‌شوند.",
"formMetadataJsonError": "فراداده فرم باید JSON معتبر باشد. از دو نقل قول در مورد ویژگی ها و مقادیر استفاده کنید."
},
"formProfile": {
"message": "تیم CHEFS اطلاعات را جمع آوری و سازماندهی می‌کند تا به عنوان ورودی حیاتی برای ساخت مورد کارهای تجاری جامع عمل کند. این موارد نقش کلیدی در راهنمایی عملیات استراتژیک و بهبود مستمر CHEFS در سال‌های آینده خواهند داشت. این اقدام برای جمع‌آوری داده‌ها برای اطلاع از تصمیمات حیاتی و شکل‌دهی مسیر CHEFS جهت اطمینان از قابلیت تطبیق و کارایی آن در مواجهه با نیازها و چالش‌های در حال تحول حیاتی است.",
Expand Down Expand Up @@ -266,7 +269,7 @@
"regenerate": "بازسازی کنید",
"generate": "تولید می کنند",
"secret": "راز",
"filesAPIAccess":"به این کلید API اجازه دهید به فایل های ارسالی دسترسی داشته باشد"
"filesAPIAccess": "به این کلید API اجازه دهید به فایل های ارسالی دسترسی داشته باشد"
},
"manageVersions": {
"important": "مهم!",
Expand Down Expand Up @@ -549,7 +552,7 @@
"sentUninvitedEmailTo": "ایمیل ناخوانده به",
"updateUserErrMsg": "هنگام تلاش برای به‌روزرسانی کاربران برای این ارسال، خطایی روی داد.",
"updateUserConsoleErrMsg": "خطا در تنظیم مجوزهای کاربر. فرعی: {submissionId} کاربر: {userId} خطا: {error}",
"searchInputLength": "ورودی جستجو برای نام کاربری/ایمیل BCeID باید بیشتر از 6 کاراکتر باشد.",
"searchInputLength": "ورودی جستجو برای نام کاربری/ایمیل BCeID باید بیشتر از 4 کاراکتر باشد.",
"exactBCEIDSearch": "جستجوی ایمیل برای BCeID باید دقیق باشد.",
"getUsersErrMsg": "خطا در دریافت کاربران: {error}",
"exactEmailOrUsername": "یک ایمیل یا نام کاربری دقیق وارد کنید.",
Expand Down Expand Up @@ -1081,4 +1084,4 @@
"user": "کاربر"
}
}
}
}
Loading

0 comments on commit 861758a

Please sign in to comment.