diff --git a/package-lock.json b/package-lock.json index 93a3aff..62053a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "keanuapp-weblite", - "version": "0.1.25", + "version": "0.1.27", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "keanuapp-weblite", - "version": "0.1.25", + "version": "0.1.27", "dependencies": { "@matrix-org/olm": "^3.2.12", "aes-js": "^3.1.2", diff --git a/src/assets/config.json b/src/assets/config.json index ff4e750..389e901 100644 --- a/src/assets/config.json +++ b/src/assets/config.json @@ -15,7 +15,7 @@ "type": "ci", "config": { "server": "https://metrics.cleaninsights.org/cleaninsights.php", - "siteId": 14, + "siteId": 25, "timeout": 5, "persistEveryNTimes": 1, "debug": true, @@ -36,7 +36,7 @@ "type": "matomo", "config": { "server": "https://metrics.cleaninsights.org/", - "siteId": "17" + "siteId": "25" } } ] diff --git a/src/assets/css/chat.scss b/src/assets/css/chat.scss index 2c1918b..f949b52 100644 --- a/src/assets/css/chat.scss +++ b/src/assets/css/chat.scss @@ -486,9 +486,17 @@ $admin-fg: white; overflow-wrap: break-word; word-wrap: break-word; white-space: pre-wrap; + text-align: left; + + .deleted-text { + cursor: not-allowed; + font-size: 14px; + } + .edit-marker { font-size: 0.8rem; color: #888888; + margin-left: 6px; } .from-admin & { color: $admin-fg; @@ -601,8 +609,7 @@ $admin-fg: white; .avatar-operations-strut { position: relative; height: 0px; - - z-index: 1; + z-index: 10; } .message-operations { @@ -801,6 +808,10 @@ $admin-fg: white; .topic { font-family: "Inter", sans-serif; font-size: 16px; + + input { + text-align: center; + } } .created-by { diff --git a/src/assets/icons/poll.vue b/src/assets/icons/poll.vue new file mode 100644 index 0000000..e261cd1 --- /dev/null +++ b/src/assets/icons/poll.vue @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/src/assets/translations/bo.json b/src/assets/translations/bo.json index 42d9488..84158ae 100644 --- a/src/assets/translations/bo.json +++ b/src/assets/translations/bo.json @@ -3,6 +3,11 @@ "name": "འདུ་འཛོམས།", "tag_line": "འབྲེལ་མཐུད་བྱོས།" }, + "global": { + "save": "", + "password_didnot_match": "", + "password_hint": "" + }, "fallbacks": { "download_name": "ཕབ་ལེན།", "original_text": "<མ་ཡིག>", @@ -70,7 +75,8 @@ "name_room": "ཁ་བརྡ་ཁང་ལ་མིང་ཐོགས།", "room_topic": "གལ་ཏེ་འདོད་པ་ཡོད་ན། ཚོགས་པའི་སྐོར་གྱི་འགྲེལ་བཤད་ཐུང་ངུ་ཞིག་འབྲི་ཆོག", "create": "བཟོས།", - "room_name_limit_error_msg": "" + "room_name_limit_error_msg": "", + "colon_not_allowed": "" }, "menu": { "logout": "ཕྱིར་ཐོན།", @@ -105,7 +111,8 @@ "set_language": "སྐད་ཡིག་བརྗེ་སྒྱུར།", "language_description": "འདུ་འཛོམས་སྐད་ཡིག་མང་པོའི་ནང་དུ་ཡོད།", "dont_see_yours": "ཁྱེད་ཀྱི་མིང་མཐོང་གི་མི་འདུག་གམ།", - "tell_us": "ང་ཚོར་ཤོོད།" + "tell_us": "ང་ཚོར་ཤོོད།", + "display_name_required": "" }, "device_list": { "not_verified": "ར་སྤྲོད་བྱས་མི་འདུག", @@ -133,7 +140,8 @@ "purge_removing_members": "ཚོགས་མི་ཁག་ཕྱིར་འདོན།", "purge_redacting_events": "ཁ་བརྡ་གཙང་གསུབ།", "purge_set_room_state": "ཁ་བརྡ་ཁང་གི་རྣམ་པ་སྒྲིག་འགོད།", - "room_name_required": "" + "room_name_required": "", + "room_topic_required": "" }, "message": { "users_are_typing": "{count} ཚོགས་མི་ཡིས་གཏགས་བཞིན་འདུག", @@ -174,7 +182,10 @@ "user_changed_guest_access_closed": "{user} མགྲོན་པོ་ཁ་བརྡ་ཁང་དུ་འཛུལ་བཅུག་མ་སོང་།", "reply_image": "", "reply_audio_message": "", - "reply_video": "" + "reply_video": "", + "reply_poll": "", + "outgoing_message_deleted_text": "", + "incoming_message_deleted_text": "" }, "power_level": { "moderator": "མདོ་འཛིན་པ།", diff --git a/src/assets/translations/de.json b/src/assets/translations/de.json index bdd50f5..5064496 100644 --- a/src/assets/translations/de.json +++ b/src/assets/translations/de.json @@ -1,5 +1,10 @@ { "language_display_name": "Deutsch", + "global": { + "save": "", + "password_didnot_match": "", + "password_hint": "" + }, "menu": { "start_private_chat": "Private Diskussion mit diesem Benutzer", "reply": "Antworten", @@ -54,7 +59,9 @@ "user_left": "{user} hat das Gespräch verlassen", "user_joined": "{Benutzer} ist dem Gespräch beigetreten", "download_progress": "{percentage} % heruntergeladen", - "user_changed_room_name": "{user} hat den Raumnamen in {name} geändert" + "user_changed_room_name": "{user} hat den Raumnamen in {name} geändert", + "outgoing_message_deleted_text": "", + "incoming_message_deleted_text": "" }, "room": { "leave": "Verlassen", @@ -65,7 +72,8 @@ "purge_removing_members": "Entfernen von Mitgliedern", "purge_failed": "Fehler beim Bereinigen des Raums!", "room_list_rooms": "Räume", - "room_name_required": "" + "room_name_required": "", + "room_topic_required": "" }, "room_welcome": { "info": "Herzlich willkommen! Hier sind ein paar Dinge, die du über deinen Raum wissen solltest:", @@ -96,7 +104,8 @@ "next": "Nächste", "name_room": "Raum benennen", "room_topic": "Füge eine Beschreibung hinzu, wenn du möchtest", - "room_name_limit_error_msg": "" + "room_name_limit_error_msg": "", + "colon_not_allowed": "" }, "device_list": { "title": "GERÄTE", @@ -125,7 +134,8 @@ "password_old": "Altes Passwort", "password_new": "Neues Kennwort", "password_repeat": "Wiederhole das neue Passwort", - "display_name": "Anzeigename" + "display_name": "Anzeigename", + "display_name_required": "" }, "profile_info_popup": { "you_are": "Du bist", diff --git a/src/assets/translations/en.json b/src/assets/translations/en.json index 73960be..c71e254 100644 --- a/src/assets/translations/en.json +++ b/src/assets/translations/en.json @@ -4,6 +4,11 @@ "name": "Convene", "tag_line": "Simply connect" }, + "global": { + "save": "Save", + "password_didnot_match": "Password didn't match", + "password_hint": "Minimum 12 character containing atleast one numeric, one uppercase and one lowercase letter" + }, "menu": { "start_private_chat": "Private chat with this user", "reply": "Reply", @@ -63,7 +68,10 @@ "reply_image": "Image", "reply_audio_message": "Audio message", "reply_video": "Video", - "time_ago": "Today | Yesterday | {count} days ago" + "reply_poll": "Poll", + "time_ago": "Today | Yesterday | {count} days ago", + "outgoing_message_deleted_text": "You deleted this message.", + "incoming_message_deleted_text": "This message was deleted." }, "room": { "invitations": "You have no invitations | You have 1 invitation | You have {count} invitations", @@ -75,7 +83,8 @@ "purge_failed": "Failed to purge room!", "room_list_invites": "Invites", "room_list_rooms": "Rooms", - "room_name_required": "Room name is required" + "room_name_required": "Room name is required", + "room_topic_required": "Room description is required" }, "room_welcome": { "info": "Welcome! Here are a few things to know about your room:", @@ -106,7 +115,8 @@ "status_creating": "Creating room", "status_avatar_total": "Uploading avatar: {count} of {total}", "status_avatar": "Uploading avatar: {count}", - "room_name_limit_error_msg": "Maximum 50 characters allowed" + "room_name_limit_error_msg": "Maximum 50 characters allowed", + "colon_not_allowed": "Colon is not allowed" }, "device_list": { "title": "DEVICES", @@ -139,7 +149,8 @@ "password_old": "Old password", "password_new": "New password", "password_repeat": "Repeat new password", - "display_name": "Display name" + "display_name": "Display name", + "display_name_required": "Display name is required" }, "profile_info_popup": { "you_are": "You are", diff --git a/src/assets/translations/es.json b/src/assets/translations/es.json index db9243e..74b8edf 100644 --- a/src/assets/translations/es.json +++ b/src/assets/translations/es.json @@ -4,6 +4,11 @@ "name": "Convene", "tag_line": "Simplemente conectar" }, + "global": { + "save": "", + "password_didnot_match": "", + "password_hint": "" + }, "room_info": { "identity": "Has iniciado sesión como {displayName}.", "my_profile": "Mi perfil", @@ -83,7 +88,8 @@ "set_language": "Establece tu Idioma", "language_description": "Convine esta disponible en varios Idiomas.", "dont_see_yours": "¿No ves el tuyo?", - "tell_us": "Dinos." + "tell_us": "Dinos.", + "display_name_required": "" }, "login": { "login": "Iniciar sesión", @@ -122,7 +128,8 @@ "new_room": "Nueva Sala", "create": "Crear", "room_topic": "Añade una descripción si quieres", - "room_name_limit_error_msg": "" + "room_name_limit_error_msg": "", + "colon_not_allowed": "" }, "room_welcome": { "join_public": "Cualquiera puede unirse abriendo este vínculo: {link}", @@ -144,7 +151,8 @@ "purge_removing_members": "Eliminar miembros", "purge_failed": "¡Fallo en la purga de la sala!", "room_list_rooms": "Salas", - "room_name_required": "" + "room_name_required": "", + "room_topic_required": "" }, "message": { "user_powerlevel_change_from_to": "{user} de {powerOld} a {powerNew}", @@ -184,8 +192,11 @@ "reply_image": "Imagen", "reply_audio_message": "Mensaje de audio", "reply_video": "Vídeo", + "reply_poll": "", "user_changed_guest_access_closed": "{user} no has permitido que los invitados se unan a la sala", - "user_changed_guest_access_open": "{user} has permitido que los invitados se unieran a la sala" + "user_changed_guest_access_open": "{user} has permitido que los invitados se unieran a la sala", + "outgoing_message_deleted_text": "", + "incoming_message_deleted_text": "" }, "menu": { "login": "Iniciar sesión", diff --git a/src/assets/translations/fi.json b/src/assets/translations/fi.json index aba08c7..b1eb50a 100644 --- a/src/assets/translations/fi.json +++ b/src/assets/translations/fi.json @@ -1,4 +1,9 @@ { + "global": { + "save": "", + "password_didnot_match": "", + "password_hint": "" + }, "menu": { "back": "TAKAISIN", "start_private_chat": "Yksityinen keskustelu tämän käyttäjän kanssa", @@ -28,7 +33,8 @@ "add_people": "Lisää ihmisiä", "link_copied": "Linkki kopioitu!", "public_info": "Kuka tahansa, jolla on linkki", - "room_name_limit_error_msg": "" + "room_name_limit_error_msg": "", + "colon_not_allowed": "" }, "purge_room": { "n_seconds": "{seconds} sekuntia", @@ -100,12 +106,15 @@ "user_joined": "{user} liittyi keskusteluun", "file_prefix": "Tiedosto: ", "edited": "(muokattu)", - "users_are_typing": "{count} jäsentä kirjoitavat" + "users_are_typing": "{count} jäsentä kirjoitavat", + "outgoing_message_deleted_text": "", + "incoming_message_deleted_text": "" }, "room": { "leave": "Poistu", "room_list_rooms": "Huoneet", - "room_name_required": "" + "room_name_required": "", + "room_topic_required": "" }, "room_welcome": { "room_history_is": "Huoneen historia on {type}.", @@ -124,7 +133,8 @@ "set_password": "Aseta salasana", "select_language": "Kieli", "password_old": "Vanha salasana", - "display_name": "Näyttönimi" + "display_name": "Näyttönimi", + "display_name_required": "" }, "profile_info_popup": { "want_more": "Haluatko lisää?", diff --git a/src/assets/translations/fr.json b/src/assets/translations/fr.json index b4a1dad..039b4be 100644 --- a/src/assets/translations/fr.json +++ b/src/assets/translations/fr.json @@ -1,4 +1,9 @@ { + "global": { + "save": "", + "password_didnot_match": "", + "password_hint": "" + }, "menu": { "edit": "Modifier", "start_private_chat": "Discussion privée avec cet utilisateur", @@ -54,7 +59,9 @@ "room_joinrule_public": "public", "unread_messages": "Messages non lus", "users_are_typing": "{count} membres écrivent", - "room_powerlevel_change": "{user} a changé le statut de {changes}" + "room_powerlevel_change": "{user} a changé le statut de {changes}", + "outgoing_message_deleted_text": "", + "incoming_message_deleted_text": "" }, "room": { "members": "aucun membre | 1 membre | {count} membres", @@ -65,7 +72,8 @@ "room_list_invites": "Invitations", "room_list_rooms": "Salons", "purge_redacting_events": "Rédaction des évènements", - "room_name_required": "" + "room_name_required": "", + "room_topic_required": "" }, "room_welcome": { "info": "Bienvenue ! Voici quelques informations à connaître sur votre salon :", @@ -96,7 +104,8 @@ "public_info": "Quiconque avec un lien", "join_permissions_info": "Ces autorisations déterminent comment les personnes peuvent rejoindre le salon et avec quelle facilité d’autres personnes peuvent être invitées. Elles peuvent être modifiées à tout moment.", "status_creating": "Création du salon", - "room_name_limit_error_msg": "" + "room_name_limit_error_msg": "", + "colon_not_allowed": "" }, "device_list": { "title": "APPAREILS", @@ -125,7 +134,8 @@ "display_name": "Nom d’affichage", "title": "Mon profil", "set_password": "Définir un mot de passe", - "password_new": "Nouveau mot de passe" + "password_new": "Nouveau mot de passe", + "display_name_required": "" }, "profile_info_popup": { "you_are": "Vous êtes", diff --git a/src/assets/translations/it.json b/src/assets/translations/it.json index 7e2017b..f0ebd12 100644 --- a/src/assets/translations/it.json +++ b/src/assets/translations/it.json @@ -1,4 +1,9 @@ { + "global": { + "save": "", + "password_didnot_match": "", + "password_hint": "" + }, "message": { "file_prefix": "File: ", "unread_messages": "Messaggi non letti", @@ -35,7 +40,9 @@ "room_history_world_readable": "leggibile da chiunque", "room_history_shared": "leggibile da tutti i membri nella stanza", "user_is_typing": "{user} sta scrivendo", - "users_are_typing": "{count} membri stanno scrivendo" + "users_are_typing": "{count} membri stanno scrivendo", + "outgoing_message_deleted_text": "", + "incoming_message_deleted_text": "" }, "room": { "purge_removing_members": "Rimozione di membri", @@ -46,7 +53,8 @@ "purge_failed": "Impossibile pulire la stanza!", "room_list_invites": "Inviti", "room_list_rooms": "Stanze", - "room_name_required": "" + "room_name_required": "", + "room_topic_required": "" }, "menu": { "reply": "Risposta", @@ -95,7 +103,8 @@ "invite_info": "Solo le persone aggiunte", "join_permissions_info": "Questi permessi determinano come le persone possono entrare nella stanza e quanto facilmente gli altri possono essere invitati. Possono essere cambiati in qualsiasi momento.", "public_info": "Chiunque abbia un collegamento", - "room_name_limit_error_msg": "" + "room_name_limit_error_msg": "", + "colon_not_allowed": "" }, "device_list": { "title": "DISPOSITIVI", @@ -124,7 +133,8 @@ "display_name": "Nome visualizzato", "change_name": "Cambia il nome", "change_password": "Cambia la password", - "password_new": "Nuova password" + "password_new": "Nuova password", + "display_name_required": "" }, "profile_info_popup": { "you_are": "Sei", diff --git a/src/assets/translations/nb_NO.json b/src/assets/translations/nb_NO.json index 1e0342d..605675e 100644 --- a/src/assets/translations/nb_NO.json +++ b/src/assets/translations/nb_NO.json @@ -3,6 +3,11 @@ "name": "Convene", "tag_line": "" }, + "global": { + "save": "", + "password_didnot_match": "", + "password_hint": "" + }, "message": { "user_changed_guest_access_open": "{user} tillot gjester å ta del i rommet", "user_powerlevel_change_from_to": "{user} fra {powerOld} til {powerNew}", @@ -31,7 +36,10 @@ "you": "Deg", "reply_image": "", "reply_audio_message": "", - "reply_video": "" + "reply_video": "", + "reply_poll": "", + "outgoing_message_deleted_text": "", + "incoming_message_deleted_text": "" }, "device_list": { "title": "Enheter", @@ -98,7 +106,8 @@ "set_password": "Sett passord", "title": "Min profil", "display_name": "Visningsnavn", - "password_repeat": "Gjenta nytt passord" + "password_repeat": "Gjenta nytt passord", + "display_name_required": "" }, "login": { "password_required": "Passord kreves", @@ -115,7 +124,8 @@ "next": "Neste", "create": "Opprett", "new_room": "Nytt rom", - "room_name_limit_error_msg": "" + "room_name_limit_error_msg": "", + "colon_not_allowed": "" }, "room_welcome": { "room_history_is": "Romhistorikken er {type}.", @@ -128,7 +138,8 @@ "room_list_invites": "Invitasjoner", "purge_set_room_state": "Setter romtilstand", "leave": "Forlat", - "room_name_required": "" + "room_name_required": "", + "room_topic_required": "" }, "purge_room": { "n_seconds": "{seconds} sekunder", diff --git a/src/assets/translations/pt_BR.json b/src/assets/translations/pt_BR.json index 8c395dc..d990ce2 100644 --- a/src/assets/translations/pt_BR.json +++ b/src/assets/translations/pt_BR.json @@ -3,6 +3,11 @@ "name": "Convocar", "tag_line": "Basta conectar" }, + "global": { + "save": "", + "password_didnot_match": "", + "password_hint": "" + }, "invite": { "title": "Adiciona amigos", "done": "Feito", @@ -76,7 +81,10 @@ "reply_image": "Imagem", "reply_audio_message": "Mensagem de áudio", "reply_video": "Vídeo", - "time_ago": "Hoje | Ontem | {count} dias atrás" + "reply_poll": "", + "time_ago": "Hoje | Ontem | {count} dias atrás", + "outgoing_message_deleted_text": "", + "incoming_message_deleted_text": "" }, "room": { "members": "sem membros | 1 membro | {count} membros", @@ -88,7 +96,8 @@ "room_list_invites": "Convites", "room_list_rooms": "Salas", "invitations": "Você não tem convites | Você tem 1 convite | Você tem {count} convites", - "room_name_required": "" + "room_name_required": "", + "room_topic_required": "" }, "room_welcome": { "info": "Bem-vindo! Aqui estão algumas coisas que você deve saber sobre a sua sala:", @@ -119,7 +128,8 @@ "status_creating": "Criando a sala", "status_avatar_total": "Enviando o avatar: {count} de {total}", "status_avatar": "Enviando avatar: {count}", - "room_name_limit_error_msg": "O máximo de 50 caracteres são permitidos" + "room_name_limit_error_msg": "O máximo de 50 caracteres são permitidos", + "colon_not_allowed": "" }, "device_list": { "title": "DISPOSITIVOS", @@ -152,7 +162,8 @@ "password_old": "Senha antiga", "password_new": "Nova senha", "password_repeat": "Repita a nova senha", - "display_name": "Nome de exibição" + "display_name": "Nome de exibição", + "display_name_required": "" }, "profile_info_popup": { "you_are": "Você é", diff --git a/src/assets/translations/ro.json b/src/assets/translations/ro.json index d9df0b9..c6b6bee 100644 --- a/src/assets/translations/ro.json +++ b/src/assets/translations/ro.json @@ -3,6 +3,11 @@ "name": "Convene", "tag_line": "Conectați pur și simplu" }, + "global": { + "save": "", + "password_didnot_match": "", + "password_hint": "" + }, "menu": { "ok": "OK", "done": "Realizat", @@ -129,7 +134,8 @@ "change_name": "Schimbă numele", "set_password": "Setați parola", "temporary_identity": "Această identitate este temporară. Setați o parolă pentru a o utiliza din nou", - "title": "Profilul meu" + "title": "Profilul meu", + "display_name_required": "" }, "login": { "login": "Autentificare", @@ -167,7 +173,8 @@ "next": "Următorul", "create": "Creați", "new_room": "Cameră nouă", - "room_name_limit_error_msg": "" + "room_name_limit_error_msg": "", + "colon_not_allowed": "" }, "room_welcome": { "got_it": "L-am prins", @@ -188,7 +195,8 @@ "purge_set_room_state": "Setarea stării camerei", "leave": "Lăsați", "members": "fără membri | 1 membru | {count} membri", - "room_name_required": "" + "room_name_required": "", + "room_topic_required": "" }, "message": { "user_changed_guest_access_open": "{user} a permis oaspeților să intre în cameră", @@ -229,7 +237,10 @@ "you": "Tu", "reply_image": "Imagine", "reply_audio_message": "Mesaj audio", - "reply_video": "Videoclip" + "reply_video": "Videoclip", + "reply_poll": "", + "outgoing_message_deleted_text": "", + "incoming_message_deleted_text": "" }, "language_display_name": "Engleză", "fallbacks": { diff --git a/src/assets/translations/si.json b/src/assets/translations/si.json index 24ce6f4..a1de79f 100644 --- a/src/assets/translations/si.json +++ b/src/assets/translations/si.json @@ -25,7 +25,10 @@ "reply_image": "", "reply_audio_message": "", "reply_video": "", - "you": "ඔබ" + "reply_poll": "", + "you": "ඔබ", + "outgoing_message_deleted_text": "", + "incoming_message_deleted_text": "" }, "login": { "invalid_message": "" diff --git a/src/assets/translations/ug.json b/src/assets/translations/ug.json index 3bcfe4a..7e9abdf 100644 --- a/src/assets/translations/ug.json +++ b/src/assets/translations/ug.json @@ -3,6 +3,11 @@ "name": "Convene", "tag_line": "" }, + "global": { + "save": "", + "password_didnot_match": "", + "password_hint": "" + }, "language_is_rtl": true, "menu": { "ok": "تامام", @@ -62,7 +67,10 @@ "user_changed_room_history": "قوللانغۇچى» مۇنازىرەخانىنىڭ تارىخىنى قۇردى»", "reply_image": "", "reply_audio_message": "", - "reply_video": "" + "reply_video": "", + "reply_poll": "", + "outgoing_message_deleted_text": "", + "incoming_message_deleted_text": "" }, "language_display_name": "ئۇيغۇرچە", "new_room": { @@ -84,7 +92,8 @@ "next": "كېيىنكى", "create": "قۇرۇش", "new_room": "يېڭى مۇنازىرەخانا", - "room_name_limit_error_msg": "" + "room_name_limit_error_msg": "", + "colon_not_allowed": "" }, "room": { "purge_failed": "مۇنازىرەخانىنى يۇيۇش مەغلۇب بولدى!", @@ -95,7 +104,8 @@ "purge_set_room_state": "مۇنازىرەخانىنىڭ شەرتىنى قۇرۇش", "leave": "كېتىش", "members": "ئەزالار يوق | بىر ئەزا | [نەپەر] ئەزا", - "room_name_required": "" + "room_name_required": "", + "room_topic_required": "" }, "leave": { "text_public_lastroom": "ئەگەر بۇ ئۆيگە يەنە قوشۇلماقچى بولسىڭىز ، يېڭى سالاھىيەت ئاستىدا قاتناشسىڭىز بولىدۇ. {ئىشلەتكۈچى} ، {ھەرىكەت} نى ساقلاش.", @@ -220,7 +230,8 @@ "change_name": "ئىسىم ئۆزگەرتىش", "set_password": "پارول بەلگىلەڭ", "temporary_identity": "بۇ كىملىك ۋاقىتلىق. قايتا ئىشلىتىش ئۈچۈن پارول بەلگىلەڭ", - "title": "مېنىڭ ئارخىپىم" + "title": "مېنىڭ ئارخىپىم", + "display_name_required": "" }, "login": { "login": "‎كىرىش", diff --git a/src/assets/translations/zh_Hans.json b/src/assets/translations/zh_Hans.json index 570f338..f176619 100644 --- a/src/assets/translations/zh_Hans.json +++ b/src/assets/translations/zh_Hans.json @@ -3,6 +3,11 @@ "name": "Convene", "tag_line": "只需连接" }, + "global": { + "save": "", + "password_didnot_match": "", + "password_hint": "" + }, "fallbacks": { "download_name": "下载", "original_text": "<原文>", @@ -71,7 +76,8 @@ "purge_removing_members": "移除成员", "purge_redacting_events": "编辑事件", "purge_set_room_state": "设置聊天室状态", - "room_name_required": "" + "room_name_required": "", + "room_topic_required": "" }, "message": { "you": "您", @@ -112,7 +118,10 @@ "user_changed_guest_access_closed": "{user} 不允许客人加入聊天室", "reply_image": "", "reply_audio_message": "", - "reply_video": "" + "reply_video": "", + "reply_poll": "", + "outgoing_message_deleted_text": "", + "incoming_message_deleted_text": "" }, "menu": { "login": "登录", @@ -195,7 +204,8 @@ "set_language": "设置您的语言", "language_description": "Convene 提供多种语言.", "dont_see_yours": "看不到你的?", - "tell_us": "告诉我们。" + "tell_us": "告诉我们。", + "display_name_required": "" }, "new_room": { "status_avatar": "正在上传头像:{count}", @@ -217,7 +227,8 @@ "new_room": "新的聊天室", "room_topic": "如果您愿意,请添加说明", "create": "创建", - "room_name_limit_error_msg": "" + "room_name_limit_error_msg": "", + "colon_not_allowed": "" }, "room_welcome": { "got_it": "知道了", diff --git a/src/components/Chat.vue b/src/components/Chat.vue index bdf2759..43873e0 100644 --- a/src/components/Chat.vue +++ b/src/components/Chat.vue @@ -58,7 +58,7 @@
-
+
-
{{ $t("message.replying_to", { user: replyToEvent.sender.name }) }}
+
{{ $t("message.replying_to", { user: senderDisplayName }) }}
{{ replyToEvent.getContent().body | latestReply }}
{{ $t("message.reply_image") }}
{{ $t("message.reply_audio_message") }}
{{ $t("message.reply_video") }}
+
{{ $t("message.reply_poll") }}
- + + $vuetify.icons.poll
@@ -546,6 +548,9 @@ export default { }, computed: { + senderDisplayName() { + return this.room.getMember(this.replyToEvent.sender.userId).name; + }, currentUser() { return this.$store.state.auth.user; }, @@ -1227,7 +1232,7 @@ export default { addReply(event) { this.replyToEvent = event; this.$refs.messageInput.focus(); - this.replyToContentType = event.getContent().msgtype; + this.replyToContentType = event.getContent().msgtype || 'm.poll'; this.setReplyToImage(event); }, diff --git a/src/components/CreateRoom.vue b/src/components/CreateRoom.vue index 79fa4bc..3332e2a 100644 --- a/src/components/CreateRoom.vue +++ b/src/components/CreateRoom.vue @@ -52,6 +52,7 @@ :disabled="step > steps.INITIAL" autofocus solo + @update:error="updateErrorState" >
{{ $t("new_room.room_topic") }}
+
{{roomCreationErrorMsg}}
{{ status }} @@ -298,7 +300,12 @@ export default { name: "" }, enterRoomDialog: false, - roomNamerules: [v => v.length <= 50 || this.$t("new_room.room_name_limit_error_msg")], + roomNamerules: [ + v => v.length <= 50 || this.$t("new_room.room_name_limit_error_msg"), + v => !v.includes(':') || this.$t("new_room.colon_not_allowed") + ], + roomNameHasError: false, + roomCreationErrorMsg: "" }; }, @@ -318,6 +325,9 @@ export default { }, }, computed: { + isDisabled() { + return this.status ? true : this.roomName.length === 0 || this.roomName.length > 50 || this.roomNameHasError + }, roomAvatarLetter() { if (!this.roomName) { return null; @@ -337,6 +347,9 @@ export default { }, methods: { + updateErrorState(errorState) { + this.roomNameHasError = errorState + }, goBack() { if (this.step == steps.NAME_SET) { this.step = steps.INITIAL; @@ -578,10 +591,8 @@ export default { return roomId; }) .catch((error) => { - this.status = - (error.data && error.data.error) || - error.message || - error.toString(); + this.status = "" + this.roomCreationErrorMsg = (error.data && error.data.error) || error.message || error.toString(); this.step = steps.INITIAL; // revert return null; }); diff --git a/src/components/Join.vue b/src/components/Join.vue index ceed40f..0a9a762 100644 --- a/src/components/Join.vue +++ b/src/components/Join.vue @@ -381,6 +381,7 @@ export default { .then( function (ignoreduser) { console.log("Join: joining room"); + this.$analytics.event("Invitations", "Room Joined"); this.loadingMessage = this.$t("join.status_joining"); return this.$matrix.matrixClient.joinRoom(this.roomId); }.bind(this) @@ -422,6 +423,11 @@ export default { Math.floor(Math.random() * this.availableAvatars.length) ] ); + // mounted() is called more than once, so multiple instances of this event + // do not necessarily indicate a user was shown the join page more than once. + // To analyze this data, segment users into those who have an "Invitations" + // action and set up conversion tracking triggered by Room Joined (once per visit). + this.$analytics.event("Invitations", "Join Page Shown"); }, destroyed() { this.$matrix.off("Room.myMembership", this.onMyMembership); diff --git a/src/components/Profile.vue b/src/components/Profile.vue index daa30cf..69f2435 100644 --- a/src/components/Profile.vue +++ b/src/components/Profile.vue @@ -103,13 +103,25 @@ />
{{ passwordErrorMessage }} @@ -134,7 +146,7 @@ newPassword1 ) " - >{{ $t("menu.ok") }}{{ $t("global.save") }} @@ -149,7 +161,11 @@ {{ $t("profile.display_name") }} - + @@ -165,7 +181,8 @@ updateDisplayName(editValue); showEditDisplaynameDialog = false; " - >{{ $t("menu.ok") }}{{ $t("global.save") }} @@ -205,12 +222,16 @@ export default { showLogoutPopup: false, editValue: null, password: null, + showPassword1: false, + showPassword2: false, + passwordValidation: /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{12,20}$/, newPassword1: null, newPassword2: null, settingPassword: false, passwordErrorMessage: null, isAvatarLoaded: true, - loadValue: 0 + loadValue: 0, + newPasswordHasError: false }; }, @@ -253,6 +274,7 @@ export default { passwordsMatch() { return ( + !this.newPasswordHasError && this.newPassword1 && this.newPassword2 && this.newPassword1 == this.newPassword2 @@ -261,6 +283,9 @@ export default { }, methods: { + updateErrorState(errorState) { + this.newPasswordHasError = errorState + }, setPassword(oldPassword, newPassword) { this.settingPassword = true; this.passwordErrorMessage = null; diff --git a/src/components/RoomInfo.vue b/src/components/RoomInfo.vue index 3b44fc8..52fb29a 100644 --- a/src/components/RoomInfo.vue +++ b/src/components/RoomInfo.vue @@ -27,12 +27,13 @@
{{ roomName }}
-
{{ roomTopic }}
+
+ + {{ roomTopic }} + + + +
{{ $t("room_info.created_by", { user: creator }) }}
diff --git a/src/components/RoomInfoBottomSheet.vue b/src/components/RoomInfoBottomSheet.vue index 12ed076..bc529c7 100644 --- a/src/components/RoomInfoBottomSheet.vue +++ b/src/components/RoomInfoBottomSheet.vue @@ -10,7 +10,7 @@
{{$t('room_info_sheet.this_room')}}
{{ roomName }} @@ -26,7 +26,7 @@ counter="50" background-color="white" autofocus - v-if="isEditMode" + v-if="isRoomNameEditMode" maxlength="50" @blur="updateRoomName()" @keyup.enter="updateRoomName()" diff --git a/src/components/chatMixin.js b/src/components/chatMixin.js index c8d5356..970fe16 100644 --- a/src/components/chatMixin.js +++ b/src/components/chatMixin.js @@ -111,7 +111,7 @@ export default { dateForEvent(event) { return util.formatDay(event.getTs()); }, - + componentForEvent(event, isForExport = false) { switch (event.getType()) { case "m.room.member": @@ -240,6 +240,9 @@ export default { } } } + break; + case "m.room.encrypted": + return event.getSender() != this.$matrix.currentUserId ? MessageIncomingText : MessageOutgoingText } return this.debugging ? DebugEvent : null; }, diff --git a/src/components/messages/MessageIncoming.vue b/src/components/messages/MessageIncoming.vue index a345132..9c31eb3 100644 --- a/src/components/messages/MessageIncoming.vue +++ b/src/components/messages/MessageIncoming.vue @@ -15,10 +15,10 @@ -
- more_vert +
+ + more_vert +
diff --git a/src/components/messages/MessageIncomingPoll.vue b/src/components/messages/MessageIncomingPoll.vue index 8bb5166..3008f22 100644 --- a/src/components/messages/MessageIncomingPoll.vue +++ b/src/components/messages/MessageIncomingPoll.vue @@ -2,24 +2,7 @@
- - - - - - + $vuetify.icons.poll
{{ pollQuestion }}
diff --git a/src/components/messages/MessageIncomingText.vue b/src/components/messages/MessageIncomingText.vue index bb5b8cf..2a38e8d 100644 --- a/src/components/messages/MessageIncomingText.vue +++ b/src/components/messages/MessageIncomingText.vue @@ -11,10 +11,14 @@ />
- - {{ $t('edited') }} + + block + {{ $t('message.incoming_message_deleted_text')}} + + + + {{ $t('message.edited') }} +
diff --git a/src/components/messages/MessageOutgoing.vue b/src/components/messages/MessageOutgoing.vue index 11b4000..d2495eb 100644 --- a/src/components/messages/MessageOutgoing.vue +++ b/src/components/messages/MessageOutgoing.vue @@ -9,10 +9,10 @@
-
- more_vert +
+ + more_vert +
diff --git a/src/components/messages/MessageOutgoingPoll.vue b/src/components/messages/MessageOutgoingPoll.vue index d3aaaf6..779c63e 100644 --- a/src/components/messages/MessageOutgoingPoll.vue +++ b/src/components/messages/MessageOutgoingPoll.vue @@ -2,24 +2,7 @@
- - - - - - + $vuetify.icons.poll
{{ pollQuestion }}
diff --git a/src/components/messages/MessageOutgoingText.vue b/src/components/messages/MessageOutgoingText.vue index e193c6b..c775988 100644 --- a/src/components/messages/MessageOutgoingText.vue +++ b/src/components/messages/MessageOutgoingText.vue @@ -12,10 +12,14 @@
- - {{ $t('edited') }} + + block + {{ $t('message.outgoing_message_deleted_text')}} + + + + {{ $t('message.edited') }} +
diff --git a/src/components/messages/QuickReactions.vue b/src/components/messages/QuickReactions.vue index deb608b..baa69ce 100644 --- a/src/components/messages/QuickReactions.vue +++ b/src/components/messages/QuickReactions.vue @@ -29,7 +29,7 @@ export default { } }, mounted() { - this.reactions = this.timelineSet.getRelationsForEvent(this.event.getId(), 'm.annotation', 'm.reaction'); + this.reactions = this.timelineSet.relations.getChildEventsForEvent(this.event.getId(), 'm.annotation', 'm.reaction'); this.event.on("Event.relationsCreated", this.onRelationsCreated); }, beforeDestroy() { @@ -40,7 +40,7 @@ export default { }, methods: { onRelationsCreated() { - this.reactions = this.timelineSet.getRelationsForEvent(this.event.getId(), 'm.annotation', 'm.reaction'); + this.reactions = this.timelineSet.relations.getChildEventsForEvent(this.event.getId(), 'm.annotation', 'm.reaction'); }, onClickEmoji(emoji) { this.$bubble('send-quick-reaction', {reaction:emoji, event:this.event}); @@ -75,7 +75,7 @@ export default { oldValue.off('Relations.add', this.onAddRelation); } if (newValue) { - newValue.on('Relations.add', this.onAddRelation); + newValue.on('Relations.add', this.onAddRelation); } this.processReactions(); }, diff --git a/src/components/messages/pollMixin.js b/src/components/messages/pollMixin.js index 6bb073f..b1da22f 100644 --- a/src/components/messages/pollMixin.js +++ b/src/components/messages/pollMixin.js @@ -70,8 +70,8 @@ export default { // Look for poll end this.pollEndRelations = - this.timelineSet.getRelationsForEvent(this.event.getId(), "m.reference", "m.poll.end") || - this.timelineSet.getRelationsForEvent(this.event.getId(), "m.reference", "org.matrix.msc3381.poll.end"); + this.timelineSet.relations.getChildEventsForEvent(this.event.getId(), "m.reference", "m.poll.end") || + this.timelineSet.relations.getChildEventsForEvent(this.event.getId(), "m.reference", "org.matrix.msc3381.poll.end"); if (this.pollEndRelations) { const endMessages = this.pollEndRelations.getRelations() || []; if (endMessages.length > 0) { @@ -81,8 +81,8 @@ export default { // Process votes this.pollResponseRelations = - this.timelineSet.getRelationsForEvent(this.event.getId(), "m.reference", "m.poll.response") || - this.timelineSet.getRelationsForEvent(this.event.getId(), "m.reference", "org.matrix.msc3381.poll.response"); + this.timelineSet.relations.getChildEventsForEvent(this.event.getId(), "m.reference", "m.poll.response") || + this.timelineSet.relations.getChildEventsForEvent(this.event.getId(), "m.reference", "org.matrix.msc3381.poll.response"); var userVotes = {}; if (this.pollResponseRelations) { const votes = this.pollResponseRelations.getRelations() || []; diff --git a/src/components/roomInfoMixin.js b/src/components/roomInfoMixin.js index b9d17ca..cb420f5 100644 --- a/src/components/roomInfoMixin.js +++ b/src/components/roomInfoMixin.js @@ -5,8 +5,11 @@ export default { userCanChangeJoinRule: false, userCanPurgeRoom: false, editedRoomName: "", - isEditMode: false, - roomNameErrorMessage: null + isRoomNameEditMode: false, + roomNameErrorMessage: null, + editedRoomTopic: "", + isRoomTopicEditMode: false, + roomTopicErrorMessage: null, } }, mounted() { @@ -93,18 +96,32 @@ export default { methods: { onRoomNameClicked() { if(this.userCanPurgeRoom) { - this.isEditMode = !this.isEditMode; + this.isRoomNameEditMode = !this.isRoomNameEditMode; this.editedRoomName = this.roomName; } }, updateRoomName() { if(this.editedRoomName) { this.$matrix.matrixClient.setRoomName(this.room.roomId, this.editedRoomName); - this.isEditMode = !this.isEditMode; + this.isRoomNameEditMode = !this.isRoomNameEditMode; } else { this.$refs.editedRoomName.focus(); } }, + onRoomTopicClicked() { + if(this.userCanPurgeRoom) { + this.isRoomTopicEditMode = !this.isRoomTopicEditMode; + this.editedRoomTopic = this.roomTopic; + } + }, + updateRoomTopic() { + if(this.editedRoomTopic) { + this.$matrix.matrixClient.setRoomTopic(this.room.roomId, this.editedRoomTopic); + this.isRoomTopicEditMode = !this.isRoomTopicEditMode; + } else { + this.$refs.editedRoomTopic.focus(); + } + }, setRoomJoinRule(ignoredJoinRule) { // Do nothing in the general mixin, override in RoomInfo.vue }, diff --git a/src/plugins/utils.js b/src/plugins/utils.js index 91d532f..a054390 100644 --- a/src/plugins/utils.js +++ b/src/plugins/utils.js @@ -163,9 +163,11 @@ class Util { event_id: replyToEvent.getId() } } + let senderContent = replyToEvent.getContent() + const senderContentBody = Object.getOwnPropertyDescriptor(senderContent,'body') ? senderContent.body : Object.values(senderContent)[0].question.body // Prefix the content with reply info (seems to be a legacy thing) - const prefix = replyToEvent.getContent().body.split('\n').map((item, index) => { + const prefix = senderContentBody.split('\n').map((item, index) => { return "> " + (index == 0 ? ("<" + replyToEvent.getSender() + "> ") : "") + item; }).join('\n'); content.body = prefix + "\n\n" + content.body; diff --git a/src/plugins/vuetify.js b/src/plugins/vuetify.js index 0eb52db..2614652 100644 --- a/src/plugins/vuetify.js +++ b/src/plugins/vuetify.js @@ -5,6 +5,7 @@ import icPassword from '@/assets/icons/password.vue'; import icEdit from '@/assets/icons/edit.vue'; import icGlobe from '@/assets/icons/globe.vue'; import icAddReaction from '@/assets/icons/addReaction.vue'; +import icPoll from '@/assets/icons/poll.vue'; Vue.use(Vuetify); @@ -27,6 +28,9 @@ export default new Vuetify({ addReaction: { component: icAddReaction }, + poll: { + component: icPoll + }, }, user: icUser }, diff --git a/src/store/index.js b/src/store/index.js index a44857a..a4f049f 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -3,16 +3,17 @@ import Vuex from 'vuex' import VuexPersist from 'vuex-persist' Vue.use(Vuex) - +const USER = `convene_${ window.location.hostname }_user` +const SETTINGS = `convene_${ window.location.hostname }_settings` // A Vuex plugin to persist the user object to either session or local storage, based on flag in the store state. // const persistUserPlugin = store => { var user; if (store.state.useLocalStorage) { - user = JSON.parse(window.localStorage.getItem('user')); + user = JSON.parse(window.localStorage.getItem(USER)); } else { - user = JSON.parse(window.sessionStorage.getItem('user')); + user = JSON.parse(window.sessionStorage.getItem(USER)); } const initialState = user ? { status: { loggedIn: true }, user } : { status: { loggedIn: false }, user: null }; store.state.auth = initialState; @@ -20,11 +21,11 @@ const persistUserPlugin = store => { store.subscribe((mutation, state) => { if (mutation.type == 'setUser' || mutation.type == 'setUseLocalStorage') { if (state.useLocalStorage) { - window.localStorage.setItem('user', JSON.stringify(state.auth.user)); - window.sessionStorage.removeItem('user'); + window.localStorage.setItem(USER, JSON.stringify(state.auth.user)); + window.sessionStorage.removeItem(USER); } else { - window.sessionStorage.setItem('user', JSON.stringify(state.auth.user)); - window.localStorage.removeItem('user'); + window.sessionStorage.setItem(USER, JSON.stringify(state.auth.user)); + window.localStorage.removeItem(USER); } } }) @@ -32,7 +33,7 @@ const persistUserPlugin = store => { const vuexPersistLocalStorage = new VuexPersist({ - key: 'settings', + key: SETTINGS, storage: localStorage, reducer: state => { if (state.useLocalStorage) { @@ -47,7 +48,7 @@ const vuexPersistLocalStorage = new VuexPersist({ }) const vuexPersistSessionStorage = new VuexPersist({ - key: 'settings', + key: SETTINGS, storage: sessionStorage, reducer: state => { if (!state.useLocalStorage) { @@ -61,7 +62,7 @@ const vuexPersistSessionStorage = new VuexPersist({ } }) -const defaultUseSessionStorage = (sessionStorage.getItem('user') != null); +const defaultUseSessionStorage = (sessionStorage.getItem(USER) != null); export default new Vuex.Store({ state: { language: null, currentRoomId: null, auth: null, tempuser: null, useLocalStorage: !defaultUseSessionStorage },