diff --git a/.all-contributorsrc b/.all-contributorsrc index c582572b0..30004b0cc 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -831,6 +831,51 @@ "contributions": [ "code" ] + }, + { + "login": "kdachev97", + "name": "Krum Dachev", + "avatar_url": "https://avatars.githubusercontent.com/u/149360576?v=4", + "profile": "https://github.com/kdachev97", + "contributions": [ + "code" + ] + }, + { + "login": "Tuscann", + "name": "Tuscann", + "avatar_url": "https://avatars.githubusercontent.com/u/16596102?v=4", + "profile": "https://github.com/Tuscann", + "contributions": [ + "test" + ] + }, + { + "login": "iliyan90", + "name": "iliyan90", + "avatar_url": "https://avatars.githubusercontent.com/u/74927065?v=4", + "profile": "https://github.com/iliyan90", + "contributions": [ + "code" + ] + }, + { + "login": "gparlakov", + "name": "Georgi Parlakov", + "avatar_url": "https://avatars.githubusercontent.com/u/3482199?v=4", + "profile": "https://github.com/gparlakov", + "contributions": [ + "code" + ] + }, + { + "login": "teodorazhelyazkova", + "name": "Teodora Zhelyazkova", + "avatar_url": "https://avatars.githubusercontent.com/u/103574320?v=4", + "profile": "https://github.com/teodorazhelyazkova", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 10, diff --git a/.eslintrc.js b/.eslintrc.js index 37b2cbf0c..c82e8eaa6 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -45,5 +45,9 @@ module.exports = { endOfLine: 'auto', }, ], + 'no-restricted-imports': ["error", { + "name": "react-i18next", + "message": "Please use next-i18next" + }] }, } diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 237ef2870..791dce22b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -134,7 +134,7 @@ jobs: - uses: actions/checkout@v4 - name: Install kubectl - uses: azure/setup-kubectl@v3 + uses: azure/setup-kubectl@v4 - name: Install kustomize uses: imranismail/setup-kustomize@v2 @@ -175,7 +175,7 @@ jobs: contents: write steps: - name: Release - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 with: generate_release_notes: true @@ -191,7 +191,7 @@ jobs: - uses: actions/checkout@v4 - name: Install kubectl - uses: azure/setup-kubectl@v3 + uses: azure/setup-kubectl@v4 - name: Install kustomize uses: imranismail/setup-kustomize@v2 diff --git a/README.md b/README.md index 825cd8c9a..daf354729 100644 --- a/README.md +++ b/README.md @@ -100,9 +100,7 @@ Watch releases of this repository to be notified about future updates: ## Contributors ✨ - -[![All Contributors](https://img.shields.io/badge/all_contributors-76-orange.svg?style=flat-square)](#contributors-) - +[![All Contributors](https://img.shields.io/badge/all_contributors-81-orange.svg?style=flat-square)](#contributors-) Please check [contributors guide](https://github.com/podkrepi-bg/frontend/blob/master/CONTRIBUTING.md) for: @@ -218,6 +216,13 @@ Thanks goes to these wonderful people: RalitsaIlieva
RalitsaIlieva

💻 Kalina Zhecheva
Kalina Zhecheva

💻 ⚠️ Petar Dimitrov
Petar Dimitrov

💻 + Krum Dachev
Krum Dachev

💻 + Tuscann
Tuscann

⚠️ + iliyan90
iliyan90

💻 + Georgi Parlakov
Georgi Parlakov

💻 + + + Teodora Zhelyazkova
Teodora Zhelyazkova

