From d42e83fd8ce8134bf6d7dc84bc397c04cef7f897 Mon Sep 17 00:00:00 2001 From: Petr Jasek Date: Thu, 30 May 2024 10:04:41 +0200 Subject: [PATCH 01/21] update translations --- .../translations/fi/LC_MESSAGES/messages.mo | Bin 58884 -> 59082 bytes .../translations/fi/LC_MESSAGES/messages.po | 609 +++++++++--------- .../fr_CA/LC_MESSAGES/messages.mo | Bin 62768 -> 62949 bytes .../fr_CA/LC_MESSAGES/messages.po | 609 +++++++++--------- 4 files changed, 638 insertions(+), 580 deletions(-) diff --git a/newsroom/translations/fi/LC_MESSAGES/messages.mo b/newsroom/translations/fi/LC_MESSAGES/messages.mo index b1a54636e31d4ae1b98b9cb51a523637a4b847a1..f1511f0b57f361e2159ecbcd0635120ba30ce263 100644 GIT binary patch delta 15437 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 delta 15248 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 diff --git a/newsroom/translations/fi/LC_MESSAGES/messages.po b/newsroom/translations/fi/LC_MESSAGES/messages.po index 6fbec4fa6..2da45b825 100644 --- a/newsroom/translations/fi/LC_MESSAGES/messages.po +++ b/newsroom/translations/fi/LC_MESSAGES/messages.po @@ -16,24 +16,24 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: Newsroom-Core 2.6.0rc2\n" +"Project-Id-Version: Newsroom-Core 2.7.0rc1\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2024-03-19 13:59+0100\n" +"POT-Creation-Date: 2024-05-10 09:36+0200\n" "PO-Revision-Date: 2019-11-27 15:02+0000\n" "Last-Translator: Maija Paikkala, 2024\n" "Language-Team: Finnish (https://app.transifex.com/sourcefabric/teams/6584/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.13.1\n" +"Generated-By: Babel 2.12.1\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: newsroom/email.py:462 +#: newsroom/email.py:491 msgid "Kill/Takedown notice" msgstr "Ilmoitus poistosta" -#: newsroom/email.py:471 +#: newsroom/email.py:500 #, python-format msgid "%(section)s cancelled notice" msgstr "%(section)s peruttu" @@ -190,11 +190,11 @@ msgstr "Organisaation tili on suljettu." msgid "Company account has expired." msgstr "Organisaation tili on vanhentunut." -#: newsroom/agenda/__init__.py:51 +#: newsroom/agenda/__init__.py:53 msgid "Google Maps Styles" msgstr "Google Maps -tyylit" -#: newsroom/agenda/__init__.py:53 +#: newsroom/agenda/__init__.py:55 msgid "" "Provide styles delimited by &(ampersand). For example, " "feature:poi|element:labels|visibility:off&transit|visibility:off. Refer to " @@ -208,7 +208,7 @@ msgstr "" #: assets/agenda/components/AgendaTags.tsx:44 #: assets/company-reports/components/ContentActivity.tsx:111 -#: assets/wire/components/PreviewTags.tsx:40 newsroom/agenda/__init__.py:64 +#: assets/wire/components/PreviewTags.tsx:40 newsroom/agenda/__init__.py:66 #: newsroom/reports/content_activity.py:190 #: newsroom/templates/wire_item.html:76 #: newsroom/templates/wire_item_print.html:24 newsroom/wire/__init__.py:133 @@ -218,72 +218,73 @@ msgstr "Asiasanat" #: assets/company-reports/components/ContentActivity.tsx:112 #: assets/monitoring/components/MonitoringList.tsx:24 #: assets/wire/components/PreviewTagsSubjects.tsx:42 -#: newsroom/agenda/__init__.py:68 newsroom/monitoring/forms.py:20 +#: newsroom/agenda/__init__.py:70 newsroom/monitoring/forms.py:20 #: newsroom/reports/content_activity.py:191 newsroom/wire/__init__.py:137 msgid "Subject" msgstr "Aihe" #: assets/wire/components/fields/UrgencyLabel.tsx:40 -#: newsroom/agenda/__init__.py:72 newsroom/wire/__init__.py:145 +#: newsroom/agenda/__init__.py:74 newsroom/wire/__init__.py:145 msgid "News Value" msgstr "Prio" #: assets/company-reports/components/ContentActivity.tsx:110 -#: newsroom/agenda/__init__.py:76 newsroom/reports/content_activity.py:189 +#: newsroom/agenda/__init__.py:78 newsroom/reports/content_activity.py:189 #: newsroom/wire/__init__.py:149 msgid "Place" msgstr "Paikka" -#: newsroom/agenda/agenda.py:55 +#: newsroom/agenda/agenda.py:56 msgid "An event you have been watching has been updated" msgstr "Seuraamaasi tapahtumaa on päivitetty" -#: newsroom/agenda/agenda.py:56 +#: newsroom/agenda/agenda.py:57 msgid "Event updated" msgstr "Tapahtuma päivitetty" -#: newsroom/agenda/agenda.py:59 +#: newsroom/agenda/agenda.py:60 msgid "An event you have been watching has been cancelled" msgstr "Seuraamasi tapahtuma on peruttu" -#: newsroom/agenda/agenda.py:60 +#: newsroom/agenda/agenda.py:61 msgid "Event cancelled" msgstr "Tapahtuma peruttu" -#: newsroom/agenda/agenda.py:63 +#: newsroom/agenda/agenda.py:64 msgid "An event you have been watching has a new planning" msgstr "Seuraamassasi tapahtumassa on uutta suunnittelutietoa" -#: newsroom/agenda/agenda.py:64 +#: newsroom/agenda/agenda.py:65 msgid "Planning added" msgstr "Suunnittelutietoa lisätty" -#: newsroom/agenda/agenda.py:67 +#: newsroom/agenda/agenda.py:68 msgid "An event you have been watching has a planning cancelled" msgstr "Seuraamaasi tapahtumaan liittyvä uutissuunnitelma on peruttu" -#: newsroom/agenda/agenda.py:68 +#: newsroom/agenda/agenda.py:69 msgid "Planning cancelled" msgstr "Uutissuunnittelmat peruttu" -#: newsroom/agenda/agenda.py:71 +#: newsroom/agenda/agenda.py:72 msgid "An event you have been watching has a new coverage added" msgstr "Seuraamassasi tapahtumassa on uutta sisältöä" -#: newsroom/agenda/agenda.py:72 +#: newsroom/agenda/agenda.py:73 msgid "Coverage added" msgstr "Sisältö lisätty" -#: newsroom/agenda/utils.py:171 newsroom/web/default_settings.py:392 -#: newsroom/web/default_settings.py:393 +#: newsroom/agenda/utils.py:171 newsroom/web/default_settings.py:395 +#: newsroom/web/default_settings.py:396 msgid "Completed" msgstr "Juttu lähetetty" #: newsroom/agenda/utils.py:173 newsroom/agenda/utils.py:181 +#: newsroom/agenda/utils.py:197 msgid "Cancelled" msgstr "Peruttu" -#: newsroom/agenda/utils.py:175 +#: newsroom/agenda/utils.py:175 newsroom/agenda/utils.py:193 msgid "Planned" msgstr "STT uutisoi" @@ -295,6 +296,15 @@ msgstr "Ehkä" msgid "On request" msgstr "Pyynnöstä" +#: assets/agenda/components/ToBeConfirmedLabel.tsx:21 +#: newsroom/agenda/utils.py:191 +msgid "To be confirmed" +msgstr "Ehkä" + +#: newsroom/agenda/utils.py:195 +msgid "Postponed" +msgstr "Siirretty" + #: newsroom/agenda/views.py:225 msgid "Cannot edit coverage watch when watching parent item" msgstr "" @@ -365,7 +375,7 @@ msgstr "Maa" msgid "Your position" msgstr "Rooli" -#: assets/companies/components/EditCompanyDetails.tsx:74 +#: assets/companies/components/EditCompanyDetails.tsx:75 #: newsroom/auth/forms.py:25 msgid "Company Type" msgstr "Organisaatiotyyppi" @@ -388,10 +398,10 @@ msgstr "Hyväksyn" #: assets/company-admin/components/CompanyUsers.tsx:25 #: assets/user-profile/components/profile/UserProfile.tsx:98 -#: assets/users/components/EditUser.tsx:226 +#: assets/users/components/EditUser.tsx:231 #: assets/users/components/UsersList.tsx:27 newsroom/auth/forms.py:39 #: newsroom/auth/forms.py:46 newsroom/auth/forms.py:62 -#: newsroom/users/forms.py:45 +#: newsroom/users/forms.py:46 msgid "Email" msgstr "Sähköposti" @@ -452,7 +462,7 @@ msgstr "Organisaatio on vanhentunut" msgid "Invalid login type, Oauth not enabled for your user" msgstr "Väärä kirjautumistapa, Oauth ei ole mahdollinen tälle käyttäjälle" -#: newsroom/auth/saml.py:134 +#: newsroom/auth/saml.py:133 msgid "There was an error when using SSO" msgstr "Kirjautumisessa tapahtui virhe" @@ -462,7 +472,7 @@ msgid "Invalid login type, %(type)s not enabled for your user" msgstr "" "Väärä kirjautumistapa, %(type)s ei ole käytettävissä tälle käyttäjälle" -#: newsroom/auth/utils.py:240 +#: newsroom/auth/utils.py:253 msgid "" "There is no product associated with your user. Please reach out to your " "Company Admin." @@ -490,31 +500,31 @@ msgstr "Linkki on vanhentunut. Ole hyvä ja luo uusi." msgid "Your password has been changed. Please login again." msgstr "Salasanasi on vaihdettu. Ole hyvä ja kirjaudu sisään uudelleen." -#: newsroom/auth/views.py:342 +#: newsroom/auth/views.py:344 msgid "A reset password token has been sent to your email address." msgstr "Salasanan uusimislinkki on lähetetty sähköpostiisi." -#: newsroom/auth/views.py:403 newsroom/auth/views.py:416 +#: newsroom/auth/views.py:405 newsroom/auth/views.py:418 msgid "Your password has been changed." msgstr "Salasanasi on vaihdettu." -#: newsroom/auth/views.py:405 newsroom/auth/views.py:412 +#: newsroom/auth/views.py:407 newsroom/auth/views.py:414 msgid "Current password invalid." msgstr "Nykyinen salasana on väärin." -#: newsroom/auth/views.py:419 +#: newsroom/auth/views.py:421 msgid "Change password is not available." msgstr "Salasanaa ei voi vaihtaa." -#: newsroom/auth/views.py:439 +#: newsroom/auth/views.py:441 msgid "User token is not valid" msgstr "Kirjatumiskoodi on väärä" -#: newsroom/auth/views.py:450 +#: newsroom/auth/views.py:452 msgid "Could not change your password. Please contact us for assistance." msgstr "Salasananvaihto ei onnistunut. Ota yhteyttä STT:n asiakaspalveluun." -#: newsroom/cards/__init__.py:14 +#: newsroom/cards/__init__.py:73 msgid "Dashboards" msgstr "Etusivun näkymät" @@ -534,10 +544,6 @@ msgstr "Näkymätyyppiä ei löytynyt" msgid "Company Management" msgstr "Organisaatioiden hallinta" -#: newsroom/companies/views.py:78 -msgid "Company already exists" -msgstr "Organisaatio on jo olemassa" - #: newsroom/companies/views.py:88 newsroom/navigations/views.py:65 #: newsroom/products/views.py:64 newsroom/section_filters/views.py:55 msgid "Name not found" @@ -547,12 +553,20 @@ msgstr "Nimeä ei löytynyt" msgid "{0}: {1}" msgstr "{0}: {1}" -#: newsroom/companies/views.py:145 newsroom/companies/views.py:189 +#: newsroom/companies/views.py:145 newsroom/companies/views.py:199 #: newsroom/company_admin/views.py:56 msgid "Company not found" msgstr "Organisaatiota ei löytynyt" -#: newsroom/companies/views.py:192 +#: newsroom/companies/views.py:166 +msgid "Value is already used" +msgstr "Arvo on jo käytössä" + +#: newsroom/companies/views.py:168 +msgid "Company already exists" +msgstr "Organisaatio on jo olemassa" + +#: newsroom/companies/views.py:202 msgid "Company is already approved" msgstr "Yritys on jo hyväksytty." @@ -610,7 +624,7 @@ msgid "Linked extract(s)" msgstr "Linkitetyt" #: assets/companies/components/CompanyList.tsx:35 -#: assets/companies/components/EditCompanyDetails.tsx:42 +#: assets/companies/components/EditCompanyDetails.tsx:43 #: assets/company-admin/components/CompanyUsers.tsx:24 #: assets/monitoring/components/EditMonitoringProfile.tsx:114 #: assets/monitoring/components/MonitoringList.tsx:23 @@ -665,15 +679,15 @@ msgstr "Formaatti" #: assets/company-reports/components/UserSavedSearches.tsx:21 #: assets/monitoring/components/EditMonitoringProfile.tsx:141 #: assets/monitoring/components/MonitoringList.tsx:27 -#: assets/users/components/EditUser.tsx:263 -#: assets/users/components/EditUser.tsx:272 +#: assets/users/components/EditUser.tsx:268 +#: assets/users/components/EditUser.tsx:277 #: assets/users/components/UsersList.tsx:32 newsroom/monitoring/forms.py:24 -#: newsroom/reports/reports.py:152 newsroom/users/forms.py:50 +#: newsroom/reports/reports.py:152 newsroom/users/forms.py:51 msgid "Company" msgstr "Organisaatio" #: assets/companies/components/CompanyListItem.tsx:20 -#: assets/companies/components/EditCompanyDetails.tsx:179 +#: assets/companies/components/EditCompanyDetails.tsx:180 #: assets/monitoring/components/EditMonitoringProfile.tsx:191 #: assets/monitoring/components/MonitoringItem.tsx:18 #: assets/navigations/components/EditNavigation.tsx:97 @@ -684,7 +698,7 @@ msgstr "Organisaatio" #: assets/search/components/MonitoringEditor.tsx:198 #: assets/section-filters/components/EditSectionFilter.tsx:79 #: assets/section-filters/components/SectionFilterListItem.tsx:12 -#: assets/users/components/EditUser.tsx:434 +#: assets/users/components/EditUser.tsx:437 #: assets/users/components/UserListItem.tsx:26 newsroom/monitoring/forms.py:25 msgid "Enabled" msgstr "Aktiivinen" @@ -712,7 +726,7 @@ msgstr "" msgid "Query" msgstr "Hakulauseke" -#: newsroom/monitoring/search.py:67 newsroom/search/service.py:640 +#: newsroom/monitoring/search.py:67 newsroom/search/service.py:653 msgid "Invalid product parameter" msgstr "Väärä tuoteparametri" @@ -749,8 +763,8 @@ msgstr "Asiakasta ei löydy" #: assets/company-admin/components/CompanyDetails.tsx:20 #: assets/company-reports/components/Company.tsx:24 #: assets/navigations/components/EditNavigation.tsx:26 -#: assets/users/components/EditUser.tsx:346 newsroom/products/__init__.py:15 -#: newsroom/users/forms.py:62 +#: assets/users/components/EditUser.tsx:349 newsroom/products/__init__.py:15 +#: newsroom/users/forms.py:63 msgid "Products" msgstr "Tuotteet" @@ -894,23 +908,23 @@ msgstr "Vanhentuneet yhtiöt" msgid "Unknown report {}" msgstr "Tuntematon raportti {}" -#: newsroom/search/service.py:310 +#: newsroom/search/service.py:322 msgid "Page limit exceeded" msgstr "Sivumäärä ylitetty" -#: newsroom/search/service.py:560 +#: newsroom/search/service.py:573 msgid "Incorrect type supplied for advanced search params" msgstr "Tarkennetun haun parametrit ovat vääränlaisia" -#: newsroom/search/service.py:631 +#: newsroom/search/service.py:644 msgid "User does not belong to a company." msgstr "Käyttäjä ei kuulu yhteenkään organisaatioon" -#: newsroom/search/service.py:633 +#: newsroom/search/service.py:646 msgid "Your company doesn't have any products defined." msgstr "Organisaatiollasi ei ole yhtään määriteltyä tuotetta." -#: newsroom/search/service.py:635 +#: newsroom/search/service.py:648 msgid "Your product is not assigned to you or your company." msgstr "Tuotteesi ei ole linkitetty organisaatioosi." @@ -968,8 +982,8 @@ msgstr "Verkko" msgid "Editorial Note" msgstr "Toimituksellinen huomautus" -#: assets/agenda/components/AgendaPreviewCoverages.tsx:42 -#: assets/agenda/components/AgendaPreviewCoverages.tsx:118 +#: assets/agenda/components/AgendaPreviewCoverages.tsx:56 +#: assets/agenda/components/AgendaPreviewCoverages.tsx:134 #: newsroom/templates/agenda_item_print.html:64 msgid "Coverages:" msgstr "Sisällöt:" @@ -980,46 +994,46 @@ msgstr "Sisällöt:" msgid "AM" msgstr "AM" -#: newsroom/templates/base_layout.html:33 +#: newsroom/templates/base_layout.html:37 msgid "Main Navigation Bar" msgstr "Päävalikko" -#: assets/public/components/PublicApp.tsx:78 -#: newsroom/templates/base_layout.html:58 +#: assets/public/components/PublicApp.tsx:79 +#: newsroom/templates/base_layout.html:62 #: newsroom/templates/login_client.html:4 #: newsroom/templates/login_form.html:24 #: newsroom/templates/login_layout.html:19 msgid "Login" msgstr "Kirjaudu sisään" -#: newsroom/templates/base_layout.html:62 newsroom/templates/footer.html:4 +#: newsroom/templates/base_layout.html:66 newsroom/templates/footer.html:4 msgid "Contact Us" msgstr "Ota yhteyttä" -#: newsroom/templates/base_layout.html:73 +#: newsroom/templates/base_layout.html:77 msgid "Side Navigation" msgstr "Sivuvalikko" #: assets/company-admin/components/CompanyUserListItem.tsx:48 -#: assets/users/utils.ts:11 newsroom/templates/base_layout.html:99 -#: newsroom/templates/base_layout.html:100 -#: newsroom/templates/base_layout.html:107 +#: assets/users/utils.ts:11 newsroom/templates/base_layout.html:103 +#: newsroom/templates/base_layout.html:104 +#: newsroom/templates/base_layout.html:111 #: newsroom/templates/company_admin_index.html:3 -#: newsroom/templates/company_admin_index.html:6 newsroom/users/forms.py:39 +#: newsroom/templates/company_admin_index.html:6 newsroom/users/forms.py:40 msgid "Company Admin" msgstr "Pääkäyttäjä" -#: newsroom/templates/base_layout.html:116 -#: newsroom/templates/base_layout.html:117 -#: newsroom/templates/base_layout.html:124 +#: newsroom/templates/base_layout.html:120 +#: newsroom/templates/base_layout.html:121 +#: newsroom/templates/base_layout.html:128 #: newsroom/templates/company_reports.html:3 #: newsroom/templates/company_reports.html:6 msgid "Reports" msgstr "Tilastot" -#: newsroom/templates/base_layout.html:132 -#: newsroom/templates/base_layout.html:133 -#: newsroom/templates/base_layout.html:140 newsroom/templates/settings.html:3 +#: newsroom/templates/base_layout.html:136 +#: newsroom/templates/base_layout.html:137 +#: newsroom/templates/base_layout.html:144 newsroom/templates/settings.html:3 #: newsroom/templates/settings.html:6 msgid "Settings" msgstr "Asetukset" @@ -1095,7 +1109,7 @@ msgid "click here to register." msgstr "klikkaa rekisteröityäksesi" #: assets/user-profile/components/profile/UserProfile.tsx:190 -#: assets/users/components/EditUser.tsx:298 +#: assets/users/components/EditUser.tsx:303 #: newsroom/templates/login_layout.html:50 #: newsroom/templates/login_locale_dropdown.html:5 msgid "Language" @@ -1143,7 +1157,7 @@ msgstr "Salasanan uusiminen" msgid "Validate" msgstr "Vahvista" -#: assets/users/components/EditUser.tsx:468 +#: assets/users/components/EditUser.tsx:471 #: newsroom/templates/request_token.html:22 #: newsroom/templates/reset_password.html:12 msgid "Reset Password" @@ -1211,7 +1225,7 @@ msgstr "Käyttäjätiedot" #: assets/ui/components/ContentBar.tsx:8 assets/ui/components/Preview.tsx:16 #: assets/user-profile/components/UserProfileApp.tsx:117 #: assets/user-profile/components/UserProfileApp.tsx:135 -#: assets/users/components/EditUser.tsx:145 +#: assets/users/components/EditUser.tsx:150 #: newsroom/templates/wire_item.html:11 msgid "Close" msgstr "Sulje" @@ -1266,124 +1280,124 @@ msgid "User Management" msgstr "Käyttäjähallinta" #: assets/monitoring/utils.ts:4 assets/users/utils.ts:7 -#: newsroom/users/forms.py:35 +#: newsroom/users/forms.py:36 msgid "Administrator" msgstr "STT:n ylläpitäjä" #: assets/monitoring/utils.ts:6 assets/users/utils.ts:9 -#: newsroom/users/forms.py:36 +#: newsroom/users/forms.py:37 msgid "Public" msgstr "Asiakkaan käyttäjä" #: assets/monitoring/utils.ts:5 assets/users/utils.ts:8 -#: newsroom/users/forms.py:37 +#: newsroom/users/forms.py:38 msgid "Internal" msgstr "STT:n oma käyttäjä" #: assets/monitoring/utils.ts:7 assets/users/utils.ts:10 -#: newsroom/users/forms.py:38 +#: newsroom/users/forms.py:39 msgid "Account Management" msgstr "Tilin hallinta" #: assets/user-profile/components/profile/UserProfile.tsx:80 -#: assets/users/components/EditUser.tsx:212 +#: assets/users/components/EditUser.tsx:217 #: assets/users/components/filters/UserListSortFilter.tsx:23 -#: newsroom/users/forms.py:43 +#: newsroom/users/forms.py:44 msgid "First Name" msgstr "Etunimi" #: assets/user-profile/components/profile/UserProfile.tsx:89 -#: assets/users/components/EditUser.tsx:219 +#: assets/users/components/EditUser.tsx:224 #: assets/users/components/filters/UserListSortFilter.tsx:26 -#: newsroom/users/forms.py:44 +#: newsroom/users/forms.py:45 msgid "Last Name" msgstr "Sukunimi" #: assets/companies/components/CompanyList.tsx:41 -#: assets/companies/components/EditCompanyDetails.tsx:126 -#: newsroom/users/forms.py:46 +#: assets/companies/components/EditCompanyDetails.tsx:127 +#: newsroom/users/forms.py:47 msgid "Telephone" msgstr "Puhelin" #: assets/user-profile/components/profile/UserProfile.tsx:129 -#: assets/users/components/EditUser.tsx:240 -#: assets/users/components/UsersList.tsx:29 newsroom/users/forms.py:47 +#: assets/users/components/EditUser.tsx:245 +#: assets/users/components/UsersList.tsx:29 newsroom/users/forms.py:48 msgid "Mobile" msgstr "Matkapuhelin" #: assets/user-profile/components/profile/UserProfile.tsx:138 -#: assets/users/components/EditUser.tsx:247 -#: assets/users/components/UsersList.tsx:30 newsroom/users/forms.py:48 +#: assets/users/components/EditUser.tsx:252 +#: assets/users/components/UsersList.tsx:30 newsroom/users/forms.py:49 msgid "Role" msgstr "Rooli" -#: assets/users/components/EditUser.tsx:253 +#: assets/users/components/EditUser.tsx:258 #: assets/users/components/UsersList.tsx:31 #: assets/users/components/filters/UserListSortFilter.tsx:35 -#: newsroom/users/forms.py:49 +#: newsroom/users/forms.py:50 msgid "User Type" msgstr "Käyttäjätyyppi" -#: newsroom/users/forms.py:51 +#: newsroom/users/forms.py:52 msgid "Sign Up Details" msgstr "Kirjautumistiedot" -#: newsroom/users/forms.py:52 +#: newsroom/users/forms.py:53 msgid "Email Validated" msgstr "Sähköpostiosoite vahvistettu" -#: newsroom/users/forms.py:53 +#: newsroom/users/forms.py:54 msgid "Account Enabled" msgstr "Tili käytössä" -#: newsroom/users/forms.py:54 +#: newsroom/users/forms.py:55 msgid "Account Approved" msgstr "Tili hyväksytty" -#: assets/users/components/EditUser.tsx:444 newsroom/users/forms.py:55 +#: assets/users/components/EditUser.tsx:447 newsroom/users/forms.py:56 msgid "Company Expiry Alert" msgstr "Varoitus sopimuksen päättymisestä" #: assets/user-profile/components/profile/UserProfile.tsx:156 -#: newsroom/users/forms.py:56 +#: newsroom/users/forms.py:57 msgid "Receive Email Notifications" msgstr "Vastaanota sähköposti-ilmoituksia" #: assets/user-profile/components/profile/UserProfile.tsx:147 -#: newsroom/users/forms.py:57 +#: newsroom/users/forms.py:58 msgid "Receive App Notifications" msgstr "Vastaanota ilmoituksia sovelluksessa" -#: newsroom/users/forms.py:58 +#: newsroom/users/forms.py:59 msgid "Locale" msgstr "Kieli" -#: assets/users/components/EditUser.tsx:454 newsroom/users/forms.py:59 +#: assets/users/components/EditUser.tsx:457 newsroom/users/forms.py:60 msgid "Manage Company Topics" msgstr "Hallinnoi organisaation yhteisiä hakuja" #: assets/companies/components/CompanyPermissions.tsx:74 -#: assets/users/components/EditUser.tsx:310 newsroom/users/forms.py:61 +#: assets/users/components/EditUser.tsx:315 newsroom/users/forms.py:62 msgid "Sections" msgstr "Osiot" -#: newsroom/users/users.py:336 +#: newsroom/users/users.py:328 msgid "Can not delete current user" msgstr "Kyseistä käyttäjää ei voi poistaa" -#: newsroom/users/views.py:122 newsroom/users/views.py:219 +#: newsroom/users/views.py:125 newsroom/users/views.py:222 msgid "Email address is already in use" msgstr "Sähköpostiosoite on jo käytössä" -#: newsroom/users/views.py:138 newsroom/users/views.py:224 +#: newsroom/users/views.py:141 newsroom/users/views.py:227 msgid "Company is required for non administrators" msgstr "Organisaatio vaaditaan" -#: newsroom/users/views.py:173 +#: newsroom/users/views.py:176 msgid "User is already validated" msgstr "Käyttäjä on jo vahvistettu" -#: newsroom/users/views.py:337 +#: newsroom/users/views.py:340 msgid "User id not provided" msgstr "Käyttäjä-id:tä ei löytynyt" @@ -1391,91 +1405,87 @@ msgstr "Käyttäjä-id:tä ei löytynyt" msgid "User is already approved" msgstr "Käyttäjä on jo hyväksytty." -#: assets/am-news/utils.ts:37 newsroom/web/default_settings.py:288 +#: assets/am-news/utils.ts:37 newsroom/web/default_settings.py:291 msgid "Text" msgstr "Juttu" -#: newsroom/web/default_settings.py:289 +#: newsroom/web/default_settings.py:292 msgid "Photo" msgstr "Kuva" -#: newsroom/web/default_settings.py:290 +#: newsroom/web/default_settings.py:293 msgid "Picture" msgstr "Kuva" -#: newsroom/web/default_settings.py:291 +#: newsroom/web/default_settings.py:294 msgid "Audio" msgstr "Audio" -#: newsroom/web/default_settings.py:292 +#: newsroom/web/default_settings.py:295 msgid "Video" msgstr "Video" -#: newsroom/web/default_settings.py:293 +#: newsroom/web/default_settings.py:296 msgid "Explainer" msgstr "Selite" -#: newsroom/web/default_settings.py:294 +#: newsroom/web/default_settings.py:297 msgid "Infographics" msgstr "Grafiikka" -#: newsroom/web/default_settings.py:295 +#: newsroom/web/default_settings.py:298 msgid "Graphic" msgstr "Grafiikka" -#: newsroom/web/default_settings.py:296 +#: newsroom/web/default_settings.py:299 msgid "Live Video" msgstr "Livevideo" -#: newsroom/web/default_settings.py:297 +#: newsroom/web/default_settings.py:300 msgid "Live Blog" msgstr "Liveseuranta" -#: newsroom/web/default_settings.py:298 +#: newsroom/web/default_settings.py:301 msgid "Video Explainer" msgstr "Videoselite" -#: newsroom/web/default_settings.py:368 newsroom/web/default_settings.py:369 +#: newsroom/web/default_settings.py:371 newsroom/web/default_settings.py:372 msgid "No Coverage" msgstr "Ei suunniteltu" -#: newsroom/web/default_settings.py:374 newsroom/web/default_settings.py:375 +#: newsroom/web/default_settings.py:377 newsroom/web/default_settings.py:378 msgid "Is Planned" msgstr "STT uutisoi" -#: newsroom/web/default_settings.py:380 -msgid "Not Decided / On request" -msgstr "Ehkä" - -#: newsroom/web/default_settings.py:381 +#: newsroom/web/default_settings.py:383 newsroom/web/default_settings.py:384 msgid "Not Decided / On Request" msgstr "Ehkä" -#: newsroom/web/default_settings.py:386 newsroom/web/default_settings.py:387 +#: newsroom/web/default_settings.py:389 newsroom/web/default_settings.py:390 msgid "Not Intended / Cancelled" msgstr "STT ei uutisoi" -#: newsroom/web/default_settings.py:627 +#: newsroom/web/default_settings.py:633 msgid "Home" msgstr "Etusivu" -#: newsroom/web/default_settings.py:632 +#: newsroom/web/default_settings.py:638 msgid "Wire" msgstr "Uutiset" -#: newsroom/web/default_settings.py:637 +#: newsroom/web/default_settings.py:643 msgid "Agenda" msgstr "Luotsi" -#: newsroom/web/default_settings.py:642 +#: newsroom/web/default_settings.py:648 msgid "Monitoring" msgstr "Seuranta" -#: newsroom/web/default_settings.py:647 +#: newsroom/web/default_settings.py:653 msgid "Saved / Watched" msgstr "Tallennetut" -#: newsroom/web/default_settings.py:685 +#: newsroom/web/default_settings.py:691 msgid "Newshub" msgstr "Mediapankki" @@ -1510,7 +1520,7 @@ msgstr "" msgid "Time limit for %(section)s products (in days)" msgstr "Aikaraja %(section)s tuotteille (päivissä)" -#: newsroom/wire/views.py:412 +#: newsroom/wire/views.py:422 msgid "Not found" msgstr "Ei löytynyt" @@ -1563,7 +1573,7 @@ msgstr "Uutistuotteiden aikarajoitus (päiviä)" msgid "New navigation" msgstr "Uusi navigaatio" -#: assets/utils.tsx:538 +#: assets/utils.tsx:516 msgid "" "There is no product associated with your user. Please reach out to your " "Company Admin" @@ -1571,42 +1581,42 @@ msgstr "" "Käyttäjätunnukseesi ei ole linkitetty tuotteita. Ole yhteydessä " "organisaatiosi pääkäyttäjään." -#: assets/utils.tsx:542 +#: assets/utils.tsx:520 msgid "Resource was updated in the meantime, please refresh." msgstr "Lähde on päivittynyt. Päivitä sivu." -#: assets/utils.tsx:544 +#: assets/utils.tsx:522 msgid "Failed to process request!" msgstr "Pyyntöä ei pystytty toteuttamaan" #: assets/agenda/components/AgendaDateButtons.tsx:15 -#: assets/agenda/components/AgendaList.tsx:286 +#: assets/agenda/components/AgendaList.tsx:329 #: assets/company-reports/components/ProductStories.tsx:26 #: assets/components/CalendarButton.tsx:49 -#: assets/components/ExpiryDateInput.tsx:93 assets/utils.tsx:720 +#: assets/components/ExpiryDateInput.tsx:93 assets/utils.tsx:698 #: assets/wire/components/filters/NavCreatedPicker.tsx:9 msgid "Today" msgstr "Tänään" #: assets/company-reports/components/ProductStories.tsx:28 -#: assets/utils.tsx:722 assets/wire/components/filters/NavCreatedPicker.tsx:10 +#: assets/utils.tsx:700 assets/wire/components/filters/NavCreatedPicker.tsx:10 msgid "This week" msgstr "Tämä viikko" #: assets/company-reports/components/ProductStories.tsx:30 -#: assets/utils.tsx:724 assets/wire/components/filters/NavCreatedPicker.tsx:11 +#: assets/utils.tsx:702 assets/wire/components/filters/NavCreatedPicker.tsx:11 msgid "This month" msgstr "Tämä kuukausi" -#: assets/utils.tsx:736 +#: assets/utils.tsx:714 msgid "Item copied successfully." msgstr "Kohde kopioitu leikepöydälle" -#: assets/utils.tsx:740 +#: assets/utils.tsx:718 msgid "Sorry, Copy is not supported." msgstr "Pahoittelut, kopiointi ei ole mahdollista" -#: assets/utils.tsx:771 +#: assets/utils.tsx:749 msgid "Daily @ {{ time1 }}, {{ time2 }} and {{ time3 }} {{ timezone }}" msgstr "" "Päivittäin klo {{ time1 }}, klo {{ time2 }} ja klo {{ time3 }} {{ timezone " @@ -1620,39 +1630,39 @@ msgstr "Yhdistetty ilmoituspalvelimeen!" msgid "Disconnected from Notification Server!" msgstr "Yhteys ilmoituspalvelimeen katkennut!" -#: assets/agenda/actions.ts:120 +#: assets/agenda/actions.ts:121 msgid "Your inquiry has been sent successfully" msgstr "Hakusi on lähetetty" -#: assets/agenda/actions.ts:380 +#: assets/agenda/actions.ts:386 msgid "Started watching items successfully." msgstr "Ryhdyit seuraamaan kohdetta" -#: assets/agenda/actions.ts:391 +#: assets/agenda/actions.ts:397 msgid "Stopped watching items successfully." msgstr "Lopetit kohteen seuraamisen" -#: assets/agenda/actions.ts:436 assets/wire/actions.ts:359 +#: assets/agenda/actions.ts:442 assets/wire/actions.ts:359 msgid "Items were bookmarked successfully." msgstr "Kohteet lisätty kirjanmerkkeihin" -#: assets/agenda/actions.ts:438 assets/wire/actions.ts:361 +#: assets/agenda/actions.ts:444 assets/wire/actions.ts:361 msgid "Item was bookmarked successfully." msgstr "Kohde lisätty kirjanmerkkeihin" -#: assets/agenda/actions.ts:453 assets/wire/actions.ts:376 +#: assets/agenda/actions.ts:459 assets/wire/actions.ts:376 msgid "Items were removed from bookmarks successfully." msgstr "Kohteet poistettu kirjanmerkeistä" -#: assets/agenda/actions.ts:455 assets/wire/actions.ts:378 +#: assets/agenda/actions.ts:461 assets/wire/actions.ts:378 msgid "Item was removed from bookmarks successfully." msgstr "Kohde poistettu kirjanmerkeistä" -#: assets/agenda/actions.ts:763 +#: assets/agenda/actions.ts:774 msgid "Started watching coverage successfully." msgstr "Seuranta lisätty onnistuneesti." -#: assets/agenda/actions.ts:776 +#: assets/agenda/actions.ts:787 msgid "Stopped watching coverage successfully." msgstr "Seuranta peruttu onnistuneesti." @@ -1668,61 +1678,61 @@ msgstr "Lopeta seuraaminen" msgid "Watch this coverage" msgstr "Seuraa" -#: assets/agenda/utils.ts:60 +#: assets/agenda/item-actions.ts:56 +msgid "Stop watching this coverage" +msgstr "Lopeta seuranta" + +#: assets/agenda/utils.ts:61 msgid "coverage updated {{ at }}" msgstr "Sisältö päivittynyt {{ at }}" -#: assets/agenda/utils.ts:70 +#: assets/agenda/utils.ts:71 msgid "Time to be confirmed" msgstr "Aika vahvistamatta" -#: assets/agenda/utils.ts:80 assets/agenda/utils.ts:81 +#: assets/agenda/utils.ts:81 assets/agenda/utils.ts:82 msgid "Coverage not planned" msgstr "STT ei uutisoi" -#: assets/agenda/utils.ts:82 assets/agenda/utils.ts:89 +#: assets/agenda/utils.ts:83 assets/agenda/utils.ts:90 msgid "Coverage planned" msgstr "STT uutisoi" -#: assets/agenda/utils.ts:83 assets/agenda/utils.ts:84 +#: assets/agenda/utils.ts:84 assets/agenda/utils.ts:85 msgid "Coverage on merit" msgstr "Ehkä" -#: assets/agenda/utils.ts:85 +#: assets/agenda/utils.ts:86 msgid "Coverage on request" msgstr "Pyydettäessä" -#: assets/agenda/utils.ts:90 +#: assets/agenda/utils.ts:91 msgid "Coverage in progress" msgstr "Teossa" -#: assets/agenda/utils.ts:91 +#: assets/agenda/utils.ts:92 msgid "Coverage available" msgstr "Lähetetty" -#: assets/agenda/utils.ts:92 +#: assets/agenda/utils.ts:93 msgid "Coverage cancelled" msgstr "Peruttu" -#: assets/agenda/utils.ts:513 -msgid "Update expected @ ${dateString}" -msgstr "Päivitys odotettavissa @ ${dateString}" - -#: assets/agenda/utils.ts:1042 +#: assets/agenda/utils.ts:992 msgid "assignee: {{name}}" msgstr "Tekijä: {{name}}" -#: assets/agenda/utils.ts:1043 +#: assets/agenda/utils.ts:993 msgid "desk: {{name}}" msgstr "Deski: {{name}}" -#: assets/agenda/utils.ts:1052 +#: assets/agenda/utils.ts:1002 msgid "" "{{ type }} coverage {{ slugline }} {{ status_text }} {{assignedDetails}}" msgstr "" "{{ type }} sisältö {{ slugline }} {{ status_text }} {{assignedDetails}}" -#: assets/agenda/utils.ts:1060 +#: assets/agenda/utils.ts:1010 msgid "" "Planned {{ type }} coverage {{ slugline }}, expected {{date}} at {{time}} " "{{assignedDetails}}" @@ -1730,7 +1740,7 @@ msgstr "" "Planned {{ type }} sisältö {{ slugline }}, arvioitu valmistumisaika {{date}}" " {{time}} {{assignedDetails}}" -#: assets/agenda/utils.ts:1068 +#: assets/agenda/utils.ts:1018 msgid "" "{{ type }} coverage {{ slugline }} in progress, expected {{date}} at " "{{time}} {{assignedDetails}}" @@ -1738,19 +1748,19 @@ msgstr "" "{{ type }} sisältö {{ slugline }} työn alla, arvioitu valmistumienen " "{{date}} {{time}} {{assignedDetails}}" -#: assets/agenda/utils.ts:1072 +#: assets/agenda/utils.ts:1022 msgid "{{ type }} coverage {{slugline}} cancelled {{assignedDetails}}" msgstr "{{ type }} sisältö {{slugline}} peruttu {{assignedDetails}}" -#: assets/agenda/utils.ts:1080 +#: assets/agenda/utils.ts:1030 msgid "(update to come)" msgstr "(päivitys tulossa)" -#: assets/agenda/utils.ts:1080 +#: assets/agenda/utils.ts:1030 msgid "(updated)" msgstr "(päivitetty)" -#: assets/agenda/utils.ts:1083 +#: assets/agenda/utils.ts:1033 msgid "" "{{ type }} coverage {{ slugline }} available {{deliveryState}} " "{{assignedDetails}}" @@ -1758,41 +1768,41 @@ msgstr "" "{{ type }} sisältö{{ slugline }} saatavilla {{deliveryState}} " "{{assignedDetails}}" -#: assets/agenda/utils.ts:1091 +#: assets/agenda/utils.ts:1041 msgid "{{ type }} coverage {{assignedDetails}}" msgstr "{{ type }} sisältö {{assignedDetails}}" -#: assets/agenda/utils.ts:1157 +#: assets/agenda/utils.ts:1107 msgid "{{startDate}} to {{endDate}} (Time to be confirmed)" msgstr "{{startDate}} - {{endDate}} (Kellonaika varmistuu myöhemmin)" -#: assets/agenda/utils.ts:1163 +#: assets/agenda/utils.ts:1113 msgid "{{startDate}} (Time to be confirmed)" msgstr "{{startDate}} (Kellonaika varmistuu myöhemmin)" -#: assets/agenda/utils.ts:1168 +#: assets/agenda/utils.ts:1118 msgid "{{startDate}} to {{endDate}}" msgstr "{{startDate}} – {{endDate}}" -#: assets/agenda/utils.ts:1177 +#: assets/agenda/utils.ts:1127 msgid "{{startTime}} {{startDate}} - {{endDate}} {{timezone}}" msgstr "{{startDate}} klo {{startTime}} - {{endDate}} {{timezone}}" -#: assets/agenda/utils.ts:1185 +#: assets/agenda/utils.ts:1135 msgid "{{startTime}} {{startDate}} {{timezone}}" msgstr "{{startDate}} klo {{startTime}} {{timezone}}" -#: assets/agenda/utils.ts:1192 +#: assets/agenda/utils.ts:1142 msgid "{{startTime}} - {{endTime}} {{startDate}} {{timezone}}" msgstr "{{startDate}} klo {{startTime}} - {{endTime}} {{timezone}}" -#: assets/agenda/utils.ts:1200 assets/agenda/utils.ts:1210 +#: assets/agenda/utils.ts:1150 assets/agenda/utils.ts:1160 msgid "{{startTime}} {{startDate}} to {{endTime}} {{endDate}} {{timezone}}" msgstr "" "{{startDate}} klo {{startTime}} - {{endDate}} klo {{endTime}} {{timezone}}" #: assets/agenda/components/AgendaApp.tsx:139 -#: assets/layout/components/BaseApp.tsx:113 +#: assets/layout/components/SearchBase.tsx:130 #: assets/wire/components/WireApp.tsx:131 msgid "Custom View" msgstr "Muokattu näkymä" @@ -1891,30 +1901,10 @@ msgstr "Sinun kyselysi" msgid "Submit inquiry" msgstr "Lähetä kyselysi" -#: assets/agenda/components/AgendaCoverages.tsx:56 -msgid "Coverage inquiry from {{sitename}} user: {{item}}" -msgstr "Sisältöön liittyvä kysely {{sitename}} käyttäjältä {{item}}" - -#: assets/agenda/components/AgendaCoverages.tsx:66 +#: assets/agenda/components/AgendaCoverages.tsx:67 msgid "Open {{agenda}} in a new tab" msgstr "Avaa {{agenda}} uudessa välilehdessä" -#: assets/agenda/components/AgendaCoverages.tsx:89 -msgid "assignee" -msgstr "tekijä" - -#: assets/agenda/components/AgendaCoverages.tsx:97 -msgid "desk" -msgstr "deski" - -#: assets/agenda/components/AgendaCoverages.tsx:109 -msgid "expected" -msgstr "odotettu" - -#: assets/agenda/components/AgendaCoverages.tsx:119 -msgid "source" -msgstr "lähde" - #: assets/agenda/components/AgendaDateButtons.tsx:21 msgid "Left" msgstr "Vasen" @@ -1935,10 +1925,6 @@ msgstr "V" msgid "M" msgstr "KK" -#: assets/agenda/components/AgendaDetailCoverages.tsx:15 -msgid "Coverages" -msgstr "Sisällöt" - #: assets/agenda/components/AgendaEdNote.tsx:19 msgid "Reason" msgstr "syy" @@ -1993,7 +1979,7 @@ msgstr "Uutissisällöt" msgid "Internal Note" msgstr "Sisäistä tietoa" -#: assets/agenda/components/AgendaItemDetails.tsx:97 +#: assets/agenda/components/AgendaItemDetails.tsx:114 #: assets/agenda/components/AgendaPreviewAttachments.tsx:16 msgid "Attachments" msgstr "Liitteet" @@ -2016,13 +2002,13 @@ msgstr "{{ action }} {{ minutes }} minuuttia sitten" #: assets/agenda/components/AgendaItemTypeFilter.tsx:14 #: assets/agenda/components/AgendaItemTypeFilter.tsx:40 -#: assets/search/components/SearchResultsBar/SearchResultsFiltersRow.tsx:72 +#: assets/search/components/SearchResultsBar/SearchResultsFiltersRow.tsx:74 msgid "Events Only" msgstr "Tapahtumat" #: assets/agenda/components/AgendaItemTypeFilter.tsx:15 #: assets/agenda/components/AgendaItemTypeFilter.tsx:48 -#: assets/search/components/SearchResultsBar/SearchResultsFiltersRow.tsx:72 +#: assets/search/components/SearchResultsBar/SearchResultsFiltersRow.tsx:74 msgid "Planning Only" msgstr "Uutissuunnittelu" @@ -2034,11 +2020,11 @@ msgstr "Tapahtumat ja uutissuunnittelu" msgid "Show" msgstr "Näytä" -#: assets/agenda/components/AgendaList.tsx:290 +#: assets/agenda/components/AgendaList.tsx:333 msgid "Tomorrow" msgstr "Huomenna" -#: assets/agenda/components/AgendaList.tsx:410 +#: assets/agenda/components/AgendaList.tsx:456 #: assets/am-news/components/AmNewsList.tsx:196 #: assets/wire/components/ItemsList.tsx:180 msgid "No items found." @@ -2069,7 +2055,11 @@ msgstr "Piilota" msgid "Show all" msgstr "Näytä kaikki" -#: assets/agenda/components/AgendaListItemIcons.tsx:140 +#: assets/agenda/components/AgendaListItem.tsx:258 +msgid "{{n}} more" +msgstr "{{n}} lisää" + +#: assets/agenda/components/AgendaListItemIcons.tsx:144 msgid "{{ attachments }} file(s) attached" msgstr "{{ attachments }} tiedostoa liitetty" @@ -2089,8 +2079,8 @@ msgstr "siirretty" msgid "event completed" msgstr "tapahtuma suoritettu" -#: assets/agenda/components/AgendaPreviewCoverages.tsx:54 -#: assets/agenda/components/AgendaPreviewCoverages.tsx:130 +#: assets/agenda/components/AgendaPreviewCoverages.tsx:69 +#: assets/agenda/components/AgendaPreviewCoverages.tsx:147 msgid "Previous Coverages:" msgstr "Aiemmat sisällöt" @@ -2106,11 +2096,15 @@ msgstr "Näytä kartta" msgid "Hide Map" msgstr "Piilota kartta" -#: assets/agenda/components/AgendaPreviewPlanning.tsx:47 +#: assets/agenda/components/AgendaPreviewPlanning.tsx:58 msgid "Planning Item" msgstr "Suunnittelutieto" -#: assets/agenda/components/AgendaPreviewPlanning.tsx:65 +#: assets/agenda/components/AgendaPreviewPlanning.tsx:77 +msgid "Planning Items" +msgstr "Uutissuunnittelu" + +#: assets/agenda/components/AgendaPreviewPlanning.tsx:77 msgid "Other Planning Items" msgstr "Muu suunnittelutieto" @@ -2124,36 +2118,47 @@ msgstr "Alkuperäinen kutsu" #: assets/agenda/components/CoverageItemStatus.tsx:105 #: assets/agenda/components/CoverageItemStatus.tsx:125 +#: assets/agenda/components/preview/coverage/CoverageActions.tsx:62 +#: assets/agenda/components/preview/coverage/CoverageActions.tsx:84 msgid "Open in new tab" msgstr "Avaa välilehdellä" #: assets/agenda/components/CoverageItemStatus.tsx:110 #: assets/agenda/components/CoverageItemStatus.tsx:130 #: assets/agenda/components/CoverageItemStatus.tsx:141 +#: assets/agenda/components/preview/coverage/CoverageActions.tsx:69 +#: assets/agenda/components/preview/coverage/CoverageActions.tsx:91 +#: assets/agenda/components/preview/coverage/CoverageActions.tsx:112 msgid "View Content" msgstr "Avaa juttu" #: assets/agenda/components/CoverageItemStatus.tsx:138 +#: assets/agenda/components/preview/coverage/CoverageActions.tsx:102 msgid "You don’t have access to this content, please contact {{email}}" msgstr "Sinulla ei ole oikeuksia tähän sisältöön. Ota yhteyttä {{email}}." #: assets/agenda/components/CoverageItemStatus.tsx:139 +#: assets/agenda/components/preview/coverage/CoverageActions.tsx:106 msgid "You don’t have access to this content" msgstr "Sinulla ei ole oikeuksia tähän sisältöön." #: assets/agenda/components/CoverageItemStatus.tsx:164 +#: assets/agenda/components/preview/coverage/CoverageWorkflowReason.tsx:19 msgid "All coverages cancelled: {{ reason }}" msgstr "Kaikki sisällöt peruttu {{ reason }}" #: assets/agenda/components/CoverageItemStatus.tsx:167 +#: assets/agenda/components/preview/coverage/CoverageWorkflowReason.tsx:22 msgid "Planning cancelled: {{ reason }}" msgstr "Uutissuunnitelmat peruttu: {{ reason }} " #: assets/agenda/components/CoverageItemStatus.tsx:191 +#: assets/agenda/components/preview/coverage/CoverageUpdateComing.tsx:10 msgid "Update coming" msgstr "Päivitys tulossa" #: assets/agenda/components/CoverageItemStatus.tsx:197 +#: assets/agenda/components/preview/coverage/CoverageStatus.tsx:11 msgid "status" msgstr "tila" @@ -2179,8 +2184,8 @@ msgstr "Maakunta tai osavaltio" #: assets/agenda/components/LocationFilter.tsx:421 #: assets/companies/components/CompanyList.tsx:42 -#: assets/companies/components/EditCompanyDetails.tsx:150 -#: assets/users/components/EditUser.tsx:286 +#: assets/companies/components/EditCompanyDetails.tsx:151 +#: assets/users/components/EditUser.tsx:291 msgid "Country" msgstr "Maa" @@ -2211,10 +2216,34 @@ msgstr "Paikat" msgid "No places found" msgstr "Paikkoja ei löytynyt" -#: assets/agenda/components/MultiDayListLabel.tsx:23 +#: assets/agenda/components/MultiDayListLabel.tsx:32 msgid "Day:" msgstr "Päivä:" +#: assets/agenda/components/preview/coverage/CoverageAssigneeNames.tsx:17 +msgid "Coverage inquiry from {{sitename}} user: {{item}}" +msgstr "Sisältöön liittyvä kysely {{sitename}} käyttäjältä {{item}}" + +#: assets/agenda/components/preview/coverage/CoverageAssigneeNames.tsx:24 +msgid "assignee" +msgstr "tekijä" + +#: assets/agenda/components/preview/coverage/CoverageAssigneeNames.tsx:40 +msgid "desk" +msgstr "deski" + +#: assets/agenda/components/preview/coverage/CoverageExpectedDate.tsx:17 +msgid "expected" +msgstr "odotettu" + +#: assets/agenda/components/preview/coverage/CoverageProvider.tsx:9 +msgid "source" +msgstr "lähde" + +#: assets/agenda/components/preview/coverage/CoverageScheduledStatus.tsx:24 +msgid "Updated expected @ {{dateString}}" +msgstr "Päivitys tulossa {{dateString}}" + #: assets/am-news/utils.ts:41 msgid "Fuel" msgstr "Polttoaine" @@ -2331,7 +2360,7 @@ msgstr "Uusi etusivun kortti" #: assets/section-filters/components/EditSectionFilter.tsx:19 #: assets/ui/components/Content.tsx:7 assets/ui/components/Preview.tsx:8 #: assets/user-profile/components/UserProfileApp.tsx:112 -#: assets/users/components/EditUser.tsx:135 +#: assets/users/components/EditUser.tsx:140 msgid "dialog" msgstr "dialogi" @@ -2340,7 +2369,7 @@ msgid "Edit Cards" msgstr "Muokkaa kortteja" #: assets/cards/components/EditCard.tsx:90 -#: assets/companies/components/EditCompanyDetails.tsx:189 +#: assets/companies/components/EditCompanyDetails.tsx:190 #: assets/components/CardEditor.tsx:106 #: assets/components/PersonalizeHomeModal.tsx:224 #: assets/monitoring/components/EditMonitoringProfile.tsx:207 @@ -2348,16 +2377,16 @@ msgstr "Muokkaa kortteja" #: assets/oauth_clients/components/EditClient.tsx:64 #: assets/products/components/EditProduct.tsx:187 #: assets/search/components/FollowedTopics.tsx:82 -#: assets/search/components/TopicFolder.tsx:56 +#: assets/search/components/TopicFolder.tsx:58 #: assets/section-filters/components/EditSectionFilter.tsx:88 -#: assets/users/components/EditUser.tsx:475 +#: assets/users/components/EditUser.tsx:478 msgid "Delete" msgstr "Poista" #: assets/cards/components/EditCard.tsx:95 #: assets/companies/components/CompanyPermissions.tsx:167 #: assets/companies/components/EditCompanyAPI.tsx:86 -#: assets/companies/components/EditCompanyDetails.tsx:196 +#: assets/companies/components/EditCompanyDetails.tsx:197 #: assets/components/CardEditor.tsx:65 assets/components/EditPanel.tsx:141 #: assets/components/Modal.tsx:151 #: assets/components/PersonalizeHomeModal.tsx:243 @@ -2374,7 +2403,7 @@ msgstr "Poista" #: assets/search/components/TopicFolderEditor.jsx:49 #: assets/section-filters/components/EditSectionFilter.tsx:93 #: assets/user-profile/components/EditNotificationScheduleModal.tsx:115 -#: assets/users/components/EditUser.tsx:481 +#: assets/users/components/EditUser.tsx:484 msgid "Save" msgstr "Tallenna" @@ -2399,12 +2428,12 @@ msgid "New Company" msgstr "Uusi organisaatio" #: assets/companies/components/CompanyList.tsx:37 -#: assets/companies/components/EditCompanyDetails.tsx:110 +#: assets/companies/components/EditCompanyDetails.tsx:111 msgid "Superdesk Subscriber Id" msgstr "Superdesk-asiakastunnus" #: assets/companies/components/CompanyList.tsx:38 -#: assets/companies/components/EditCompanyDetails.tsx:118 +#: assets/companies/components/EditCompanyDetails.tsx:119 #: assets/company-reports/components/Company.tsx:69 msgid "Account Manager" msgstr "Asiakaspäällikkö" @@ -2436,7 +2465,7 @@ msgid "Disabled" msgstr "Passivoitu" #: assets/companies/components/CompanyPermissions.tsx:35 -#: assets/users/components/EditUser.tsx:207 +#: assets/users/components/EditUser.tsx:212 msgid "General" msgstr "Yleinen" @@ -2513,42 +2542,42 @@ msgstr "Hyväksy organisaatio ja käyttäjä" msgid "Allowed IP Addresses" msgstr "Sallitut IP-osoitteet" -#: assets/companies/components/EditCompanyDetails.tsx:51 +#: assets/companies/components/EditCompanyDetails.tsx:52 msgid "Authentication Provider" msgstr "Autentikaatiopalvelu" -#: assets/companies/components/EditCompanyDetails.tsx:65 -msgid "SSO domain" -msgstr "SSO domain" +#: assets/companies/components/EditCompanyDetails.tsx:66 +msgid "SSO domains" +msgstr "SSO domainit" -#: assets/companies/components/EditCompanyDetails.tsx:84 +#: assets/companies/components/EditCompanyDetails.tsx:85 msgid "Company Size" msgstr "Organisaation koko" -#: assets/companies/components/EditCompanyDetails.tsx:94 +#: assets/companies/components/EditCompanyDetails.tsx:95 msgid "Company Url" msgstr "Organisaation verkkosivu" -#: assets/companies/components/EditCompanyDetails.tsx:102 +#: assets/companies/components/EditCompanyDetails.tsx:103 msgid "Referred By" msgstr "Viittaus" -#: assets/companies/components/EditCompanyDetails.tsx:134 +#: assets/companies/components/EditCompanyDetails.tsx:135 msgid "Contact Name" msgstr "Yhteyshenkilö" -#: assets/companies/components/EditCompanyDetails.tsx:142 +#: assets/companies/components/EditCompanyDetails.tsx:143 msgid "Contact Email" msgstr "Sähköposti" -#: assets/companies/components/EditCompanyDetails.tsx:159 +#: assets/companies/components/EditCompanyDetails.tsx:160 #: assets/company-reports/components/Company.tsx:86 #: assets/company-reports/components/ExpiredCompanies.tsx:17 #: assets/wire/components/fields/ExpiryDateLabel.tsx:19 msgid "Expiry Date" msgstr "Vanhenee" -#: assets/companies/components/EditCompanyDetails.tsx:167 +#: assets/companies/components/EditCompanyDetails.tsx:168 msgid "{{monitoring}} Administrator" msgstr "{{monitoring}} ylläpitäjä" @@ -2616,7 +2645,7 @@ msgid "Active" msgstr "Aktiivinen" #: assets/company-admin/components/CompanyUserListItem.tsx:52 -#: assets/users/components/EditUser.tsx:160 +#: assets/users/components/EditUser.tsx:165 msgid "Admin" msgstr "Pääkäyttäjä" @@ -2819,7 +2848,7 @@ msgid "Deselect All" msgstr "Poista kaikki valinnat" #: assets/components/EditPanel.tsx:93 assets/components/ShareItemModal.tsx:78 -#: assets/users/components/EditUser.tsx:377 +#: assets/users/components/EditUser.tsx:380 #: assets/wire/components/SelectedItemsBar.tsx:44 msgid "Select All" msgstr "Valitse kaikki" @@ -2923,21 +2952,21 @@ msgstr "Yhteiset haut" #: assets/components/PersonalizeHomeModal.tsx:214 #: assets/components/PersonalizeHomeModal.tsx:276 -#: assets/layout/components/BaseApp.tsx:58 +#: assets/layout/components/SearchBase.tsx:75 #: assets/search/components/FollowedTopics.tsx:201 #: assets/search/components/TopicsTab.tsx:98 msgid "My Topics" msgstr "Omat hakuni" #: assets/components/PersonalizeHomeModal.tsx:242 -#: assets/home/components/HomeApp.tsx:180 -#: assets/home/components/HomeApp.tsx:182 +#: assets/home/components/HomeApp.tsx:150 +#: assets/home/components/HomeApp.tsx:152 msgid "Personalize Home" msgstr "Muokkaa omaa näkymääsi" #: assets/components/PersonalizeHomeModal.tsx:246 #: assets/components/PersonalizeHomeModal.tsx:318 -#: assets/home/components/HomeApp.tsx:196 +#: assets/home/components/HomeApp.tsx:166 msgid "My Home" msgstr "Oma näkymä" @@ -3075,7 +3104,7 @@ msgid "All" msgstr "Kaikki" #: assets/components/cards/render/EventsTwoByTwoCard.tsx:33 -#: assets/search/components/SearchResultsBar/SearchResultsFiltersRow.tsx:175 +#: assets/search/components/SearchResultsBar/SearchResultsFiltersRow.tsx:193 #: assets/wire/components/filters/NavCreatedPicker.tsx:46 msgid "To" msgstr "Päättyen" @@ -3106,11 +3135,11 @@ msgstr "Varoitus" msgid "There's no card defined for {{home}} page!" msgstr "Yhtään korttia ei ole määritetty {{home}} sivulle" -#: assets/home/components/HomeApp.tsx:192 +#: assets/home/components/HomeApp.tsx:162 msgid "Default" msgstr "Oletus" -#: assets/home/components/HomeApp.tsx:214 +#: assets/home/components/HomeApp.tsx:184 msgid "Edit personal Home" msgstr "Muokkaa omaa etusivuasi" @@ -3130,11 +3159,11 @@ msgstr "Hae" msgid "Search for..." msgstr "Hae..." -#: assets/layout/components/BaseApp.tsx:57 +#: assets/layout/components/SearchBase.tsx:74 msgid "Topics" msgstr "Valmiit haut" -#: assets/layout/components/BaseApp.tsx:59 +#: assets/layout/components/SearchBase.tsx:76 msgid "Filters" msgstr "Suodattimet" @@ -3555,19 +3584,19 @@ msgstr "Haluatko varmasti poistaa tuotteen: {{name}}" msgid "New Product" msgstr "Uusi tuote" -#: assets/public/components/PublicApp.tsx:61 +#: assets/public/components/PublicApp.tsx:62 msgid "This action requires you to log in!" msgstr "Toiminnallisuus vaatii sisäänkirjautumisen." -#: assets/public/components/PublicApp.tsx:70 +#: assets/public/components/PublicApp.tsx:71 msgid "Register" msgstr "Rekisteröidy" -#: assets/search/actions.ts:302 +#: assets/search/actions.ts:296 msgid "Items were shared successfully." msgstr "Jaoit kohteet onnistuneesti" -#: assets/search/actions.ts:304 +#: assets/search/actions.ts:298 msgid "Item was shared successfully." msgstr "Jaoit kohteen onnistuneesti" @@ -3765,7 +3794,7 @@ msgstr "Tallenna haku" msgid "Send notifications to:" msgstr "Lähetä ilmoitukset:" -#: assets/search/components/TopicFolder.tsx:50 +#: assets/search/components/TopicFolder.tsx:52 msgid "Rename" msgstr "Nimeä uudelleen" @@ -3827,7 +3856,7 @@ msgstr "{{ section }}n tallennetut haut" msgid "No {{name}} created." msgstr "Ei tallennettuja hakuja" -#: assets/search/components/SearchResultsBar/SearchResultTagsList.tsx:116 +#: assets/search/components/SearchResultsBar/SearchResultTagsList.tsx:113 msgid "Edit search terms" msgstr "Muuta hakuehtoja" @@ -3857,17 +3886,17 @@ msgstr "Hae" msgid "inside" msgstr "sisällä" -#: assets/search/components/SearchResultsBar/SearchResultsFiltersRow.tsx:138 -#: assets/search/components/SearchResultsBar/SearchResultsFiltersRow.tsx:157 +#: assets/search/components/SearchResultsBar/SearchResultsFiltersRow.tsx:156 +#: assets/search/components/SearchResultsBar/SearchResultsFiltersRow.tsx:175 #: assets/wire/components/filters/NavCreatedPicker.tsx:38 msgid "From" msgstr "Alkaen" -#: assets/search/components/SearchResultsBar/SearchResultsFiltersRow.tsx:242 +#: assets/search/components/SearchResultsBar/SearchResultsFiltersRow.tsx:260 msgid "Clear filters" msgstr "Tyhjennä valinnat" -#: assets/search/components/SearchResultsBar/SearchResultsFiltersRow.tsx:250 +#: assets/search/components/SearchResultsBar/SearchResultsFiltersRow.tsx:268 msgid "Filters applied" msgstr "Suodattimia käytössä" @@ -3891,15 +3920,15 @@ msgstr "Tallenna uutena hakuna" msgid "Save new topic" msgstr "Tallenna haku" -#: assets/search/components/SearchResultsBar/index.tsx:39 +#: assets/search/components/SearchResultsBar/index.tsx:38 msgid "Newest first" msgstr "Uusin ensin" -#: assets/search/components/SearchResultsBar/index.tsx:43 +#: assets/search/components/SearchResultsBar/index.tsx:42 msgid "Oldest first" msgstr "Vanhin ensin" -#: assets/search/components/SearchResultsBar/index.tsx:47 +#: assets/search/components/SearchResultsBar/index.tsx:46 msgid "Relevance" msgstr "Relevanssi" @@ -3993,7 +4022,7 @@ msgstr "Esikatselu" msgid "Published on {{ date }} at {{ time }}" msgstr "Julkaistu {{ date }} klo {{ time }}" -#: assets/user-profile/actions.ts:110 assets/users/actions.ts:171 +#: assets/user-profile/actions.ts:110 assets/users/actions.ts:173 msgid "User updated successfully" msgstr "Käyttäjän tiedot päivitetty" @@ -4077,7 +4106,7 @@ msgid "Change password" msgstr "Vaihda salasana" #: assets/user-profile/components/profile/UserProfile.tsx:120 -#: assets/users/components/EditUser.tsx:233 +#: assets/users/components/EditUser.tsx:238 #: assets/users/components/UsersList.tsx:28 msgid "Phone" msgstr "Puhelin" @@ -4100,70 +4129,70 @@ msgstr "Tallenna muutokset" msgid "Personalized dashboard saved!" msgstr "Oman kotinäyttösi on tallennettu!" -#: assets/users/actions.ts:173 +#: assets/users/actions.ts:175 msgid "User created successfully" msgstr "Käyttäjä on luotu" -#: assets/users/actions.ts:190 +#: assets/users/actions.ts:192 msgid "Reset password token is sent successfully" msgstr "Ohjeet salasanan vaihtamiseen on lähetetty" -#: assets/users/actions.ts:209 +#: assets/users/actions.ts:211 msgid "User deleted successfully" msgstr "Käyttäjä on poistettu" -#: assets/users/actions.ts:223 +#: assets/users/actions.ts:225 msgid "Invitation as been resent" msgstr "Kutsu on lähtetty uudelleen" -#: assets/users/actions.ts:256 +#: assets/users/actions.ts:258 msgid "User has been approved" msgstr "Käyttäjä on hyväksytty" -#: assets/users/components/EditUser.tsx:121 -#: assets/users/components/EditUser.tsx:123 -#: assets/users/components/EditUser.tsx:167 +#: assets/users/components/EditUser.tsx:126 +#: assets/users/components/EditUser.tsx:128 +#: assets/users/components/EditUser.tsx:172 msgid "Resend Invite" msgstr "Lähetä kutsu uudelleen" -#: assets/users/components/EditUser.tsx:126 +#: assets/users/components/EditUser.tsx:131 msgid "Would you like to resend the invitation for {{ email }}?" msgstr "Haluatko lähettää kutsun uudelleen osoitteeseen {{ email }}?" -#: assets/users/components/EditUser.tsx:136 +#: assets/users/components/EditUser.tsx:141 msgid "Edit User" msgstr "Muokkaa käyttäjää" -#: assets/users/components/EditUser.tsx:139 +#: assets/users/components/EditUser.tsx:144 msgid "Add/Edit User" msgstr "Uusi käyttäjä / muokkaa" -#: assets/users/components/EditUser.tsx:178 +#: assets/users/components/EditUser.tsx:183 msgid "Approve User" msgstr "Hyväksytty käyttäjä" -#: assets/users/components/EditUser.tsx:184 +#: assets/users/components/EditUser.tsx:189 msgid "Approve" msgstr "Hyväksytty" -#: assets/users/components/EditUser.tsx:192 -#: assets/users/components/EditUser.tsx:195 +#: assets/users/components/EditUser.tsx:197 +#: assets/users/components/EditUser.tsx:200 msgid "Impersonate User" msgstr "Testaa käyttäjänäkymää" -#: assets/users/components/EditUser.tsx:352 +#: assets/users/components/EditUser.tsx:355 msgid "No products available" msgstr "Ei tuotteita saatavilla" -#: assets/users/components/EditUser.tsx:409 +#: assets/users/components/EditUser.tsx:412 msgid "If a company hasn't been selected, you can't select any products." msgstr "Jos organisaatiota ei ole valittu, et voi valita tuotteita." -#: assets/users/components/EditUser.tsx:417 +#: assets/users/components/EditUser.tsx:420 msgid "User Settings" msgstr "Käyttäjäasetukset" -#: assets/users/components/EditUser.tsx:424 +#: assets/users/components/EditUser.tsx:427 #: assets/users/components/UserListItem.tsx:25 msgid "Approved" msgstr "Hyväksytty" @@ -4204,19 +4233,19 @@ msgstr "Poistettu" msgid "Item was removed successfully" msgstr "Tietue poistettiin" -#: assets/wire/utils.ts:391 +#: assets/wire/utils.ts:396 msgid "segments" msgstr "segmentit" -#: assets/wire/utils.ts:391 +#: assets/wire/utils.ts:396 msgid "segment" msgstr "segmentti" -#: assets/wire/utils.ts:394 +#: assets/wire/utils.ts:399 msgid "versions" msgstr "versiot" -#: assets/wire/utils.ts:394 +#: assets/wire/utils.ts:399 msgid "version" msgstr "versio" diff --git a/newsroom/translations/fr_CA/LC_MESSAGES/messages.mo b/newsroom/translations/fr_CA/LC_MESSAGES/messages.mo index 30dc75d7269d920289fe9051b6c78eb2809de702..c052db6d744c587a42eed3e4da4c40f432ba8c89 100644 GIT binary patch delta 15433 zcmY+~33yIN-^cMglE@+=5t1O}j-3!|VoyoXSgKF$w3d(?(bytE2)C^$x@fd^s0a0~k3e)Pqo7=UL{_g%OB2N+2IFD!<> z%^Z#r4u{)O$}}96Q8zS1-H>SeuVZQYeX%TN*y|r4e>;}&j|O-Ft6{O`4u=mmz#`ZT z*_$IC6=(vM!j4#h^&QDHoD57Z9B?>RVsZNWP&+z~+UW%(V#ggUiO+1mSPO?EjD9&( z@)}?WzJW#2g$gLm_A^lPO~5GDcg&@s2sfcpw+$7*UetoeY`*{_>EB0hEEaF>3r5`+ ziRG{khGGX)00U6>r=pHz1ZutU=vJyH(a?gkQ2{KpuC{K&Dva+%-FM6SJ9eV)@ruJi zG93RxrS?74yq{rB+=Pws64u9(Els~oOY*OQNetA*tym9lAa&v>)yhQtIx4WPSDj^YgJ{`;sSe1;v-Bf;Tlf}K$F&q{Ec)E!_zXL<&8Hn&kb_!E^n z&qOn^A8Mf}^uijb1!AxWHbPHqYK^xhpzdpnD#F)MN7c(sLuZs}FJz;teFiqfrC0_} zS?^oDTbl_ZQD+8CqgC!sbl6uoc^Y9kX+0Zc(<&^?ESQnd&*(Hhhl?m*pm6m{b{ zRKz!}FHxB)*T#(3LfxN)TBtJyV^36Ohhhp&#Mki#zN+`Xep`p58w2A}ft*B5RDjCF zFIW-(!Eki)l#ZYYDzH|lfL})~l!B`Mv8egpN8Pss^?g}q$9G{dz5n@z4N{CMo&wZ@ zPcZ_+lgxy%sD4LlDn`s4>>T-gbO8R-*qYYQBT0qdAAg@IUB*f8#6o zPe<~vNLsvRiYp1#PsRXDL*1B#3UoI{<8dsH&#@tf^BL3vuc3~h7it52u_z8g%{vTr z-#FC#)7><57V}U$U5r)nOFMoR1L+so{sYtkPwn_~)Wm+gQ<}IGYGNlA$J$r|o7wRW zsEzbQ)rfl-4ORPCEDQkk;FqYQ*n>LTV>kw{qjuEuUna1A=uLk(>b?xr0<*9LF2hLt z()N#`j;H{gdjCD%Fb`Hlr7RAWk$BWuzltiRKB%2$+5U9Y5qyeTC=V6*aa4d;P#e05 z%FG|OU!=3CjnY^`?|)SqN?9Cgf<&x=Z=fEWfWbHu6~H1pz6urS7Te#AN@+f7o)f6R z3s4#Q%U*wp`bEaC3*QyicT}dKoi{`6BoXyfstant_b?C_q5@ir3OE;)p?#OX3{V zYq=b?z&=!lzC$g13Kh_0JN{Ew@?VF6y9~UFWxAOgl2HK+LcM;&Pz!#Et#B9egV6CD zHF11*bEZkCKzm_*9E{q)Vyup9Q30Jq-FK-w`PU7O-;! z^u;zVU!Zp6*W2tM z1obwAqsD8Z?rVrT^H)$AdDV{hMjfRK6=0gZo{0qLcFdwtmJ9ErZd`{RxCOO?ZKwry zp^EJQ^6hY3z|vU#P4g>PJZb|8sABGf3aAfiVHaxt;nqy_*ZZGMLqCsaVpCj&s)=i; zojyRN@C9mtz_-lK%VJgfl~Dn9KrPta_WPnTl!^*`G=||!R4uH)K)wH~XlSRo7>T>B zmoS3oK&Z~>KB z_iY+Fi~piB;5ERcGziPnk3ucLIu{}UVj@Y7sqJS!lzJ~_z@NG z9V8I9ih8( z>Ie^`H~x&Og?m`|{{Kls6BQjq)EJ17*aEeaKBx)CTIZuC*lPQEs1#pD?eJ&Re1G8u z^cZXczk~|>C#-_^(CtklXo!g{6g}xjpmyR!JMpeIOsu>SKOd) zfL}uuT_4o9ejIAP4^aUxLM^=3y46iXJKux;_;1vN$E;US58g+A{0mhJUT>T6DAZ2t zpyp|d%G7IE3A=|nZpTy_nrJ4fNItavm8ev$w{FKe^z-mle1zIb z+;9_kTU5U%Dg#4M8ySfT=pEELb5I|)`RJwhe;W-wu+!eK7d6p$cKjl0CqH2|ypNSJ zWQ3WxF&4fZsN!sc#jz*qEg6J*ZYt`z^{DkuU23_w9v0F@XL{48(wuCKKgQ zfmA`go^??RwnjbQ0~N?X)Xs;ZiqLJx7ofhF%TcfSPIN0Jd+fkLRLZ|YO>i3Zz%Qux z-Z9DqRu)Upt%eGy5k_GG>a9sZ?Kl;Ka2_V$XV?R8VLY}-C;y2wveV7KM(@Kq^q-=> z@l{5fKO0KI?(~buY$Rg5mw zJa4;c=*$+PCRl+w%P&w1Y)3tC1U114>pfJFd5<&WA*df>F{t@o!`9dpRcwn;8(oR2 zsWqq!xxb)9rYFzn`lxUhw7)GUat>O z_a8^y|EKLoO){V0_UP`+g=sWq;d!i#`mMMcPRCZb5l`YH)K2$KHYq%T5%jO36aU6& zjF@6fLS-Za>);gI--;@}yeZ^g3mst~5`V=87(CU~LK|#IzYF%kS*VF_qmCqWn#oWt zR0ivzFUDd?j7Mek4b*~fVi*oW9pR*D9FS7HFekWNh+C(X%O&k`4{EBTs7KGDrn+Xm zYsY^_mE{Z63+X@ITB346{VGJr)iRg*_u?VJE2Tvy#T3{#x3M2zHaW-n=Sr~$! zpe9_8x^FKk(8H(&Pg*aa>i#O~zCTg-y+l=)?>pvj0#W1T-r;nW)XEH0$EMf<2VzBB ziQ2(Id;K~pApaTWg{y#i<6}_)4#X%Nhf4Nhtc=@HFX$z#g^yA9mv_%JAKUtL}hRtdUNPMV0rqd-!tnxM!q=w zyYTxaqROamRC6qb9Z(PSKt-I174SXV--v1#$JciZry1nlIk$JA9wF;Ky zdSlcVrwi7=(OCH3LYC1`L>sXr?m9F_7v(H}!|OdwIH*Rwi$VI1nYW~hyH!eDe^ z2#&SR!N&Agpx(NRIpkjpKVl#q|3MdyoNvzXJSt_6P(}9=+hg3v=BTD%68!_%2m?ML z2yBg=a5BDuC$JPoEiknbhdR2p3&_9Dsy_od`*%<~J&ZN+G=||n=!c~j@`_?4cEBuD zK>4Tzf)<&HtDyR?U81-}RGgRQ4Q9C|>g=dRS`j2eC#8Oi;RZxL6Kmu_)I?+(^q+wx1sG3-Ts`^cK z{3|R+{~W4De#K<$vCQ;$qiQH}xq1F0REAcfj_^yYg!xzo?_%Mfg?g?q5eK4nQWa<`8GD8?82qW3rzL9VE{w#MY>C=PS1f%02hvcL zrlZbqDk}90?D%r*Pk$3O#1fyI;%tp7#&)QQyQ0p1i0x0ZeuUc48tjPQqBh{ait|^h zE3PsRHb>pq+4fUWUn(~$uyv?f$wMu83RQ%+P#O9SHF3~tbA;7V8%aRj-wu_bKB)Ny zuO|OWRW<|laJjv35-ZZbg?i9;jR`CQ6+i>@z_zFlP!g&p=3yoL%=QnVYUBd8!@H>3 zXt37&-q6uaLjjD(I9!Ta;0*fUZPeL5LPh=@wPUX@%y=*=<>hU^0V<=fpfcAB^{JkQ z5jYQv;wJP(_g6HOvOLsI&!Ymkhnn~wRMm#8GZ~0M-PZKy4$gzh88-DzIYF{;P0r30ymh{Mx$P*=BTrK8yn$dtdF};f!#-C z?j;sOpN*zyLr?)HVPTP?ll2{wXjJCH3e*G#QITH60DO#kzyCoMXPGZeZPZ1bWf#tK(98 zJs-962dLCP!A|J2*^GBbjrYYs9EFAdEp##sEi?~R9ADTQHlvOt4~yVoROH`d2|R22 zKck+1gj&FRi&-!n^}G{xe+|?Io1l)k!xr+d2L~~rvz~}b(PGq&x1bihfZli=72q$Z zoj$@K`~#bz&sOuRTq5fF3REW7;sD%^nlEe{|NjI=Z6p8vXk;^>3s+FJa2pj!v0U@T zib56BaIA&nQ46d^EwCAN#^0bmMBigayn`(;3){YRLHpV##mFDmup?D!m14J<(gx*45#5X<5%d)@J^382)s z$Jy5lhj)iB7x_<$x_&!G+#YTJm z1nMXX+%%NJBKyn@rBOR>j7nuUEG!<>#964+&qOV-5>*3VVguZY3h)+cV-HaC`R+Hx zS;hJqDs%2k8Y-IUs56^w`ztV#{%X_$`B({$ppNPxM&Wae#)yBLOeLWL?Sjf^GU|F3 zD&W%)~vhBK?u5`*Tody8@NDudGK< zffisle2ERQ+d+NG-Rzh~O$K(NBEEs;@j2GU@O(2tTh#kK1gqkQs1)x+1#$-U0s6!C zBM+I3C18EV2cfPnLT&ip=*Rkw@9n@@R8?O=71bluPW%p=;wq2YNkdeox}&c5Lj^n< zeQ+Ko;v%es1*n?w_|61e4lB@agoVHVccqYdWe;xIf+(H%G3)FnYzc-mJ^*#Bo#y|oCs`8=egX2*XPDP#V9MldLpx&0P zsGT1~f4peNZ=#<6!}edGG8%l;%vZ@;3-!9j9wq-ubw>u2lEK&>XW*-N3Zt>i4<_<9 z=uN*PDuB+YKnGy}jzH}&+d2)4(VvYvqEAq7*>>v@H;pO`T(viN9WxVFL}ex#t78|` z&azRdoQ|3}2Nl2y^v5qy8OlX1bjW%cwd2RA`+Sa@qIH*~QJjHTRD_ABg_5nQr~pTy z0$G4HaUW`-`=|h3*uKvRQ)FdP^TnYu*%ec8DJpXwCkwwXZbxYv+DR-b;#SxIyQ3za zZO3y^U$QT-8RlC(PMP~!pw7B2>MiMs+SqtIJ`02BFUID$0pHU5e}{$^ZgbkyLT^;6 zGEu3TYx@gOnc0LTa0k}LL#Uc~f`0fM1JLV?2{;(_Tnq+c9M-}%7_Ij|orWe@jw+s2 zs2yxT1#%3l;m@ce2smquMP;ZjY6F9@Bxa-L`v8@Jk5OO7&rt#HMg?>L-CE!%jS#$n zn(zOCKiUN{MLl+&yqU}^eGP&?j=HSj71qwjh0uOcaX z-bCIQW9WB4?O;5r*e0VU+JN0~KPq!!7t9}0Ex<1Hf5b$LxoB!A9W~z?d<)N6>t8Z| zn*PBhW@*HQ;|%CqUi3%vU`16gQL*cG+& z8K|A-qK>ct>tIoLf!TQ+HejF~sz@fH&S)+c!TG47T7bH56)M#iu?7B&s-22gjWtk5 zS{KV>YgC{EP+!s^7=iAoG;|g#umWzi7fzxke26Z5f|{WBHFMVeQLmE=bu?p8#WxrA zcC0`Z+h$b8cB3|S7!~+=9jqe?Dpldr(Dq4&TIo zP!spMZUS;)IQa+^}1>9i$NV#7gPZKQAe4Dx_^r8FTx1ccdVqLROg{mn2$=~MfAWss1)8q72`83 zhn_#1w;>X>Kqh+PMAU0K#r9{To_`-3;!;$=r_im&-!xRERc@ItT4yYL?XWrH8&Fky z2UWGfx6NzS3UxFiaTu<}FR=74=6W7hrvDHVu;d+%lpS?L1)P1C{43(=cg=@p7OGm; zp%y-js&21)X6Fg0_xUyS!ff=#DHx5jQ48+Cc)X0>SoS`DB8EkcN6{7)P%l)(W3d>zQMEA#ow&hX{{i*fSyW)Z*zw0$ivBa(FaFTXQ`${K zuSFF4VO`YOH?=pkM?Kgbb>G{losUNauIE(?pV;wjs15A2evJy`TU6kOZ2vSCr|-T@ zLp!;PPV{?Zc3KnlV0|o#&8!Ki*RLHaBLh+Qy^RVi12u7$9iNH1|3i$%_1GKFV-?nS z)ccRA#vT~Mg(;|=ZLuD<<5y81s^X8$Psd1f(r<-zZ~*GLk5Hf9b*Ri;##nre`q@$S zSMz5<+1Ot1|1}ylxKQ&qQzTtcXE+~q_G?jJxO}XImr)D){%(r2F>1j~Y=vu4JHCs` zjOPxlj%sDnWW8jd~ z;e(wSLsCaO2aXuyN>3i_%8eQEjZeS;7X!lwrKS&arR3foQ{a(vb6j?qYurfJzzkQ4 zv!!#wgp}kASC@=*CdloYb<3kva$2U#$wbL%>8|9IENA9u9&I!sIna0b#EH&fBhp>D zAHRFfqiCa;y6FS!<&2yYUp%&Uy}Hi2O`0}{i>_Ngch8);9-gr=b#vRl=M2jovuZ}! z-0;2Cy>f=G3dn7F!0GAN*)?)Rdd7iuuH1fyKKJ$>?d;O!_1wrGQhjnpoe9kuc(Y{g ztTS``0uD_6-`LZ0OBQr5lJowxxS}3W=3jS>S!(c=*F0!!o7@4%N(7X{QC)y{{bXPObGx0 delta 15271 zcmZYFd7O{c|Nrr8_F?uh494;v#w=mR*v2}H5yeEZWM5~j(b%(f3CS*vHQ7lL(OW_y zpHV4Gk&tL4EhZ5aE#mul&N;W+?~h-%Zr#s0*L9uqI(;0?YD16|9K$Q4@4T{&jlspL)0glkhkO;qT~+{~~*H9-spC zZRR*J7>ZR`--)N;VW4Hnfa46nF#6L`J6eR==?Wxb=M9X;eYSrbW9ff`O5X2S2BVrg zP9WAm1ysxS>!aptit()PNImCUr9z(3uvX&gOO04&Fnht`Ifxr>KR#Lw~%E zTHq%7;yqMq|FJ%>`evK^0#QX6fjX)RE)5k)1ACzvs@mINee8`DaEW!h^&`~6MX0m? z+4>j8(+_TKHt+~4(1xguG(`oFg(WrCo`zD@12xfL)ax+;b>n>0jmuCGZ?YanW$GK- zzk#|x_))V^G)B=ckIL*Ln2XJ^BW}dDl$3LaMpp)!v@wCajGAZ-Did3=8h(J~@e1k) z{ze7n!z>Co0<};As`@if8|#3&uNUeAG|Y}ahar0ZUo2^mV$>P0K`r<$R>BLY3IDYH z(8tVp3RY#j4eE#nql$AnDpN~se;4X4IEu>1E!4a|kCQFdcdF3Pj+0P3Nk^Sw8w|ps zs2${^cJw^zt(b57%TY(M3H@;omcso=!8?Um69d|r`O-0%eq(f%l2$a7x=z+yR3H;= ze*x;XTxa{I?e%M@9sP~kc}RN`NL5q@>Y!>W2epCTsP%@U0-V&I{FkONlL0Nb2upT? zns^T?10SOTJcYXdJ5+7lKxN98mpcs;P~%;&Iu1w8w+MAa>o5fOqYr+RL;hRP_=EvX z9Q1@KvS?JlCWc}|)P32gKxbl2T#1$ODAvcTs0CvAEb1t#qc)I?fmjDMZwBhVRxS-K z&;fNOy-+*N#YCKF$Jb&w{jIjY7q!4)JAM>3@t3HHzeUYkjA3{Wbrb=-dm1l`+K5|? zhRz}bRrOg|5&-JKiKwG^5p~8ZZ~|^e?Wo$5Ca@F?px+2}UnXjSr!WGCU{#!G`zw$m za-FR-JX|=AdhiA+WlkrPkzmxBMxlx-3ANK~+wXung5juz=AZ&!i3;#_)P{DTGV`JB zpTJ1H|3x(P;BTnZI8T`g!Z3wy9O}VGF$z1O0vKe+N1={xvhB}AWpptrkX5L_x1uss zXs>^Y6DoH&Hte=xhQCL;bX>j9Tz%499_}fJUPNo`%ZMJk*ZY+v{6x-;1i1 z1J=W+0FR=p1y9k4#B-aU&<<|z#3v1%))5wih3=FqUN86 z%FrvQg;%2j+R}ym>%yB1q@fqv;`jE3nq5r*bx^Ng25P~Hn1wTtA9&7D)WpHv%toS7 zsjrT8F&(vmTujE%sC8fMM*el*3yXu_cGW`TIDO+Ono@o4K})E8|BDpRMiD*E&=#-kR> zLhUREW3VggD2JnpJl|fQj=JBSOG7(ZYTby6Y?t*Q>c(TJ9es(~!DZCjaMh0gfx7Pj z>dZ^^G#QCPjVGXLDGe21Lv!7ATF_90Phmyuj=FIy>Ki>7b$u#oq8X@STZnuroDEnO z@1P$B_c9v@MHO>-R6t3nh0{>;H!6|yZ$U#7w?X|}?u1Qn6sl;pp?10#mBM4F3|&BF zt=DYoAL^?J9oj-l>9 zgPQm)1&wOg*P~#b>fOAj_c0(2KK-5Nu^m9#w6BtmWi>+^<9yo%U;3Vq7 z^QbS|CDdE<0QFNdw7=Ov8fuzl1^+=6 z-$T?yQ3FgZ#G@9-L_OaFRXe$;6c4xk=TVuMg_?hry}kx@RPJsXO2q+Gia$jiNf9ao zKcQ0lJ61;jfo7p<)@0QEskYw`^?Ef!1(t2EcR4sW(50VMj`GAHZK5hn_B2+-X zqH5wkdN5*;`AudWtVw?)R>M`OlpjQG;43VLzhDLQ%{7^-gmLsUP#Nir6o4O8~BD}J^H_)2NUwl4j)DBJjdDvwUOSa4dkPa&c#Z&1Osp<>g@MmIO{t{ zXlSA@FcmLgRSX(zc94XcAj{epHNh0ypMy&27SzsmqUI~a^LQKsanle}%x_{1`g_m~ zpmC9gyn=rCBWfqbsOo=!njmdZbwrSdCmiy_aLOms#q*dH~)L{xy&Q420YW%3==y!%kE zWg#}gudUG|OET;_?P+MDCs9Sx!}f=xQZ?2(4b$kqgbL_A)J`6v0*@GF`thh*Nk?s@ zF)E-AsCBxaK4g8+U+@1E8hT*5y~D5Z%fo@ zv*U6YNk0=?VMlx#U%^Z)#%xR(L;ma27&*qA?MBo${S0=+Kd~FOA8Quch>y@eiuyv{ zLKR)aIP>fLdZ@q#<6az%+F0^<{%{lPqINzF74Yow0bE zy51XOa4u%xTGWK+P!krRFJ41^2Yy1;i0?%6d@$-YZGd{NnM*@w_$X@PPN)Y4qb7L9 z`Vy+BHroC!)DNrUs0oX)HQq)QS;OZ{K$)mo%0^}8DU8BCsH1eBrJ)qLs6gggm!Zyl z18U)&sFWYHj$hzd)J|JZH>vA_mFN#b4^GFLxWRf7m65+O4Fg{={f4Nb%SNr!0juH!tcS~A zApa_^&lsqW7qAb8%`g*7NSym4z=JF)LH+6Izqph=K0E~ zTBwG4Ytm=7wP($McH9y*@sp^DdY~rGwT`mm&!LKQCTatV3r<%oTn9|_Q;>%?2JvT_21JXff(N+k~pZ1E>Ih#(4biMXE;0t~%S4 zS7X!zeX$mfM?J6+6Y)J%S$>NHF#RR-z7${*{Y$9w_Mc-8IUAMPZm4<3qN;G7b+1dK zJ_A?nK`pq+c2$W$Rh1ra6!DPIS`Y{(h z-(=3MP9uQBZiAJ%kh9P%G#vHOU4RN?EvgLnVhDbOy8pDjehaJ64_ajIPek3HiK@~k zY`+g`zGqC|b!O2BW1s+)q7A4s-DhrazQJDfi!lq^EH)qIIj8^&QSZ}N=!ZX}0=$7b z+P_fqMZaupfXZBVjM2Ar8V#lR6^z8y7>;kD7I+^O*hy5?Uc-{&K`mT$iK*_o7(~A@ z24EJd2-~7k-^*T~g?es*WPN8Hjf(gV>Qi$PQ}9<*AhE9)6HyN~Ku!1Xxj;uxHWd031(!zY)Tj19$x z^e16E+=V)-fAKMFzRdi}V>ULWe+WC^Kg-B}CmN40H?P@hjG(^@b#@=3&gvp+!iT7x zX00$kU2;%?OvF;S7<=F&UA0&20+%s&q`?>gJxzmoiG!BY(A%)UjX^cw0c{Z^Ur z5G+GK3RPq^P^nF^{Z!;7a_XW2Y=A1lmZ-=W`pH-y=c0=95GsR(sCiGJGI`bZ z|H6{@KXjAXkq2|QAp^C8S*W9U4fWt&)Xq=X{`aU4)!(SVs&6*6(g?L+d(_VRp^9+? zDpSv)=3l;<{A+=o3}{EkP!E2NO4awMiGRg-^xa~9IwqjTyJ0mPfqHHcD!`4XqTP=^ zcmnkyI)#xK`?{&Mm@mW-n?8n-81{Hv_)qLryp%&&$HtzP#N50`}Pc9`t|9yiPSx z6SPAG+80A{0_r`ViORq_RBh}<9p%?{{0{1^7DT(jSdVfv==Vv0{v?kj`vWh z4Sd@y6pN~jRMhnbs3U2OzW4+x@Fy_>d)oeRRG{Nf^UueUze`<9LleA?5%@N0hlf#T zd>ZxO4b)lt?J^nipmx*{wO}6%z#*srN1}E*4kK|YHpPY53qRdO{&ho*-6oZ_aUlIB zs0r6#PuzNfeve6UORP!1BdVCDpa++tcKj}CBkx-aQ5!gpD$=h|^ZkmCVCcK1CNf;x z=#RQE7nPzt*55FdeyzRc|2FG|+Tj9JQLe;j++_QEQ41bH9l_Tag;y{J?_e1Wde8LT zI2tOVI;aaRY`-&Vf`O<7hGEGWS{I@MSc`hiwxLpc0+or2)~l$D6{F_y+h=xO4mlG3 zE|rE47jjTV*a0>1)2NgU#L4&q>ixctN_qMHW@lBf9Q`_|h1;S6>4=)A59#z^iuLi+YVtS--(J`afeO^#8#0=E26OB778eBpp!KN29(AE-ICq?e+IiJHLoJihHQk zhkR(Bi$fhj3M#N{R4sJGdf3^ep-5jsMYaev;hU%`{lt0;mBQE~rg#!jMOMr9v#=`t zwx|V$V09dUIzZTzm;N?+w(v|6nzYE;L8h0Ld7Cmtq=DKaA&wvDg)tVSW4sYoX_;`9eN{n(#TS zj4xwt+=+Vr5-M{KFcA|!GMRk>6~Hh|#swvPmv1+X>I_`Kx_IB-koK|JX?JUXR5cGp z71LzYnJ+^X(>7E9AEGjI)n5Mv73f1$<|=<;{z#?h%~+LkrDAO}Gk`()E~x zr%+XW7lSbHGc#d0>g;1t8>o(YJDQ_1^CXtWTs!_O>iHSAKkqZnUnyO~fFgX`x(}7o zBdAngKxO22Y=_auDNO8xHE|0n@Y5K87f=Cwi<Qwd19z z8@HpXbuWhD*Qfx0LM;?<${22^E=Ij2_mPe9{XcCk z)WS$EWMVVyh`n(EYT@gsT6loURE0ApQ*}`Nrl`z3g%Q{jYvXWKO{~OHxE4e44Xnia z&bu`9;28|Zi&zV4a@HJa z6qeQdUzLU;Yk&%*1#059SO)u|CLCj(f*$&_P)D@Ij(>zn^iQGQ@4M)a|DcZWp*7?y z^9hbcS39juBL#b66wX2w$8uEUdoUG0LG9o!s>tqRSxh=-KH1Gt8!Et7Smr!GH?SLK z{%| z;bA-~(D~LS*ogiLOvf)!8~43LxY~KzC3A*7Fpd5U)Xv{QE&LIxHvUE(QSfE+Tdhdc z^)jdwx5ehz8C5GwtShk${dHIwy{G_ByEH1$IFFU^HtGn%zcpVx4{E#xYQo-_hl5ZP ze2O~b&rxsBS=5pIfZD*nsJ9`!$kbRBRHl+q8*&@cP~?xI9_)lQa0tfYLVJA+D$w1S zh{v%Z-m&8;S4{C`V=u->pyvGqHSd?GpEcJ}^ZI^QvN6}GNJ9e|sE9jaRUC-=0?t64 z*%mu~9uw%_v)3zKHQ$96sCjy#j&uy_zSl4mkDvlLg*w8YN_6@4J`JV#9xBB#-yF z+V}?QH9LpR(B}tJq?xE99fGO20(BH0<4F7u-@p++n(Hw?nM`D3E5?UnB0JiSCBOea z^RtQgB6_&tTda%^Q43eTZmPN`YUe9a3vWVyJcGe_9&6$iOu*1$^E#(v0R4PyffH~6 z?k(p1Z%iZm7xTrNhMI6G`r;~7O}vH*=xq$blNf?up=#wj^q|iTbG;hsxkpfeHMiq! zFou2y+aGj;{A;2S420uEEQPaCXa6$l`g+uZZ=voxf(rBtEQepAYTk6_8ErZ=XU%u z>i!?GCOS9GpRBmGXw;zp5~kn|OvUr4odw=9Rz{82M}43MVLXmU53ay8+=qJZXVh!^ z5S6*~-}nKCZBTE^R2--u7iVa+W1zup6Toy-k-UjI!(!Cg|A+dJ#N9D(Njhr5zNjKy zgz0!3v+zIEj$8b0GSdUA(;sO2voS&c|H)z+djI!eJv@ziodW(aHp6WCV=)=u!$`b> znRxpT@9-wwqrCgtN5zD<&Koo=H!s(d=IJ=fGsb(UUt2$K%%D79@65b>fA1f|CIonA zKl@&g_lb#L`;^anE Date: Tue, 4 Jun 2024 09:21:24 +1000 Subject: [PATCH 02/21] [STTNHUB-207] improve(agenda): Support sorting by versioncreated (#919) * [STTNHUB-307] improve(agenda): Support sorting by versioncreated * Use ISearchSortValue where sort value is required * fix agenda list rendering --- assets/agenda/actions.ts | 19 +- assets/agenda/components/AgendaApp.tsx | 17 +- assets/agenda/components/AgendaList.tsx | 53 ++--- assets/am-news/components/AmNewsApp.tsx | 21 +- assets/interfaces/index.ts | 2 +- assets/interfaces/search.ts | 4 +- assets/interfaces/topic.ts | 11 +- .../SearchResultsBar/SearchResultTagsList.tsx | 2 +- .../SearchResultsAdvancedSearchRow.tsx | 6 +- .../components/SearchResultsBar/index.tsx | 182 ++++++++++-------- assets/search/reducers.ts | 2 +- assets/search/selectors.ts | 80 ++++---- assets/wire/components/WireApp.tsx | 21 +- 13 files changed, 221 insertions(+), 199 deletions(-) diff --git a/assets/agenda/actions.ts b/assets/agenda/actions.ts index c4c687bb8..33621e329 100644 --- a/assets/agenda/actions.ts +++ b/assets/agenda/actions.ts @@ -6,7 +6,9 @@ import { IAgendaItem, IAgendaListGroup, IAgendaState, - AgendaThunkAction, ISearchState, + AgendaThunkAction, + ISearchState, + ISearchParams, } from 'interfaces'; import server from 'server'; import analytics from 'analytics'; @@ -235,6 +237,7 @@ function search(state: IAgendaState, fetchFrom: number): Promise, next?: boolean): AgendaThunkAction { return (dispatch, getState) => { + // If there are groups shown, then load the hidden items for those groups const state = getState(); const {activeGrouping, featuredOnly} = state.agenda; - const {fromDate, toDate} = getAgendaSearchParamsFromState(state); + const {fromDate, toDate, searchParams} = getAgendaSearchParamsFromState(state); + let minDate: moment.Moment | undefined; let maxDate: moment.Moment | undefined; @@ -361,7 +366,13 @@ function setListGroupsAndLoadHiddenItems(items: Array, next?: boole } } - const groups = groupItems(items, minDate, maxDate, activeGrouping, featuredOnly); + const groups: Array = (searchParams.sortQuery ?? '_score') === '_score' ? + groupItems(items, minDate, maxDate, activeGrouping, featuredOnly) : + [{ + date: '', + items: items.map((item) => item._id), + hiddenItems: [], + }]; next === true ? dispatch(addItemsToListGroups(groups)) : diff --git a/assets/agenda/components/AgendaApp.tsx b/assets/agenda/components/AgendaApp.tsx index 860b3ba3a..3f32cd614 100644 --- a/assets/agenda/components/AgendaApp.tsx +++ b/assets/agenda/components/AgendaApp.tsx @@ -4,6 +4,7 @@ import classNames from 'classnames'; import {connect} from 'react-redux'; import {get, isEmpty} from 'lodash'; +import {ISearchSortValue} from 'interfaces'; import {getItemFromArray, gettext} from 'utils'; import {noNavigationSelected} from 'search/utils'; @@ -22,6 +23,7 @@ import { setView, setQuery, saveMyTopic, + setSortQuery, } from 'search/actions'; import { @@ -124,25 +126,15 @@ class AgendaApp extends SearchBase { !this.props.featuredOnly; let showTotalItems = false; let showTotalLabel = false; - let totalItemsLabel: any; if (get(this.props, 'activeTopic.label')) { - totalItemsLabel = this.props.activeTopic.label; showTotalItems = showTotalLabel = true; } else if (numNavigations === 1) { - totalItemsLabel = get(getItemFromArray( - this.props.searchParams.navigation[0], - this.props.navigations - ), 'name') || ''; showTotalItems = showTotalLabel = true; } else if (numNavigations > 1) { - totalItemsLabel = gettext('Custom View'); showTotalItems = showTotalLabel = true; } else if (this.props.showSaveTopic) { showTotalItems = showTotalLabel = true; - if (this.props.bookmarks && get(this.props, 'searchParams.query.length', 0) > 0) { - totalItemsLabel = this.props.searchParams.query; - } } const showFilters = Object.values(this.props.searchParams ?? {}).find((val) => val != null) != null || @@ -253,12 +245,14 @@ class AgendaApp extends SearchBase { this.props.toggleDropdownFilter('itemType', null); }} totalItems={this.props.totalItems} - totalItemsLabel={totalItemsLabel} saveMyTopic={saveMyTopic} activeTopic={this.props.activeTopic} topicType="agenda" refresh={this.props.fetchItems} setQuery={this.props.setQuery} + setSortQuery={this.props.setSortQuery} + showSortDropdown={true} + defaultSortValue="_score" /> ) } @@ -431,6 +425,7 @@ const mapDispatchToProps = (dispatch: any) => ({ requestCoverage: (item: any, message: any) => dispatch(requestCoverage(item, message)), toggleFeaturedFilter: (fetch: any) => dispatch(toggleFeaturedFilter(fetch)), setQuery: (query: any) => dispatch(setQuery(query)), + setSortQuery: (query: ISearchSortValue) => dispatch(setSortQuery(query)), }); const component: React.ComponentType = connect(mapStateToProps, mapDispatchToProps)(AgendaApp); diff --git a/assets/agenda/components/AgendaList.tsx b/assets/agenda/components/AgendaList.tsx index 6b30fb6cc..5043c1ebd 100644 --- a/assets/agenda/components/AgendaList.tsx +++ b/assets/agenda/components/AgendaList.tsx @@ -415,6 +415,8 @@ class AgendaList extends React.Component { render() { const lastGroupWithItems = this.props.groupedItems.findLastIndex((group) => group.items.length > 0); + const groupedItems = this.props.groupedItems.slice(0, lastGroupWithItems + 1); + return (
{ }} onScroll={this.props.onScroll} > - {this.props.groupedItems.filter((group, index) => lastGroupWithItems >= index).map((group) => ( - -
- {this.getListGroupDate(group)} -
- - {group.hiddenItems.length === 0 ? null : ( - - )} - - {this.props.hiddenGroupsShown[group.date] !== true ? - null : - this.renderGroupItems(group, true) - } - {this.renderGroupItems(group, false)} -
- ))} - {!this.props.groupedItems.length && + {groupedItems.length === 1 ? + this.renderGroupItems(groupedItems[0], false) : + groupedItems.map((group) => ( + +
+ {this.getListGroupDate(group)} +
+ + {group.hiddenItems.length === 0 ? null : ( + + )} + + {this.props.hiddenGroupsShown[group.date] !== true ? + null : + this.renderGroupItems(group, true) + } + {this.renderGroupItems(group, false)} +
+ )) + } + {!groupedItems.length &&
{gettext('No items found.')}
diff --git a/assets/am-news/components/AmNewsApp.tsx b/assets/am-news/components/AmNewsApp.tsx index ae855524f..5d6ea861e 100644 --- a/assets/am-news/components/AmNewsApp.tsx +++ b/assets/am-news/components/AmNewsApp.tsx @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import {connect} from 'react-redux'; -import {get} from 'lodash'; +import {get, noop} from 'lodash'; import {noNavigationSelected} from 'search/utils'; @@ -41,6 +41,7 @@ import { navigationsSelector, searchNavigationSelector, } from 'search/selectors'; +import NewItemsIcon from 'search/components/NewItemsIcon'; const modals: any = { @@ -110,10 +111,6 @@ class AmNewsApp extends SearchBase { }); } - const searchResultsLabel = !this.props.activeQuery ? - null : - this.props.activeQuery; - return ( [
@@ -171,13 +168,23 @@ class AmNewsApp extends SearchBase { + {!(this.props.newItems || []).length ? null : ( +
+
+ +
+
+ )} ; activeQuery?: string; - activeSortQuery?: string; + activeSortQuery?: ISearchSortValue; activeFilter: {[key: string]: any}; createdFilter: { from?: string; diff --git a/assets/interfaces/topic.ts b/assets/interfaces/topic.ts index 2512e9259..8aaf4a0ba 100644 --- a/assets/interfaces/topic.ts +++ b/assets/interfaces/topic.ts @@ -1,5 +1,6 @@ import {IUser} from './user'; import {ICompany} from './company'; +import {ISearchState} from './search'; export type ITopicNotificationScheduleType = 'real-time' | 'scheduled' | null; @@ -23,16 +24,14 @@ export interface ISearchParams { timezone_offset?: number; topic_type: 'wire' | 'agenda'; navigation: Array; - advanced?: { - all: string; - any: string; - exclude: string; - fields: ISearchFields; - }; + // if `advanced` is defined, make sure `fields` is mandatory and all others are not + advanced?: {fields: ISearchState['advanced']['fields']} & Partial>; created?: { from?: string | null; to?: string | null; }; + product: ISearchState['productId']; + sortQuery: ISearchState['activeSortQuery']; } export interface ITopic extends ISearchParams { diff --git a/assets/search/components/SearchResultsBar/SearchResultTagsList.tsx b/assets/search/components/SearchResultsBar/SearchResultTagsList.tsx index 912d90436..fa3726dcd 100644 --- a/assets/search/components/SearchResultsBar/SearchResultTagsList.tsx +++ b/assets/search/components/SearchResultsBar/SearchResultTagsList.tsx @@ -22,7 +22,7 @@ export interface IProps { filterGroups: {[key: string]: IFilterGroup}; availableFields: ISearchFields; - setQuery(): void; + setQuery(query: string): void; resetFilter(): void; refresh?(): void; toggleNavigation(navigation: INavigation): void; diff --git a/assets/search/components/SearchResultsBar/SearchResultsAdvancedSearchRow.tsx b/assets/search/components/SearchResultsBar/SearchResultsAdvancedSearchRow.tsx index 88f331213..2839eb5b1 100644 --- a/assets/search/components/SearchResultsBar/SearchResultsAdvancedSearchRow.tsx +++ b/assets/search/components/SearchResultsBar/SearchResultsAdvancedSearchRow.tsx @@ -48,9 +48,9 @@ export function SearchResultsAdvancedSearchRow({ }; const keywords = { - all: splitTermKeywords(advancedSearchParams.all), - any: splitTermKeywords(advancedSearchParams.any), - exclude: splitTermKeywords(advancedSearchParams.exclude), + all: splitTermKeywords(advancedSearchParams.all ?? ''), + any: splitTermKeywords(advancedSearchParams.any ?? ''), + exclude: splitTermKeywords(advancedSearchParams.exclude ?? ''), }; const labels = { diff --git a/assets/search/components/SearchResultsBar/index.tsx b/assets/search/components/SearchResultsBar/index.tsx index f19d6e84c..a4b900abe 100644 --- a/assets/search/components/SearchResultsBar/index.tsx +++ b/assets/search/components/SearchResultsBar/index.tsx @@ -1,8 +1,9 @@ import * as React from 'react'; -import PropTypes from 'prop-types'; import classNames from 'classnames'; import {connect} from 'react-redux'; +import {IAgendaState, IFilterGroup, INavigation, ISearchFields, ISearchParams, ITopic, IUser, ISearchSortValue} from 'interfaces'; + import {gettext} from 'utils'; import {searchParamsSelector, navigationsByIdSelector, filterGroupsByIdSelector} from '../../selectors'; import {getAdvancedSearchFields} from '../../utils'; @@ -22,35 +23,80 @@ import {Dropdown} from './../../../components/Dropdown'; import {SearchResultTagsList} from './SearchResultTagsList'; +interface IReduxStoreProps { + user: IUser; + searchParams: ISearchParams; + navigations: {[key: string]: INavigation}; + filterGroups: {[key: string]: IFilterGroup}; + availableFields: ISearchFields; +} + +interface IDispatchProps { + toggleNavigation(navigation: INavigation): void; + toggleAdvancedSearchField(field: string): void; + setAdvancedSearchKeywords(field: string, keywords: string): void; + toggleFilter(key: string, value: any, single: any): void; + setCreatedFilter(createdFilter: ITopic['created']): void; + resetSearchParamsAndUpdateURL(): void; + clearAdvancedSearchParams(): void; + deselectMyTopic?: (topicId: ITopic['_id']) => void; + resetFilter(): void; +} + +function getSortValueLabel(sortValue: ISearchSortValue): string { + switch (sortValue) { + case 'versioncreated:desc': + return gettext('Newest first'); + case 'versioncreated:asc': + return gettext('Oldest first'); + case '_score': + return gettext('Relevance'); + } +} + +interface IOwnProps { + initiallyOpen?: boolean; + minimizeSearchResults?: boolean; + showTotalItems?: boolean; + showTotalLabel?: boolean; + showSaveTopic?: boolean; + showSortDropdown?: boolean; + totalItems?: number; + activeTopic: ITopic; + topicType: ITopic['topic_type']; + saveMyTopic?: (params: ISearchParams) => void; + defaultSortValue?: ISearchSortValue; + + refresh(): void; + onClearAll?(): void; + setQuery(query: string): void; + setSortQuery(query: ISearchSortValue): void; +} + +type IProps = IReduxStoreProps & IDispatchProps & IOwnProps; + +interface IState { + isTagSectionShown: boolean; + sortValue: ISearchSortValue; +} + -class SearchResultsBarComponent extends React.Component { - private sortValues: Array<{value: string; sortFunction: () => void;}>; +class SearchResultsBarComponent extends React.Component { private topicNotNull: boolean; - static propTypes: any; - static defaultProps: any; + static defaultProps: Partial = { + minimizeSearchResults: false, + showTotalItems: true, + showTotalLabel: true, + showSaveTopic: false, + }; constructor(props: any) { super(props); this.topicNotNull = new URLSearchParams(window.location.search).get('topic') != null; - this.sortValues = [ - { - value: gettext('Newest first'), - sortFunction: () => this.setSortQuery('versioncreated:desc'), - }, - { - value: gettext('Oldest first'), - sortFunction: () => this.setSortQuery('versioncreated:asc'), - }, - { - value: gettext('Relevance'), - sortFunction: () => this.setSortQuery('_score'), - }, - ]; - this.state = { isTagSectionShown: this.props.initiallyOpen || this.topicNotNull, - sortValue: this.sortValues[0].value, + sortValue: this.props.defaultSortValue ?? 'versioncreated:desc', }; this.toggleTagSection = this.toggleTagSection.bind(this); @@ -87,7 +133,7 @@ class SearchResultsBarComponent extends React.Component { this.props.refresh(); } - setSortQuery(sortQuery: string) { + setSortQuery(sortQuery: ISearchSortValue) { this.props.setSortQuery(sortQuery); this.props.refresh(); } @@ -125,6 +171,11 @@ class SearchResultsBarComponent extends React.Component { render() { const {isTagSectionShown} = this.state; const numberFormatter = (new Intl.NumberFormat(undefined, {style: 'decimal'})); + const sortValues: Array = [ + 'versioncreated:desc', + 'versioncreated:asc', + '_score', + ]; return ( @@ -145,28 +196,28 @@ class SearchResultsBarComponent extends React.Component {
)}
- {this.props.topicType === 'wire' ? - { - this.sortValues.map((option) => ( + {this.props.showSortDropdown !== true ? null : ( + + {sortValues.map((sortValue) => ( - )) - } - : null} + ))} + + )} } - {this.props.activeReport && } -
- - , - this.getPanel()] + [ +
+ +
, + this.getPanel() + ] ); } } -CompanyReportsApp.propTypes = { - activeReport: PropTypes.string, - results: PropTypes.array, - setActiveReport: PropTypes.func, - runReport: PropTypes.func, - companies: PropTypes.array, - printReport: PropTypes.func, - isLoading: PropTypes.bool, - apiEnabled: PropTypes.bool, - products: PropTypes.array, -}; - const mapStateToProps = (state: any) => ({ activeReport: state.activeReport, results: state.results, @@ -103,6 +133,7 @@ const mapStateToProps = (state: any) => ({ isLoading: state.isLoading, resultHeaders: state.resultHeaders, products: state.products, + currentUserType: state.currentUserType }); const mapDispatchToProps: any = { @@ -112,6 +143,6 @@ const mapDispatchToProps: any = { toggleFilterAndQuery, }; -const component: React.ComponentType = connect(mapStateToProps, mapDispatchToProps)(CompanyReportsApp); +const component: React.ComponentType = connect(mapStateToProps, mapDispatchToProps)(CompanyReportsApp); -export default component; \ No newline at end of file +export default component; diff --git a/assets/company-reports/components/ContentActivityFilters.tsx b/assets/company-reports/components/ContentActivityFilters.tsx index 51128572a..3c36fc517 100644 --- a/assets/company-reports/components/ContentActivityFilters.tsx +++ b/assets/company-reports/components/ContentActivityFilters.tsx @@ -9,6 +9,7 @@ import {toggleFilter, fetchAggregations} from '../actions'; import CalendarButton from 'components/CalendarButton'; import moment from 'moment'; + export const ContentActivityFilters = () => { const dispatch = useDispatch>(); const { diff --git a/assets/company-reports/components/ReportsTable.tsx b/assets/company-reports/components/ReportsTable.tsx index ddf5e9553..beda73ab4 100644 --- a/assets/company-reports/components/ReportsTable.tsx +++ b/assets/company-reports/components/ReportsTable.tsx @@ -6,11 +6,14 @@ function ReportsTable({headers, rows, print, onScroll, tableClass}: any) { return (
- +
{headers.map((h: any, i: any) => ())} diff --git a/assets/company-reports/components/SavedMyTopicsAndCompanyTopics.tsx b/assets/company-reports/components/SavedMyTopicsAndCompanyTopics.tsx new file mode 100644 index 000000000..fd8bc3da1 --- /dev/null +++ b/assets/company-reports/components/SavedMyTopicsAndCompanyTopics.tsx @@ -0,0 +1,39 @@ +import React from 'react'; +import ReportsTable from './ReportsTable'; + +import {gettext} from 'utils'; + +interface IResult { + _id: string; + name: string; + is_enabled: boolean; + my_topics_count: number; + company_topics_count: number; +} + +interface IProps { + results: Array; + print: boolean; +} + + +const SavedMyTopicsAndCompanyTopics = ({results, print}: IProps) => { + const list = results && results.map((item) => + + + + + + + ); + + const headers = [ + gettext('User'), + gettext('Is Enabled'), + gettext('My Topics'), + gettext('Company Topics'), + ]; + return results ? () : null; +}; + +export default SavedMyTopicsAndCompanyTopics; diff --git a/assets/company-reports/index.ts b/assets/company-reports/index.ts index 246281657..a6bb22773 100644 --- a/assets/company-reports/index.ts +++ b/assets/company-reports/index.ts @@ -4,7 +4,6 @@ import {initData} from './actions'; import CompanyReportsApp from './components/CompanyReportsApp'; import {render} from 'render-utils'; - const store = createStore(companyReportReducer, 'CompanyReports'); // init data diff --git a/assets/company-reports/reducers.ts b/assets/company-reports/reducers.ts index 98a68d796..b4a4c6ee1 100644 --- a/assets/company-reports/reducers.ts +++ b/assets/company-reports/reducers.ts @@ -12,6 +12,7 @@ import { SET_IS_LOADING, GET_PRODUCTS, } from './actions'; +import {type ICompanyReportsData} from './types'; const initialState: any = { isLoading: false, @@ -38,14 +39,17 @@ export default function companyReportReducer(state: any = initialState, action: switch (action.type) { case INIT_DATA: + { + const data = action.data as ICompanyReportsData; return { ...state, - companies: action.data.companies, - sections: action.data.sections, - apiEnabled: action.data.api_enabled || false, - products: action.data.products, + companies: data.companies, + sections: data.sections, + apiEnabled: data.api_enabled || false, + products: data.products, + currentUserType: data.current_user_type }; - + } case QUERY_REPORT: { return { ...state, diff --git a/assets/company-reports/types.d.ts b/assets/company-reports/types.d.ts new file mode 100644 index 000000000..678bf457c --- /dev/null +++ b/assets/company-reports/types.d.ts @@ -0,0 +1,17 @@ +import type {IProduct, ICompany, ISection} from 'interfaces'; + +export type UserType = 'administrator' | 'internal' | 'public' | 'company_admin' | 'account_management'; + +export interface ICompanyReportsData { + companies: Array; + sections: Array; + api_enabled: boolean; + current_user_type: UserType; + products: Array; +} + +declare global { + interface Window { + companyReportsData: ICompanyReportsData; + } +} diff --git a/assets/company-reports/utils.ts b/assets/company-reports/utils.ts index ead2a379a..2139de663 100644 --- a/assets/company-reports/utils.ts +++ b/assets/company-reports/utils.ts @@ -5,11 +5,13 @@ import ProductStories from './components/ProductStories'; import Company from './components/Company'; import SubscriberActivity from './components/SubscriberActivity'; import ContentActivity from './components/ContentActivity'; -import ComapnyNewsApiUsage from './components/ComapnyNewsApiUsage'; +import CompanyNewsApiUsage from './components/CompanyNewsApiUsage'; import ProductCompanies from './components/ProductCompanies'; import ExpiredCompanies from './components/ExpiredCompanies'; +import SavedMyTopicsAndCompanyTopics from './components/SavedMyTopicsAndCompanyTopics'; import {REPORTS_NAMES} from './actions'; + export const panels: any = { [REPORTS_NAMES.COMPANY_SAVED_SEARCHES]: CompanySavedSearches, [REPORTS_NAMES.USER_SAVED_SEARCHES]: UserSavedSearches, @@ -18,7 +20,8 @@ export const panels: any = { [REPORTS_NAMES.COMPANY]: Company, [REPORTS_NAMES.SUBSCRIBER_ACTIVITY]: SubscriberActivity, [REPORTS_NAMES.CONTENT_ACTIVITY]: ContentActivity, - [REPORTS_NAMES.COMPANY_NEWS_API_USAGE]: ComapnyNewsApiUsage, + [REPORTS_NAMES.COMPANY_NEWS_API_USAGE]: CompanyNewsApiUsage, [REPORTS_NAMES.PRODUCT_COMPANIES]: ProductCompanies, [REPORTS_NAMES.EXPIRED_COMPANIES]: ExpiredCompanies, + [REPORTS_NAMES.COMPANY_AND_USER_SAVED_SEARCHES]: SavedMyTopicsAndCompanyTopics }; diff --git a/assets/globals.d.ts b/assets/globals.d.ts index e3b8d42f1..c018011e4 100644 --- a/assets/globals.d.ts +++ b/assets/globals.d.ts @@ -90,7 +90,6 @@ interface Window { viewData: any; report: any; factCheckData: any; - companyReportsData: any; mapsLoaded: any; googleMapsKey: any; mediaReleasesData: any; diff --git a/assets/users/utils.ts b/assets/users/utils.ts index c941aa930..e41609067 100644 --- a/assets/users/utils.ts +++ b/assets/users/utils.ts @@ -3,6 +3,7 @@ import {gettext} from '../utils'; import {get} from 'lodash'; import {ISeats} from 'interfaces/seat'; + export const userTypes = [ {value: 'administrator', text: gettext('Administrator'), show_acc_mgr: false}, {value: 'internal', text: gettext('Internal'), show_acc_mgr: false}, diff --git a/assets/utils.tsx b/assets/utils.tsx index 8ec5ce924..1dbd56cc8 100644 --- a/assets/utils.tsx +++ b/assets/utils.tsx @@ -117,7 +117,7 @@ export function createStore(reducer: any, name: any = 'default'): S // if it's available in the browser // https://github.com/zalmoxisus/redux-devtools-extension if (window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) { - _compose = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__; + _compose = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({name}); } } diff --git a/e2e/cypress/e2e/company_admin/company_admin_reports.cy.js b/e2e/cypress/e2e/company_admin/company_admin_reports.cy.js new file mode 100644 index 000000000..bfd94e572 --- /dev/null +++ b/e2e/cypress/e2e/company_admin/company_admin_reports.cy.js @@ -0,0 +1,53 @@ +import {setup, addDefaultResources} from '../../support/e2e'; +import {NewshubLayout} from '../../support/pages/layout'; +import {ReportsPage} from '../../support/pages/reports_page'; + + +describe('CompanyAdmin - Reports', function () { + beforeEach(() => { + setup(); + addDefaultResources(); + }); + + it('CompanyAdmin can see and navigate to reports section', () => { + // Login and navigate to reports + NewshubLayout.login('foo@bar.com', 'admin'); + NewshubLayout + .getSidebarLink('reports') + .should('have.length', 1); + + NewshubLayout + .getSidebarLink('reports') + .click(); + }); + + it('CompanyAdmin can run report "Saved My Topics and Company Topics"', () => { + // Login and navigate to reports + NewshubLayout.login('foo@bar.com', 'admin'); + NewshubLayout + .getSidebarLink('reports') + .click(); + + ReportsPage.selectReport('company-and-user-saved-searches'); + ReportsPage.runSelectedReport(); + + ReportsPage + .getReportsTable() + .should('be.visible'); + + // now let's check the content of the report quickly + ReportsPage + .getReportsTable() + .contains('td', 'Foo Bar'); + + // only one personal saved topic + ReportsPage + .getReportsTable() + .contains('td[data-test-id="my-topics"]', 1); + + // two company shared topics + ReportsPage + .getReportsTable() + .contains('td[data-test-id="company-topics"]', 2); + }); +}); diff --git a/e2e/cypress/e2e/company_admin/product_seats.cy.js b/e2e/cypress/e2e/company_admin/product_seats.cy.js index cbc2a37f3..dfb863e77 100644 --- a/e2e/cypress/e2e/company_admin/product_seats.cy.js +++ b/e2e/cypress/e2e/company_admin/product_seats.cy.js @@ -13,7 +13,7 @@ describe('CompanyAdmin - Product Seats', function () { addDefaultResources(); }); - it('CopmanyAdmin can manage their user product permissions', () => { + it('CompanyAdmin can manage their user product permissions', () => { // Login and navigate to CompanyAdmin page NewshubLayout.login('foo@bar.com', 'admin'); NewshubLayout.getSidebarLink('company_admin').click(); diff --git a/e2e/cypress/fixtures/topics.js b/e2e/cypress/fixtures/topics.js new file mode 100644 index 000000000..6a51aee5d --- /dev/null +++ b/e2e/cypress/fixtures/topics.js @@ -0,0 +1,46 @@ +export const TOPICS = { + my_topic: { + _id: '66607674e471296eb3dde17c', + query: 'My test topic', + topic_type: 'wire', + label: 'My test topic', + user: '445460066f6a58e1c6b11541', + company: '345460066f6a58e1c6b11541', + is_global: false, + original_creator: '445460066f6a58e1c6b11541', + version_creator: '445460066f6a58e1c6b11541', + _created: '2024-06-05T14:30:12.000Z', + _updated: '2024-06-05T14:30:12.000Z', + _etag: '74f769b2cd06d53b0451cfeeedaa735acd9b74ee' + }, + company_shared_topics: [ + { + _id: '55507674e471296eb3dde17a', + query: 'Company shared topic', + topic_type: 'wire', + label: 'Company shared topic', + user: '445460066f6a58e1c6b11541', + company: '345460066f6a58e1c6b11541', + is_global: true, + original_creator: '445460066f6a58e1c6b11541', + version_creator: '445460066f6a58e1c6b11541', + _created: '2024-06-05T14:30:12.000Z', + _updated: '2024-06-05T14:30:12.000Z', + _etag: '74f769b2cd06d53b0451cfeeedaa735acd9b74ee' + }, + { + _id: '44407674e471296eb3dde17a', + query: 'Company shared topic 2', + topic_type: 'wire', + label: 'Company shared topic 2', + user: '445460066f6a58e1c6b11541', + company: '345460066f6a58e1c6b11541', + is_global: true, + original_creator: '445460066f6a58e1c6b11541', + version_creator: '445460066f6a58e1c6b11541', + _created: '2024-06-05T14:30:12.000Z', + _updated: '2024-06-05T14:30:12.000Z', + _etag: '74f769b2cd06d53b0451cfeeedaa735acd9b74ee' + } + ], +}; diff --git a/e2e/cypress/support/e2e.js b/e2e/cypress/support/e2e.js index 83edc3cbd..547e15c59 100644 --- a/e2e/cypress/support/e2e.js +++ b/e2e/cypress/support/e2e.js @@ -3,6 +3,7 @@ import {PRODUCTS} from '../fixtures/products'; import {COMPANIES} from '../fixtures/companies'; import {USERS} from '../fixtures/users'; import {WIRE_ITEMS} from '../fixtures/wire'; +import {TOPICS} from '../fixtures/topics'; export const baseUrl = 'http://localhost:5050/'; @@ -79,6 +80,12 @@ export function addDefaultResources() { USERS.foobar.admin, USERS.foobar.monkey, ], + }, { + resource: 'topics', items: [ + TOPICS.my_topic, + TOPICS.company_shared_topics[0], + TOPICS.company_shared_topics[1], + ], }]); } diff --git a/e2e/cypress/support/pages/reports_page.js b/e2e/cypress/support/pages/reports_page.js new file mode 100644 index 000000000..e71e15504 --- /dev/null +++ b/e2e/cypress/support/pages/reports_page.js @@ -0,0 +1,16 @@ + +class ReportsPageWrapper { + selectReport = (name) => { + return cy.get('[data-test-id="company-reports-select"]').select(name); + }; + + runSelectedReport = () => { + return cy.get('[data-test-id="run-report-button"]').click(); + }; + + getReportsTable = () => { + return cy.get('[data-test-id="reports-table"]'); + }; +} + +export const ReportsPage = new ReportsPageWrapper(); diff --git a/newsroom/products/views.py b/newsroom/products/views.py index bad647030..235a5cfcd 100644 --- a/newsroom/products/views.py +++ b/newsroom/products/views.py @@ -7,7 +7,7 @@ from flask_babel import gettext from superdesk import get_resource_service -from newsroom.decorator import admin_only, account_manager_only +from newsroom.decorator import admin_only, account_manager_only, account_manager_or_company_admin_only from newsroom.products import blueprint from newsroom.products.products import get_products_by_company from newsroom.types import Product, ProductRef @@ -49,7 +49,7 @@ def index(): @blueprint.route("/products/search", methods=["GET"]) -@account_manager_only +@account_manager_or_company_admin_only def search(): lookup = None if flask.request.args.get("q"): diff --git a/newsroom/reports/__init__.py b/newsroom/reports/__init__.py index 36a8fb1bd..0503a11b7 100644 --- a/newsroom/reports/__init__.py +++ b/newsroom/reports/__init__.py @@ -11,6 +11,7 @@ get_company_api_usage, get_product_company, get_expired_companies, + get_company_and_user_saved_searches, ) import superdesk from newsroom.wire.search import WireSearchService, WireSearchResource @@ -18,7 +19,7 @@ blueprint = Blueprint("reports", __name__) -reports = { +admin_reports = { "company-saved-searches": get_company_saved_searches, "user-saved-searches": get_user_saved_searches, "company-products": get_company_products, @@ -29,8 +30,11 @@ "company-news-api-usage": get_company_api_usage, "product-companies": get_product_company, "expired-companies": get_expired_companies, + "company-and-user-saved-searches": get_company_and_user_saved_searches, } +company_admin_reports = {"company-and-user-saved-searches": get_company_and_user_saved_searches} + def init_app(app): superdesk.register_resource("news_api_search", WireSearchResource, WireSearchService, _app=app) diff --git a/newsroom/reports/reports.py b/newsroom/reports/reports.py index 4353ed844..e4f6d42a1 100644 --- a/newsroom/reports/reports.py +++ b/newsroom/reports/reports.py @@ -13,6 +13,7 @@ from superdesk.utc import utcnow +from newsroom.auth import get_user from newsroom.utils import ( query_resource, get_entity_dict, @@ -84,6 +85,41 @@ def get_user_saved_searches(): return {"results": sorted_results, "name": gettext("Saved searches per user")} +def get_company_and_user_saved_searches(): + """ + Returns saved My topics and Company topics per user in their company + """ + + results = [] + current_company = get_user().get("company") + lookup_company = dict(company=current_company) + users = get_entity_dict(query_resource("users", lookup=lookup_company)) + topics = query_resource("topics", lookup=lookup_company) + + saved_topics = defaultdict(lambda: dict(my_topics=0, company_topics=0)) + + for topic in topics: + topics_key = "company_topics" if topic.get("is_global") else "my_topics" + saved_topics[topic["user"]][topics_key] += 1 + + for _id, topics_count in saved_topics.items(): + results.append( + { + "_id": _id, + "name": "{} {}".format( + users.get(_id, {}).get("first_name"), + users.get(_id, {}).get("last_name"), + ), + "is_enabled": users.get(_id, {}).get("is_enabled"), + "my_topics_count": topics_count.get("my_topics"), + "company_topics_count": topics_count.get("company_topics"), + } + ) + + sorted_results = sorted(results, key=lambda k: k["name"]) + return {"results": sorted_results, "name": gettext("Saved My Topics and Company Topics")} + + def get_company_products(): """Returns products by company""" results = [] diff --git a/newsroom/reports/utils.py b/newsroom/reports/utils.py new file mode 100644 index 000000000..1c5065c9f --- /dev/null +++ b/newsroom/reports/utils.py @@ -0,0 +1,15 @@ +from typing import Callable, Dict, Union +from newsroom.auth.utils import is_current_user_account_mgr, is_current_user_admin, is_current_user_company_admin +from . import admin_reports, company_admin_reports + + +def get_current_user_reports() -> Union[Dict[str, Callable], Dict]: + """Return reports according to the user type""" + + if is_current_user_admin() or is_current_user_account_mgr(): + return admin_reports + + if is_current_user_company_admin(): + return company_admin_reports + + return {} diff --git a/newsroom/reports/views.py b/newsroom/reports/views.py index 39d63268d..399f4260a 100644 --- a/newsroom/reports/views.py +++ b/newsroom/reports/views.py @@ -1,18 +1,20 @@ from io import StringIO import csv -from flask import jsonify, render_template, abort, current_app as newsroom_app +from flask import session, jsonify, render_template, abort, current_app as newsroom_app from flask_babel import gettext, current_app as app -from newsroom.decorator import account_manager_only +from newsroom.decorator import account_manager_or_company_admin_only from newsroom.reports import blueprint -from newsroom.reports import reports from newsroom.utils import query_resource +from .utils import get_current_user_reports + @blueprint.route("/reports/print/", methods=["GET"]) -@account_manager_only +@account_manager_or_company_admin_only def print_reports(report): + reports = get_current_user_reports() func = reports.get(report) if not func: @@ -23,20 +25,22 @@ def print_reports(report): @blueprint.route("/reports/company_reports", methods=["GET"]) -@account_manager_only +@account_manager_or_company_admin_only def company_reports(): companies = list(query_resource("companies")) data = { "companies": companies, "sections": newsroom_app.sections, "api_enabled": app.config.get("NEWS_API_ENABLED", False), + "current_user_type": session.get("user_type"), } return render_template("company_reports.html", setting_type="company_reports", data=data) @blueprint.route("/reports/", methods=["GET"]) -@account_manager_only +@account_manager_or_company_admin_only def get_report(report): + reports = get_current_user_reports() func = reports.get(report) if not func: @@ -47,8 +51,9 @@ def get_report(report): @blueprint.route("/reports/export/", methods=["GET"]) -@account_manager_only +@account_manager_or_company_admin_only def export_reports(report): + reports = get_current_user_reports() func = reports.get(report) if not func: diff --git a/newsroom/template_filters.py b/newsroom/template_filters.py index b70d9d048..229620e48 100644 --- a/newsroom/template_filters.py +++ b/newsroom/template_filters.py @@ -292,13 +292,20 @@ def sidenavs_by_group(group=0, blueprint=None): return [nav for nav in blueprint_navs if nav.get("group") == group] -def is_admin_or_account_manager(user=None): - allowed_user_types = ["administrator", "account_management"] +def is_user_type_allowed(allowed_user_types, user=None): if user: return user.get("user_type") in allowed_user_types return flask.session.get("user_type") in allowed_user_types +def is_admin_or_account_manager(user=None): + return is_user_type_allowed(["administrator", "account_management"], user) + + +def is_admin_manager_or_company_admin(user=None): + return is_user_type_allowed(["administrator", "account_management", "company_admin"], user) + + def is_company_admin(user=None): return (user.get("user_type") if user else flask.session.get("user_type")) == UserRole.COMPANY_ADMIN.value diff --git a/newsroom/templates/base_layout.html b/newsroom/templates/base_layout.html index f06836b91..eedd2dd03 100644 --- a/newsroom/templates/base_layout.html +++ b/newsroom/templates/base_layout.html @@ -113,7 +113,7 @@

{{ gettext('Side Navigation') }}

{% endif %} - {% if is_admin_or_account_manager() %} + {% if is_admin_manager_or_company_admin() %}
  • Date: Wed, 5 Jun 2024 18:15:11 +0200 Subject: [PATCH 10/21] Bump karma-webpack from 2.0.13 to 3.0.5 (#925) Bumps [karma-webpack](https://github.com/webpack-contrib/karma-webpack) from 2.0.13 to 3.0.5. - [Release notes](https://github.com/webpack-contrib/karma-webpack/releases) - [Changelog](https://github.com/codymikol/karma-webpack/blob/v3.0.5/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/karma-webpack/compare/v2.0.13...v3.0.5) --- updated-dependencies: - dependency-name: karma-webpack dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 142 ++++++++++++++++++++++++++++++++++++++++++++-- package.json | 2 +- 2 files changed, 139 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2676fa21f..07dba21f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10192,9 +10192,9 @@ } }, "karma-webpack": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-2.0.13.tgz", - "integrity": "sha512-2cyII34jfrAabbI2+4Rk4j95Nazl98FvZQhgSiqKUDarT317rxfv/EdzZ60CyATN4PQxJdO5ucR5bOOXkEVrXw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-3.0.5.tgz", + "integrity": "sha512-nRudGJWstvVuA6Tbju9tyGUfXTtI1UXMXoRHVmM2/78D0q6s/Ye2IC157PKNDC15PWFGR0mVIRtWLAdcfsRJoA==", "dev": true, "requires": { "async": "^2.0.0", @@ -10202,7 +10202,30 @@ "loader-utils": "^1.0.0", "lodash": "^4.0.0", "source-map": "^0.5.6", - "webpack-dev-middleware": "^1.12.0" + "webpack-dev-middleware": "^2.0.6" + }, + "dependencies": { + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "webpack-dev-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-2.0.6.tgz", + "integrity": "sha512-tj5LLD9r4tDuRIDa5Mu9lnY2qBBehAITv6A9irqXhw/HQquZgTx3BCd57zYbU2gMDnncA49ufK2qVQSbaKJwOw==", + "dev": true, + "requires": { + "loud-rejection": "^1.6.0", + "memory-fs": "~0.4.1", + "mime": "^2.1.0", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "url-join": "^2.0.2", + "webpack-log": "^1.0.1" + } + } } }, "killable": { @@ -10368,6 +10391,52 @@ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "log4js": { "version": "6.9.1", "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", @@ -10386,6 +10455,16 @@ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==" }, + "loglevelnext": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz", + "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", + "dev": true, + "requires": { + "es6-symbol": "^3.1.1", + "object.assign": "^4.1.0" + } + }, "lolex": { "version": "2.7.5", "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", @@ -17118,6 +17197,12 @@ } } }, + "url-join": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz", + "integrity": "sha512-c2H1fIgpUdwFRIru9HFno5DT73Ok8hg5oOb5AT3ayIgvCRfxgs2jyt5Slw8kEB7j3QUr6yJmMPDT/odjk7jXow==", + "dev": true + }, "url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", @@ -18385,6 +18470,55 @@ } } }, + "webpack-log": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", + "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "log-symbols": "^2.1.0", + "loglevelnext": "^1.0.1", + "uuid": "^3.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "webpack-manifest-plugin": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.3.2.tgz", diff --git a/package.json b/package.json index 7acd0931a..3745f9cc7 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "karma-chrome-launcher": "^2.2.0", "karma-jasmine": "^2.0.0", "karma-sourcemap-loader": "^0.3.8", - "karma-webpack": "^2.0.4", + "karma-webpack": "^3.0.5", "sinon": "^4.0.0" } } From 2a7c6ba0ee273695369d74e507018aee5127e641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Ja=C5=A1ek?= Date: Thu, 6 Jun 2024 07:23:43 +0200 Subject: [PATCH 11/21] avoid `body` tag in wire preview (#933) NHUB-510 --- assets/ui/components/ArticleBodyHtml.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/ui/components/ArticleBodyHtml.tsx b/assets/ui/components/ArticleBodyHtml.tsx index f321ce526..2e5cb7e65 100644 --- a/assets/ui/components/ArticleBodyHtml.tsx +++ b/assets/ui/components/ArticleBodyHtml.tsx @@ -99,7 +99,9 @@ class ArticleBodyHtmlComponent extends React.PureComponent { return false; } - this.bodyRef.current.appendChild(getBodyElement(bodyHtml, item)); + const body = getBodyElement(bodyHtml, item); + + this.bodyRef.current.innerHTML = body.innerHTML; return true; } From 1d6ab9be104a76e6926da501a3dee43f71d0b9db Mon Sep 17 00:00:00 2001 From: MarkLark86 Date: Thu, 6 Jun 2024 20:35:22 +1000 Subject: [PATCH 12/21] [STTNHUB-207] fix(agenda): Use versioncreated for displaying updated datetime (#934) --- .../components/AgendaItemTimeUpdater.tsx | 61 ++++++++++--------- assets/agenda/tests/utils.spec.ts | 13 ++++ assets/interfaces/agenda.ts | 1 + newsroom/push.py | 14 ++++- newsroom/utils.py | 11 ++-- 5 files changed, 62 insertions(+), 38 deletions(-) diff --git a/assets/agenda/components/AgendaItemTimeUpdater.tsx b/assets/agenda/components/AgendaItemTimeUpdater.tsx index 1fd28007a..12f797e5e 100644 --- a/assets/agenda/components/AgendaItemTimeUpdater.tsx +++ b/assets/agenda/components/AgendaItemTimeUpdater.tsx @@ -1,18 +1,24 @@ import React from 'react'; -import PropTypes from 'prop-types'; import moment from 'moment'; -import {get} from 'lodash'; import classNames from 'classnames'; +import {IAgendaItem} from 'interfaces'; import {bem} from 'ui/utils'; import {gettext} from 'utils'; -class AgendaItemTimeUpdater extends React.Component { - static propTypes: any; - static defaultProps: any; +interface IProps { + item: IAgendaItem; + borderRight?: boolean; + alignCenter?: boolean; +} + +interface IState { + timeText: string; +} +class AgendaItemTimeUpdater extends React.Component { interval: number; - timerIntervalId: any; + timerIntervalId: number; constructor(props: any) { super(props); @@ -24,14 +30,16 @@ class AgendaItemTimeUpdater extends React.Component { this.updateState = this.updateState.bind(this); } - componentWillMount() { + componentDidMount() { this.activateTimer(this.props.item); } - componentWillReceiveProps(nextProps: any) { - if (get(this.props, 'item._created') !== get(nextProps, 'item._created') || - get(this.props, 'item._updated') !== get(nextProps, 'item._updated')) { - this.activateTimer(nextProps.item); + componentDidUpdate(prevProps: Readonly) { + if ( + this.props.item._created !== prevProps.item._created || + this.props.item._updated !== prevProps.item._updated + ) { + this.activateTimer(this.props.item); } } @@ -39,7 +47,7 @@ class AgendaItemTimeUpdater extends React.Component { this.deactivateTimer(); } - activateTimer(item: any) { + activateTimer(item: IAgendaItem) { // Deactivate if a timer already exits this.deactivateTimer(); @@ -51,7 +59,7 @@ class AgendaItemTimeUpdater extends React.Component { this.updateState(item, false); // timer set for minute interval - this.timerIntervalId = setInterval(this.updateState, 60000, item); + this.timerIntervalId = window.setInterval(this.updateState, 60000, item); } deactivateTimer() { @@ -67,14 +75,14 @@ class AgendaItemTimeUpdater extends React.Component { moment().diff(moment(item._updated), 'minutes') >= this.interval); } - updateState(item: any, checkPastTime: any = true) { + updateState(item: IAgendaItem, checkPastTime = true) { if (checkPastTime && this.isItemPastTime(item)) { this.deactivateTimer(); return; } - const created = moment(item._created); - const updated = moment(item._updated); + const created = moment(item.firstcreated); + const updated = moment(item.versioncreated); const createdDiff = moment().diff(created, 'minutes'); const updatedDiff = moment().diff(updated, 'minutes'); @@ -97,13 +105,17 @@ class AgendaItemTimeUpdater extends React.Component { } render() { - if (get(this.state.timeText, 'length', 0) <= 0) { + if (this.state.timeText.length === 0) { return null; } const className = classNames( - bem('wire-articles__item', 'meta-time', {'border-right': this.props.borderRight}), - {'align-self-center': this.props.alignCenter} + bem( + 'wire-articles__item', + 'meta-time', + {'border-right': this.props.borderRight === true} + ), + {'align-self-center': this.props.alignCenter === true} ); return( @@ -114,15 +126,4 @@ class AgendaItemTimeUpdater extends React.Component { } } -AgendaItemTimeUpdater.propTypes = { - item: PropTypes.object, - borderRight: PropTypes.bool, - alignCenter: PropTypes.bool, -}; - -AgendaItemTimeUpdater.defaultProps = { - alignCenter: false, - borderRight: false, -}; - export default AgendaItemTimeUpdater; diff --git a/assets/agenda/tests/utils.spec.ts b/assets/agenda/tests/utils.spec.ts index 0f4d3ee83..f3fa95a4d 100644 --- a/assets/agenda/tests/utils.spec.ts +++ b/assets/agenda/tests/utils.spec.ts @@ -17,6 +17,7 @@ const createEvent = (id: string, dates: IAgendaItem['dates']): IAgendaItem => ({ state: 'scheduled', _created: '2023-11-16T04:00:00+0000', _updated: '2023-11-16T04:00:00+0000', + firstcreated: '2023-11-16T04:00:00+0000', versioncreated: '2023-11-16T04:00:00+0000', _etag: 'etag', event: {_id: id}, @@ -35,6 +36,7 @@ describe('utils', () => { state: 'scheduled', _created: '2023-11-16T04:00:00+0000', _updated: '2023-11-16T04:00:00+0000', + firstcreated: '2023-11-16T04:00:00+0000', versioncreated: '2023-11-16T04:00:00+0000', _etag: 'etag123', dates: {start: '2018-10-15T04:00:00+0000', end: '2018-10-15T05:00:00+0000', tz: 'Australia/Sydney'}, @@ -48,6 +50,7 @@ describe('utils', () => { state: 'scheduled', _created: '2023-11-16T04:00:00+0000', _updated: '2023-11-16T04:00:00+0000', + firstcreated: '2023-11-16T04:00:00+0000', versioncreated: '2023-11-16T04:00:00+0000', _etag: 'etag123', dates: {start: '2018-10-18T06:00:00+0000', end: '2018-10-18T09:00:00+0000', tz: 'Australia/Sydney'}, @@ -75,6 +78,7 @@ describe('utils', () => { state: 'scheduled', _created: '2023-11-16T04:00:00+0000', _updated: '2023-11-16T04:00:00+0000', + firstcreated: '2023-11-16T04:00:00+0000', versioncreated: '2023-11-16T04:00:00+0000', _etag: 'etag123', dates: {start: '2018-10-15T04:00:00+0000', end: '2018-10-17T05:00:00+0000', tz: 'Australia/Sydney'}, @@ -88,6 +92,7 @@ describe('utils', () => { state: 'scheduled', _created: '2023-11-16T04:00:00+0000', _updated: '2023-11-16T04:00:00+0000', + firstcreated: '2023-11-16T04:00:00+0000', versioncreated: '2023-11-16T04:00:00+0000', _etag: 'etag123', dates: {start: '2018-10-17T06:00:00+0000', end: '2018-10-18T09:00:00+0000', tz: 'Australia/Sydney'}, @@ -115,6 +120,7 @@ describe('utils', () => { state: 'scheduled', _created: '2023-11-16T04:00:00+0000', _updated: '2023-11-16T04:00:00+0000', + firstcreated: '2023-11-16T04:00:00+0000', versioncreated: '2023-11-16T04:00:00+0000', _etag: 'etag123', dates: {start: '2018-10-15T04:00:00+0000', end: '2018-10-17T05:00:00+0000', tz: 'Australia/Sydney'}, @@ -144,6 +150,7 @@ describe('utils', () => { state: 'scheduled', _created: '2023-11-16T04:00:00+0000', _updated: '2023-11-16T04:00:00+0000', + firstcreated: '2023-11-16T04:00:00+0000', versioncreated: '2023-11-16T04:00:00+0000', _etag: 'etag123', dates: {start: '2018-10-17T04:00:00+0000', end: '2018-10-17T04:00:00+0000'}, @@ -175,6 +182,7 @@ describe('utils', () => { state: 'scheduled', _created: '2023-11-16T04:00:00+0000', _updated: '2023-11-16T04:00:00+0000', + firstcreated: '2023-11-16T04:00:00+0000', versioncreated: '2023-11-16T04:00:00+0000', _etag: 'etag123', dates: {start: '2018-10-17T04:00:00+0000', end: '2018-10-17T04:00:00+0000'}, @@ -202,6 +210,7 @@ describe('utils', () => { state: 'scheduled', _created: '2023-11-16T04:00:00+0000', _updated: '2023-11-16T04:00:00+0000', + firstcreated: '2023-11-16T04:00:00+0000', versioncreated: '2023-11-16T04:00:00+0000', _etag: 'etag123', dates: {start: '2018-10-15T04:00:00+0000', end: '2018-10-15T05:00:00+0000', tz: 'Australia/Sydney'}, @@ -245,6 +254,7 @@ describe('utils', () => { state: 'scheduled', _created: '2023-11-16T04:00:00+0000', _updated: '2023-11-16T04:00:00+0000', + firstcreated: '2023-11-16T04:00:00+0000', versioncreated: '2023-11-16T04:00:00+0000', _etag: 'etag123', 'planning_date': '2018-10-15T04:30:00+0000', @@ -278,6 +288,7 @@ describe('utils', () => { state: 'scheduled', _created: '2023-11-16T04:00:00+0000', _updated: '2023-11-16T04:00:00+0000', + firstcreated: '2023-11-16T04:00:00+0000', versioncreated: '2023-11-16T04:00:00+0000', _etag: 'etag123', 'planning_date': '2018-10-15T04:30:00+0000', @@ -329,6 +340,7 @@ describe('utils', () => { state: 'scheduled', _created: '2023-11-16T04:00:00+0000', _updated: '2023-11-16T04:00:00+0000', + firstcreated: '2023-11-16T04:00:00+0000', versioncreated: '2023-11-16T04:00:00+0000', _etag: 'etag123', dates: {start: '2018-10-15T04:00:00+0000', end: '2018-10-15T05:00:00+0000', tz: 'Australia/Sydney'}, @@ -346,6 +358,7 @@ describe('utils', () => { state: 'scheduled', _created: '2023-11-16T04:00:00+0000', _updated: '2023-11-16T04:00:00+0000', + firstcreated: '2023-11-16T04:00:00+0000', versioncreated: '2023-11-16T04:00:00+0000', _etag: 'etag123', } diff --git a/assets/interfaces/agenda.ts b/assets/interfaces/agenda.ts index 630d98972..c9e4a0ad3 100644 --- a/assets/interfaces/agenda.ts +++ b/assets/interfaces/agenda.ts @@ -221,6 +221,7 @@ export interface IAgendaItem extends IResourceItem { subject?: Array; ednote?: string; state_reason?: string; + firstcreated: string; versioncreated: string; internal_note?: string; } diff --git a/newsroom/push.py b/newsroom/push.py index b2824b768..3976f1783 100644 --- a/newsroom/push.py +++ b/newsroom/push.py @@ -505,6 +505,9 @@ def set_agenda_metadata_from_planning(agenda, planning_item, force_adhoc=False): if not plan: new_plan = True + agenda_versioncreated: datetime = agenda["versioncreated"] + plan_versioncreated: datetime = parse_date_str(planning_item.get("versioncreated")) or agenda_versioncreated + plan["_id"] = planning_item.get("_id") or planning_item.get("guid") plan["guid"] = planning_item.get("guid") plan["slugline"] = planning_item.get("slugline") @@ -520,8 +523,8 @@ def set_agenda_metadata_from_planning(agenda, planning_item, force_adhoc=False): plan["coverages"] = planning_item.get("coverages") or [] plan["ednote"] = planning_item.get("ednote") plan["internal_note"] = planning_item.get("internal_note") - plan["versioncreated"] = parse_date_str(planning_item.get("versioncreated")) - plan["firstcreated"] = parse_date_str(planning_item.get("firstcreated")) + plan["versioncreated"] = plan_versioncreated + plan["firstcreated"] = parse_date_str(planning_item.get("firstcreated")) or agenda["firstcreated"] plan["state"] = planning_item.get("state") plan["state_reason"] = planning_item.get("state_reason") plan["products"] = planning_item.get("products") @@ -533,6 +536,13 @@ def set_agenda_metadata_from_planning(agenda, planning_item, force_adhoc=False): if new_plan: agenda["planning_items"].append(plan) + # Update the versioncreated datetime from Planning item if it's newer than the parent item + try: + if plan_versioncreated > agenda_versioncreated: + agenda["versioncreated"] = plan_versioncreated + except (KeyError, TypeError): + pass + return new_plan diff --git a/newsroom/utils.py b/newsroom/utils.py index 20c93194a..808651ed0 100644 --- a/newsroom/utils.py +++ b/newsroom/utils.py @@ -150,16 +150,15 @@ def get_type(type: Optional[str] = None) -> str: return types[item_type] -def parse_date_str(date): - if date and isinstance(date, str): - return parse_date(date) - return date +def parse_date_str(date: Union[str, datetime]) -> datetime: + return parse_date(date) if isinstance(date, str) else date def parse_dates(item): for field in ["firstcreated", "versioncreated", "embargoed"]: - if parse_date_str(item.get(field)): - item[field] = parse_date_str(item[field]) + datetime_value = parse_date_str(item.get(field)) + if datetime_value is not None: + item[field] = datetime_value def get_entity_dict(items, str_id=False): From b041131d6a5059e919777fd0a880e5db041645ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Ja=C5=A1ek?= Date: Mon, 10 Jun 2024 10:01:06 +0200 Subject: [PATCH 13/21] make notifications for downloaded items configurable (#935) CPCN-782 --- newsroom/push.py | 16 ++++++++++++---- newsroom/template_filters.py | 5 ++++- newsroom/web/default_settings.py | 8 +++++++- tests/core/test_push.py | 28 ++++++++++++++++++++++++++-- 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/newsroom/push.py b/newsroom/push.py index 3976f1783..bc77d2ce0 100644 --- a/newsroom/push.py +++ b/newsroom/push.py @@ -810,15 +810,19 @@ def notify_new_item(item, check_topics=True): else: users_with_realtime_subscription = notify_agenda_topic_matches(item, user_dict, company_dict) + if app.config.get("NOTIFY_MATCHING_USERS") == "never": + return + + if app.config.get("NOTIFY_MATCHING_USERS") == "cancel" and not is_canceled(item): + return + notify_user_matches( item, user_dict, company_dict, user_ids, company_ids, - users_with_realtime_subscription - if not item.get("pubstatus", item.get("state")) in ["canceled", "cancelled"] - else set(), + users_with_realtime_subscription if not is_canceled(item) else set(), ) except Exception as e: logger.exception(e) @@ -901,7 +905,7 @@ def _send_notification(section, users_ids): def send_user_notification_emails(item, user_matches, users, section): for user_id in user_matches: user = users.get(str(user_id)) - if item.get("pubstatus", item.get("state")) in ["canceled", "cancelled"]: + if is_canceled(item): send_item_killed_notification_email(user, item=item) else: if user.get("receive_email"): @@ -1057,3 +1061,7 @@ def fix_updates(doc, next_item, service): break else: logger.warning("Didn't fix ancestors in 50 iterations", extra={"guid": doc["guid"]}) + + +def is_canceled(item) -> bool: + return item.get("pubstatus", item.get("state")) in ["canceled", "cancelled"] diff --git a/newsroom/template_filters.py b/newsroom/template_filters.py index 229620e48..2da9f9159 100644 --- a/newsroom/template_filters.py +++ b/newsroom/template_filters.py @@ -208,7 +208,10 @@ def notification_datetime(datetime): return format_datetime(parse_date(datetime), get_client_format("NOTIFICATION_EMAIL_DATETIME_FORMAT")) -def plain_text(html): +def plain_text(html) -> str: + if not html: + return "" + # Remove newlines, and strip whitespace, before converting tag blocks to newlines text = "".join([line.strip() for line in html.split("\n")]) diff --git a/newsroom/web/default_settings.py b/newsroom/web/default_settings.py index d32ccd4d5..9d1fc17dd 100644 --- a/newsroom/web/default_settings.py +++ b/newsroom/web/default_settings.py @@ -3,7 +3,7 @@ import tzlocal import logging -from typing import Dict, List +from typing import Dict, List, Literal from kombu import Queue, Exchange from celery.schedules import crontab from superdesk.default_settings import strtobool, env, local_to_utc_hour @@ -825,3 +825,9 @@ "query": {"gte": "now-30d/d"}, }, ] + +#: Set when users who downloaded/bookmarked an item should be notified +#: +#: .. versionadded: 2.8 +#: +NOTIFY_MATCHING_USERS: Literal["never", "cancel", "update"] = "update" diff --git a/tests/core/test_push.py b/tests/core/test_push.py index 1ba7babd9..627e7d358 100644 --- a/tests/core/test_push.py +++ b/tests/core/test_push.py @@ -396,8 +396,32 @@ def test_notify_user_matches_for_new_item_in_history(client, app, mocker): assert notification["resource"] == "text" assert notification["user"] == user_ids[0] - assert len(outbox) == 1 - assert "http://localhost:5050/wire?item=bar" in outbox[0].body + assert len(outbox) == 1 + assert "http://localhost:5050/wire?item=bar" in outbox[0].body + + outbox.clear() + app.config["PUSH_KEY"] = None + item = {"guid": "bar", "type": "text", "headline": "this is a test"} + + app.config["NOTIFY_MATCHING_USERS"] = "never" + resp = client.post("/push", json=item) + assert 200 == resp.status_code + assert len(outbox) == 0 + + item["pubstatus"] = "canceled" + resp = client.post("/push", json=item) + assert 200 == resp.status_code + assert len(outbox) == 0 + + app.config["NOTIFY_MATCHING_USERS"] = "cancel" + resp = client.post("/push", json=item) + assert 200 == resp.status_code + assert len(outbox) == 1 + + item["pubstatus"] = "usable" + resp = client.post("/push", json=item) + assert 200 == resp.status_code + assert len(outbox) == 1 @mock.patch("newsroom.email.send_email", mock_send_email) From 1498541f87a76177b10aab9aaedf2365e7ab175f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 11:37:22 +0200 Subject: [PATCH 14/21] Bump responses from 0.25.0 to 0.25.2 (#941) Bumps [responses](https://github.com/getsentry/responses) from 0.25.0 to 0.25.2. - [Release notes](https://github.com/getsentry/responses/releases) - [Changelog](https://github.com/getsentry/responses/blob/master/CHANGES) - [Commits](https://github.com/getsentry/responses/compare/0.25.0...0.25.2) --- updated-dependencies: - dependency-name: responses dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dev-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-requirements.txt b/dev-requirements.txt index ca62d1fd8..9250ceaec 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -393,7 +393,7 @@ requests==2.32.2 # wooper requests-oauthlib==2.0.0 # via python-twitter -responses==0.25.0 +responses==0.25.2 # via -r dev-requirements.in rsa==4.9 # via From 2ba306302ae9613619c9cd07f1866d9a040897eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 11:37:57 +0200 Subject: [PATCH 15/21] Bump sentry-sdk[flask] from 2.2.1 to 2.5.1 (#942) Bumps [sentry-sdk[flask]](https://github.com/getsentry/sentry-python) from 2.2.1 to 2.5.1. - [Release notes](https://github.com/getsentry/sentry-python/releases) - [Changelog](https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-python/compare/2.2.1...2.5.1) --- updated-dependencies: - dependency-name: sentry-sdk[flask] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 4cb441a5f..2cebcce4b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,7 +11,7 @@ honcho>=1.0.1 gunicorn>=20.0.4,<22.1 PyRTF3>=0.47.5 xhtml2pdf>=0.2.4 -sentry-sdk[flask]>=1.5.7,<2.4 +sentry-sdk[flask]>=1.5.7,<2.6 eve-elastic>=7.3.1,<7.5 MarkupSafe<2.2 python3-saml>=1.15,<1.17 From d1a85687d22f0eeaec2e77cb0a276f54b421950d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 11:38:29 +0200 Subject: [PATCH 16/21] Bump pytest from 8.2.1 to 8.2.2 (#943) Bumps [pytest](https://github.com/pytest-dev/pytest) from 8.2.1 to 8.2.2. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/8.2.1...8.2.2) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dev-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-requirements.txt b/dev-requirements.txt index 9250ceaec..debf94944 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -324,7 +324,7 @@ pypng==0.20220715.0 # via qrcode pyrtf3==0.47.5 # via -r requirements.txt -pytest==8.2.1 +pytest==8.2.2 # via # -r dev-requirements.in # pytest-cov From 437c493c6b1ed0e356cde682067ca6b7a244b6eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 11:38:56 +0200 Subject: [PATCH 17/21] Bump typing-extensions from 4.12.1 to 4.12.2 (#944) Bumps [typing-extensions](https://github.com/python/typing_extensions) from 4.12.1 to 4.12.2. - [Release notes](https://github.com/python/typing_extensions/releases) - [Changelog](https://github.com/python/typing_extensions/blob/main/CHANGELOG.md) - [Commits](https://github.com/python/typing_extensions/compare/4.12.1...4.12.2) --- updated-dependencies: - dependency-name: typing-extensions dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dev-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-requirements.txt b/dev-requirements.txt index debf94944..de92ab6a9 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -435,7 +435,7 @@ tomli==2.0.1 # pytest types-python-dateutil==2.9.0.20240316 # via arrow -typing-extensions==4.12.1 +typing-extensions==4.12.2 # via # black # jwcrypto From 5444b9e5a3ae0394d8812815105828e326c9bf5b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 11:42:16 +0200 Subject: [PATCH 18/21] Bump moment from 2.29.4 to 2.30.1 (#938) Bumps [moment](https://github.com/moment/moment) from 2.29.4 to 2.30.1. - [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md) - [Commits](https://github.com/moment/moment/compare/2.29.4...2.30.1) --- updated-dependencies: - dependency-name: moment dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 07dba21f6..95cb7bc76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10848,9 +10848,9 @@ } }, "moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" }, "moment-timezone": { "version": "0.5.41", diff --git a/package.json b/package.json index 3745f9cc7..776fbaef4 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "firebase": "^10.12.2", "html-webpack-plugin": "^5.6.0", "lodash": "^4.17.19", - "moment": "2.29.4", + "moment": "2.30.1", "moment-timezone": "0.5.41", "node-sass": "^9.0.0", "popper.js": "1.14.4", From 3608713c9e29be965706ab80c3481a3b4b2f3db2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 11:44:35 +0200 Subject: [PATCH 19/21] Bump webpack from 3.11.0 to 3.12.0 (#937) Bumps [webpack](https://github.com/webpack/webpack) from 3.11.0 to 3.12.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v3.11.0...v3.12.0) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 418 ++++++++++++++++++++-------------------------- package.json | 2 +- 2 files changed, 179 insertions(+), 241 deletions(-) diff --git a/package-lock.json b/package-lock.json index 95cb7bc76..de751f403 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2140,7 +2140,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -2149,8 +2148,7 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" } } }, @@ -3202,14 +3200,13 @@ "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==" }, "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" + "minimalistic-assert": "^1.0.0" }, "dependencies": { "bn.js": { @@ -3220,25 +3217,25 @@ } }, "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", + "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" + "object.assign": "^4.1.4", + "util": "^0.10.4" }, "dependencies": { "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", "requires": { - "inherits": "2.0.1" + "inherits": "2.0.3" } } } @@ -4193,29 +4190,29 @@ } }, "browserify-sign": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", - "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", "requires": { "bn.js": "^5.2.1", "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.4", + "elliptic": "^6.5.5", + "hash-base": "~3.0", "inherits": "^2.0.4", - "parse-asn1": "^5.1.6", - "readable-stream": "^3.6.2", + "parse-asn1": "^5.1.7", + "readable-stream": "^2.3.8", "safe-buffer": "^5.2.1" }, "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "safe-buffer": { @@ -4562,7 +4559,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -4577,21 +4573,18 @@ "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "optional": true }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "requires": { "binary-extensions": "^2.0.0" } @@ -4599,14 +4592,12 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "requires": { "picomatch": "^2.2.1" } @@ -5565,7 +5556,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, "requires": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -5899,9 +5889,9 @@ "integrity": "sha512-1ndQ5IBNEnFirPwvyud69GHL+31FkE09gH/CJ6m3KCbkx3i0EVOrjwz4UNxRmN9H8OVHbC6vMRZGN1yCvjSs9w==" }, "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", + "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", "requires": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -6127,7 +6117,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, "requires": { "get-intrinsic": "^1.2.4" }, @@ -6135,14 +6124,12 @@ "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, "requires": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -6156,8 +6143,7 @@ "es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" }, "es-iterator-helpers": { "version": "1.0.18", @@ -6656,9 +6642,9 @@ }, "dependencies": { "type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==" } } }, @@ -8646,7 +8632,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "requires": { "function-bind": "^1.1.2" }, @@ -8654,8 +8639,7 @@ "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" } } }, @@ -12313,15 +12297,32 @@ } }, "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } } }, "parse-glob": { @@ -14566,6 +14567,11 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -14979,7 +14985,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, "requires": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -14992,14 +14997,12 @@ "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, "requires": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -15012,7 +15015,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, "requires": { "es-define-property": "^1.0.0" } @@ -16976,20 +16978,14 @@ "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==", "dev": true }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha512-TNM20HMW67kxHRNCZdvLyiwE1ST6WyY5Ae+TG55V81NpvNwJ9+V4/po4LHA1R9afV/WrqzfedG2UJCk2+swirw==", + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", "requires": { - "source-map": "^0.5.6", - "uglify-js": "^2.8.29", - "webpack-sources": "^1.0.1" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "camelcase": { @@ -17007,21 +17003,6 @@ "wordwrap": "0.0.2" } }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==" - }, "yargs": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", @@ -17035,6 +17016,22 @@ } } }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha512-TNM20HMW67kxHRNCZdvLyiwE1ST6WyY5Ae+TG55V81NpvNwJ9+V4/po4LHA1R9afV/WrqzfedG2UJCk2+swirw==", + "requires": { + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" + } + }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -17182,18 +17179,71 @@ "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==" }, "url": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz", - "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", "requires": { "punycode": "^1.4.1", - "qs": "^6.11.0" + "qs": "^6.11.2" }, "dependencies": { + "call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + } + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "qs": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", + "requires": { + "side-channel": "^1.0.6" + } + }, + "side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + } } } }, @@ -17309,70 +17359,6 @@ "graceful-fs": "^4.1.2", "neo-async": "^2.5.0", "watchpack-chokidar2": "^2.0.1" - }, - "dependencies": { - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "optional": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "optional": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "optional": true - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - } } }, "watchpack-chokidar2": { @@ -17508,62 +17494,15 @@ "is-extendable": "^0.1.0" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "optional": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "optional": true } } }, @@ -17648,32 +17587,31 @@ } }, "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", "optional": true, "requires": { - "kind-of": "^6.0.0" + "hasown": "^2.0.0" } }, "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", "optional": true, "requires": { - "kind-of": "^6.0.0" + "hasown": "^2.0.0" } }, "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "optional": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" } }, "is-number": { @@ -17768,9 +17706,9 @@ "dev": true }, "webpack": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", - "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", + "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", "requires": { "acorn": "^5.0.0", "acorn-dynamic-import": "^2.0.0", @@ -17886,11 +17824,6 @@ "read-pkg": "^2.0.0" } }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" - }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -18684,6 +18617,11 @@ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==" }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==" + }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", diff --git a/package.json b/package.json index 776fbaef4..fdc933c5c 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "ts-loader": "^3.5.0", "typescript": "5.2.2", "url-search-params-polyfill": "8.2.5", - "webpack": "3.11.0", + "webpack": "3.12.0", "webpack-dev-server": "2.11.1", "webpack-manifest-plugin": "^1.3.1", "whatwg-fetch": "2.0.4" From 90a3813ed55a1087c488509c5a452e0e6fadea22 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 13:32:10 +0200 Subject: [PATCH 20/21] Bump react-router-dom from 6.14.2 to 6.23.1 (#936) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.14.2 to 6.23.1. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.23.1/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 24 ++++++++++++------------ package.json | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index de751f403..735c0b157 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1440,9 +1440,9 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "@remix-run/router": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.7.2.tgz", - "integrity": "sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A==" + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz", + "integrity": "sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==" }, "@sindresorhus/merge-streams": { "version": "2.2.0", @@ -13458,20 +13458,20 @@ } }, "react-router": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.14.2.tgz", - "integrity": "sha512-09Zss2dE2z+T1D03IheqAFtK4UzQyX8nFPWx6jkwdYzGLXd5ie06A6ezS2fO6zJfEb/SpG6UocN2O1hfD+2urQ==", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.1.tgz", + "integrity": "sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==", "requires": { - "@remix-run/router": "1.7.2" + "@remix-run/router": "1.16.1" } }, "react-router-dom": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.2.tgz", - "integrity": "sha512-5pWX0jdKR48XFZBuJqHosX3AAHjRAzygouMTyimnBPOLdY3WjzUSKhus2FVMihUFWzeLebDgr4r8UeQFAct7Bg==", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz", + "integrity": "sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==", "requires": { - "@remix-run/router": "1.7.2", - "react-router": "6.14.2" + "@remix-run/router": "1.16.1", + "react-router": "6.23.1" } }, "react-shallow-renderer": { diff --git a/package.json b/package.json index fdc933c5c..fa0145d68 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "react-datepicker": "4.7.0", "react-dom": "^17.0.2", "react-redux": "8.1.3", - "react-router-dom": "^6.3.0", + "react-router-dom": "^6.23.1", "react-sortable-hoc": "0.8.3", "react-toggle": "4.1.3", "reactstrap": "9.0.1", From 08ab4ffc431528700ea360e28386dd0c69db019b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 10:19:41 +0200 Subject: [PATCH 21/21] Bump @grpc/grpc-js from 1.9.14 to 1.9.15 (#945) Bumps [@grpc/grpc-js](https://github.com/grpc/grpc-node) from 1.9.14 to 1.9.15. - [Release notes](https://github.com/grpc/grpc-node/releases) - [Commits](https://github.com/grpc/grpc-node/compare/@grpc/grpc-js@1.9.14...@grpc/grpc-js@1.9.15) --- updated-dependencies: - dependency-name: "@grpc/grpc-js" dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 735c0b157..fbd1082c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1232,9 +1232,9 @@ "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" }, "@grpc/grpc-js": { - "version": "1.9.14", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.14.tgz", - "integrity": "sha512-nOpuzZ2G3IuMFN+UPPpKrC6NsLmWsTqSsm66IRfnBt1D4pwTqE27lmbpcPM+l2Ua4gE7PfjRHI6uedAy7hoXUw==", + "version": "1.9.15", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.15.tgz", + "integrity": "sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==", "requires": { "@grpc/proto-loader": "^0.7.8", "@types/node": ">=12.12.47"
  • {h}
    {item.name}{item.is_enabled.toString()}{item.my_topics_count}{item.company_topics_count}