This commit is contained in:
the-djmaze 2023-05-09 12:07:07 +02:00
parent 216b5964d7
commit 13abe74a31
41 changed files with 219 additions and 116 deletions

View file

@ -19,6 +19,14 @@
height: 100%; height: 100%;
} }
.tabs {
height: 100%;
}
.tabs > label > * + * {
margin-left: 0.5em;
}
.textAreaParent, .attachmentAreaParent { .textAreaParent, .attachmentAreaParent {
height: 100%; height: 100%;
min-height: 200px; min-height: 200px;

View file

@ -317,7 +317,7 @@ export class ComposePopupView extends AbstractViewPopup {
attachmentsInProcess: () => this.attachments.filter(item => item && !item.complete()), attachmentsInProcess: () => this.attachments.filter(item => item && !item.complete()),
attachmentsInError: () => this.attachments.filter(item => item?.error()), attachmentsInError: () => this.attachments.filter(item => item?.error()),
attachmentsCount: () => this.attachments.length, attachmentsCount: () => this.attachments().length,
attachmentsInErrorCount: () => this.attachmentsInError.length, attachmentsInErrorCount: () => this.attachmentsInError.length,
attachmentsInProcessCount: () => this.attachmentsInProcess.length, attachmentsInProcessCount: () => this.attachmentsInProcess.length,
isDraftFolderMessage: () => this.draftsFolder() && this.draftUid(), isDraftFolderMessage: () => this.draftsFolder() && this.draftUid(),
@ -390,6 +390,41 @@ export class ComposePopupView extends AbstractViewPopup {
if (this.attachmentsInProcessError() && arrayLength(value)) { if (this.attachmentsInProcessError() && arrayLength(value)) {
this.attachmentsInProcessError(false); this.attachmentsInProcessError(false);
} }
},
viewArea: value => {
if (!this.mailvelope && 'mailvelope' == value) {
/**
* Creates an iframe with an editor for a new encrypted mail.
* The iframe will be injected into the container identified by selector.
* https://mailvelope.github.io/mailvelope/Editor.html
*/
let text = this.oEditor.getData(),
encrypted = PgpUserStore.isEncrypted(text),
size = SettingsGet('phpUploadSizes')['post_max_size'],
quota = pInt(size);
switch (size.slice(-1)) {
case 'G': quota *= 1024; // fallthrough
case 'M': quota *= 1024; // fallthrough
case 'K': quota *= 1024;
}
// Issue: can't select signing key
// this.pgpSign(this.pgpSign() || confirm('Sign this message?'));
mailvelope.createEditorContainer('#mailvelope-editor', PgpUserStore.mailvelopeKeyring, {
// https://mailvelope.github.io/mailvelope/global.html#EditorContainerOptions
quota: Math.max(2048, (quota / 1024)) - 48, // (text + attachments) limit in kilobytes
armoredDraft: encrypted ? text : '', // Ascii Armored PGP Text Block
predefinedText: encrypted ? '' : (this.oEditor.isHtml() ? htmlToPlain(text) : text),
/*
quotedMail: '', // Ascii Armored PGP Text Block mail that should be quoted
quotedMailIndent: true, // if true the quoted mail will be indented (default: true)
quotedMailHeader: '', // header to be added before the quoted mail
keepAttachments: false, // add attachments of quotedMail to editor (default: false)
// Issue: can't select signing key
signMsg: this.pgpSign()
*/
}).then(editor => this.mailvelope = editor);
}
} }
}); });
@ -1276,41 +1311,6 @@ export class ComposePopupView extends AbstractViewPopup {
this.dropMailvelope(); this.dropMailvelope();
} }
mailvelopeArea() {
if (!this.mailvelope) {
/**
* Creates an iframe with an editor for a new encrypted mail.
* The iframe will be injected into the container identified by selector.
* https://mailvelope.github.io/mailvelope/Editor.html
*/
let text = this.oEditor.getData(),
encrypted = PgpUserStore.isEncrypted(text),
size = SettingsGet('phpUploadSizes')['post_max_size'],
quota = pInt(size);
switch (size.slice(-1)) {
case 'G': quota *= 1024; // fallthrough
case 'M': quota *= 1024; // fallthrough
case 'K': quota *= 1024;
}
// Issue: can't select signing key
// this.pgpSign(this.pgpSign() || confirm('Sign this message?'));
mailvelope.createEditorContainer('#mailvelope-editor', PgpUserStore.mailvelopeKeyring, {
// https://mailvelope.github.io/mailvelope/global.html#EditorContainerOptions
quota: Math.max(2048, (quota / 1024)) - 48, // (text + attachments) limit in kilobytes
armoredDraft: encrypted ? text : '', // Ascii Armored PGP Text Block
predefinedText: encrypted ? '' : (this.oEditor.isHtml() ? htmlToPlain(text) : text),
/*
quotedMail: '', // Ascii Armored PGP Text Block mail that should be quoted
quotedMailIndent: true, // if true the quoted mail will be indented (default: true)
quotedMailHeader: '', // header to be added before the quoted mail
keepAttachments: false, // add attachments of quotedMail to editor (default: false)
// Issue: can't select signing key
signMsg: this.pgpSign()
*/
}).then(editor => this.mailvelope = editor);
}
this.viewArea('mailvelope');
}
attachmentsArea() { attachmentsArea() {
this.viewArea('attachments'); this.viewArea('attachments');
} }

