From fe9f5eba864f8281b5c96d5f7b61bb20cf5ff0cb Mon Sep 17 00:00:00 2001 From: jakubfiala Date: Sat, 25 Oct 2025 15:48:39 +0200 Subject: [PATCH 01/16] member registration form init --- .../MemberRegistrationCard.tsx | 333 ++++++++++++++++-- tapir/accounts/ical.py | 20 ++ tapir/core/apps.py | 7 + .../locale/de/LC_MESSAGES/djangojs.po | 140 ++++++-- vite.config.ts | 8 +- 5 files changed, 447 insertions(+), 61 deletions(-) create mode 100644 tapir/accounts/ical.py diff --git a/src/member_registration/MemberRegistrationCard.tsx b/src/member_registration/MemberRegistrationCard.tsx index 4d6c566d8..5cdfbb7f2 100644 --- a/src/member_registration/MemberRegistrationCard.tsx +++ b/src/member_registration/MemberRegistrationCard.tsx @@ -3,14 +3,34 @@ import { Card, Form } from "react-bootstrap"; import { useApi } from "../hooks/useApi.ts"; import { CoopApi } from "../api-client"; import TapirButton from "../components/TapirButton.tsx"; -import { Floppy } from "react-bootstrap-icons"; +import { ChevronLeft, ChevronRight, Send } from "react-bootstrap-icons"; declare let gettext: (english_text: string) => string; +const SHARE_PRICE = 100; + +enum RegistrationStage { + ONE, + TWO, +} + const MemberRegistrationCard: React.FC = () => { const coopApi = useApi(CoopApi); + const [name, setName] = useState(""); + const [preferredName, setPreferredName] = useState(""); + const [companyName, setCompanyName] = useState(""); + const [pronouns, setPronouns] = useState(""); const [email, setEmail] = useState(""); + const [street, setStreet] = useState(""); + const [city, setCity] = useState(""); + const [postcode, setPostcode] = useState(""); + const [country, setCountry] = useState(""); + const [dob, setDOB] = useState(""); + const [shares, setShares] = useState(1); const [loading, setLoading] = useState(false); + const [isCompany, setIsCompany] = useState(null); + const [isInvesting, setIsInvesting] = useState(false); + const [stage, setStage] = useState(RegistrationStage.ONE); function onConfirmRegister() { setLoading(true); @@ -34,37 +54,304 @@ const MemberRegistrationCard: React.FC = () => { .catch((error) => { alert("Request failed! Check the console log"); console.error(error); - }); + }) + .finally(() => setLoading(false)); } return ( -
{gettext("Member self register")}
+
{gettext("Become a SuperCoop Member!")}
-
Hello Hackathon :)
-
- - E-Mail - setEmail(event.target.value)} +
+

+ - -

-
- +

+

+ {gettext(` + Welcome to SuperCoop! We're excited to welcome you as a new member of our cooperative. + Please fill out the form below so we can process your application. + `)} +

+
+ {stage === RegistrationStage.ONE && ( + <> + +
+ {gettext("Are you joining as an individual or company?")} +
+ { + setIsCompany(!event.target.checked); + }} + required + /> + { + setIsCompany(event.target.checked); + setIsInvesting(event.target.checked); + }} + required + /> +
+ {isCompany !== null && ( + <> +
+ {gettext("Choose your entry shares")} +
+ + + {gettext("How many shares would you like to join with?")} + + + setShares(parseInt(event.target.value)) + } + required + /> +

+ {gettext("You are joining with")}{" "} + {shares * SHARE_PRICE}€{" "} + {gettext("worth of shares.")} +

+
+
+ {gettext("Choose your membership type")} +
+ + + setIsInvesting(!event.target.checked) + } + required + /> + setIsInvesting(event.target.checked)} + required + /> + +

Erklärung

+
{gettext("Personal details")}
+ + {gettext("What is your name?")} + setName(event.target.value)} + autoComplete="name" + required + /> + + {!isCompany && ( + <> + + + {gettext( + "How would you like to be addressed? (optional)", + )} + + + setPreferredName(event.target.value) + } + /> + + + + {gettext("What are your pronouns?")} + + setPronouns(event.target.value)} + /> + + + + {gettext("What is your date of birth?")} + + setDOB(event.target.value)} + autoComplete="bday" + required + /> + + + )} + {isCompany && ( + + + {gettext("What is your company name?")} + + setCompanyName(event.target.value)} + required + /> + + )} +
+ {gettext("What is your address?")} +
+ + {gettext("Street & house number")} + setStreet(event.target.value)} + /> + + + {gettext("Postcode")} + setPostcode(event.target.value)} + /> + + + {gettext("City")} + setCity(event.target.value)} + /> + + + {gettext("Country")} + setCountry(event.target.value)} + /> + +
{gettext("Contact info")}
+ + {gettext("E-mail")} + setEmail(event.target.value)} + autoComplete="email" + required + /> + + + {gettext("Phone number")} + setEmail(event.target.value)} + autoComplete="email" + /> + + + setStage(RegistrationStage.TWO)} + /> + + + )} + + )} + {stage === RegistrationStage.TWO && ( +
+ + {gettext("Phone number")} + setEmail(event.target.value)} + autoComplete="email" + /> + +
+ setStage(RegistrationStage.ONE)} + /> + +
+
+ )} +
); diff --git a/tapir/accounts/ical.py b/tapir/accounts/ical.py new file mode 100644 index 000000000..25bd5a915 --- /dev/null +++ b/tapir/accounts/ical.py @@ -0,0 +1,20 @@ +from django_ical.views import ICalFeed + + +class ShiftCalendarICalFeed(ICalFeed): + product_id = '-//supercoop.de//ShiftCalendar//EN' + timezone = 'UTC' + file_name = "supercoop.ics" + + def items(self): + print(dir(self)) + return [] + + def item_title(self, item): + return item.title + + def item_description(self, item): + return item.description + + def item_start_datetime(self, item): + return item.start_datetime diff --git a/tapir/core/apps.py b/tapir/core/apps.py index 68b304135..8b9c5dbd9 100644 --- a/tapir/core/apps.py +++ b/tapir/core/apps.py @@ -73,3 +73,10 @@ def register_sidebar_link_groups(): url=reverse_lazy("coop:about"), ordering=7, ) + + misc_group.add_link( + display_name=_("Become a Member"), + material_icon="person_add", + url=reverse_lazy("coop:member_self_registration"), + ordering=8, + ) diff --git a/tapir/translations/locale/de/LC_MESSAGES/djangojs.po b/tapir/translations/locale/de/LC_MESSAGES/djangojs.po index 8d8306536..931b52fc5 100644 --- a/tapir/translations/locale/de/LC_MESSAGES/djangojs.po +++ b/tapir/translations/locale/de/LC_MESSAGES/djangojs.po @@ -2,13 +2,13 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. -# +# #, fuzzy msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-23 11:07+0200\n" +"POT-Creation-Date: 2025-10-25 14:21+0200\n" "PO-Revision-Date: 2024-11-05 11:14+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -19,140 +19,208 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.5\n" -#: dist/assets/fancy_export-BGio_MGW.js:3 +#: dist/assets/fancy_export-DhZo0sqW.js:3 msgid "Fancy export" msgstr "" -#: dist/assets/fancy_export-BGio_MGW.js:3 +#: dist/assets/fancy_export-DhZo0sqW.js:3 msgid "Source dataset" msgstr "" -#: dist/assets/fancy_export-BGio_MGW.js:3 +#: dist/assets/fancy_export-DhZo0sqW.js:3 msgid "Date" msgstr "" -#: dist/assets/fancy_export-BGio_MGW.js:3 +#: dist/assets/fancy_export-DhZo0sqW.js:3 msgid "The date is only relevant for the following fields: shift_status, is_working, is_exempted, is_paused, can_shop, currently_paid, expected_payment, payment_difference,member_status, is_member_since, compulsory_share, additional_shares, amount_paid, amount_paid_for_entry_fee, amount_paid_for_shares, number_of_paid_shares, number_of_unpaid_shares. For all other fields, the value as it is now is exported, not the value as it was at the given date." msgstr "" -#: dist/assets/fancy_export-BGio_MGW.js:3 +#: dist/assets/fancy_export-DhZo0sqW.js:3 msgid "Add columns to the export" msgstr "" -#: dist/assets/fancy_export-BGio_MGW.js:3 +#: dist/assets/fancy_export-DhZo0sqW.js:3 msgid "Click on a selected column to deselect it." msgstr "" -#: dist/assets/fancy_export-BGio_MGW.js:3 +#: dist/assets/fancy_export-DhZo0sqW.js:3 msgid "Build export for " msgstr "" -#: dist/assets/fancy_export-BGio_MGW.js:3 +#: dist/assets/fancy_export-DhZo0sqW.js:3 msgid "Pick a source dataset" msgstr "" -#: dist/assets/fancy_export-BGio_MGW.js:3 +#: dist/assets/fancy_export-DhZo0sqW.js:3 msgid "Download as CSV" msgstr "" -#: dist/assets/fancy_export-BGio_MGW.js:3 +#: dist/assets/fancy_export-DhZo0sqW.js:3 msgid "Build the export to download it" msgstr "" -#: dist/assets/fancy_export-BGio_MGW.js:3 +#: dist/assets/fancy_export-DhZo0sqW.js:3 msgid "Copy for spreadsheets" msgstr "" -#: dist/assets/fancy_export-BGio_MGW.js:3 +#: dist/assets/fancy_export-DhZo0sqW.js:3 msgid "Build the export to copy it" msgstr "" -#: dist/assets/fancy_export-BGio_MGW.js:3 +#: dist/assets/fancy_export-DhZo0sqW.js:3 msgid "Waiting for build" msgstr "" -#: dist/assets/fancy_graph-BIk5PbUJ.js:18 +#: dist/assets/fancy_graph-CDgYPUHN.js:18 msgid "Pick which data to display" msgstr "" -#: dist/assets/fancy_graph-BIk5PbUJ.js:18 +#: dist/assets/fancy_graph-CDgYPUHN.js:18 msgid "First of month" msgstr "" -#: dist/assets/fancy_graph-BIk5PbUJ.js:18 +#: dist/assets/fancy_graph-CDgYPUHN.js:18 msgid "Last of month" msgstr "" -#: dist/assets/fancy_graph-BIk5PbUJ.js:18 +#: dist/assets/fancy_graph-CDgYPUHN.js:18 msgid "No colourblindness" msgstr "" -#: dist/assets/fancy_graph-BIk5PbUJ.js:20 +#: dist/assets/fancy_graph-CDgYPUHN.js:20 msgid "Graph" msgstr "" -#: dist/assets/welcome_desk-CK_6aZ7w.js:1 +#: dist/assets/member_registration-Bwxov6eP.js:1 +msgid "Become a SuperCoop Member!" +msgstr "Werde SuperCoop-Mitglied!" + +#: dist/assets/member_registration-Bwxov6eP.js:1 +msgid "member_registration_welcome_text" +msgstr "" + +#: dist/assets/member_registration-Bwxov6eP.js:1 +msgid "What is your name?" +msgstr "" + +#: dist/assets/member_registration-Bwxov6eP.js:1 +msgid "First name and last name" +msgstr "" + +#: dist/assets/member_registration-Bwxov6eP.js:1 +msgid "How would you like to be addressed?" +msgstr "" + +#: dist/assets/member_registration-Bwxov6eP.js:1 +msgid "Your preferred name or nickname" +msgstr "" + +#: dist/assets/member_registration-Bwxov6eP.js:1 +msgid "What are your pronouns?" +msgstr "" + +#: dist/assets/member_registration-Bwxov6eP.js:1 +msgid "(Optional)" +msgstr "" + +#: dist/assets/member_registration-Bwxov6eP.js:1 +msgid "What is your date of birth?" +msgstr "" + +#: dist/assets/member_registration-Bwxov6eP.js:1 +msgid "What is your address?" +msgstr "" + +#: dist/assets/member_registration-Bwxov6eP.js:1 +msgid "Street & house number" +msgstr "" + +#: dist/assets/member_registration-Bwxov6eP.js:1 +msgid "Postcode" +msgstr "" + +#: dist/assets/member_registration-Bwxov6eP.js:1 +msgid "City" +msgstr "" + +#: dist/assets/member_registration-Bwxov6eP.js:1 +msgid "Country" +msgstr "" + +#: dist/assets/member_registration-Bwxov6eP.js:1 +msgid "Contact info" +msgstr "" + +#: dist/assets/member_registration-Bwxov6eP.js:1 +msgid "E-mail" +msgstr "" + +#: dist/assets/member_registration-Bwxov6eP.js:1 +msgid "Phone number" +msgstr "" + +#: dist/assets/welcome_desk-Bf3fsVAG.js:1 msgid "Use the search field on the top right." msgstr "Verwende das Suchfeld oben rechts." -#: dist/assets/welcome_desk-CK_6aZ7w.js:1 +#: dist/assets/welcome_desk-Bf3fsVAG.js:1 msgid "Name" msgstr "Name" -#: dist/assets/welcome_desk-CK_6aZ7w.js:1 +#: dist/assets/welcome_desk-Bf3fsVAG.js:1 msgid "Can shop" msgstr "Kann einkaufen" -#: dist/assets/welcome_desk-CK_6aZ7w.js:1 +#: dist/assets/welcome_desk-Bf3fsVAG.js:1 msgid "Yes" msgstr "Ja" -#: dist/assets/welcome_desk-CK_6aZ7w.js:1 +#: dist/assets/welcome_desk-Bf3fsVAG.js:1 msgid "No" msgstr "Nein" -#: dist/assets/welcome_desk-CK_6aZ7w.js:1 +#: dist/assets/welcome_desk-Bf3fsVAG.js:1 msgid "Member details" msgstr "Mitgliedsdetails" -#: dist/assets/welcome_desk-CK_6aZ7w.js:1 +#: dist/assets/welcome_desk-Bf3fsVAG.js:1 msgid "Member" msgstr "Mitgleid" -#: dist/assets/welcome_desk-CK_6aZ7w.js:1 +#: dist/assets/welcome_desk-Bf3fsVAG.js:1 msgid "yes" msgstr "ja" -#: dist/assets/welcome_desk-CK_6aZ7w.js:1 +#: dist/assets/welcome_desk-Bf3fsVAG.js:1 msgid "no" msgstr "nein" -#: dist/assets/welcome_desk-CK_6aZ7w.js:1 +#: dist/assets/welcome_desk-Bf3fsVAG.js:1 msgid "Why this member cannot shop: " msgstr "Warum kann dieses Mitglied nicht einkaufen: " -#: dist/assets/welcome_desk-CK_6aZ7w.js:1 +#: dist/assets/welcome_desk-Bf3fsVAG.js:1 msgid "Co-purchaser: " msgstr "Miteinkäufer*in: " -#: dist/assets/welcome_desk-CK_6aZ7w.js:1 +#: dist/assets/welcome_desk-Bf3fsVAG.js:1 msgid "None" msgstr "Keine" -#: dist/assets/welcome_desk-CK_6aZ7w.js:1 +#: dist/assets/welcome_desk-Bf3fsVAG.js:1 #, fuzzy #| msgid "Co-purchaser: " msgid "Co-purchaser 2: " msgstr "Miteinkäufer*in: " -#: dist/assets/welcome_desk-CK_6aZ7w.js:1 +#: dist/assets/welcome_desk-Bf3fsVAG.js:1 msgid "Whoops! Something went wrong. Please try again. If it keeps happening, please write in the #tapir channel on Slack with your current search: " msgstr "Hoppla! Es ist was schiefgegangen. Bitte versuche es nochmal. Wenn das wieder passiert, schreib bitte in der #tapir-Kanal bei Slack mit deine aktuelle Suche: " -#: dist/assets/welcome_desk-CK_6aZ7w.js:1 +#: dist/assets/welcome_desk-Bf3fsVAG.js:1 msgid "Welcome Desk" msgstr "Welcome Desk" -#: dist/assets/welcome_desk-CK_6aZ7w.js:1 +#: dist/assets/welcome_desk-Bf3fsVAG.js:1 msgid "Name or member ID" msgstr "Name oder Mitgliedsnummer" diff --git a/vite.config.ts b/vite.config.ts index ba9cdf915..a54886172 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,5 +1,5 @@ -import {defineConfig} from "vite"; -import {join, resolve} from "path"; +import { defineConfig } from "vite"; +import { join, resolve } from "path"; import react from "@vitejs/plugin-react-swc"; export default defineConfig(() => { @@ -19,6 +19,10 @@ export default defineConfig(() => { rollupOptions: { input: { welcome_desk: join(INPUT_DIR, "/welcome_desk/welcome_desk_entry.tsx"), + member_registration: join( + INPUT_DIR, + "/member_registration/member_registration_entry.tsx", + ), fancy_graph: join(INPUT_DIR, "/statistics/fancy_graph_entry.tsx"), fancy_export: join(INPUT_DIR, "/statistics/fancy_export_entry.tsx"), }, From cb3da7ed651a5003f2a2992d3d6fe566e5fb85ac Mon Sep 17 00:00:00 2001 From: jakubfiala Date: Sat, 25 Oct 2025 15:48:53 +0200 Subject: [PATCH 02/16] oops --- tapir/accounts/ical.py | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 tapir/accounts/ical.py diff --git a/tapir/accounts/ical.py b/tapir/accounts/ical.py deleted file mode 100644 index 25bd5a915..000000000 --- a/tapir/accounts/ical.py +++ /dev/null @@ -1,20 +0,0 @@ -from django_ical.views import ICalFeed - - -class ShiftCalendarICalFeed(ICalFeed): - product_id = '-//supercoop.de//ShiftCalendar//EN' - timezone = 'UTC' - file_name = "supercoop.ics" - - def items(self): - print(dir(self)) - return [] - - def item_title(self, item): - return item.title - - def item_description(self, item): - return item.description - - def item_start_datetime(self, item): - return item.start_datetime From 680df68b62f3385ec4057f8e29f7858d96364292 Mon Sep 17 00:00:00 2001 From: jakubfiala Date: Sat, 25 Oct 2025 16:37:41 +0200 Subject: [PATCH 03/16] more work on member registration --- .../MemberRegistrationCard.tsx | 185 ++++++++++++++++-- 1 file changed, 172 insertions(+), 13 deletions(-) diff --git a/src/member_registration/MemberRegistrationCard.tsx b/src/member_registration/MemberRegistrationCard.tsx index 5cdfbb7f2..b4f1c2a44 100644 --- a/src/member_registration/MemberRegistrationCard.tsx +++ b/src/member_registration/MemberRegistrationCard.tsx @@ -8,6 +8,7 @@ import { ChevronLeft, ChevronRight, Send } from "react-bootstrap-icons"; declare let gettext: (english_text: string) => string; const SHARE_PRICE = 100; +const MEMBERSHIP_FEE = 10; enum RegistrationStage { ONE, @@ -26,11 +27,18 @@ const MemberRegistrationCard: React.FC = () => { const [postcode, setPostcode] = useState(""); const [country, setCountry] = useState(""); const [dob, setDOB] = useState(""); + const [phone, setPhone] = useState(""); const [shares, setShares] = useState(1); const [loading, setLoading] = useState(false); const [isCompany, setIsCompany] = useState(null); const [isInvesting, setIsInvesting] = useState(false); const [stage, setStage] = useState(RegistrationStage.ONE); + const [acceptsMembership, setAcceptsMembership] = useState(false); + const [acceptsPeriod, setAcceptsPeriod] = useState(false); + const [acceptsConstitution, setAcceptsConstitution] = useState(false); + const [acceptsPayment, setAcceptsPayment] = useState(false); + const [acceptsPrivacy, setAcceptsPrivacy] = useState(false); + const [otherComments, setOtherComments] = useState(""); function onConfirmRegister() { setLoading(true); @@ -80,11 +88,12 @@ const MemberRegistrationCard: React.FC = () => {
{stage === RegistrationStage.ONE && ( <> +
{gettext("Step 1 - Your Membership")}
{gettext("Are you joining as an individual or company?")} @@ -299,11 +308,11 @@ const MemberRegistrationCard: React.FC = () => { {gettext("Phone number")} setEmail(event.target.value)} - autoComplete="email" + type={"text"} + value={phone} + name="phone" + onChange={(event) => setPhone(event.target.value)} + autoComplete="tel" /> @@ -320,14 +329,158 @@ const MemberRegistrationCard: React.FC = () => { )} {stage === RegistrationStage.TWO && (
+
+ {gettext("Step 2 - Overview & Declarations")} +
+
+
+
{gettext("Name:")}
+
{name}
+
+
+
{gettext("Preferred name:")}
+
{preferredName}
+
+
+
{gettext("Pronouns:")}
+
{pronouns}
+
+
+
{gettext("Date of birth:")}
+
{new Date(dob).toLocaleDateString()}
+
+
+
{gettext("E-mail:")}
+
{email}
+
+
+
{gettext("Phone:")}
+
{phone}
+
+
+
{gettext("Address:")}
+
{[street, postcode, city, country].join(", ")}
+
+
+
{gettext("Declarations")}
+ + + setAcceptsMembership(event.target.checked) + } + required + /> +

+ Ich verpflichte mich, die nach Satzung und Gesetz vorgesehenen + Zahlungen in Höhe von {SHARE_PRICE}€ je + Geschäftsanteil plus einem Eintrittsgeld in Höhe von{" "} + {MEMBERSHIP_FEE}€ zu leisten, das der Deckung + von Verwaltungskosten dient. Insgesamt verpflichte ich mich + daher,{" "} + {shares * SHARE_PRICE + MEMBERSHIP_FEE}€ zu + leisten. +

+
+ + + setAcceptsConstitution(event.target.checked) + } + required + /> +

+ + SuperCoop - Satzung + +

+
- {gettext("Phone number")} + setAcceptsPeriod(event.target.checked)} + required + /> + + + setAcceptsPayment(event.target.checked)} + required + /> +

