rentgen/report-window/email-template-3-controls.tsx

408 lines
17 KiB
TypeScript
Raw Normal View History

2022-01-30 17:36:42 +01:00
import React from 'react';
2022-02-03 22:20:07 +01:00
import * as Survey from 'survey-react';
2022-01-30 17:36:42 +01:00
import { toBase64 } from '../util';
import emailHostSettings from './email-host-settings';
2022-01-30 17:36:42 +01:00
import { EmailTemplate3Config } from './email-template-3';
2022-02-06 17:05:33 +01:00
import verbs from './verbs';
2022-01-30 17:36:42 +01:00
2022-02-07 14:44:32 +01:00
function generateHostPage(
host: string,
index: number,
all_hosts: string[]
): { title: string; elements: any[] } {
function f(name: string, h = host) {
return `${h.replace(/\./g, '_')}|${name}`;
}
const previous_host: string | null = index > 0 ? all_hosts[index - 1] : null;
function defaultValue(name: string) {
if (!previous_host) {
return {};
}
return { defaultValueExpression: `{${f(name, previous_host)}}` };
}
return {
title: host,
elements: [
{
type: 'dropdown',
name: f('present'),
isRequired: true,
title: `Cel ujawnienia danych właścicielowi domeny ${host}`,
...defaultValue('present'),
choices: [
{ value: 'not_mentioned', text: 'nie jest podany nigdzie na stronie' },
{
value: 'mentioned_in_policy',
text: 'jest podany w polityce prywatności',
visibleIf: "{policy_readable} = 'yes' ",
},
{ value: 'mentioned_in_popup', text: 'jest podany w okienku RODO' },
],
},
{
type: 'dropdown',
name: f('legal_basis_type'),
...defaultValue('legal_basis_type'),
isRequired: true,
title: `Podstawa prawna dla tego konkretnego celu`,
visibleIf: `{${f('present')}} notempty and {${f('present')}} != "not_mentioned"`,
choices: [
{ value: 'consent', text: 'to zgoda.' },
{
value: 'legitimate_interest',
text: 'to uzasadniony interes.',
},
{ value: 'not_mentioned', text: 'nie jest wskazana nigdzie na stronie.' },
],
},
{
type: 'radiogroup',
name: f('consent_problems'),
...defaultValue('consent_problems'),
isRequired: true,
title: `Jak ma się ta podstawa prawna do stanu faktycznego?`,
visibleIf: `{${f('legal_basis_type')}} = "consent"`,
choices: [
{
value: 'claims_consent_but_sends_before_consent',
text: `Strona wysłała {moje} dane do ${host} zanim {wyraziłem} na to zgodę`,
},
{
value: 'claims_consent_but_there_was_no_easy_refuse',
text: '{Kliknąłem} przycisk od wyrażania zgody, ale w okienku o zgodę nie było natychmiastowo dostępnego przycisku do niewyrażenia zgody jednym kliknięciem',
},
{ value: 'none', text: 'żadne z powyższych.' },
],
},
{
type: 'dropdown',
name: f('legitimate_interest_activity_specified'),
...defaultValue('legitimate_interest_activity_specified'),
isRequired: true,
title: /* HTML */ `Czy administrator strony opisał szczegółowo, na czym polega
uzasadniony interes w kontekście tego celu?`,
visibleIf: `{${f('legal_basis_type')}} = "legitimate_interest"`,
choices: [
{
value: 'precise',
text: /* HTML */ `Tak, wskazuje jasno na bieżące działania lub korzyści
wynikające z takiego przetwarzania danych.`,
},
{
value: 'vague',
text: `Wskazuje tylko ogólnie, jak np. „marketing” czy „statystyki”.`,
},
{
value: 'no',
text: `Nie. Nie wiadomo, na czym ten uzasadniony interes polega.`,
},
],
},
{
type: 'text',
title: `Jak administrator opisał to, na czym polega uzasadniony interes w kontekście ${host}?`,
name: f('legitimate_interest_description'),
visibleIf: `{${f('legitimate_interest_activity_specified')}} = 'vague'`,
defaultValueExpression:
index == 0
? 'marketing'
: `{${f('legitimate_interest_description', previous_host)}}`,
},
{
type: 'dropdown',
title: `Czy domena ${host} należy do podmiotu spoza Europy (np. Google, Facebook)?`,
name: f('outside_eu'),
...defaultValue('outside_eu'),
visibleIf: `{${f('legitimate_interest_activity_specified')}} = "precise" or {${f(
'consent_problems'
)}} = "none"`,
choices: [
{ value: 'yes', text: 'Tak' },
{ value: 'no', text: 'Nie' },
{ value: 'not_sure', text: 'Nie wiem' },
],
},
],
};
}
export default function EmailTemplate3Controls({ hosts }: { hosts: string[] }) {
const [survey, setSurvey] = React.useState<Survey.Model>(null);
React.useEffect(() => {
var json = {
showQuestionNumbers: 'off',
showProgressBar: 'top',
pages: [
2022-02-06 17:05:33 +01:00
{
2022-02-07 14:44:32 +01:00
title: 'Zaimki',
elements: [
{
type: 'dropdown',
name: 'zaimek',
title: 'Forma czasownika:',
isRequired: true,
choices: [
{ value: 0, text: 'Wysłałem' },
{ value: 1, text: 'Wysłałam' },
{ value: 2, text: 'Wysłałom' },
{ value: 3, text: 'Wysłaliśmy' },
],
},
2022-02-06 17:05:33 +01:00
],
},
{
2022-02-07 14:44:32 +01:00
title: 'Obowiązek informacyjny i machanizm pozyskiwania zgody',
elements: [
{
type: 'radiogroup',
title: 'Jaką formę informacji o przetwarzaniu danych osobowych stosuje ta strona?',
name: 'popup_type',
isRequired: true,
choices: [
{ value: 'none', text: 'Brak informacji' },
{
value: 'passive_popup',
text: /* HTML */ `Okienko o cookiesach, bez możliwości podjęcia
żadnego wyboru (np. tylko opcja zamknij)`,
},
{
value: 'some_choice',
text: 'Okienko o cookiesach, z możliwością podjęcia wyboru',
},
],
},
2022-02-06 17:05:33 +01:00
{
2022-02-07 14:44:32 +01:00
type: 'checkbox',
title: /* HTML */ `Istnieje możliwość, że okienko z informacjami i
wyborami dotyczącymi przetwarzania {Twoich} danych osobowych ukazało się
dawno temu w trakcie {twojej} wcześniejszej wizyty i wtedy je
{odkliknąłeś}. {Otwórz} samą stronę w Trybie Prywatnym (Incognito).
Co {widzisz}?`,
visibleIf: "{popup_type} = 'none'",
name: 'is_incognito_different',
isRequired: true,
choices: [
{
value: 'incognito_is_the_same',
text: 'W Trybie prywatnym {widzę} to samo, co {widziałem} w normalnym trybie',
},
],
2022-02-06 17:05:33 +01:00
},
{
2022-02-07 14:44:32 +01:00
type: 'html',
visibleIf: '{is_incognito_different} != "no" and {popup_type} = "none"',
html: /* HTML */ `Jeżeli w trybie incognito widzisz więcej okienek z
informacjami o przetwarzaniu danych osobowych, wykonaj analizę w
normalnym trybie ponownie - ale najpierw usuń pliki cookies tej
strony.
<a
href="https://support.mozilla.org/pl/kb/usuwanie-ciasteczek-i-danych-stron-firefox?redirectslug=usuwanie-ciasteczek&redirectlocale=pl"
target="_blank"
>
Zobacz, jak to zrobić
</a>`,
},
{
type: 'radiogroup',
name: 'mentions_passive_consent',
isRequired: true,
visibleIf: '{popup_type} = "passive_popup"',
title: 'Czy treść okienka wskazuje na zgodę wyrażoną pasywnie, np. „Korzystając z naszej strony wyrażasz zgodę” lub „Brak zmiany ustawień przeglądarki oznacza zgodę”?',
choices: [
{
value: 'yes',
text: 'Tak',
},
{
value: 'no',
text: 'Nie',
},
],
},
],
},
{
title: 'Polityka prywatności',
elements: [
{
type: 'dropdown',
title: 'Czy polityka prywatności jest dostępna i czytelna?',
name: 'policy_readable',
isRequired: true,
choices: [
{ value: 'yes', text: 'dostępna i czytelna' },
{
value: 'entirely_obscured_by_popup',
text: 'dostępna, ale nieczytelna. Zasłania ją popup o RODO',
},
{
value: 'cant_find',
text: `Niedostępna. {Szukałem}, ale nie {znalazłem} jej na stronie`,
},
],
2022-02-06 17:05:33 +01:00
},
],
},
2022-02-07 14:44:32 +01:00
...hosts.map(generateHostPage),
2022-02-06 17:05:33 +01:00
],
2022-02-07 14:44:32 +01:00
};
2022-02-03 22:20:07 +01:00
2022-02-07 14:44:32 +01:00
console.log(json);
const survey = new Survey.Model(json);
survey.onProcessTextValue.add(function (
sender: Survey.SurveyModel,
options: { name: string; value?: string }
) {
if (verbs[options.name.toLowerCase()]) {
options.value = verbs[options.name.toLowerCase()][sender.valuesHash.zaimek];
if (options.name[0] == options.name[0].toUpperCase()) {
options.value = [
options.value[0].toUpperCase(),
...options.value.slice(1),
].join('');
}
}
});
setSurvey(survey);
}, []);
if (!survey) {
return <div>Wczytywanie...</div>;
2022-02-06 17:05:33 +01:00
}
2022-02-03 22:20:07 +01:00
return <Survey.Survey model={survey} />;
}
export function _EmailTemplate3Controls({
2022-01-30 17:36:42 +01:00
config,
setConfig,
}: {
config: EmailTemplate3Config;
setConfig: React.Dispatch<React.SetStateAction<EmailTemplate3Config>>;
}): JSX.Element {
return (
<div>
{emailHostSettings(config, setConfig)}
2022-01-30 17:36:42 +01:00
<div>
<label htmlFor="poup_type">Typ okienka o RODO: </label>
<select
id="poup_type"
value={config.popup_type}
onChange={(e) =>
setConfig((v) => ({
...v,
popup_type: e.target.value as EmailTemplate3Config['popup_type'],
}))
}
>
<option value="none">Brak jakiejkolwiek informacji</option>
<option value="passive_cookie_banner">
Pasywne powiadomienie o cookiesach
</option>
<option value="consent">Okienko z pytaniem o zgodę</option>
</select>
</div>
{config.popup_type !== 'none' ? (
<div>
<label htmlFor="popup_screenshot">Zrzut ekranu okienka o RODO:</label>
<input
{...{
type: 'file',
id: 'popup_screenshot',
onChange: async (e) => {
const popup_screenshot_base64 = await toBase64(e.target.files[0]);
setConfig((v) => ({
...v,
popup_screenshot_base64,
}));
},
}}
/>
</div>
) : (
''
)}
<div>
<label htmlFor="popup_action">Czy coś klikn*ł*m w informacjach o RODO?</label>
<select
id="popup_action"
value={config.popup_type}
onChange={(e) =>
setConfig((v) => ({
...v,
popup_action: e.target.value as EmailTemplate3Config['popup_action'],
}))
}
>
<option value="ignored">Nic nie klin*ł*m</option>
<option value="accepted">Kliknięte {config.popup_accept_all_text}</option>
<option value="closed">Zamkn*ł*m okienko (np. przyciskiem "X")</option>
</select>
</div>
{config.popup_action === 'closed' ? (
<div>
<label htmlFor="popup_closed_how">Jak okienko zostało zamknięte? Poprzez</label>
<input
id="popup_closed_how"
type="text"
placeholder="kliknięcie przycisku „X”"
value={config.popup_closed_how}
style={{ width: '300px' }}
onChange={(e) =>
setConfig((v) => ({
...v,
popup_closed_how: e.target.value,
}))
}
/>
</div>
) : (
''
)}
{config.popup_type !== 'none' ? (
<div>
<input
type="checkbox"
id="popup_mentions_passive_consent"
checked={config.popup_mentions_passive_consent}
onChange={(e) =>
setConfig((v) => ({
...v,
popup_mentions_passive_consent: e.target.checked,
}))
}
/>
<label htmlFor="popup_mentions_passive_consent">
okienko wspomina o pasywnej zgodzie (np. korzystając ze strony wyrażasz
zgodę)
</label>
</div>
) : (
''
)}
{config.popup_mentions_passive_consent ? (
<div>
<label htmlFor="popup_passive_consent_text">
Jak okienko próbuje wmówić Ci, że wyrażasz zgodę? Przeklej z treści okienka:
</label>
<input
id="popup_passive_consent_text"
placeholder="Korzystając ze strony wyrażasz zgodę"
value={config.popup_passive_consent_text}
onChange={(e) =>
setConfig((v) => ({
...v,
popup_passive_consent_text: e.target.value,
}))
}
/>
</div>
) : (
''
)}
</div>
);
}