💻 diff --git a/e2e/yarn.lock b/e2e/yarn.lock index e9af67be6..d77e05353 100644 --- a/e2e/yarn.lock +++ b/e2e/yarn.lock @@ -1031,8 +1031,8 @@ __metadata: linkType: hard "tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.2.0 - resolution: "tar@npm:6.2.0" + version: 6.2.1 + resolution: "tar@npm:6.2.1" dependencies: chownr: ^2.0.0 fs-minipass: ^2.0.0 @@ -1040,7 +1040,7 @@ __metadata: minizlib: ^2.1.1 mkdirp: ^1.0.3 yallist: ^4.0.0 - checksum: db4d9fe74a2082c3a5016630092c54c8375ff3b280186938cfd104f2e089c4fd9bad58688ef6be9cf186a889671bf355c7cda38f09bbf60604b281715ca57f5c + checksum: f1322768c9741a25356c11373bce918483f40fa9a25c69c59410c8a1247632487edef5fe76c5f12ac51a6356d2f1829e96d2bc34098668a2fc34d76050ac2b6c languageName: node linkType: hard diff --git a/package.json b/package.json index 10bfc22d2..8a9917fd8 100644 --- a/package.json +++ b/package.json @@ -27,14 +27,14 @@ }, "dependencies": { "@emotion/cache": "^11.7.1", - "@emotion/react": "^11.8.1", + "@emotion/react": "^11.11.4", "@emotion/server": "^11.4.0", - "@emotion/styled": "^11.8.1", + "@emotion/styled": "^11.11.5", "@mdxeditor/editor": "^0.14.2", - "@mui/icons-material": "^5.14.13", - "@mui/lab": "^5.0.0-alpha.148", - "@mui/material": "^5.14.13", - "@mui/styles": "^5.14.13", + "@mui/icons-material": "^5.15.19", + "@mui/lab": "^5.0.0-alpha.170", + "@mui/material": "^5.15.19", + "@mui/styles": "^5.15.19", "@mui/x-data-grid": "^6.16.1", "@mui/x-date-pickers": "^6.16.1", "@paypal/react-paypal-js": "^7.8.1", @@ -45,7 +45,7 @@ "@stripe/stripe-js": "^3.1.0", "@tanstack/react-query": "^4.16.1", "@tryghost/content-api": "^1.11.4", - "axios": "1.6.0", + "axios": "^1.6.8", "axios-hooks": "2.7.0", "chart.js": "^4.4.0", "chartjs-plugin-annotation": "^3.0.1", @@ -58,7 +58,7 @@ "lodash": "^4.17.21", "mobx": "6.3.2", "mobx-react": "7.2.0", - "next": "13.5.4", + "next": "14.1.1", "next-auth": "^4.24.5", "next-i18next": "^14.0.3", "nookies": "^2.5.2", diff --git a/public/img/partners/lucrat.svg b/public/img/partners/lucrat.svg new file mode 100644 index 000000000..7e9b61c18 --- /dev/null +++ b/public/img/partners/lucrat.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/img/team-photos/MarkMarkov.jpg b/public/img/team-photos/MarkMarkov.jpg new file mode 100644 index 000000000..8b10c66b8 Binary files /dev/null and b/public/img/team-photos/MarkMarkov.jpg differ diff --git a/public/locales/bg/about-project.json b/public/locales/bg/about-project.json index 5a2fae274..b2737320d 100644 --- a/public/locales/bg/about-project.json +++ b/public/locales/bg/about-project.json @@ -12,7 +12,7 @@ "team-gathering": "Събиране на екип от доброволци с разнообразни експертиза и опит.", "november-2020-title": "ноември 2020", "starting": "Стартиране на", - "project-server": "сървър за Проекта.", + "project-server": "Създаване на Discord сървър за Проекта.", "manifesto-preparation": "Подготовка на манифест на ценности и работни принципи.", "meetings-discussions": "Срещи и дискусии с експерти.", "online-panel": "Онлайн панел с медици и НПО представители.", @@ -67,7 +67,7 @@ "association-name": "Сдружение Подкрепи БГ", "finance-report-page": { "financeReport": "Финансови отчети на Сдружение Подкрепи.бг", - "finance-report-2021": "Финансов отчет за 2021 г.:", + "finance-report-2021": "Годишен финансов отчет за 2021 г.:", "finance-report-2022-january-june": "Финансов отчет за полугодие Януари-Юни 2022 г.:", "finance-report-2022": "Годишен финансов отчет за 2022 г.:", "download-from-here": "Свалете от тук" diff --git a/public/locales/bg/auth.json b/public/locales/bg/auth.json index b0fb0c13e..1528caba4 100644 --- a/public/locales/bg/auth.json +++ b/public/locales/bg/auth.json @@ -19,7 +19,6 @@ }, "fields": { "email": "Email", - "email-descriptive": "Въведи email адрес", "password": "Парола", "confirm-password": "Потвърждение на парола", "first-name": "Име", diff --git a/public/locales/bg/beneficiary.json b/public/locales/bg/beneficiary.json index d7047fd9a..c145dc094 100644 --- a/public/locales/bg/beneficiary.json +++ b/public/locales/bg/beneficiary.json @@ -37,7 +37,7 @@ "company-select": "Изберете ЮЛНЦ или", "create-new": "създайте нов", "person-label": "Потребител", - "company-label": "ЮЛНЦ", + "company-label": "ЮЛНЦ" } }, "actions": "Действия", diff --git a/public/locales/bg/campaign-application.json b/public/locales/bg/campaign-application.json new file mode 100644 index 000000000..4d10e1170 --- /dev/null +++ b/public/locales/bg/campaign-application.json @@ -0,0 +1,6 @@ +{ + "cta": { + "next": "Запазете и продължете", + "back": "Назад" + } +} diff --git a/public/locales/bg/campaigns.json b/public/locales/bg/campaigns.json index eee6d3220..3c15ca8e0 100644 --- a/public/locales/bg/campaigns.json +++ b/public/locales/bg/campaigns.json @@ -207,5 +207,12 @@ "nature": "Природа", "art": "Изкуство", "others": "Други" + }, + "campaign-details-report": { + "amount-collected": "Събрана сума", + "available": "Налични", + "guaranteed": "Гарантирани", + "translated": "Преведени", + "accounted": "Отчетени" } } diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json index 6d3ed0eda..492afa66b 100644 --- a/public/locales/bg/common.json +++ b/public/locales/bg/common.json @@ -109,15 +109,15 @@ "profile-button": "На профилния", "another-button": "На друг" }, - "subscribe": "Абонирай се за email известия за кампанията", - "subscribeFooter": "Абонирай се за бюлетина", + "subscribe": "Абонирайте се за email известия за кампанията.", + "subscribeFooter": "Абонирайте се за бюлетина", "subscribeGeneral": "Абонирайте се за email известия от Подкрепи.бг", "subscribe-monthly-newsletter": "Месечен бюлетин на Подкрепи.бг", "subscribeGeneralSubtext": "Получавайте нашия месечен бюлетин, в който ще Ви информираме за най-интересните новини от Подкрепи.бг!", "subscribe-general-monthly-newsletter": "Получавайте нашия месечен бюлетин, за да сте в час най-интересните новини от Подкрепи.бг!", "subscribeGeneralButton": "Абонирайте се за новини", "subscribe-general-newsletter-button": "Абонирайте се", - "confirm-sent": "Моля, активирайте абонамента си от email-a, който Ви изпратихме на {{email}}", + "confirm-sent": "Моля, активирайте абонамента си от email-a, който Ви изпратихме на {{email}}.", "confirm-subscribe": "Записахте се успешно.", "subscribe-title": "Абониране за новините на Подкрепи.бг", "subscribe-campaign-title": "Абониране за новините по кампанията", @@ -125,9 +125,13 @@ "subscribe-text-nonLoggedUser-general": "Моля, продължете като гост и въведете email адреса, на който желаете да получавате известия от нас, или влезте в профила си. Вписвайки се с потребителското си име и парола, ще можете да управлявате абонамента си от своя Личен профил.", "subscribe-text-loggedUser": "Моля, изберете дали желаете да получавате новините за кампанията на email адреса, асоцииран с профила Ви, или на алтернативен адрес:", "subscribe-subtitle": "Искам да получавам новини и известия от Подкрепи.бг на този email адрес:", - "subscribe-campaign-subtTitle": "Искам да получавам новини за кампанията на този email адрес:" + "subscribe-campaign-subtTitle": "Искам да получавам новини за кампанията на този email адрес:", + "email-descriptive": "Въведи email адрес", + "agree-with-newsletter": "Съгласявам се да получавам известия.", + "agree-with-newsletter-campaign": "Съгласявам се да получавам новини за тази кампания и известия от Подкрепи.бг." }, "cookieConsent": "Подкрепи.бг не използва бисквитки, освен тези от трети страни, нужни за аналитичните компоненти Google Analytics и HotJar. Приемането на бисквитките ще ни помогне да подобрим вашето потребителско преживяване.", "cookieConsentButton": "Приемам", - "cookieRejectButton": "Отхвърлям" + "cookieRejectButton": "Отхвърлям", + "rows": "Редове на страница" } diff --git a/public/locales/bg/faq.json b/public/locales/bg/faq.json index 60c5bef26..80b48b712 100644 --- a/public/locales/bg/faq.json +++ b/public/locales/bg/faq.json @@ -10,5 +10,7 @@ "donations": "Дарения", "attracting-donators": "Привличане на дарители", "corporate-partnership": "Корпоративни партньорства" - } + }, + "contact-for-more-info": "Не намерихте информацията, която търсите?", + "contact-us": "Свържете се с нас!" } diff --git a/public/locales/bg/irregularity.json b/public/locales/bg/irregularity.json index d9b0d67a9..c55aa9446 100644 --- a/public/locales/bg/irregularity.json +++ b/public/locales/bg/irregularity.json @@ -45,13 +45,13 @@ "content": "Описание на забелязаното нарушение:", "files": "Ако разполагате с материали, потвърждаващи твърденията Ви, можете да ги прикачите като файлове тук:", "priority-message": "Разглеждането на сигналите за злоупотреба е с първи приоритет за работата на екип Кампании. Ще се свържем с Вас веднага щом завършим необходимите проверки.", - "share-message": "Ако и други хора са запознати с злоупотребате, които описвате, е добре те също да подадат сигнал. Можете да им изпратите линк с покана да попълнят този формуляр.", + "share-message": "Ако и други хора са запознати със злоупотребите, които описвате, добре е те също да подадат сигнал. Можете да им изпратите линк с покана да попълнят този формуляр.", "thanks-message": "Благодарим Ви отново за ангажираността и съдействието,", "sign": "Екипът на Подкрепи.бг" }, "success": { "title": "Благодарим за изпратената информация!", - "subtitle": "Наш представител ще се свърже с Вас, веднага след като бъде обработена!", + "subtitle": "Наш представител ще се свърже с Вас веднага след като бъде обработена!", "label-campaigns": "Разгледайте", "label-project": "Научете повече за" }, diff --git a/public/locales/bg/marketing.json b/public/locales/bg/marketing.json new file mode 100644 index 000000000..54cfa08cd --- /dev/null +++ b/public/locales/bg/marketing.json @@ -0,0 +1,11 @@ +{ + "admin": { + "marketing": "Маркетинг", + "sendConsentEmail": "Изпращане на емайл за съгласие", + "common": { + "templateId": "Идентификатор на Sendgrid шаблон", + "listId": "Идентифицатор на Sendgrid списък с контакти", + "subject": "Тема на емайл" + } + } +} diff --git a/public/locales/bg/news.json b/public/locales/bg/news.json index 0d4aeb052..9122fcd74 100644 --- a/public/locales/bg/news.json +++ b/public/locales/bg/news.json @@ -2,10 +2,10 @@ "news": "Новини", "form-heading": "Създайте нова статия", "edit-form-heading": "Редактирайте статия", - "read-more": "Прочети повече", - "read-less": "Прочети по-малко", + "read-more": "Прочетете повече", + "read-less": "Прочетете по-малко", "see-all-news": "Вижте всички новини", - "news-not-found": "Не бяха намерени новини за тази кампания", + "news-not-found": "Не бяха намерени новини за тази кампания.", "write-new-article": "Напишете нова статия", "status": { "draft": "Чернова", diff --git a/public/locales/bg/notifications.json b/public/locales/bg/notifications.json index 6a1a3a9fa..3937c3f77 100644 --- a/public/locales/bg/notifications.json +++ b/public/locales/bg/notifications.json @@ -1,15 +1,15 @@ { "subscribe": { - "thank-you-msg-heading": "Абонаментът ти е активен!", - "thank-you-msg-text": "Успешно активира своя абонамент. Очаквай новини от нас на {{email}}", + "thank-you-msg-heading": "Абонаментът Ви е активен!", + "thank-you-msg-text": "Успешно активирахте своя абонамент. Очаквайте новини от нас на {{email}}.", "subscription-fail-heading": "Възникна грешка", - "subscription-fail-text": "Не успяхме да активираме абонамента ти. Моля, опитай пак.", + "subscription-fail-text": "Не успяхме да активираме абонамента Ви. Моля, опитайте пак.", "cta": "Към сайта", - "cta-retry": "Опитай пак" + "cta-retry": "Опитайте пак" }, "unsubscribe": { "thank-you-msg": "Успешно деактивирахте абонамента си за известия!", - "subscription-fail": "Възникна проблем при деактивирането на абонамента за известия 🙄", + "subscription-fail": "Възникна проблем при деактивирането на абонамента за известия. 🙄", "cta": "Към сайта", "cta-retry": "Опитай пак" } diff --git a/public/locales/bg/one-time-donation.json b/public/locales/bg/one-time-donation.json index 1f3960c3b..1ef17057e 100644 --- a/public/locales/bg/one-time-donation.json +++ b/public/locales/bg/one-time-donation.json @@ -70,7 +70,7 @@ "reason-donation": "Oснование за превод:", "message-warning": "Ако не въведете точно основанието, може да не успеем да разпределим парите към предназначената кампания.", "recurring-donation-title": "Месечно дарение", - "recurring-donation-info": "Желая да дарявам същата сума всеки месец до края на кампанията. Може да се откажете по всяко време от профила си " + "recurring-donation-info": "Желая да дарявам същата сума всеки месец до края на кампанията. Може да се откажете по всяко време от профила си." }, "alerts": { "success": "Дарението е направено успешно!", diff --git a/public/locales/bg/open-data.json b/public/locales/bg/open-data.json index 3860cf300..f57942d56 100644 --- a/public/locales/bg/open-data.json +++ b/public/locales/bg/open-data.json @@ -1,5 +1,5 @@ { - "swagger-text": "За да осигури пълна прозрачност на дейноста си, освен отворен код, Подкрепи.бг предоставя също и отворени данни. Целта е всеки при интерес да може да достъпи анонимизирани данни, показващи движенията на даренията и сумите по сметките, свързани с кампаниите. За да достъпите тези данни, можете да използвате UI като потребител или директно през публичните методи на API. Описанието на API поддържаме чрез Swagger на този адрес:", + "swagger-text": "За да осигури пълна прозрачност на дейността си, освен отворен код, Подкрепи.бг предоставя също и отворени данни. Целта е всеки при интерес да може да достъпи анонимизирани данни, показващи движенията на даренията и сумите по сметките, свързани с кампаниите. За да достъпите тези данни, можете да използвате UI като потребител или директно през публичните методи на API. Описанието на API поддържаме чрез Swagger на този адрес:", "ethical-use": "За етичното използване на отворените данни сме избрали да използваме лиценз", "rights": ", според който имате право да:", "share": "Споделяте - да копирате и повторно да разпространявате материала на всякакъв носител или във всякакъв формат.", diff --git a/public/locales/bg/partners.json b/public/locales/bg/partners.json index 24621e584..4aebd3f70 100644 --- a/public/locales/bg/partners.json +++ b/public/locales/bg/partners.json @@ -11,14 +11,15 @@ "media": "Медийни партньори", "tech": "Технологични партньори", "marketing": "Маркетинг / PR партньори", + "UXAndDesign": "UX и дизайн партньор", "organizations": "Организации / Организатори" }, "guarants": { "title": "Гаранти", "corporateGivers": "Корпоративни дарители", "megaGivers": "Мега дарители", - "megaGiversSubtitle": "Хора дарили суми над 5000лв", + "megaGiversSubtitle": "Хора, дарили суми над 5000 лв", "superGivers": "Супер дарители", - "superGiversSubtitle": "Хора дарили суми над 500лв" + "superGiversSubtitle": "Хора, дарили суми над 500 лв" } } diff --git a/public/locales/bg/profile.json b/public/locales/bg/profile.json index bc4a1206d..86b753bc2 100644 --- a/public/locales/bg/profile.json +++ b/public/locales/bg/profile.json @@ -2,6 +2,8 @@ "header": "Личен профил", "corporate-header": "Корпоративен профил", "campaigns": "Подкрепени кампании", + "notAuthenticated": "Потребителят не е удостоверен.", + "redirectToLogin": "Потребителската сесия е изтекла. Пренасочване към страницата за вход.", "personalInfo": { "index": "Лична информация", "login": "Данни за вход:", @@ -91,7 +93,7 @@ }, "campaign": { "index": "Нотификации по кампании", - "noSubscriptions": "Към момента не сте се записали за получаване на известия по конкретни кампании", + "noSubscriptions": "Към момента не сте се записали за получаване на известия по конкретни кампании.", "cta": "Отписване" } }, @@ -99,7 +101,7 @@ "certificates": "Сертификати", "birthdateModal": { "ageInvalid": "Трябва да сте над 18 години, за да можете да се регистрирате.", - "newDate": "Порменете рожден ден", + "newDate": "Променете рожден ден", "question": "Кога е Вашият рожден ден?" }, "emailModal": { diff --git a/public/locales/bg/validation.json b/public/locales/bg/validation.json index 35793eb3c..990cce8f1 100644 --- a/public/locales/bg/validation.json +++ b/public/locales/bg/validation.json @@ -13,15 +13,13 @@ "terms-of-use": "Моля, приемете oбщите условия", "terms-of-service": "Моля, приемете политиката за защита на личните данни", "agree-with": "Съгласявам се с", - "agree-with-newsletter": "Съгласявам се да получавам известия", - "agree-with-newsletter-campaign": "Съгласявам се да получавам новини за тази кампания и известия от Подкрепи.бг *", "informed-agree-with": "Запознат съм и се съгласявам с", "terms-and-conditions": "общите условия", - "gdpr": "политиката за защита на личните данни", + "gdpr": "политиката за защита на личните данни.", "newsletter": "Моля дайте своето съгласие", "legal-entity": "Юридическо лице", "unique-field-violation": "Полето `{1}` със тази стойност вече съществува в платформата.", "payment-reference": "Невалиден формат на кода за плащане", "eik-invalid": "Невалидно ЕИК", - "help-us-improve": "Искате ли да ни помогнете да подобрим платформата? Искаме да чуем Вашето мнение? Отделете ни 30 минути, за подобрите платформа на Подкрепи.бг" -} \ No newline at end of file + "help-us-improve": "Съгласявам се да се свържете с мен за подобрение на платформата." +} diff --git a/public/locales/en/about-project.json b/public/locales/en/about-project.json index 201146f90..4ac7d2a6a 100644 --- a/public/locales/en/about-project.json +++ b/public/locales/en/about-project.json @@ -13,7 +13,7 @@ "team-gathering": "Gathering a team of volunteers with various expertise and experience.", "november-2020-title": "November 2020", "starting": "Starting a", - "project-server": "server for the project.", + "project-server": "Creating Discord server for the Project.", "manifesto-preparation": "Preparation of a manifesto of values and working principles.", "meetings-discussions": "Meetings and discussions with experts.", "online-panel": "Online panel with medics and NGO representatives.", @@ -69,7 +69,7 @@ "association-name": "Association Podkrepi BG", "finance-report-page": { "financeReport": "Annual Reports", - "finance-report-2021": "Financial Report for 2021:", + "finance-report-2021": "Annual financial Report for 2021:", "finance-report-2022-january-june": "Semi-annual Financial Report for January-June 2022:", "finance-report-2022": "Annual Financial Report for 2022", "download-from-here": "Download from here" diff --git a/public/locales/en/auth.json b/public/locales/en/auth.json index 4515292c0..1b3e70959 100644 --- a/public/locales/en/auth.json +++ b/public/locales/en/auth.json @@ -18,7 +18,6 @@ }, "fields": { "email": "Email", - "email-descriptive": "Fill in your email", "password": "Password", "confirm-password": "Confirm Password", "first-name": "First name", diff --git a/public/locales/en/bank-transactions.json b/public/locales/en/bank-transactions.json index 1e6146cfb..fdc23badd 100644 --- a/public/locales/en/bank-transactions.json +++ b/public/locales/en/bank-transactions.json @@ -1,27 +1,26 @@ { - "all": "All bank transactions", - "bank-transactions": "Bank transactions", - "transaction-date": "Transaction date", - "amount": "Amount", - "currency": "Currency", - "donation-status": "Donation status", - "id": "Trnsaction ID", - "bank-name": "Bank name", + "all": "All bank transactions", + "bank-transactions": "Bank transactions", + "transaction-date": "Transaction date", + "amount": "Amount", + "currency": "Currency", + "donation-status": "Donation status", + "id": "Trnsaction ID", + "bank-name": "Bank name", + "type": "Type", + "description": "Description", + "cta": { + "download": "Download", + "status": "Donation status", "type": "Type", - "description": "Description", - "cta": { - "download": "Download", - "status": "Donation status", - "type": "Type", - "from": "From", - "to": "To", - "apply-ref-heading": "Apply ref heading", - "apply-ref": "Apply ref", - "edit": "Edit", - "start-sync": "Start sync" - }, - "matched-ref": "Matched ref", - "payment-ref": "Payment ref", - "rerun-dates": "Repeat bank sync" - } - \ No newline at end of file + "from": "From", + "to": "To", + "apply-ref-heading": "Apply ref heading", + "apply-ref": "Apply ref", + "edit": "Edit", + "start-sync": "Start sync" + }, + "matched-ref": "Matched ref", + "payment-ref": "Payment ref", + "rerun-dates": "Repeat bank sync" +} diff --git a/public/locales/en/campaigns.json b/public/locales/en/campaigns.json index bbf5c8a92..820c89e4d 100644 --- a/public/locales/en/campaigns.json +++ b/public/locales/en/campaigns.json @@ -207,5 +207,12 @@ "nature": "Nature", "art": "Art", "others": "others" + }, + "campaign-details-report": { + "amount-collected": "Amount Collected", + "available": "Аvailable", + "guaranteed": "Guaranteed", + "translated": "Translated", + "accounted": "Accounted" } } diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 0b25f135e..11f5a34ba 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -69,7 +69,7 @@ "about-project": "About the project", "support-us": "Support us", "become-a-volunteer": "Become a volunteer", - "reports": "Anual Reports", + "reports": "Annual Reports", "contact": "Contact", "faq": "Frequently asked questions", "privacy-policy": "Privacy Policy", @@ -109,7 +109,7 @@ "profile-button": "On the profile one", "another-button": "On another one" }, - "subscribe": "Subscribe for email notifications for the campaign", + "subscribe": "Subscribe for email notifications for the campaign.", "subscribeFooter": "Subscribe for the newsletter", "subscribeGeneral": "Subscribe for email notifications from Podkrepi.bg", "subscribe-monthly-newsletter": "Monthly newsletter of Podkrepi.bg", @@ -117,7 +117,7 @@ "subscribe-general-monthly-newsletter": "Receive our monthly newsletter so that you are aware of the most interesting news from Podkrepi.bg!", "subscribeGeneralButton": "Subscribe for news", "subscribe-general-newsletter-button": "Subscribe", - "confirm-sent": "Please, activate your subscription from the email that we sent to {{email}}", + "confirm-sent": "Please activate your subscription from the email that we sent to {{email}}", "confirm-subscribe": "You subscribed successfully", "subscribe-title": "Subscribe for news from Podkrepi.bg", "subscribe-campaign-title": "Subscribe for news about the campaign", @@ -125,10 +125,14 @@ "subscribe-text-nonLoggedUser-general": "Please, proceed as a guest and write down your email, on which you want to receive notifications from us or you can log in. If you log in with your and password you will be able to manage your subscription from your Personal profile", "subscribe-text-loggedUser": "Please, choose if you want to receive the news about the campaign on your profile email or on another one:", "subscribe-subtitle": "I want to receive news and notifications from Podkrepi.bg on this email:", - "subscribe-campaign-subtTitle": "I want to receive news about the campaign on this email:" + "subscribe-campaign-subtTitle": "I want to receive news about the campaign on this email:", + "email-descriptive": "Fill in your email", + "agree-with-newsletter": "I agree to receive news.", + "agree-with-newsletter-campaign": "I agree to receive news about this campaign and news by Podkrepi.bg." }, "cookieConsent": "Podkrepi.bg doesn't use cookies, except the third-party cookies required for the analytics components Google Analytics and HotJar. Accepting the cookies will help us improve your user experience.", "cookieConsentButton": "Accept", - "cookieRejectButton": "Reject" + "cookieRejectButton": "Reject", + "rows": "Rows per page" } diff --git a/public/locales/en/faq.json b/public/locales/en/faq.json index a5d2f7a90..485992832 100644 --- a/public/locales/en/faq.json +++ b/public/locales/en/faq.json @@ -10,5 +10,7 @@ "donations": "Donations", "attracting-donators": "Attracting donators", "corporate-partnership": "Corporate partnership" - } + }, + "contact-for-more-info": "You did not find the information you were looking for?", + "contact-us": "Contact us!" } diff --git a/public/locales/en/marketing.json b/public/locales/en/marketing.json new file mode 100644 index 000000000..43bc2206b --- /dev/null +++ b/public/locales/en/marketing.json @@ -0,0 +1,11 @@ +{ + "admin": { + "marketing": "Marketing", + "sendConsentEmail": "Send newsletter consent email", + "common": { + "templateId": "ID of Sendgrid template", + "listId": "ID of Sendgrid contact list", + "subject": "Email subject" + } + } +} diff --git a/public/locales/en/news.json b/public/locales/en/news.json index 51b065432..cbd0a1afd 100644 --- a/public/locales/en/news.json +++ b/public/locales/en/news.json @@ -5,7 +5,7 @@ "edit-form-heading": "Edit article", "read-less": "Read less", "see-all-news": "See all news", - "news-not-found": "No news articles were found for this campaign", + "news-not-found": "No news articles were found for this campaign.", "write-new-article": "Write an article", "status": { "draft": "Draft", diff --git a/public/locales/en/notifications.json b/public/locales/en/notifications.json index 3d9f6a360..dee0541b5 100644 --- a/public/locales/en/notifications.json +++ b/public/locales/en/notifications.json @@ -1,7 +1,7 @@ { "subscribe": { "thank-you-msg-heading": "Your subscription is active!", - "thank-you-msg-text": "You successfully activated your subscription. You can wait news from us on {{email}}", + "thank-you-msg-text": "You successfully activated your subscription. You can wait news from us on {{email}}.", "subscription-fail-heading": "An error occurred", "subscription-fail-text": "We couldn`t activate your subscription. Please, try again.", "cta": "To the site", diff --git a/public/locales/en/partners.json b/public/locales/en/partners.json index 395ab3f5b..995940253 100644 --- a/public/locales/en/partners.json +++ b/public/locales/en/partners.json @@ -11,14 +11,15 @@ "media": "Media Partners", "tech": "Technology Partners", "marketing": "Marketing / PR partners", + "UXAndDesign": "UX and design partner", "organizations": "Organizations / Organizers" }, "guarants": { "title": "Guarantors", "corporateGivers": "Corporate Donors", "megaGivers": "Mega Donors", - "megaGiversSubtitle": "People donated amounts over 5000lv", + "megaGiversSubtitle": "People donated amounts over 5000 lv", "superGivers": "Super Donors", - "superGiversSubtitle": "People donated amounts over 500lv" + "superGiversSubtitle": "People donated amounts over 500 lv" } } diff --git a/public/locales/en/profile.json b/public/locales/en/profile.json index 9a1b1d1cc..113606cee 100644 --- a/public/locales/en/profile.json +++ b/public/locales/en/profile.json @@ -2,6 +2,8 @@ "header": "Personal profile", "corporate-header": "Corporate Profile", "campaigns": "Supported campaigns", + "notAuthenticated": "User is not authenticated.", + "redirectToLogin": "The user session has expired. Redirecting to Login page.", "personalInfo": { "index": "Personal information", "login": "Login information:", @@ -91,7 +93,7 @@ }, "campaign": { "index": "Campaign notifications", - "noSubscriptions": "Към момента не сте се записали за получаване на известия по конкретни кампании", + "noSubscriptions": "You are currently not signed up to receive notifications for a specific campaign.", "cta": "Unsubscribe" } }, diff --git a/public/locales/en/validation.json b/public/locales/en/validation.json index 01883718f..dc846a346 100644 --- a/public/locales/en/validation.json +++ b/public/locales/en/validation.json @@ -13,8 +13,6 @@ "terms-of-use": "Please accept the Terms and Conditions", "terms-of-service": "Please accept the GDPR policy", "agree-with": "I agree to the", - "agree-with-newsletter": "I agree to receive news", - "agree-with-newsletter-campaign": "I agree to receive news about this campaign and news by Podkrepi.bg *", "informed-agree-with": "I understand and I agree to the", "terms-and-conditions": "Terms and Conditions", "gdpr": "General Data Protection Regulation (GDPR)", @@ -23,5 +21,5 @@ "unique-field-violation": "The field `{1}` with this value already exists in the platform.", "payment-reference": "Invalid payment code format", "eik-invalid": "Invalid EIK", - "help-us-improve": "Do you want to help us improve the platform? We want to hear from you? Please spare 30 minutes to help us improve Podkrepi.bg" -} \ No newline at end of file + "help-us-improve": "I agree to be contacted to help improve the platform." +} diff --git a/src/common/hooks/affiliates.ts b/src/common/hooks/affiliates.ts index 08e380bee..63c168f0f 100644 --- a/src/common/hooks/affiliates.ts +++ b/src/common/hooks/affiliates.ts @@ -3,7 +3,7 @@ import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { endpoints } from 'service/apiEndpoints' import { authQueryFnFactory } from 'service/restRequests' import { AlertStore } from 'stores/AlertStore' -import { useTranslation } from 'react-i18next' +import { useTranslation } from 'next-i18next' import { DonationResponse } from 'gql/donations' import { AxiosError, AxiosResponse } from 'axios' import { diff --git a/src/common/hooks/donation.ts b/src/common/hooks/donation.ts index bd2ceb0c1..8cf984612 100644 --- a/src/common/hooks/donation.ts +++ b/src/common/hooks/donation.ts @@ -92,7 +92,10 @@ export async function prefetchDonationsList(client: QueryClient) { } export function useGetPayment(id: string) { - return useQuery([endpoints.payments.getPayment(id).url]) + const { data: session } = useSession() + return useQuery([endpoints.payments.getPayment(id).url], { + queryFn: authQueryFnFactory(session?.accessToken), + }) } export async function prefetchDonationById(client: QueryClient, id: string) { diff --git a/src/common/routes.ts b/src/common/routes.ts index 2490902c7..c567b64e6 100644 --- a/src/common/routes.ts +++ b/src/common/routes.ts @@ -67,6 +67,7 @@ export const partnerUrls = { mentormate: 'https://mentormate.com/', eightyEight: 'https://www.88studiodesign.com/', crossroadsBulgaria: 'https://crossroadsbulgaria.com/', + lucrat: 'https://lucrat.net/', } export const routes = { @@ -90,6 +91,7 @@ export const routes = { campaigns: { index: '/campaigns', create: '/campaigns/create', + application: 'campaigns/application', viewCampaignBySlug: (slug: string) => `/campaigns/${slug}`, viewExpenses: (slug: string) => `/campaigns/${slug}/expenses`, oneTimeDonation: (slug: string) => `/campaigns/donation/${slug}`, @@ -247,6 +249,10 @@ export const routes = { company: { create: '/admin/companies/create', }, + marketing: { + index: '/admin/marketing/', + newsLetterConsent: '/admin/marketing/newsletter-consent', + }, }, dev: { openData: '/open-data', diff --git a/src/components/admin/SupportersGrid.tsx b/src/components/admin/SupportersGrid.tsx index 3fafce02d..ef2ec7858 100644 --- a/src/components/admin/SupportersGrid.tsx +++ b/src/components/admin/SupportersGrid.tsx @@ -19,51 +19,51 @@ const columns: GridColDef[] = [ { field: 'id', headerName: 'ID' }, { field: 'name', - headerName: 'Name', + headerName: 'Име', valueGetter: (p) => `${p.row.person.firstName} ${p.row.person.lastName}`, width: 200, }, { field: 'email', - headerName: 'Email', + headerName: 'Поща', valueGetter: (p) => p.row.person.email, width: 250, }, { field: 'comment', - headerName: 'Comment', + headerName: 'Коментар', width: 200, }, { field: 'createdAt', - headerName: 'Date', + headerName: 'Дата', valueFormatter: (d) => typeof d.value === 'string' && formatDateString(d.value), width: 200, }, - { ...commonProps, field: 'associationMember', headerName: 'Association member' }, - { ...commonProps, field: 'benefactorCampaign', headerName: 'Benefactor campaign' }, - { ...commonProps, field: 'benefactorPlatform', headerName: 'Benefactor platform' }, - { ...commonProps, field: 'companyOtherText', headerName: 'Company other' }, - { ...commonProps, field: 'companySponsor', headerName: 'Company sponsor' }, - { ...commonProps, field: 'companyVolunteer', headerName: 'Company volunteer' }, - { ...commonProps, field: 'partnerBussiness', headerName: 'Partner bussiness' }, - { ...commonProps, field: 'partnerNpo', headerName: 'Partner npo' }, - { ...commonProps, field: 'partnerOtherText', headerName: 'Partner other' }, - { ...commonProps, field: 'roleAssociationMember', headerName: 'Role association member' }, - { ...commonProps, field: 'roleBenefactor', headerName: 'Role benefactor' }, - { ...commonProps, field: 'roleCompany', headerName: 'Role company' }, - { ...commonProps, field: 'rolePartner', headerName: 'Role partner' }, - { ...commonProps, field: 'roleVolunteer', headerName: 'Role volunteer' }, - { ...commonProps, field: 'volunteerBackend', headerName: 'Backend' }, - { ...commonProps, field: 'volunteerDesigner', headerName: 'Designer' }, - { ...commonProps, field: 'volunteerDevOps', headerName: 'Dev ops' }, - { ...commonProps, field: 'volunteerFinancesAndAccounts', headerName: 'Finances and accounts' }, - { ...commonProps, field: 'volunteerFrontend', headerName: 'Frontend' }, - { ...commonProps, field: 'volunteerLawyer', headerName: 'Lawyer' }, - { ...commonProps, field: 'volunteerMarketing', headerName: 'Marketing' }, - { ...commonProps, field: 'volunteerProjectManager', headerName: 'Project manager' }, - { ...commonProps, field: 'volunteerQa', headerName: 'Qa' }, - { ...commonProps, field: 'volunteerSecurity', headerName: 'Security' }, + { ...commonProps, field: 'associationMember', headerName: 'Член на асоциация' }, //Association member + { ...commonProps, field: 'benefactorCampaign', headerName: 'Благотворителна компания' }, //Benefactor campaign + { ...commonProps, field: 'benefactorPlatform', headerName: 'Благотворителна платформа' }, //Benefactor platform + { ...commonProps, field: 'companyOtherText', headerName: 'Други компании' }, //Company other + { ...commonProps, field: 'companySponsor', headerName: 'Спонсор на компания' }, //Company sponsor + { ...commonProps, field: 'companyVolunteer', headerName: 'Доброволец на компания' }, //Company volunteer + { ...commonProps, field: 'partnerBussiness', headerName: 'Бизнес партньор' }, //Partner bussiness + { ...commonProps, field: 'partnerNpo', headerName: 'Партньор npo' }, //Partner npo + { ...commonProps, field: 'partnerOtherText', headerName: 'Други партньори' }, //Partner other + { ...commonProps, field: 'roleAssociationMember', headerName: 'Роля на член асоциация' }, //Role association member + { ...commonProps, field: 'roleBenefactor', headerName: 'Благотворителна роля' }, //Role benefactor + { ...commonProps, field: 'roleCompany', headerName: 'Роля на компания' }, //Role company + { ...commonProps, field: 'rolePartner', headerName: 'Роля на парньор' }, //Role partner + { ...commonProps, field: 'roleVolunteer', headerName: 'Роля на доброволец' }, //Role volunteer + { ...commonProps, field: 'volunteerBackend', headerName: 'Backend' }, //Backend + { ...commonProps, field: 'volunteerDesigner', headerName: 'Дизайнер' }, //Designer + { ...commonProps, field: 'volunteerDevOps', headerName: 'Dev ops' }, //Dev ops + { ...commonProps, field: 'volunteerFinancesAndAccounts', headerName: 'Финанси и сметки' }, //Finances and accounts + { ...commonProps, field: 'volunteerFrontend', headerName: 'Frontend' }, //Frontend + { ...commonProps, field: 'volunteerLawyer', headerName: 'Адвокат' }, //Lawyer + { ...commonProps, field: 'volunteerMarketing', headerName: 'Маркетинг' }, //Marketing + { ...commonProps, field: 'volunteerProjectManager', headerName: 'Проект мениджър' }, //Project manager + { ...commonProps, field: 'volunteerQa', headerName: 'Контрол качество' }, // Qa + { ...commonProps, field: 'volunteerSecurity', headerName: 'Защита' }, //Security ] export default function SupportersGrid() { diff --git a/src/components/admin/campaigns/grid/OrganizerSelect.tsx b/src/components/admin/campaigns/grid/OrganizerSelect.tsx index dbcc7a14a..7977fb241 100644 --- a/src/components/admin/campaigns/grid/OrganizerSelect.tsx +++ b/src/components/admin/campaigns/grid/OrganizerSelect.tsx @@ -34,12 +34,16 @@ export default function OrganizerSelect({ name = 'organizerId', label = 'campaig options={data || []} getOptionLabel={(option: OrganizerResponse) => { if (!option.person) return '' - return `${option.person.firstName} ${option.person.lastName}` + return option.person.company + ? option.person.company.companyName + : `${option.person.firstName} ${option.person.lastName}` }} renderInput={(params) => } renderOption={(params, option: OrganizerResponse) => ( - {`${option.person.firstName} ${option.person.lastName}`} + {option.person.company + ? option.person.company.companyName + : `${option.person.firstName} ${option.person.lastName}`} )} isOptionEqualToValue={(option, value) => diff --git a/src/components/admin/cities/CreateForm.tsx b/src/components/admin/cities/CreateForm.tsx index 9d46544ec..4866935e8 100644 --- a/src/components/admin/cities/CreateForm.tsx +++ b/src/components/admin/cities/CreateForm.tsx @@ -9,7 +9,7 @@ import { Box, Button, Grid, Typography } from '@mui/material' import { CityFormData, CityInput, CityResponse } from 'gql/cities' import { routes } from 'common/routes' -import { ApiErrors, handleUniqueViolation } from 'service/apiErrors' +import { ApiErrors, Message, handleUniqueViolation } from 'service/apiErrors' import { useCreateCity } from 'service/city' import { AlertStore } from 'stores/AlertStore' import GenericForm from 'components/common/form/GenericForm' @@ -42,7 +42,9 @@ export default function EditForm() { const error = e.response if (error?.status === 409) { - const message = error.data.message.map((el) => handleUniqueViolation(el.constraints, t)) + const message = (error.data.message as Message[]).map((el) => + handleUniqueViolation(el.constraints, t), + ) return AlertStore.show(message.join('/n'), 'error') } diff --git a/src/components/admin/donations/grid/Grid.tsx b/src/components/admin/donations/grid/Grid.tsx index 2b2502666..ead4a5fe5 100644 --- a/src/components/admin/donations/grid/Grid.tsx +++ b/src/components/admin/donations/grid/Grid.tsx @@ -96,7 +96,6 @@ export default observer(function Grid() { const { data: { items: donations, total: allDonationsCount } = { items: [], total: 0 }, - error: donationHistoryError, isLoading: isDonationHistoryLoading, refetch, }: UseQueryResult = useDonationsList( diff --git a/src/components/admin/donations/grid/RenderEditPersonCell.tsx b/src/components/admin/donations/grid/RenderEditPersonCell.tsx index bed0413d9..726fce5f2 100644 --- a/src/components/admin/donations/grid/RenderEditPersonCell.tsx +++ b/src/components/admin/donations/grid/RenderEditPersonCell.tsx @@ -44,7 +44,7 @@ export default function RenderEditPersonCell({ const [person, setPerson] = React.useState({ ...initialPerson, } as PersonResponse) - const mutationFn = useEditDonation(params.row.id) + const mutationFn = useEditDonation(params.row.paymentId) const mutation = useMutation< AxiosResponse, @@ -65,6 +65,7 @@ export default function RenderEditPersonCell({ const donationData: UserDonationInput = params.row donationData.targetPersonId = person.id donationData.billingEmail = undefined + donationData.donationId = params.row.id mutation.mutate(donationData) } else { AlertStore.show(t('donations:alerts.requiredError'), 'error') diff --git a/src/components/admin/marketing/EmailConsent/SendEmailConsentForm.tsx b/src/components/admin/marketing/EmailConsent/SendEmailConsentForm.tsx new file mode 100644 index 000000000..0e8b5fa53 --- /dev/null +++ b/src/components/admin/marketing/EmailConsent/SendEmailConsentForm.tsx @@ -0,0 +1,117 @@ +import { Button, Grid, Typography } from '@mui/material' +import { useMutation } from '@tanstack/react-query' +import { AxiosError, AxiosResponse } from 'axios' +import { routes } from 'common/routes' +import FormDatePicker from 'components/common/form/FormDatePicker' +import FormTextField from 'components/common/form/FormTextField' +import GenericForm from 'components/common/form/GenericForm' +import SubmitButton from 'components/common/form/SubmitButton' +import { FormikHelpers } from 'formik' +import { NewsLetterConsentResponse, SendNewsLetterConsent } from 'gql/marketing' +import { useTranslation } from 'next-i18next' +import Link from 'next/link' +import { ApiError } from 'service/apiErrors' +import { useSendConsentEmail } from 'service/marketing' +import { AlertStore } from 'stores/AlertStore' +import * as yup from 'yup' + +export default function SendConsentEmailForm() { + const { t } = useTranslation('marketing') + + const initialValues: SendNewsLetterConsent = { + templateId: '', + listId: '', + subject: '', + dateThreshold: new Date().toISOString(), + } + + const validationSchema: yup.SchemaOf = yup.object().defined().shape({ + templateId: yup.string().required(), + listId: yup.string().required(), + subject: yup.string().required(), + dateThreshold: yup.string().optional(), + }) + + const mutationFn = useSendConsentEmail() + + const handleError = (e: AxiosError) => { + const error = e.response as AxiosResponse + AlertStore.show(error.data.message, 'error') + } + + const mutation = useMutation< + AxiosResponse, + AxiosError, + SendNewsLetterConsent + >({ + mutationFn, + onError: (error) => handleError(error), + onSuccess: (data) => { + const response = data.data + AlertStore.show( + t(`Съобщението беше изпратен успешно на ${response.contactCount} емайла.`), + 'success', + ) + }, + }) + + async function onSubmit( + values: SendNewsLetterConsent, + formikHelpers: FormikHelpers, + ) { + const data: SendNewsLetterConsent = { + templateId: values.templateId, + listId: values.listId, + subject: values.subject, + dateThreshold: values.dateThreshold, + } + await mutation.mutateAsync(data) + if (mutation.isSuccess && !mutation.isLoading) { + formikHelpers.resetForm({ values: initialValues }) + } + } + + return ( + + + + {t('admin.sendConsentEmail')} + + + + + + + + + + + + + + + + Премахване от списък на потребители регистрирани след: + + + + + + + + + + + + + ) +} diff --git a/src/components/admin/marketing/EmailConsent/SendEmailConsentPage.tsx b/src/components/admin/marketing/EmailConsent/SendEmailConsentPage.tsx new file mode 100644 index 000000000..db670ca40 --- /dev/null +++ b/src/components/admin/marketing/EmailConsent/SendEmailConsentPage.tsx @@ -0,0 +1,19 @@ +import AdminContainer from 'components/common/navigation/AdminContainer' +import AdminLayout from 'components/common/navigation/AdminLayout' +import React from 'react' +import SendEmailConsentForm from './SendEmailConsentForm' +import { useTranslation } from 'next-i18next' +import { Container } from '@mui/material' + +export default function SendEmailConsentPage() { + const { t } = useTranslation('marketing') + return ( + + + + + + + + ) +} diff --git a/src/components/admin/marketing/MarketingPage.tsx b/src/components/admin/marketing/MarketingPage.tsx new file mode 100644 index 000000000..394f9587d --- /dev/null +++ b/src/components/admin/marketing/MarketingPage.tsx @@ -0,0 +1,58 @@ +import { Box, Button, CardContent, Container, Grid, Typography } from '@mui/material' +import AdminContainer from 'components/common/navigation/AdminContainer' +import AdminLayout from 'components/common/navigation/AdminLayout' +import React from 'react' +import { useTranslation } from 'next-i18next' +import Link from 'next/link' +import { marketingCards } from './navigation/marketingCards' + +const colors = ['#0179a8', '#346cb0', '#5f4b8b', '#b76ba3', '#a7c796', '#00a28a', '#3686a0'] +export default function MarketingPage() { + const { t } = useTranslation('marketing') + return ( + + + + + {marketingCards.map(({ label, href, icon: Icon, disabled }, index) => ( + + + + ))} + + + + + ) +} diff --git a/src/components/admin/marketing/navigation/marketingCards.ts b/src/components/admin/marketing/navigation/marketingCards.ts new file mode 100644 index 000000000..321c9d95d --- /dev/null +++ b/src/components/admin/marketing/navigation/marketingCards.ts @@ -0,0 +1,18 @@ +import { routes } from 'common/routes' +import ThumbUpAltIcon from '@mui/icons-material/ThumbUpAlt' +import SendIcon from '@mui/icons-material/Send' + +export const marketingCards = [ + { + label: 'Изпращане на емайл за съгласие', + icon: ThumbUpAltIcon, + href: routes.admin.marketing.newsLetterConsent, + disabled: false, + }, + { + label: 'Изпращане на маркетинг емайл', + icon: SendIcon, + href: routes.admin.marketing.newsLetterConsent, + disabled: true, + }, +] diff --git a/src/components/admin/organizers/grid/Grid.tsx b/src/components/admin/organizers/grid/Grid.tsx index ef24bd60a..451c53f76 100644 --- a/src/components/admin/organizers/grid/Grid.tsx +++ b/src/components/admin/organizers/grid/Grid.tsx @@ -44,7 +44,9 @@ export default observer(function Grid() { editable: false, width: 400, valueGetter: (f) => { - return `${f.row.person.firstName} ${f.row.person.lastName}` + return f.row.person.company + ? f.row.person.company.companyName + : `${f.row.person.firstName} ${f.row.person.lastName}` }, }, { diff --git a/src/components/admin/partners/Partners.styled.tsx b/src/components/admin/partners/Partners.styled.tsx index 7e8be3b35..31ac28db9 100644 --- a/src/components/admin/partners/Partners.styled.tsx +++ b/src/components/admin/partners/Partners.styled.tsx @@ -49,10 +49,14 @@ export const StyledArrow = styled(Image)(() => ({ }, '&.slick-prev': { - left: theme.spacing(-0.7), + left: theme.spacing(-4), + width: theme.spacing(4), + height: theme.spacing(3), }, '&.slick-next': { - right: theme.spacing(-0.7), + right: theme.spacing(-4), + width: theme.spacing(4), + height: theme.spacing(3), }, })) diff --git a/src/components/admin/partners/helpers/partnersData.ts b/src/components/admin/partners/helpers/partnersData.ts index 4297fab2c..b8f9eba8e 100644 --- a/src/components/admin/partners/helpers/partnersData.ts +++ b/src/components/admin/partners/helpers/partnersData.ts @@ -25,6 +25,12 @@ export const partners: Partners[] = [ image: '/img/partners/superhosting.svg', website: partnerUrls.superHosting, }, + { + title: 'partners:sections.UXAndDesign', + name: 'lucrat', + image: '/img/partners/lucrat.svg', + website: partnerUrls.lucrat, + }, ] export const mainPartners: MainPartners[] = [ @@ -48,6 +54,11 @@ export const mainPartners: MainPartners[] = [ items: ['kotaOne', 'estProduction'], websites: partnerUrls.videoPartners, }, + // { + // title: 'partners:sections.UXAndDesign', + // items: ['lucrat'], + // websites: partnerUrls.lucrat, + // }, ] export const organizations: Organizations[] = [ @@ -137,4 +148,9 @@ export const allPartners = [ image: '/img/partners/irisSolutions.svg', website: partnerUrls.irisSolutions, }, + { + name: 'lucrat', + image: '/img/partners/lucrat.svg', + website: partnerUrls.lucrat, + }, ] diff --git a/src/components/admin/payments/grid/Grid.tsx b/src/components/admin/payments/grid/Grid.tsx index 3eef8a884..2d184aefb 100644 --- a/src/components/admin/payments/grid/Grid.tsx +++ b/src/components/admin/payments/grid/Grid.tsx @@ -59,7 +59,7 @@ export default observer(function Grid() { setSelectedRecord: setInvalidateRecord, showDelete: showInvalidate, } = InvalidateStore - const paymentId = router.query.paymentId as string | undefined + const paymentId = router.query.id as string | undefined const { data: session } = useSession() const canEditFinancials = session?.user?.realm_access?.roles.includes( 'account-edit-financials-requests', diff --git a/src/components/admin/payments/modals/RefundModal.tsx b/src/components/admin/payments/modals/RefundModal.tsx index b93793677..9f95406af 100644 --- a/src/components/admin/payments/modals/RefundModal.tsx +++ b/src/components/admin/payments/modals/RefundModal.tsx @@ -1,7 +1,15 @@ -import React, { useState } from 'react' +import React from 'react' import { useTranslation } from 'next-i18next' -import { Dialog, Typography, DialogTitle, DialogContent, Grid, CardContent } from '@mui/material' +import { + Dialog, + Typography, + DialogTitle, + DialogContent, + Grid, + CardContent, + CircularProgress, +} from '@mui/material' import { useRefundStripeDonation } from 'service/donation' import { AlertStore } from 'stores/AlertStore' import { UseQueryResult, useMutation } from '@tanstack/react-query' @@ -17,15 +25,9 @@ import { fromMoney } from 'common/util/money' export default observer(function RefundModal() { const { t } = useTranslation('donations') const { isRefundOpen, hideRefund, selectedRecord } = RefundStore - const { data }: UseQueryResult = useGetPayment(selectedRecord.id) - - const initialValues: StripeRefundRequest = { - extPaymentIntentId: '', - } - - if (data) { - initialValues.extPaymentIntentId = data.extPaymentIntentId - } + const { data, isLoading, isError }: UseQueryResult = useGetPayment( + selectedRecord.id, + ) const refundMutation = useMutation({ mutationFn: useRefundStripeDonation(), @@ -35,15 +37,25 @@ export default observer(function RefundModal() { hideRefund() }, }) - const [loading, setLoading] = useState(false) + + if (isLoading) { + return ( + + + + ) + } + if (isError) { + AlertStore.show(t('alerts.error'), 'error') + return + } + + const initialValues: StripeRefundRequest = { + extPaymentIntentId: data.extPaymentIntentId, + } async function onSubmit(values: StripeRefundRequest) { - setLoading(true) - try { - await refundMutation.mutateAsync(values.extPaymentIntentId) - } finally { - setLoading(false) - } + refundMutation.mutate(values.extPaymentIntentId) } return ( @@ -80,7 +92,11 @@ export default observer(function RefundModal() { {t('refund.email')} {data?.billingEmail} - + diff --git a/src/components/client/about-project/helpers/technologyStackData.tsx b/src/components/client/about-project/helpers/technologyStackData.tsx index 72b2f3709..4b453547d 100644 --- a/src/components/client/about-project/helpers/technologyStackData.tsx +++ b/src/components/client/about-project/helpers/technologyStackData.tsx @@ -27,7 +27,7 @@ export const data: TechnologyData[] = [ items: [ 'TypeScript', 'Next.js', - 'NextAuth', + 'NextAuth.js', 'React', 'MaterialUI', 'SCSS', diff --git a/src/components/client/about/helpers/activeMembersData.tsx b/src/components/client/about/helpers/activeMembersData.tsx index c4b23f2b7..3ff10290d 100644 --- a/src/components/client/about/helpers/activeMembersData.tsx +++ b/src/components/client/about/helpers/activeMembersData.tsx @@ -162,4 +162,10 @@ export const data: TeamData[] = [ description: 'Социални медии', linkedInProfile: 'https://www.linkedin.com/in/teodorageorgieva/', }, + { + img: '/img/team-photos/MarkMarkov.jpg', + name: 'Марк Марков', + description: 'Продуктов дизайн', + linkedInProfile: 'https://www.linkedin.com/in/digitallymarked', + }, ] diff --git a/src/components/client/auth/profile/AffiliateProgramTab.tsx b/src/components/client/auth/profile/AffiliateProgramTab.tsx index cd17e400a..7164ad0aa 100644 --- a/src/components/client/auth/profile/AffiliateProgramTab.tsx +++ b/src/components/client/auth/profile/AffiliateProgramTab.tsx @@ -1,6 +1,5 @@ import { Box, Button, CircularProgress, Link, TableBody, Typography } from '@mui/material' import { styled } from '@mui/material/styles' -import { useTranslation } from 'react-i18next' import ProfileTab from './ProfileTab' import { ProfileTabs } from './tabs' import { @@ -8,7 +7,7 @@ import { useGetAffiliateData, useJoinAffiliateProgramMutation, } from 'common/hooks/affiliates' -import { TFunction } from 'next-i18next' +import { TFunction, useTranslation } from 'next-i18next' import { DataGrid, GridColDef, GridRenderCellParams } from '@mui/x-data-grid' import theme from 'common/theme' import { useMemo } from 'react' diff --git a/src/components/client/auth/profile/MyNotificationsTab.tsx b/src/components/client/auth/profile/MyNotificationsTab.tsx index 846fbf71f..ba994e552 100644 --- a/src/components/client/auth/profile/MyNotificationsTab.tsx +++ b/src/components/client/auth/profile/MyNotificationsTab.tsx @@ -17,6 +17,7 @@ const classes = { smallText: `${PREFIX}-smallText`, boxTitle: `${PREFIX}-boxTitle`, statusBoxRow: `${PREFIX}-statusBoxRow`, + statusBoxBtnStatus: `${PREFIX}-statusBoxBtnStatus`, notificationsBox: `${PREFIX}-notificationBox`, statusBtn: `${PREFIX}-statusBtn`, statusActive: `${PREFIX}-statusActive`, @@ -60,8 +61,17 @@ const Root = styled('div')(({ theme }) => ({ }, [`& .${classes.statusBoxRow}`]: { display: 'flex', - justifyContent: 'space-around', + justifyContent: 'space-between', + flexWrap: 'wrap', + gap: 20, alignItems: 'center', + padding: theme.spacing(0, 2), + }, + [`& .${classes.statusBoxBtnStatus}`]: { + display: 'flex', + alignItems: 'center', + gap: 20, + flexWrap: 'wrap', }, [`& .${classes.statusActive}`]: { color: 'green', @@ -111,23 +121,25 @@ export default function MyNotificationsTab() { {t('profile:myNotifications.status-msg')} - - {user?.user.newsletter - ? t('profile:myNotifications.status.active') - : t('profile:myNotifications.status.inactive')} - - + + + {user?.user.newsletter + ? t('profile:myNotifications.status.active') + : t('profile:myNotifications.status.inactive')} + + + {user?.user.newsletter && ( diff --git a/src/components/client/auth/profile/ProfilePage.tsx b/src/components/client/auth/profile/ProfilePage.tsx index d3b3cc2ab..5e78a694e 100644 --- a/src/components/client/auth/profile/ProfilePage.tsx +++ b/src/components/client/auth/profile/ProfilePage.tsx @@ -64,15 +64,11 @@ export default function ProfilePage() { } if (status !== 'authenticated') { - return Not authenticated + return {t('profile:notAuthenticated')} } if (isError && userError.response && userError.response.status === 401) { - return ( - - The user session has expired. Redirecting to login page - - ) + return {t('profile:redirectToLogin')} } const { Component: SelectedTab } = tab diff --git a/src/components/client/auth/profile/UpdateEmailModal.tsx b/src/components/client/auth/profile/UpdateEmailModal.tsx index 34ad1fc54..9945e2633 100644 --- a/src/components/client/auth/profile/UpdateEmailModal.tsx +++ b/src/components/client/auth/profile/UpdateEmailModal.tsx @@ -129,7 +129,7 @@ function UpdateEmailModal({ validationSchema={validationSchema}> - + diff --git a/src/components/client/auth/register/RegisterPage.tsx b/src/components/client/auth/register/RegisterPage.tsx index 562572800..45cddf2aa 100644 --- a/src/components/client/auth/register/RegisterPage.tsx +++ b/src/components/client/auth/register/RegisterPage.tsx @@ -127,7 +127,10 @@ export default function RegisterPage({ providers }: RegisterPageProps) { {profileType === AccountType.INDIVIDUAL && ( <> {t('auth:register.individual')} - + + - - - {' '} )} - + ) } diff --git a/src/components/client/privacy-policy/PrivacyPolicyPage.tsx b/src/components/client/privacy-policy/PrivacyPolicyPage.tsx index 8dbdac067..c43070e4a 100644 --- a/src/components/client/privacy-policy/PrivacyPolicyPage.tsx +++ b/src/components/client/privacy-policy/PrivacyPolicyPage.tsx @@ -64,26 +64,26 @@ export default function AboutPage() { трети лица, в полза на които се набират средства. В случай, че ползвател ни предостави данни за трето лице, то ползвателят носи отговорност да получи и потвърди съгласието на това трето лице неговите лични данни да бъдат предоставени за обработка на ПОДКРЕПИ БГ. В - случай, че сте довроволец или потенциален дарител, вие също предоставяне личните си данни + случай, че сте доброволец или потенциален дарител, вие също предоставяне личните си данни доброволно. +