+ Kontoinhaber: SuperCoop Berlin eG +
+ IBAN: DE98 4306 0967 1121 3790 00 +
+ BIC: GENODEM1GLS +
+ Betreff: {name}: Anteil und Eintrittsgeld +
+

+
+ + setAcceptsPrivacy(event.target.checked)} + required + /> +

+ + Datenschutzerklärung + +

+
+ + Other comments setEmail(event.target.value)} - autoComplete="email" + as="textarea" + id="other-comments" + placeholder="(z.B. Ratenzahlung, wenn möglich mit Angabe der Zahlungsintervalle)" + value={otherComments} + name="other-comments" + onChange={(event) => setOtherComments(event.target.value)} + required />
{ text={gettext("Kostenpflichting absenden")} variant={"primary"} onClick={onConfirmRegister} - disabled={email.length === 0} + disabled={ + !acceptsConstitution || + !acceptsMembership || + !acceptsPayment || + !acceptsPeriod || + !acceptsPrivacy + } loading={loading} />
From ac43a71e0aa504abc5cab85ed3942ec9c3b52d03 Mon Sep 17 00:00:00 2001 From: jakubfiala Date: Sat, 25 Oct 2025 18:42:58 +0200 Subject: [PATCH 04/16] refactor --- .../DataProcessingAgreement.tsx | 45 ++ src/member_registration/Declarations.tsx | 154 ++++++ .../MemberRegistration.tsx | 240 ++++++++ .../MemberRegistrationCard.tsx | 519 ------------------ src/member_registration/Overview.tsx | 76 +++ src/member_registration/constants.ts | 5 + .../form_parts/CompanyInfo.tsx | 24 + .../form_parts/ContactInfo.tsx | 100 ++++ .../form_parts/JoiningAs.tsx | 42 ++ .../form_parts/Membership.tsx | 84 +++ .../form_parts/PersonalInfo.tsx | 60 ++ .../member_registration_entry.tsx | 4 +- 12 files changed, 832 insertions(+), 521 deletions(-) create mode 100644 src/member_registration/DataProcessingAgreement.tsx create mode 100644 src/member_registration/Declarations.tsx create mode 100644 src/member_registration/MemberRegistration.tsx delete mode 100644 src/member_registration/MemberRegistrationCard.tsx create mode 100644 src/member_registration/Overview.tsx create mode 100644 src/member_registration/constants.ts create mode 100644 src/member_registration/form_parts/CompanyInfo.tsx create mode 100644 src/member_registration/form_parts/ContactInfo.tsx create mode 100644 src/member_registration/form_parts/JoiningAs.tsx create mode 100644 src/member_registration/form_parts/Membership.tsx create mode 100644 src/member_registration/form_parts/PersonalInfo.tsx diff --git a/src/member_registration/DataProcessingAgreement.tsx b/src/member_registration/DataProcessingAgreement.tsx new file mode 100644 index 000000000..3dc19aabf --- /dev/null +++ b/src/member_registration/DataProcessingAgreement.tsx @@ -0,0 +1,45 @@ +import { COOP_NAME, COOP_STREET, COOP_PLACE } from "./constants"; + +export default function DataProcessingAgreement() { + return ( +
+ Datenschutzerklärung +

+ Verantwortlich für die Datenverarbeitung ist die {COOP_NAME},{" "} + {COOP_STREET}, {COOP_PLACE}. Erreichbar unter contact@supercoop.de. Der + Name, die Anschrift und das Geburtsdatum werden für die Mitgliederliste + der Genossenschaft benötigt (Art. 6 Absatz 1 c DS-GVO i.V.m. §30 Absatz + 2 Satz 1 Nr.1 GenG). Über die Adresse oder die E-Mail-Adresse werden Sie + von der Genossenschaft zu Versammlungen eingeladen (Art. 6 Absatz 1c + DS-GVO i.V.m §46 Absatz 1 Satz 1 GenG i.V.m. §6 Nr.4 GenG) und im Rahmen + der Mitgliedschaft über Angebote der Genossenschaft informiert (Art.6 + Absatz 1 b DS-GVO i.V.m. §1 Absatz 1 GenG i.V.m. der Satzung). Die + Genossenschaft hat ein berechtigtes Interesse an einer unkomplizierten + und rechtssicheren Erfüllung ihrer Verbindlichkeiten. Die Bereitstellung + der personenbezogenen Daten ist gesetzlich bzw. durch die Satzung + vorgeschrieben, die Nichtbereitstellung hätte zur Folge, dass die + Mitgliedschaft nicht zustande kommen kann. +

+

+ Die personenbezogenen Daten werden nicht an Dritte weitergeleitet, + soweit nicht im Einzelfall dafür eine Einwilligung erteilt wird. Wir + sind allerdings gesetzlich verpflichtet, in einigen Fällen Dritten die + Einsicht in die personenbezogenen Daten zu gewähren. Das betrifft zum + Beispiel andere Mitglieder, den gesetzlichen Prüfungsverband oder + Behörden, insbesondere das Finanzamt. Die Daten werden unterschiedlich + aufbewahrt: Alle steuerlich relevanten Informationen werden zehn Jahre + aufbewahrt (§147 AO). Die Daten in der Mitgliederliste (Name und + Anschrift nach §30 Absatz 2 Satz 1 Nr. 1 GenG) werden auch nach dem + Ausscheiden nicht gelöscht (§30 Absatz 2 Satz 1 Nr. 3 GenG). Sie haben + das Recht auf Auskunft seitens des Verantwortlichen über die + betreffenden personenbezogenen Daten sowie auf Berichtigung oder + Löschung oder auf Einschränkung der Verarbeitung (soweit dem nicht eine + gesetzliche Regelung entgegensteht). Auch kann eine Datenübertragung + angefordert werden, sollte der Unterzeichnende eine Übertragung seiner + Daten an eine dritte Stelle wünschen. Darüber hinaus haben Sie das Recht + auf Beschwerde bei einer Aufsichtsbehörde (Landesbeauftragte für + Datenschutz). +

+
+ ); +} diff --git a/src/member_registration/Declarations.tsx b/src/member_registration/Declarations.tsx new file mode 100644 index 000000000..4f9ee4889 --- /dev/null +++ b/src/member_registration/Declarations.tsx @@ -0,0 +1,154 @@ +import { Form } from "react-bootstrap"; +import { MEMBERSHIP_FEE, SHARE_PRICE, COOP_NAME } from "./constants"; +import DataProcessingAgreement from "./DataProcessingAgreement"; + +declare let gettext: (english_text: string) => string; + +type Props = { + name: string; + shares: number; + acceptsMembership: boolean; + setAcceptsMembership: React.Dispatch>; + acceptsPeriod: boolean; + setAcceptsPeriod: React.Dispatch>; + acceptsConstitution: boolean; + setAcceptsConstitution: React.Dispatch>; + acceptsPayment: boolean; + setAcceptsPayment: React.Dispatch>; + acceptsPrivacy: boolean; + setAcceptsPrivacy: React.Dispatch>; +}; + +export default function Declarations({ + name, + shares, + acceptsMembership, + setAcceptsMembership, + acceptsPeriod, + setAcceptsPeriod, + acceptsConstitution, + setAcceptsConstitution, + acceptsPayment, + setAcceptsPayment, + acceptsPrivacy, + setAcceptsPrivacy, +}: Props) { + return ( + <> +
{gettext("Declarations")}
+ + setAcceptsMembership(event.target.checked)} + required + /> +

+ {gettext( + "In accordance with the bylaws and the law, I agree to purchase shares at a price of", + // "Ich verpflichte mich, die nach Satzung und Gesetz vorgesehenen Zahlungen in Höhe von", + )}{" "} + {SHARE_PRICE}€ + {gettext(" per share, as well as the membership fee of ")} + {/*{gettext(" je Geschäftsanteil plus einem Eintrittsgeld in Höhe von ")}*/} + {MEMBERSHIP_FEE}€ + {gettext( + ", which will be used to cover administrative costs. I agree to transfer ", + // " zu leisten, das der Deckung von Verwaltungskosten dient. Insgesamt verpflichte ich mich daher, ", + )}{" "} + {shares * SHARE_PRICE + MEMBERSHIP_FEE}€ + {gettext(" in total")}.{/*{gettext(" zu leisten")}.*/} +

+
+ + setAcceptsConstitution(event.target.checked)} + required + /> +

+ + SuperCoop - {gettext("Bylaws")} + +

+
+ + setAcceptsPeriod(event.target.checked)} + required + /> + + + setAcceptsPayment(event.target.checked)} + required + /> +

+ {gettext("Account Owner")}: {COOP_NAME} +
+ IBAN: DE98 4306 0967 1121 3790 00 +
+ BIC: GENODEM1GLS +
+ {gettext("Subject")}:{" "} + {name}: Anteil und Eintrittsgeld +
+

+
+ + setAcceptsPrivacy(event.target.checked)} + required + /> + + + + ); +} diff --git a/src/member_registration/MemberRegistration.tsx b/src/member_registration/MemberRegistration.tsx new file mode 100644 index 000000000..f1b71b5d2 --- /dev/null +++ b/src/member_registration/MemberRegistration.tsx @@ -0,0 +1,240 @@ +import React, { useState } from "react"; +import { Card, Form } from "react-bootstrap"; +import { useApi } from "../hooks/useApi.ts"; +import { CoopApi } from "../api-client/index.ts"; +import TapirButton from "../components/TapirButton.tsx"; +import { ChevronLeft, ChevronRight, Send } from "react-bootstrap-icons"; +import PersonalInfo from "./form_parts/PersonalInfo.tsx"; +import CompanyInfo from "./form_parts/CompanyInfo.tsx"; +import Membership from "./form_parts/Membership.tsx"; +import JoiningAs from "./form_parts/JoiningAs.tsx"; +import ContactInfo from "./form_parts/ContactInfo.tsx"; +import Overview from "./Overview.tsx"; +import Declarations from "./Declarations.tsx"; + +declare let gettext: (english_text: string) => string; + +enum RegistrationStage { + ONE, + TWO, +} + +const MemberRegistration: React.FC = () => { + const coopApi = useApi(CoopApi); + const [name, setName] = useState(""); + const [companyName, setCompanyName] = useState(""); + + const [preferredName, setPreferredName] = useState(""); + const [pronouns, setPronouns] = useState(""); + const [dob, setDOB] = useState(""); + + const [email, setEmail] = useState(""); + const [street, setStreet] = useState(""); + const [city, setCity] = useState(""); + const [postcode, setPostcode] = useState(""); + const [country, setCountry] = useState(""); + const [phone, setPhone] = useState(""); + const [shares, setShares] = useState(1); + const [loading, setLoading] = useState(false); + const [isCompany, setIsCompany] = useState(null); + const [isInvesting, setIsInvesting] = useState(false); + const [stage, setStage] = useState(RegistrationStage.ONE); + const [acceptsMembership, setAcceptsMembership] = useState(false); + const [acceptsPeriod, setAcceptsPeriod] = useState(false); + const [acceptsConstitution, setAcceptsConstitution] = useState(false); + const [acceptsPayment, setAcceptsPayment] = useState(false); + const [acceptsPrivacy, setAcceptsPrivacy] = useState(false); + const [otherComments, setOtherComments] = useState(""); + + function onConfirmRegister() { + setLoading(true); + + coopApi + .coopMemberSelfRegisterCreate({ + memberRegistrationRequest: { + email: email, + firstName: "placeholder", + lastName: "placeholder", + numberOfCoopShares: -1, + }, + }) + .then((result) => { + if (result) { + alert("Success!"); + } else { + alert("Failed!"); + } + }) + .catch((error) => { + alert("Request failed! Check the console log"); + console.error(error); + }) + .finally(() => setLoading(false)); + } + + return ( + + +
{gettext("Become a SuperCoop Member!")}
+
+ +
+

+ +

+

+ {gettext(` +Welcome to SuperCoop! We're excited to welcome you as a new member of our cooperative. +Please fill out the form below so we can process your application. + `)} +

+
+ + {stage === RegistrationStage.ONE && ( + <> +
{gettext("Step 1 - Your Membership")}
+ + {isCompany !== null && ( + <> + + {!isCompany && ( + + )} + {isCompany && ( + + )} + + + setStage(RegistrationStage.TWO)} + /> + + + )} + + )} + {stage === RegistrationStage.TWO && ( +
+
+ {gettext("Step 2 - Overview & Declarations")} +
+ + +
+ + Other comments + setOtherComments(event.target.value)} + required + /> + +
+ setStage(RegistrationStage.ONE)} + /> + +
+
+ )} + +
+
+ ); +}; + +export default MemberRegistration; diff --git a/src/member_registration/MemberRegistrationCard.tsx b/src/member_registration/MemberRegistrationCard.tsx deleted file mode 100644 index b4f1c2a44..000000000 --- a/src/member_registration/MemberRegistrationCard.tsx +++ /dev/null @@ -1,519 +0,0 @@ -import React, { useState } from "react"; -import { Card, Form } from "react-bootstrap"; -import { useApi } from "../hooks/useApi.ts"; -import { CoopApi } from "../api-client"; -import TapirButton from "../components/TapirButton.tsx"; -import { ChevronLeft, ChevronRight, Send } from "react-bootstrap-icons"; - -declare let gettext: (english_text: string) => string; - -const SHARE_PRICE = 100; -const MEMBERSHIP_FEE = 10; - -enum RegistrationStage { - ONE, - TWO, -} - -const MemberRegistrationCard: React.FC = () => { - const coopApi = useApi(CoopApi); - const [name, setName] = useState(""); - const [preferredName, setPreferredName] = useState(""); - const [companyName, setCompanyName] = useState(""); - const [pronouns, setPronouns] = useState(""); - const [email, setEmail] = useState(""); - const [street, setStreet] = useState(""); - const [city, setCity] = useState(""); - const [postcode, setPostcode] = useState(""); - const [country, setCountry] = useState(""); - const [dob, setDOB] = useState(""); - const [phone, setPhone] = useState(""); - const [shares, setShares] = useState(1); - const [loading, setLoading] = useState(false); - const [isCompany, setIsCompany] = useState(null); - const [isInvesting, setIsInvesting] = useState(false); - const [stage, setStage] = useState(RegistrationStage.ONE); - const [acceptsMembership, setAcceptsMembership] = useState(false); - const [acceptsPeriod, setAcceptsPeriod] = useState(false); - const [acceptsConstitution, setAcceptsConstitution] = useState(false); - const [acceptsPayment, setAcceptsPayment] = useState(false); - const [acceptsPrivacy, setAcceptsPrivacy] = useState(false); - const [otherComments, setOtherComments] = useState(""); - - function onConfirmRegister() { - setLoading(true); - - coopApi - .coopMemberSelfRegisterCreate({ - memberRegistrationRequest: { - email: email, - firstName: "placeholder", - lastName: "placeholder", - numberOfCoopShares: -1, - }, - }) - .then((result) => { - if (result) { - alert("Success!"); - } else { - alert("Failed!"); - } - }) - .catch((error) => { - alert("Request failed! Check the console log"); - console.error(error); - }) - .finally(() => setLoading(false)); - } - - return ( - - -
{gettext("Become a SuperCoop Member!")}
-
- -
-

- -

-

- {gettext(` - Welcome to SuperCoop! We're excited to welcome you as a new member of our cooperative. - Please fill out the form below so we can process your application. - `)} -

-
-
- {stage === RegistrationStage.ONE && ( - <> -
{gettext("Step 1 - Your Membership")}
- -
- {gettext("Are you joining as an individual or company?")} -
- { - setIsCompany(!event.target.checked); - }} - required - /> - { - setIsCompany(event.target.checked); - setIsInvesting(event.target.checked); - }} - required - /> -
- {isCompany !== null && ( - <> -
- {gettext("Choose your entry shares")} -
- - - {gettext("How many shares would you like to join with?")} - - - setShares(parseInt(event.target.value)) - } - required - /> -

- {gettext("You are joining with")}{" "} - {shares * SHARE_PRICE}€{" "} - {gettext("worth of shares.")} -

-
-
- {gettext("Choose your membership type")} -
- - - setIsInvesting(!event.target.checked) - } - required - /> - setIsInvesting(event.target.checked)} - required - /> - -

Erklärung

-
{gettext("Personal details")}
- - {gettext("What is your name?")} - setName(event.target.value)} - autoComplete="name" - required - /> - - {!isCompany && ( - <> - - - {gettext( - "How would you like to be addressed? (optional)", - )} - - - setPreferredName(event.target.value) - } - /> - - - - {gettext("What are your pronouns?")} - - setPronouns(event.target.value)} - /> - - - - {gettext("What is your date of birth?")} - - setDOB(event.target.value)} - autoComplete="bday" - required - /> - - - )} - {isCompany && ( - - - {gettext("What is your company name?")} - - setCompanyName(event.target.value)} - required - /> - - )} -
- {gettext("What is your address?")} -
- - {gettext("Street & house number")} - setStreet(event.target.value)} - /> - - - {gettext("Postcode")} - setPostcode(event.target.value)} - /> - - - {gettext("City")} - setCity(event.target.value)} - /> - - - {gettext("Country")} - setCountry(event.target.value)} - /> - -
{gettext("Contact info")}
- - {gettext("E-mail")} - setEmail(event.target.value)} - autoComplete="email" - required - /> - - - {gettext("Phone number")} - setPhone(event.target.value)} - autoComplete="tel" - /> - - - setStage(RegistrationStage.TWO)} - /> - - - )} - - )} - {stage === RegistrationStage.TWO && ( -
-
- {gettext("Step 2 - Overview & Declarations")} -
-
-
-
{gettext("Name:")}
-
{name}
-
-
-
{gettext("Preferred name:")}
-
{preferredName}
-
-
-
{gettext("Pronouns:")}
-
{pronouns}
-
-
-
{gettext("Date of birth:")}
-
{new Date(dob).toLocaleDateString()}
-
-
-
{gettext("E-mail:")}
-
{email}
-
-
-
{gettext("Phone:")}
-
{phone}
-
-
-
{gettext("Address:")}
-
{[street, postcode, city, country].join(", ")}
-
-
-
{gettext("Declarations")}
- - - setAcceptsMembership(event.target.checked) - } - required - /> -

- Ich verpflichte mich, die nach Satzung und Gesetz vorgesehenen - Zahlungen in Höhe von {SHARE_PRICE}€ je - Geschäftsanteil plus einem Eintrittsgeld in Höhe von{" "} - {MEMBERSHIP_FEE}€ zu leisten, das der Deckung - von Verwaltungskosten dient. Insgesamt verpflichte ich mich - daher,{" "} - {shares * SHARE_PRICE + MEMBERSHIP_FEE}€ zu - leisten. -

-
- - - setAcceptsConstitution(event.target.checked) - } - required - /> -

- - SuperCoop - Satzung - -

-
- - setAcceptsPeriod(event.target.checked)} - required - /> - - - setAcceptsPayment(event.target.checked)} - required - /> -

- Kontoinhaber: SuperCoop Berlin eG -
- IBAN: DE98 4306 0967 1121 3790 00 -
- BIC: GENODEM1GLS -
- Betreff: {name}: Anteil und Eintrittsgeld -
-

-
- - setAcceptsPrivacy(event.target.checked)} - required - /> -

- - Datenschutzerklärung - -

-
- - Other comments - setOtherComments(event.target.value)} - required - /> - -
- setStage(RegistrationStage.ONE)} - /> - -
-
- )} -
-
-
- ); -}; - -export default MemberRegistrationCard; diff --git a/src/member_registration/Overview.tsx b/src/member_registration/Overview.tsx new file mode 100644 index 000000000..852ab3e7a --- /dev/null +++ b/src/member_registration/Overview.tsx @@ -0,0 +1,76 @@ +declare let gettext: (english_text: string) => string; + +type Props = { + isCompany: boolean | null; + name: string; + preferredName: string; + pronouns: string; + dob: string; + companyName: string; + street: string; + postcode: string; + city: string; + country: string; + email: string; + phone: string; +}; + +export default function Overview({ + isCompany, + name, + preferredName, + pronouns, + dob, + companyName, + street, + postcode, + city, + country, + email, + phone, +}: Props) { + return ( +
+
+
{gettext("Name:")}
+
{name}
+
+ {isCompany && ( + <> +
+
{gettext("CompanyName:")}
+
{companyName}
+
+ + )} + {!isCompany && ( + <> +
+
{gettext("Preferred name:")}
+
{preferredName}
+
+
+
{gettext("Pronouns:")}
+
{pronouns}
+
+
+
{gettext("Date of birth:")}
+
{new Date(dob).toLocaleDateString()}
+
+ + )} +
+
{gettext("E-mail:")}
+
{email}
+
+
+
{gettext("Phone:")}
+
{phone}
+
+
+
{gettext("Address:")}
+
{[street, postcode, city, country].join(", ")}
+
+
+ ); +} diff --git a/src/member_registration/constants.ts b/src/member_registration/constants.ts new file mode 100644 index 000000000..db72d140a --- /dev/null +++ b/src/member_registration/constants.ts @@ -0,0 +1,5 @@ +export const SHARE_PRICE = 100; +export const MEMBERSHIP_FEE = 10; +export const COOP_NAME = "SuperCoop Berlin eG"; +export const COOP_STREET = "Oudenarder Straße 16"; +export const COOP_PLACE = "13347 Berlin"; diff --git a/src/member_registration/form_parts/CompanyInfo.tsx b/src/member_registration/form_parts/CompanyInfo.tsx new file mode 100644 index 000000000..7bb2664d7 --- /dev/null +++ b/src/member_registration/form_parts/CompanyInfo.tsx @@ -0,0 +1,24 @@ +import { Form } from "react-bootstrap"; + +declare let gettext: (english_text: string) => string; + +type Props = { + companyName: string; + setCompanyName: React.Dispatch>; +}; + +export default function CompanyInfo({ companyName, setCompanyName }: Props) { + return ( + + {gettext("What is your company name?")} + setCompanyName(event.target.value)} + required + /> + + ); +} diff --git a/src/member_registration/form_parts/ContactInfo.tsx b/src/member_registration/form_parts/ContactInfo.tsx new file mode 100644 index 000000000..efe9f63ea --- /dev/null +++ b/src/member_registration/form_parts/ContactInfo.tsx @@ -0,0 +1,100 @@ +import { Form } from "react-bootstrap"; + +declare let gettext: (english_text: string) => string; + +type Props = { + street: string; + setStreet: React.Dispatch>; + postcode: string; + setPostcode: React.Dispatch>; + city: string; + setCity: React.Dispatch>; + country: string; + setCountry: React.Dispatch>; + email: string; + setEmail: React.Dispatch>; + phone: string; + setPhone: React.Dispatch>; +}; + +export default function ContactInfo({ + street, + setStreet, + postcode, + setPostcode, + city, + setCity, + country, + setCountry, + email, + setEmail, + phone, + setPhone, +}: Props) { + return ( + <> +
{gettext("Address & Contact Info")}
+ + {gettext("Street & house number")} + setStreet(event.target.value)} + /> + + + {gettext("Postcode")} + setPostcode(event.target.value)} + /> + + + {gettext("City")} + setCity(event.target.value)} + /> + + + {gettext("Country")} + setCountry(event.target.value)} + /> + + + {gettext("E-mail")} + setEmail(event.target.value)} + autoComplete="email" + required + /> + + + {gettext("Phone number")} + setPhone(event.target.value)} + autoComplete="tel" + /> + + + ); +} diff --git a/src/member_registration/form_parts/JoiningAs.tsx b/src/member_registration/form_parts/JoiningAs.tsx new file mode 100644 index 000000000..46fe85470 --- /dev/null +++ b/src/member_registration/form_parts/JoiningAs.tsx @@ -0,0 +1,42 @@ +import { Form } from "react-bootstrap"; + +declare let gettext: (english_text: string) => string; + +type Props = { + isCompany: boolean | null; + setIsCompany: React.Dispatch>; + setIsInvesting: React.Dispatch>; +}; + +export default function JoiningAs({ isCompany, setIsCompany }: Props) { + return ( + +
+ {gettext("Are you joining as an individual or company?")} +
+ { + setIsCompany(!event.target.checked); + }} + required + /> + { + setIsCompany(event.target.checked); + setIsInvesting(event.target.checked); + }} + required + /> +
+ ); +} diff --git a/src/member_registration/form_parts/Membership.tsx b/src/member_registration/form_parts/Membership.tsx new file mode 100644 index 000000000..240625ffd --- /dev/null +++ b/src/member_registration/form_parts/Membership.tsx @@ -0,0 +1,84 @@ +import { Form } from "react-bootstrap"; +import { SHARE_PRICE } from "../constants"; + +declare let gettext: (english_text: string) => string; + +type Props = { + name: string; + setName: React.Dispatch>; + shares: number; + setShares: React.Dispatch>; + isInvesting: boolean; + setIsInvesting: React.Dispatch>; +}; + +export default function Membership({ + name, + setName, + shares, + setShares, + isInvesting, + setIsInvesting, +}: Props) { + return ( + <> +
{gettext("Choose your entry shares")}
+ + + {gettext("How many shares would you like to join with?")} + + setShares(parseInt(event.target.value))} + required + /> +

+ {gettext("You are joining with")}{" "} + {shares * SHARE_PRICE}€ {gettext("worth of shares.")} +

+
+
{gettext("Choose your membership type")}
+ + setIsInvesting(!event.target.checked)} + required + /> + setIsInvesting(event.target.checked)} + required + /> + +

