Skip to content
Snippets Groups Projects
Commit acf7a622 authored by Bjarke Madsen's avatar Bjarke Madsen
Browse files

Override data protection contact validation in new validation function

parent aff8006e
No related branches found
No related tags found
No related merge requests found
...@@ -11,27 +11,56 @@ import "survey-core/modern.min.css"; ...@@ -11,27 +11,56 @@ import "survey-core/modern.min.css";
import './survey.scss'; import './survey.scss';
import useMatomo from "../matomo/UseMatomo"; import useMatomo from "../matomo/UseMatomo";
import { FunctionFactory } from "survey-core"; import { FunctionFactory } from "survey-core";
import { validationFunctions } from "./validation/validation";
function validateWebsiteUrl(params) {
const value = params[0];
const nonEmpty = params[1] || false;
if (!nonEmpty && (value === undefined || value == null)) { interface ValidationQuestion {
return true; name?: string;
} value?: any;
data?: ValidationQuestion;
}
// Overrides for questions that need to be validated differently from the default expression in their group
const questionOverrides = {
data_protection_contact: (...args) => true, // don't validate the contact field, anything goes..
}
function validateQuestion(this: { question: ValidationQuestion, row?: any }, params: any) {
try { try {
if (value.includes(" ")) { const question = this.question;
return false; const validator = params[0] || undefined;
const matrix = question.data && 'name' in question.data;
let questionName;
if (matrix) {
questionName = question.data!.name;
} else {
questionName = question.name;
}
const value = question.value
const hasOverride = questionOverrides[questionName];
if (hasOverride) {
return hasOverride(value, ...params.slice(1));
} }
const url = new URL(value); const validationFunction = validationFunctions[validator];
return !!url if (!validationFunction) {
} catch (err) { throw new Error(`Validation function ${validator} not found for question ${questionName}`);
}
return validationFunction(value, ...params.slice(1));
} catch (e) {
console.error(e);
return false; return false;
} }
} }
Serializer.addProperty("itemvalue", "customDescription:text"); Serializer.addProperty("itemvalue", "customDescription:text");
Serializer.addProperty("question", "hideCheckboxLabels:boolean"); Serializer.addProperty("question", "hideCheckboxLabels:boolean");
...@@ -41,8 +70,8 @@ function SurveyContainerComponent({ loadFrom }) { ...@@ -41,8 +70,8 @@ function SurveyContainerComponent({ loadFrom }) {
const { year, nren } = useParams(); // nren stays empty for inspect and try const { year, nren } = useParams(); // nren stays empty for inspect and try
const [error, setError] = useState<string>('loading survey...'); const [error, setError] = useState<string>('loading survey...');
if (!FunctionFactory.Instance.hasFunction("validateWebsiteUrl")) { if (!FunctionFactory.Instance.hasFunction("validateQuestion")) {
FunctionFactory.Instance.register("validateWebsiteUrl", validateWebsiteUrl); FunctionFactory.Instance.register("validateQuestion", validateQuestion);
} }
const { trackPageView } = useMatomo(); const { trackPageView } = useMatomo();
......
function validateWebsiteUrl(value, nonEmpty = false) {
if (!nonEmpty && (value === undefined || value == null)) {
return true;
}
try {
value = value.trim();
if (value.includes(" ")) {
return false;
}
const url = new URL(value);
return !!url
} catch (err) {
return false;
}
}
export const validationFunctions = {
validateWebsiteUrl,
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment