mirror of
https://codeberg.org/yeentown/barkey.git
synced 2025-04-28 09:36:56 +00:00
Merge tag '2025.2.0' into merge/2024-02-03
This commit is contained in:
commit
708debf5d5
35 changed files with 127 additions and 191 deletions
|
@ -5,13 +5,20 @@
|
||||||
(Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/883)
|
(Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/883)
|
||||||
|
|
||||||
### Client
|
### Client
|
||||||
|
- Fix: パスキーでパスワードレスログインが出来ない問題を修正
|
||||||
- Fix: 一部環境でセンシティブなファイルを含むノートの非表示が効かない問題
|
- Fix: 一部環境でセンシティブなファイルを含むノートの非表示が効かない問題
|
||||||
- Fix: データセーバー有効時にもユーザーページの「ファイル」タブで画像が読み込まれてしまう問題を修正
|
- Fix: データセーバー有効時にもユーザーページの「ファイル」タブで画像が読み込まれてしまう問題を修正
|
||||||
|
- Fix: MFMの `sparkle` エフェクトが正しく表示されない問題を修正
|
||||||
|
- Fix: ページのURLにスラッシュが含まれている場合にページが正しく表示されない問題を修正
|
||||||
|
- Fix: デッキのプロファイルが新規作成できない問題を修正
|
||||||
|
- Fix: セキュリティに関する修正
|
||||||
|
- ローカライゼーションの更新
|
||||||
|
- Playが実装されたため、ページ機能の「ソースを見る」は削除されました
|
||||||
|
|
||||||
### Server
|
### Server
|
||||||
|
- Enhance: ページのURLに使用可能な文字を限定するように
|
||||||
- Fix: 個別お知らせページのmetaタグ出力の条件が間違っていたのを修正
|
- Fix: 個別お知らせページのmetaタグ出力の条件が間違っていたのを修正
|
||||||
|
|
||||||
|
|
||||||
## 2025.1.0
|
## 2025.1.0
|
||||||
|
|
||||||
### Note
|
### Note
|
||||||
|
|
|
@ -1460,9 +1460,6 @@ _pages:
|
||||||
newPage: "أنشئ صفحة جديدة"
|
newPage: "أنشئ صفحة جديدة"
|
||||||
editPage: "عدّل الصفحة"
|
editPage: "عدّل الصفحة"
|
||||||
readPage: "نُشّط عرض المصدر"
|
readPage: "نُشّط عرض المصدر"
|
||||||
created: "نجح إنشاء الصفحة"
|
|
||||||
updated: "نجح تعديل الصفحة"
|
|
||||||
deleted: "نجح حذف الصفحة"
|
|
||||||
pageSetting: "إعدادات الصفحة"
|
pageSetting: "إعدادات الصفحة"
|
||||||
nameAlreadyExists: "رابط الصفحة موجود مسبقًا"
|
nameAlreadyExists: "رابط الصفحة موجود مسبقًا"
|
||||||
invalidNameTitle: "رابط الصفحة ليس صالحًا"
|
invalidNameTitle: "رابط الصفحة ليس صالحًا"
|
||||||
|
|
|
@ -1237,9 +1237,6 @@ _pages:
|
||||||
newPage: "নতুন পৃষ্ঠা বানান"
|
newPage: "নতুন পৃষ্ঠা বানান"
|
||||||
editPage: "পৃষ্ঠাটি সম্পাদনা করুন"
|
editPage: "পৃষ্ঠাটি সম্পাদনা করুন"
|
||||||
readPage: "উৎস দেখছেন"
|
readPage: "উৎস দেখছেন"
|
||||||
created: "পৃষ্ঠা তৈরি করা হয়েছে"
|
|
||||||
updated: "পৃষ্ঠা সম্পাদনা করা হয়েছে"
|
|
||||||
deleted: "পৃষ্ঠা মুছে ফেলা হয়েছে"
|
|
||||||
pageSetting: "পৃষ্ঠার সেটিংস"
|
pageSetting: "পৃষ্ঠার সেটিংস"
|
||||||
nameAlreadyExists: "পৃষ্ঠার URLটি ইতিমধ্যেই ব্যাবহার করা হয়েছে"
|
nameAlreadyExists: "পৃষ্ঠার URLটি ইতিমধ্যেই ব্যাবহার করা হয়েছে"
|
||||||
invalidNameTitle: "পৃষ্ঠার URL অবৈধ"
|
invalidNameTitle: "পৃষ্ঠার URL অবৈধ"
|
||||||
|
|
|
@ -2365,9 +2365,6 @@ _pages:
|
||||||
newPage: "pa"
|
newPage: "pa"
|
||||||
editPage: "Editar la pàgina"
|
editPage: "Editar la pàgina"
|
||||||
readPage: "Veure el codi font d'aquesta pàgina"
|
readPage: "Veure el codi font d'aquesta pàgina"
|
||||||
created: "La pàgina ha sigut creada correctament"
|
|
||||||
updated: "La pàgina s'ha editat correctament"
|
|
||||||
deleted: "La pàgina s'ha esborrat sense problemes"
|
|
||||||
pageSetting: "Configuració de la pàgina"
|
pageSetting: "Configuració de la pàgina"
|
||||||
nameAlreadyExists: "L'adreça URL de la pàgina ja existeix"
|
nameAlreadyExists: "L'adreça URL de la pàgina ja existeix"
|
||||||
invalidNameTitle: "L'adreça URL de la pàgina no és vàlida"
|
invalidNameTitle: "L'adreça URL de la pàgina no és vàlida"
|
||||||
|
|
|
@ -1883,9 +1883,6 @@ _pages:
|
||||||
newPage: "Vytvořit novou stránku"
|
newPage: "Vytvořit novou stránku"
|
||||||
editPage: "Upravit stránku"
|
editPage: "Upravit stránku"
|
||||||
readPage: "Prohlížení zdroje této stránky"
|
readPage: "Prohlížení zdroje této stránky"
|
||||||
created: "Stránka byla úspěšně vytvořena"
|
|
||||||
updated: "Stránka byla úspěšně aktualizována"
|
|
||||||
deleted: "Stránka byla úspěšně smazána"
|
|
||||||
pageSetting: "Nastavení stránky"
|
pageSetting: "Nastavení stránky"
|
||||||
nameAlreadyExists: "Zadaná adresa URL stránky již existuje"
|
nameAlreadyExists: "Zadaná adresa URL stránky již existuje"
|
||||||
invalidNameTitle: "Zadaná adresa URL stránky je neplatná"
|
invalidNameTitle: "Zadaná adresa URL stránky je neplatná"
|
||||||
|
|
|
@ -2277,9 +2277,6 @@ _pages:
|
||||||
newPage: "Seite erstellen"
|
newPage: "Seite erstellen"
|
||||||
editPage: "Seite bearbeiten"
|
editPage: "Seite bearbeiten"
|
||||||
readPage: "Quelltextansicht"
|
readPage: "Quelltextansicht"
|
||||||
created: "Seite erfolgreich erstellt"
|
|
||||||
updated: "Seite erfolgreich aktualisiert"
|
|
||||||
deleted: "Seite erfolgreich gelöscht"
|
|
||||||
pageSetting: "Seiteneinstellungen"
|
pageSetting: "Seiteneinstellungen"
|
||||||
nameAlreadyExists: "Die angegebene Seiten-URL existiert bereits"
|
nameAlreadyExists: "Die angegebene Seiten-URL existiert bereits"
|
||||||
invalidNameTitle: "Die angegebene Seiten-URL ist ungültig"
|
invalidNameTitle: "Die angegebene Seiten-URL ist ungültig"
|
||||||
|
|
|
@ -2365,9 +2365,6 @@ _pages:
|
||||||
newPage: "Create a new Page"
|
newPage: "Create a new Page"
|
||||||
editPage: "Edit this Page"
|
editPage: "Edit this Page"
|
||||||
readPage: "Viewing this Page's source"
|
readPage: "Viewing this Page's source"
|
||||||
created: "Page successfully created"
|
|
||||||
updated: "Page successfully edited"
|
|
||||||
deleted: "Page successfully deleted"
|
|
||||||
pageSetting: "Page settings"
|
pageSetting: "Page settings"
|
||||||
nameAlreadyExists: "The specified Page URL already exists"
|
nameAlreadyExists: "The specified Page URL already exists"
|
||||||
invalidNameTitle: "The specified Page URL is invalid"
|
invalidNameTitle: "The specified Page URL is invalid"
|
||||||
|
@ -2775,6 +2772,7 @@ _customEmojisManager:
|
||||||
confirmUpdateEmojisDescription: "Update {count} Emoji(s). Are you sure to continue?"
|
confirmUpdateEmojisDescription: "Update {count} Emoji(s). Are you sure to continue?"
|
||||||
confirmDeleteEmojisDescription: "Delete checked {count} Emoji(s). Are you sure to continue?"
|
confirmDeleteEmojisDescription: "Delete checked {count} Emoji(s). Are you sure to continue?"
|
||||||
confirmResetDescription: ""
|
confirmResetDescription: ""
|
||||||
|
confirmMovePageDesciption: "Changes have been made to the Emojis on this page.\nIf you leave the page without saving, all changes made on this page will be discarded."
|
||||||
dialogSelectRoleTitle: "Search by roll set in Emojis"
|
dialogSelectRoleTitle: "Search by roll set in Emojis"
|
||||||
_register:
|
_register:
|
||||||
uploadSettingTitle: "Upload settings"
|
uploadSettingTitle: "Upload settings"
|
||||||
|
|
|
@ -2294,9 +2294,6 @@ _pages:
|
||||||
newPage: "Crear página"
|
newPage: "Crear página"
|
||||||
editPage: "Editar página"
|
editPage: "Editar página"
|
||||||
readPage: "Viendo la fuente"
|
readPage: "Viendo la fuente"
|
||||||
created: "La página fue creada"
|
|
||||||
updated: "La página fue actualizada"
|
|
||||||
deleted: "La página borrada"
|
|
||||||
pageSetting: "Configurar página"
|
pageSetting: "Configurar página"
|
||||||
nameAlreadyExists: "La URL de la página especificada ya existe"
|
nameAlreadyExists: "La URL de la página especificada ya existe"
|
||||||
invalidNameTitle: "URL inválida"
|
invalidNameTitle: "URL inválida"
|
||||||
|
|
|
@ -2118,9 +2118,6 @@ _pages:
|
||||||
newPage: "Créer une page"
|
newPage: "Créer une page"
|
||||||
editPage: "Modifier une page"
|
editPage: "Modifier une page"
|
||||||
readPage: "Affichage de la source en cours"
|
readPage: "Affichage de la source en cours"
|
||||||
created: "La page a été créée !"
|
|
||||||
updated: "La page a été mise à jour !"
|
|
||||||
deleted: "La page a été supprimée"
|
|
||||||
pageSetting: "Paramètres de la Page"
|
pageSetting: "Paramètres de la Page"
|
||||||
nameAlreadyExists: "L'URL de page spécifiée existe déjà"
|
nameAlreadyExists: "L'URL de page spécifiée existe déjà"
|
||||||
invalidNameTitle: "L'URL de page spécifiée n’est pas valide"
|
invalidNameTitle: "L'URL de page spécifiée n’est pas valide"
|
||||||
|
|
|
@ -2285,9 +2285,6 @@ _pages:
|
||||||
newPage: "Buat halaman baru"
|
newPage: "Buat halaman baru"
|
||||||
editPage: "Sunting halaman"
|
editPage: "Sunting halaman"
|
||||||
readPage: "Lihat sumber kode aktif"
|
readPage: "Lihat sumber kode aktif"
|
||||||
created: "Halaman berhasil dibuat"
|
|
||||||
updated: "Halaman berhasil diperbaharui!"
|
|
||||||
deleted: "Halaman telah dihapus"
|
|
||||||
pageSetting: "Pengaturan Halaman"
|
pageSetting: "Pengaturan Halaman"
|
||||||
nameAlreadyExists: "URL Halaman yang ditentukan sudah ada"
|
nameAlreadyExists: "URL Halaman yang ditentukan sudah ada"
|
||||||
invalidNameTitle: "URL Halaman yang ditentukan tidak valid"
|
invalidNameTitle: "URL Halaman yang ditentukan tidak valid"
|
||||||
|
|
14
locales/index.d.ts
vendored
14
locales/index.d.ts
vendored
|
@ -4196,7 +4196,7 @@ export interface Locale extends ILocale {
|
||||||
*/
|
*/
|
||||||
"invalidParamError": string;
|
"invalidParamError": string;
|
||||||
/**
|
/**
|
||||||
* リクエストパラメータに問題があります。通常これはバグですが、入力した文字数が多すぎる等の可能性もあります。
|
* リクエストパラメータに問題があります。通常これはバグですが、入力した文字数が多すぎる・許可されていない文字を入力している等の可能性もあります。
|
||||||
*/
|
*/
|
||||||
"invalidParamErrorDescription": string;
|
"invalidParamErrorDescription": string;
|
||||||
/**
|
/**
|
||||||
|
@ -9296,18 +9296,6 @@ export interface Locale extends ILocale {
|
||||||
* ソースを表示中
|
* ソースを表示中
|
||||||
*/
|
*/
|
||||||
"readPage": string;
|
"readPage": string;
|
||||||
/**
|
|
||||||
* ページを作成しました
|
|
||||||
*/
|
|
||||||
"created": string;
|
|
||||||
/**
|
|
||||||
* ページを更新しました
|
|
||||||
*/
|
|
||||||
"updated": string;
|
|
||||||
/**
|
|
||||||
* ページを削除しました
|
|
||||||
*/
|
|
||||||
"deleted": string;
|
|
||||||
/**
|
/**
|
||||||
* ページ設定
|
* ページ設定
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -2365,9 +2365,6 @@ _pages:
|
||||||
newPage: "Crea pagina"
|
newPage: "Crea pagina"
|
||||||
editPage: "Modifica pagina"
|
editPage: "Modifica pagina"
|
||||||
readPage: "Visualizzando fonte "
|
readPage: "Visualizzando fonte "
|
||||||
created: "Pagina creata!"
|
|
||||||
updated: "Pagina aggiornata con successo!"
|
|
||||||
deleted: "Pagina eliminata"
|
|
||||||
pageSetting: "Impostazioni pagina"
|
pageSetting: "Impostazioni pagina"
|
||||||
nameAlreadyExists: "Esiste già una pagina con lo stesso URL."
|
nameAlreadyExists: "Esiste già una pagina con lo stesso URL."
|
||||||
invalidNameTitle: "L'URL di pagina definito non è valido"
|
invalidNameTitle: "L'URL di pagina definito non è valido"
|
||||||
|
|
|
@ -1044,7 +1044,7 @@ youCannotCreateAnymore: "これ以上作成することはできません。"
|
||||||
cannotPerformTemporary: "一時的に利用できません"
|
cannotPerformTemporary: "一時的に利用できません"
|
||||||
cannotPerformTemporaryDescription: "操作回数が制限を超過するため一時的に利用できません。しばらく時間を置いてから再度お試しください。"
|
cannotPerformTemporaryDescription: "操作回数が制限を超過するため一時的に利用できません。しばらく時間を置いてから再度お試しください。"
|
||||||
invalidParamError: "パラメータエラー"
|
invalidParamError: "パラメータエラー"
|
||||||
invalidParamErrorDescription: "リクエストパラメータに問題があります。通常これはバグですが、入力した文字数が多すぎる等の可能性もあります。"
|
invalidParamErrorDescription: "リクエストパラメータに問題があります。通常これはバグですが、入力した文字数が多すぎる・許可されていない文字を入力している等の可能性もあります。"
|
||||||
permissionDeniedError: "操作が拒否されました"
|
permissionDeniedError: "操作が拒否されました"
|
||||||
permissionDeniedErrorDescription: "このアカウントにはこの操作を行うための権限がありません。"
|
permissionDeniedErrorDescription: "このアカウントにはこの操作を行うための権限がありません。"
|
||||||
preset: "プリセット"
|
preset: "プリセット"
|
||||||
|
@ -2422,9 +2422,6 @@ _pages:
|
||||||
newPage: "ページの作成"
|
newPage: "ページの作成"
|
||||||
editPage: "ページの編集"
|
editPage: "ページの編集"
|
||||||
readPage: "ソースを表示中"
|
readPage: "ソースを表示中"
|
||||||
created: "ページを作成しました"
|
|
||||||
updated: "ページを更新しました"
|
|
||||||
deleted: "ページを削除しました"
|
|
||||||
pageSetting: "ページ設定"
|
pageSetting: "ページ設定"
|
||||||
nameAlreadyExists: "指定されたページURLは既に存在しています"
|
nameAlreadyExists: "指定されたページURLは既に存在しています"
|
||||||
invalidNameTitle: "不正なページURLです"
|
invalidNameTitle: "不正なページURLです"
|
||||||
|
|
|
@ -2357,9 +2357,6 @@ _pages:
|
||||||
newPage: "ページを作る"
|
newPage: "ページを作る"
|
||||||
editPage: "ページの編集"
|
editPage: "ページの編集"
|
||||||
readPage: "ソースを表示中"
|
readPage: "ソースを表示中"
|
||||||
created: "ページを作成したで"
|
|
||||||
updated: "ページを更新したで"
|
|
||||||
deleted: "ページを削除したで"
|
|
||||||
pageSetting: "ページ設定"
|
pageSetting: "ページ設定"
|
||||||
nameAlreadyExists: "指定されたページURLはもうあるみたいや"
|
nameAlreadyExists: "指定されたページURLはもうあるみたいや"
|
||||||
invalidNameTitle: "正しくないページURLみたいやで"
|
invalidNameTitle: "正しくないページURLみたいやで"
|
||||||
|
|
|
@ -2365,9 +2365,6 @@ _pages:
|
||||||
newPage: "페이지 만들기"
|
newPage: "페이지 만들기"
|
||||||
editPage: "페이지 수정"
|
editPage: "페이지 수정"
|
||||||
readPage: "소스 표시 중"
|
readPage: "소스 표시 중"
|
||||||
created: "페이지를 만들었습니다"
|
|
||||||
updated: "페이지를 수정했습니다"
|
|
||||||
deleted: "페이지가 삭제되었습니다"
|
|
||||||
pageSetting: "페이지 설정"
|
pageSetting: "페이지 설정"
|
||||||
nameAlreadyExists: "지정한 페이지 URL이 이미 존재합니다"
|
nameAlreadyExists: "지정한 페이지 URL이 이미 존재합니다"
|
||||||
invalidNameTitle: "유효하지 않은 페이지 URL입니다"
|
invalidNameTitle: "유효하지 않은 페이지 URL입니다"
|
||||||
|
|
|
@ -1459,9 +1459,6 @@ _pages:
|
||||||
newPage: "Utwórz stronę"
|
newPage: "Utwórz stronę"
|
||||||
editPage: "Edytuj tę stronę"
|
editPage: "Edytuj tę stronę"
|
||||||
readPage: "Aktywowano widok źródła"
|
readPage: "Aktywowano widok źródła"
|
||||||
created: "Pomyślnie utworzono stronę!"
|
|
||||||
updated: "Pomyślnie zaktualizowano stronę!"
|
|
||||||
deleted: "Strona została usunięta"
|
|
||||||
pageSetting: "Ustawienia strony"
|
pageSetting: "Ustawienia strony"
|
||||||
nameAlreadyExists: "Określony adres URL strony już istnieje"
|
nameAlreadyExists: "Określony adres URL strony już istnieje"
|
||||||
invalidNameTitle: "Podany adres URL strony jest nieprawidłowy"
|
invalidNameTitle: "Podany adres URL strony jest nieprawidłowy"
|
||||||
|
|
|
@ -2357,9 +2357,6 @@ _pages:
|
||||||
newPage: "Criar uma Página"
|
newPage: "Criar uma Página"
|
||||||
editPage: "Editar essa Página"
|
editPage: "Editar essa Página"
|
||||||
readPage: "Ver a fonte dessa Página"
|
readPage: "Ver a fonte dessa Página"
|
||||||
created: "Página criada com sucesso"
|
|
||||||
updated: "Página atualizada com sucesso"
|
|
||||||
deleted: "Página excluída com sucesso"
|
|
||||||
pageSetting: "Configurações da página"
|
pageSetting: "Configurações da página"
|
||||||
nameAlreadyExists: "O URL de Página especificado já existe"
|
nameAlreadyExists: "O URL de Página especificado já existe"
|
||||||
invalidNameTitle: "O URL de Página especificado é inválido"
|
invalidNameTitle: "O URL de Página especificado é inválido"
|
||||||
|
|
|
@ -1976,9 +1976,6 @@ _pages:
|
||||||
newPage: "Создать страницу"
|
newPage: "Создать страницу"
|
||||||
editPage: "Править страницу"
|
editPage: "Править страницу"
|
||||||
readPage: "Читать страницу"
|
readPage: "Читать страницу"
|
||||||
created: "Страница успешно создана."
|
|
||||||
updated: "Страница успешно обновлена."
|
|
||||||
deleted: "Страница успешно удалена."
|
|
||||||
pageSetting: "Настройки страницы"
|
pageSetting: "Настройки страницы"
|
||||||
nameAlreadyExists: "Указанный адрес страницы уже существует."
|
nameAlreadyExists: "Указанный адрес страницы уже существует."
|
||||||
invalidNameTitle: "Указанный адрес страницы недопустим."
|
invalidNameTitle: "Указанный адрес страницы недопустим."
|
||||||
|
|
|
@ -1332,9 +1332,6 @@ _pages:
|
||||||
newPage: "Vytvoriť novú stránku"
|
newPage: "Vytvoriť novú stránku"
|
||||||
editPage: "Upraviť túto stránku"
|
editPage: "Upraviť túto stránku"
|
||||||
readPage: "Zobrazenie zdroja aktívne"
|
readPage: "Zobrazenie zdroja aktívne"
|
||||||
created: "Stránka úspešne vytvorená"
|
|
||||||
updated: "Stránka úspešne upravená"
|
|
||||||
deleted: "Stránka úspešne odstránená"
|
|
||||||
pageSetting: "Nastavenia stránky"
|
pageSetting: "Nastavenia stránky"
|
||||||
nameAlreadyExists: "Zadaná URL stránku už existuje"
|
nameAlreadyExists: "Zadaná URL stránku už existuje"
|
||||||
invalidNameTitle: "Zadaná URL stránku je nesprávna"
|
invalidNameTitle: "Zadaná URL stránku je nesprávna"
|
||||||
|
|
|
@ -2331,9 +2331,6 @@ _pages:
|
||||||
newPage: "สร้างหน้าเพจใหม่"
|
newPage: "สร้างหน้าเพจใหม่"
|
||||||
editPage: "แก้ไขหน้าเพจ"
|
editPage: "แก้ไขหน้าเพจ"
|
||||||
readPage: "กำลังดูแหล่งที่มาของเพจนี้"
|
readPage: "กำลังดูแหล่งที่มาของเพจนี้"
|
||||||
created: "สร้างหน้าเพจสำเร็จเรียบร้อยแล้ว"
|
|
||||||
updated: "แก้ไขหน้าเพจสำเร็จเรียบร้อยแล้ว"
|
|
||||||
deleted: "ลบหน้าเพจสำเร็จเรียบร้อยแล้ว"
|
|
||||||
pageSetting: "การตั้งค่าหน้าเพจ"
|
pageSetting: "การตั้งค่าหน้าเพจ"
|
||||||
nameAlreadyExists: "URL ของหน้าที่ระบุนั้นมีอยู่แล้ว"
|
nameAlreadyExists: "URL ของหน้าที่ระบุนั้นมีอยู่แล้ว"
|
||||||
invalidNameTitle: "URL ของหน้าที่ระบุนั้นไม่ถูกต้อง"
|
invalidNameTitle: "URL ของหน้าที่ระบุนั้นไม่ถูกต้อง"
|
||||||
|
|
|
@ -1513,9 +1513,6 @@ _pages:
|
||||||
newPage: "Створити сторінку"
|
newPage: "Створити сторінку"
|
||||||
editPage: "Редагувати сторінку"
|
editPage: "Редагувати сторінку"
|
||||||
readPage: "Перегляд вихідного коду"
|
readPage: "Перегляд вихідного коду"
|
||||||
created: "Сторінка успішно створена."
|
|
||||||
updated: "Сторінка успішно оновлена."
|
|
||||||
deleted: "Сторінку видалено"
|
|
||||||
pageSetting: "Налаштування сторінки"
|
pageSetting: "Налаштування сторінки"
|
||||||
nameAlreadyExists: "Вказана адреса сторінки вже існує."
|
nameAlreadyExists: "Вказана адреса сторінки вже існує."
|
||||||
invalidNameTitle: "Вказана адреса сторінки неприпустима."
|
invalidNameTitle: "Вказана адреса сторінки неприпустима."
|
||||||
|
|
|
@ -1004,9 +1004,6 @@ _play:
|
||||||
_pages:
|
_pages:
|
||||||
newPage: "Yangi Sahifa yaratish"
|
newPage: "Yangi Sahifa yaratish"
|
||||||
editPage: "Ushbu Sahifani tahrirlash"
|
editPage: "Ushbu Sahifani tahrirlash"
|
||||||
created: "Sahifa muvaffaqiyatli yaratildi"
|
|
||||||
updated: "Sahifa muvaffaqiyatli tahrirlandi"
|
|
||||||
deleted: "Sahifa muvaffaqiyatli o'chirildi"
|
|
||||||
pageSetting: "Sahifa sozlamalari"
|
pageSetting: "Sahifa sozlamalari"
|
||||||
nameAlreadyExists: "Ko'rsatilgan Sahifa URL'i allaqachon mavjud"
|
nameAlreadyExists: "Ko'rsatilgan Sahifa URL'i allaqachon mavjud"
|
||||||
invalidNameTitle: "Ko'rsatilgan Sahifa URL'i yaroqsiz"
|
invalidNameTitle: "Ko'rsatilgan Sahifa URL'i yaroqsiz"
|
||||||
|
|
|
@ -1802,9 +1802,6 @@ _pages:
|
||||||
newPage: "Tạo Trang mới"
|
newPage: "Tạo Trang mới"
|
||||||
editPage: "Sửa Trang này"
|
editPage: "Sửa Trang này"
|
||||||
readPage: "Xem mã nguồn Trang này"
|
readPage: "Xem mã nguồn Trang này"
|
||||||
created: "Trang đã được tạo thành công"
|
|
||||||
updated: "Trang đã được cập nhật thành công"
|
|
||||||
deleted: "Trang đã được xóa thành công"
|
|
||||||
pageSetting: "Cài đặt trang"
|
pageSetting: "Cài đặt trang"
|
||||||
nameAlreadyExists: "URL Trang đã tồn tại"
|
nameAlreadyExists: "URL Trang đã tồn tại"
|
||||||
invalidNameTitle: "URL Trang không hợp lệ"
|
invalidNameTitle: "URL Trang không hợp lệ"
|
||||||
|
|
|
@ -2365,9 +2365,6 @@ _pages:
|
||||||
newPage: "创建页面"
|
newPage: "创建页面"
|
||||||
editPage: "编辑页面"
|
editPage: "编辑页面"
|
||||||
readPage: "查看页面"
|
readPage: "查看页面"
|
||||||
created: "页面已创建"
|
|
||||||
updated: "页面已更新"
|
|
||||||
deleted: "该页面已被删除"
|
|
||||||
pageSetting: "页面设置"
|
pageSetting: "页面设置"
|
||||||
nameAlreadyExists: "该页面 URL 已存在"
|
nameAlreadyExists: "该页面 URL 已存在"
|
||||||
invalidNameTitle: "无效的页面 URL"
|
invalidNameTitle: "无效的页面 URL"
|
||||||
|
|
|
@ -2365,9 +2365,6 @@ _pages:
|
||||||
newPage: "建立頁面"
|
newPage: "建立頁面"
|
||||||
editPage: "編輯頁面"
|
editPage: "編輯頁面"
|
||||||
readPage: "正在檢視原始碼"
|
readPage: "正在檢視原始碼"
|
||||||
created: "頁面已建立"
|
|
||||||
updated: "頁面已更新"
|
|
||||||
deleted: "頁面已被刪除"
|
|
||||||
pageSetting: "頁面設定"
|
pageSetting: "頁面設定"
|
||||||
nameAlreadyExists: "該頁面 URL 已存在"
|
nameAlreadyExists: "該頁面 URL 已存在"
|
||||||
invalidNameTitle: "無效的頁面 URL"
|
invalidNameTitle: "無效的頁面 URL"
|
||||||
|
|
|
@ -118,3 +118,5 @@ export class MiPage {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const pageNameSchema = { type: 'string', pattern: /^[^\s:\/?#\[\]@!$&'()*+,;=\\%\x00-\x20]{1,256}$/.source } as const;
|
||||||
|
|
|
@ -7,7 +7,7 @@ import ms from 'ms';
|
||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
import type { DriveFilesRepository, PagesRepository } from '@/models/_.js';
|
import type { DriveFilesRepository, PagesRepository } from '@/models/_.js';
|
||||||
import { IdService } from '@/core/IdService.js';
|
import { IdService } from '@/core/IdService.js';
|
||||||
import { MiPage } from '@/models/Page.js';
|
import { MiPage, pageNameSchema } from '@/models/Page.js';
|
||||||
import { Endpoint } from '@/server/api/endpoint-base.js';
|
import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||||
import { PageEntityService } from '@/core/entities/PageEntityService.js';
|
import { PageEntityService } from '@/core/entities/PageEntityService.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
|
@ -51,7 +51,7 @@ export const paramDef = {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
properties: {
|
properties: {
|
||||||
title: { type: 'string' },
|
title: { type: 'string' },
|
||||||
name: { type: 'string', minLength: 1 },
|
name: { ...pageNameSchema, minLength: 1 },
|
||||||
summary: { type: 'string', nullable: true },
|
summary: { type: 'string', nullable: true },
|
||||||
content: { type: 'array', items: {
|
content: { type: 'array', items: {
|
||||||
type: 'object', additionalProperties: true,
|
type: 'object', additionalProperties: true,
|
||||||
|
|
|
@ -10,6 +10,7 @@ import type { PagesRepository, DriveFilesRepository } from '@/models/_.js';
|
||||||
import { Endpoint } from '@/server/api/endpoint-base.js';
|
import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { ApiError } from '../../error.js';
|
import { ApiError } from '../../error.js';
|
||||||
|
import { pageNameSchema } from '@/models/Page.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['pages'],
|
tags: ['pages'],
|
||||||
|
@ -31,13 +32,11 @@ export const meta = {
|
||||||
code: 'NO_SUCH_PAGE',
|
code: 'NO_SUCH_PAGE',
|
||||||
id: '21149b9e-3616-4778-9592-c4ce89f5a864',
|
id: '21149b9e-3616-4778-9592-c4ce89f5a864',
|
||||||
},
|
},
|
||||||
|
|
||||||
accessDenied: {
|
accessDenied: {
|
||||||
message: 'Access denied.',
|
message: 'Access denied.',
|
||||||
code: 'ACCESS_DENIED',
|
code: 'ACCESS_DENIED',
|
||||||
id: '3c15cd52-3b4b-4274-967d-6456fc4f792b',
|
id: '3c15cd52-3b4b-4274-967d-6456fc4f792b',
|
||||||
},
|
},
|
||||||
|
|
||||||
noSuchFile: {
|
noSuchFile: {
|
||||||
message: 'No such file.',
|
message: 'No such file.',
|
||||||
code: 'NO_SUCH_FILE',
|
code: 'NO_SUCH_FILE',
|
||||||
|
@ -56,7 +55,7 @@ export const paramDef = {
|
||||||
properties: {
|
properties: {
|
||||||
pageId: { type: 'string', format: 'misskey:id' },
|
pageId: { type: 'string', format: 'misskey:id' },
|
||||||
title: { type: 'string' },
|
title: { type: 'string' },
|
||||||
name: { type: 'string', minLength: 1 },
|
name: { ...pageNameSchema, minLength: 1 },
|
||||||
summary: { type: 'string', nullable: true },
|
summary: { type: 'string', nullable: true },
|
||||||
content: { type: 'array', items: {
|
content: { type: 'array', items: {
|
||||||
type: 'object', additionalProperties: true,
|
type: 'object', additionalProperties: true,
|
||||||
|
|
|
@ -141,6 +141,7 @@ function onPasskeyDone(credential: AuthenticationPublicKeyCredential): void {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
emit('login', res.signinResponse);
|
emit('login', res.signinResponse);
|
||||||
|
onLoginSucceeded(res.signinResponse);
|
||||||
}).catch(onSigninApiError);
|
}).catch(onSigninApiError);
|
||||||
} else if (userInfo.value != null) {
|
} else if (userInfo.value != null) {
|
||||||
tryLogin({
|
tryLogin({
|
||||||
|
|
|
@ -39,32 +39,18 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
-->
|
-->
|
||||||
<!-- MFMで上位レイヤーに表示されるため、リンクをクリックできるようにstyleにpointer-events: none;を付与。 -->
|
<!-- MFMで上位レイヤーに表示されるため、リンクをクリックできるようにstyleにpointer-events: none;を付与。 -->
|
||||||
<svg v-for="particle in particles" :key="particle.id" :width="width" :height="height" :viewBox="`0 0 ${width} ${height}`" xmlns="http://www.w3.org/2000/svg" style="position: absolute; top: -32px; left: -32px; pointer-events: none;">
|
<svg v-for="particle in particles" :key="particle.id" :width="width" :height="height" :viewBox="`0 0 ${width} ${height}`" xmlns="http://www.w3.org/2000/svg" style="position: absolute; top: -32px; left: -32px; pointer-events: none;">
|
||||||
|
<!-- SVGのanimateTransformを使用するとChromeで描画できなくなるためCSSアニメーションを使用している (Issue 14155) -->
|
||||||
<path
|
<path
|
||||||
style="transform-origin: center; transform-box: fill-box;"
|
:style="{
|
||||||
:transform="`translate(${particle.x} ${particle.y})`"
|
'--translateX': particle.x + 'px',
|
||||||
|
'--translateY': particle.y + 'px',
|
||||||
|
'--duration': particle.dur + 'ms',
|
||||||
|
'--size': particle.size,
|
||||||
|
}"
|
||||||
|
:class="$style.particle"
|
||||||
:fill="particle.color"
|
:fill="particle.color"
|
||||||
d="M29.427,2.011C29.721,0.83 30.782,0 32,0C33.218,0 34.279,0.83 34.573,2.011L39.455,21.646C39.629,22.347 39.991,22.987 40.502,23.498C41.013,24.009 41.653,24.371 42.354,24.545L61.989,29.427C63.17,29.721 64,30.782 64,32C64,33.218 63.17,34.279 61.989,34.573L42.354,39.455C41.653,39.629 41.013,39.991 40.502,40.502C39.991,41.013 39.629,41.653 39.455,42.354L34.573,61.989C34.279,63.17 33.218,64 32,64C30.782,64 29.721,63.17 29.427,61.989L24.545,42.354C24.371,41.653 24.009,41.013 23.498,40.502C22.987,39.991 22.347,39.629 21.646,39.455L2.011,34.573C0.83,34.279 0,33.218 0,32C0,30.782 0.83,29.721 2.011,29.427L21.646,24.545C22.347,24.371 22.987,24.009 23.498,23.498C24.009,22.987 24.371,22.347 24.545,21.646L29.427,2.011Z"
|
d="M29.427,2.011C29.721,0.83 30.782,0 32,0C33.218,0 34.279,0.83 34.573,2.011L39.455,21.646C39.629,22.347 39.991,22.987 40.502,23.498C41.013,24.009 41.653,24.371 42.354,24.545L61.989,29.427C63.17,29.721 64,30.782 64,32C64,33.218 63.17,34.279 61.989,34.573L42.354,39.455C41.653,39.629 41.013,39.991 40.502,40.502C39.991,41.013 39.629,41.653 39.455,42.354L34.573,61.989C34.279,63.17 33.218,64 32,64C30.782,64 29.721,63.17 29.427,61.989L24.545,42.354C24.371,41.653 24.009,41.013 23.498,40.502C22.987,39.991 22.347,39.629 21.646,39.455L2.011,34.573C0.83,34.279 0,33.218 0,32C0,30.782 0.83,29.721 2.011,29.427L21.646,24.545C22.347,24.371 22.987,24.009 23.498,23.498C24.009,22.987 24.371,22.347 24.545,21.646L29.427,2.011Z"
|
||||||
>
|
></path>
|
||||||
<animateTransform
|
|
||||||
attributeName="transform"
|
|
||||||
attributeType="XML"
|
|
||||||
type="rotate"
|
|
||||||
from="0 0 0"
|
|
||||||
to="360 0 0"
|
|
||||||
:dur="`${particle.dur}ms`"
|
|
||||||
repeatCount="1"
|
|
||||||
additive="sum"
|
|
||||||
/>
|
|
||||||
<animateTransform
|
|
||||||
attributeName="transform"
|
|
||||||
attributeType="XML"
|
|
||||||
type="scale"
|
|
||||||
:values="`0; ${particle.size}; 0`"
|
|
||||||
:dur="`${particle.dur}ms`"
|
|
||||||
repeatCount="1"
|
|
||||||
additive="sum"
|
|
||||||
/>
|
|
||||||
</path>
|
|
||||||
</svg>
|
</svg>
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
|
@ -130,4 +116,25 @@ onUnmounted(() => {
|
||||||
position: relative;
|
position: relative;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.particle {
|
||||||
|
transform-origin: center;
|
||||||
|
transform-box: fill-box;
|
||||||
|
translate: var(--translateX) var(--translateY);
|
||||||
|
animation: particleAnimation var(--duration) linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes particleAnimation {
|
||||||
|
0% {
|
||||||
|
rotate: 0deg;
|
||||||
|
scale: 0;
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
scale: var(--size);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
rotate: 360deg;
|
||||||
|
scale: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -96,7 +96,7 @@ const summary = ref<string | null>(null);
|
||||||
const name = ref(Date.now().toString());
|
const name = ref(Date.now().toString());
|
||||||
const eyeCatchingImage = ref<Misskey.entities.DriveFile | null>(null);
|
const eyeCatchingImage = ref<Misskey.entities.DriveFile | null>(null);
|
||||||
const eyeCatchingImageId = ref<string | null>(null);
|
const eyeCatchingImageId = ref<string | null>(null);
|
||||||
const font = ref('sans-serif');
|
const font = ref<'sans-serif' | 'serif'>('sans-serif');
|
||||||
const content = ref<Misskey.entities.Page['content']>([]);
|
const content = ref<Misskey.entities.Page['content']>([]);
|
||||||
const alignCenter = ref(false);
|
const alignCenter = ref(false);
|
||||||
const hideTitleWhenPinned = ref(false);
|
const hideTitleWhenPinned = ref(false);
|
||||||
|
@ -113,7 +113,7 @@ watch(eyeCatchingImageId, async () => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
function getSaveOptions() {
|
function getSaveOptions(): Misskey.entities.PagesCreateRequest {
|
||||||
return {
|
return {
|
||||||
title: title.value.trim(),
|
title: title.value.trim(),
|
||||||
name: name.value.trim(),
|
name: name.value.trim(),
|
||||||
|
@ -128,80 +128,69 @@ function getSaveOptions() {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function save() {
|
async function save() {
|
||||||
const options = getSaveOptions();
|
const options = getSaveOptions();
|
||||||
|
|
||||||
const onError = err => {
|
|
||||||
if (err.id === '3d81ceae-475f-4600-b2a8-2bc116157532') {
|
|
||||||
if (err.info.param === 'name') {
|
|
||||||
os.alert({
|
|
||||||
type: 'error',
|
|
||||||
title: i18n.ts._pages.invalidNameTitle,
|
|
||||||
text: i18n.ts._pages.invalidNameText,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else if (err.code === 'NAME_ALREADY_EXISTS') {
|
|
||||||
os.alert({
|
|
||||||
type: 'error',
|
|
||||||
text: i18n.ts._pages.nameAlreadyExists,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (pageId.value) {
|
if (pageId.value) {
|
||||||
options.pageId = pageId.value;
|
const updateOptions: Misskey.entities.PagesUpdateRequest = {
|
||||||
misskeyApi('pages/update', options)
|
pageId: pageId.value,
|
||||||
.then(page => {
|
...options,
|
||||||
currentName.value = name.value.trim();
|
};
|
||||||
os.alert({
|
|
||||||
type: 'success',
|
await os.apiWithDialog('pages/update', updateOptions, undefined, {
|
||||||
text: i18n.ts._pages.updated,
|
'2298a392-d4a1-44c5-9ebb-ac1aeaa5a9ab': {
|
||||||
});
|
title: i18n.ts.somethingHappened,
|
||||||
}).catch(onError);
|
text: i18n.ts._pages.nameAlreadyExists,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
currentName.value = name.value.trim();
|
||||||
} else {
|
} else {
|
||||||
misskeyApi('pages/create', options)
|
const created = await os.apiWithDialog('pages/create', options, undefined, {
|
||||||
.then(created => {
|
'4650348e-301c-499a-83c9-6aa988c66bc1': {
|
||||||
pageId.value = created.id;
|
title: i18n.ts.somethingHappened,
|
||||||
currentName.value = name.value.trim();
|
text: i18n.ts._pages.nameAlreadyExists,
|
||||||
os.alert({
|
},
|
||||||
type: 'success',
|
});
|
||||||
text: i18n.ts._pages.created,
|
|
||||||
});
|
pageId.value = created.id;
|
||||||
mainRouter.push(`/pages/edit/${pageId.value}`);
|
currentName.value = name.value.trim();
|
||||||
}).catch(onError);
|
mainRouter.replace(`/pages/edit/${pageId.value}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function del() {
|
async function del() {
|
||||||
os.confirm({
|
if (!pageId.value) return;
|
||||||
|
|
||||||
|
const { canceled } = await os.confirm({
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
text: i18n.tsx.removeAreYouSure({ x: title.value.trim() }),
|
text: i18n.tsx.removeAreYouSure({ x: title.value.trim() }),
|
||||||
}).then(({ canceled }) => {
|
|
||||||
if (canceled) return;
|
|
||||||
misskeyApi('pages/delete', {
|
|
||||||
pageId: pageId.value,
|
|
||||||
}).then(() => {
|
|
||||||
os.alert({
|
|
||||||
type: 'success',
|
|
||||||
text: i18n.ts._pages.deleted,
|
|
||||||
});
|
|
||||||
mainRouter.push('/pages');
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (canceled) return;
|
||||||
|
|
||||||
|
await os.apiWithDialog('pages/delete', {
|
||||||
|
pageId: pageId.value,
|
||||||
|
});
|
||||||
|
|
||||||
|
mainRouter.replace('/pages');
|
||||||
}
|
}
|
||||||
|
|
||||||
function duplicate() {
|
async function duplicate() {
|
||||||
title.value = title.value + ' - copy';
|
title.value = title.value + ' - copy';
|
||||||
name.value = name.value + '-copy';
|
name.value = name.value + '-copy';
|
||||||
misskeyApi('pages/create', getSaveOptions()).then(created => {
|
|
||||||
pageId.value = created.id;
|
const created = await os.apiWithDialog('pages/create', getSaveOptions(), undefined, {
|
||||||
currentName.value = name.value.trim();
|
'4650348e-301c-499a-83c9-6aa988c66bc1': {
|
||||||
os.alert({
|
title: i18n.ts.somethingHappened,
|
||||||
type: 'success',
|
text: i18n.ts._pages.nameAlreadyExists,
|
||||||
text: i18n.ts._pages.created,
|
},
|
||||||
});
|
|
||||||
mainRouter.push(`/pages/edit/${pageId.value}`);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
pageId.value = created.id;
|
||||||
|
currentName.value = name.value.trim();
|
||||||
|
|
||||||
|
mainRouter.push(`/pages/edit/${pageId.value}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function add() {
|
async function add() {
|
||||||
|
@ -216,7 +205,7 @@ async function add() {
|
||||||
content.value.push({ id, type });
|
content.value.push({ id, type });
|
||||||
}
|
}
|
||||||
|
|
||||||
function setEyeCatchingImage(img) {
|
function setEyeCatchingImage(img: Event) {
|
||||||
selectFile(img.currentTarget ?? img.target, null).then(file => {
|
selectFile(img.currentTarget ?? img.target, null).then(file => {
|
||||||
eyeCatchingImageId.value = file.id;
|
eyeCatchingImageId.value = file.id;
|
||||||
});
|
});
|
||||||
|
|
|
@ -266,7 +266,7 @@ function showMenu(ev: MouseEvent) {
|
||||||
if ($i && $i.id === page.value.userId) {
|
if ($i && $i.id === page.value.userId) {
|
||||||
menuItems.push({
|
menuItems.push({
|
||||||
icon: 'ti ti-pencil',
|
icon: 'ti ti-pencil',
|
||||||
text: i18n.ts._pages.editThisPage,
|
text: i18n.ts.edit,
|
||||||
action: () => router.push(`/pages/edit/${page.value.id}`),
|
action: () => router.push(`/pages/edit/${page.value.id}`),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -285,10 +285,6 @@ function showMenu(ev: MouseEvent) {
|
||||||
}
|
}
|
||||||
} else if ($i && $i.id !== page.value.userId) {
|
} else if ($i && $i.id !== page.value.userId) {
|
||||||
menuItems.push({
|
menuItems.push({
|
||||||
icon: 'ti ti-code',
|
|
||||||
text: i18n.ts._pages.viewSource,
|
|
||||||
action: () => router.push(`/@${props.username}/pages/${props.pageName}/view-source`),
|
|
||||||
}, {
|
|
||||||
icon: 'ti ti-exclamation-circle',
|
icon: 'ti ti-exclamation-circle',
|
||||||
text: i18n.ts.reportAbuse,
|
text: i18n.ts.reportAbuse,
|
||||||
action: reportAbuse,
|
action: reportAbuse,
|
||||||
|
|
|
@ -17,10 +17,7 @@ export const page = (loader: AsyncComponentLoader) => defineAsyncComponent({
|
||||||
});
|
});
|
||||||
|
|
||||||
const routes: RouteDef[] = [{
|
const routes: RouteDef[] = [{
|
||||||
path: '/@:initUser/pages/:initPageName/view-source',
|
path: '/@:username/pages/:pageName(*)',
|
||||||
component: page(() => import('@/pages/page-editor/page-editor.vue')),
|
|
||||||
}, {
|
|
||||||
path: '/@:username/pages/:pageName',
|
|
||||||
component: page(() => import('@/pages/page.vue')),
|
component: page(() => import('@/pages/page.vue')),
|
||||||
}, {
|
}, {
|
||||||
path: '/@:acct/following',
|
path: '/@:acct/following',
|
||||||
|
|
|
@ -100,7 +100,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
import { computed, defineAsyncComponent, ref, watch, shallowRef } from 'vue';
|
import { computed, defineAsyncComponent, ref, watch, shallowRef } from 'vue';
|
||||||
import { v4 as uuid } from 'uuid';
|
import { v4 as uuid } from 'uuid';
|
||||||
import XCommon from './_common_/common.vue';
|
import XCommon from './_common_/common.vue';
|
||||||
import { deckStore, columnTypes, addColumn as addColumnToStore, loadDeck, getProfiles, deleteProfile as deleteProfile_ } from './deck/deck-store.js';
|
import { deckStore, columnTypes, addColumn as addColumnToStore, forceSaveDeck, loadDeck, getProfiles, deleteProfile as deleteProfile_ } from './deck/deck-store.js';
|
||||||
import type { ColumnType } from './deck/deck-store.js';
|
import type { ColumnType } from './deck/deck-store.js';
|
||||||
import type { MenuItem } from '@/types/menu.js';
|
import type { MenuItem } from '@/types/menu.js';
|
||||||
import XSidebar from '@/ui/_common_/navbar.vue';
|
import XSidebar from '@/ui/_common_/navbar.vue';
|
||||||
|
@ -240,10 +240,15 @@ function changeProfile(ev: MouseEvent) {
|
||||||
title: i18n.ts._deck.profile,
|
title: i18n.ts._deck.profile,
|
||||||
minLength: 1,
|
minLength: 1,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (canceled || name == null) return;
|
if (canceled || name == null) return;
|
||||||
|
|
||||||
deckStore.set('profile', name);
|
os.promiseDialog((async () => {
|
||||||
unisonReload();
|
await deckStore.set('profile', name);
|
||||||
|
await forceSaveDeck();
|
||||||
|
})(), () => {
|
||||||
|
unisonReload();
|
||||||
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
|
@ -258,9 +263,18 @@ async function deleteProfile() {
|
||||||
});
|
});
|
||||||
if (canceled) return;
|
if (canceled) return;
|
||||||
|
|
||||||
deleteProfile_(deckStore.state.profile);
|
os.promiseDialog((async () => {
|
||||||
deckStore.set('profile', 'default');
|
if (deckStore.state.profile === 'default') {
|
||||||
unisonReload();
|
await deckStore.set('columns', []);
|
||||||
|
await deckStore.set('layout', []);
|
||||||
|
await forceSaveDeck();
|
||||||
|
} else {
|
||||||
|
await deleteProfile_(deckStore.state.profile);
|
||||||
|
}
|
||||||
|
await deckStore.set('profile', 'default');
|
||||||
|
})(), () => {
|
||||||
|
unisonReload();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -113,8 +113,7 @@ export const loadDeck = async () => {
|
||||||
deckStore.set('layout', deck.layout);
|
deckStore.set('layout', deck.layout);
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: deckがloadされていない状態でsaveすると意図せず上書きが発生するので対策する
|
export async function forceSaveDeck() {
|
||||||
export const saveDeck = throttle(1000, async () => {
|
|
||||||
await misskeyApi('i/registry/set', {
|
await misskeyApi('i/registry/set', {
|
||||||
scope: ['client', 'deck', 'profiles'],
|
scope: ['client', 'deck', 'profiles'],
|
||||||
key: deckStore.state.profile,
|
key: deckStore.state.profile,
|
||||||
|
@ -123,6 +122,11 @@ export const saveDeck = throttle(1000, async () => {
|
||||||
layout: deckStore.reactiveState.layout.value,
|
layout: deckStore.reactiveState.layout.value,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: deckがloadされていない状態でsaveすると意図せず上書きが発生するので対策する
|
||||||
|
export const saveDeck = throttle(1000, () => {
|
||||||
|
forceSaveDeck();
|
||||||
});
|
});
|
||||||
|
|
||||||
export async function getProfiles(): Promise<string[]> {
|
export async function getProfiles(): Promise<string[]> {
|
||||||
|
|
Loading…
Add table
Reference in a new issue