diff --git a/app-ios/calendar/Sources/IosMobileSystemFacade.swift b/app-ios/calendar/Sources/IosMobileSystemFacade.swift index 9fd8cbbfe54..be4634c2829 100644 --- a/app-ios/calendar/Sources/IosMobileSystemFacade.swift +++ b/app-ios/calendar/Sources/IosMobileSystemFacade.swift @@ -1,4 +1,5 @@ import Contacts +import StoreKit import Foundation import StoreKit import TutanotaSharedFramework diff --git a/buildSrc/LaunchHtml.js b/buildSrc/LaunchHtml.js index 4fcf6544497..0009655bee5 100644 --- a/buildSrc/LaunchHtml.js +++ b/buildSrc/LaunchHtml.js @@ -58,7 +58,7 @@ export async function renderHtml(scripts, env) { - +
diff --git a/src/common/api/worker/invoicegen/InvoiceTexts.ts b/src/common/api/worker/invoicegen/InvoiceTexts.ts index f43a6971820..b5200b84daa 100644 --- a/src/common/api/worker/invoicegen/InvoiceTexts.ts +++ b/src/common/api/worker/invoicegen/InvoiceTexts.ts @@ -34,6 +34,7 @@ export default { yourVatId: "Your VAT identification number:", netPricesNoVatInGermany: "All prices are net prices and not subject to value added tax in Germany.", noVatInGermany: "Prices are not subject to value added tax in Germany.", + reverseChargeAffiliate: "All prices are net prices. We are liable for VAT under the reverse charge mechanism", paymentInvoiceDue1: "The payment is due 7 days after the invoice date without any deduction. Please", paymentInvoiceDue2: "transfer the grand total with reference to the invoice number to our account:", @@ -102,6 +103,7 @@ export default { yourVatId: "Ihre Umsatzsteuer-Identifikationsnummer:", netPricesNoVatInGermany: "Alle Beträge sind netto und werden nicht in Deutschland versteuert.", noVatInGermany: "Beträge werden nicht in Deutschland versteuert.", + reverseChargeAffiliate: "Alle Beträge sind netto. Die Steuerschuldnerschaft geht auf uns als Leistungsempfänger über.", quantity: "Menge", item: "Item", diff --git a/src/common/api/worker/invoicegen/PdfInvoiceGenerator.ts b/src/common/api/worker/invoicegen/PdfInvoiceGenerator.ts index b229ff11bd1..f3cf50da45d 100644 --- a/src/common/api/worker/invoicegen/PdfInvoiceGenerator.ts +++ b/src/common/api/worker/invoicegen/PdfInvoiceGenerator.ts @@ -8,7 +8,7 @@ const enum VatType { ADD_VAT = "1", VAT_INCLUDED_SHOWN = "2", VAT_INCLUDED_HIDDEN = "3", - NO_VAT_REVERSE_CHARGE = "4", + NO_VAT_CHARGE_TUTAO = "4", } const enum InvoiceType { @@ -223,7 +223,8 @@ export class PdfInvoiceGenerator { "", "", InvoiceTexts[this.languageCode].grandTotal, - this.formatInvoiceCurrency(this.invoice.grandTotal), + // in case of NO_VAT_CHARGE_TUTAO we must not show the VAT in the invoice, but we pay the taxes ourselves, so they need to be existing on the invoice + this.formatInvoiceCurrency(this.invoice.vatType == VatType.NO_VAT_CHARGE_TUTAO ? this.invoice.subTotal : this.invoice.grandTotal), ]) } @@ -239,7 +240,6 @@ export class PdfInvoiceGenerator { case VatType.VAT_INCLUDED_SHOWN: break case VatType.NO_VAT: - case VatType.NO_VAT_REVERSE_CHARGE: if (this.invoice.vatIdNumber != null) { this.doc .addText(InvoiceTexts[this.languageCode].reverseChargeVatIdNumber1) @@ -253,6 +253,19 @@ export class PdfInvoiceGenerator { this.doc.addText(InvoiceTexts[this.languageCode].netPricesNoVatInGermany) } break + case VatType.NO_VAT_CHARGE_TUTAO: + this.doc + .addText(InvoiceTexts[this.languageCode].reverseChargeAffiliate) + .addLineBreak() + .addText(InvoiceTexts[this.languageCode].reverseChargeVatIdNumber2) + if (this.invoice.vatIdNumber != null) { + this.doc + .addLineBreak() + .addText(`${InvoiceTexts[this.languageCode].yourVatId} `) + .changeFont(PDF_FONTS.BOLD, 11) + .addText(`${this.invoice.vatIdNumber}`) + } + break case VatType.VAT_INCLUDED_HIDDEN: this.doc.addText(InvoiceTexts[this.languageCode].noVatInGermany) break diff --git a/src/common/desktop/DesktopContextMenu.ts b/src/common/desktop/DesktopContextMenu.ts index a5b9820d445..51cf161f28e 100644 --- a/src/common/desktop/DesktopContextMenu.ts +++ b/src/common/desktop/DesktopContextMenu.ts @@ -1,6 +1,7 @@ import type { ContextMenuParams, Menu, WebContents } from "electron" import { lang } from "../misc/LanguageViewModel" import { WindowManager } from "./DesktopWindowManager.js" +import { client } from "../misc/ClientDetector.js" type Electron = typeof Electron.CrossProcessExports @@ -16,6 +17,12 @@ export class DesktopContextMenu { click: (_, bw) => this.getWebContents(bw)?.paste(), enabled: editFlags.canPaste, }) + const pasteWithoutFormattingItem = new this.electron.MenuItem({ + label: lang.get("pasteWithoutFormatting_action"), + accelerator: client.isMacOS ? "Cmd+Option+Shift+V" : "Ctrl+Shift+V", + click: (_, bw) => this.getWebContents(bw)?.pasteAndMatchStyle(), + enabled: editFlags.canPaste, + }) const copyItem = new this.electron.MenuItem({ label: lang.get("copy_action"), accelerator: "CmdOrCtrl+C", @@ -53,6 +60,7 @@ export class DesktopContextMenu { menu.append(cutItem) menu.append(copyLinkItem) menu.append(pasteItem) + menu.append(pasteWithoutFormattingItem) menu.append( new this.electron.MenuItem({ type: "separator", diff --git a/src/common/gui/main-styles.ts b/src/common/gui/main-styles.ts index 29a741a1f00..7fc7d635fa7 100644 --- a/src/common/gui/main-styles.ts +++ b/src/common/gui/main-styles.ts @@ -8,6 +8,7 @@ import { getContentButtonIconBackground, getElevatedBackground, getNavigationMen import { stateBgActive, stateBgFocus, stateBgHover, stateBgLike } from "./builtinThemes.js" import { FontIcons } from "./base/icons/FontIcons.js" import { DefaultAnimationTime } from "./animation/Animations.js" +import { locator } from "../api/main/CommonLocator.js" assertMainOrNode() @@ -35,6 +36,7 @@ const searchBarShadow = "0px 2px 4px rgb(0, 0, 0, 0.12)" const scrollbarWidthHeight = px(18) styles.registerStyle("main", () => { + const lightTheme = locator.themeController.getBaseTheme("light") return { "#link-tt": isElectronClient() ? { @@ -2486,6 +2488,8 @@ styles.registerStyle("main", () => { "html, body": { position: "initial", overflow: "visible !important", + color: lightTheme.content_fg, + "background-color": `${lightTheme.content_bg} !important`, }, // overwrite position "fixed" otherwise only one page will be printed. ".header-nav": { diff --git a/src/common/misc/TranslationKey.ts b/src/common/misc/TranslationKey.ts index 2d87393a889..1d7d8394b1d 100644 --- a/src/common/misc/TranslationKey.ts +++ b/src/common/misc/TranslationKey.ts @@ -1115,6 +1115,7 @@ export type TranslationKeyType = | "passwordWrongInvalid_msg" | "password_label" | "paste_action" + | "pasteWithoutFormatting_action" | "pathAlreadyExists_msg" | "payCardContactBankError_msg" | "payCardExpiredError_msg" diff --git a/src/mail-app/translations/de.ts b/src/mail-app/translations/de.ts index e4bdd70914a..ce9f746b86a 100644 --- a/src/mail-app/translations/de.ts +++ b/src/mail-app/translations/de.ts @@ -1136,6 +1136,7 @@ export default { "passwordWrongInvalid_msg": "Das Passwort ist falsch.", "password_label": "Passwort", "paste_action": "Einfügen", + "pasteWithoutFormatting_action": "Einfügen ohne Formatierung", "pathAlreadyExists_msg": "Dieser Pfad existiert bereits.", "payCardContactBankError_msg": "Leider wurde die Zahlung von deiner Bank abgelehnt. Bitte prüfe, dass die Kreditkartendaten korrekt sind, oder kontaktiere deine Bank.", "payCardExpiredError_msg": "Leider ist die Kreditkarte abgelaufen. Bitte aktualisiere deine Zahlungsdaten.", diff --git a/src/mail-app/translations/de_sie.ts b/src/mail-app/translations/de_sie.ts index 075e51e1586..737d612e67e 100644 --- a/src/mail-app/translations/de_sie.ts +++ b/src/mail-app/translations/de_sie.ts @@ -1136,6 +1136,7 @@ export default { "passwordWrongInvalid_msg": "Das Passwort ist falsch.", "password_label": "Passwort", "paste_action": "Einfügen", + "pasteWithoutFormatting_action": "Einfügen ohne Formatierung", "pathAlreadyExists_msg": "Dieser Pfad existiert bereits.", "payCardContactBankError_msg": "Leider wurde die Zahlung von Ihrer Bank abgelehnt. Bitte prüfen Sie, dass die Kreditkartendaten korrekt sind, oder kontaktieren Sie Ihre Bank.", "payCardExpiredError_msg": "Leider ist die Kreditkarte abgelaufen. Bitte aktualisieren Sie Ihre Zahlungsdaten.", diff --git a/src/mail-app/translations/en.ts b/src/mail-app/translations/en.ts index 24e2d093b05..bd30c7c9ae5 100644 --- a/src/mail-app/translations/en.ts +++ b/src/mail-app/translations/en.ts @@ -1132,6 +1132,7 @@ export default { "passwordWrongInvalid_msg": "Your password is wrong.", "password_label": "Password", "paste_action": "Paste", + "pasteWithoutFormatting_action": "Paste without formatting", "pathAlreadyExists_msg": "This path already exists.", "payCardContactBankError_msg": "Sorry, the payment transaction was rejected by your bank. Please make sure that your credit card details are correct or contact your bank.", "payCardExpiredError_msg": "Sorry, the credit card has expired. Please update your payment details.", @@ -1831,6 +1832,12 @@ export default { "yourCalendars_label": "Your calendars", "yourFolders_action": "YOUR FOLDERS", "yourMessage_label": "Your message", - "you_label": "You" + "you_label": "You", + "ratingHowAreWeDoing_title": "How are we doing?", + "ratingExplanation_msg": "Whether you love us or feel we could be doing better, let us know!", + "ratingLoveIt_label": "Love it!", + "dontAskAgain_label": "Don't ask again", + "ratingNeedsWork_label": "Needs work", + "notNow_label": "Not now" } }