feat(builder): add one-shot section date sorting (#3465)

* feat(builder): add one-shot section date sorting

* docs: record plan 32 implementation evidence

* chore: remove plan 32 evidence report
This commit is contained in:
Amruth Pillai
2026-09-05 19:06:21 -07:00
committed by GitHub
parent 695cdb8514
commit b85d285b69
63 changed files with 1111 additions and 25 deletions
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Kon nie hierdie pleister herstel nie."
msgid "Could not set up two-factor authentication."
msgstr "Kon nie twee-faktor-magtiging opstel nie."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Kon nie verskafferverbinding verifieer nie."
@@ -5031,6 +5036,10 @@ msgstr "Iets het verkeerd geloop tydens jou aanmelding. Probeer asseblief weer."
msgid "Something went wrong. Please try again."
msgstr "Iets het verkeerd geloop. Probeer asseblief weer."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "ይህንን ፓች ወደነበረበት መመለስ አልተቻለ
msgid "Could not set up two-factor authentication."
msgstr "ሁለት-ደረጃ ማረጋገጫን ማዋቀር አልተቻለም።"
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "የአቅራቢውን ግንኙነት ማረጋገጥ አልተቻለም።"
@@ -5031,6 +5036,10 @@ msgstr "ስንገባዎት የሆነ ችግር ተፈጥሯል። እባክዎ
msgid "Something went wrong. Please try again."
msgstr "የተሳሳተ ነገር ተፈጥሯል። እባክዎን ደግመው ይሞክሩ።"
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "تعذر استعادة هذا التحديث."
msgid "Could not set up two-factor authentication."
msgstr "تعذّر إعداد المصادقة الثنائية."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "تعذر التحقق من اتصال مزود الخدمة."
@@ -5031,6 +5036,10 @@ msgstr "حدث خطأ ما أثناء تسجيل دخولك. يُرجى المح
msgid "Something went wrong. Please try again."
msgstr "حدث خطأ ما. يُرجى المحاولة مرة أخرى."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Bu yamağı bərpa etmək mümkün olmadı."
msgid "Could not set up two-factor authentication."
msgstr "İki mərhələli autentifikasiya qurula bilmədi."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Provayder bağlantısını yoxlamaq mümkün olmadı."
@@ -5031,6 +5036,10 @@ msgstr "Sizi daxil edərkən nəsə səhv getdi. Zəhmət olmasa yenidən cəhd
msgid "Something went wrong. Please try again."
msgstr "Nəsə səhv getdi. Zəhmət olmasa, yenidən cəhd edin."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Не можа да се възстанови този пач."
msgid "Could not set up two-factor authentication."
msgstr "Двуфакторното удостоверяване не можа да бъде настроено."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Не можа да се провери връзката с доставчика."
@@ -5031,6 +5036,10 @@ msgstr "Нещо се обърка при влизането ви. Моля, о
msgid "Something went wrong. Please try again."
msgstr "Нещо се обърка. Моля, опитайте отново."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "এই প্যাচটি পুনরুদ্ধার করা
msgid "Could not set up two-factor authentication."
msgstr "টু‑ফ্যাক্টর প্রমাণীকরণ সেট আপ করা যায়নি।"
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "প্রোভাইডার সংযোগ যাচাই করা যায়নি।"
@@ -5031,6 +5036,10 @@ msgstr "আপনাকে সাইন ইন করানোর সময়
msgid "Something went wrong. Please try again."
msgstr "কিছু একটা ভুল হয়েছে। অনুগ্রহ করে আবার চেষ্টা করুন।"
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "No s'ha pogut restaurar aquest pegat."
msgid "Could not set up two-factor authentication."
msgstr "No s'ha pogut configurar l'autenticació en dos passos."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "No s'ha pogut verificar la connexió del proveïdor."
@@ -5031,6 +5036,10 @@ msgstr "Alguna cosa ha anat malament en iniciar la sessió. Torna-ho a provar."
msgid "Something went wrong. Please try again."
msgstr "Alguna cosa ha anat malament. Torna-ho a provar."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Tuto záplatu se nepodařilo obnovit."
msgid "Could not set up two-factor authentication."
msgstr "Nepodařilo se nastavit dvoufaktorové ověření."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Nepodařilo se ověřit připojení poskytovatele."
@@ -5031,6 +5036,10 @@ msgstr "Při přihlašování se něco pokazilo. Zkuste to prosím znovu."
msgid "Something went wrong. Please try again."
msgstr "Něco se pokazilo. Zkuste to prosím znovu."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Kunne ikke gendanne denne programrettelse."
msgid "Could not set up two-factor authentication."
msgstr "Kunne ikke opsætte to-faktor-godkendelse."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Kunne ikke bekræfte udbyderforbindelsen."
@@ -5031,6 +5036,10 @@ msgstr "Noget gik galt, da du skulle logges ind. Prøv venligst igen."
msgid "Something went wrong. Please try again."
msgstr "Noget gik galt. Prøv igen."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Dieser Patch konnte nicht wiederhergestellt werden."
msgid "Could not set up two-factor authentication."
msgstr "Die Zwei-Faktor-Authentifizierung konnte nicht eingerichtet werden."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Die Providerverbindung konnte nicht verifiziert werden."
@@ -5031,6 +5036,10 @@ msgstr "Bei der Anmeldung ist etwas schiefgelaufen. Bitte versuchen Sie es erneu
msgid "Something went wrong. Please try again."
msgstr "Etwas ist schiefgelaufen. Bitte versuchen Sie es erneut."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Δεν ήταν δυνατή η επαναφορά αυτής της ε
msgid "Could not set up two-factor authentication."
msgstr "Δεν ήταν δυνατή η ρύθμιση του ελέγχου ταυτότητας δύο σταδίων."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Δεν ήταν δυνατή η επαλήθευση της σύνδεσης του παρόχου."
@@ -5031,6 +5036,10 @@ msgstr "Κάτι πήγε στραβά κατά τη σύνδεσή σας. Δο
msgid "Something went wrong. Please try again."
msgstr "Κάτι πήγε στραβά. Παρακαλώ δοκιμάστε ξανά."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Could not restore this patch."
msgid "Could not set up two-factor authentication."
msgstr "Could not set up two-factor authentication."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Could not verify provider connection."
@@ -5031,6 +5036,10 @@ msgstr "Something went wrong while signing you in. Please try again."
msgid "Something went wrong. Please try again."
msgstr "Something went wrong. Please try again."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1409,6 +1409,11 @@ msgstr "Could not save the cover letter. Please try again."
msgid "Could not set up two-factor authentication."
msgstr "Could not set up two-factor authentication."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr "Could not sort these items; they stayed at the end: {0}."
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Could not verify provider connection."
@@ -5297,6 +5302,10 @@ msgstr "Something went wrong while signing you in. Please try again."
msgid "Something went wrong. Please try again."
msgstr "Something went wrong. Please try again."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr "Sort by date"
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "No se pudo restaurar este parche."
msgid "Could not set up two-factor authentication."
msgstr "No se pudo configurar la autenticación de doble factor."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "No se pudo verificar la conexión con el proveedor."
@@ -5031,6 +5036,10 @@ msgstr "Algo salió mal al iniciar tu sesión. Inténtalo de nuevo."
msgid "Something went wrong. Please try again."
msgstr "Algo salió mal. Vuelve a intentarlo."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "نتوانستم این پچ را بازیابی کنم."
msgid "Could not set up two-factor authentication."
msgstr "راه‌اندازی احراز هویت دو مرحله‌ای ممکن نشد."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "اتصال ارائه دهنده تأیید نشد."
@@ -5031,6 +5036,10 @@ msgstr "هنگام ورود شما مشکلی پیش آمد. لطفاً دوبا
msgid "Something went wrong. Please try again."
msgstr "مشکلی پیش آمد. لطفاً دوباره تلاش کنید."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Tätä korjaustiedostoa ei voitu palauttaa."
msgid "Could not set up two-factor authentication."
msgstr "Kaksivaiheista todennusta ei voitu ottaa käyttöön."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Palveluntarjoajan yhteyden vahvistaminen epäonnistui."
@@ -5031,6 +5036,10 @@ msgstr "Kirjautumisessa tapahtui virhe. Yritä uudelleen."
msgid "Something went wrong. Please try again."
msgstr "Jokin meni pieleen. Yritä uudelleen."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Impossible de restaurer ce correctif."
msgid "Could not set up two-factor authentication."
msgstr "Impossible de configurer l'authentification à deux facteurs."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Impossible de vérifier la connexion au fournisseur."
@@ -5031,6 +5036,10 @@ msgstr "Une erreur s'est produite lors de votre connexion. Veuillez réessayer."
msgid "Something went wrong. Please try again."
msgstr "Une erreur s'est produite. Veuillez réessayer."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "לא ניתן היה לשחזר את התיקון הזה."
msgid "Could not set up two-factor authentication."
msgstr "לא ניתן היה להגדיר אימות דו־שלבי."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "לא ניתן היה לאמת את חיבור הספק."
@@ -5031,6 +5036,10 @@ msgstr "משהו השתבש בזמן ההתחברות שלך. נסה שוב."
msgid "Something went wrong. Please try again."
msgstr "משהו השתבש. נא לנסות שוב."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "इस पैच को पुनर्स्थापित नही
msgid "Could not set up two-factor authentication."
msgstr "दो कारक प्रमाणीकरण सेट नहीं किया जा सका।"
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "प्रदाता कनेक्शन सत्यापित नहीं हो सका।"
@@ -5031,6 +5036,10 @@ msgstr "आपको साइन इन करते समय कुछ गड
msgid "Something went wrong. Please try again."
msgstr "कुछ गड़बड़ हो गई। कृपया फिर से प्रयास करें।"
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Nem sikerült visszaállítani ezt a javítást."
msgid "Could not set up two-factor authentication."
msgstr "Nem sikerült beállítani a kétlépcsős hitelesítést."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Nem sikerült ellenőrizni a szolgáltató kapcsolatát."
@@ -5031,6 +5036,10 @@ msgstr "Hiba történt a bejelentkezés során. Kérjük, próbálja újra."
msgid "Something went wrong. Please try again."
msgstr "Valami hiba történt. Kérjük, próbáld újra."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Patch ini tidak dapat dipulihkan."
msgid "Could not set up two-factor authentication."
msgstr "Tidak dapat menyiapkan autentikasi dua faktor."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Koneksi penyedia tidak dapat diverifikasi."
@@ -5031,6 +5036,10 @@ msgstr "Terjadi kesalahan saat memasukkan Anda. Silakan coba lagi."
msgid "Something went wrong. Please try again."
msgstr "Terjadi sesuatu yang salah. Silakan coba lagi."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Impossibile ripristinare questa patch."
msgid "Could not set up two-factor authentication."
msgstr "Impossibile configurare l'autenticazione a due fattori."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Impossibile verificare la connessione al provider."
@@ -5031,6 +5036,10 @@ msgstr "Si è verificato un problema durante l'accesso. Riprova."
msgid "Something went wrong. Please try again."
msgstr "Qualcosa è andato storto. Riprova."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "このパッチを復元できませんでした。"
msgid "Could not set up two-factor authentication."
msgstr "二要素認証を設定できませんでした。"
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "プロバイダとの接続を確認できませんでした。"
@@ -5031,6 +5036,10 @@ msgstr "サインイン中に問題が発生しました。もう一度お試し
msgid "Something went wrong. Please try again."
msgstr "問題が発生しました。もう一度お試しください。"
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "មិនអាចស្ដារបំណះនេះឡើងវិញ
msgid "Could not set up two-factor authentication."
msgstr "មិនអាចដំឡើងការផ្ទៀងផ្ទាត់ពីរជាន់បានទេ។"
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "មិនអាចផ្ទៀងផ្ទាត់ការតភ្ជាប់របស់អ្នកផ្តល់សេវាបានទេ។"
@@ -5031,6 +5036,10 @@ msgstr "មានបញ្ហាកើតឡើងពេលចូល។ សូ
msgid "Something went wrong. Please try again."
msgstr "មាន​អ្វីមួយ​ខុសប្រក្រតី។ សូម​ព្យាយាម​ម្ដង​ទៀត។"
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "ಈ ಪ್ಯಾಚ್ ಅನ್ನು ಪುನಃಸ್ಥಾಪಿಸ
msgid "Could not set up two-factor authentication."
msgstr "ಎರಡು ಅಂಶಗಳ ದೃಢೀಕರಣವನ್ನು ಸಿದ್ಧಪಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "ಪೂರೈಕೆದಾರರ ಸಂಪರ್ಕವನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ."
@@ -5031,6 +5036,10 @@ msgstr "ನಿಮ್ಮನ್ನು ಸೈನ್ ಇನ್ ಮಾಡುವಾಗ
msgid "Something went wrong. Please try again."
msgstr "ಏನೋ ತಪ್ಪಾಗಿದೆ. ದಯವಿಟ್ಟು ಮರುಪ್ರಯತ್ನಿಸಿ."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "이 패치를 복원할 수 없습니다."
msgid "Could not set up two-factor authentication."
msgstr "2단계 인증을 설정하지 못했습니다."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "공급자 연결을 확인할 수 없습니다."
@@ -5031,6 +5036,10 @@ msgstr "로그인하는 중에 문제가 발생했습니다. 다시 시도해
msgid "Something went wrong. Please try again."
msgstr "문제가 발생했습니다. 다시 시도해 주세요."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Nepavyko atkurti šio pataisymo."
msgid "Could not set up two-factor authentication."
msgstr "Nepavyko nustatyti dviejų veiksnių autentifikavimo."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Nepavyko patvirtinti tiekėjo ryšio."
@@ -5031,6 +5036,10 @@ msgstr "Jungiant įvyko klaida. Bandykite dar kartą."
msgid "Something went wrong. Please try again."
msgstr "Kažkas nepavyko. Bandykite dar kartą."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Nevarēja atjaunot šo ielāpu."
msgid "Could not set up two-factor authentication."
msgstr "Neizdevās iestatīt divu faktoru autentifikāciju."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Nevarēja pārbaudīt pakalpojumu sniedzēja savienojumu."
@@ -5031,6 +5036,10 @@ msgstr "Piesakoties radās kļūda. Lūdzu, mēģiniet vēlreiz."
msgid "Something went wrong. Please try again."
msgstr "Kaut kas nogāja greizi. Lūdzu, mēģiniet vēlreiz."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "ഈ പാച്ച് പുനഃസ്ഥാപിക്കാൻ ക
msgid "Could not set up two-factor authentication."
msgstr "ടു-ഫാക്ടർ ഓത്‌ന്റിക്കേഷൻ സജ്ജമാക്കാനായില്ല."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "ദാതാവിന്റെ കണക്ഷൻ പരിശോധിക്കാൻ കഴിഞ്ഞില്ല."
@@ -5031,6 +5036,10 @@ msgstr "നിങ്ങളെ സൈൻ ഇൻ ചെയ്യുമ്പോൾ
msgid "Something went wrong. Please try again."
msgstr "എന്തോ പിശക് സംഭവിച്ചു. ദയവായി വീണ്ടും ശ്രമിക്കുക."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "हा पॅच पुनर्स्थापित करता आ
msgid "Could not set up two-factor authentication."
msgstr "दुहेरी घटक ओथेंटिकेशन सेट करता आले नाही."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "प्रोव्हायडर कनेक्शनची पडताळणी होऊ शकली नाही."
@@ -5031,6 +5036,10 @@ msgstr "तुम्हाला साइन इन करताना का
msgid "Something went wrong. Please try again."
msgstr "काही तरी चूक झाली. कृपया पुन्हा प्रयत्न करा."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Tidak dapat memulihkan tampalan ini."
msgid "Could not set up two-factor authentication."
msgstr "Tidak dapat menyediakan pengesahan dua faktor."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Tidak dapat mengesahkan sambungan pembekal."
@@ -5031,6 +5036,10 @@ msgstr "Sesuatu telah berlaku semasa anda log masuk. Sila cuba lagi."
msgid "Something went wrong. Please try again."
msgstr "Ada sesuatu yang tidak kena. Sila cuba lagi."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "यो प्याच पुनर्स्थापित गर्न
msgid "Could not set up two-factor authentication."
msgstr "दुई-कारक प्रमाणीकरण सेटअप गर्न सकिएन।"
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "प्रदायक जडान प्रमाणित गर्न सकिएन।"
@@ -5031,6 +5036,10 @@ msgstr "तपाईंलाई साइन इन गर्दा केह
msgid "Something went wrong. Please try again."
msgstr "केही समस्या भयो। कृपया पुनः प्रयास गर्नुहोस्।"
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Deze patch kon niet worden hersteld."
msgid "Could not set up two-factor authentication."
msgstr "Tweestapsverificatie kon niet worden ingesteld."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "De verbinding met de provider kon niet worden geverifieerd."
@@ -5031,6 +5036,10 @@ msgstr "Er is iets misgegaan tijdens het inloggen. Probeer het opnieuw."
msgid "Something went wrong. Please try again."
msgstr "Er is iets misgegaan. Probeer het alstublieft opnieuw."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Kunne ikke gjenopprette denne oppdateringen."
msgid "Could not set up two-factor authentication."
msgstr "Kunne ikke sette opp tofaktorautentisering."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Kunne ikke bekrefte leverandørtilkoblingen."
@@ -5031,6 +5036,10 @@ msgstr "Noe gikk galt under innloggingen. Prøv igjen."
msgid "Something went wrong. Please try again."
msgstr "Noe gikk galt. Vennligst prøv igjen."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "ଏହି ପ୍ୟାଚ୍ ପୁନଃସ୍ଥାପନ କରିପ
msgid "Could not set up two-factor authentication."
msgstr "ଦ୍ୱି-ଘଟକ ପରିଚୟ ପ୍ରମାଣିକରଣ ସେଟ୍ ଅପ୍ କରାଯାଇପାରିଲା ନାହିଁ।"
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "ପ୍ରଦାତା ସଂଯୋଗ ଯାଞ୍ଚ କରିପାରିଲା ନାହିଁ।"
@@ -5031,6 +5036,10 @@ msgstr "ଆପଣଙ୍କୁ ସାଇନ୍ ଇନ୍ କରିବା ସମ
msgid "Something went wrong. Please try again."
msgstr "କିଛି ଭୁଲ୍ ହୋଇଛି। ଦୟାକରି ପୁନଃ ଚେଷ୍ଟା କରନ୍ତୁ।"
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Nie udało się przywrócić tej poprawki."
msgid "Could not set up two-factor authentication."
msgstr "Nie udało się skonfigurować uwierzytelniania dwuskładnikowego."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Nie można zweryfikować połączenia z dostawcą."
@@ -5031,6 +5036,10 @@ msgstr "Coś poszło nie tak podczas logowania. Spróbuj ponownie."
msgid "Something went wrong. Please try again."
msgstr "Coś poszło nie tak. Spróbuj ponownie."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Não foi possível restaurar este patch."
msgid "Could not set up two-factor authentication."
msgstr "Não foi possível configurar a autenticação de dois fatores."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Não foi possível verificar a conexão com o provedor."
@@ -5031,6 +5036,10 @@ msgstr "Algo deu errado ao fazer seu login. Tente novamente."
msgid "Something went wrong. Please try again."
msgstr "Algo deu errado. Tente novamente."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Não foi possível restaurar este patch."
msgid "Could not set up two-factor authentication."
msgstr "Não foi possível configurar a autenticação de dois fatores."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Não foi possível verificar a ligação com o fornecedor."
@@ -5031,6 +5036,10 @@ msgstr "Algo correu mal ao iniciar a sua sessão. Tente novamente."
msgid "Something went wrong. Please try again."
msgstr "Algo correu mal. Tente novamente."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Nu s-a putut restaura acest patch."
msgid "Could not set up two-factor authentication."
msgstr "Nu s-a putut configura autentificarea cu doi factori."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Nu s-a putut verifica conexiunea furnizorului."
@@ -5031,6 +5036,10 @@ msgstr "A apărut o problemă la conectare. Încearcă din nou."
msgid "Something went wrong. Please try again."
msgstr "Ceva nu a funcționat. Vă rugăm să încercați din nou."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Восстановить этот патч не удалось."
msgid "Could not set up two-factor authentication."
msgstr "Не удалось настроить двухфакторную аутентификацию."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Не удалось проверить подключение к провайдеру."
@@ -5031,6 +5036,10 @@ msgstr "При входе что-то пошло не так. Попробуйт
msgid "Something went wrong. Please try again."
msgstr "Что-то пошло не так. Пожалуйста, попробуйте еще раз."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Túto záplatu sa nepodarilo obnoviť."
msgid "Could not set up two-factor authentication."
msgstr "Nepodarilo sa nastaviť dvojfaktorové overenie."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Nepodarilo sa overiť pripojenie poskytovateľa."
@@ -5031,6 +5036,10 @@ msgstr "Pri prihlasovaní sa niečo pokazilo. Skúste to prosím znova."
msgid "Something went wrong. Please try again."
msgstr "Niečo sa pokazilo. Skús to, prosím, znova."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Tega popravka ni bilo mogoče obnoviti."
msgid "Could not set up two-factor authentication."
msgstr "Dvofaktorske avtentikacije ni bilo mogoče nastaviti."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Povezave s ponudnikom ni bilo mogoče preveriti."
@@ -5031,6 +5036,10 @@ msgstr "Pri prijavi je prišlo do napake. Poskusite znova."
msgid "Something went wrong. Please try again."
msgstr "Nekaj je šlo narobe. Prosimo, poskusite znova."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Nuk mundi ta rikthente këtë patch."
msgid "Could not set up two-factor authentication."
msgstr "Vërtetimi me dy faktorë nuk u konfigurua dot."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Nuk mund të verifikohej lidhja e ofruesit."
@@ -5031,6 +5036,10 @@ msgstr "Diçka shkoi keq gjatë hyrjes suaj. Ju lutemi provoni sërish."
msgid "Something went wrong. Please try again."
msgstr "Diçka shkoi keq. Ju lutemi provoni përsëri."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Није могуће вратити ову закрпу."
msgid "Could not set up two-factor authentication."
msgstr "Није било могуће подесити двофакторску аутентификацију."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Није могуће проверити везу са провајдером."
@@ -5031,6 +5036,10 @@ msgstr "Дошло је до грешке приликом пријављива
msgid "Something went wrong. Please try again."
msgstr "Нешто је пошло наопако. Покушајте поново."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Kunde inte återställa den här patchen."
msgid "Could not set up two-factor authentication."
msgstr "Det gick inte att ställa in tvåfaktorsautentisering."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Kunde inte verifiera leverantörsanslutningen."
@@ -5031,6 +5036,10 @@ msgstr "Något gick fel när du loggades in. Försök igen."
msgid "Something went wrong. Please try again."
msgstr "Något gick fel. Försök igen."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "இந்தத் திருத்தத்தை மீட்டெ
msgid "Could not set up two-factor authentication."
msgstr "இரண்டு நிலை அங்கீகாரத்தை அமைக்க முடியவில்லை."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "வழங்குநர் இணைப்பைச் சரிபார்க்க முடியவில்லை."
@@ -5031,6 +5036,10 @@ msgstr "உங்களை உள்நுழைக்கும்போது
msgid "Something went wrong. Please try again."
msgstr "ஏதோ தவறு நடந்துள்ளது. தயவுசெய்து மீண்டும் முயற்சிக்கவும்."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "ఈ ప్యాచ్‌ను పునరుద్ధరించల
msgid "Could not set up two-factor authentication."
msgstr "రెండు దశల ధృవీకరణను సెటప్ చేయలేకపోయాం."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "ప్రొవైడర్ కనెక్షన్‌ను ధృవీకరించలేకపోయాము."
@@ -5031,6 +5036,10 @@ msgstr "మిమ్మల్ని సైన్ ఇన్ చేస్తున
msgid "Something went wrong. Please try again."
msgstr "ఏదో తప్పు జరిగింది. దయచేసి మళ్లీ ప్రయత్నించండి."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "ไม่สามารถกู้คืนแพทช์นี้ไ
msgid "Could not set up two-factor authentication."
msgstr "ไม่สามารถตั้งค่าการยืนยันตัวตนแบบสองขั้นตอนได้"
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "ไม่สามารถตรวจสอบการเชื่อมต่อของผู้ให้บริการได้"
@@ -5031,6 +5036,10 @@ msgstr "เกิดข้อผิดพลาดขณะลงชื่อเ
msgid "Something went wrong. Please try again."
msgstr "เกิดข้อผิดพลาดบางอย่าง กรุณาลองใหม่อีกครั้ง"
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Bu yama geri yüklenemedi."
msgid "Could not set up two-factor authentication."
msgstr "İki faktörlü kimlik doğrulama kurulamadı."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Servis sağlayıcı bağlantısı doğrulanamadı."
@@ -5031,6 +5036,10 @@ msgstr "Oturumunuz açılırken bir sorun oluştu. Lütfen tekrar deneyin."
msgid "Something went wrong. Please try again."
msgstr "Bir hata oluştu. Lütfen tekrar deneyin."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Не вдалося відновити цей патч."
msgid "Could not set up two-factor authentication."
msgstr "Не вдалося налаштувати двофакторну автентифікацію."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Не вдалося перевірити підключення постачальника."
@@ -5031,6 +5036,10 @@ msgstr "Під час входу сталася помилка. Спробуйт
msgid "Something went wrong. Please try again."
msgstr "Щось пішло не так. Будь ласка, спробуйте ще раз."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Ushbu yamoqni tiklab bo'lmadi."
msgid "Could not set up two-factor authentication."
msgstr "Ikki bosqichli autentifikatsiyani sozlab bo'lmadi."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Provayder ulanishini tekshirib bo'lmadi."
@@ -5031,6 +5036,10 @@ msgstr "Kirish paytida xatolik yuz berdi. Iltimos, qayta urinib ko‘ring."
msgid "Something went wrong. Please try again."
msgstr "Nimadir xato ketdi. Iltimos, qayta urinib koʻring."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "Không thể khôi phục bản vá này."
msgid "Could not set up two-factor authentication."
msgstr "Không thể thiết lập xác thực hai yếu tố."
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "Không thể xác minh kết nối với nhà cung cấp."
@@ -5031,6 +5036,10 @@ msgstr "Đã xảy ra lỗi khi đăng nhập cho bạn. Vui lòng thử lại."
msgid "Something went wrong. Please try again."
msgstr "Đã xảy ra lỗi. Vui lòng thử lại."
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "无法恢复此补丁。"
msgid "Could not set up two-factor authentication."
msgstr "无法设置双重身份验证。"
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "无法验证提供商连接。"
@@ -5031,6 +5036,10 @@ msgstr "登录时出错。请重试。"
msgid "Something went wrong. Please try again."
msgstr "出现了一些问题。请重试。"
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1338,6 +1338,11 @@ msgstr "無法恢復此補丁。"
msgid "Could not set up two-factor authentication."
msgstr "無法設定雙因子驗證。"
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr "無法驗證提供者連線。"
@@ -5031,6 +5036,10 @@ msgstr "登入時發生錯誤。請再試一次。"
msgid "Something went wrong. Please try again."
msgstr "發生錯誤。請再試一次。"
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
+9
View File
@@ -1324,6 +1324,11 @@ msgstr ""
msgid "Could not set up two-factor authentication."
msgstr ""
#. placeholder {0}: unresolvedLabels.join(", ")
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Could not sort these items; they stayed at the end: {0}."
msgstr ""
#: src/features/settings/integrations/components/ai-section.tsx
msgid "Could not verify provider connection."
msgstr ""
@@ -4998,6 +5003,10 @@ msgstr ""
msgid "Something went wrong. Please try again."
msgstr ""
#: src/routes/builder/$resumeId/-sidebar/left/shared/section-menu.tsx
msgid "Sort by date"
msgstr ""
#: src/routes/dashboard/applications/index.tsx
#: src/routes/dashboard/resumes/index.tsx
msgid "Sort by"
@@ -5,6 +5,7 @@ import type { Resume } from "./draft";
import { act, renderHook } from "@testing-library/react";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { i18n } from "@lingui/core";
import { sortSectionItemsByPeriod } from "@reactive-resume/resume/section-sort";
import { defaultResumeData } from "@reactive-resume/schema/resume/default";
import {
isEditableElementFocused,
@@ -112,6 +113,24 @@ function withBasicsName(resume: Resume, name: string): Resume {
};
}
function experienceItem(
id: string,
company: string,
period: string,
): ResumeData["sections"]["experience"]["items"][number] {
return {
id,
company,
position: "Engineer",
location: "",
period,
description: "",
hidden: false,
website: { url: "", label: "", inlineLink: false },
roles: [],
};
}
async function flushMicrotasks() {
await Promise.resolve();
await Promise.resolve();
@@ -480,6 +499,69 @@ describe("builder resume undo/redo", () => {
expect(store().canRedo).toBe(false);
});
it("restores the exact authored Experience order with one undo after a one-shot sort", () => {
const store = useResumeStore.getState;
const initial = makeResume("sort-undo");
initial.data.sections.experience.items = [
experienceItem("unknown", "Mystery Co", "Recently"),
experienceItem("older", "Older Co", "2018 - 2020"),
experienceItem("current", "Current Co", "2023 - Present"),
];
const authoredItems = cloneResumeData(initial.data).sections.experience.items;
store().initialize(initial);
store().updateResumeData((draft) => {
draft.sections.experience.items = sortSectionItemsByPeriod(
draft.sections.experience.items,
draft.metadata.page.locale,
).items;
});
expect(store().resume?.data.sections.experience.items.map(({ id }) => id)).toEqual(["current", "older", "unknown"]);
expect(store().undoStack).toHaveLength(1);
store().undo();
expect(store().resume?.data.sections.experience.items).toEqual(authoredItems);
expect(store().canUndo).toBe(false);
});
it("retains the chosen order through autosave/reload and never resorts later field edits", async () => {
const store = useResumeStore.getState;
const initial = makeResume("sort-persistence");
initial.data.sections.experience.items = [
experienceItem("older", "Older Co", "2018 - 2020"),
experienceItem("current", "Current Co", "2023 - Present"),
];
let savedResume: Resume | undefined;
orpcMocks.updateResume.mockImplementation((input: { id: string; data: ResumeData }) => {
savedResume = { ...makeResume(input.id), data: cloneResumeData(input.data) };
return Promise.resolve(savedResume);
});
store().initialize(initial);
store().updateResumeData((draft) => {
draft.sections.experience.items = sortSectionItemsByPeriod(
draft.sections.experience.items,
draft.metadata.page.locale,
).items;
});
vi.advanceTimersByTime(500);
await flushMicrotasks();
expect(orpcMocks.updateResume).toHaveBeenCalledTimes(1);
expect(savedResume?.data.sections.experience.items.map(({ id }) => id)).toEqual(["current", "older"]);
if (!savedResume) throw new Error("expected the sorted resume to be saved");
store().reset();
store().initialize(savedResume);
store().updateResumeData((draft) => {
const currentItem = draft.sections.experience.items.find(({ id }) => id === "current");
if (currentItem) currentItem.period = "2010 - 2011";
});
expect(store().resume?.data.sections.experience.items.map(({ id }) => id)).toEqual(["current", "older"]);
});
it("separates edits outside the coalesce window into distinct undo steps", async () => {
const store = useResumeStore.getState;
store().initialize(makeResume("undo-boundary"));
@@ -1,28 +1,25 @@
// @vitest-environment happy-dom
import { render, screen } from "@testing-library/react";
import type { Resume } from "@/features/resume/builder/draft";
import { fireEvent, render, screen } from "@testing-library/react";
import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
import { i18n } from "@lingui/core";
import { I18nProvider } from "@lingui/react";
import { SectionDropdownMenu } from "./section-menu";
const mockUpdateResumeData = vi.fn();
const mocks = vi.hoisted(() => ({
updateResumeData: vi.fn(),
toastAdd: vi.fn(),
resume: { value: {} as Resume },
}));
vi.mock("@/features/resume/builder/draft", () => ({
useCurrentResume: () => ({
data: {
sections: {
skills: {
title: "Skills",
columns: 2,
hidden: false,
layout: "default",
items: [],
},
},
},
}),
useUpdateResumeData: () => mockUpdateResumeData,
useCurrentResume: () => mocks.resume.value,
useUpdateResumeData: () => mocks.updateResumeData,
}));
vi.mock("@reactive-resume/ui/components/toast", () => ({
toast: { add: mocks.toastAdd },
}));
vi.mock("@/hooks/use-confirm", () => ({
@@ -44,9 +41,49 @@ beforeAll(() => {
});
beforeEach(() => {
mockUpdateResumeData.mockClear();
mocks.updateResumeData.mockClear();
mocks.toastAdd.mockClear();
mocks.resume.value = {
isLocked: false,
data: {
metadata: { page: { locale: "en-US" } },
sections: {
skills: {
title: "Skills",
columns: 2,
hidden: false,
layout: "default",
items: [],
},
experience: {
title: "Experience",
columns: 1,
hidden: false,
items: [
{ id: "unknown", company: "Mystery Co", period: "Recently" },
{ id: "older", company: "Older Co", period: "2018 - 2020" },
{ id: "current", company: "Current Co", period: "2023 - Present" },
],
},
education: {
title: "Education",
columns: 1,
hidden: false,
items: [
{ id: "earlier", school: "Earlier School", period: "2016 - 2020" },
{ id: "later", school: "Later School", period: "2020 - 2024" },
],
},
},
},
} as unknown as Resume;
});
function openSectionOptions() {
fireEvent.click(screen.getByRole("button", { name: "Section options" }));
return screen.findByRole("menu");
}
describe("SkillsSectionDropdownMenu", () => {
it("updates resume data correctly when selecting 'inline' for skills section", async () => {
render(
@@ -55,16 +92,16 @@ describe("SkillsSectionDropdownMenu", () => {
</I18nProvider>,
);
screen.getByRole("button", { name: "Section options" }).click();
await openSectionOptions();
(await screen.findByRole("menuitem", { name: /columns/i })).click();
(await screen.findByRole("menuitemradio", { name: /inline/i })).click();
expect(mockUpdateResumeData).toHaveBeenCalledTimes(1);
expect(mockUpdateResumeData).toHaveBeenCalledWith(expect.any(Function));
expect(mocks.updateResumeData).toHaveBeenCalledTimes(1);
expect(mocks.updateResumeData).toHaveBeenCalledWith(expect.any(Function));
const mutation = mockUpdateResumeData.mock.calls[0][0];
const mutation = mocks.updateResumeData.mock.calls[0][0];
const mockDraft = {
sections: {
skills: {
@@ -90,16 +127,16 @@ describe("SkillsSectionDropdownMenu", () => {
</I18nProvider>,
);
screen.getByRole("button", { name: "Section options" }).click();
await openSectionOptions();
(await screen.findByRole("menuitem", { name: /columns/i })).click();
(await screen.findByRole("menuitemradio", { name: /3 columns/i })).click();
expect(mockUpdateResumeData).toHaveBeenCalledTimes(1);
expect(mockUpdateResumeData).toHaveBeenCalledWith(expect.any(Function));
expect(mocks.updateResumeData).toHaveBeenCalledTimes(1);
expect(mocks.updateResumeData).toHaveBeenCalledWith(expect.any(Function));
const mutation = mockUpdateResumeData.mock.calls[0][0];
const mutation = mocks.updateResumeData.mock.calls[0][0];
const mockDraft = {
sections: {
skills: {
@@ -118,3 +155,74 @@ describe("SkillsSectionDropdownMenu", () => {
expect(mockDraft.sections.skills.columns).toBe(3);
});
});
describe("chronological section sorting", () => {
it("sorts Experience once through one draft mutation and names only unresolved items", async () => {
render(
<I18nProvider i18n={i18n}>
<SectionDropdownMenu type="experience" />
</I18nProvider>,
);
await openSectionOptions();
fireEvent.click(await screen.findByRole("menuitem", { name: "Sort by date" }));
expect(mocks.updateResumeData).toHaveBeenCalledTimes(1);
const mutation = mocks.updateResumeData.mock.calls[0]?.[0] as (draft: Resume["data"]) => void;
const draft = structuredClone(mocks.resume.value.data);
mutation(draft);
expect(draft.sections.experience.items.map(({ id }) => id)).toEqual(["current", "older", "unknown"]);
expect(mocks.toastAdd).toHaveBeenCalledWith({
type: "warning",
description: "Could not sort these items; they stayed at the end: Mystery Co.",
});
});
it("sorts Education once without showing an unresolved notice", async () => {
render(
<I18nProvider i18n={i18n}>
<SectionDropdownMenu type="education" />
</I18nProvider>,
);
await openSectionOptions();
fireEvent.click(await screen.findByRole("menuitem", { name: "Sort by date" }));
expect(mocks.updateResumeData).toHaveBeenCalledTimes(1);
const mutation = mocks.updateResumeData.mock.calls[0]?.[0] as (draft: Resume["data"]) => void;
const draft = structuredClone(mocks.resume.value.data);
mutation(draft);
expect(draft.sections.education.items.map(({ id }) => id)).toEqual(["later", "earlier"]);
expect(mocks.toastAdd).not.toHaveBeenCalled();
});
it("disables sorting when the resume is locked", async () => {
mocks.resume.value = { ...mocks.resume.value, isLocked: true };
render(
<I18nProvider i18n={i18n}>
<SectionDropdownMenu type="experience" />
</I18nProvider>,
);
await openSectionOptions();
const sortItem = await screen.findByRole("menuitem", { name: "Sort by date" });
expect(sortItem).toHaveAttribute("aria-disabled", "true");
fireEvent.keyDown(sortItem, { key: "Escape" });
expect(mocks.updateResumeData).not.toHaveBeenCalled();
});
it("does not offer date sorting for other built-in sections", async () => {
render(
<I18nProvider i18n={i18n}>
<SectionDropdownMenu type="skills" />
</I18nProvider>,
);
await openSectionOptions();
expect(screen.queryByRole("menuitem", { name: "Sort by date" })).not.toBeInTheDocument();
});
});
@@ -9,7 +9,9 @@ import {
ListIcon,
PencilSimpleLineIcon,
PlusIcon,
SortDescendingIcon,
} from "@phosphor-icons/react";
import { sortSectionItemsByPeriod } from "@reactive-resume/resume/section-sort";
import { Button } from "@reactive-resume/ui/components/button";
import {
DropdownMenu,
@@ -24,6 +26,7 @@ import {
DropdownMenuSubTrigger,
DropdownMenuTrigger,
} from "@reactive-resume/ui/components/dropdown-menu";
import { toast } from "@reactive-resume/ui/components/toast";
import { useDialogStore } from "@/dialogs/store";
import { useCurrentResume, useUpdateResumeData } from "@/features/resume/builder/draft";
import { useConfirm } from "@/hooks/use-confirm";
@@ -49,6 +52,36 @@ export function SectionDropdownMenu({ type }: Props) {
openDialog(`resume.sections.${type}.create`, undefined);
};
const onSortByDate = () => {
if ((type !== "experience" && type !== "education") || resume.isLocked) return;
let unresolvedLabels: string[] = [];
if (type === "experience") {
const currentItems = resume.data.sections.experience.items;
const result = sortSectionItemsByPeriod(currentItems, resume.data.metadata.page.locale);
const labelById = new Map(currentItems.map((item) => [item.id, item.company.trim() || item.id]));
unresolvedLabels = result.unresolvedIds.map((id) => labelById.get(id) ?? id);
updateResumeData((draft) => {
draft.sections.experience.items = result.items;
});
} else {
const currentItems = resume.data.sections.education.items;
const result = sortSectionItemsByPeriod(currentItems, resume.data.metadata.page.locale);
const labelById = new Map(currentItems.map((item) => [item.id, item.school.trim() || item.id]));
unresolvedLabels = result.unresolvedIds.map((id) => labelById.get(id) ?? id);
updateResumeData((draft) => {
draft.sections.education.items = result.items;
});
}
if (unresolvedLabels.length > 0) {
toast.add({
type: "warning",
description: t`Could not sort these items; they stayed at the end: ${unresolvedLabels.join(", ")}.`,
});
}
};
const onToggleVisibility = () => {
updateResumeData((draft) => {
if (type === "summary") {
@@ -137,6 +170,13 @@ export function SectionDropdownMenu({ type }: Props) {
<PlusIcon />
<Trans>Add a new item</Trans>
</DropdownMenuItem>
{(type === "experience" || type === "education") && (
<DropdownMenuItem disabled={resume.isLocked} onClick={onSortByDate}>
<SortDescendingIcon />
<Trans>Sort by date</Trans>
</DropdownMenuItem>
)}
</DropdownMenuGroup>
<DropdownMenuSeparator />
+1
View File
@@ -12,6 +12,7 @@
"./markdown": "./src/markdown.ts",
"./patch": "./src/patch.ts",
"./section-availability": "./src/section-availability.ts",
"./section-sort": "./src/section-sort.ts",
"./social-meta": "./src/social-meta.ts",
"./stylesheet": "./src/stylesheet/index.ts",
"./stylesheet/registry": "./src/stylesheet/registry/index.ts",
+19
View File
@@ -4,6 +4,25 @@ import { isFutureEndpoint, isReversedPeriod, ONGOING_TOKENS_BY_LANGUAGE, parsePe
const NOW = new Date("2024-06-15T00:00:00Z");
describe("parsePeriod", () => {
it.each([
["numeric range", "2020 - 2024", "en-US", { start: { year: 2020 }, end: { year: 2024 }, ongoing: false }],
[
"localized range",
"janvier 2020 - mars 2022",
"fr-FR",
{ start: { year: 2020, month: 1 }, end: { year: 2022, month: 3 }, ongoing: false },
],
["ongoing range", "January 2024 - Present", "en-US", { start: { year: 2024, month: 1 }, ongoing: true }],
["year-only value", "2024", "en-US", { start: { year: 2024 }, ongoing: false }],
["reversed range", "2024 - 2020", "en-US", { start: { year: 2024 }, end: { year: 2020 }, ongoing: false }],
["blank value", "", "en-US", null],
["bare ongoing value", "Present", "en-US", null],
["prose value", "Summer of love", "en-US", null],
["equal range", "2024 - 2024", "en-US", { start: { year: 2024 }, end: { year: 2024 }, ongoing: false }],
] as const)("characterizes %s", (_case, input, locale, expected) => {
expect(parsePeriod(input, locale)).toEqual(expected);
});
it.each([
["Jan 2020 - Present", { start: { year: 2020, month: 1 }, ongoing: true }],
["January 2020 – March 2022", { start: { year: 2020, month: 1 }, end: { year: 2022, month: 3 }, ongoing: false }],
+133
View File
@@ -0,0 +1,133 @@
import { describe, expect, it } from "vitest";
import { sortSectionItemsByPeriod } from "./section-sort";
type Item = {
id: string;
period: string;
title: string;
metadata?: { note: string };
};
const item = (id: string, period: string, title = id): Item => ({ id, period, title });
const ids = (items: readonly Item[]) => items.map(({ id }) => id);
describe("sortSectionItemsByPeriod", () => {
it("orders ongoing, ended, equal, and unresolved periods by the documented total order", () => {
const equalFirst = item("equal-first", "2020 - 2023");
const equalSecond = item("equal-second", "2020 - 2023");
const input = [
item("blank", ""),
equalFirst,
item("ended-2024", "2020 - 2024"),
item("ongoing-2020", "2020 - Present"),
item("prose", "A long time ago"),
item("ended-2025", "2022 - 2025"),
equalSecond,
item("ongoing-2024", "January 2024 - Present"),
item("reversed", "2025 - 2024"),
];
const result = sortSectionItemsByPeriod(input, "en-US");
expect(ids(result.items)).toEqual([
"ongoing-2024",
"ongoing-2020",
"ended-2025",
"ended-2024",
"equal-first",
"equal-second",
"blank",
"prose",
"reversed",
]);
expect(result.unresolvedIds).toEqual(["blank", "prose", "reversed"]);
});
it("uses locale-aware months and ranks year precision below a known month in the same year", () => {
const input = [
item("year-only-end", "2020 - 2024"),
item("localized-march", "janvier 2020 - mars 2024"),
item("localized-february", "janvier 2020 - février 2024"),
];
const result = sortSectionItemsByPeriod(input, "fr-FR");
expect(ids(result.items)).toEqual(["localized-march", "localized-february", "year-only-end"]);
expect(result.unresolvedIds).toEqual([]);
});
it("ranks missing end points after known end points, then compares known starts", () => {
const input = [item("single-2025", "2025"), item("ended-2020", "2019 - 2020"), item("single-2024", "2024")];
const result = sortSectionItemsByPeriod(input, "en-US");
expect(ids(result.items)).toEqual(["ended-2020", "single-2025", "single-2024"]);
});
it("keeps mixed-precision comparisons transitive", () => {
const input = [
item("december-2023", "2020 - December 2023"),
item("may-2024", "2020 - May 2024"),
item("year-2024", "2020 - 2024"),
];
expect(ids(sortSectionItemsByPeriod(input, "en-US").items)).toEqual(["may-2024", "year-2024", "december-2023"]);
});
it("leaves bare ongoing tokens, blanks, prose, and reversed periods stable at the end", () => {
const input = [
item("present", "Present"),
item("known", "2020 - 2021"),
item("blank", " "),
item("prose", "During university"),
item("reversed", "March 2024 - February 2024"),
];
const result = sortSectionItemsByPeriod(input, "en-US");
expect(ids(result.items)).toEqual(["known", "present", "blank", "prose", "reversed"]);
expect(result.unresolvedIds).toEqual(["present", "blank", "prose", "reversed"]);
});
it("returns new arrays while preserving every original object and all content", () => {
const first = item("first", "2020 - 2021", "Original title");
first.metadata = { note: "Keep me" };
const second = item("second", "2022 - Present", "Another title");
const input = [first, second];
const snapshot = structuredClone(input);
const result = sortSectionItemsByPeriod(input, "en-US");
expect(result.items).not.toBe(input);
expect(result.items).toEqual([second, first]);
expect(result.items[0]).toBe(second);
expect(result.items[1]).toBe(first);
expect([...ids(result.items)].sort()).toEqual([...ids(input)].sort());
expect(input).toEqual(snapshot);
});
it("is deterministic across repeated invocation without changing stable ties", () => {
const input = [item("equal-a", "2020 - 2024"), item("newest", "2021 - 2025"), item("equal-b", "2020 - 2024")];
const first = sortSectionItemsByPeriod(input, "en-US");
const second = sortSectionItemsByPeriod(first.items, "en-US");
expect(ids(first.items)).toEqual(["newest", "equal-a", "equal-b"]);
expect(ids(second.items)).toEqual(ids(first.items));
expect(second.unresolvedIds).toEqual(first.unresolvedIds);
});
it("returns fresh arrays for empty and single-item inputs", () => {
const empty: Item[] = [];
const single = [item("only", "2024")];
const emptyResult = sortSectionItemsByPeriod(empty, "en-US");
const singleResult = sortSectionItemsByPeriod(single, "en-US");
expect(emptyResult).toEqual({ items: [], unresolvedIds: [] });
expect(emptyResult.items).not.toBe(empty);
expect(singleResult).toEqual({ items: single, unresolvedIds: [] });
expect(singleResult.items).not.toBe(single);
expect(singleResult.items[0]).toBe(single[0]);
});
});
+82
View File
@@ -0,0 +1,82 @@
import type { PeriodEndpoint } from "./ats/period";
import { isReversedPeriod, parsePeriod } from "./ats/period";
type SectionItemWithPeriod = {
id: string;
period: string;
};
export type SortSectionItemsByPeriodResult<T> = {
items: T[];
unresolvedIds: string[];
};
type SortGroup = "ongoing" | "ended" | "unresolved";
type RankedItem<T> = {
item: T;
index: number;
group: SortGroup;
start?: PeriodEndpoint;
end?: PeriodEndpoint;
};
function compareEndpointDescending(left: PeriodEndpoint | undefined, right: PeriodEndpoint | undefined): number {
if (!left && !right) return 0;
if (!left) return 1;
if (!right) return -1;
if (left.year !== right.year) return right.year - left.year;
return (right.month ?? 0) - (left.month ?? 0);
}
function rankItem<T extends SectionItemWithPeriod>(item: T, index: number, locale: string): RankedItem<T> {
const period = parsePeriod(item.period, locale);
if (!period?.start || (period.end && isReversedPeriod(period.start, period.end))) {
return { item, index, group: "unresolved" };
}
return {
item,
index,
group: period.ongoing ? "ongoing" : "ended",
start: period.start,
...(period.end ? { end: period.end } : {}),
};
}
const GROUP_RANK: Readonly<Record<SortGroup, number>> = {
ongoing: 0,
ended: 1,
unresolved: 2,
};
function compareRankedItems<T>(left: RankedItem<T>, right: RankedItem<T>): number {
const groupOrder = GROUP_RANK[left.group] - GROUP_RANK[right.group];
if (groupOrder !== 0) return groupOrder;
if (left.group === "ongoing" && right.group === "ongoing") {
return compareEndpointDescending(left.start, right.start) || left.index - right.index;
}
if (left.group === "ended" && right.group === "ended") {
return (
compareEndpointDescending(left.end, right.end) ||
compareEndpointDescending(left.start, right.start) ||
left.index - right.index
);
}
return left.index - right.index;
}
export function sortSectionItemsByPeriod<T extends SectionItemWithPeriod>(
items: readonly T[],
locale: string,
): SortSectionItemsByPeriodResult<T> {
const rankedItems = items.map((item, index) => rankItem(item, index, locale));
return {
items: rankedItems.toSorted(compareRankedItems).map(({ item }) => item),
unresolvedIds: rankedItems.filter(({ group }) => group === "unresolved").map(({ item }) => item.id),
};
}
@@ -0,0 +1,126 @@
import { Pool } from "pg";
import { createSampleResumeFromDashboard, openSidebarSection } from "../fixtures/resume";
import { resumeIdFromPage } from "../fixtures/semantic-css";
import { expect, test } from "../fixtures/test";
type ExperienceItem = {
id: string;
company: string;
position: string;
location: string;
period: string;
description: string;
hidden: boolean;
website: { url: string; label: string; inlineLink: boolean };
roles: [];
};
const experienceItem = (id: string, company: string, period: string): ExperienceItem => ({
id,
company,
position: "Engineer",
location: "",
period,
description: "",
hidden: false,
website: { url: "", label: "", inlineLink: false },
roles: [],
});
function databasePool() {
if (!process.env.DATABASE_URL) throw new Error("DATABASE_URL is required for section sorting E2E coverage.");
return new Pool({ connectionString: process.env.DATABASE_URL });
}
async function seedExperienceItems(resumeId: string, items: ExperienceItem[]) {
const pool = databasePool();
try {
const result = await pool.query<{ data: { sections: { experience: { items: ExperienceItem[] } } } }>(
'select data from "resume" where id = $1',
[resumeId],
);
const data = result.rows[0]?.data;
if (!data) throw new Error(`Resume ${resumeId} was not found.`);
data.sections.experience.items = items;
await pool.query('update "resume" set data = $2, updated_at = now() where id = $1', [resumeId, data]);
} finally {
await pool.end();
}
}
async function readExperienceItems(resumeId: string) {
const pool = databasePool();
try {
const result = await pool.query<{ data: { sections: { experience: { items: ExperienceItem[] } } } }>(
'select data from "resume" where id = $1',
[resumeId],
);
const items = result.rows[0]?.data.sections.experience.items;
if (!items) throw new Error(`Resume ${resumeId} was not found.`);
return items;
} finally {
await pool.end();
}
}
const itemIds = (items: ExperienceItem[]) => items.map(({ id }) => id);
test("sorts Experience once while preserving undo, persistence, later edits, and locking", async ({
authPage: page,
}, testInfo) => {
test.setTimeout(90_000);
await createSampleResumeFromDashboard(page, testInfo);
const resumeId = resumeIdFromPage(page);
const authoredItems = [
experienceItem("unknown-sort", "Mystery Co", "Recently"),
experienceItem("older-sort", "Older Co", "2018 - 2020"),
experienceItem("current-sort", "Current Co", "2023 - Present"),
];
await seedExperienceItems(resumeId, authoredItems);
await page.reload();
await openSidebarSection(page, "Experience");
const section = page.locator("#sidebar-experience");
const renderedItemIds = () =>
section
.locator('[id^="resume-item-"]')
.evaluateAll((nodes) => nodes.map(({ id }) => id.replace("resume-item-", "")));
await expect.poll(renderedItemIds).toEqual(["unknown-sort", "older-sort", "current-sort"]);
await section.getByRole("button", { name: "Section options" }).click();
await page.getByRole("menuitem", { name: "Sort by date" }).click();
await expect(page.getByText("Could not sort these items; they stayed at the end: Mystery Co.")).toBeVisible();
await expect
.poll(async () => itemIds(await readExperienceItems(resumeId)))
.toEqual(["current-sort", "older-sort", "unknown-sort"]);
await expect.poll(renderedItemIds).toEqual(["current-sort", "older-sort", "unknown-sort"]);
await page.getByRole("button", { name: "Undo", exact: true }).click();
await expect
.poll(async () => itemIds(await readExperienceItems(resumeId)))
.toEqual(["unknown-sort", "older-sort", "current-sort"]);
await section.getByRole("button", { name: "Section options" }).click();
await page.getByRole("menuitem", { name: "Sort by date" }).click();
await expect
.poll(async () => itemIds(await readExperienceItems(resumeId)))
.toEqual(["current-sort", "older-sort", "unknown-sort"]);
await page.reload();
await openSidebarSection(page, "Experience");
await expect.poll(renderedItemIds).toEqual(["current-sort", "older-sort", "unknown-sort"]);
await section.getByText("Current Co", { exact: true }).click();
const updateDialog = page.getByRole("dialog", { name: "Update an existing experience" });
await updateDialog.getByLabel("Period").fill("2010 - 2011");
await updateDialog.getByRole("button", { name: "Save Changes" }).click();
await expect
.poll(async () => {
const items = await readExperienceItems(resumeId);
return { ids: itemIds(items), currentPeriod: items.find(({ id }) => id === "current-sort")?.period };
})
.toEqual({ ids: ["current-sort", "older-sort", "unknown-sort"], currentPeriod: "2010 - 2011" });
await page.getByRole("button", { name: "Resume options" }).click();
await page.getByRole("menuitem", { name: "Lock" }).click();
await page.getByRole("alertdialog").getByRole("button", { name: "Confirm" }).click();
await expect(section.getByRole("button", { name: "Section options" })).toBeDisabled();
});