View file

@ -38,7 +38,9 @@
"NO": "لا", "NO": "لا",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "الافتراضي", "DEFAULT": "الافتراضي",
"HELP": "المساعدة" "HELP": "المساعدة",
"TEXT": "النص",
"ATTACHMENTS": "الملحقات"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "تسيجيل الدخول", "LABEL_LOGIN": "تسيجيل الدخول",

View file

@ -38,7 +38,9 @@
"NO": "Не", "NO": "Не",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "по подразбиране", "DEFAULT": "по подразбиране",
"HELP": "Помощ" "HELP": "Помощ",
"TEXT": "Текст",
"ATTACHMENTS": "Прикрепени файлове"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Логин", "LABEL_LOGIN": "Логин",

View file

@ -38,7 +38,9 @@
"NO": "Ne", "NO": "Ne",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "výchozí", "DEFAULT": "výchozí",
"HELP": "Nápověda" "HELP": "Nápověda",
"TEXT": "Text",
"ATTACHMENTS": "Přílohy"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Uživatelské jméno", "LABEL_LOGIN": "Uživatelské jméno",

View file

@ -38,7 +38,9 @@
"NO": "Nej", "NO": "Nej",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "standard", "DEFAULT": "standard",
"HELP": "Hjælp" "HELP": "Hjælp",
"TEXT": "Tekst",
"ATTACHMENTS": "Vedhæftninger"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Brugernavn", "LABEL_LOGIN": "Brugernavn",

View file

@ -38,7 +38,9 @@
"NO": "Nein", "NO": "Nein",
"INACTIVE": "Inaktiv", "INACTIVE": "Inaktiv",
"DEFAULT": "Standard", "DEFAULT": "Standard",
"HELP": "Hilfe" "HELP": "Hilfe",
"TEXT": "Text",
"ATTACHMENTS": "Anhänge"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Anmeldung", "LABEL_LOGIN": "Anmeldung",

View file

@ -38,7 +38,9 @@
"NO": "Όχι", "NO": "Όχι",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "default", "DEFAULT": "default",
"HELP": "Βοήθεια" "HELP": "Βοήθεια",
"TEXT": "Κείμενο",
"ATTACHMENTS": "Συνημμένα"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Είσοδος", "LABEL_LOGIN": "Είσοδος",

View file

@ -38,7 +38,9 @@
"NO": "No", "NO": "No",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "default", "DEFAULT": "default",
"HELP": "Help" "HELP": "Help",
"TEXT": "Text",
"ATTACHMENTS": "Attachments"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Login", "LABEL_LOGIN": "Login",

View file

@ -38,7 +38,9 @@
"NO": "No", "NO": "No",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "default", "DEFAULT": "default",
"HELP": "Help" "HELP": "Help",
"TEXT": "Text",
"ATTACHMENTS": "Attachments"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Login", "LABEL_LOGIN": "Login",

View file

@ -38,7 +38,9 @@
"NO": "No", "NO": "No",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "predeterminado", "DEFAULT": "predeterminado",
"HELP": "Ayuda" "HELP": "Ayuda",
"TEXT": "Texto",
"ATTACHMENTS": "Adjuntos"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Login", "LABEL_LOGIN": "Login",