Обработваните от нас лични данни включват:

    -
  • Обработваните от нас лични данни включват:
  • -
  • Три имена;
  • +
  • Три имена
  • - Единен граждански номер (ЕГН), личен номер на чужденец (ЛНЧ) или друг идентификатор; + Единен граждански номер (ЕГН), личен номер на чужденец (ЛНЧ) или друг идентификатор
  • -
  • Възраст;
  • -
  • Пол;
  • -
  • Местоположение;
  • -
  • Изображения;
  • +
  • Възраст
  • +
  • Пол
  • +
  • Местоположение
  • +
  • Изображения
  • - Данни за контакт: e-mail (електронна поща); телефон; постоянен адрес; местоположение; - потребителско име; FACEBOOK профил; GOOGLE профил; + Данни за контакт: e-mail (електронна поща), телефон, постоянен адрес, местоположение, + потребителско име, FACEBOOK профил, GOOGLE профил
  • -
  • Банкова сметка (IBAN);
  • -
  • Данни за здравословното състояние, където е приложимо;
  • -
  • Данни за образование, където е приложимо;
  • +
  • Банкова сметка (IBAN)
  • +
  • Данни за здравословното състояние, където е приложимо
  • +
  • Данни за образование, където е приложимо
  • Всякакви други лични данни, които вие самите ни предоставите в процеса на използване на нашите услуги, което включва, но не се изчерпва с: лични данни на трети лица, в полза на @@ -93,13 +93,13 @@ export default function AboutPage() { За какви цели обработваме Вашите данни? Предоставените от Вас лични данни се обработват за следните цели:
      -
    • Регистриране на ползватели;
    • -
    • Регистриране на трети лица, в полза на които се набират средства;
    • -
    • Регистриране на спонсори и дарители;
    • -
    • Регистриране на доброволци;
    • -
    • Сключване на договори с дарители и партньори;
    • -
    • За счетоводни цели;
    • -
    • За статистически и научни цели;
    • +
    • Регистриране на ползватели
    • +
    • Регистриране на трети лица, в полза на които се набират средства
    • +
    • Регистриране на спонсори и дарители
    • +
    • Регистриране на доброволци
    • +
    • Сключване на договори с дарители и партньори
    • +
    • За счетоводни цели
    • +
    • За статистически и научни цели
    • Кандидатстване за работа: обработването на документи за кандидатстване за работа/стаж в ПОДКРЕПИ БГ. @@ -107,11 +107,11 @@ export default function AboutPage() {
    • Трудови правоотношения.
    • За целите на информирането на лицата за бъдещи събития и активности и получаване на - информационен бюлетин; + информационен бюлетин.
    • За целите на информирането на ползвателите относно развитието на кампаниите/проектите, в - които те участват; + които те участват.
    • За целите на комуникацията – преди, по време и след дадена кампания или събитие.
    @@ -141,10 +141,10 @@ export default function AboutPage() {
    • държавни органи и органи на МВР – в рамките на техните правомощия и в изпълнение на - изисквания, съдържащи се в нормативната уредба; + изисквания, съдържащи се в нормативната уредба.
    • - трети лица – със съгласието на ползвател с цел предоставянето на услуги от ПОДКРЕПИ БГ; + трети лица – със съгласието на ползвател с цел предоставянето на услуги от ПОДКРЕПИ БГ по изключение и единствено въз основа на договорни отношения с ПОДКРЕПИ БГ.
    • @@ -158,7 +158,7 @@ export default function AboutPage() {
      • Изисква гаранции за спазване на законовите изисквания и добрите практики за обработване - на лични данни; + на лични данни.
      • Сключва писмено споразумение или друг правен акт с идентично действие, който урежда @@ -187,41 +187,41 @@ export default function AboutPage() { която може да бъде идентифицирано дадено физическо лице, като например име, идентификационен номер, данни за местонахождение, онлайн идентификатор или по един или повече признаци, специфични за физическата, физиологичната, генетичната, психическата, - умствената, икономическата, културната или социална идентичност на това физическо лице; + умствената, икономическата, културната или социална идентичност на това физическо лице.
      • специални категории лични данни са лични данни, разкриващи расов или етнически произход, политически възгледи, религиозни или философски убеждения или членство в синдикални организации, генетични данни, биометрични данни, данни за здравословното състояние или данни за сексуалния живот или сексуалната - ориентация на физическото лице.; + ориентация на физическото лице.
      • специални категории лични данни са лични данни, разкриващи расов или етнически произход, политически възгледи, религиозни или философски убеждения или членство в синдикални организации, генетични данни, биометрични данни, данни за здравословното състояние или данни за сексуалния живот или сексуалната - ориентация на физическото лице.; + ориентация на физическото лице.
      • субект на данни е физическото лице, което може - да бъде идентифицирано в резултат от обработването на съответните данни; + да бъде идентифицирано в резултат от обработването на съответните данни.
      • администратор е лице, което само или съвместно - с други лица определя целите и средствата за обработването на лични данни; ПОДКРЕПИ БГ + с други лица определя целите и средствата за обработването на лични данни. ПОДКРЕПИ БГ има качеството на администратор по отношение на личните данни на лицата, с които - взаимодейства за постигане на своята мисия – участници в събития; партньори; спонсори; + взаимодейства за постигане на своята мисия – участници в събития, партньори, спонсори, доброволци и др. Всички лични данни, които ПОДКРЕПИ БГ обработва, са получени доброволно - и в рамките на на съответните отношения; + и в рамките на на съответните отношения.
      • обработващ лични данни е лице, което обработва - лични данни от името на администратора; партньорите и доброволците имат качеството на - обработващи по отношение на личните данни, които ПОДКРЕПИ БГ им е предоставила; при + лични данни от името на администратора, партньорите и доброволците имат качеството на + обработващи по отношение на личните данни, които ПОДКРЕПИ БГ им е предоставила. При отклонение от указанията за работа с тези данни обаче, обработващите могат да загубят качеството на „обработващи“, и да придобият качеството на „администратори“ със - свързаните с това увеличени задължения и отговорности; + свързаните с това увеличени задължения и отговорности.
      Принципи @@ -229,21 +229,21 @@ export default function AboutPage() { При обработването на лични данни, ПОДКРЕПИ БГ се ръководи от следните принципи:
        -
      • Личните данни се обработват законосъобразно и добросъвестно;
      • +
      • Личните данни се обработват законосъобразно и добросъвестно.
      • - Личните данни се събират и се използват за конкретни, точно определени и законни цели; + Личните данни се събират и се използват за конкретни, точно определени и законни цели.
      • -
      • Личните данни трябва да бъдат относими и да не са прекомерни;
      • -
      • Личните данни трябва да са верни и при необходимост да бъдат актуализирани;
      • -
      • Личните данни трябва да се съхраняват не по-дълго, отколкото е необходимо;
      • -
      • Правата на субектите на данни трябва да бъдат спазвани;
      • +
      • Личните данни трябва да бъдат относими и да не са прекомерни.
      • +
      • Личните данни трябва да са верни и при необходимост да бъдат актуализирани.
      • +
      • Личните данни трябва да се съхраняват не по-дълго, отколкото е необходимо.
      • +
      • Правата на субектите на данни трябва да бъдат спазвани.
      • Личните данни трябва да се съхраняват безопасно защитени от неоторизиран достъп, - случайна загуба или повреда; + случайна загуба или повреда.
      • За всяка операция, свързана с лични данни, трябва да остава следа, позволяваща да се - установи кой, кога и как е обработвал данните; + установи кой, кога и как е обработвал данните.
      • Личните данни се прехвърлят по изключение към държави или територии извън Европейското @@ -270,28 +270,28 @@ export default function AboutPage() {
        • субектът на данните е дал съгласие за обработване на личните му данни от ПОДКРЕПИ БГ за - една или повече конкретни цели; съгласието трябва да бъде свободно изразено, конкретно, - информирано и недвусмислено; то може да бъде изразено посредством изявление или ясно - потвърждаващо действие; + една или повече конкретни цели. Съгласието трябва да бъде свободно изразено, конкретно, + информирано и недвусмислено. То може да бъде изразено посредством изявление или ясно + потвърждаващо действие.
        • обработването е необходимо за изпълнението на договор, сключен между ПОДКРЕПИ БГ и субекта на данните, или за предприемане на стъпки по искане на субекта на данните преди - сключването на договор; + сключването на договор.
        • обработването е необходимо за изпълнението на договор, сключен между ПОДКРЕПИ БГ и друго юридическо лице, предоставящо данни на свои служители/партньори с цел предоставяне на - услуги от страна на ПОДКРЕПИ БГ; + услуги от страна на ПОДКРЕПИ БГ.
        • обработването е необходимо за спазването на законово задължение, което се прилага спрямо - ПОДКРЕПИ БГ; + ПОДКРЕПИ БГ.
        • обработването е необходимо, за да бъдат защитени жизненоважните интереси на субекта на - данните или на друго физическо лице; + данните или на друго физическо лице.
        • обработването е необходимо за изпълнението на задача от обществен интерес или при @@ -305,30 +305,30 @@ export default function AboutPage() {
          • субектът на данни е дал своето изрично съгласие за обработването на тези лични данни за - една или повече конкретни цели; + една или повече конкретни цели.
          • обработването е необходимо за целите на изпълнението на задълженията и упражняването на специалните права на ПОДКРЕПИ БГ или на субекта на данните по силата на трудовото право - или правото в областта на социалната сигурност и социалната закрила; + или правото в областта на социалната сигурност и социалната закрила.
          • обработването е необходимо, за да бъдат защитени жизненоважните интереси на субекта на данните или на друго физическо лице, когато субектът на данните е физически или - юридически неспособен да даде своето съгласие;{' '} + юридически неспособен да даде своето съгласие.{' '}
          • обработването е свързано с лични данни, които явно са направени обществено достояние от - субекта на данните; + субекта на данните.
          • обработването е необходимо с цел установяване, упражняване или защита на правни - претенции; + претенции.
          • обработването е необходимо за целите на превантивната или трудовата медицина, за оценка на трудоспособността на служителя, медицинската диагноза, осигуряването на здравни или - социални грижи или лечение; + социални грижи или лечение.
          • обработването е необходимо от съображения от обществен интерес в областта на @@ -390,9 +390,9 @@ export default function AboutPage() { ненужно забавяне. Например когато:
              -
            • вече не са необходими за целите, за които са били събрани или обработвани;
            • -
            • ако възразите срещу обработването;
            • -
            • ако данните са обработвани незаконосъобразно;
            • +
            • вече не са необходими за целите, за които са били събрани или обработвани
            • +
            • ако възразите срещу обработването
            • +
            • ако данните са обработвани незаконосъобразно
            • трябва да бъдат изтрити с цел спазване на правно задължение по правото на ЕС, правото на България или на друга държава. @@ -413,16 +413,16 @@ export default function AboutPage() {
              • Когато оспорвате точността на личните данни (ограничението е за определен срок, - който позволява да се провери точността на данните); + който позволява да се провери точността на данните).
              • Когато обработването е неправомерно, но не желаете да бъдат изтрити, а само - ограничени;{' '} + ограничени.{' '}
              • Когато ПОДКРЕПИ БГ не се нуждае повече от личните ви данни за целите на обработването, но Вие ги изисквате за установяване, упражняване или защита на правни - претенции; + претенции.
              • Когато възразите срещу обработването и очаквате ПОДКРЕПИ БГ да провери дали @@ -499,14 +499,14 @@ export default function AboutPage() { удостоверителни услуги, Закона за електронното управление и Закона за електронната идентификация. Искането или жалбата следва да позволяват идентифицирането на субекта на данните, като при подаването им задължително се посочва най-малко следната информация: 1) - три имена на субекта на данните; 2) ЕГН; 3) физически и/или и-мейл адрес, на който - субектът желае да получи отговор; 4) телефон за контакт; 5) описание на искането (в - свободен текст). По желание на субекта, към искането или жалбата могат да бъдат приложени - допълнителни документи. ПОДКРЕПИ БГ има задължението да разгледа Вашето искане в срок до - два месеца от получаване на искането. Срокът може да се удължи с още един месец, когато - това се налага заради сложността или броя на исканията. В случай, че субектът на данни - няма право да упражни исканото от него право, в срок от 2 месеца от получаване на - искането, представител на ПОДКРЕПИ БГ изпраща до субекта на данни аргументиран отказ. + три имена на субекта на данните 2) ЕГН 3) физически и/или и-мейл адрес, на който субектът + желае да получи отговор 4) телефон за контакт 5) описание на искането (в свободен текст). + По желание на субекта, към искането или жалбата могат да бъдат приложени допълнителни + документи. ПОДКРЕПИ БГ има задължението да разгледа Вашето искане в срок до два месеца от + получаване на искането. Срокът може да се удължи с още един месец, когато това се налага + заради сложността или броя на исканията. В случай, че субектът на данни няма право да + упражни исканото от него право, в срок от 2 месеца от получаване на искането, представител + на ПОДКРЕПИ БГ изпраща до субекта на данни аргументиран отказ. В случай, че не отговорим в предвидените срокове или не сте удовлетворени от получения @@ -516,7 +516,7 @@ export default function AboutPage() { Имате право по всяко време и независимо от комуникацията с ПОДКРЕПИ БГ да подадете жалба до надзорен орган, който за Република България е Комисията за защита на личните данни, с - адрес: гр. София 1592, бул. „Проф. Цветан Лазаров” № 2; електронна поща:{' '} + адрес: гр. София 1592, бул. „Проф. Цветан Лазаров” № 2 електронна поща:{' '} kzld@cpdp.bg. Повече за дейността на Комисията можете да откриете на{' '} https://www.cpdp.bg/. @@ -534,16 +534,16 @@ export default function AboutPage() { 6 (шест) месеца:лични данни, които са предоставени от субектите на данни с цел кандидатстване по обяви за набиране на служители – в случай, че не се е стигнало до сключване на договор със съответното лице - или освен ако кандидатът не е дал съгласието си за съхранение за по-дълъг срок; + или освен ако кандидатът не е дал съгласието си за съхранение за по-дълъг срок.
              • 1 (една) година:
                  -
                • лични данни по прекратени или изтекли договори;
                • -
                • лични данни, които се съдържат в работни версии на документи;
                • +
                • лични данни по прекратени или изтекли договори
                • +
                • лични данни, които се съдържат в работни версии на документи
                • лични данни, които се съдържат в справки, обслужващи вътрешните процеси в ПОДКРЕПИ - БГ; + БГ
                • всички останали документи, за които в тези Правила не е предвиден по-дълъг срок за @@ -553,11 +553,11 @@ export default function AboutPage() {
                • 5 (пет) години след изтичането на дадена - дарителска кампания; + дарителска кампания
                • 1 (една) година след прекратяването на - регистрацията на уебсайта от ползвател; + регистрацията на уебсайта от ползвател
                • 3 (три) години и половина след прекратяване на @@ -565,7 +565,7 @@ export default function AboutPage() {
                  • трудови досиета, освен ако няма правно основание за допълнителна обработка, като - например правен спор; + например правен спор
                • @@ -574,7 +574,7 @@ export default function AboutPage() {
                  • лични данни, съдържащи се в граждански договори, освен ако няма правно основание за - допълнителна обработка, като например правен спор; + допълнителна обработка, като например правен спор
                  @@ -585,13 +585,13 @@ export default function AboutPage() {
                • ведомости за заплати и възнаграждения и свързаната с тях информация – за срок от 50 (петдесет) години, считано от 1 януари на отчетния период, следващ отчетния период, - за който се отнасят; + за който се отнасят
              • До оттегляне на съгласието: всички лични - данни, които са предоставени с цел комуникация и получване на съобщения от ПОДКРЕПИ БГ, + данни, които са предоставени с цел комуникация и получаване на съобщения от ПОДКРЕПИ БГ, се пазят до момента, в който субектът оттегли съгласието си за получаване на комуникация от ПОДКРЕПИ БГ. Субектът на данните може да оттегли съгласието си по всяко време.
              • @@ -618,33 +618,33 @@ export default function AboutPage() {
                • - ограничава физическия достъп до помещенията, в които се съхраняват лични данни (достъпът + Ограничава физическия достъп до помещенията, в които се съхраняват лични данни (достъпът се осъществява само от упълномощени представители на ПОДКРЕПИ БГ в рамките на техните - задължения чрез използване на ключалки и други средства за физически достъп); + задължения чрез използване на ключалки и други средства за физически достъп).
                • - прилага политика за „чисто бюро“, по силата на която всички документи, съдържащи лични - данни, следва да са прибрани в заключени шкафове; + Прилага политика за „чисто бюро“, по силата на която всички документи, съдържащи лични + данни, следва да са прибрани в заключени шкафове.
                • - съхранява хартиения си архив в специално оборудвани за целта помещения, осигуряващи - защитата му в случай на пожар или наводнение; + Съхранява хартиения си архив в специално оборудвани за целта помещения, осигуряващи + защитата му в случай на пожар или наводнение.
                • - обменът на хартиени документи, съдържащи лични данни, с лица извън ПОДКРЕПИ БГ, се + Обменът на хартиени документи, съдържащи лични данни с лица извън ПОДКРЕПИ БГ, се осъществява само в запечатани пликове и чрез използването на упълномощени представители и доверени подизпълнители и др.
                • - в определени случаи достъп до личните данни могат да имат: членовете на управителните - органи; доставчици на външни услуги, като: пощенски и счетоводни услуги, услуги по + В определени случаи достъп до личните данни могат да имат: членовете на управителните + органи, доставчици на външни услуги, като: пощенски и счетоводни услуги, услуги по техническа (IT) поддръжка и пр. Всички трети страни, които действат в качеството на обработващи личните данни, държат и използват лични данни от името на ПОДКРЕПИ БГ само с - цел да ни доставят своите услуги; + цел да ни доставят своите услуги.
                • ПОДКРЕПИ БГ може да разкрива лични данни на професионални съветници и експерти с цел да - получи тяхното съдействие за изпълнение на своята дейност; + получи тяхното съдействие за изпълнение на своята дейност.
                • Когато ПОДКРЕПИ БГ ангажира трети страни да оперират с лични данни от свое име, това @@ -662,18 +662,18 @@ export default function AboutPage() {
                  • - ограничава логическия достъп до информационните системи, чрез които се обработват и + Ограничава логическия достъп до информационните системи, чрез които се обработват и съхраняват лични данни (достъпът се осъществява само от упълномощени представители на ПОДКРЕПИ БГ, в рамките на техните задължения, чрез използване на индивидуални потребителски имена и пароли).
                  • Се запознават с нормативната база, вътрешните правила и политики на ПОДКРЕПИ БГ за - защита на личните данни; + защита на личните данни.
                  • Се инструктират за опасностите от нарушаване сигурността на личните данни, които се - обработват от ПОДКРЕПИ БГ; + обработват от ПОДКРЕПИ БГ.
                  • Се задължават да не споделят критична информация (идентификатори, пароли за достъп и @@ -689,12 +689,12 @@ export default function AboutPage() {
                    • - ограничава логическия достъп до информационните системи, чрез които се обработват и + Ограничава логическия достъп до информационните системи, чрез които се обработват и съхраняват лични данни (достъпът се осъществява само от упълномощени представители на ПОДКРЕПИ БГ, в рамките на техните задължения, чрез използване на индивидуални потребителски имена и пароли).
                    • -
                    • Използване на антивирусни и криптиращи програми;
                    • +
                    • Използване на антивирусни и криптиращи програми.
                    Настоящата политика е приета на 25.05.2021 г. Всяка промяна в политиката ще бъде отразена diff --git a/src/components/client/terms-of-service/TermsOfServicePage.tsx b/src/components/client/terms-of-service/TermsOfServicePage.tsx index 4f9639e52..ad0a5a872 100644 --- a/src/components/client/terms-of-service/TermsOfServicePage.tsx +++ b/src/components/client/terms-of-service/TermsOfServicePage.tsx @@ -149,7 +149,7 @@ export default function AboutPage() { желаете да наберете средства, в заявление за одобрение на кампания, както и според желанието и необходимостта да предоставите документи, свързани с установяване на нуждата. След изпращане на заявлението и основните документи към Подкрепи БГ през личния профил на - Огрганизатора, кампанията ще бъде публично достъпна чрез Сайта с прецененото от + Организатора, кампанията ще бъде публично достъпна чрез Сайта с прецененото от организатора съдържание. @@ -734,7 +734,7 @@ export default function AboutPage() { марки, марки за услуги или други бележки за права на собственост, включени в или придружаващи Сайта и/или Платформата или Съдържанието, освен по начините, допустими съгласно Общите условия. Тези ограничения важат за целите материали или за части от тях, - освен за кода на Платформата, който е публично достъпен и свободен за изпозлване. + освен за кода на Платформата, който е публично достъпен и свободен за използване. 16.3. Нямате право да използвате, копирате, адаптирате, модифицирате, подготвяте @@ -800,8 +800,8 @@ export default function AboutPage() { без предизвестие и по всяко време, да решим да ограничим, прекъснем, деактивираме или анулираме вашият профил или достъп до него. По отношение на споменатите по-горе, ограничение, прекъсване, деактивиране или анулиране се извършват в следните случаи, без - изброяването да е изчерпателно: (i) предоставената информация се окаже неточна, измамна, - или остаряла; (ii) установят се нарушения на настоящите Общи условия или на приложимото + изброяването да е изчерпателно: (a) предоставената информация се окаже неточна, измамна, + или остаряла; (б) установят се нарушения на настоящите Общи условия или на приложимото законодателство. @@ -827,10 +827,10 @@ export default function AboutPage() { 22.2. Вие се съгласявате, че освобождавате Подкрепи БГ oт всякакви претенции, задължения, - вреди, загуби и разходи, произтичащи от или по какъвто и да е начин свързани с: + вреди, загуби и разходи, произтичащи от или по какъвто и да е начин свързани със:
                      -
                    • Вашето съдържание в профила ви
                    • +
                    • съдържаието в профила ви
                    • несъответствие с настоящите Общи условия
                    23. Контролен закон и юрисдикция diff --git a/src/components/common/CookieConsentPopup.tsx b/src/components/common/CookieConsentPopup.tsx index 30e3b6e94..5973fae2f 100644 --- a/src/components/common/CookieConsentPopup.tsx +++ b/src/components/common/CookieConsentPopup.tsx @@ -1,5 +1,5 @@ import CookieConsent from 'react-cookie-consent' -import { useTranslation } from 'react-i18next' +import { useTranslation } from 'next-i18next' import theme from 'common/theme' diff --git a/src/components/common/LinkButton.tsx b/src/components/common/LinkButton.tsx index f63b55ce1..b55fca589 100644 --- a/src/components/common/LinkButton.tsx +++ b/src/components/common/LinkButton.tsx @@ -3,10 +3,11 @@ import Link, { LinkProps } from 'next/link' import { forwardRef, Ref } from 'react' export type LinkRef = HTMLButtonElement -export type NextLinkProps = ButtonProps & Pick +export type NextLinkProps = ButtonProps & + Pick const LinkButton = ( - { href, as, prefetch, locale, disabled, ...props }: NextLinkProps, + { href, as, prefetch, legacyBehavior, locale, disabled, ...props }: NextLinkProps, ref: Ref, ) => (