+ {gettext( + `Investing members are supporters of the Cooperative. They cannot vote in the General Assembly and cannot use the services of the Cooperative.`, + // `Investierende Mitglieder sind fördernde Mitglieder. Sie haben kein Stimmrecht in der Generalversammlung und können die Leistungen der Genossenschaft nicht nutzen.`, + )} +

+
{gettext("Personal details")}
+ + {gettext("What is your name?")} + setName(event.target.value)} + autoComplete="name" + required + /> + + + ); +} diff --git a/src/member_registration/form_parts/PersonalInfo.tsx b/src/member_registration/form_parts/PersonalInfo.tsx new file mode 100644 index 000000000..c16405477 --- /dev/null +++ b/src/member_registration/form_parts/PersonalInfo.tsx @@ -0,0 +1,60 @@ +import { Form } from "react-bootstrap"; + +declare let gettext: (english_text: string) => string; + +type Props = { + preferredName: string; + setPreferredName: React.Dispatch>; + pronouns: string; + setPronouns: React.Dispatch>; + dob: string; + setDOB: React.Dispatch>; +}; + +export default function PersonalInfo({ + preferredName, + setPreferredName, + pronouns, + setPronouns, + dob, + setDOB, +}: Props) { + return ( + <> + + + {gettext("How would you like to be addressed? (optional)")} + + setPreferredName(event.target.value)} + /> + + + {gettext("What are your pronouns?")} + setPronouns(event.target.value)} + /> + + + {gettext("What is your date of birth?")} + setDOB(event.target.value)} + autoComplete="bday" + required + /> + + + ); +} diff --git a/src/member_registration/member_registration_entry.tsx b/src/member_registration/member_registration_entry.tsx index a32035409..ad3491b46 100644 --- a/src/member_registration/member_registration_entry.tsx +++ b/src/member_registration/member_registration_entry.tsx @@ -1,10 +1,10 @@ import { createRoot } from "react-dom/client"; -import MemberRegistrationCard from "./MemberRegistrationCard.tsx"; +import MemberRegistration from "./MemberRegistration.tsx"; const domNode = document.getElementById("member_registration"); if (domNode) { const root = createRoot(domNode); - root.render(); + root.render(); } else { console.error("Failed to render member registration from React"); } From 9a2f74991af2dc30f3b25f5c5389974a546dff21 Mon Sep 17 00:00:00 2001 From: jakubfiala Date: Sat, 25 Oct 2025 18:45:24 +0200 Subject: [PATCH 05/16] more refactor --- src/member_registration/Intro.tsx | 20 +++++++++++++++++++ .../MemberRegistration.tsx | 16 ++------------- 2 files changed, 22 insertions(+), 14 deletions(-) create mode 100644 src/member_registration/Intro.tsx diff --git a/src/member_registration/Intro.tsx b/src/member_registration/Intro.tsx new file mode 100644 index 000000000..2173e9b25 --- /dev/null +++ b/src/member_registration/Intro.tsx @@ -0,0 +1,20 @@ +declare let gettext: (english_text: string) => string; + +export default function Intro() { + return ( +
+

+ +

+

+ {gettext(` +Welcome to SuperCoop! We're excited to welcome you as a new member of our cooperative. +Please fill out the form below so we can process your application. +`)} +

+
+ ); +} diff --git a/src/member_registration/MemberRegistration.tsx b/src/member_registration/MemberRegistration.tsx index f1b71b5d2..74bb2bdf6 100644 --- a/src/member_registration/MemberRegistration.tsx +++ b/src/member_registration/MemberRegistration.tsx @@ -11,6 +11,7 @@ import JoiningAs from "./form_parts/JoiningAs.tsx"; import ContactInfo from "./form_parts/ContactInfo.tsx"; import Overview from "./Overview.tsx"; import Declarations from "./Declarations.tsx"; +import Intro from "./Intro.tsx"; declare let gettext: (english_text: string) => string; @@ -78,20 +79,7 @@ const MemberRegistration: React.FC = () => {
{gettext("Become a SuperCoop Member!")}
-
-

- -

-

- {gettext(` -Welcome to SuperCoop! We're excited to welcome you as a new member of our cooperative. -Please fill out the form below so we can process your application. - `)} -

-
+
Date: Sat, 25 Oct 2025 19:08:22 +0200 Subject: [PATCH 06/16] translations --- src/member_registration/Declarations.tsx | 16 +- .../MemberRegistration.tsx | 5 +- src/member_registration/Overview.tsx | 2 +- .../form_parts/JoiningAs.tsx | 6 +- .../form_parts/Membership.tsx | 1 - .../locale/de/LC_MESSAGES/djangojs.po | 276 +++++++++++++++--- 6 files changed, 240 insertions(+), 66 deletions(-) diff --git a/src/member_registration/Declarations.tsx b/src/member_registration/Declarations.tsx index 4f9ee4889..baa9b94a6 100644 --- a/src/member_registration/Declarations.tsx +++ b/src/member_registration/Declarations.tsx @@ -41,9 +41,6 @@ export default function Declarations({ type={"checkbox"} id="accepts-membership" label={`${gettext("I hereby request membership in the SuperCoop. I would like to take part with")} ${shares} ${gettext("share(s).")}`} - // label={gettext(` - // Ich beantrage hiermit die Aufnahme in die SuperCoop. Ich möchte mich mit insgesamt ${shares} Anteil(en) an der Genossenschaft beteiligen. - // `)} checked={acceptsMembership} name="accepts-membership" onChange={(event) => setAcceptsMembership(event.target.checked)} @@ -52,18 +49,15 @@ export default function Declarations({

{gettext( "In accordance with the bylaws and the law, I agree to purchase shares at a price of", - // "Ich verpflichte mich, die nach Satzung und Gesetz vorgesehenen Zahlungen in Höhe von", )}{" "} {SHARE_PRICE}€ {gettext(" per share, as well as the membership fee of ")} - {/*{gettext(" je Geschäftsanteil plus einem Eintrittsgeld in Höhe von ")}*/} {MEMBERSHIP_FEE}€ {gettext( ", which will be used to cover administrative costs. I agree to transfer ", - // " zu leisten, das der Deckung von Verwaltungskosten dient. Insgesamt verpflichte ich mich daher, ", )}{" "} {shares * SHARE_PRICE + MEMBERSHIP_FEE}€ - {gettext(" in total")}.{/*{gettext(" zu leisten")}.*/} + {gettext(" in total")}.

@@ -73,7 +67,6 @@ export default function Declarations({ label={gettext( `I have been provided with a copy of the Bylaws of SuperCoop (either in digital or print form), which can be accessed below:`, )} - // label={gettext(`Die Satzung von SuperCoop ist mir (entweder digital oder in gedruckter Form) ausgehändigt worden kann hier eingesehen werden:`)} checked={acceptsConstitution} name="accepts-constitution" onChange={(event) => setAcceptsConstitution(event.target.checked)} @@ -95,12 +88,6 @@ The long membership period helps secure financial stability and is an important which is oriented towards long-term goals. A transfer of shares in the Cooperative in accordance with the Bylaws is allowed before the end of the minimum membership period. `)} - // label={gettext(` - // Ich nehme zur Kenntnis, dass die Satzung eine Kündigungsfrist von 3 Jahren zum Ende des Geschäftsjahres - // bestimmt. Die lange Laufzeit dient zur finanziellen Stabilität und ist ein wesentlicher Kern des - // Genossenschaftsprinzips, das auf langfristige Ziele ausgerichtet ist. Eine Übertragung von Geschäftsanteilen - // ist auch vorher bereits möglich und in der Satzung geregelt. - // `)} checked={acceptsPeriod} name="accepts-period" onChange={(event) => setAcceptsPeriod(event.target.checked)} @@ -114,7 +101,6 @@ end of the minimum membership period. label={gettext( `I agree to pay the payment(s) via bank transfer to the account specified below:`, )} - // label={gettext(`Ich werde meine (Rest-)Zahlungen per Überweisung leisten und auf folgendes Konto überweisen:`)} checked={acceptsPayment} name="accepts-payment" onChange={(event) => setAcceptsPayment(event.target.checked)} diff --git a/src/member_registration/MemberRegistration.tsx b/src/member_registration/MemberRegistration.tsx index 74bb2bdf6..fa6eeb382 100644 --- a/src/member_registration/MemberRegistration.tsx +++ b/src/member_registration/MemberRegistration.tsx @@ -136,7 +136,7 @@ const MemberRegistration: React.FC = () => { setStage(RegistrationStage.TWO)} /> @@ -185,7 +185,6 @@ const MemberRegistration: React.FC = () => { as="textarea" id="other-comments" placeholder={`(${gettext("e.g. payment in installments, including payment periods")})`} - // placeholder={`(${gettext("z.B. Ratenzahlung, wenn möglich mit Angabe der Zahlungsintervalle")})`} value={otherComments} name="other-comments" onChange={(event) => setOtherComments(event.target.value)} @@ -204,7 +203,7 @@ const MemberRegistration: React.FC = () => { />
-
{gettext("CompanyName:")}
+
{gettext("Company Name:")}
{companyName}
diff --git a/src/member_registration/form_parts/JoiningAs.tsx b/src/member_registration/form_parts/JoiningAs.tsx index 46fe85470..fca99fa9e 100644 --- a/src/member_registration/form_parts/JoiningAs.tsx +++ b/src/member_registration/form_parts/JoiningAs.tsx @@ -8,7 +8,11 @@ type Props = { setIsInvesting: React.Dispatch>; }; -export default function JoiningAs({ isCompany, setIsCompany }: Props) { +export default function JoiningAs({ + isCompany, + setIsCompany, + setIsInvesting, +}: Props) { return (
diff --git a/src/member_registration/form_parts/Membership.tsx b/src/member_registration/form_parts/Membership.tsx index 240625ffd..36794a937 100644 --- a/src/member_registration/form_parts/Membership.tsx +++ b/src/member_registration/form_parts/Membership.tsx @@ -63,7 +63,6 @@ export default function Membership({

{gettext( `Investing members are supporters of the Cooperative. They cannot vote in the General Assembly and cannot use the services of the Cooperative.`, - // `Investierende Mitglieder sind fördernde Mitglieder. Sie haben kein Stimmrecht in der Generalversammlung und können die Leistungen der Genossenschaft nicht nutzen.`, )}

{gettext("Personal details")}
diff --git a/tapir/translations/locale/de/LC_MESSAGES/djangojs.po b/tapir/translations/locale/de/LC_MESSAGES/djangojs.po index 931b52fc5..1a2af512f 100644 --- a/tapir/translations/locale/de/LC_MESSAGES/djangojs.po +++ b/tapir/translations/locale/de/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-25 14:21+0200\n" +"POT-Creation-Date: 2025-10-25 18:48+0200\n" "PO-Revision-Date: 2024-11-05 11:14+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -91,73 +91,259 @@ msgstr "" msgid "Graph" msgstr "" -#: dist/assets/member_registration-Bwxov6eP.js:1 -msgid "Become a SuperCoop Member!" -msgstr "Werde SuperCoop-Mitglied!" - -#: dist/assets/member_registration-Bwxov6eP.js:1 -msgid "member_registration_welcome_text" -msgstr "" - -#: dist/assets/member_registration-Bwxov6eP.js:1 -msgid "What is your name?" -msgstr "" - -#: dist/assets/member_registration-Bwxov6eP.js:1 -msgid "First name and last name" -msgstr "" +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "How would you like to be addressed? (optional)" +msgstr "Wie möchtest du angesprochen werden? (optional)" -#: dist/assets/member_registration-Bwxov6eP.js:1 -msgid "How would you like to be addressed?" -msgstr "" - -#: dist/assets/member_registration-Bwxov6eP.js:1 +#: dist/assets/member_registration-oNNkl2WY.js:1 msgid "Your preferred name or nickname" -msgstr "" +msgstr "Dein preferierter Name oder Spitzname" -#: dist/assets/member_registration-Bwxov6eP.js:1 +#: dist/assets/member_registration-oNNkl2WY.js:1 msgid "What are your pronouns?" -msgstr "" +msgstr "Welche sind deine Pronomen?" -#: dist/assets/member_registration-Bwxov6eP.js:1 +#: dist/assets/member_registration-oNNkl2WY.js:1 msgid "(Optional)" -msgstr "" +msgstr "(optional)" -#: dist/assets/member_registration-Bwxov6eP.js:1 +#: dist/assets/member_registration-oNNkl2WY.js:1 msgid "What is your date of birth?" -msgstr "" +msgstr "Was ist dein Geburtsdatum?" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "What is your company name?" +msgstr "Wie heißt deine Firma?" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "Please enter the official company name" +msgstr "Bitte, gebe den offiziellen Name der Firma an" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "Choose your entry shares" +msgstr "Mitgliedschaftsanteile" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "How many shares would you like to join with?" +msgstr "Mit wie vielen Anteilen möchtest du die Genossenschaft beitreten?" -#: dist/assets/member_registration-Bwxov6eP.js:1 -msgid "What is your address?" +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "You are joining with" +msgstr "Du tretest die Genossenschaft mit Anteil(en) im Wert von" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "worth of shares." msgstr "" -#: dist/assets/member_registration-Bwxov6eP.js:1 +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "Choose your membership type" +msgstr "Wähle deinen Mitgliedschaftsstatus" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "Active member" +msgstr "Aktives Mitglied" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "Investing member" +msgstr "Investierendes Mitglied" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "Investing members are supporters of the Cooperative. They cannot vote in the General Assembly and cannot use the services of the Cooperative." +msgstr "Investierende Mitglieder sind fördernde Mitglieder. Sie haben kein Stimmrecht in der Generalversammlung und können die Leistungen der Genossenschaft nicht nutzen." + +#: dist/assets/member_registration-oNNkl2WY.js:1 +#, fuzzy +#| msgid "Member details" +msgid "Personal details" +msgstr "Mitgliedsdetails" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "What is your name?" +msgstr "Was ist dein Name?" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "First name and last name" +msgstr "Vor- und Nachname" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "Are you joining as an individual or company?" +msgstr "Beteiligst du dich als Einzelperson oder Firma?" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "Individual" +msgstr "Einzelperson" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "Company" +msgstr "Firma" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "Address & Contact Info" +msgstr "Adresse & Kontakt" + +#: dist/assets/member_registration-oNNkl2WY.js:1 msgid "Street & house number" -msgstr "" +msgstr "Straße & Hausnummer" -#: dist/assets/member_registration-Bwxov6eP.js:1 +#: dist/assets/member_registration-oNNkl2WY.js:1 msgid "Postcode" -msgstr "" +msgstr "PLZ" -#: dist/assets/member_registration-Bwxov6eP.js:1 +#: dist/assets/member_registration-oNNkl2WY.js:1 msgid "City" -msgstr "" +msgstr "Ort" -#: dist/assets/member_registration-Bwxov6eP.js:1 +#: dist/assets/member_registration-oNNkl2WY.js:1 msgid "Country" -msgstr "" - -#: dist/assets/member_registration-Bwxov6eP.js:1 -msgid "Contact info" -msgstr "" +msgstr "Land" -#: dist/assets/member_registration-Bwxov6eP.js:1 +#: dist/assets/member_registration-oNNkl2WY.js:1 msgid "E-mail" -msgstr "" +msgstr "E-mail" -#: dist/assets/member_registration-Bwxov6eP.js:1 +#: dist/assets/member_registration-oNNkl2WY.js:1 msgid "Phone number" +msgstr "Telefonnummer" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +#, fuzzy +#| msgid "Name" +msgid "Name:" +msgstr "Name" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "Company Name:" +msgstr "Firmenname:" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "Preferred name:" +msgstr "Preferierter Name:" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "Pronouns:" +msgstr "Pronomen:" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "Date of birth:" +msgstr "Geburtsdatum:" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "E-mail:" +msgstr "E-mail:" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "Phone:" +msgstr "Telefonnummer:" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "Address:" +msgstr "Adresse:" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "Declarations" +msgstr "Erklärungen" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "I hereby request membership in the SuperCoop. I would like to take part with " +msgstr "Ich beantrage hiermit die Aufnahme in die SuperCoop. Ich möchte mich mit insgesamt " + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid " share(s)." +msgstr " Anteil(en) an der Genossenschaft beteiligen." + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "In accordance with the bylaws and the law, I agree to purchase shares at a price of" +msgstr "Ich verpflichte mich, die nach Satzung und Gesetz vorgesehenen Zahlungen in Höhe von" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid " per share, as well as the membership fee of " +msgstr " je Geschäftsanteil plus einem Eintrittsgeld in Höhe von " + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid ", which will be used to cover administrative costs. I agree to transfer " +msgstr " zu leisten, das der Deckung von Verwaltungskosten dient. Insgesamt verpflichte ich mich daher, " + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid " in total" +msgstr " zu leisten" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "I have been provided with a copy of the Bylaws of SuperCoop (either in digital or print form), which can be accessed below:" +msgstr "Die Satzung von SuperCoop ist mir (entweder digital oder in gedruckter Form) ausgehändigt worden kann hier eingesehen werden:" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "Bylaws" +msgstr "" + +#: dist/assets/member_registration-oNNkl2WY.js:1 +msgid "" +"\n" +"I accept that the Bylaws set a minimum membership period of three years, up to the end of the third accounting year.\n" +"The long membership period helps secure financial stability and is an important part of the cooperative principle,\n" +"which is oriented towards long-term goals. A transfer of shares in the Cooperative in accordance with the Bylaws is allowed before the\n" +"end of the minimum membership period.\n" +msgstr "" +"\n" +"Ich nehme zur Kenntnis, dass die Satzung eine Kündigungsfrist von 3 Jahren zum Ende des Geschäftsjahres" +"bestimmt. Die lange Laufzeit dient zur finanziellen Stabilität und ist ein wesentlicher Kern des" +"Genossenschaftsprinzips, das auf langfristige Ziele ausgerichtet ist. Eine Übertragung von Geschäftsanteilen" +"ist auch vorher bereits möglich und in der Satzung geregelt.\n" + +#: dist/assets/member_registration-oNNkl2WY.js:6 +msgid "I agree to pay the payment(s) via bank transfer to the account specified below:" +msgstr "Ich werde meine (Rest-)Zahlungen per Überweisung leisten und auf folgendes Konto überweisen:" + +#: dist/assets/member_registration-oNNkl2WY.js:6 +msgid "Account Owner" +msgstr "Kontoinhaber" + +#: dist/assets/member_registration-oNNkl2WY.js:6 +msgid "Subject" +msgstr "Betreff" + +#: dist/assets/member_registration-oNNkl2WY.js:6 +msgid "" +"\n" +"I accept the Data Processing Agreement listed below:\n" +msgstr "Ich nehme die Datenschutzerklärung zur Kenntnis:" + +#: dist/assets/member_registration-oNNkl2WY.js:8 +msgid "" +"\n" +"Welcome to SuperCoop! We're excited to welcome you as a new member of our cooperative.\n" +"Please fill out the form below so we can process your application.\n" msgstr "" +"\n" +"Herzlich Wilkommen bei SuperCoop! Wir freuen uns, dich als Mitglied unserer Genossenschaft begrüßen zu dürfen.\n" +"Bitte, fülle das folgende Formular aus, damit wir deinen Antrag bearbeiten können.\n" + +#: dist/assets/member_registration-oNNkl2WY.js:11 +msgid "Become a SuperCoop Member!" +msgstr "Werde SuperCoop-Mitglied!" + +#: dist/assets/member_registration-oNNkl2WY.js:11 +msgid "Step 1 - Your Membership" +msgstr "Schritt 1 - Deine Mitgliedschaft" + +#: dist/assets/member_registration-oNNkl2WY.js:11 +msgid "Next - Overview & Declarations" +msgstr "Weiter zur Übersicht und Erklärungen" + +#: dist/assets/member_registration-oNNkl2WY.js:11 +msgid "Step 2 - Overview & Declarations" +msgstr "Schritt 2 - Übersicht & Erklärungen" + +#: dist/assets/member_registration-oNNkl2WY.js:11 +msgid "e.g. payment in installments, including payment periods" +msgstr "z.B. Ratenzahlung, wenn möglich mit Angabe der Zahlungsintervalle" + +#: dist/assets/member_registration-oNNkl2WY.js:11 +msgid "Back" +msgstr "Zurück" + +#: dist/assets/member_registration-oNNkl2WY.js:11 +msgid "Submit your application" +msgstr "Kostenpflichtig absenden" #: dist/assets/welcome_desk-Bf3fsVAG.js:1 msgid "Use the search field on the top right." From e697a1f9bba4acfde32278df4d27ab07f97c57fb Mon Sep 17 00:00:00 2001 From: jakubfiala Date: Sat, 25 Oct 2025 19:22:58 +0200 Subject: [PATCH 07/16] nicer styling --- .../form_parts/Membership.tsx | 10 +- .../locale/de/LC_MESSAGES/django.po | 10 +- .../locale/de/LC_MESSAGES/djangojs.po | 133 +++++++++--------- 3 files changed, 82 insertions(+), 71 deletions(-) diff --git a/src/member_registration/form_parts/Membership.tsx b/src/member_registration/form_parts/Membership.tsx index 36794a937..601bd03d6 100644 --- a/src/member_registration/form_parts/Membership.tsx +++ b/src/member_registration/form_parts/Membership.tsx @@ -1,5 +1,6 @@ -import { Form } from "react-bootstrap"; +import { Alert, Form } from "react-bootstrap"; import { SHARE_PRICE } from "../constants"; +import { InfoCircle } from "react-bootstrap-icons"; declare let gettext: (english_text: string) => string; @@ -60,11 +61,14 @@ export default function Membership({ required />
-

+ +

+ +
{gettext( `Investing members are supporters of the Cooperative. They cannot vote in the General Assembly and cannot use the services of the Cooperative.`, )} -

+
{gettext("Personal details")}
{gettext("What is your name?")} diff --git a/tapir/translations/locale/de/LC_MESSAGES/django.po b/tapir/translations/locale/de/LC_MESSAGES/django.po index 73a7c4d64..b248acc09 100644 --- a/tapir/translations/locale/de/LC_MESSAGES/django.po +++ b/tapir/translations/locale/de/LC_MESSAGES/django.po @@ -2,12 +2,12 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. -# +# msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-23 11:07+0200\n" +"POT-Creation-Date: 2025-10-25 19:14+0200\n" "PO-Revision-Date: 2025-07-07 13:06+0000\n" "Last-Translator: Weblate Admin \n" "Language-Team: German \n" @@ -2684,6 +2684,12 @@ msgstr "Mitgliederbüro kontaktieren" msgid "About tapir" msgstr "Über Tapir" +#: core/apps.py:78 +#, fuzzy +#| msgid "Not a member" +msgid "Become a Member" +msgstr "Kein Mitlied" + #: core/models.py:7 msgid "Flag name" msgstr "" diff --git a/tapir/translations/locale/de/LC_MESSAGES/djangojs.po b/tapir/translations/locale/de/LC_MESSAGES/djangojs.po index 1a2af512f..224afdbba 100644 --- a/tapir/translations/locale/de/LC_MESSAGES/djangojs.po +++ b/tapir/translations/locale/de/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-25 18:48+0200\n" +"POT-Creation-Date: 2025-10-25 19:08+0200\n" "PO-Revision-Date: 2024-11-05 11:14+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -91,191 +91,195 @@ msgstr "" msgid "Graph" msgstr "" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "How would you like to be addressed? (optional)" msgstr "Wie möchtest du angesprochen werden? (optional)" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Your preferred name or nickname" msgstr "Dein preferierter Name oder Spitzname" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "What are your pronouns?" msgstr "Welche sind deine Pronomen?" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "(Optional)" msgstr "(optional)" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "What is your date of birth?" msgstr "Was ist dein Geburtsdatum?" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "What is your company name?" msgstr "Wie heißt deine Firma?" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Please enter the official company name" msgstr "Bitte, gebe den offiziellen Name der Firma an" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Choose your entry shares" msgstr "Mitgliedschaftsanteile" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "How many shares would you like to join with?" msgstr "Mit wie vielen Anteilen möchtest du die Genossenschaft beitreten?" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "You are joining with" msgstr "Du tretest die Genossenschaft mit Anteil(en) im Wert von" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "worth of shares." -msgstr "" +msgstr "." -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Choose your membership type" msgstr "Wähle deinen Mitgliedschaftsstatus" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Active member" msgstr "Aktives Mitglied" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Investing member" msgstr "Investierendes Mitglied" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Investing members are supporters of the Cooperative. They cannot vote in the General Assembly and cannot use the services of the Cooperative." msgstr "Investierende Mitglieder sind fördernde Mitglieder. Sie haben kein Stimmrecht in der Generalversammlung und können die Leistungen der Genossenschaft nicht nutzen." -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 #, fuzzy #| msgid "Member details" msgid "Personal details" msgstr "Mitgliedsdetails" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "What is your name?" msgstr "Was ist dein Name?" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "First name and last name" msgstr "Vor- und Nachname" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Are you joining as an individual or company?" msgstr "Beteiligst du dich als Einzelperson oder Firma?" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Individual" msgstr "Einzelperson" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Company" msgstr "Firma" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Address & Contact Info" msgstr "Adresse & Kontakt" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Street & house number" msgstr "Straße & Hausnummer" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Postcode" msgstr "PLZ" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "City" msgstr "Ort" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Country" msgstr "Land" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "E-mail" msgstr "E-mail" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Phone number" msgstr "Telefonnummer" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 #, fuzzy #| msgid "Name" msgid "Name:" msgstr "Name" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Company Name:" msgstr "Firmenname:" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Preferred name:" msgstr "Preferierter Name:" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Pronouns:" msgstr "Pronomen:" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Date of birth:" msgstr "Geburtsdatum:" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "E-mail:" msgstr "E-mail:" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Phone:" msgstr "Telefonnummer:" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Address:" msgstr "Adresse:" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Declarations" msgstr "Erklärungen" -#: dist/assets/member_registration-oNNkl2WY.js:1 -msgid "I hereby request membership in the SuperCoop. I would like to take part with " +#: dist/assets/member_registration-CbL2kstQ.js:1 +#, fuzzy +#| msgid "I hereby request membership in the SuperCoop. I would like to take part with " +msgid "I hereby request membership in the SuperCoop. I would like to take part with" msgstr "Ich beantrage hiermit die Aufnahme in die SuperCoop. Ich möchte mich mit insgesamt " -#: dist/assets/member_registration-oNNkl2WY.js:1 -msgid " share(s)." +#: dist/assets/member_registration-CbL2kstQ.js:1 +#, fuzzy +#| msgid " share(s)." +msgid "share(s)." msgstr " Anteil(en) an der Genossenschaft beteiligen." -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "In accordance with the bylaws and the law, I agree to purchase shares at a price of" msgstr "Ich verpflichte mich, die nach Satzung und Gesetz vorgesehenen Zahlungen in Höhe von" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid " per share, as well as the membership fee of " msgstr " je Geschäftsanteil plus einem Eintrittsgeld in Höhe von " -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid ", which will be used to cover administrative costs. I agree to transfer " msgstr " zu leisten, das der Deckung von Verwaltungskosten dient. Insgesamt verpflichte ich mich daher, " -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid " in total" msgstr " zu leisten" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "I have been provided with a copy of the Bylaws of SuperCoop (either in digital or print form), which can be accessed below:" msgstr "Die Satzung von SuperCoop ist mir (entweder digital oder in gedruckter Form) ausgehändigt worden kann hier eingesehen werden:" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "Bylaws" msgstr "" -#: dist/assets/member_registration-oNNkl2WY.js:1 +#: dist/assets/member_registration-CbL2kstQ.js:1 msgid "" "\n" "I accept that the Bylaws set a minimum membership period of three years, up to the end of the third accounting year.\n" @@ -284,30 +288,27 @@ msgid "" "end of the minimum membership period.\n" msgstr "" "\n" -"Ich nehme zur Kenntnis, dass die Satzung eine Kündigungsfrist von 3 Jahren zum Ende des Geschäftsjahres" -"bestimmt. Die lange Laufzeit dient zur finanziellen Stabilität und ist ein wesentlicher Kern des" -"Genossenschaftsprinzips, das auf langfristige Ziele ausgerichtet ist. Eine Übertragung von Geschäftsanteilen" -"ist auch vorher bereits möglich und in der Satzung geregelt.\n" +"Ich nehme zur Kenntnis, dass die Satzung eine Kündigungsfrist von 3 Jahren zum Ende des Geschäftsjahresbestimmt. Die lange Laufzeit dient zur finanziellen Stabilität und ist ein wesentlicher Kern desGenossenschaftsprinzips, das auf langfristige Ziele ausgerichtet ist. Eine Übertragung von Geschäftsanteilenist auch vorher bereits möglich und in der Satzung geregelt.\n" -#: dist/assets/member_registration-oNNkl2WY.js:6 +#: dist/assets/member_registration-CbL2kstQ.js:6 msgid "I agree to pay the payment(s) via bank transfer to the account specified below:" msgstr "Ich werde meine (Rest-)Zahlungen per Überweisung leisten und auf folgendes Konto überweisen:" -#: dist/assets/member_registration-oNNkl2WY.js:6 +#: dist/assets/member_registration-CbL2kstQ.js:6 msgid "Account Owner" msgstr "Kontoinhaber" -#: dist/assets/member_registration-oNNkl2WY.js:6 +#: dist/assets/member_registration-CbL2kstQ.js:6 msgid "Subject" msgstr "Betreff" -#: dist/assets/member_registration-oNNkl2WY.js:6 +#: dist/assets/member_registration-CbL2kstQ.js:6 msgid "" "\n" "I accept the Data Processing Agreement listed below:\n" msgstr "Ich nehme die Datenschutzerklärung zur Kenntnis:" -#: dist/assets/member_registration-oNNkl2WY.js:8 +#: dist/assets/member_registration-CbL2kstQ.js:8 msgid "" "\n" "Welcome to SuperCoop! We're excited to welcome you as a new member of our cooperative.\n" @@ -317,31 +318,31 @@ msgstr "" "Herzlich Wilkommen bei SuperCoop! Wir freuen uns, dich als Mitglied unserer Genossenschaft begrüßen zu dürfen.\n" "Bitte, fülle das folgende Formular aus, damit wir deinen Antrag bearbeiten können.\n" -#: dist/assets/member_registration-oNNkl2WY.js:11 +#: dist/assets/member_registration-CbL2kstQ.js:11 msgid "Become a SuperCoop Member!" msgstr "Werde SuperCoop-Mitglied!" -#: dist/assets/member_registration-oNNkl2WY.js:11 +#: dist/assets/member_registration-CbL2kstQ.js:11 msgid "Step 1 - Your Membership" msgstr "Schritt 1 - Deine Mitgliedschaft" -#: dist/assets/member_registration-oNNkl2WY.js:11 +#: dist/assets/member_registration-CbL2kstQ.js:11 msgid "Next - Overview & Declarations" msgstr "Weiter zur Übersicht und Erklärungen" -#: dist/assets/member_registration-oNNkl2WY.js:11 +#: dist/assets/member_registration-CbL2kstQ.js:11 msgid "Step 2 - Overview & Declarations" msgstr "Schritt 2 - Übersicht & Erklärungen" -#: dist/assets/member_registration-oNNkl2WY.js:11 +#: dist/assets/member_registration-CbL2kstQ.js:11 msgid "e.g. payment in installments, including payment periods" msgstr "z.B. Ratenzahlung, wenn möglich mit Angabe der Zahlungsintervalle" -#: dist/assets/member_registration-oNNkl2WY.js:11 +#: dist/assets/member_registration-CbL2kstQ.js:11 msgid "Back" msgstr "Zurück" -#: dist/assets/member_registration-oNNkl2WY.js:11 +#: dist/assets/member_registration-CbL2kstQ.js:11 msgid "Submit your application" msgstr "Kostenpflichtig absenden" From 648919a56b9922fcd4009932980f4cedfc629752 Mon Sep 17 00:00:00 2001 From: jakubfiala Date: Sat, 25 Oct 2025 19:50:28 +0200 Subject: [PATCH 08/16] improvements and fixes --- .../MemberRegistration.tsx | 288 ++++++++++-------- src/member_registration/Overview.tsx | 6 +- .../form_parts/CompanyInfo.tsx | 3 + .../form_parts/ContactInfo.tsx | 19 ++ .../form_parts/Membership.tsx | 28 +- .../form_parts/PersonalInfo.tsx | 3 + .../locale/de/LC_MESSAGES/djangojs.po | 166 ++++++---- 7 files changed, 305 insertions(+), 208 deletions(-) diff --git a/src/member_registration/MemberRegistration.tsx b/src/member_registration/MemberRegistration.tsx index fa6eeb382..d6483d153 100644 --- a/src/member_registration/MemberRegistration.tsx +++ b/src/member_registration/MemberRegistration.tsx @@ -46,6 +46,7 @@ const MemberRegistration: React.FC = () => { const [acceptsPayment, setAcceptsPayment] = useState(false); const [acceptsPrivacy, setAcceptsPrivacy] = useState(false); const [otherComments, setOtherComments] = useState(""); + const [validated, setValidated] = useState(false); function onConfirmRegister() { setLoading(true); @@ -80,145 +81,166 @@ const MemberRegistration: React.FC = () => { - - {stage === RegistrationStage.ONE && ( - <> -
{gettext("Step 1 - Your Membership")}
- - {isCompany !== null && ( - <> - +
{gettext("Step 1 - Your Membership")}
+ + {isCompany !== null && ( + <> + + {!isCompany && ( + + )} + {isCompany && ( + - {!isCompany && ( - - )} - {isCompany && ( - - )} - + + { + event.preventDefault(); + if (!event.currentTarget.form?.checkValidity()) { + setValidated(true); + return; + } + + setValidated(false); + setStage(RegistrationStage.TWO); + }} /> - - setStage(RegistrationStage.TWO)} - /> - - - )} - - )} - {stage === RegistrationStage.TWO && ( -
-
- {gettext("Step 2 - Overview & Declarations")} -
- + + )} + + )} + {stage === RegistrationStage.TWO && ( +
+
+ {gettext("Step 2 - Overview & Declarations")} +
+ + +
+ + {gettext("Other comments")} + setOtherComments(event.target.value)} /> - +
+ setStage(RegistrationStage.ONE)} /> -
- - Other comments - setOtherComments(event.target.value)} - required - /> - -
- setStage(RegistrationStage.ONE)} - /> - { + event.preventDefault(); + console.log("test", event.currentTarget.form); + + if (!event.currentTarget.form?.checkValidity()) { + setValidated(true); + return; } - loading={loading} - /> -
+ + onConfirmRegister(); + }} + disabled={ + !acceptsConstitution || + !acceptsMembership || + !acceptsPayment || + !acceptsPeriod || + !acceptsPrivacy + } + loading={loading} + />
- )} - + + )} ); diff --git a/src/member_registration/Overview.tsx b/src/member_registration/Overview.tsx index cfdd939a4..3ec8d2e05 100644 --- a/src/member_registration/Overview.tsx +++ b/src/member_registration/Overview.tsx @@ -47,11 +47,11 @@ export default function Overview({ <>
{gettext("Preferred name:")}
-
{preferredName}
+
{preferredName || "-"}
{gettext("Pronouns:")}
-
{pronouns}
+
{pronouns || "-"}
{gettext("Date of birth:")}
@@ -65,7 +65,7 @@ export default function Overview({
{gettext("Phone:")}
-
{phone}
+
{phone || "-"}
{gettext("Address:")}
diff --git a/src/member_registration/form_parts/CompanyInfo.tsx b/src/member_registration/form_parts/CompanyInfo.tsx index 7bb2664d7..a08ea7662 100644 --- a/src/member_registration/form_parts/CompanyInfo.tsx +++ b/src/member_registration/form_parts/CompanyInfo.tsx @@ -19,6 +19,9 @@ export default function CompanyInfo({ companyName, setCompanyName }: Props) { onChange={(event) => setCompanyName(event.target.value)} required /> + + {gettext("Please specify the official company name.")} + ); } diff --git a/src/member_registration/form_parts/ContactInfo.tsx b/src/member_registration/form_parts/ContactInfo.tsx index efe9f63ea..3fb73c933 100644 --- a/src/member_registration/form_parts/ContactInfo.tsx +++ b/src/member_registration/form_parts/ContactInfo.tsx @@ -42,7 +42,11 @@ export default function ContactInfo({ autoComplete="street-address" name="street" onChange={(event) => setStreet(event.target.value)} + required /> + + {gettext("Please specify the street address.")} + {gettext("Postcode")} @@ -52,7 +56,11 @@ export default function ContactInfo({ autoComplete="postal-code" name="postcode" onChange={(event) => setPostcode(event.target.value)} + required /> + + {gettext("Please specify the postal code.")} + {gettext("City")} @@ -62,7 +70,11 @@ export default function ContactInfo({ name="city" autoComplete="address-level2" onChange={(event) => setCity(event.target.value)} + required /> + + {gettext("Please specify the town or city name.")} + {gettext("Country")} @@ -72,7 +84,11 @@ export default function ContactInfo({ name="country" autoComplete="country-name" onChange={(event) => setCountry(event.target.value)} + required /> + + {gettext("Please specify the country name.")} + {gettext("E-mail")} @@ -84,6 +100,9 @@ export default function ContactInfo({ autoComplete="email" required /> + + {gettext("Please provide a valid e-mail address.")} + {gettext("Phone number")} diff --git a/src/member_registration/form_parts/Membership.tsx b/src/member_registration/form_parts/Membership.tsx index 601bd03d6..3d6f8f903 100644 --- a/src/member_registration/form_parts/Membership.tsx +++ b/src/member_registration/form_parts/Membership.tsx @@ -1,6 +1,5 @@ -import { Alert, Form } from "react-bootstrap"; +import { Form } from "react-bootstrap"; import { SHARE_PRICE } from "../constants"; -import { InfoCircle } from "react-bootstrap-icons"; declare let gettext: (english_text: string) => string; @@ -32,13 +31,18 @@ export default function Membership({ type={"number"} value={shares} name="shares" + min="1" + max="1000" onChange={(event) => setShares(parseInt(event.target.value))} required /> -

+ + {gettext("You have to join with 1 or more shares.")} + + {gettext("You are joining with")}{" "} {shares * SHARE_PRICE}€ {gettext("worth of shares.")} -

+
{gettext("Choose your membership type")}
@@ -60,15 +64,12 @@ export default function Membership({ onChange={(event) => setIsInvesting(event.target.checked)} required /> + + {gettext( + `Investing members are supporters of the Cooperative. They cannot vote in the General Assembly and cannot use the services of the Cooperative.`, + )} + - -
- -
- {gettext( - `Investing members are supporters of the Cooperative. They cannot vote in the General Assembly and cannot use the services of the Cooperative.`, - )} -
{gettext("Personal details")}
{gettext("What is your name?")} @@ -81,6 +82,9 @@ export default function Membership({ autoComplete="name" required /> + + {gettext("Please specify your full name.")} + ); diff --git a/src/member_registration/form_parts/PersonalInfo.tsx b/src/member_registration/form_parts/PersonalInfo.tsx index c16405477..a15e438ca 100644 --- a/src/member_registration/form_parts/PersonalInfo.tsx +++ b/src/member_registration/form_parts/PersonalInfo.tsx @@ -54,6 +54,9 @@ export default function PersonalInfo({ autoComplete="bday" required /> + + {gettext("Please specify your date of birth.")} + ); diff --git a/tapir/translations/locale/de/LC_MESSAGES/djangojs.po b/tapir/translations/locale/de/LC_MESSAGES/djangojs.po index 224afdbba..a93e6aafb 100644 --- a/tapir/translations/locale/de/LC_MESSAGES/djangojs.po +++ b/tapir/translations/locale/de/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-25 19:08+0200\n" +"POT-Creation-Date: 2025-10-25 19:49+0200\n" "PO-Revision-Date: 2024-11-05 11:14+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -91,195 +91,237 @@ msgstr "" msgid "Graph" msgstr "" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "How would you like to be addressed? (optional)" msgstr "Wie möchtest du angesprochen werden? (optional)" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Your preferred name or nickname" msgstr "Dein preferierter Name oder Spitzname" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "What are your pronouns?" msgstr "Welche sind deine Pronomen?" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "(Optional)" msgstr "(optional)" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "What is your date of birth?" msgstr "Was ist dein Geburtsdatum?" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 +#, fuzzy +#| msgid "What is your date of birth?" +msgid "Please specify your date of birth." +msgstr "Was ist dein Geburtsdatum?" + +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "What is your company name?" msgstr "Wie heißt deine Firma?" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Please enter the official company name" msgstr "Bitte, gebe den offiziellen Name der Firma an" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 +#, fuzzy +#| msgid "Please enter the official company name" +msgid "Please specify the official company name." +msgstr "Bitte, gebe den offiziellen Name der Firma an" + +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Choose your entry shares" msgstr "Mitgliedschaftsanteile" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "How many shares would you like to join with?" msgstr "Mit wie vielen Anteilen möchtest du die Genossenschaft beitreten?" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 +msgid "You have to join with 1 or more shares." +msgstr "" + +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "You are joining with" msgstr "Du tretest die Genossenschaft mit Anteil(en) im Wert von" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "worth of shares." msgstr "." -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Choose your membership type" msgstr "Wähle deinen Mitgliedschaftsstatus" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Active member" msgstr "Aktives Mitglied" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Investing member" msgstr "Investierendes Mitglied" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Investing members are supporters of the Cooperative. They cannot vote in the General Assembly and cannot use the services of the Cooperative." msgstr "Investierende Mitglieder sind fördernde Mitglieder. Sie haben kein Stimmrecht in der Generalversammlung und können die Leistungen der Genossenschaft nicht nutzen." -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 #, fuzzy #| msgid "Member details" msgid "Personal details" msgstr "Mitgliedsdetails" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "What is your name?" msgstr "Was ist dein Name?" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "First name and last name" msgstr "Vor- und Nachname" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 +msgid "Please specify your full name." +msgstr "" + +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Are you joining as an individual or company?" msgstr "Beteiligst du dich als Einzelperson oder Firma?" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Individual" msgstr "Einzelperson" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Company" msgstr "Firma" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Address & Contact Info" msgstr "Adresse & Kontakt" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Street & house number" msgstr "Straße & Hausnummer" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 +msgid "Please specify the street address." +msgstr "" + +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Postcode" msgstr "PLZ" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 +msgid "Please specify the postal code." +msgstr "" + +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "City" msgstr "Ort" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 +msgid "Please specify the town or city name." +msgstr "" + +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Country" msgstr "Land" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 +#, fuzzy +#| msgid "Please enter the official company name" +msgid "Please specify the country name." +msgstr "Bitte, gebe den offiziellen Name der Firma an" + +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "E-mail" msgstr "E-mail" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 +msgid "Please provide a valid e-mail address." +msgstr "" + +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Phone number" msgstr "Telefonnummer" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 #, fuzzy #| msgid "Name" msgid "Name:" msgstr "Name" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Company Name:" msgstr "Firmenname:" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Preferred name:" msgstr "Preferierter Name:" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Pronouns:" msgstr "Pronomen:" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Date of birth:" msgstr "Geburtsdatum:" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "E-mail:" msgstr "E-mail:" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Phone:" msgstr "Telefonnummer:" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Address:" msgstr "Adresse:" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Declarations" msgstr "Erklärungen" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 #, fuzzy #| msgid "I hereby request membership in the SuperCoop. I would like to take part with " msgid "I hereby request membership in the SuperCoop. I would like to take part with" msgstr "Ich beantrage hiermit die Aufnahme in die SuperCoop. Ich möchte mich mit insgesamt " -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 #, fuzzy #| msgid " share(s)." msgid "share(s)." msgstr " Anteil(en) an der Genossenschaft beteiligen." -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "In accordance with the bylaws and the law, I agree to purchase shares at a price of" msgstr "Ich verpflichte mich, die nach Satzung und Gesetz vorgesehenen Zahlungen in Höhe von" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid " per share, as well as the membership fee of " msgstr " je Geschäftsanteil plus einem Eintrittsgeld in Höhe von " -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid ", which will be used to cover administrative costs. I agree to transfer " msgstr " zu leisten, das der Deckung von Verwaltungskosten dient. Insgesamt verpflichte ich mich daher, " -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid " in total" msgstr " zu leisten" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "I have been provided with a copy of the Bylaws of SuperCoop (either in digital or print form), which can be accessed below:" msgstr "Die Satzung von SuperCoop ist mir (entweder digital oder in gedruckter Form) ausgehändigt worden kann hier eingesehen werden:" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "Bylaws" -msgstr "" +msgstr "Satzung" -#: dist/assets/member_registration-CbL2kstQ.js:1 +#: dist/assets/member_registration-SQ152WOn.js:1 msgid "" "\n" "I accept that the Bylaws set a minimum membership period of three years, up to the end of the third accounting year.\n" @@ -290,25 +332,25 @@ msgstr "" "\n" "Ich nehme zur Kenntnis, dass die Satzung eine Kündigungsfrist von 3 Jahren zum Ende des Geschäftsjahresbestimmt. Die lange Laufzeit dient zur finanziellen Stabilität und ist ein wesentlicher Kern desGenossenschaftsprinzips, das auf langfristige Ziele ausgerichtet ist. Eine Übertragung von Geschäftsanteilenist auch vorher bereits möglich und in der Satzung geregelt.\n" -#: dist/assets/member_registration-CbL2kstQ.js:6 +#: dist/assets/member_registration-SQ152WOn.js:6 msgid "I agree to pay the payment(s) via bank transfer to the account specified below:" msgstr "Ich werde meine (Rest-)Zahlungen per Überweisung leisten und auf folgendes Konto überweisen:" -#: dist/assets/member_registration-CbL2kstQ.js:6 +#: dist/assets/member_registration-SQ152WOn.js:6 msgid "Account Owner" msgstr "Kontoinhaber" -#: dist/assets/member_registration-CbL2kstQ.js:6 +#: dist/assets/member_registration-SQ152WOn.js:6 msgid "Subject" msgstr "Betreff" -#: dist/assets/member_registration-CbL2kstQ.js:6 +#: dist/assets/member_registration-SQ152WOn.js:6 msgid "" "\n" "I accept the Data Processing Agreement listed below:\n" msgstr "Ich nehme die Datenschutzerklärung zur Kenntnis:" -#: dist/assets/member_registration-CbL2kstQ.js:8 +#: dist/assets/member_registration-SQ152WOn.js:8 msgid "" "\n" "Welcome to SuperCoop! We're excited to welcome you as a new member of our cooperative.\n" @@ -318,31 +360,35 @@ msgstr "" "Herzlich Wilkommen bei SuperCoop! Wir freuen uns, dich als Mitglied unserer Genossenschaft begrüßen zu dürfen.\n" "Bitte, fülle das folgende Formular aus, damit wir deinen Antrag bearbeiten können.\n" -#: dist/assets/member_registration-CbL2kstQ.js:11 +#: dist/assets/member_registration-SQ152WOn.js:11 msgid "Become a SuperCoop Member!" msgstr "Werde SuperCoop-Mitglied!" -#: dist/assets/member_registration-CbL2kstQ.js:11 +#: dist/assets/member_registration-SQ152WOn.js:11 msgid "Step 1 - Your Membership" msgstr "Schritt 1 - Deine Mitgliedschaft" -#: dist/assets/member_registration-CbL2kstQ.js:11 +#: dist/assets/member_registration-SQ152WOn.js:11 msgid "Next - Overview & Declarations" msgstr "Weiter zur Übersicht und Erklärungen" -#: dist/assets/member_registration-CbL2kstQ.js:11 +#: dist/assets/member_registration-SQ152WOn.js:11 msgid "Step 2 - Overview & Declarations" msgstr "Schritt 2 - Übersicht & Erklärungen" -#: dist/assets/member_registration-CbL2kstQ.js:11 +#: dist/assets/member_registration-SQ152WOn.js:11 +msgid "Other comments" +msgstr "Zusatzinformationen" + +#: dist/assets/member_registration-SQ152WOn.js:11 msgid "e.g. payment in installments, including payment periods" msgstr "z.B. Ratenzahlung, wenn möglich mit Angabe der Zahlungsintervalle" -#: dist/assets/member_registration-CbL2kstQ.js:11 +#: dist/assets/member_registration-SQ152WOn.js:11 msgid "Back" msgstr "Zurück" -#: dist/assets/member_registration-CbL2kstQ.js:11 +#: dist/assets/member_registration-SQ152WOn.js:11 msgid "Submit your application" msgstr "Kostenpflichtig absenden" From 9f7d82134daade1d0f9881c90d29e0b7e0e2277c Mon Sep 17 00:00:00 2001 From: jakubfiala Date: Sat, 25 Oct 2025 20:02:15 +0200 Subject: [PATCH 09/16] set minimum age --- .../MemberRegistration.tsx | 13 +- src/member_registration/constants.ts | 1 + .../form_parts/PersonalInfo.tsx | 17 +- .../locale/de/LC_MESSAGES/djangojs.po | 149 +++++++++--------- 4 files changed, 105 insertions(+), 75 deletions(-) diff --git a/src/member_registration/MemberRegistration.tsx b/src/member_registration/MemberRegistration.tsx index d6483d153..f21fa35a6 100644 --- a/src/member_registration/MemberRegistration.tsx +++ b/src/member_registration/MemberRegistration.tsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useEffect, useRef, useState } from "react"; import { Card, Form } from "react-bootstrap"; import { useApi } from "../hooks/useApi.ts"; import { CoopApi } from "../api-client/index.ts"; @@ -48,6 +48,16 @@ const MemberRegistration: React.FC = () => { const [otherComments, setOtherComments] = useState(""); const [validated, setValidated] = useState(false); + const stageTwoForm = useRef(null); + + useEffect(() => { + if (stageTwoForm.current && stage === RegistrationStage.TWO) { + (stageTwoForm.current as HTMLFormElement).scrollIntoView({ + behavior: "smooth", + }); + } + }, [stage]); + function onConfirmRegister() { setLoading(true); @@ -158,6 +168,7 @@ const MemberRegistration: React.FC = () => { )} {stage === RegistrationStage.TWO && (
string; @@ -19,6 +21,16 @@ export default function PersonalInfo({ dob, setDOB, }: Props) { + const dobMax = useMemo(() => { + const max = new Date(); + max.setFullYear(max.getFullYear() - MIN_REGISTRATION_AGE); + + const yyyy = max.getFullYear().toString().padStart(4, "0"); + const mm = max.getMonth().toString().padStart(2, "0"); + const dd = max.getDay().toString().padStart(2, "0"); + return `${yyyy}-${mm}-${dd}`; + }, []); + return ( <> @@ -52,10 +64,13 @@ export default function PersonalInfo({ name="dob" onChange={(event) => setDOB(event.target.value)} autoComplete="bday" + max={dobMax} required /> - {gettext("Please specify your date of birth.")} + {gettext( + "Please specify your date of birth. You must be 18 years or older to become a member.", + )} diff --git a/tapir/translations/locale/de/LC_MESSAGES/djangojs.po b/tapir/translations/locale/de/LC_MESSAGES/djangojs.po index a93e6aafb..d7eb65259 100644 --- a/tapir/translations/locale/de/LC_MESSAGES/djangojs.po +++ b/tapir/translations/locale/de/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-25 19:49+0200\n" +"POT-Creation-Date: 2025-10-25 20:00+0200\n" "PO-Revision-Date: 2024-11-05 11:14+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -91,237 +91,235 @@ msgstr "" msgid "Graph" msgstr "" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "How would you like to be addressed? (optional)" msgstr "Wie möchtest du angesprochen werden? (optional)" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Your preferred name or nickname" msgstr "Dein preferierter Name oder Spitzname" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "What are your pronouns?" msgstr "Welche sind deine Pronomen?" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "(Optional)" msgstr "(optional)" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "What is your date of birth?" msgstr "Was ist dein Geburtsdatum?" -#: dist/assets/member_registration-SQ152WOn.js:1 -#, fuzzy -#| msgid "What is your date of birth?" -msgid "Please specify your date of birth." -msgstr "Was ist dein Geburtsdatum?" +#: dist/assets/member_registration-DAYt42qV.js:1 +msgid "Please specify your date of birth. You must be 18 years or older to become a member." +msgstr "" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "What is your company name?" msgstr "Wie heißt deine Firma?" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Please enter the official company name" msgstr "Bitte, gebe den offiziellen Name der Firma an" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 #, fuzzy #| msgid "Please enter the official company name" msgid "Please specify the official company name." msgstr "Bitte, gebe den offiziellen Name der Firma an" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Choose your entry shares" msgstr "Mitgliedschaftsanteile" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "How many shares would you like to join with?" msgstr "Mit wie vielen Anteilen möchtest du die Genossenschaft beitreten?" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "You have to join with 1 or more shares." msgstr "" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "You are joining with" msgstr "Du tretest die Genossenschaft mit Anteil(en) im Wert von" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "worth of shares." msgstr "." -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Choose your membership type" msgstr "Wähle deinen Mitgliedschaftsstatus" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Active member" msgstr "Aktives Mitglied" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Investing member" msgstr "Investierendes Mitglied" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Investing members are supporters of the Cooperative. They cannot vote in the General Assembly and cannot use the services of the Cooperative." msgstr "Investierende Mitglieder sind fördernde Mitglieder. Sie haben kein Stimmrecht in der Generalversammlung und können die Leistungen der Genossenschaft nicht nutzen." -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 #, fuzzy #| msgid "Member details" msgid "Personal details" msgstr "Mitgliedsdetails" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "What is your name?" msgstr "Was ist dein Name?" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "First name and last name" msgstr "Vor- und Nachname" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Please specify your full name." msgstr "" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Are you joining as an individual or company?" msgstr "Beteiligst du dich als Einzelperson oder Firma?" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Individual" msgstr "Einzelperson" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Company" msgstr "Firma" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Address & Contact Info" msgstr "Adresse & Kontakt" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Street & house number" msgstr "Straße & Hausnummer" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Please specify the street address." msgstr "" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Postcode" msgstr "PLZ" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Please specify the postal code." msgstr "" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "City" msgstr "Ort" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Please specify the town or city name." msgstr "" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Country" msgstr "Land" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 #, fuzzy #| msgid "Please enter the official company name" msgid "Please specify the country name." msgstr "Bitte, gebe den offiziellen Name der Firma an" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "E-mail" msgstr "E-mail" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Please provide a valid e-mail address." msgstr "" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Phone number" msgstr "Telefonnummer" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 #, fuzzy #| msgid "Name" msgid "Name:" msgstr "Name" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Company Name:" msgstr "Firmenname:" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Preferred name:" msgstr "Preferierter Name:" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Pronouns:" msgstr "Pronomen:" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Date of birth:" msgstr "Geburtsdatum:" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "E-mail:" msgstr "E-mail:" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Phone:" msgstr "Telefonnummer:" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Address:" msgstr "Adresse:" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Declarations" msgstr "Erklärungen" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 #, fuzzy #| msgid "I hereby request membership in the SuperCoop. I would like to take part with " msgid "I hereby request membership in the SuperCoop. I would like to take part with" msgstr "Ich beantrage hiermit die Aufnahme in die SuperCoop. Ich möchte mich mit insgesamt " -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 #, fuzzy #| msgid " share(s)." msgid "share(s)." msgstr " Anteil(en) an der Genossenschaft beteiligen." -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "In accordance with the bylaws and the law, I agree to purchase shares at a price of" msgstr "Ich verpflichte mich, die nach Satzung und Gesetz vorgesehenen Zahlungen in Höhe von" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid " per share, as well as the membership fee of " msgstr " je Geschäftsanteil plus einem Eintrittsgeld in Höhe von " -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid ", which will be used to cover administrative costs. I agree to transfer " msgstr " zu leisten, das der Deckung von Verwaltungskosten dient. Insgesamt verpflichte ich mich daher, " -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid " in total" msgstr " zu leisten" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "I have been provided with a copy of the Bylaws of SuperCoop (either in digital or print form), which can be accessed below:" msgstr "Die Satzung von SuperCoop ist mir (entweder digital oder in gedruckter Form) ausgehändigt worden kann hier eingesehen werden:" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "Bylaws" msgstr "Satzung" -#: dist/assets/member_registration-SQ152WOn.js:1 +#: dist/assets/member_registration-DAYt42qV.js:1 msgid "" "\n" "I accept that the Bylaws set a minimum membership period of three years, up to the end of the third accounting year.\n" @@ -332,25 +330,25 @@ msgstr "" "\n" "Ich nehme zur Kenntnis, dass die Satzung eine Kündigungsfrist von 3 Jahren zum Ende des Geschäftsjahresbestimmt. Die lange Laufzeit dient zur finanziellen Stabilität und ist ein wesentlicher Kern desGenossenschaftsprinzips, das auf langfristige Ziele ausgerichtet ist. Eine Übertragung von Geschäftsanteilenist auch vorher bereits möglich und in der Satzung geregelt.\n" -#: dist/assets/member_registration-SQ152WOn.js:6 +#: dist/assets/member_registration-DAYt42qV.js:6 msgid "I agree to pay the payment(s) via bank transfer to the account specified below:" msgstr "Ich werde meine (Rest-)Zahlungen per Überweisung leisten und auf folgendes Konto überweisen:" -#: dist/assets/member_registration-SQ152WOn.js:6 +#: dist/assets/member_registration-DAYt42qV.js:6 msgid "Account Owner" msgstr "Kontoinhaber" -#: dist/assets/member_registration-SQ152WOn.js:6 +#: dist/assets/member_registration-DAYt42qV.js:6 msgid "Subject" msgstr "Betreff" -#: dist/assets/member_registration-SQ152WOn.js:6 +#: dist/assets/member_registration-DAYt42qV.js:6 msgid "" "\n" "I accept the Data Processing Agreement listed below:\n" msgstr "Ich nehme die Datenschutzerklärung zur Kenntnis:" -#: dist/assets/member_registration-SQ152WOn.js:8 +#: dist/assets/member_registration-DAYt42qV.js:8 msgid "" "\n" "Welcome to SuperCoop! We're excited to welcome you as a new member of our cooperative.\n" @@ -360,35 +358,35 @@ msgstr "" "Herzlich Wilkommen bei SuperCoop! Wir freuen uns, dich als Mitglied unserer Genossenschaft begrüßen zu dürfen.\n" "Bitte, fülle das folgende Formular aus, damit wir deinen Antrag bearbeiten können.\n" -#: dist/assets/member_registration-SQ152WOn.js:11 +#: dist/assets/member_registration-DAYt42qV.js:11 msgid "Become a SuperCoop Member!" msgstr "Werde SuperCoop-Mitglied!" -#: dist/assets/member_registration-SQ152WOn.js:11 +#: dist/assets/member_registration-DAYt42qV.js:11 msgid "Step 1 - Your Membership" msgstr "Schritt 1 - Deine Mitgliedschaft" -#: dist/assets/member_registration-SQ152WOn.js:11 +#: dist/assets/member_registration-DAYt42qV.js:11 msgid "Next - Overview & Declarations" msgstr "Weiter zur Übersicht und Erklärungen" -#: dist/assets/member_registration-SQ152WOn.js:11 +#: dist/assets/member_registration-DAYt42qV.js:11 msgid "Step 2 - Overview & Declarations" msgstr "Schritt 2 - Übersicht & Erklärungen" -#: dist/assets/member_registration-SQ152WOn.js:11 +#: dist/assets/member_registration-DAYt42qV.js:11 msgid "Other comments" msgstr "Zusatzinformationen" -#: dist/assets/member_registration-SQ152WOn.js:11 +#: dist/assets/member_registration-DAYt42qV.js:11 msgid "e.g. payment in installments, including payment periods" msgstr "z.B. Ratenzahlung, wenn möglich mit Angabe der Zahlungsintervalle" -#: dist/assets/member_registration-SQ152WOn.js:11 +#: dist/assets/member_registration-DAYt42qV.js:11 msgid "Back" msgstr "Zurück" -#: dist/assets/member_registration-SQ152WOn.js:11 +#: dist/assets/member_registration-DAYt42qV.js:11 msgid "Submit your application" msgstr "Kostenpflichtig absenden" @@ -457,3 +455,8 @@ msgstr "Welcome Desk" #: dist/assets/welcome_desk-Bf3fsVAG.js:1 msgid "Name or member ID" msgstr "Name oder Mitgliedsnummer" + +#, fuzzy +#~| msgid "What is your date of birth?" +#~ msgid "Please specify your date of birth." +#~ msgstr "Was ist dein Geburtsdatum?" From 98dd6902a1bb572330bdca6a2115d4756511bc93 Mon Sep 17 00:00:00 2001 From: jakubfiala Date: Sat, 25 Oct 2025 20:07:51 +0200 Subject: [PATCH 10/16] translate 18y message --- tapir/translations/locale/de/LC_MESSAGES/djangojs.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tapir/translations/locale/de/LC_MESSAGES/djangojs.po b/tapir/translations/locale/de/LC_MESSAGES/djangojs.po index d7eb65259..91e3ca58a 100644 --- a/tapir/translations/locale/de/LC_MESSAGES/djangojs.po +++ b/tapir/translations/locale/de/LC_MESSAGES/djangojs.po @@ -113,7 +113,7 @@ msgstr "Was ist dein Geburtsdatum?" #: dist/assets/member_registration-DAYt42qV.js:1 msgid "Please specify your date of birth. You must be 18 years or older to become a member." -msgstr "" +msgstr "Bitte gib dein Geburtsdatum an. Du musst mindestens 18 Jahre alt sein, um Mitglied zu werden." #: dist/assets/member_registration-DAYt42qV.js:1 msgid "What is your company name?" From 16824bb2a733ad970db7331eefd981737de7e284 Mon Sep 17 00:00:00 2001 From: jakubfiala Date: Sat, 25 Oct 2025 20:46:19 +0200 Subject: [PATCH 11/16] better translations --- .../MemberRegistration.tsx | 10 +- .../form_parts/Membership.tsx | 1 + .../form_parts/PersonalInfo.tsx | 1 + .../locale/de/LC_MESSAGES/djangojs.po | 166 ++++++++---------- 4 files changed, 84 insertions(+), 94 deletions(-) diff --git a/src/member_registration/MemberRegistration.tsx b/src/member_registration/MemberRegistration.tsx index f21fa35a6..6f8e3aa0f 100644 --- a/src/member_registration/MemberRegistration.tsx +++ b/src/member_registration/MemberRegistration.tsx @@ -48,12 +48,13 @@ const MemberRegistration: React.FC = () => { const [otherComments, setOtherComments] = useState(""); const [validated, setValidated] = useState(false); - const stageTwoForm = useRef(null); + const topRef = useRef(null); useEffect(() => { - if (stageTwoForm.current && stage === RegistrationStage.TWO) { - (stageTwoForm.current as HTMLFormElement).scrollIntoView({ + if (topRef.current) { + (topRef.current as HTMLHeadingElement).scrollIntoView({ behavior: "smooth", + block: "start", }); } }, [stage]); @@ -87,7 +88,7 @@ const MemberRegistration: React.FC = () => { return ( -
{gettext("Become a SuperCoop Member!")}
+
{gettext("Become a SuperCoop Member!")}
@@ -168,7 +169,6 @@ const MemberRegistration: React.FC = () => { )} {stage === RegistrationStage.TWO && ( setShares(parseInt(event.target.value))} required /> diff --git a/src/member_registration/form_parts/PersonalInfo.tsx b/src/member_registration/form_parts/PersonalInfo.tsx index 189b99f2a..8e3537381 100644 --- a/src/member_registration/form_parts/PersonalInfo.tsx +++ b/src/member_registration/form_parts/PersonalInfo.tsx @@ -65,6 +65,7 @@ export default function PersonalInfo({ onChange={(event) => setDOB(event.target.value)} autoComplete="bday" max={dobMax} + style={{ width: "auto" }} required /> diff --git a/tapir/translations/locale/de/LC_MESSAGES/djangojs.po b/tapir/translations/locale/de/LC_MESSAGES/djangojs.po index 91e3ca58a..ab1c54355 100644 --- a/tapir/translations/locale/de/LC_MESSAGES/djangojs.po +++ b/tapir/translations/locale/de/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-25 20:00+0200\n" +"POT-Creation-Date: 2025-10-25 20:37+0200\n" "PO-Revision-Date: 2024-11-05 11:14+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -91,235 +91,223 @@ msgstr "" msgid "Graph" msgstr "" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "How would you like to be addressed? (optional)" msgstr "Wie möchtest du angesprochen werden? (optional)" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Your preferred name or nickname" msgstr "Dein preferierter Name oder Spitzname" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "What are your pronouns?" msgstr "Welche sind deine Pronomen?" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "(Optional)" msgstr "(optional)" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "What is your date of birth?" msgstr "Was ist dein Geburtsdatum?" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Please specify your date of birth. You must be 18 years or older to become a member." msgstr "Bitte gib dein Geburtsdatum an. Du musst mindestens 18 Jahre alt sein, um Mitglied zu werden." -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "What is your company name?" msgstr "Wie heißt deine Firma?" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Please enter the official company name" msgstr "Bitte, gebe den offiziellen Name der Firma an" -#: dist/assets/member_registration-DAYt42qV.js:1 -#, fuzzy -#| msgid "Please enter the official company name" +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Please specify the official company name." msgstr "Bitte, gebe den offiziellen Name der Firma an" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Choose your entry shares" msgstr "Mitgliedschaftsanteile" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "How many shares would you like to join with?" msgstr "Mit wie vielen Anteilen möchtest du die Genossenschaft beitreten?" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "You have to join with 1 or more shares." msgstr "" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "You are joining with" msgstr "Du tretest die Genossenschaft mit Anteil(en) im Wert von" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "worth of shares." -msgstr "." +msgstr "bei." -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Choose your membership type" msgstr "Wähle deinen Mitgliedschaftsstatus" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Active member" msgstr "Aktives Mitglied" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Investing member" msgstr "Investierendes Mitglied" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Investing members are supporters of the Cooperative. They cannot vote in the General Assembly and cannot use the services of the Cooperative." msgstr "Investierende Mitglieder sind fördernde Mitglieder. Sie haben kein Stimmrecht in der Generalversammlung und können die Leistungen der Genossenschaft nicht nutzen." -#: dist/assets/member_registration-DAYt42qV.js:1 -#, fuzzy -#| msgid "Member details" +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Personal details" -msgstr "Mitgliedsdetails" +msgstr "Persönliche Angaben" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "What is your name?" msgstr "Was ist dein Name?" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "First name and last name" msgstr "Vor- und Nachname" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Please specify your full name." -msgstr "" +msgstr "Bitte gebe deinen vollständigen Namen an." -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Are you joining as an individual or company?" msgstr "Beteiligst du dich als Einzelperson oder Firma?" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Individual" msgstr "Einzelperson" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Company" msgstr "Firma" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Address & Contact Info" msgstr "Adresse & Kontakt" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Street & house number" msgstr "Straße & Hausnummer" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Please specify the street address." -msgstr "" +msgstr "Bitte gebe die Straße und Hausnummer an." -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Postcode" msgstr "PLZ" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Please specify the postal code." -msgstr "" +msgstr "Bitte gebe die PLZ an." -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "City" msgstr "Ort" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Please specify the town or city name." -msgstr "" +msgstr "Bitte gebe den Wohnort an." -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Country" msgstr "Land" -#: dist/assets/member_registration-DAYt42qV.js:1 -#, fuzzy -#| msgid "Please enter the official company name" +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Please specify the country name." -msgstr "Bitte, gebe den offiziellen Name der Firma an" +msgstr "Bitte, gebe den Staat, wo du wohnst an" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "E-mail" msgstr "E-mail" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Please provide a valid e-mail address." -msgstr "" +msgstr "Bitte gebe eine gültige E-Mail-Adresse." -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Phone number" msgstr "Telefonnummer" -#: dist/assets/member_registration-DAYt42qV.js:1 -#, fuzzy -#| msgid "Name" +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Name:" msgstr "Name" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Company Name:" msgstr "Firmenname:" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Preferred name:" msgstr "Preferierter Name:" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Pronouns:" msgstr "Pronomen:" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Date of birth:" msgstr "Geburtsdatum:" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "E-mail:" msgstr "E-mail:" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Phone:" msgstr "Telefonnummer:" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Address:" msgstr "Adresse:" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Declarations" msgstr "Erklärungen" -#: dist/assets/member_registration-DAYt42qV.js:1 -#, fuzzy -#| msgid "I hereby request membership in the SuperCoop. I would like to take part with " +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "I hereby request membership in the SuperCoop. I would like to take part with" msgstr "Ich beantrage hiermit die Aufnahme in die SuperCoop. Ich möchte mich mit insgesamt " -#: dist/assets/member_registration-DAYt42qV.js:1 -#, fuzzy -#| msgid " share(s)." +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "share(s)." msgstr " Anteil(en) an der Genossenschaft beteiligen." -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "In accordance with the bylaws and the law, I agree to purchase shares at a price of" msgstr "Ich verpflichte mich, die nach Satzung und Gesetz vorgesehenen Zahlungen in Höhe von" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid " per share, as well as the membership fee of " msgstr " je Geschäftsanteil plus einem Eintrittsgeld in Höhe von " -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid ", which will be used to cover administrative costs. I agree to transfer " msgstr " zu leisten, das der Deckung von Verwaltungskosten dient. Insgesamt verpflichte ich mich daher, " -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid " in total" msgstr " zu leisten" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "I have been provided with a copy of the Bylaws of SuperCoop (either in digital or print form), which can be accessed below:" msgstr "Die Satzung von SuperCoop ist mir (entweder digital oder in gedruckter Form) ausgehändigt worden kann hier eingesehen werden:" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "Bylaws" msgstr "Satzung" -#: dist/assets/member_registration-DAYt42qV.js:1 +#: dist/assets/member_registration-BE6qeNen.js:1 msgid "" "\n" "I accept that the Bylaws set a minimum membership period of three years, up to the end of the third accounting year.\n" @@ -330,25 +318,25 @@ msgstr "" "\n" "Ich nehme zur Kenntnis, dass die Satzung eine Kündigungsfrist von 3 Jahren zum Ende des Geschäftsjahresbestimmt. Die lange Laufzeit dient zur finanziellen Stabilität und ist ein wesentlicher Kern desGenossenschaftsprinzips, das auf langfristige Ziele ausgerichtet ist. Eine Übertragung von Geschäftsanteilenist auch vorher bereits möglich und in der Satzung geregelt.\n" -#: dist/assets/member_registration-DAYt42qV.js:6 +#: dist/assets/member_registration-BE6qeNen.js:6 msgid "I agree to pay the payment(s) via bank transfer to the account specified below:" msgstr "Ich werde meine (Rest-)Zahlungen per Überweisung leisten und auf folgendes Konto überweisen:" -#: dist/assets/member_registration-DAYt42qV.js:6 +#: dist/assets/member_registration-BE6qeNen.js:6 msgid "Account Owner" msgstr "Kontoinhaber" -#: dist/assets/member_registration-DAYt42qV.js:6 +#: dist/assets/member_registration-BE6qeNen.js:6 msgid "Subject" msgstr "Betreff" -#: dist/assets/member_registration-DAYt42qV.js:6 +#: dist/assets/member_registration-BE6qeNen.js:6 msgid "" "\n" "I accept the Data Processing Agreement listed below:\n" msgstr "Ich nehme die Datenschutzerklärung zur Kenntnis:" -#: dist/assets/member_registration-DAYt42qV.js:8 +#: dist/assets/member_registration-BE6qeNen.js:8 msgid "" "\n" "Welcome to SuperCoop! We're excited to welcome you as a new member of our cooperative.\n" @@ -358,35 +346,35 @@ msgstr "" "Herzlich Wilkommen bei SuperCoop! Wir freuen uns, dich als Mitglied unserer Genossenschaft begrüßen zu dürfen.\n" "Bitte, fülle das folgende Formular aus, damit wir deinen Antrag bearbeiten können.\n" -#: dist/assets/member_registration-DAYt42qV.js:11 +#: dist/assets/member_registration-BE6qeNen.js:11 msgid "Become a SuperCoop Member!" msgstr "Werde SuperCoop-Mitglied!" -#: dist/assets/member_registration-DAYt42qV.js:11 +#: dist/assets/member_registration-BE6qeNen.js:11 msgid "Step 1 - Your Membership" msgstr "Schritt 1 - Deine Mitgliedschaft" -#: dist/assets/member_registration-DAYt42qV.js:11 +#: dist/assets/member_registration-BE6qeNen.js:11 msgid "Next - Overview & Declarations" msgstr "Weiter zur Übersicht und Erklärungen" -#: dist/assets/member_registration-DAYt42qV.js:11 +#: dist/assets/member_registration-BE6qeNen.js:11 msgid "Step 2 - Overview & Declarations" msgstr "Schritt 2 - Übersicht & Erklärungen" -#: dist/assets/member_registration-DAYt42qV.js:11 +#: dist/assets/member_registration-BE6qeNen.js:11 msgid "Other comments" msgstr "Zusatzinformationen" -#: dist/assets/member_registration-DAYt42qV.js:11 +#: dist/assets/member_registration-BE6qeNen.js:11 msgid "e.g. payment in installments, including payment periods" msgstr "z.B. Ratenzahlung, wenn möglich mit Angabe der Zahlungsintervalle" -#: dist/assets/member_registration-DAYt42qV.js:11 +#: dist/assets/member_registration-BE6qeNen.js:11 msgid "Back" msgstr "Zurück" -#: dist/assets/member_registration-DAYt42qV.js:11 +#: dist/assets/member_registration-BE6qeNen.js:11 msgid "Submit your application" msgstr "Kostenpflichtig absenden" From 13f022dc6936d83929018b74be2fb694a504d85c Mon Sep 17 00:00:00 2001 From: jakubfiala Date: Sat, 25 Oct 2025 20:46:57 +0200 Subject: [PATCH 12/16] remove console.log --- src/member_registration/MemberRegistration.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/member_registration/MemberRegistration.tsx b/src/member_registration/MemberRegistration.tsx index 6f8e3aa0f..d8472c842 100644 --- a/src/member_registration/MemberRegistration.tsx +++ b/src/member_registration/MemberRegistration.tsx @@ -231,7 +231,6 @@ const MemberRegistration: React.FC = () => { variant={"primary"} onClick={(event) => { event.preventDefault(); - console.log("test", event.currentTarget.form); if (!event.currentTarget.form?.checkValidity()) { setValidated(true); From 54b1b3593dcf88ecfab985030b2395b8844b1849 Mon Sep 17 00:00:00 2001 From: jakubfiala Date: Sat, 25 Oct 2025 21:01:37 +0200 Subject: [PATCH 13/16] add link to login page --- src/member_registration/Intro.tsx | 4 ++-- tapir/accounts/templates/registration/login.html | 7 +++++-- tapir/translations/locale/de/LC_MESSAGES/django.po | 14 ++++++++++---- .../translations/locale/de/LC_MESSAGES/djangojs.po | 2 +- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/member_registration/Intro.tsx b/src/member_registration/Intro.tsx index 2173e9b25..6d5175afd 100644 --- a/src/member_registration/Intro.tsx +++ b/src/member_registration/Intro.tsx @@ -2,10 +2,10 @@ declare let gettext: (english_text: string) => string; export default function Intro() { return ( -
+

diff --git a/tapir/accounts/templates/registration/login.html b/tapir/accounts/templates/registration/login.html index e8223f1d1..3b4631c76 100644 --- a/tapir/accounts/templates/registration/login.html +++ b/tapir/accounts/templates/registration/login.html @@ -11,8 +11,8 @@ {% endblock head %} {% block content %} -
-