View file

@ -38,7 +38,9 @@
"NO": "Ei", "NO": "Ei",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "vaikimisi", "DEFAULT": "vaikimisi",
"HELP": "Abi" "HELP": "Abi",
"TEXT": "Tekst",
"ATTACHMENTS": "Manused"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Logi sisse", "LABEL_LOGIN": "Logi sisse",

View file

@ -38,7 +38,9 @@
"NO": "Ez", "NO": "Ez",
"INACTIVE": "Inaktibo", "INACTIVE": "Inaktibo",
"DEFAULT": "lehenetsia", "DEFAULT": "lehenetsia",
"HELP": "Laguntza" "HELP": "Laguntza",
"TEXT": "Testua",
"ATTACHMENTS": "Eranskinak"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Login", "LABEL_LOGIN": "Login",

View file

@ -38,7 +38,9 @@
"NO": "خیر", "NO": "خیر",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "پیش‌فرض", "DEFAULT": "پیش‌فرض",
"HELP": "راهنما" "HELP": "راهنما",
"TEXT": "متن",
"ATTACHMENTS": "پیوست‌ها"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "ورود", "LABEL_LOGIN": "ورود",

View file

@ -38,7 +38,9 @@
"NO": "Ei", "NO": "Ei",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "oletus", "DEFAULT": "oletus",
"HELP": "Ohje" "HELP": "Ohje",
"TEXT": "Teksti",
"ATTACHMENTS": "Liite"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Tunnus", "LABEL_LOGIN": "Tunnus",

View file

@ -38,7 +38,9 @@
"NO": "Non", "NO": "Non",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "défaut", "DEFAULT": "défaut",
"HELP": "Aide" "HELP": "Aide",
"TEXT": "Texte",
"ATTACHMENTS": "Pièces jointes"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Identifiant", "LABEL_LOGIN": "Identifiant",

View file

@ -38,7 +38,9 @@
"NO": "Nem", "NO": "Nem",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "default", "DEFAULT": "default",
"HELP": "Súgó" "HELP": "Súgó",
"TEXT": "Szöveg",
"ATTACHMENTS": "Mellékletek"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Bejelentkezés", "LABEL_LOGIN": "Bejelentkezés",

View file

@ -38,7 +38,9 @@
"NO": "Tidak", "NO": "Tidak",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "Bawaan", "DEFAULT": "Bawaan",
"HELP": "Bantuan" "HELP": "Bantuan",
"TEXT": "Teks",
"ATTACHMENTS": "Lampiran"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Login", "LABEL_LOGIN": "Login",

View file

@ -38,7 +38,9 @@
"NO": "Nei", "NO": "Nei",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "sjálfgefið", "DEFAULT": "sjálfgefið",
"HELP": "Hjálp" "HELP": "Hjálp",
"TEXT": "Texti",
"ATTACHMENTS": "Viðhengi"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Innskráning", "LABEL_LOGIN": "Innskráning",

View file

@ -38,7 +38,9 @@
"NO": "No", "NO": "No",
"INACTIVE": "Inattivo", "INACTIVE": "Inattivo",
"DEFAULT": "predefinito", "DEFAULT": "predefinito",
"HELP": "Aiuto" "HELP": "Aiuto",
"TEXT": "Messaggio",
"ATTACHMENTS": "Allegati"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Login", "LABEL_LOGIN": "Login",

View file

@ -38,7 +38,9 @@
"NO": "いいえ", "NO": "いいえ",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "デフォルト", "DEFAULT": "デフォルト",
"HELP": "ヘルプ" "HELP": "ヘルプ",
"TEXT": "キーワード",
"ATTACHMENTS": "添付ファイル"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "ログイン", "LABEL_LOGIN": "ログイン",

View file

@ -38,7 +38,9 @@
"NO": "아니요", "NO": "아니요",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "default", "DEFAULT": "default",
"HELP": "도움말" "HELP": "도움말",
"TEXT": "본문",
"ATTACHMENTS": "첨부파일"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "아이디", "LABEL_LOGIN": "아이디",

View file

@ -38,7 +38,9 @@
"NO": "Ne", "NO": "Ne",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "numatytasis", "DEFAULT": "numatytasis",
"HELP": "Pagalba" "HELP": "Pagalba",
"TEXT": "Laiško Tekstas",
"ATTACHMENTS": "Priedai"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Prisijungimo vardas", "LABEL_LOGIN": "Prisijungimo vardas",

View file

@ -38,7 +38,9 @@
"NO": "Nē", "NO": "Nē",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "default", "DEFAULT": "default",
"HELP": "Palīdzība" "HELP": "Palīdzība",
"TEXT": "Teksts",
"ATTACHMENTS": "Pielikumi"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Ielogoties", "LABEL_LOGIN": "Ielogoties",

View file

@ -38,7 +38,9 @@
"NO": "Nei", "NO": "Nei",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "Standard", "DEFAULT": "Standard",
"HELP": "Hjelp" "HELP": "Hjelp",
"TEXT": "Tekst",
"ATTACHMENTS": "Vedlegg"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Logg inn", "LABEL_LOGIN": "Logg inn",

View file

@ -38,7 +38,9 @@
"NO": "Nee", "NO": "Nee",
"INACTIVE": "Inactief", "INACTIVE": "Inactief",
"DEFAULT": "standaard", "DEFAULT": "standaard",
"HELP": "Help" "HELP": "Help",
"TEXT": "Tekst",
"ATTACHMENTS": "Bijlagen"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Inlognaam", "LABEL_LOGIN": "Inlognaam",

View file

@ -38,7 +38,9 @@
"NO": "Nie", "NO": "Nie",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "domyślna", "DEFAULT": "domyślna",
"HELP": "Pomoc" "HELP": "Pomoc",
"TEXT": "Tekst",
"ATTACHMENTS": "Załączniki"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Login", "LABEL_LOGIN": "Login",

View file

@ -38,7 +38,9 @@
"NO": "Não", "NO": "Não",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "padrão", "DEFAULT": "padrão",
"HELP": "Ajuda" "HELP": "Ajuda",
"TEXT": "Texto",
"ATTACHMENTS": "Anexos"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Usuário", "LABEL_LOGIN": "Usuário",

View file

@ -38,7 +38,9 @@
"NO": "Não", "NO": "Não",
"INACTIVE": "Inativo", "INACTIVE": "Inativo",
"DEFAULT": "predefinida", "DEFAULT": "predefinida",
"HELP": "Ajuda" "HELP": "Ajuda",
"TEXT": "Texto",
"ATTACHMENTS": "Anexos"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Utilizador", "LABEL_LOGIN": "Utilizador",

View file

@ -38,7 +38,9 @@
"NO": "Não", "NO": "Não",
"INACTIVE": "Inativo", "INACTIVE": "Inativo",
"DEFAULT": "predefinida", "DEFAULT": "predefinida",
"HELP": "Ajuda" "HELP": "Ajuda",
"TEXT": "Texto",
"ATTACHMENTS": "Anexos"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Utilizador", "LABEL_LOGIN": "Utilizador",

View file

@ -38,7 +38,9 @@
"NO": "Nu", "NO": "Nu",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "default", "DEFAULT": "default",
"HELP": "Help" "HELP": "Help",
"TEXT": "Conținut",
"ATTACHMENTS": "Atașament"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Conectare", "LABEL_LOGIN": "Conectare",

View file

@ -38,7 +38,9 @@
"NO": "Нет", "NO": "Нет",
"INACTIVE": "Неактивно", "INACTIVE": "Неактивно",
"DEFAULT": "По умолчанию", "DEFAULT": "По умолчанию",
"HELP": "Помощь" "HELP": "Помощь",
"TEXT": "Текст",
"ATTACHMENTS": "Файлы"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Логин", "LABEL_LOGIN": "Логин",
@ -393,7 +395,7 @@
"LAYOUT_NO_SPLIT": "Одна панель", "LAYOUT_NO_SPLIT": "Одна панель",
"LAYOUT_VERTICAL_SPLIT": "Вертикальные панели", "LAYOUT_VERTICAL_SPLIT": "Вертикальные панели",
"LAYOUT_HORIZONTAL_SPLIT": "Горизонтальные панели", "LAYOUT_HORIZONTAL_SPLIT": "Горизонтальные панели",
"SHOW_NEXT_MESSAGE": "Перейти к следующему сообщению после удаления/перемещения текущего", "SHOW_NEXT_MESSAGE": "Перейти к следующему сообщению после удаления\/перемещения текущего",
"EDITOR": "Редактор текста по умолчанию", "EDITOR": "Редактор текста по умолчанию",
"EDITOR_HTML": "Форматированный", "EDITOR_HTML": "Форматированный",
"EDITOR_PLAIN": "Простой", "EDITOR_PLAIN": "Простой",

View file

@ -38,7 +38,9 @@
"NO": "Nie", "NO": "Nie",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "default", "DEFAULT": "default",
"HELP": "Pomoc" "HELP": "Pomoc",
"TEXT": "Text",
"ATTACHMENTS": "Prílohy"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Používateľské meno", "LABEL_LOGIN": "Používateľské meno",

View file

@ -38,7 +38,9 @@
"NO": "Ne", "NO": "Ne",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "privzeto", "DEFAULT": "privzeto",
"HELP": "Pomoč" "HELP": "Pomoč",
"TEXT": "Besedilo",
"ATTACHMENTS": "Priloge"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Prijava", "LABEL_LOGIN": "Prijava",

View file

@ -38,7 +38,9 @@
"NO": "Nej", "NO": "Nej",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "standard", "DEFAULT": "standard",
"HELP": "Hjälp" "HELP": "Hjälp",
"TEXT": "Text",
"ATTACHMENTS": "Bilagor"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Användarnamn", "LABEL_LOGIN": "Användarnamn",

View file

@ -38,7 +38,9 @@
"NO": "Hayır", "NO": "Hayır",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "default", "DEFAULT": "default",
"HELP": "Yardım" "HELP": "Yardım",
"TEXT": "Metin",
"ATTACHMENTS": "Ekler"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Giriş", "LABEL_LOGIN": "Giriş",

View file

@ -38,7 +38,9 @@
"NO": "Ні", "NO": "Ні",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "default", "DEFAULT": "default",
"HELP": "Допомога" "HELP": "Допомога",
"TEXT": "Текст",
"ATTACHMENTS": "Файли"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Логін", "LABEL_LOGIN": "Логін",

View file

@ -38,7 +38,9 @@
"NO": "Không", "NO": "Không",
"INACTIVE": "Inactive", "INACTIVE": "Inactive",
"DEFAULT": "mặc định", "DEFAULT": "mặc định",
"HELP": "Hỗ trợ" "HELP": "Hỗ trợ",
"TEXT": "Nội dung trong mail",
"ATTACHMENTS": "Phần đính kèm"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "Đăng nhập", "LABEL_LOGIN": "Đăng nhập",

View file

@ -38,7 +38,9 @@
"NO": "否", "NO": "否",
"INACTIVE": "不生效", "INACTIVE": "不生效",
"DEFAULT": "默认", "DEFAULT": "默认",
"HELP": "帮助" "HELP": "帮助",
"TEXT": "内容",
"ATTACHMENTS": "附件"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "登录", "LABEL_LOGIN": "登录",

View file

@ -38,7 +38,9 @@
"NO": "否", "NO": "否",
"INACTIVE": "閒置中", "INACTIVE": "閒置中",
"DEFAULT": "預設", "DEFAULT": "預設",
"HELP": "協助" "HELP": "協助",
"TEXT": "內文",
"ATTACHMENTS": "附件"
}, },
"LOGIN": { "LOGIN": {
"LABEL_LOGIN": "登入", "LABEL_LOGIN": "登入",

View file

@ -135,24 +135,7 @@
</tr> </tr>
</table> </table>
<div style="display:flex"> <div style="display:flex">
<div class="btn-group" style="flex-grow:1" id="area-toggle"> <div class="btn-group" style="flex-grow:1"></div>
<button type="button" class="btn" data-bind="click: bodyArea,
css: { 'active': 'body' == viewArea() }">
<i class="icon-file-text"></i>
</button>
<button type="button" class="btn" data-bind="click: attachmentsArea,
css: { 'btn-danger': attachmentsInErrorCount(), 'active': 'attachments' == viewArea() },
tooltipErrorTip: attachmentsErrorTooltip">
<span data-bind="visible: attachmentsCount()">
<b data-bind="text: attachmentsCount"></b>
&nbsp;&nbsp;
</span>
<i data-bind="css: { 'icon-attachment': !attachmentsInProcessCount(), 'icon-spinner': attachmentsInProcessCount()}"></i>
</button>
<button type="button" class="btn" data-bind="visible: canMailvelope, click: mailvelopeArea, css: { 'active': 'mailvelope' == viewArea() }">
<i class="mailvelope-icon"></i>
</button>
</div>
<div class="btn-group"> <div class="btn-group">
<a class="btn fontastic" data-bind="click: togglePgpSign, visible: canPgpSign, css: {'btn-success': pgpSign()}" data-i18n="[title]OPENPGP/LABEL_SIGN"> <a class="btn fontastic" data-bind="click: togglePgpSign, visible: canPgpSign, css: {'btn-success': pgpSign()}" data-i18n="[title]OPENPGP/LABEL_SIGN">
@ -170,7 +153,34 @@
</div> </div>
</div> </div>
<div class="attachmentAreaParent" data-bind="visible: 'attachments' == viewArea()"> <div class="tabs">
<input type="radio" name="tabs" value="body" id="tab-body" data-bind="checked: viewArea">
<label for="tab-body"
role="tab"
aria-selected="true"
aria-controls="panel1"
tabindex="0">
<i class="icon-file-text"></i>
<span data-i18n="GLOBAL/TEXT"></span>
</label>
<div class="tab-content" role="tabpanel" aria-hidden="false" style="grid-column-end:4">
<div class="textAreaParent" data-bind="initDom: editorArea, attr:{spellcheck:allowSpellcheck()?'true':'false'}"></div>
</div>
<input type="radio" name="tabs" value="attachments" id="tab-attachments" data-bind="checked: viewArea">
<label for="tab-attachments"
role="tab"
aria-selected="false"
aria-controls="panel2"
tabindex="0"
data-bind="
css: { 'btn-danger': attachmentsInErrorCount() },
tooltipErrorTip: attachmentsErrorTooltip">
<b data-bind="visible: attachmentsCount, text: attachmentsCount"></b>
<i data-bind="css: { 'icon-attachment': !attachmentsInProcessCount(), 'icon-spinner': attachmentsInProcessCount()}"></i>
<span data-i18n="GLOBAL/ATTACHMENTS"></span>
</label>
<div class="tab-content attachmentAreaParent" role="tabpanel" aria-hidden="true" style="grid-column-end:4">
<div class="b-attachment-place" data-bind="visible: addAttachmentEnabled() && dragAndDropVisible(), css: {'dragAndDropOver': dragAndDropOver}" <div class="b-attachment-place" data-bind="visible: addAttachmentEnabled() && dragAndDropVisible(), css: {'dragAndDropOver': dragAndDropOver}"
data-i18n="COMPOSE/ATTACH_DROP_FILES_DESC"></div> data-i18n="COMPOSE/ATTACH_DROP_FILES_DESC"></div>
<ul class="attachmentList" data-bind="foreach: attachments"> <ul class="attachmentList" data-bind="foreach: attachments">
@ -191,7 +201,16 @@
data-i18n="COMPOSE/NO_ATTACHMENTS_HERE_DESC"></div> data-i18n="COMPOSE/NO_ATTACHMENTS_HERE_DESC"></div>
</div> </div>
<div class="textAreaParent" data-bind="visible: 'body' == viewArea(), initDom: editorArea, attr:{spellcheck:allowSpellcheck()?'true':'false'}"></div> <input type="radio" name="tabs" value="mailvelope" id="tab-mailvelope" data-bind="checked: viewArea">
<label for="tab-mailvelope"
<div class="textAreaParent" id="mailvelope-editor" data-bind="visible: 'mailvelope' == viewArea()"></div> role="tab"
aria-selected="false"
aria-controls="panel3"
tabindex="0"
data-bind="visible: canMailvelope">
<i class="mailvelope-icon"></i>
<span>Mailvelope</span>
</label>
<div class="tab-content textAreaParent" id="mailvelope-editor" role="tabpanel" aria-hidden="true" style="grid-column-end:4" data-bind="visible: canMailvelope"></div>
</div>
</div> </div>