Move files to new folder structure

Co-authored-by: @rih-tutao
This commit is contained in:
wrd 2024-07-01 17:56:41 +02:00
parent 28bb9b2cc8
commit 8ab3b14edd
1115 changed files with 4265 additions and 4281 deletions

View file

@ -118,7 +118,7 @@ export async function buildDesktop({ dirname, version, platform, architecture, u
async function rollupDesktop(dirname, outDir, version, platform, architecture, disableMinify) {
platform = getCanonicalPlatformName(platform)
const mainBundle = await rollup({
input: [path.join(dirname, "src/desktop/DesktopMain.ts"), path.join(dirname, "src/desktop/sqlworker.ts")],
input: [path.join(dirname, "src/common/desktop/DesktopMain.ts"), path.join(dirname, "src/desktop/sqlworker.ts")],
// some transitive dep of a transitive dev-dep requires https://www.npmjs.com/package/url
// which rollup for some reason won't distinguish from the node builtin.
external: ["url", "util", "path", "fs", "os", "http", "https", "crypto", "child_process", "electron"],

View file

@ -97,7 +97,7 @@ importScripts("./worker.js")
const { esbuildWasmLoader } = await import("@tutao/tuta-wasm-loader")
await esbuild({
// Using named entry points so that it outputs build/worker.js and not build/api/worker/worker.js
entryPoints: { app: "src/app.ts", worker: "src/api/worker/worker.ts" },
entryPoints: { app: "src/app.ts", worker: "src/common/api/worker/worker.ts" },
outdir: "./build/",
// Why bundle at the moment:
// - We need to include all the imports: everything in src + libs. We could use wildcard in the future.

View file

@ -143,7 +143,7 @@ export function getChunkName(moduleId, { getModuleInfo }) {
// squire is most often used with mail editor and they are both not too big so we merge them
return "mail-editor"
} else if (
isIn("src/api/main") ||
isIn("src/common/api/main") ||
isIn("src/mail/model") ||
isIn("src/contacts/model") ||
isIn("src/search/model") ||
@ -180,8 +180,8 @@ export function getChunkName(moduleId, { getModuleInfo }) {
} else if (isIn("src/login")) {
return "login"
} else if (
isIn("src/api/common") ||
isIn("src/api/entities") ||
isIn("src/common/api/common") ||
isIn("src/common/api/entities") ||
isIn("src/desktop/config/ConfigKeys") ||
moduleId.includes("cborg") ||
isIn("src/offline") ||
@ -206,17 +206,17 @@ export function getChunkName(moduleId, { getModuleInfo }) {
return "settings"
} else if (isIn("src/sharing")) {
return "sharing"
} else if (isIn("src/api/worker/facades/lazy")) {
} else if (isIn("src/common/api/worker/facades/lazy")) {
// things that are not used for login and are generally accessed occasionally
return "worker-lazy"
} else if (isIn("src/api/worker/search")) {
} else if (isIn("src/common/api/worker/search")) {
// things related to indexer or search
return "worker-search"
} else if (isIn("src/api/worker/Urlifier") || isIn("libs/linkify") || isIn("libs/linkify-html")) {
} else if (isIn("src/common/api/worker/Urlifier") || isIn("libs/linkify") || isIn("libs/linkify-html")) {
return "linkify"
} else if (isIn("src/api/worker/pdf") || isIn("src/api/worker/invoicegen")) {
} else if (isIn("src/common/api/worker/pdf") || isIn("src/common/api/worker/invoicegen")) {
return "invoice"
} else if (isIn("src/api/worker") || isIn("packages/tutanota-crypto") || moduleId.includes("argon2")) {
} else if (isIn("src/common/api/worker") || isIn("packages/tutanota-crypto") || moduleId.includes("argon2")) {
return "worker" // avoid that crypto stuff is only put into native
} else if (isIn("libs/jszip")) {
return "jszip"

View file

@ -68,7 +68,7 @@ export async function buildWebapp({ version, stage, host, measure, minify, proje
console.log("started bundling", measure())
const bundle = await rollup({
input: ["src/app.ts", "src/api/worker/worker.ts"],
input: ["src/app.ts", "src/common/api/worker/worker.ts"],
preserveEntrySignatures: false,
perf: true,
plugins: [
@ -236,7 +236,7 @@ function analyzer(projectDir) {
console.log(fileName, "", info.code.length / 1024 + "K")
for (const module of Object.keys(info.modules)) {
if (module.includes("src/api/entities")) {
if (module.includes("src/common/api/entities")) {
continue
}
const moduleName = module.startsWith(prefix) ? module.substring(prefix.length) : module

View file

@ -12,8 +12,8 @@ if (fileURLToPath(import.meta.url) === process.argv[1]) {
* Check that there is a developer defined offline database migration for the most recent incompatible model version change
*/
export async function checkOfflineDatabaseMigrations() {
const MIGRATIONS_DIRECTORY = "src/api/worker/offline/migrations"
const MIGRATOR_PATH = "src/api/worker/offline/OfflineStorageMigrator.ts"
const MIGRATIONS_DIRECTORY = "src/common/api/worker/offline/migrations"
const MIGRATOR_PATH = "src/common/api/worker/offline/OfflineStorageMigrator.ts"
const schemas = await globby("schemas/*.json")

View file

@ -32,7 +32,7 @@ export const ${app}${version}: OfflineMigration = {
\t}
}
`.trimStart()
const outputName = path.resolve(`./src/api/worker/offline/migrations/${app}-v${version}.ts`)
const outputName = path.resolve(`./src/common/api/worker/offline/migrations/${app}-v${version}.ts`)
if (await fileExists(outputName)) {
console.error("That migration already exists!")

View file

@ -63,9 +63,9 @@ function makeNewVersion(currentVersion) {
* @returns {number[]}
*/
function readModelVersions() {
const appNames = fs.readdirSync("./src/api/entities/")
const appNames = fs.readdirSync("./src/common/api/entities/")
return appNames.map((appName) => {
const modelInfoString = fs.readFileSync(`./src/api/entities/${appName}/ModelInfo.ts`, { encoding: "utf8" })
const modelInfoString = fs.readFileSync(`./src/common/api/entities/${appName}/ModelInfo.ts`, { encoding: "utf8" })
const versionPrefix = "version:"
const versionNumberStart = modelInfoString.indexOf(versionPrefix) + versionPrefix.length
const version = modelInfoString.substring(versionNumberStart, modelInfoString.indexOf(",", versionNumberStart))

View file

@ -44,11 +44,11 @@ contains most of the logic for server communication, encryption, indexing etc.
### Communication
Worker, main thread & apps communicate through the messages. Protocol is described in the
[RemoteMessageDispatcher](../src/api/common/MessageDispatcher.js). See [WorkerClient](../src/api/main/WorkerClient.js)
[RemoteMessageDispatcher](../src/common/api/common/MessageDispatcher.js). See [WorkerClient](../src/common/api/main/WorkerClient.js)
and
[WorkerImpl](../src/api/worker/WorkerImpl.js) for the client and server part.
[WorkerImpl](../src/common/api/worker/WorkerImpl.js) for the client and server part.
Native code communicates through the [NativeInterface](../src/native/common/NativeInterface.js).
Native code communicates through the [NativeInterface](../src/common/native/common/NativeInterface.js).
### UI code
@ -92,11 +92,11 @@ One level below `EntityWorker` lays `EntityRestInterface` which is either `Entit
currently. Caches saves requested entities is the memory and updates them with WebSocket events.
If you're listening for WebSocket updates in the worker part (and you should justify doing that) then you should change
[EventBus](../src/api/worker/EventBusClient.js) to do that. For the main thread you can subscribe to the
[EventController](../src/api/main/EventController.js).
[EventBus](../src/common/api/worker/EventBusClient.js) to do that. For the main thread you can subscribe to the
[EventController](../src/common/api/main/EventController.js).
`EventBus` and `EntityRestClient` make sure that entities are automatically encrypted/decrypted when needed. See
[decryptAndMapToInstance()](../src/api/worker/crypto/CryptoFacade.js).
[decryptAndMapToInstance()](../src/common/api/worker/crypto/CryptoFacade.js).
#### Entity updates

View file

@ -1,7 +1,7 @@
{
"__comment": "output paths are relative to this file.",
"android": "../app-android/app/src/main/java/de/tutao/tutanota/generated_ipc",
"web": "../src/native/common/generatedipc",
"desktop": "../src/native/common/generatedipc",
"web": "../src/common/native/common/generatedipc",
"desktop": "../src/common/native/common/generatedipc",
"ios": "../app-ios/TutanotaSharedFramework//GeneratedIpc"
}

View file

@ -2,7 +2,7 @@
"name": "ContactAddressType",
"type": "typeref",
"location": {
"typescript": "../src/api/common/TutanotaConstants.js",
"typescript": "../src/common/api/common/TutanotaConstants.js",
"kotlin": "de.tutao.tutanota.contacts.ContactAddressType"
}
}

View file

@ -2,7 +2,7 @@
"name": "ContactCustomDateType",
"type": "typeref",
"location": {
"typescript": "../src/api/common/TutanotaConstants.js",
"typescript": "../src/common/api/common/TutanotaConstants.js",
"kotlin": "de.tutao.tutanota.contacts.ContactCustomDateType"
}
}

View file

@ -2,7 +2,7 @@
"name": "ContactMessengerHandleType",
"type": "typeref",
"location": {
"typescript": "../src/api/common/TutanotaConstants.js",
"typescript": "../src/common/api/common/TutanotaConstants.js",
"kotlin": "de.tutao.tutanota.contacts.ContactMessengerHandleType"
}
}

View file

@ -2,7 +2,7 @@
"name": "ContactPhoneNumberType",
"type": "typeref",
"location": {
"typescript": "../src/api/common/TutanotaConstants.js",
"typescript": "../src/common/api/common/TutanotaConstants.js",
"kotlin": "de.tutao.tutanota.contacts.ContactPhoneNumberType"
}
}

View file

@ -2,7 +2,7 @@
"name": "ContactRelationshipType",
"type": "typeref",
"location": {
"typescript": "../src/api/common/TutanotaConstants.js",
"typescript": "../src/common/api/common/TutanotaConstants.js",
"kotlin": "de.tutao.tutanota.contacts.ContactRelationshipType"
}
}

View file

@ -2,7 +2,7 @@
"name": "ContactWebsiteType",
"type": "typeref",
"location": {
"typescript": "../src/api/common/TutanotaConstants.js",
"typescript": "../src/common/api/common/TutanotaConstants.js",
"kotlin": "de.tutao.tutanota.contacts.ContactWebsiteType"
}
}

View file

@ -2,7 +2,7 @@
"name": "CredentialEncryptionMode",
"type": "typeref",
"location": {
"typescript": "../src/misc/credentials/CredentialEncryptionMode.js",
"typescript": "../src/common/misc/credentials/CredentialEncryptionMode.js",
"kotlin": "de.tutao.tutanota.credentials.CredentialEncryptionMode"
}
}

View file

@ -2,7 +2,7 @@
"name": "CredentialType",
"type": "typeref",
"location": {
"typescript": "../src/misc/credentials/CredentialType.js",
"typescript": "../src/common/misc/credentials/CredentialType.js",
"kotlin": "de.tutao.tutanota.CredentialType"
}
}

View file

@ -2,6 +2,6 @@
"name": "DataFile",
"type": "typeref",
"location": {
"typescript": "../src/api/common/DataFile.js"
"typescript": "../src/common/api/common/DataFile.js"
}
}

View file

@ -2,6 +2,6 @@
"name": "DesktopConfigKey",
"type": "typeref",
"location": {
"typescript": "../src/desktop/config/ConfigKeys.js"
"typescript": "../src/common/desktop/config/ConfigKeys.js"
}
}

View file

@ -2,7 +2,7 @@
"name": "EncryptedAlarmNotification",
"type": "typeref",
"location": {
"typescript": "../src/native/common/EncryptedAlarmNotification.js",
"typescript": "../src/common/native/common/EncryptedAlarmNotification.js",
"kotlin": "de.tutao.tutanota.alarms.EncryptedAlarmNotification"
}
}

View file

@ -2,7 +2,7 @@
"name": "TaggedSqlValue",
"type": "typeref",
"location": {
"typescript": "../src/api/worker/offline/SqlValue.js",
"typescript": "../src/common/api/worker/offline/SqlValue.js",
"kotlin": "de.tutao.tutanota.offline.TaggedSqlValue"
}
}

View file

@ -1,10 +1,10 @@
import m, { Children, ClassComponent, Vnode } from "mithril"
import { modal } from "./gui/base/Modal"
import { overlay } from "./gui/base/Overlay"
import { styles } from "./gui/styles"
import { assertMainOrNodeBoot, isApp } from "./api/common/Env"
import { Keys } from "./api/common/TutanotaConstants.js"
import { isKeyPressed } from "./misc/KeyManager.js"
import { modal } from "./common/gui/base/Modal"
import { overlay } from "./common/gui/base/Overlay"
import { styles } from "./common/gui/styles"
import { assertMainOrNodeBoot, isApp } from "./common/api/common/Env"
import { Keys } from "./common/api/common/TutanotaConstants.js"
import { isKeyPressed } from "./common/misc/KeyManager.js"
assertMainOrNodeBoot()

View file

@ -1,5 +1,5 @@
import { Component } from "mithril"
import { ViewSlider } from "./gui/nav/ViewSlider.js"
import { ViewSlider } from "./common/gui/nav/ViewSlider.js"
export interface TopLevelAttrs {
requestedPath: string

View file

@ -1,42 +1,41 @@
import { client } from "./misc/ClientDetector"
import { client } from "./common/misc/ClientDetector"
import m from "mithril"
import Mithril, { Children, ClassComponent, Component, RouteDefs, RouteResolver, Vnode, VnodeDOM } from "mithril"
import { lang, languageCodeToTag, languages } from "./misc/LanguageViewModel"
import { lang, languageCodeToTag, languages } from "./common/misc/LanguageViewModel"
import { root } from "./RootView"
import { disableErrorHandlingDuringLogout, handleUncaughtError } from "./misc/ErrorHandler"
import { assertMainOrNodeBoot, bootFinished, isApp, isDesktop, isOfflineStorageAvailable } from "./api/common/Env"
import { disableErrorHandlingDuringLogout, handleUncaughtError } from "./common/misc/ErrorHandler"
import { assertMainOrNodeBoot, bootFinished, isApp, isDesktop, isOfflineStorageAvailable } from "./common/api/common/Env"
import { assertNotNull, neverNull } from "@tutao/tutanota-utils"
import { windowFacade } from "./misc/WindowFacade"
import { styles } from "./gui/styles"
import { deviceConfig } from "./misc/DeviceConfig"
import { Logger, replaceNativeLogger } from "./api/common/Logger"
import { windowFacade } from "./common/misc/WindowFacade"
import { styles } from "./common/gui/styles"
import { deviceConfig } from "./common/misc/DeviceConfig"
import { Logger, replaceNativeLogger } from "./common/api/common/Logger"
import { applicationPaths } from "./ApplicationPaths"
import { ProgrammingError } from "./api/common/error/ProgrammingError"
import { NativeWebauthnView } from "./login/NativeWebauthnView"
import { WebauthnNativeBridge } from "./native/main/WebauthnNativeBridge"
import type { LoginView, LoginViewAttrs } from "./login/LoginView.js"
import type { LoginViewModel } from "./login/LoginViewModel.js"
import { TerminationView, TerminationViewAttrs } from "./termination/TerminationView.js"
import { TerminationViewModel } from "./termination/TerminationViewModel.js"
import { MobileWebauthnAttrs, MobileWebauthnView } from "./login/MobileWebauthnView.js"
import { BrowserWebauthn } from "./misc/2fa/webauthn/BrowserWebauthn.js"
import { CalendarView, CalendarViewAttrs } from "./calendar/view/CalendarView.js"
import { DrawerMenuAttrs } from "./gui/nav/DrawerMenu.js"
import { MailView, MailViewAttrs, MailViewCache } from "./mail/view/MailView.js"
import { ContactView, ContactViewAttrs } from "./contacts/view/ContactView.js"
import { SettingsView, SettingsViewAttrs } from "./settings/SettingsView.js"
import { SearchView, SearchViewAttrs } from "./search/view/SearchView.js"
import { ProgrammingError } from "./common/api/common/error/ProgrammingError"
import { NativeWebauthnView } from "./common/login/NativeWebauthnView"
import type { LoginView, LoginViewAttrs } from "./common/login/LoginView.js"
import type { LoginViewModel } from "./common/login/LoginViewModel.js"
import { TerminationView, TerminationViewAttrs } from "./common/termination/TerminationView.js"
import { TerminationViewModel } from "./common/termination/TerminationViewModel.js"
import { MobileWebauthnAttrs, MobileWebauthnView } from "./common/login/MobileWebauthnView.js"
import { BrowserWebauthn } from "./common/misc/2fa/webauthn/BrowserWebauthn.js"
import { CalendarView, CalendarViewAttrs } from "./calendar-app/calendar/view/CalendarView.js"
import { DrawerMenuAttrs } from "./common/gui/nav/DrawerMenu.js"
import { MailView, MailViewAttrs, MailViewCache } from "./mail-app/mail/view/MailView.js"
import { ContactView, ContactViewAttrs } from "./mail-app/contacts/view/ContactView.js"
import { SettingsView, SettingsViewAttrs } from "./mail-app/settings/SettingsView.js"
import { SearchView, SearchViewAttrs } from "./mail-app/search/view/SearchView.js"
import { TopLevelAttrs, TopLevelView } from "./TopLevelView.js"
import { AppHeaderAttrs } from "./gui/Header.js"
import { CalendarViewModel } from "./calendar/view/CalendarViewModel.js"
import { ExternalLoginView, ExternalLoginViewAttrs, ExternalLoginViewModel } from "./login/ExternalLoginView.js"
import { LoginController } from "./api/main/LoginController.js"
import type { MailViewModel } from "./mail/view/MailViewModel.js"
import { SearchViewModel } from "./search/view/SearchViewModel.js"
import { ContactViewModel } from "./contacts/view/ContactViewModel.js"
import { ContactListViewModel } from "./contacts/view/ContactListViewModel.js"
import type { CredentialsMigrationView, CredentialsMigrationViewAttrs } from "./login/CredentialsMigrationView.js"
import type { CredentialsMigrationViewModel } from "./login/CredentialsMigrationViewModel.js"
import { AppHeaderAttrs } from "./common/gui/Header.js"
import { CalendarViewModel } from "./calendar-app/calendar/view/CalendarViewModel.js"
import { ExternalLoginView, ExternalLoginViewAttrs, ExternalLoginViewModel } from "./common/login/ExternalLoginView.js"
import { LoginController } from "./common/api/main/LoginController.js"
import type { MailViewModel } from "./mail-app/mail/view/MailViewModel.js"
import { SearchViewModel } from "./mail-app/search/view/SearchViewModel.js"
import { ContactViewModel } from "./mail-app/contacts/view/ContactViewModel.js"
import { ContactListViewModel } from "./mail-app/contacts/view/ContactListViewModel.js"
import type { CredentialsMigrationView, CredentialsMigrationViewAttrs } from "./common/login/CredentialsMigrationView.js"
import type { CredentialsMigrationViewModel } from "./common/login/CredentialsMigrationViewModel.js"
assertMainOrNodeBoot()
bootFinished()
@ -77,22 +76,22 @@ history.replaceState(null, "", urlPrefixes.prefix + startRoute)
registerForMailto()
import("./translations/en")
import("./mail-app/translations/en")
.then((en) => lang.init(en.default))
.then(async () => {
await import("./gui/main-styles")
await import("./common/gui/main-styles")
// do this after lang initialized
const { locator } = await import("./api/main/MainLocator")
const { locator } = await import("./common/api/main/MainLocator")
await locator.init()
const { setupNavShortcuts } = await import("./misc/NavShortcuts.js")
const { setupNavShortcuts } = await import("./common/misc/NavShortcuts.js")
setupNavShortcuts()
// this needs to stay after client.init
windowFacade.init(locator.logins)
if (isDesktop()) {
import("./native/main/UpdatePrompt.js").then(({ registerForUpdates }) => registerForUpdates(locator.desktopSettingsFacade))
import("./common/native/main/UpdatePrompt.js").then(({ registerForUpdates }) => registerForUpdates(locator.desktopSettingsFacade))
}
const userLanguage = deviceConfig.getLanguage() && languages.find((l) => l.code === deviceConfig.getLanguage())
@ -114,7 +113,7 @@ import("./translations/en")
locator.logins.addPostLoginAction(() => locator.postLoginActions())
if (isOfflineStorageAvailable()) {
const { CachePostLoginAction } = await import("./offline/CachePostLoginAction")
const { CachePostLoginAction } = await import("./common/offline/CachePostLoginAction")
locator.logins.addPostLoginAction(
async () =>
new CachePostLoginAction(
@ -141,7 +140,7 @@ import("./translations/en")
>(
{
prepareRoute: async () => {
const { ContactView } = await import("./contacts/view/ContactView.js")
const { ContactView } = await import("./mail-app/contacts/view/ContactView.js")
const drawerAttrsFactory = await locator.drawerAttrsFactory()
return {
component: ContactView,
@ -170,7 +169,7 @@ import("./translations/en")
const migrator = await locator.credentialFormatMigrator()
await migrator.migrate()
const { LoginView } = await import("./login/LoginView.js")
const { LoginView } = await import("./common/login/LoginView.js")
const makeViewModel = await locator.loginViewModelFactory()
return {
component: LoginView,
@ -187,8 +186,8 @@ import("./translations/en")
termination: makeViewResolver<TerminationViewAttrs, TerminationView, { makeViewModel: () => TerminationViewModel; header: AppHeaderAttrs }>(
{
prepareRoute: async () => {
const { TerminationViewModel } = await import("./termination/TerminationViewModel.js")
const { TerminationView } = await import("./termination/TerminationView.js")
const { TerminationViewModel } = await import("./common/termination/TerminationViewModel.js")
const { TerminationView } = await import("./common/termination/TerminationView.js")
return {
component: TerminationView,
cache: {
@ -208,7 +207,7 @@ import("./translations/en")
externalLogin: makeViewResolver<ExternalLoginViewAttrs, ExternalLoginView, { header: AppHeaderAttrs; makeViewModel: () => ExternalLoginViewModel }>(
{
prepareRoute: async () => {
const { ExternalLoginView } = await import("./login/ExternalLoginView.js")
const { ExternalLoginView } = await import("./common/login/ExternalLoginView.js")
const makeViewModel = await locator.externalLoginViewModelFactory()
return {
component: ExternalLoginView,
@ -232,7 +231,7 @@ import("./translations/en")
>(
{
prepareRoute: async (previousCache) => {
const { MailView } = await import("./mail/view/MailView.js")
const { MailView } = await import("./mail-app/mail/view/MailView.js")
return {
component: MailView,
cache: previousCache ?? {
@ -256,7 +255,7 @@ import("./translations/en")
settings: makeViewResolver<SettingsViewAttrs, SettingsView, { drawerAttrsFactory: () => DrawerMenuAttrs; header: AppHeaderAttrs }>(
{
prepareRoute: async () => {
const { SettingsView } = await import("./settings/SettingsView.js")
const { SettingsView } = await import("./mail-app/settings/SettingsView.js")
const drawerAttrsFactory = await locator.drawerAttrsFactory()
return {
component: SettingsView,
@ -278,7 +277,7 @@ import("./translations/en")
>(
{
prepareRoute: async () => {
const { SearchView } = await import("./search/view/SearchView.js")
const { SearchView } = await import("./mail-app/search/view/SearchView.js")
const drawerAttrsFactory = await locator.drawerAttrsFactory()
return {
component: SearchView,
@ -300,7 +299,7 @@ import("./translations/en")
>(
{
prepareRoute: async (cache) => {
const { CalendarView } = await import("./calendar/view/CalendarView.js")
const { CalendarView } = await import("./calendar-app/calendar/view/CalendarView.js")
const drawerAttrsFactory = await locator.drawerAttrsFactory()
return {
component: CalendarView,
@ -327,8 +326,8 @@ import("./translations/en")
*/
signup: {
async onmatch() {
const { showSignupDialog } = await import("./misc/LoginUtils")
const { isLegacyDomain } = await import("./login/LoginViewModel.js")
const { showSignupDialog } = await import("./common/misc/LoginUtils")
const { isLegacyDomain } = await import("./common/login/LoginViewModel.js")
if (isLegacyDomain()) {
const domainConfigProvider = locator.domainConfigProvider()
const target = new URL(
@ -362,7 +361,7 @@ import("./translations/en")
},
giftcard: {
async onmatch() {
const { showGiftCardDialog } = await import("./misc/LoginUtils")
const { showGiftCardDialog } = await import("./common/misc/LoginUtils")
showGiftCardDialog(location.hash)
m.route.set("/login", {
noAutoLogin: true,
@ -373,7 +372,7 @@ import("./translations/en")
},
recover: {
async onmatch(args: any) {
const { showRecoverDialog } = await import("./misc/LoginUtils")
const { showRecoverDialog } = await import("./common/misc/LoginUtils")
const resetAction = args.resetAction === "password" || args.resetAction === "secondFactor" ? args.resetAction : "password"
const mailAddress = typeof args.mailAddress === "string" ? args.mailAddress : ""
showRecoverDialog(mailAddress, resetAction)
@ -385,9 +384,9 @@ import("./translations/en")
},
webauthn: makeOldViewResolver(
async () => {
const { BrowserWebauthn } = await import("./misc/2fa/webauthn/BrowserWebauthn.js")
const { NativeWebauthnView } = await import("./login/NativeWebauthnView.js")
const { WebauthnNativeBridge } = await import("./native/main/WebauthnNativeBridge.js")
const { BrowserWebauthn } = await import("./common/misc/2fa/webauthn/BrowserWebauthn.js")
const { NativeWebauthnView } = await import("./common/login/NativeWebauthnView.js")
const { WebauthnNativeBridge } = await import("./common/native/main/WebauthnNativeBridge.js")
// getCurrentDomainConfig() takes env.staticUrl into account but we actually don't care about it in this case.
// Scenario when it can differ: local desktop client which opens webauthn window and that window is also built with the static URL because
// it is the same client build.
@ -404,8 +403,8 @@ import("./translations/en")
webauthnmobile: makeViewResolver<MobileWebauthnAttrs, MobileWebauthnView, { browserWebauthn: BrowserWebauthn }>(
{
prepareRoute: async () => {
const { MobileWebauthnView } = await import("./login/MobileWebauthnView.js")
const { BrowserWebauthn } = await import("./misc/2fa/webauthn/BrowserWebauthn.js")
const { MobileWebauthnView } = await import("./common/login/MobileWebauthnView.js")
const { BrowserWebauthn } = await import("./common/misc/2fa/webauthn/BrowserWebauthn.js")
// see /webauthn view resolver for the explanation
const domainConfig = locator.domainConfigProvider().getDomainConfigForHostname(location.hostname, location.protocol, location.port)
return {
@ -429,8 +428,8 @@ import("./translations/en")
>(
{
prepareRoute: async () => {
const { CredentialsMigrationViewModel } = await import("./login/CredentialsMigrationViewModel.js")
const { CredentialsMigrationView } = await import("./login/CredentialsMigrationView.js")
const { CredentialsMigrationViewModel } = await import("./common/login/CredentialsMigrationViewModel.js")
const { CredentialsMigrationView } = await import("./common/login/CredentialsMigrationView.js")
const domainConfig = locator.domainConfigProvider().getDomainConfigForHostname(location.hostname, location.protocol, location.port)
const parentOrigin = domainConfig.partneredDomainTransitionUrl
const loginViewModelFactory = await locator.loginViewModelFactory()
@ -465,7 +464,7 @@ import("./translations/en")
// append catch all at the end because mithril will stop at the first match
resolvers["/:path..."] = {
onmatch: async () => {
const { NotFoundPage } = await import("./gui/base/NotFoundPage.js")
const { NotFoundPage } = await import("./common/gui/base/NotFoundPage.js")
return {
view: () => m(root, m(NotFoundPage)),
}
@ -481,12 +480,12 @@ import("./translations/en")
await locator.native.init()
}
if (isDesktop()) {
const { exposeNativeInterface } = await import("./api/common/ExposeNativeInterface")
const { exposeNativeInterface } = await import("./common/api/common/ExposeNativeInterface")
locator.logins.addPostLoginAction(async () => exposeNativeInterface(locator.native).postLoginActions)
}
// after we set up prefixWithoutFile
const domainConfig = locator.domainConfigProvider().getCurrentDomainConfig()
const serviceworker = await import("./serviceworker/ServiceWorkerClient.js")
const serviceworker = await import("./common/serviceworker/ServiceWorkerClient.js")
serviceworker.init(domainConfig)
printJobsMessage(domainConfig)

View file

@ -1,10 +1,10 @@
import type { Thunk } from "@tutao/tutanota-utils"
import { downcast } from "@tutao/tutanota-utils"
import { EndType } from "../../api/common/TutanotaConstants.js"
import type { AlarmInfo, RepeatRule } from "../../api/entities/sys/TypeRefs.js"
import type { ScheduledTimeoutId, Scheduler } from "../../api/common/utils/Scheduler.js"
import { EndType } from "../../../common/api/common/TutanotaConstants.js"
import type { AlarmInfo, RepeatRule } from "../../../common/api/entities/sys/TypeRefs.js"
import type { ScheduledTimeoutId, Scheduler } from "../../../common/api/common/utils/Scheduler.js"
import { calculateAlarmTime, findNextAlarmOccurrence, getEventStartByTimes, getValidTimeZone, parseAlarmInterval } from "./CalendarUtils.js"
import { DateProvider } from "../../api/common/DateProvider.js"
import { DateProvider } from "../../../common/api/common/DateProvider.js"
type NotificationSender = (eventTime: Date, summary: string) => void
type EventInfo = {

View file

@ -1,18 +1,18 @@
import Stream from "mithril/stream"
import stream from "mithril/stream"
import { CalendarInfo, CalendarModel } from "../model/CalendarModel.js"
import { IProgressMonitor } from "../../api/common/utils/ProgressMonitor.js"
import { IProgressMonitor } from "../../../common/api/common/utils/ProgressMonitor.js"
import { addDaysForRecurringEvent, CalendarTimeRange, getEventEnd, getEventStart, getMonthRange } from "./CalendarUtils.js"
import { CalendarEvent, CalendarEventTypeRef } from "../../api/entities/tutanota/TypeRefs.js"
import { getListId, isSameId } from "../../api/common/utils/EntityUtils.js"
import { CalendarEvent, CalendarEventTypeRef } from "../../../common/api/entities/tutanota/TypeRefs.js"
import { getListId, isSameId } from "../../../common/api/common/utils/EntityUtils.js"
import { DateTime } from "luxon"
import { CalendarFacade } from "../../api/worker/facades/lazy/CalendarFacade.js"
import { EntityClient } from "../../api/common/EntityClient.js"
import { CalendarFacade } from "../../../common/api/worker/facades/lazy/CalendarFacade.js"
import { EntityClient } from "../../../common/api/common/EntityClient.js"
import { findAllAndRemove } from "@tutao/tutanota-utils"
import { OperationType } from "../../api/common/TutanotaConstants.js"
import { NotAuthorizedError, NotFoundError } from "../../api/common/error/RestError.js"
import { EventController } from "../../api/main/EventController.js"
import { EntityUpdateData, isUpdateForTypeRef } from "../../api/common/utils/EntityUpdateUtils.js"
import { OperationType } from "../../../common/api/common/TutanotaConstants.js"
import { NotAuthorizedError, NotFoundError } from "../../../common/api/common/error/RestError.js"
import { EventController } from "../../../common/api/main/EventController.js"
import { EntityUpdateData, isUpdateForTypeRef } from "../../../common/api/common/utils/EntityUpdateUtils.js"
const LIMIT_PAST_EVENTS_YEARS = 100

View file

@ -16,7 +16,7 @@ import {
neverNull,
TIMESTAMP_ZERO_YEAR,
} from "@tutao/tutanota-utils"
import { EndType, EventTextTimeOption, getWeekStart, RepeatPeriod, TimeFormat, WeekStart } from "../../api/common/TutanotaConstants"
import { EndType, EventTextTimeOption, getWeekStart, RepeatPeriod, TimeFormat, WeekStart } from "../../../common/api/common/TutanotaConstants"
import { DateTime, DurationLikeObject, FixedOffsetZone, IANAZone } from "luxon"
import {
CalendarEvent,
@ -25,17 +25,23 @@ import {
CalendarRepeatRule,
createCalendarRepeatRule,
UserSettingsGroupRoot,
} from "../../api/entities/tutanota/TypeRefs.js"
import { CalendarEventTimes, DAYS_SHIFTED_MS, generateEventElementId, isAllDayEvent, isAllDayEventByTimes } from "../../api/common/utils/CommonCalendarUtils"
import type { RepeatRule } from "../../api/entities/sys/TypeRefs.js"
import { createDateWrapper, DateWrapper, User } from "../../api/entities/sys/TypeRefs.js"
import { isSameId } from "../../api/common/utils/EntityUtils"
} from "../../../common/api/entities/tutanota/TypeRefs.js"
import {
CalendarEventTimes,
DAYS_SHIFTED_MS,
generateEventElementId,
isAllDayEvent,
isAllDayEventByTimes,
} from "../../../common/api/common/utils/CommonCalendarUtils"
import type { RepeatRule } from "../../../common/api/entities/sys/TypeRefs.js"
import { createDateWrapper, DateWrapper, User } from "../../../common/api/entities/sys/TypeRefs.js"
import { isSameId } from "../../../common/api/common/utils/EntityUtils"
import type { Time } from "./Time.js"
import type { CalendarInfo } from "../model/CalendarModel"
import { DateProvider } from "../../api/common/DateProvider"
import { EntityClient } from "../../api/common/EntityClient.js"
import { CalendarEventUidIndexEntry } from "../../api/worker/facades/lazy/CalendarFacade.js"
import { ParserError } from "../../misc/parsing/ParserCombinator.js"
import { DateProvider } from "../../../common/api/common/DateProvider"
import { EntityClient } from "../../../common/api/common/EntityClient.js"
import { CalendarEventUidIndexEntry } from "../../../common/api/worker/facades/lazy/CalendarFacade.js"
import { ParserError } from "../../../common/misc/parsing/ParserCombinator.js"
export type CalendarTimeRange = {
start: number

View file

@ -1,16 +1,16 @@
import type { CalendarAttendeeStatus, CalendarMethod } from "../../api/common/TutanotaConstants"
import { assertEnumValue, EndType, RepeatPeriod, SECOND_MS } from "../../api/common/TutanotaConstants"
import type { CalendarAttendeeStatus, CalendarMethod } from "../../../common/api/common/TutanotaConstants"
import { assertEnumValue, EndType, RepeatPeriod, SECOND_MS } from "../../../common/api/common/TutanotaConstants"
import { assertNotNull, downcast, incrementDate, mapAndFilterNull, neverNull, pad, stringToUtf8Uint8Array } from "@tutao/tutanota-utils"
import { calendarAttendeeStatusToParstat, iCalReplacements, repeatPeriodToIcalFrequency } from "./CalendarParser"
import { getAllDayDateLocal, isAllDayEvent } from "../../api/common/utils/CommonCalendarUtils"
import { getAllDayDateLocal, isAllDayEvent } from "../../../common/api/common/utils/CommonCalendarUtils"
import { AlarmIntervalUnit, generateUid, getTimeZone, parseAlarmInterval } from "../date/CalendarUtils"
import type { CalendarEvent } from "../../api/entities/tutanota/TypeRefs.js"
import { createFile } from "../../api/entities/tutanota/TypeRefs.js"
import { convertToDataFile, DataFile } from "../../api/common/DataFile"
import type { DateWrapper, RepeatRule, UserAlarmInfo } from "../../api/entities/sys/TypeRefs.js"
import type { CalendarEvent } from "../../../common/api/entities/tutanota/TypeRefs.js"
import { createFile } from "../../../common/api/entities/tutanota/TypeRefs.js"
import { convertToDataFile, DataFile } from "../../../common/api/common/DataFile"
import type { DateWrapper, RepeatRule, UserAlarmInfo } from "../../../common/api/entities/sys/TypeRefs.js"
import { DateTime } from "luxon"
import { CALENDAR_MIME_TYPE } from "../../file/FileController"
import { getLetId } from "../../api/common/utils/EntityUtils"
import { CALENDAR_MIME_TYPE } from "../../../common/file/FileController"
import { getLetId } from "../../../common/api/common/utils/EntityUtils"
/** create an ical data file that can be attached to an invitation/update/cancellation/response mail */
export function makeInvitationCalendarFile(event: CalendarEvent, method: CalendarMethod, now: Date, zone: string): DataFile {

View file

@ -1,10 +1,10 @@
import { parseCalendarEvents, parseICalendar } from "./CalendarParser.js"
import { DataFile } from "../../api/common/DataFile.js"
import { DataFile } from "../../../common/api/common/DataFile.js"
import { Require, utf8Uint8ArrayToString } from "@tutao/tutanota-utils"
import { getTimeZone } from "../date/CalendarUtils.js"
import { ParserError } from "../../misc/parsing/ParserCombinator.js"
import { CalendarEvent } from "../../api/entities/tutanota/TypeRefs.js"
import { AlarmInfoTemplate } from "../../api/worker/facades/lazy/CalendarFacade.js"
import { ParserError } from "../../../common/misc/parsing/ParserCombinator.js"
import { CalendarEvent } from "../../../common/api/entities/tutanota/TypeRefs.js"
import { AlarmInfoTemplate } from "../../../common/api/worker/facades/lazy/CalendarFacade.js"
export type ParsedEvent = {
event: Require<"uid", CalendarEvent>

View file

@ -1,23 +1,23 @@
import type { CalendarEvent, CalendarGroupRoot } from "../../api/entities/tutanota/TypeRefs.js"
import { CalendarEventTypeRef, createFile } from "../../api/entities/tutanota/TypeRefs.js"
import { CALENDAR_MIME_TYPE, showFileChooser } from "../../file/FileController"
import { generateEventElementId } from "../../api/common/utils/CommonCalendarUtils"
import { showProgressDialog } from "../../gui/dialogs/ProgressDialog"
import { ParserError } from "../../misc/parsing/ParserCombinator"
import { Dialog } from "../../gui/base/Dialog"
import { lang } from "../../misc/LanguageViewModel"
import type { CalendarEvent, CalendarGroupRoot } from "../../../common/api/entities/tutanota/TypeRefs.js"
import { CalendarEventTypeRef, createFile } from "../../../common/api/entities/tutanota/TypeRefs.js"
import { CALENDAR_MIME_TYPE, showFileChooser } from "../../../common/file/FileController"
import { generateEventElementId } from "../../../common/api/common/utils/CommonCalendarUtils"
import { showProgressDialog } from "../../../common/gui/dialogs/ProgressDialog"
import { ParserError } from "../../../common/misc/parsing/ParserCombinator"
import { Dialog } from "../../../common/gui/base/Dialog"
import { lang } from "../../../common/misc/LanguageViewModel"
import { serializeCalendar } from "./CalendarExporter.js"
import { parseCalendarFile, ParsedEvent } from "./CalendarImporter.js"
import { elementIdPart, isSameId, listIdPart } from "../../api/common/utils/EntityUtils"
import type { UserAlarmInfo } from "../../api/entities/sys/TypeRefs.js"
import { createDateWrapper, UserAlarmInfoTypeRef } from "../../api/entities/sys/TypeRefs.js"
import { convertToDataFile } from "../../api/common/DataFile"
import { locator } from "../../api/main/MainLocator"
import { elementIdPart, isSameId, listIdPart } from "../../../common/api/common/utils/EntityUtils"
import type { UserAlarmInfo } from "../../../common/api/entities/sys/TypeRefs.js"
import { createDateWrapper, UserAlarmInfoTypeRef } from "../../../common/api/entities/sys/TypeRefs.js"
import { convertToDataFile } from "../../../common/api/common/DataFile"
import { locator } from "../../../common/api/main/MainLocator"
import { getFromMap, groupBy, insertIntoSortedArray, ofClass, promiseMap, stringToUtf8Uint8Array } from "@tutao/tutanota-utils"
import { assignEventId, CalendarEventValidity, checkEventValidity, getTimeZone } from "../date/CalendarUtils"
import { ImportError } from "../../api/common/error/ImportError"
import { TranslationKeyType } from "../../misc/TranslationKey"
import { AlarmInfoTemplate } from "../../api/worker/facades/lazy/CalendarFacade.js"
import { ImportError } from "../../../common/api/common/error/ImportError"
import { TranslationKeyType } from "../../../common/misc/TranslationKey"
import { AlarmInfoTemplate } from "../../../common/api/worker/facades/lazy/CalendarFacade.js"
export const enum EventImportRejectionReason {
Pre1970,

View file

@ -1,10 +1,15 @@
import { DAY_IN_MILLIS, filterInt, neverNull, Require } from "@tutao/tutanota-utils"
import { DateTime, Duration, IANAZone } from "luxon"
import type { CalendarEvent, EncryptedMailAddress } from "../../api/entities/tutanota/TypeRefs.js"
import { CalendarEventAttendee, createCalendarEvent, createCalendarEventAttendee, createEncryptedMailAddress } from "../../api/entities/tutanota/TypeRefs.js"
import type { DateWrapper, RepeatRule } from "../../api/entities/sys/TypeRefs.js"
import { createDateWrapper, createRepeatRule } from "../../api/entities/sys/TypeRefs.js"
import type { Parser } from "../../misc/parsing/ParserCombinator"
import type { CalendarEvent, EncryptedMailAddress } from "../../../common/api/entities/tutanota/TypeRefs.js"
import {
CalendarEventAttendee,
createCalendarEvent,
createCalendarEventAttendee,
createEncryptedMailAddress,
} from "../../../common/api/entities/tutanota/TypeRefs.js"
import type { DateWrapper, RepeatRule } from "../../../common/api/entities/sys/TypeRefs.js"
import { createDateWrapper, createRepeatRule } from "../../../common/api/entities/sys/TypeRefs.js"
import type { Parser } from "../../../common/misc/parsing/ParserCombinator"
import {
combineParsers,
makeCharacterParser,
@ -17,13 +22,13 @@ import {
numberParser,
ParserError,
StringIterator,
} from "../../misc/parsing/ParserCombinator"
} from "../../../common/misc/parsing/ParserCombinator"
import WindowsZones from "./WindowsZones"
import type { ParsedCalendarData } from "./CalendarImporter"
import { isMailAddress } from "../../misc/FormatValidator"
import { CalendarAttendeeStatus, CalendarMethod, EndType, RepeatPeriod, reverse } from "../../api/common/TutanotaConstants"
import { isMailAddress } from "../../../common/misc/FormatValidator"
import { CalendarAttendeeStatus, CalendarMethod, EndType, RepeatPeriod, reverse } from "../../../common/api/common/TutanotaConstants"
import { AlarmInterval, AlarmIntervalUnit, serializeAlarmInterval } from "../date/CalendarUtils.js"
import { AlarmInfoTemplate } from "../../api/worker/facades/lazy/CalendarFacade.js"
import { AlarmInfoTemplate } from "../../../common/api/worker/facades/lazy/CalendarFacade.js"
function parseDateString(dateString: string): {
year: number

View file

@ -1,10 +1,10 @@
import m, { Child, ChildArray, Children } from "mithril"
import type { TranslationKey } from "../../misc/LanguageViewModel.js"
import { lang } from "../../misc/LanguageViewModel.js"
import { ButtonType } from "../../gui/base/Button.js"
import { Icons } from "../../gui/base/icons/Icons.js"
import { Dialog } from "../../gui/base/Dialog.js"
import type { MousePosAndBounds } from "../../gui/base/GuiUtils.js"
import type { TranslationKey } from "../../../common/misc/LanguageViewModel.js"
import { lang } from "../../../common/misc/LanguageViewModel.js"
import { ButtonType } from "../../../common/gui/base/Button.js"
import { Icons } from "../../../common/gui/base/icons/Icons.js"
import { Dialog } from "../../../common/gui/base/Dialog.js"
import type { MousePosAndBounds } from "../../../common/gui/base/GuiUtils.js"
import { Time } from "../date/Time.js"
import {
assert,
@ -21,8 +21,15 @@ import {
numberRange,
typedValues,
} from "@tutao/tutanota-utils"
import { IconButton } from "../../gui/base/IconButton.js"
import { formatDateTime, formatDateWithMonth, formatDateWithWeekday, formatMonthWithFullYear, formatTime, timeStringFromParts } from "../../misc/Formatter.js"
import { IconButton } from "../../../common/gui/base/IconButton.js"
import {
formatDateTime,
formatDateWithMonth,
formatDateWithWeekday,
formatMonthWithFullYear,
formatTime,
timeStringFromParts,
} from "../../../common/misc/Formatter.js"
import {
AlarmInterval,
alarmIntervalToLuxonDurationLikeObject,
@ -53,23 +60,23 @@ import {
RepeatPeriod,
ShareCapability,
WeekStart,
} from "../../api/common/TutanotaConstants.js"
import { AllIcons } from "../../gui/base/Icon.js"
import { SelectorItemList } from "../../gui/base/DropDownSelector.js"
} from "../../../common/api/common/TutanotaConstants.js"
import { AllIcons } from "../../../common/gui/base/Icon.js"
import { SelectorItemList } from "../../../common/gui/base/DropDownSelector.js"
import { DateTime, Duration } from "luxon"
import { CalendarEventTimes, cleanMailAddress, isAllDayEvent } from "../../api/common/utils/CommonCalendarUtils.js"
import { CalendarEvent, UserSettingsGroupRoot } from "../../api/entities/tutanota/TypeRefs.js"
import { ProgrammingError } from "../../api/common/error/ProgrammingError.js"
import { size } from "../../gui/size.js"
import { isColorLight, isValidColorCode } from "../../gui/base/Color.js"
import { CalendarEventTimes, cleanMailAddress, isAllDayEvent } from "../../../common/api/common/utils/CommonCalendarUtils.js"
import { CalendarEvent, UserSettingsGroupRoot } from "../../../common/api/entities/tutanota/TypeRefs.js"
import { ProgrammingError } from "../../../common/api/common/error/ProgrammingError.js"
import { size } from "../../../common/gui/size.js"
import { isColorLight, isValidColorCode } from "../../../common/gui/base/Color.js"
import { GroupColors } from "../view/CalendarView.js"
import { CalendarInfo } from "../model/CalendarModel.js"
import { User } from "../../api/entities/sys/TypeRefs.js"
import { User } from "../../../common/api/entities/sys/TypeRefs.js"
import { EventType } from "./eventeditor-model/CalendarEventModel.js"
import { hasCapabilityOnGroup } from "../../sharing/GroupUtils.js"
import { hasCapabilityOnGroup } from "../../../common/sharing/GroupUtils.js"
import { EventsOnDays } from "../view/CalendarViewModel.js"
import { CalendarEventPreviewViewModel } from "./eventpopup/CalendarEventPreviewViewModel.js"
import { createAsyncDropdown } from "../../gui/base/Dropdown.js"
import { createAsyncDropdown } from "../../../common/gui/base/Dropdown.js"
export function renderCalendarSwitchLeftButton(label: TranslationKey, click: () => unknown): Child {
return m(IconButton, {

View file

@ -1,9 +1,9 @@
import { Dialog } from "../../gui/base/Dialog.js"
import { Dialog } from "../../../common/gui/base/Dialog.js"
import m, { Children } from "mithril"
import stream from "mithril/stream"
import { TextField } from "../../gui/base/TextField.js"
import { lang } from "../../misc/LanguageViewModel.js"
import type { TranslationKeyType } from "../../misc/TranslationKey.js"
import { TextField } from "../../../common/gui/base/TextField.js"
import { lang } from "../../../common/misc/LanguageViewModel.js"
import type { TranslationKeyType } from "../../../common/misc/TranslationKey.js"
import { downcast } from "@tutao/tutanota-utils"
type CalendarProperties = {

View file

@ -1,15 +1,15 @@
import m, { Children, Component, Vnode } from "mithril"
import { assertNotNull, getStartOfDay, incrementDate, isSameDayOfDate, isToday } from "@tutao/tutanota-utils"
import { DateTime } from "luxon"
import { Carousel } from "../../../gui/base/Carousel.js"
import { Carousel } from "../../../../common/gui/base/Carousel.js"
import { changePeriodOnWheel, getCalendarMonth } from "../CalendarGuiUtils.js"
import { CalendarDay, CalendarMonth } from "../../date/CalendarUtils.js"
import { DefaultAnimationTime } from "../../../gui/animation/Animations.js"
import { ExpanderPanel } from "../../../gui/base/Expander.js"
import { theme } from "../../../gui/theme.js"
import { px, size } from "../../../gui/size.js"
import { styles } from "../../../gui/styles.js"
import { hexToRGBAString } from "../../../gui/base/Color.js"
import { DefaultAnimationTime } from "../../../../common/gui/animation/Animations.js"
import { ExpanderPanel } from "../../../../common/gui/base/Expander.js"
import { theme } from "../../../../common/gui/theme.js"
import { px, size } from "../../../../common/gui/size.js"
import { styles } from "../../../../common/gui/styles.js"
import { hexToRGBAString } from "../../../../common/gui/base/Color.js"
export interface DaySelectorAttrs {
selectedDate: Date | null

View file

@ -1,16 +1,16 @@
import { modal, ModalComponent } from "../../../gui/base/Modal.js"
import { Shortcut } from "../../../misc/KeyManager.js"
import { PosRect } from "../../../gui/base/Dropdown.js"
import { modal, ModalComponent } from "../../../../common/gui/base/Modal.js"
import { Shortcut } from "../../../../common/misc/KeyManager.js"
import { PosRect } from "../../../../common/gui/base/Dropdown.js"
import m, { Children } from "mithril"
import { Keys } from "../../../api/common/TutanotaConstants.js"
import { Keys } from "../../../../common/api/common/TutanotaConstants.js"
import { DaySelector } from "./DaySelector.js"
import { animations, opacity, transform, TransformEnum } from "../../../gui/animation/Animations.js"
import { ease } from "../../../gui/animation/Easing.js"
import { px } from "../../../gui/size.js"
import { formatMonthWithFullYear } from "../../../misc/Formatter.js"
import { animations, opacity, transform, TransformEnum } from "../../../../common/gui/animation/Animations.js"
import { ease } from "../../../../common/gui/animation/Easing.js"
import { px } from "../../../../common/gui/size.js"
import { formatMonthWithFullYear } from "../../../../common/misc/Formatter.js"
import { incrementMonth } from "@tutao/tutanota-utils"
import { styles } from "../../../gui/styles.js"
import renderSwitchMonthArrowIcon from "../../../gui/base/buttons/ArrowButton.js"
import { styles } from "../../../../common/gui/styles.js"
import renderSwitchMonthArrowIcon from "../../../../common/gui/base/buttons/ArrowButton.js"
export interface DaySelectorPopupAttrs {
selectedDate: Date

View file

@ -1,9 +1,9 @@
import m, { Children, Component, Vnode } from "mithril"
import { formatMonthWithFullYear } from "../../../misc/Formatter.js"
import { formatMonthWithFullYear } from "../../../../common/misc/Formatter.js"
import { incrementMonth } from "@tutao/tutanota-utils"
import { DaySelector } from "./DaySelector.js"
import { DaysToEvents } from "../../date/CalendarEventsRepository.js"
import renderSwitchMonthArrowIcon from "../../../gui/base/buttons/ArrowButton.js"
import renderSwitchMonthArrowIcon from "../../../../common/gui/base/buttons/ArrowButton.js"
export interface DaySelectorSidebarAttrs {
selectedDate: Date

View file

@ -1,10 +1,10 @@
import { generateEventElementId } from "../../../api/common/utils/CommonCalendarUtils.js"
import { generateEventElementId } from "../../../../common/api/common/utils/CommonCalendarUtils.js"
import { noOp, remove } from "@tutao/tutanota-utils"
import { EventType } from "./CalendarEventModel.js"
import { DateProvider } from "../../../api/common/DateProvider.js"
import { DateProvider } from "../../../../common/api/common/DateProvider.js"
import { AlarmInterval, alarmIntervalToLuxonDurationLikeObject, serializeAlarmInterval } from "../../date/CalendarUtils.js"
import { Duration } from "luxon"
import { AlarmInfoTemplate } from "../../../api/worker/facades/lazy/CalendarFacade.js"
import { AlarmInfoTemplate } from "../../../../common/api/worker/facades/lazy/CalendarFacade.js"
export type CalendarEventAlarmModelResult = {
alarms: Array<AlarmInfoTemplate>

View file

@ -54,7 +54,7 @@
* * etc.
*/
import { AccountType } from "../../../api/common/TutanotaConstants.js"
import { AccountType } from "../../../../common/api/common/TutanotaConstants.js"
import {
CalendarEvent,
CalendarEventAttendee,
@ -63,9 +63,9 @@ import {
EncryptedMailAddress,
Mail,
MailboxProperties,
} from "../../../api/entities/tutanota/TypeRefs.js"
import { User } from "../../../api/entities/sys/TypeRefs.js"
import { MailboxDetail } from "../../../mail/model/MailModel.js"
} from "../../../../common/api/entities/tutanota/TypeRefs.js"
import { User } from "../../../../common/api/entities/sys/TypeRefs.js"
import { MailboxDetail } from "../../../../mail-app/mail/model/MailModel.js"
import {
AlarmInterval,
areRepeatRulesEqual,
@ -77,30 +77,30 @@ import {
parseAlarmInterval,
} from "../../date/CalendarUtils.js"
import { arrayEqualsWithPredicate, assertNonNull, assertNotNull, getFirstOrThrow, identity, lazy, Require } from "@tutao/tutanota-utils"
import { cleanMailAddress } from "../../../api/common/utils/CommonCalendarUtils.js"
import { cleanMailAddress } from "../../../../common/api/common/utils/CommonCalendarUtils.js"
import { CalendarInfo, CalendarModel } from "../../model/CalendarModel.js"
import { NotFoundError, PayloadTooLargeError } from "../../../api/common/error/RestError.js"
import { NotFoundError, PayloadTooLargeError } from "../../../../common/api/common/error/RestError.js"
import { CalendarNotificationSender } from "../../view/CalendarNotificationSender.js"
import { SendMailModel } from "../../../mail/editor/SendMailModel.js"
import { UserError } from "../../../api/main/UserError.js"
import { EntityClient } from "../../../api/common/EntityClient.js"
import { RecipientsModel } from "../../../api/main/RecipientsModel.js"
import { LoginController } from "../../../api/main/LoginController.js"
import { SendMailModel } from "../../../../mail-app/mail/editor/SendMailModel.js"
import { UserError } from "../../../../common/api/main/UserError.js"
import { EntityClient } from "../../../../common/api/common/EntityClient.js"
import { RecipientsModel } from "../../../../common/api/main/RecipientsModel.js"
import { LoginController } from "../../../../common/api/main/LoginController.js"
import m from "mithril"
import { PartialRecipient } from "../../../api/common/recipients/Recipient.js"
import { getPasswordStrengthForUser } from "../../../misc/passwords/PasswordUtils.js"
import { PartialRecipient } from "../../../../common/api/common/recipients/Recipient.js"
import { getPasswordStrengthForUser } from "../../../../common/misc/passwords/PasswordUtils.js"
import { CalendarEventWhenModel } from "./CalendarEventWhenModel.js"
import { CalendarEventWhoModel } from "./CalendarEventWhoModel.js"
import { CalendarEventAlarmModel } from "./CalendarEventAlarmModel.js"
import { SanitizedTextViewModel } from "../../../misc/SanitizedTextViewModel.js"
import { getStrippedClone, Stripped, StrippedEntity } from "../../../api/common/utils/EntityUtils.js"
import { UserController } from "../../../api/main/UserController.js"
import { SanitizedTextViewModel } from "../../../../common/misc/SanitizedTextViewModel.js"
import { getStrippedClone, Stripped, StrippedEntity } from "../../../../common/api/common/utils/EntityUtils.js"
import { UserController } from "../../../../common/api/main/UserController.js"
import { CalendarNotificationModel, CalendarNotificationSendModels } from "./CalendarNotificationModel.js"
import { CalendarEventApplyStrategies, CalendarEventModelStrategy } from "./CalendarEventModelStrategy.js"
import { ProgrammingError } from "../../../api/common/error/ProgrammingError.js"
import { getDefaultSender } from "../../../mail/model/MailUtils.js"
import { SimpleTextViewModel } from "../../../misc/SimpleTextViewModel.js"
import { AlarmInfoTemplate } from "../../../api/worker/facades/lazy/CalendarFacade.js"
import { ProgrammingError } from "../../../../common/api/common/error/ProgrammingError.js"
import { getDefaultSender } from "../../../../mail-app/mail/model/MailUtils.js"
import { SimpleTextViewModel } from "../../../../common/misc/SimpleTextViewModel.js"
import { AlarmInfoTemplate } from "../../../../common/api/worker/facades/lazy/CalendarFacade.js"
import { getEventType } from "../CalendarGuiUtils.js"
/** the type of the event determines which edit operations are available to us. */
@ -181,7 +181,7 @@ export async function makeCalendarEventModel(
showProgress: ShowProgressCallback = identity,
uiUpdateCallback: () => void = m.redraw,
): Promise<CalendarEventModel | null> {
const { htmlSanitizer } = await import("../../../misc/HtmlSanitizer.js")
const { htmlSanitizer } = await import("../../../../common/misc/HtmlSanitizer.js")
const ownMailAddresses = getOwnMailAddressesWithDefaultSenderInFront(logins, mailboxDetail, mailboxProperties)
if (operation === CalendarOperation.DeleteAll || operation === CalendarOperation.EditAll) {
assertNonNull(initialValues.uid, "tried to edit/delete all with nonexistent uid")

View file

@ -3,7 +3,7 @@
* the scenarios are mostly divided into deciding the type of operation (edit, delete, create)
* and the scope of the operation (only the clicked instance or all instances)
* */
import { CalendarEvent } from "../../../api/entities/tutanota/TypeRefs.js"
import { CalendarEvent } from "../../../../common/api/entities/tutanota/TypeRefs.js"
import type { CalendarModel } from "../../model/CalendarModel.js"
import { CalendarNotificationModel } from "./CalendarNotificationModel.js"
import { assertNotNull, identity } from "@tutao/tutanota-utils"
@ -17,9 +17,9 @@ import {
CalendarOperation,
ShowProgressCallback,
} from "./CalendarEventModel.js"
import { LoginController } from "../../../api/main/LoginController.js"
import { LoginController } from "../../../../common/api/main/LoginController.js"
import { DateTime } from "luxon"
import { RecipientField } from "../../../mail/model/MailUtils.js"
import { RecipientField } from "../../../../mail-app/mail/model/MailUtils.js"
/** when starting an edit or delete operation of an event, we
* need to know how to apply it and whether to send updates. */

View file

@ -1,4 +1,4 @@
import { CalendarEventTimes, getAllDayDateUTC, getEventWithDefaultTimes, isAllDayEvent } from "../../../api/common/utils/CommonCalendarUtils.js"
import { CalendarEventTimes, getAllDayDateUTC, getEventWithDefaultTimes, isAllDayEvent } from "../../../../common/api/common/utils/CommonCalendarUtils.js"
import { Time } from "../../date/Time.js"
import { DateTime, DurationLikeObject } from "luxon"
import {
@ -13,11 +13,11 @@ import {
incrementByRepeatPeriod,
} from "../../date/CalendarUtils.js"
import { assertNotNull, clone, filterInt, incrementDate, noOp, TIMESTAMP_ZERO_YEAR } from "@tutao/tutanota-utils"
import { CalendarEvent, CalendarRepeatRule } from "../../../api/entities/tutanota/TypeRefs.js"
import { Stripped } from "../../../api/common/utils/EntityUtils.js"
import { EndType, RepeatPeriod } from "../../../api/common/TutanotaConstants.js"
import { createDateWrapper, createRepeatRule, RepeatRule } from "../../../api/entities/sys/TypeRefs.js"
import { UserError } from "../../../api/main/UserError.js"
import { CalendarEvent, CalendarRepeatRule } from "../../../../common/api/entities/tutanota/TypeRefs.js"
import { Stripped } from "../../../../common/api/common/utils/EntityUtils.js"
import { EndType, RepeatPeriod } from "../../../../common/api/common/TutanotaConstants.js"
import { createDateWrapper, createRepeatRule, RepeatRule } from "../../../../common/api/entities/sys/TypeRefs.js"
import { UserError } from "../../../../common/api/main/UserError.js"
export type CalendarEventWhenModelResult = CalendarEventTimes & {
repeatRule: CalendarRepeatRule | null

View file

@ -6,24 +6,24 @@ import {
createEncryptedMailAddress,
EncryptedMailAddress,
Mail,
} from "../../../api/entities/tutanota/TypeRefs.js"
import { PartialRecipient, Recipient, RecipientType } from "../../../api/common/recipients/Recipient.js"
import { haveSameId, Stripped } from "../../../api/common/utils/EntityUtils.js"
import { cleanMailAddress, findRecipientWithAddress } from "../../../api/common/utils/CommonCalendarUtils.js"
import { getContactDisplayName } from "../../../contacts/model/ContactUtils.js"
} from "../../../../common/api/entities/tutanota/TypeRefs.js"
import { PartialRecipient, Recipient, RecipientType } from "../../../../common/api/common/recipients/Recipient.js"
import { haveSameId, Stripped } from "../../../../common/api/common/utils/EntityUtils.js"
import { cleanMailAddress, findRecipientWithAddress } from "../../../../common/api/common/utils/CommonCalendarUtils.js"
import { getContactDisplayName } from "../../../../mail-app/contacts/model/ContactUtils.js"
import { assertNotNull, clone, defer, DeferredObject, findAll, lazy, noOp, trisectingDiff } from "@tutao/tutanota-utils"
import { CalendarAttendeeStatus, ConversationType, ShareCapability } from "../../../api/common/TutanotaConstants.js"
import { RecipientsModel, ResolveMode } from "../../../api/main/RecipientsModel.js"
import { CalendarAttendeeStatus, ConversationType, ShareCapability } from "../../../../common/api/common/TutanotaConstants.js"
import { RecipientsModel, ResolveMode } from "../../../../common/api/main/RecipientsModel.js"
import { Guest } from "../../view/CalendarInvites.js"
import { isSecurePassword } from "../../../misc/passwords/PasswordUtils.js"
import { SendMailModel } from "../../../mail/editor/SendMailModel.js"
import { RecipientField } from "../../../mail/model/MailUtils.js"
import { isSecurePassword } from "../../../../common/misc/passwords/PasswordUtils.js"
import { SendMailModel } from "../../../../mail-app/mail/editor/SendMailModel.js"
import { RecipientField } from "../../../../mail-app/mail/model/MailUtils.js"
import { CalendarInfo } from "../../model/CalendarModel.js"
import { hasCapabilityOnGroup } from "../../../sharing/GroupUtils.js"
import { UserController } from "../../../api/main/UserController.js"
import { UserError } from "../../../api/main/UserError.js"
import { hasCapabilityOnGroup } from "../../../../common/sharing/GroupUtils.js"
import { UserController } from "../../../../common/api/main/UserController.js"
import { UserError } from "../../../../common/api/main/UserError.js"
import { CalendarOperation, EventType } from "./CalendarEventModel.js"
import { ProgrammingError } from "../../../api/common/error/ProgrammingError.js"
import { ProgrammingError } from "../../../../common/api/common/error/ProgrammingError.js"
import { CalendarNotificationSendModels } from "./CalendarNotificationModel.js"
/** there is no point in returning recipients, the SendMailModel will re-resolve them anyway. */

View file

@ -1,14 +1,14 @@
import { SendMailModel } from "../../../mail/editor/SendMailModel.js"
import { SendMailModel } from "../../../../mail-app/mail/editor/SendMailModel.js"
import { CalendarNotificationSender } from "../../view/CalendarNotificationSender.js"
import { LoginController } from "../../../api/main/LoginController.js"
import { CalendarEvent } from "../../../api/entities/tutanota/TypeRefs.js"
import { ProgrammingError } from "../../../api/common/error/ProgrammingError.js"
import { AccountType, CalendarAttendeeStatus } from "../../../api/common/TutanotaConstants.js"
import { LoginController } from "../../../../common/api/main/LoginController.js"
import { CalendarEvent } from "../../../../common/api/entities/tutanota/TypeRefs.js"
import { ProgrammingError } from "../../../../common/api/common/error/ProgrammingError.js"
import { AccountType, CalendarAttendeeStatus } from "../../../../common/api/common/TutanotaConstants.js"
import { clone } from "@tutao/tutanota-utils"
import { TooManyRequestsError } from "../../../api/common/error/RestError.js"
import { UserError } from "../../../api/main/UserError.js"
import { TooManyRequestsError } from "../../../../common/api/common/error/RestError.js"
import { UserError } from "../../../../common/api/main/UserError.js"
import { getNonOrganizerAttendees } from "./CalendarEventModel.js"
import { UpgradeRequiredError } from "../../../api/main/UpgradeRequiredError.js"
import { UpgradeRequiredError } from "../../../../common/api/main/UpgradeRequiredError.js"
/** all the people that may be interested in changes to an event get stored in these models.
* if one of them is null, it's because there is no one that needs that kind of update.
@ -40,7 +40,7 @@ export class CalendarNotificationModel {
(sendModels.updateModel != null || sendModels.cancelModel != null || sendModels.inviteModel != null) &&
!(await hasPlanWithInvites(this.loginController))
) {
const { getAvailablePlansWithCalendarInvites } = await import("../../../subscription/SubscriptionUtils.js")
const { getAvailablePlansWithCalendarInvites } = await import("../../../../common/subscription/SubscriptionUtils.js")
throw new UpgradeRequiredError("upgradeRequired_msg", await getAvailablePlansWithCalendarInvites())
}
// we need to exclude the exclusions that are only there because of altered instances specifically

View file

@ -1,32 +1,32 @@
import m, { Children, Component, Vnode } from "mithril"
import { MailRecipientsTextField } from "../../../gui/MailRecipientsTextField.js"
import { RecipientType } from "../../../api/common/recipients/Recipient.js"
import { ToggleButton } from "../../../gui/base/buttons/ToggleButton.js"
import { Icons } from "../../../gui/base/icons/Icons.js"
import { ButtonSize } from "../../../gui/base/ButtonSize.js"
import { Checkbox } from "../../../gui/base/Checkbox.js"
import { lang } from "../../../misc/LanguageViewModel.js"
import { AccountType, CalendarAttendeeStatus } from "../../../api/common/TutanotaConstants.js"
import { Autocomplete } from "../../../gui/base/TextField.js"
import { RecipientsSearchModel } from "../../../misc/RecipientsSearchModel.js"
import { MailRecipientsTextField } from "../../../../common/gui/MailRecipientsTextField.js"
import { RecipientType } from "../../../../common/api/common/recipients/Recipient.js"
import { ToggleButton } from "../../../../common/gui/base/buttons/ToggleButton.js"
import { Icons } from "../../../../common/gui/base/icons/Icons.js"
import { ButtonSize } from "../../../../common/gui/base/ButtonSize.js"
import { Checkbox } from "../../../../common/gui/base/Checkbox.js"
import { lang } from "../../../../common/misc/LanguageViewModel.js"
import { AccountType, CalendarAttendeeStatus } from "../../../../common/api/common/TutanotaConstants.js"
import { Autocomplete } from "../../../../common/gui/base/TextField.js"
import { RecipientsSearchModel } from "../../../../common/misc/RecipientsSearchModel.js"
import { noOp } from "@tutao/tutanota-utils"
import { Guest } from "../../view/CalendarInvites.js"
import { Icon } from "../../../gui/base/Icon.js"
import { theme } from "../../../gui/theme.js"
import { IconButton } from "../../../gui/base/IconButton.js"
import { BootIcons } from "../../../gui/base/icons/BootIcons.js"
import { px, size } from "../../../gui/size.js"
import { createDropdown } from "../../../gui/base/Dropdown.js"
import { Icon } from "../../../../common/gui/base/Icon.js"
import { theme } from "../../../../common/gui/theme.js"
import { IconButton } from "../../../../common/gui/base/IconButton.js"
import { BootIcons } from "../../../../common/gui/base/icons/BootIcons.js"
import { px, size } from "../../../../common/gui/size.js"
import { createDropdown } from "../../../../common/gui/base/Dropdown.js"
import { CalendarEventWhoModel } from "../eventeditor-model/CalendarEventWhoModel.js"
import { LoginController } from "../../../api/main/LoginController.js"
import { LoginController } from "../../../../common/api/main/LoginController.js"
import { CalendarEventModel, CalendarOperation } from "../eventeditor-model/CalendarEventModel.js"
import { DropDownSelector } from "../../../gui/base/DropDownSelector.js"
import { showPlanUpgradeRequiredDialog } from "../../../misc/SubscriptionDialogs.js"
import { DropDownSelector } from "../../../../common/gui/base/DropDownSelector.js"
import { showPlanUpgradeRequiredDialog } from "../../../../common/misc/SubscriptionDialogs.js"
import { hasPlanWithInvites } from "../eventeditor-model/CalendarNotificationModel.js"
import { Dialog } from "../../../gui/base/Dialog.js"
import { Dialog } from "../../../../common/gui/base/Dialog.js"
import { createAttendingItems, iconForAttendeeStatus } from "../CalendarGuiUtils.js"
import { PasswordField } from "../../../misc/passwords/PasswordField.js"
import { PasswordField } from "../../../../common/misc/passwords/PasswordField.js"
export type AttendeeListEditorAttrs = {
/** the event that is currently being edited */
@ -64,7 +64,7 @@ export class AttendeeListEditor implements Component<AttendeeListEditorAttrs> {
if (!(await hasPlanWithInvites(logins)) && !this.hasPlanWithInvites) {
if (logins.getUserController().user.accountType === AccountType.EXTERNAL) return
if (logins.getUserController().isGlobalAdmin()) {
const { getAvailablePlansWithEventInvites } = await import("../../../subscription/SubscriptionUtils.js")
const { getAvailablePlansWithEventInvites } = await import("../../../../common/subscription/SubscriptionUtils.js")
const plansWithEventInvites = await getAvailablePlansWithEventInvites()
if (plansWithEventInvites.length === 0) return
//entity event updates are too slow to call updateBusinessFeature()
@ -226,7 +226,7 @@ function renderOrganizer(organizer: Guest, { model }: Pick<AttendeeListEditorAtt
: m(IconButton, {
title: "sendMail_alt",
click: async () =>
(await import("../../../contacts/view/ContactView.js")).writeMail(
(await import("../../../../mail-app/contacts/view/ContactView.js")).writeMail(
organizer,
lang.get("repliedToEventInvite_msg", {
"{event}": model.editModels.summary.content,

View file

@ -6,27 +6,27 @@
* and which methods to call to save the changes.
*/
import { Dialog } from "../../../gui/base/Dialog.js"
import { lang } from "../../../misc/LanguageViewModel.js"
import { ButtonType } from "../../../gui/base/Button.js"
import { Keys } from "../../../api/common/TutanotaConstants.js"
import { Dialog } from "../../../../common/gui/base/Dialog.js"
import { lang } from "../../../../common/misc/LanguageViewModel.js"
import { ButtonType } from "../../../../common/gui/base/Button.js"
import { Keys } from "../../../../common/api/common/TutanotaConstants.js"
import { getStartOfTheWeekOffsetForUser, getTimeFormatForUser } from "../../date/CalendarUtils.js"
import { client } from "../../../misc/ClientDetector.js"
import type { DialogHeaderBarAttrs } from "../../../gui/base/DialogHeaderBar.js"
import { client } from "../../../../common/misc/ClientDetector.js"
import type { DialogHeaderBarAttrs } from "../../../../common/gui/base/DialogHeaderBar.js"
import { assertNotNull, noOp, Thunk } from "@tutao/tutanota-utils"
import { PosRect } from "../../../gui/base/Dropdown.js"
import { Mail } from "../../../api/entities/tutanota/TypeRefs.js"
import type { HtmlEditor } from "../../../gui/editor/HtmlEditor.js"
import { locator } from "../../../api/main/MainLocator.js"
import { PosRect } from "../../../../common/gui/base/Dropdown.js"
import { Mail } from "../../../../common/api/entities/tutanota/TypeRefs.js"
import type { HtmlEditor } from "../../../../common/gui/editor/HtmlEditor.js"
import { locator } from "../../../../common/api/main/MainLocator.js"
import { CalendarEventEditView } from "./CalendarEventEditView.js"
import { askIfShouldSendCalendarUpdatesToAttendees } from "../CalendarGuiUtils.js"
import { UserError } from "../../../api/main/UserError.js"
import { showUserError } from "../../../misc/ErrorHandlerImpl.js"
import { UserError } from "../../../../common/api/main/UserError.js"
import { showUserError } from "../../../../common/misc/ErrorHandlerImpl.js"
import { CalendarEventIdentity, CalendarEventModel, EventSaveResult } from "../eventeditor-model/CalendarEventModel.js"
import { ProgrammingError } from "../../../api/common/error/ProgrammingError.js"
import { UpgradeRequiredError } from "../../../api/main/UpgradeRequiredError.js"
import { showPlanUpgradeRequiredDialog } from "../../../misc/SubscriptionDialogs.js"
import { convertTextToHtml } from "../../../misc/Formatter.js"
import { ProgrammingError } from "../../../../common/api/common/error/ProgrammingError.js"
import { UpgradeRequiredError } from "../../../../common/api/main/UpgradeRequiredError.js"
import { showPlanUpgradeRequiredDialog } from "../../../../common/misc/SubscriptionDialogs.js"
import { convertTextToHtml } from "../../../../common/misc/Formatter.js"
const enum ConfirmationResult {
Cancel,
@ -41,7 +41,7 @@ type EditDialogOkHandler = (posRect: PosRect, finish: Thunk) => Promise<unknown>
*/
async function showCalendarEventEditDialog(model: CalendarEventModel, responseMail: Mail | null, handler: EditDialogOkHandler): Promise<void> {
const recipientsSearch = await locator.recipientsSearchModel()
const { HtmlEditor } = await import("../../../gui/editor/HtmlEditor.js")
const { HtmlEditor } = await import("../../../../common/gui/editor/HtmlEditor.js")
const groupColors: Map<Id, string> = locator.logins.getUserController().userSettingsGroupRoot.groupSettings.reduce((acc, gc) => {
acc.set(gc.group, gc.color)
return acc

View file

@ -1,27 +1,27 @@
import m, { Children, Component, Vnode } from "mithril"
import { ExpanderButton, ExpanderPanel } from "../../../gui/base/Expander.js"
import { ExpanderButton, ExpanderPanel } from "../../../../common/gui/base/Expander.js"
import { AttendeeListEditor, AttendeeListEditorAttrs } from "./AttendeeListEditor.js"
import { locator } from "../../../api/main/MainLocator.js"
import { locator } from "../../../../common/api/main/MainLocator.js"
import { EventTimeEditor, EventTimeEditorAttrs } from "./EventTimeEditor.js"
import { RepeatRuleEditor, RepeatRuleEditorAttrs } from "./RepeatRuleEditor.js"
import { TextField, TextFieldAttrs, TextFieldType } from "../../../gui/base/TextField.js"
import { defaultCalendarColor, TimeFormat } from "../../../api/common/TutanotaConstants.js"
import { lang, TranslationKey } from "../../../misc/LanguageViewModel.js"
import { RecipientsSearchModel } from "../../../misc/RecipientsSearchModel.js"
import { DropDownSelector, DropDownSelectorAttrs } from "../../../gui/base/DropDownSelector.js"
import { BootIcons } from "../../../gui/base/icons/BootIcons.js"
import { TextField, TextFieldAttrs, TextFieldType } from "../../../../common/gui/base/TextField.js"
import { defaultCalendarColor, TimeFormat } from "../../../../common/api/common/TutanotaConstants.js"
import { lang, TranslationKey } from "../../../../common/misc/LanguageViewModel.js"
import { RecipientsSearchModel } from "../../../../common/misc/RecipientsSearchModel.js"
import { DropDownSelector, DropDownSelectorAttrs } from "../../../../common/gui/base/DropDownSelector.js"
import { BootIcons } from "../../../../common/gui/base/icons/BootIcons.js"
import { CalendarInfo } from "../../model/CalendarModel.js"
import { AlarmIntervalUnit } from "../../date/CalendarUtils.js"
import { Icons } from "../../../gui/base/icons/Icons.js"
import { IconButton } from "../../../gui/base/IconButton.js"
import { ButtonSize } from "../../../gui/base/ButtonSize.js"
import { HtmlEditor } from "../../../gui/editor/HtmlEditor.js"
import { attachDropdown } from "../../../gui/base/Dropdown.js"
import { BannerType, InfoBanner, InfoBannerAttrs } from "../../../gui/base/InfoBanner.js"
import { Icons } from "../../../../common/gui/base/icons/Icons.js"
import { IconButton } from "../../../../common/gui/base/IconButton.js"
import { ButtonSize } from "../../../../common/gui/base/ButtonSize.js"
import { HtmlEditor } from "../../../../common/gui/editor/HtmlEditor.js"
import { attachDropdown } from "../../../../common/gui/base/Dropdown.js"
import { BannerType, InfoBanner, InfoBannerAttrs } from "../../../../common/gui/base/InfoBanner.js"
import { CalendarEventModel, ReadonlyReason } from "../eventeditor-model/CalendarEventModel.js"
import { Dialog } from "../../../gui/base/Dialog.js"
import { Dialog } from "../../../../common/gui/base/Dialog.js"
import { getSharedGroupName } from "../../../sharing/GroupUtils.js"
import { getSharedGroupName } from "../../../../common/sharing/GroupUtils.js"
import { createAlarmIntervalItems, createCustomRepeatRuleUnitValues, humanDescriptionForAlarmInterval } from "../CalendarGuiUtils.js"

View file

@ -1,12 +1,12 @@
import m, { Component, Vnode } from "mithril"
import { DatePicker } from "../pickers/DatePicker.js"
import { TimePicker } from "../pickers/TimePicker.js"
import { TimeFormat } from "../../../api/common/TutanotaConstants.js"
import { Checkbox } from "../../../gui/base/Checkbox.js"
import { lang } from "../../../misc/LanguageViewModel.js"
import { TimeFormat } from "../../../../common/api/common/TutanotaConstants.js"
import { Checkbox } from "../../../../common/gui/base/Checkbox.js"
import { lang } from "../../../../common/misc/LanguageViewModel.js"
import { CalendarEventWhenModel } from "../eventeditor-model/CalendarEventWhenModel.js"
import { renderTwoColumnsIfFits } from "../../../gui/base/GuiUtils.js"
import { renderTwoColumnsIfFits } from "../../../../common/gui/base/GuiUtils.js"
export type EventTimeEditorAttrs = {
startOfTheWeekOffset: number

View file

@ -1,15 +1,15 @@
import m, { Children, Component, Vnode } from "mithril"
import { CalendarEventWhenModel } from "../eventeditor-model/CalendarEventWhenModel.js"
import { TextField } from "../../../gui/base/TextField.js"
import { lang } from "../../../misc/LanguageViewModel.js"
import { DropDownSelector, DropDownSelectorAttrs, SelectorItemList } from "../../../gui/base/DropDownSelector.js"
import { EndType, RepeatPeriod } from "../../../api/common/TutanotaConstants.js"
import { BootIcons } from "../../../gui/base/icons/BootIcons.js"
import { TextField } from "../../../../common/gui/base/TextField.js"
import { lang } from "../../../../common/misc/LanguageViewModel.js"
import { DropDownSelector, DropDownSelectorAttrs, SelectorItemList } from "../../../../common/gui/base/DropDownSelector.js"
import { EndType, RepeatPeriod } from "../../../../common/api/common/TutanotaConstants.js"
import { BootIcons } from "../../../../common/gui/base/icons/BootIcons.js"
import { DatePicker } from "../pickers/DatePicker.js"
import { IconButton } from "../../../gui/base/IconButton.js"
import { Icons } from "../../../gui/base/icons/Icons.js"
import { IconButton } from "../../../../common/gui/base/IconButton.js"
import { Icons } from "../../../../common/gui/base/icons/Icons.js"
import { renderTwoColumnsIfFits } from "../../../gui/base/GuiUtils.js"
import { renderTwoColumnsIfFits } from "../../../../common/gui/base/GuiUtils.js"
import { createIntervalValues, createRepeatRuleEndTypeValues, createRepeatRuleFrequencyValues } from "../CalendarGuiUtils.js"

View file

@ -1,18 +1,18 @@
import type { Shortcut } from "../../../misc/KeyManager.js"
import type { Shortcut } from "../../../../common/misc/KeyManager.js"
import m, { Children } from "mithril"
import { px } from "../../../gui/size.js"
import { Icons } from "../../../gui/base/icons/Icons.js"
import type { ModalComponent } from "../../../gui/base/Modal.js"
import { modal } from "../../../gui/base/Modal.js"
import { px } from "../../../../common/gui/size.js"
import { Icons } from "../../../../common/gui/base/icons/Icons.js"
import type { ModalComponent } from "../../../../common/gui/base/Modal.js"
import { modal } from "../../../../common/gui/base/Modal.js"
import { EventPreviewView, EventPreviewViewAttrs } from "./EventPreviewView.js"
import { Dialog } from "../../../gui/base/Dialog.js"
import { createAsyncDropdown, DROPDOWN_MARGIN, PosRect, showDropdown } from "../../../gui/base/Dropdown.js"
import { Keys } from "../../../api/common/TutanotaConstants.js"
import type { HtmlSanitizer } from "../../../misc/HtmlSanitizer.js"
import { Dialog } from "../../../../common/gui/base/Dialog.js"
import { createAsyncDropdown, DROPDOWN_MARGIN, PosRect, showDropdown } from "../../../../common/gui/base/Dropdown.js"
import { Keys } from "../../../../common/api/common/TutanotaConstants.js"
import type { HtmlSanitizer } from "../../../../common/misc/HtmlSanitizer.js"
import { prepareCalendarDescription } from "../../date/CalendarUtils.js"
import { BootIcons } from "../../../gui/base/icons/BootIcons.js"
import { IconButton } from "../../../gui/base/IconButton.js"
import { convertTextToHtml } from "../../../misc/Formatter.js"
import { BootIcons } from "../../../../common/gui/base/icons/BootIcons.js"
import { IconButton } from "../../../../common/gui/base/IconButton.js"
import { convertTextToHtml } from "../../../../common/misc/Formatter.js"
import { CalendarEventPreviewViewModel } from "./CalendarEventPreviewViewModel.js"
import { showDeletePopup } from "../CalendarGuiUtils.js"

View file

@ -1,14 +1,14 @@
import { CalendarEvent, CalendarEventAttendee } from "../../../api/entities/tutanota/TypeRefs.js"
import { CalendarEvent, CalendarEventAttendee } from "../../../../common/api/entities/tutanota/TypeRefs.js"
import { calendarEventHasMoreThanOneOccurrencesLeft } from "../../date/CalendarUtils.js"
import { CalendarEventModel, CalendarOperation, EventSaveResult, EventType, getNonOrganizerAttendees } from "../eventeditor-model/CalendarEventModel.js"
import { NotFoundError } from "../../../api/common/error/RestError.js"
import { NotFoundError } from "../../../../common/api/common/error/RestError.js"
import { CalendarModel } from "../../model/CalendarModel.js"
import { showExistingCalendarEventEditDialog } from "../eventeditor-view/CalendarEventEditDialog.js"
import { ProgrammingError } from "../../../api/common/error/ProgrammingError.js"
import { CalendarAttendeeStatus } from "../../../api/common/TutanotaConstants.js"
import { ProgrammingError } from "../../../../common/api/common/error/ProgrammingError.js"
import { CalendarAttendeeStatus } from "../../../../common/api/common/TutanotaConstants.js"
import m from "mithril"
import { clone, Thunk } from "@tutao/tutanota-utils"
import { CalendarEventUidIndexEntry } from "../../../api/worker/facades/lazy/CalendarFacade.js"
import { CalendarEventUidIndexEntry } from "../../../../common/api/worker/facades/lazy/CalendarFacade.js"
/**
* makes decisions about which operations are available from the popup and knows how to implement them depending on the event's type.
@ -212,7 +212,7 @@ export class CalendarEventPreviewViewModel {
}
async sanitizeDescription(): Promise<void> {
const { htmlSanitizer } = await import("../../../misc/HtmlSanitizer.js")
const { htmlSanitizer } = await import("../../../../common/misc/HtmlSanitizer.js")
this.sanitizedDescription = htmlSanitizer.sanitizeHTML(this.calendarEvent.description, {
blockExternalContent: true,
}).html

View file

@ -1,26 +1,26 @@
import type { CalendarEvent, CalendarEventAttendee, CalendarRepeatRule, EncryptedMailAddress } from "../../../api/entities/tutanota/TypeRefs.js"
import { createCalendarEventAttendee, createEncryptedMailAddress } from "../../../api/entities/tutanota/TypeRefs.js"
import type { CalendarEvent, CalendarEventAttendee, CalendarRepeatRule, EncryptedMailAddress } from "../../../../common/api/entities/tutanota/TypeRefs.js"
import { createCalendarEventAttendee, createEncryptedMailAddress } from "../../../../common/api/entities/tutanota/TypeRefs.js"
import m, { Children, Component, Vnode } from "mithril"
import { AllIcons, Icon } from "../../../gui/base/Icon.js"
import { theme } from "../../../gui/theme.js"
import { BootIcons } from "../../../gui/base/icons/BootIcons.js"
import { Icons } from "../../../gui/base/icons/Icons.js"
import { AllIcons, Icon } from "../../../../common/gui/base/Icon.js"
import { theme } from "../../../../common/gui/theme.js"
import { BootIcons } from "../../../../common/gui/base/icons/BootIcons.js"
import { Icons } from "../../../../common/gui/base/icons/Icons.js"
import { getRepeatEndTimeForDisplay, getTimeZone } from "../../date/CalendarUtils.js"
import { CalendarAttendeeStatus, EndType, getAttendeeStatus, RepeatPeriod } from "../../../api/common/TutanotaConstants.js"
import { CalendarAttendeeStatus, EndType, getAttendeeStatus, RepeatPeriod } from "../../../../common/api/common/TutanotaConstants.js"
import { downcast, memoized } from "@tutao/tutanota-utils"
import { lang, TranslationKey } from "../../../misc/LanguageViewModel.js"
import type { RepeatRule } from "../../../api/entities/sys/TypeRefs.js"
import { cleanMailAddress, findAttendeeInAddresses, isAllDayEvent } from "../../../api/common/utils/CommonCalendarUtils.js"
import { formatDateWithMonth } from "../../../misc/Formatter.js"
import { BannerButton, BannerButtonAttrs } from "../../../gui/base/buttons/BannerButton.js"
import { pureComponent } from "../../../gui/base/PureComponent.js"
import { lang, TranslationKey } from "../../../../common/misc/LanguageViewModel.js"
import type { RepeatRule } from "../../../../common/api/entities/sys/TypeRefs.js"
import { cleanMailAddress, findAttendeeInAddresses, isAllDayEvent } from "../../../../common/api/common/utils/CommonCalendarUtils.js"
import { formatDateWithMonth } from "../../../../common/misc/Formatter.js"
import { BannerButton, BannerButtonAttrs } from "../../../../common/gui/base/buttons/BannerButton.js"
import { pureComponent } from "../../../../common/gui/base/PureComponent.js"
import { CalendarEventPreviewViewModel } from "./CalendarEventPreviewViewModel.js"
import { UpgradeRequiredError } from "../../../api/main/UpgradeRequiredError.js"
import { showPlanUpgradeRequiredDialog } from "../../../misc/SubscriptionDialogs.js"
import { ExternalLink } from "../../../gui/base/ExternalLink.js"
import { UpgradeRequiredError } from "../../../../common/api/main/UpgradeRequiredError.js"
import { showPlanUpgradeRequiredDialog } from "../../../../common/misc/SubscriptionDialogs.js"
import { ExternalLink } from "../../../../common/gui/base/ExternalLink.js"
import { createRepeatRuleFrequencyValues, formatEventDuration, iconForAttendeeStatus } from "../CalendarGuiUtils.js"
import { hasError } from "../../../api/common/utils/ErrorUtils.js"
import { hasError } from "../../../../common/api/common/utils/ErrorUtils.js"
export type EventPreviewViewAttrs = {
event: Omit<CalendarEvent, "description">

View file

@ -1,22 +1,22 @@
import m, { Children, Component, Vnode } from "mithril"
import { client } from "../../../misc/ClientDetector.js"
import { formatDate, formatDateWithWeekdayAndYear, formatMonthWithFullYear } from "../../../misc/Formatter.js"
import type { TranslationText } from "../../../misc/LanguageViewModel.js"
import { lang } from "../../../misc/LanguageViewModel.js"
import { px } from "../../../gui/size.js"
import { theme } from "../../../gui/theme.js"
import { client } from "../../../../common/misc/ClientDetector.js"
import { formatDate, formatDateWithWeekdayAndYear, formatMonthWithFullYear } from "../../../../common/misc/Formatter.js"
import type { TranslationText } from "../../../../common/misc/LanguageViewModel.js"
import { lang } from "../../../../common/misc/LanguageViewModel.js"
import { px } from "../../../../common/gui/size.js"
import { theme } from "../../../../common/gui/theme.js"
import { getStartOfDay, isSameDayOfDate } from "@tutao/tutanota-utils"
import { DateTime } from "luxon"
import { getAllDayDateLocal } from "../../../api/common/utils/CommonCalendarUtils.js"
import { TextField } from "../../../gui/base/TextField.js"
import { getAllDayDateLocal } from "../../../../common/api/common/utils/CommonCalendarUtils.js"
import { TextField } from "../../../../common/gui/base/TextField.js"
import type { CalendarDay } from "../../date/CalendarUtils.js"
import { parseDate } from "../../../misc/DateParser.js"
import renderSwitchMonthArrowIcon from "../../../gui/base/buttons/ArrowButton.js"
import { parseDate } from "../../../../common/misc/DateParser.js"
import renderSwitchMonthArrowIcon from "../../../../common/gui/base/buttons/ArrowButton.js"
import { getCalendarMonth } from "../CalendarGuiUtils.js"
import { isKeyPressed, keyboardEventToKeyPress, keyHandler, KeyPress, useKeyHandler } from "../../../misc/KeyManager.js"
import { Keys, TabIndex } from "../../../api/common/TutanotaConstants.js"
import { AriaPopupType } from "../../../gui/AriaUtils.js"
import { isKeyPressed, keyboardEventToKeyPress, keyHandler, KeyPress, useKeyHandler } from "../../../../common/misc/KeyManager.js"
import { Keys, TabIndex } from "../../../../common/api/common/TutanotaConstants.js"
import { AriaPopupType } from "../../../../common/gui/AriaUtils.js"
export interface DatePickerAttrs {
date: Date

View file

@ -1,11 +1,11 @@
import m, { Component } from "mithril"
import { Dialog, DialogType } from "../../../gui/base/Dialog.js"
import { lang } from "../../../misc/LanguageViewModel.js"
import { Dialog, DialogType } from "../../../../common/gui/base/Dialog.js"
import { lang } from "../../../../common/misc/LanguageViewModel.js"
import { DatePicker } from "./DatePicker.js"
import { px, size } from "../../../gui/size.js"
import { client } from "../../../misc/ClientDetector.js"
import { formatDateWithWeekdayAndYear } from "../../../misc/Formatter.js"
import { assertMainOrNode } from "../../../api/common/Env.js"
import { px, size } from "../../../../common/gui/size.js"
import { client } from "../../../../common/misc/ClientDetector.js"
import { formatDateWithWeekdayAndYear } from "../../../../common/misc/Formatter.js"
import { assertMainOrNode } from "../../../../common/api/common/Env.js"
import { debounceStart, NBSP, noOp } from "@tutao/tutanota-utils"
assertMainOrNode()

View file

@ -1,11 +1,11 @@
import m, { Children, Component, Vnode, VnodeDOM } from "mithril"
import { TextField, TextFieldType as TextFieldType } from "../../../gui/base/TextField.js"
import { theme } from "../../../gui/theme.js"
import { client } from "../../../misc/ClientDetector.js"
import { Keys, TimeFormat } from "../../../api/common/TutanotaConstants.js"
import { timeStringFromParts } from "../../../misc/Formatter.js"
import { TextField, TextFieldType as TextFieldType } from "../../../../common/gui/base/TextField.js"
import { theme } from "../../../../common/gui/theme.js"
import { client } from "../../../../common/misc/ClientDetector.js"
import { Keys, TimeFormat } from "../../../../common/api/common/TutanotaConstants.js"
import { timeStringFromParts } from "../../../../common/misc/Formatter.js"
import { Time } from "../../date/Time.js"
import { isKeyPressed } from "../../../misc/KeyManager.js"
import { isKeyPressed } from "../../../../common/misc/KeyManager.js"
export type TimePickerAttrs = {
time: Time | null

View file

@ -1,9 +1,9 @@
import type { $Promisable, DeferredObject, Require } from "@tutao/tutanota-utils"
import { assertNotNull, clone, defer, downcast, filterInt, getFromMap, isSameDay, symmetricDifference } from "@tutao/tutanota-utils"
import { CalendarMethod, FeatureType, GroupType, OperationType } from "../../api/common/TutanotaConstants"
import { CalendarMethod, FeatureType, GroupType, OperationType } from "../../../common/api/common/TutanotaConstants"
import { EventController } from "../../api/main/EventController"
import type { Group, GroupInfo, User, UserAlarmInfo } from "../../api/entities/sys/TypeRefs.js"
import { EventController } from "../../../common/api/main/EventController"
import type { Group, GroupInfo, User, UserAlarmInfo } from "../../../common/api/entities/sys/TypeRefs.js"
import {
createDateWrapper,
createMembershipRemoveData,
@ -11,7 +11,7 @@ import {
GroupMembership,
GroupTypeRef,
UserAlarmInfoTypeRef,
} from "../../api/entities/sys/TypeRefs.js"
} from "../../../common/api/entities/sys/TypeRefs.js"
import {
CalendarEvent,
CalendarEventTypeRef,
@ -21,34 +21,39 @@ import {
CalendarGroupRootTypeRef,
createGroupSettings,
FileTypeRef,
} from "../../api/entities/tutanota/TypeRefs.js"
import { isApp, isDesktop } from "../../api/common/Env"
import type { LoginController } from "../../api/main/LoginController"
import { LockedError, NotAuthorizedError, NotFoundError, PreconditionFailedError } from "../../api/common/error/RestError"
} from "../../../common/api/entities/tutanota/TypeRefs.js"
import { isApp, isDesktop } from "../../../common/api/common/Env"
import type { LoginController } from "../../../common/api/main/LoginController"
import { LockedError, NotAuthorizedError, NotFoundError, PreconditionFailedError } from "../../../common/api/common/error/RestError"
import type { ParsedCalendarData } from "../export/CalendarImporter"
import { ParserError } from "../../misc/parsing/ParserCombinator"
import { ProgressTracker } from "../../api/main/ProgressTracker"
import type { IProgressMonitor } from "../../api/common/utils/ProgressMonitor"
import { NoopProgressMonitor } from "../../api/common/utils/ProgressMonitor"
import { EntityClient } from "../../api/common/EntityClient"
import type { MailModel } from "../../mail/model/MailModel"
import { elementIdPart, getElementId, isSameId, listIdPart, removeTechnicalFields } from "../../api/common/utils/EntityUtils"
import { ParserError } from "../../../common/misc/parsing/ParserCombinator"
import { ProgressTracker } from "../../../common/api/main/ProgressTracker"
import type { IProgressMonitor } from "../../../common/api/common/utils/ProgressMonitor"
import { NoopProgressMonitor } from "../../../common/api/common/utils/ProgressMonitor"
import { EntityClient } from "../../../common/api/common/EntityClient"
import type { MailModel } from "../../../mail-app/mail/model/MailModel"
import { elementIdPart, getElementId, isSameId, listIdPart, removeTechnicalFields } from "../../../common/api/common/utils/EntityUtils"
import type { AlarmScheduler } from "../date/AlarmScheduler.js"
import { Notifications, NotificationType } from "../../gui/Notifications"
import { Notifications, NotificationType } from "../../../common/gui/Notifications"
import m from "mithril"
import type { CalendarEventInstance, CalendarEventProgenitor, CalendarFacade } from "../../api/worker/facades/lazy/CalendarFacade.js"
import { AlarmInfoTemplate, CachingMode, CalendarEventAlteredInstance, CalendarEventUidIndexEntry } from "../../api/worker/facades/lazy/CalendarFacade.js"
import { IServiceExecutor } from "../../api/common/ServiceRequest"
import { MembershipService } from "../../api/entities/sys/Services"
import { FileController } from "../../file/FileController"
import { findAttendeeInAddresses } from "../../api/common/utils/CommonCalendarUtils.js"
import type { CalendarEventInstance, CalendarEventProgenitor, CalendarFacade } from "../../../common/api/worker/facades/lazy/CalendarFacade.js"
import {
AlarmInfoTemplate,
CachingMode,
CalendarEventAlteredInstance,
CalendarEventUidIndexEntry,
} from "../../../common/api/worker/facades/lazy/CalendarFacade.js"
import { IServiceExecutor } from "../../../common/api/common/ServiceRequest"
import { MembershipService } from "../../../common/api/entities/sys/Services"
import { FileController } from "../../../common/file/FileController"
import { findAttendeeInAddresses } from "../../../common/api/common/utils/CommonCalendarUtils.js"
import { TutanotaError } from "@tutao/tutanota-error"
import { SessionKeyNotFoundError } from "../../api/common/error/SessionKeyNotFoundError.js"
import { SessionKeyNotFoundError } from "../../../common/api/common/error/SessionKeyNotFoundError.js"
import Stream from "mithril/stream"
import { ObservableLazyLoaded } from "../../api/common/utils/ObservableLazyLoaded.js"
import { UserController } from "../../api/main/UserController.js"
import { formatDateWithWeekdayAndTime, formatTime } from "../../misc/Formatter.js"
import { EntityUpdateData, isUpdateFor, isUpdateForTypeRef } from "../../api/common/utils/EntityUpdateUtils.js"
import { ObservableLazyLoaded } from "../../../common/api/common/utils/ObservableLazyLoaded.js"
import { UserController } from "../../../common/api/main/UserController.js"
import { formatDateWithWeekdayAndTime, formatTime } from "../../../common/misc/Formatter.js"
import { EntityUpdateData, isUpdateFor, isUpdateForTypeRef } from "../../../common/api/common/utils/EntityUpdateUtils.js"
const TAG = "[CalendarModel]"
export type CalendarInfo = {

View file

@ -1,11 +1,11 @@
import m, { Children, Component, Vnode } from "mithril"
import { CalendarEvent } from "../../api/entities/tutanota/TypeRefs.js"
import { stateBgFocus, stateBgHover } from "../../gui/builtinThemes.js"
import { theme } from "../../gui/theme.js"
import { styles } from "../../gui/styles.js"
import { DefaultAnimationTime } from "../../gui/animation/Animations.js"
import { px } from "../../gui/size.js"
import { TabIndex } from "../../api/common/TutanotaConstants.js"
import { CalendarEvent } from "../../../common/api/entities/tutanota/TypeRefs.js"
import { stateBgFocus, stateBgHover } from "../../../common/gui/builtinThemes.js"
import { theme } from "../../../common/gui/theme.js"
import { styles } from "../../../common/gui/styles.js"
import { DefaultAnimationTime } from "../../../common/gui/animation/Animations.js"
import { px } from "../../../common/gui/size.js"
import { TabIndex } from "../../../common/api/common/TutanotaConstants.js"
export interface CalendarAgendaItemViewAttrs {
day: Date

View file

@ -1,31 +1,31 @@
import m, { Child, Children, Component, Vnode, VnodeDOM } from "mithril"
import { incrementDate, isSameDay } from "@tutao/tutanota-utils"
import { lang } from "../../misc/LanguageViewModel"
import { lang } from "../../../common/misc/LanguageViewModel"
import { getTimeZone } from "../date/CalendarUtils"
import type { CalendarEvent } from "../../api/entities/tutanota/TypeRefs.js"
import type { CalendarEvent } from "../../../common/api/entities/tutanota/TypeRefs.js"
import type { GroupColors } from "./CalendarView"
import type { CalendarEventBubbleClickHandler, CalendarEventBubbleKeyDownHandler } from "./CalendarViewModel"
import { styles } from "../../gui/styles.js"
import { styles } from "../../../common/gui/styles.js"
import { DateTime } from "luxon"
import { CalendarAgendaItemView } from "./CalendarAgendaItemView.js"
import ColumnEmptyMessageBox from "../../gui/base/ColumnEmptyMessageBox.js"
import { BootIcons } from "../../gui/base/icons/BootIcons.js"
import { theme } from "../../gui/theme.js"
import { px, size } from "../../gui/size.js"
import ColumnEmptyMessageBox from "../../../common/gui/base/ColumnEmptyMessageBox.js"
import { BootIcons } from "../../../common/gui/base/icons/BootIcons.js"
import { theme } from "../../../common/gui/theme.js"
import { px, size } from "../../../common/gui/size.js"
import { DaySelector } from "../gui/day-selector/DaySelector.js"
import { CalendarEventPreviewViewModel } from "../gui/eventpopup/CalendarEventPreviewViewModel.js"
import { EventDetailsView } from "./EventDetailsView.js"
import { getElementId, getListId } from "../../api/common/utils/EntityUtils.js"
import { isAllDayEvent } from "../../api/common/utils/CommonCalendarUtils.js"
import { getElementId, getListId } from "../../../common/api/common/utils/EntityUtils.js"
import { isAllDayEvent } from "../../../common/api/common/utils/CommonCalendarUtils.js"
import { CalendarTimeIndicator } from "./CalendarTimeIndicator.js"
import { Time } from "../date/Time.js"
import { DaysToEvents } from "../date/CalendarEventsRepository.js"
import { formatEventTimes, getEventColor, shouldDisplayEvent } from "../gui/CalendarGuiUtils.js"
import { PageView } from "../../gui/base/PageView.js"
import { getIfLargeScroll } from "../../gui/base/GuiUtils.js"
import { isKeyPressed } from "../../misc/KeyManager.js"
import { Keys } from "../../api/common/TutanotaConstants.js"
import { PageView } from "../../../common/gui/base/PageView.js"
import { getIfLargeScroll } from "../../../common/gui/base/GuiUtils.js"
import { isKeyPressed } from "../../../common/misc/KeyManager.js"
import { Keys } from "../../../common/api/common/TutanotaConstants.js"
export type CalendarAgendaViewAttrs = {
selectedDate: Date

View file

@ -1,11 +1,11 @@
import m, { ChildArray, Children, Component, Vnode } from "mithril"
import { px, size } from "../../gui/size"
import { px, size } from "../../../common/gui/size"
import { DAY_IN_MILLIS, downcast, getEndOfDay, getStartOfDay, mapNullable, neverNull, numberRange } from "@tutao/tutanota-utils"
import { eventEndsAfterDay, eventStartsBefore, getTimeTextFormatForLongEvent, getTimeZone, hasAlarmsForTheUser } from "../date/CalendarUtils"
import { CalendarEventBubble } from "./CalendarEventBubble"
import type { CalendarEvent } from "../../api/entities/tutanota/TypeRefs.js"
import type { CalendarEvent } from "../../../common/api/entities/tutanota/TypeRefs.js"
import { Time } from "../date/Time.js"
import { getPosAndBoundsFromMouseEvent } from "../../gui/base/GuiUtils"
import { getPosAndBoundsFromMouseEvent } from "../../../common/gui/base/GuiUtils"
import {
EventLayoutMode,
expandEvent,
@ -17,8 +17,8 @@ import {
} from "../gui/CalendarGuiUtils.js"
import type { CalendarEventBubbleClickHandler, CalendarEventBubbleKeyDownHandler } from "./CalendarViewModel"
import type { GroupColors } from "./CalendarView"
import { styles } from "../../gui/styles"
import { locator } from "../../api/main/MainLocator.js"
import { styles } from "../../../common/gui/styles"
import { locator } from "../../../common/api/main/MainLocator.js"
import { CalendarTimeIndicator } from "./CalendarTimeIndicator.js"
export type Attrs = {

View file

@ -1,10 +1,10 @@
import { CalendarNavConfiguration, CalendarViewType, getIconForViewType } from "../gui/CalendarGuiUtils.js"
import m, { Children, Component, Vnode } from "mithril"
import { theme } from "../../gui/theme.js"
import { px, size } from "../../gui/size.js"
import { lang, TranslationText } from "../../misc/LanguageViewModel.js"
import { IconSegmentControl } from "../../gui/base/IconSegmentControl.js"
import { AllIcons } from "../../gui/base/Icon.js"
import { theme } from "../../../common/gui/theme.js"
import { px, size } from "../../../common/gui/size.js"
import { lang, TranslationText } from "../../../common/misc/LanguageViewModel.js"
import { IconSegmentControl } from "../../../common/gui/base/IconSegmentControl.js"
import { AllIcons } from "../../../common/gui/base/Icon.js"
import { TodayIconButton } from "./TodayIconButton.js"
type CalendarDesktopToolbarAttrs = {

View file

@ -1,10 +1,10 @@
import m, { Child, Children, Component, Vnode } from "mithril"
import { px, size } from "../../gui/size"
import { Icon } from "../../gui/base/Icon"
import { Icons } from "../../gui/base/icons/Icons"
import type { ClickHandler } from "../../gui/base/GuiUtils"
import { px, size } from "../../../common/gui/size"
import { Icon } from "../../../common/gui/base/Icon"
import { Icons } from "../../../common/gui/base/icons/Icons"
import type { ClickHandler } from "../../../common/gui/base/GuiUtils"
import { colorForBg } from "../gui/CalendarGuiUtils.js"
import { TabIndex } from "../../api/common/TutanotaConstants.js"
import { TabIndex } from "../../../common/api/common/TutanotaConstants.js"
export type CalendarEventBubbleAttrs = {
text: string

View file

@ -1,25 +1,25 @@
import { parseCalendarFile } from "../export/CalendarImporter.js"
import type { CalendarEvent, CalendarEventAttendee, File as TutanotaFile, Mail, MailboxProperties } from "../../api/entities/tutanota/TypeRefs.js"
import { locator } from "../../api/main/MainLocator.js"
import { CalendarAttendeeStatus, CalendarMethod, ConversationType, FeatureType, getAsEnumValue } from "../../api/common/TutanotaConstants.js"
import type { CalendarEvent, CalendarEventAttendee, File as TutanotaFile, Mail, MailboxProperties } from "../../../common/api/entities/tutanota/TypeRefs.js"
import { locator } from "../../../common/api/main/MainLocator.js"
import { CalendarAttendeeStatus, CalendarMethod, ConversationType, FeatureType, getAsEnumValue } from "../../../common/api/common/TutanotaConstants.js"
import { assert, assertNotNull, clone, filterInt, noOp, Require } from "@tutao/tutanota-utils"
import { findPrivateCalendar } from "../date/CalendarUtils.js"
import { CalendarNotificationSender } from "./CalendarNotificationSender.js"
import { Dialog } from "../../gui/base/Dialog.js"
import { UserError } from "../../api/main/UserError.js"
import { DataFile } from "../../api/common/DataFile.js"
import { findAttendeeInAddresses } from "../../api/common/utils/CommonCalendarUtils.js"
import { Recipient } from "../../api/common/recipients/Recipient.js"
import { SendMailModel } from "../../mail/editor/SendMailModel.js"
import { Dialog } from "../../../common/gui/base/Dialog.js"
import { UserError } from "../../../common/api/main/UserError.js"
import { DataFile } from "../../../common/api/common/DataFile.js"
import { findAttendeeInAddresses } from "../../../common/api/common/utils/CommonCalendarUtils.js"
import { Recipient } from "../../../common/api/common/recipients/Recipient.js"
import { SendMailModel } from "../../../mail-app/mail/editor/SendMailModel.js"
import { CalendarEventModel, CalendarOperation, EventType } from "../gui/eventeditor-model/CalendarEventModel.js"
import { CalendarNotificationModel } from "../gui/eventeditor-model/CalendarNotificationModel.js"
import { RecipientField } from "../../mail/model/MailUtils.js"
import { ResolveMode } from "../../api/main/RecipientsModel.js"
import { isCustomizationEnabledForCustomer } from "../../api/common/utils/CustomerUtils.js"
import { RecipientField } from "../../../mail-app/mail/model/MailUtils.js"
import { ResolveMode } from "../../../common/api/main/RecipientsModel.js"
import { isCustomizationEnabledForCustomer } from "../../../common/api/common/utils/CustomerUtils.js"
import { getEventType } from "../gui/CalendarGuiUtils.js"
import { MailboxDetail, MailModel } from "../../mail/model/MailModel.js"
import { MailboxDetail, MailModel } from "../../../mail-app/mail/model/MailModel.js"
import { CalendarModel } from "../model/CalendarModel.js"
import { LoginController } from "../../api/main/LoginController.js"
import { LoginController } from "../../../common/api/main/LoginController.js"
// not picking the status directly from CalendarEventAttendee because it's a NumberString
export type Guest = Recipient & { status: CalendarAttendeeStatus }
@ -54,7 +54,7 @@ export async function showEventDetails(event: CalendarEvent, eventBubbleRect: Cl
getLatestEvent(event),
import("../gui/eventpopup/CalendarEventPopup.js"),
import("../gui/eventpopup/CalendarEventPreviewViewModel.js"),
import("../../misc/HtmlSanitizer.js"),
import("../../../common/misc/HtmlSanitizer.js"),
])
let eventType: EventType

View file

@ -1,21 +1,21 @@
import m, { Children, Component, Vnode } from "mithril"
import { IconButton } from "../../gui/base/IconButton.js"
import { ViewSlider } from "../../gui/nav/ViewSlider.js"
import { BaseMobileHeader } from "../../gui/BaseMobileHeader.js"
import { OfflineIndicator } from "../../gui/base/OfflineIndicator.js"
import { ProgressBar } from "../../gui/base/ProgressBar.js"
import { Icons } from "../../gui/base/icons/Icons.js"
import { IconButton } from "../../../common/gui/base/IconButton.js"
import { ViewSlider } from "../../../common/gui/nav/ViewSlider.js"
import { BaseMobileHeader } from "../../../common/gui/BaseMobileHeader.js"
import { OfflineIndicator } from "../../../common/gui/base/OfflineIndicator.js"
import { ProgressBar } from "../../../common/gui/base/ProgressBar.js"
import { Icons } from "../../../common/gui/base/icons/Icons.js"
import { CalendarNavConfiguration, CalendarViewType, getIconForViewType } from "../gui/CalendarGuiUtils.js"
import { MobileHeaderMenuButton, MobileHeaderTitle } from "../../gui/MobileHeader.js"
import { AppHeaderAttrs } from "../../gui/Header.js"
import { attachDropdown } from "../../gui/base/Dropdown.js"
import { TranslationKey } from "../../misc/LanguageViewModel.js"
import { styles } from "../../gui/styles.js"
import { theme } from "../../gui/theme.js"
import { ClickHandler } from "../../gui/base/GuiUtils.js"
import { MobileHeaderMenuButton, MobileHeaderTitle } from "../../../common/gui/MobileHeader.js"
import { AppHeaderAttrs } from "../../../common/gui/Header.js"
import { attachDropdown } from "../../../common/gui/base/Dropdown.js"
import { TranslationKey } from "../../../common/misc/LanguageViewModel.js"
import { styles } from "../../../common/gui/styles.js"
import { theme } from "../../../common/gui/theme.js"
import { ClickHandler } from "../../../common/gui/base/GuiUtils.js"
import { TodayIconButton } from "./TodayIconButton.js"
import { ExpanderButton } from "../../gui/base/Expander.js"
import { isApp } from "../../api/common/Env.js"
import { ExpanderButton } from "../../../common/gui/base/Expander.js"
import { isApp } from "../../../common/api/common/Env.js"
export interface CalendarMobileHeaderAttrs extends AppHeaderAttrs {
viewType: CalendarViewType

View file

@ -1,6 +1,6 @@
import m, { Children, ClassComponent, Component, Vnode, VnodeDOM } from "mithril"
import { px, size } from "../../gui/size"
import { EventTextTimeOption, WeekStart } from "../../api/common/TutanotaConstants"
import { px, size } from "../../../common/gui/size"
import { EventTextTimeOption, WeekStart } from "../../../common/api/common/TutanotaConstants"
import type { CalendarDay, CalendarMonth } from "../date/CalendarUtils"
import {
getAllDayDateForTimezone,
@ -14,16 +14,16 @@ import {
} from "../date/CalendarUtils"
import { incrementDate, incrementMonth, isToday, lastThrow, neverNull, ofClass } from "@tutao/tutanota-utils"
import { ContinuingCalendarEventBubble } from "./ContinuingCalendarEventBubble"
import { styles } from "../../gui/styles"
import { isAllDayEvent, isAllDayEventByTimes } from "../../api/common/utils/CommonCalendarUtils"
import { windowFacade } from "../../misc/WindowFacade"
import type { CalendarEvent } from "../../api/entities/tutanota/TypeRefs.js"
import { styles } from "../../../common/gui/styles"
import { isAllDayEvent, isAllDayEventByTimes } from "../../../common/api/common/utils/CommonCalendarUtils"
import { windowFacade } from "../../../common/misc/WindowFacade"
import type { CalendarEvent } from "../../../common/api/entities/tutanota/TypeRefs.js"
import type { GroupColors } from "./CalendarView"
import type { EventDragHandlerCallbacks, MousePos } from "./EventDragHandler"
import { EventDragHandler } from "./EventDragHandler"
import { getPosAndBoundsFromMouseEvent } from "../../gui/base/GuiUtils"
import { UserError } from "../../api/main/UserError"
import { showUserError } from "../../misc/ErrorHandlerImpl"
import { getPosAndBoundsFromMouseEvent } from "../../../common/gui/base/GuiUtils"
import { UserError } from "../../../common/api/main/UserError"
import { showUserError } from "../../../common/misc/ErrorHandlerImpl"
import {
CALENDAR_EVENT_HEIGHT,
CalendarViewType,
@ -38,9 +38,9 @@ import {
} from "../gui/CalendarGuiUtils.js"
import type { CalendarEventBubbleClickHandler, CalendarEventBubbleKeyDownHandler, EventsOnDays } from "./CalendarViewModel"
import { Time } from "../date/Time.js"
import { client } from "../../misc/ClientDetector"
import { locator } from "../../api/main/MainLocator.js"
import { PageView } from "../../gui/base/PageView.js"
import { client } from "../../../common/misc/ClientDetector"
import { locator } from "../../../common/api/main/MainLocator.js"
import { PageView } from "../../../common/gui/base/PageView.js"
import { DaysToEvents } from "../date/CalendarEventsRepository.js"
type CalendarMonthAttrs = {

View file

@ -1,16 +1,16 @@
import { lang } from "../../misc/LanguageViewModel.js"
import { lang } from "../../../common/misc/LanguageViewModel.js"
import { makeInvitationCalendarFile } from "../export/CalendarExporter.js"
import { getAttendeeStatus, MailMethod, mailMethodToCalendarMethod } from "../../api/common/TutanotaConstants.js"
import { getAttendeeStatus, MailMethod, mailMethodToCalendarMethod } from "../../../common/api/common/TutanotaConstants.js"
import { getTimeZone } from "../date/CalendarUtils.js"
import type { CalendarEvent, CalendarEventAttendee, EncryptedMailAddress } from "../../api/entities/tutanota/TypeRefs.js"
import { createCalendarEventAttendee } from "../../api/entities/tutanota/TypeRefs.js"
import type { CalendarEvent, CalendarEventAttendee, EncryptedMailAddress } from "../../../common/api/entities/tutanota/TypeRefs.js"
import { createCalendarEventAttendee } from "../../../common/api/entities/tutanota/TypeRefs.js"
import { assertNotNull, noOp, ofClass } from "@tutao/tutanota-utils"
import type { SendMailModel } from "../../mail/editor/SendMailModel.js"
import { windowFacade } from "../../misc/WindowFacade.js"
import { RecipientsNotFoundError } from "../../api/common/error/RecipientsNotFoundError.js"
import { RecipientField } from "../../mail/model/MailUtils.js"
import { cleanMailAddress, findAttendeeInAddresses, findRecipientWithAddress } from "../../api/common/utils/CommonCalendarUtils.js"
import { ProgrammingError } from "../../api/common/error/ProgrammingError.js"
import type { SendMailModel } from "../../../mail-app/mail/editor/SendMailModel.js"
import { windowFacade } from "../../../common/misc/WindowFacade.js"
import { RecipientsNotFoundError } from "../../../common/api/common/error/RecipientsNotFoundError.js"
import { RecipientField } from "../../../mail-app/mail/model/MailUtils.js"
import { cleanMailAddress, findAttendeeInAddresses, findRecipientWithAddress } from "../../../common/api/common/utils/CommonCalendarUtils.js"
import { ProgrammingError } from "../../../common/api/common/error/ProgrammingError.js"
import { calendarAttendeeStatusSymbol, formatEventDuration } from "../gui/CalendarGuiUtils.js"

View file

@ -1,13 +1,13 @@
import type { CalendarEvent } from "../../api/entities/tutanota/TypeRefs.js"
import { locator } from "../../api/main/MainLocator.js"
import type { CalendarEvent } from "../../../common/api/entities/tutanota/TypeRefs.js"
import { locator } from "../../../common/api/main/MainLocator.js"
import m, { Children, VnodeDOM } from "mithril"
import { SelectableRowContainer, SelectableRowContainerAttrs, SelectableRowSelectedSetter } from "../../gui/SelectableRowContainer.js"
import { VirtualRow } from "../../gui/base/ListUtils.js"
import { SelectableRowContainer, SelectableRowContainerAttrs, SelectableRowSelectedSetter } from "../../../common/gui/SelectableRowContainer.js"
import { VirtualRow } from "../../../common/gui/base/ListUtils.js"
import { getTimeZone } from "../date/CalendarUtils.js"
import { ViewHolder } from "../../gui/base/List.js"
import { styles } from "../../gui/styles.js"
import { DefaultAnimationTime } from "../../gui/animation/Animations.js"
import { ViewHolder } from "../../../common/gui/base/List.js"
import { styles } from "../../../common/gui/styles.js"
import { DefaultAnimationTime } from "../../../common/gui/animation/Animations.js"
import { formatEventDuration, getEventColor, getGroupColors } from "../gui/CalendarGuiUtils.js"
import { GroupColors } from "./CalendarView.js"

View file

@ -1,5 +1,5 @@
import m, { Children, Component, Vnode } from "mithril"
import { px, size } from "../../gui/size.js"
import { px, size } from "../../../common/gui/size.js"
export type CalendarTimeIndicatorAttrs = {
/** Make the circle tangent to the left side of the line rather than intersecting it */

View file

@ -1,39 +1,39 @@
import m, { Children, Component, Vnode } from "mithril"
import { AppHeaderAttrs, Header } from "../../gui/Header.js"
import { ColumnType, ViewColumn } from "../../gui/base/ViewColumn"
import { lang } from "../../misc/LanguageViewModel"
import { ViewSlider } from "../../gui/nav/ViewSlider.js"
import type { Key, Shortcut } from "../../misc/KeyManager"
import { isKeyPressed, keyManager } from "../../misc/KeyManager"
import { Icons } from "../../gui/base/icons/Icons"
import { AppHeaderAttrs, Header } from "../../../common/gui/Header.js"
import { ColumnType, ViewColumn } from "../../../common/gui/base/ViewColumn"
import { lang } from "../../../common/misc/LanguageViewModel"
import { ViewSlider } from "../../../common/gui/nav/ViewSlider.js"
import type { Key, Shortcut } from "../../../common/misc/KeyManager"
import { isKeyPressed, keyManager } from "../../../common/misc/KeyManager"
import { Icons } from "../../../common/gui/base/icons/Icons"
import { downcast, getStartOfDay, isSameDayOfDate, ofClass } from "@tutao/tutanota-utils"
import type { CalendarEvent, GroupSettings, UserSettingsGroupRoot } from "../../api/entities/tutanota/TypeRefs.js"
import { createGroupSettings } from "../../api/entities/tutanota/TypeRefs.js"
import { defaultCalendarColor, GroupType, Keys, reverse, ShareCapability, TabIndex, TimeFormat, WeekStart } from "../../api/common/TutanotaConstants"
import { locator } from "../../api/main/MainLocator"
import type { CalendarEvent, GroupSettings, UserSettingsGroupRoot } from "../../../common/api/entities/tutanota/TypeRefs.js"
import { createGroupSettings } from "../../../common/api/entities/tutanota/TypeRefs.js"
import { defaultCalendarColor, GroupType, Keys, reverse, ShareCapability, TabIndex, TimeFormat, WeekStart } from "../../../common/api/common/TutanotaConstants"
import { locator } from "../../../common/api/main/MainLocator"
import { getStartOfTheWeekOffset, getStartOfTheWeekOffsetForUser, getTimeZone, getWeekNumber } from "../date/CalendarUtils"
import { ButtonColor } from "../../gui/base/Button.js"
import { ButtonColor } from "../../../common/gui/base/Button.js"
import { CalendarMonthView } from "./CalendarMonthView"
import { DateTime } from "luxon"
import { NotFoundError } from "../../api/common/error/RestError"
import { NotFoundError } from "../../../common/api/common/error/RestError"
import { CalendarAgendaView, CalendarAgendaViewAttrs } from "./CalendarAgendaView"
import type { GroupInfo } from "../../api/entities/sys/TypeRefs.js"
import type { GroupInfo } from "../../../common/api/entities/sys/TypeRefs.js"
import { showEditCalendarDialog } from "../gui/EditCalendarDialog.js"
import { styles } from "../../gui/styles"
import { styles } from "../../../common/gui/styles"
import { MultiDayCalendarView } from "./MultiDayCalendarView"
import { Dialog } from "../../gui/base/Dialog"
import { isApp } from "../../api/common/Env"
import { px, size } from "../../gui/size"
import { FolderColumnView } from "../../gui/FolderColumnView.js"
import { deviceConfig } from "../../misc/DeviceConfig"
import { Dialog } from "../../../common/gui/base/Dialog"
import { isApp } from "../../../common/api/common/Env"
import { px, size } from "../../../common/gui/size"
import { FolderColumnView } from "../../../common/gui/FolderColumnView.js"
import { deviceConfig } from "../../../common/misc/DeviceConfig"
import { exportCalendar, showCalendarImportDialog } from "../export/CalendarImporterDialog"
import { showNotAvailableForFreeDialog } from "../../misc/SubscriptionDialogs"
import { getSharedGroupName, hasCapabilityOnGroup, loadGroupMembers } from "../../sharing/GroupUtils"
import { showGroupSharingDialog } from "../../sharing/view/GroupSharingDialog"
import { GroupInvitationFolderRow } from "../../sharing/view/GroupInvitationFolderRow"
import { SidebarSection } from "../../gui/SidebarSection"
import type { HtmlSanitizer } from "../../misc/HtmlSanitizer"
import { ProgrammingError } from "../../api/common/error/ProgrammingError"
import { showNotAvailableForFreeDialog } from "../../../common/misc/SubscriptionDialogs"
import { getSharedGroupName, hasCapabilityOnGroup, loadGroupMembers } from "../../../common/sharing/GroupUtils"
import { showGroupSharingDialog } from "../../../common/sharing/view/GroupSharingDialog"
import { GroupInvitationFolderRow } from "../../../common/sharing/view/GroupInvitationFolderRow"
import { SidebarSection } from "../../../common/gui/SidebarSection"
import type { HtmlSanitizer } from "../../../common/misc/HtmlSanitizer"
import { ProgrammingError } from "../../../common/api/common/error/ProgrammingError"
import {
calendarNavConfiguration,
CalendarViewType,
@ -46,22 +46,22 @@ import {
import { CalendarEventBubbleKeyDownHandler, CalendarViewModel, MouseOrPointerEvent } from "./CalendarViewModel"
import { showNewCalendarEventEditDialog } from "../gui/eventeditor-view/CalendarEventEditDialog.js"
import { CalendarEventPopup } from "../gui/eventpopup/CalendarEventPopup.js"
import { showProgressDialog } from "../../gui/dialogs/ProgressDialog"
import { showProgressDialog } from "../../../common/gui/dialogs/ProgressDialog"
import type { CalendarInfo } from "../model/CalendarModel"
import type Stream from "mithril/stream"
import { IconButton } from "../../gui/base/IconButton.js"
import { createDropdown, PosRect } from "../../gui/base/Dropdown.js"
import { ButtonSize } from "../../gui/base/ButtonSize.js"
import { BottomNav } from "../../gui/nav/BottomNav.js"
import { DrawerMenuAttrs } from "../../gui/nav/DrawerMenu.js"
import { BaseTopLevelView } from "../../gui/BaseTopLevelView.js"
import { TopLevelAttrs, TopLevelView } from "../../TopLevelView.js"
import { getEventWithDefaultTimes, getNextHalfHour } from "../../api/common/utils/CommonCalendarUtils.js"
import { BackgroundColumnLayout } from "../../gui/BackgroundColumnLayout.js"
import { theme } from "../../gui/theme.js"
import { IconButton } from "../../../common/gui/base/IconButton.js"
import { createDropdown, PosRect } from "../../../common/gui/base/Dropdown.js"
import { ButtonSize } from "../../../common/gui/base/ButtonSize.js"
import { BottomNav } from "../../../common/gui/nav/BottomNav.js"
import { DrawerMenuAttrs } from "../../../common/gui/nav/DrawerMenu.js"
import { BaseTopLevelView } from "../../../common/gui/BaseTopLevelView.js"
import { TopLevelAttrs, TopLevelView } from "../../../TopLevelView.js"
import { getEventWithDefaultTimes, getNextHalfHour } from "../../../common/api/common/utils/CommonCalendarUtils.js"
import { BackgroundColumnLayout } from "../../../common/gui/BackgroundColumnLayout.js"
import { theme } from "../../../common/gui/theme.js"
import { CalendarMobileHeader } from "./CalendarMobileHeader.js"
import { CalendarDesktopToolbar } from "./CalendarDesktopToolbar.js"
import { LazySearchBar } from "../../misc/LazySearchBar.js"
import { LazySearchBar } from "../../../common/misc/LazySearchBar.js"
import { Time } from "../date/Time.js"
import { DaySelectorSidebar } from "../gui/day-selector/DaySelectorSidebar.js"
import { CalendarOperation } from "../gui/eventeditor-model/CalendarEventModel.js"
@ -97,7 +97,7 @@ export class CalendarView extends BaseTopLevelView implements TopLevelView<Calen
this.viewModel = attrs.calendarViewModel
this.currentViewType = deviceConfig.getDefaultCalendarView(userId) || CalendarViewType.MONTH
this.htmlSanitizer = import("../../misc/HtmlSanitizer").then((m) => m.htmlSanitizer)
this.htmlSanitizer = import("../../../common/misc/HtmlSanitizer").then((m) => m.htmlSanitizer)
this.sidebarColumn = new ViewColumn(
{
view: () =>
@ -594,7 +594,7 @@ export class CalendarView extends BaseTopLevelView implements TopLevelView<Calen
if (locator.logins.getUserController().getCalendarMemberships().length === 0) {
this.showCreateCalendarDialog()
} else {
import("../../misc/SubscriptionDialogs")
import("../../../common/misc/SubscriptionDialogs")
.then((SubscriptionDialogUtils) => SubscriptionDialogUtils.checkPaidSubscription())
.then((ok) => {
if (ok) {

View file

@ -1,31 +1,31 @@
import { $Promisable, assertNotNull, clone, debounce, findAndRemove, getStartOfDay, groupByAndMapUniquely } from "@tutao/tutanota-utils"
import { CalendarEvent, CalendarEventTypeRef } from "../../api/entities/tutanota/TypeRefs.js"
import { getWeekStart, GroupType, OperationType, WeekStart } from "../../api/common/TutanotaConstants"
import { NotAuthorizedError, NotFoundError } from "../../api/common/error/RestError"
import { getElementId, getListId, isSameId } from "../../api/common/utils/EntityUtils"
import { LoginController } from "../../api/main/LoginController"
import { IProgressMonitor } from "../../api/common/utils/ProgressMonitor"
import type { ReceivedGroupInvitation } from "../../api/entities/sys/TypeRefs.js"
import { CalendarEvent, CalendarEventTypeRef } from "../../../common/api/entities/tutanota/TypeRefs.js"
import { getWeekStart, GroupType, OperationType, WeekStart } from "../../../common/api/common/TutanotaConstants"
import { NotAuthorizedError, NotFoundError } from "../../../common/api/common/error/RestError"
import { getElementId, getListId, isSameId } from "../../../common/api/common/utils/EntityUtils"
import { LoginController } from "../../../common/api/main/LoginController"
import { IProgressMonitor } from "../../../common/api/common/utils/ProgressMonitor"
import type { ReceivedGroupInvitation } from "../../../common/api/entities/sys/TypeRefs.js"
import stream from "mithril/stream"
import Stream from "mithril/stream"
import { getDiffIn60mIntervals, getMonthRange, isEventBetweenDays } from "../date/CalendarUtils"
import { isAllDayEvent } from "../../api/common/utils/CommonCalendarUtils"
import { isAllDayEvent } from "../../../common/api/common/utils/CommonCalendarUtils"
import { CalendarEventModel, CalendarOperation, EventSaveResult, EventType, getNonOrganizerAttendees } from "../gui/eventeditor-model/CalendarEventModel.js"
import { askIfShouldSendCalendarUpdatesToAttendees, getEventType, shouldDisplayEvent } from "../gui/CalendarGuiUtils.js"
import { ReceivedGroupInvitationsModel } from "../../sharing/model/ReceivedGroupInvitationsModel"
import { ReceivedGroupInvitationsModel } from "../../../common/sharing/model/ReceivedGroupInvitationsModel"
import type { CalendarInfo, CalendarModel } from "../model/CalendarModel"
import { EventController } from "../../api/main/EventController"
import { EntityClient } from "../../api/common/EntityClient"
import { ProgressTracker } from "../../api/main/ProgressTracker"
import { DeviceConfig } from "../../misc/DeviceConfig"
import { EventController } from "../../../common/api/main/EventController"
import { EntityClient } from "../../../common/api/common/EntityClient"
import { ProgressTracker } from "../../../common/api/main/ProgressTracker"
import { DeviceConfig } from "../../../common/misc/DeviceConfig"
import type { EventDragHandlerCallbacks } from "./EventDragHandler"
import { ProgrammingError } from "../../api/common/error/ProgrammingError.js"
import { ProgrammingError } from "../../../common/api/common/error/ProgrammingError.js"
import { Time } from "../date/Time.js"
import { CalendarEventsRepository, DaysToEvents } from "../date/CalendarEventsRepository.js"
import { CalendarEventPreviewViewModel } from "../gui/eventpopup/CalendarEventPreviewViewModel.js"
import { EntityUpdateData, isUpdateFor, isUpdateForTypeRef } from "../../api/common/utils/EntityUpdateUtils.js"
import { getEnabledMailAddressesWithUser } from "../../mail/model/MailUtils.js"
import { MailModel } from "../../mail/model/MailModel.js"
import { EntityUpdateData, isUpdateFor, isUpdateForTypeRef } from "../../../common/api/common/utils/EntityUpdateUtils.js"
import { getEnabledMailAddressesWithUser } from "../../../mail-app/mail/model/MailUtils.js"
import { MailModel } from "../../../mail-app/mail/model/MailModel.js"
export type EventsOnDays = {
days: Array<Date>

View file

@ -1,9 +1,9 @@
import m, { Children, Component, Vnode } from "mithril"
import { hasAlarmsForTheUser } from "../date/CalendarUtils"
import { CalendarEventBubble } from "./CalendarEventBubble"
import type { CalendarEvent } from "../../api/entities/tutanota/TypeRefs.js"
import type { User } from "../../api/entities/sys/TypeRefs.js"
import type { EventTextTimeOption } from "../../api/common/TutanotaConstants"
import type { CalendarEvent } from "../../../common/api/entities/tutanota/TypeRefs.js"
import type { User } from "../../../common/api/entities/sys/TypeRefs.js"
import type { EventTextTimeOption } from "../../../common/api/common/TutanotaConstants"
import type { CalendarEventBubbleClickHandler, CalendarEventBubbleKeyDownHandler } from "./CalendarViewModel"
import { formatEventTime } from "../gui/CalendarGuiUtils.js"

View file

@ -1,13 +1,13 @@
import m, { Children, Component, Vnode } from "mithril"
import { IconButton, IconButtonAttrs } from "../../gui/base/IconButton.js"
import { Icons } from "../../gui/base/icons/Icons.js"
import { Button, ButtonColor, ButtonType } from "../../gui/base/Button.js"
import { BootIcons } from "../../gui/base/icons/BootIcons.js"
import { IconButton, IconButtonAttrs } from "../../../common/gui/base/IconButton.js"
import { Icons } from "../../../common/gui/base/icons/Icons.js"
import { Button, ButtonColor, ButtonType } from "../../../common/gui/base/Button.js"
import { BootIcons } from "../../../common/gui/base/icons/BootIcons.js"
import { EventPreviewView } from "../gui/eventpopup/EventPreviewView.js"
import { createAsyncDropdown } from "../../gui/base/Dropdown.js"
import { Dialog } from "../../gui/base/Dialog.js"
import { createAsyncDropdown } from "../../../common/gui/base/Dropdown.js"
import { Dialog } from "../../../common/gui/base/Dialog.js"
import { CalendarEventPreviewViewModel } from "../gui/eventpopup/CalendarEventPreviewViewModel.js"
import { styles } from "../../gui/styles.js"
import { styles } from "../../../common/gui/styles.js"
export interface EventDetailsViewAttrs {
eventPreviewModel: CalendarEventPreviewViewModel

View file

@ -1,8 +1,8 @@
import type { CalendarEvent } from "../../api/entities/tutanota/TypeRefs.js"
import type { CalendarEvent } from "../../../common/api/entities/tutanota/TypeRefs.js"
import m from "mithril"
import { getAllDayDateUTC, isAllDayEvent } from "../../api/common/utils/CommonCalendarUtils"
import { getAllDayDateUTC, isAllDayEvent } from "../../../common/api/common/utils/CommonCalendarUtils"
import { Time } from "../date/Time.js"
import { showDropdownAtPosition } from "../../gui/base/Dropdown.js"
import { showDropdownAtPosition } from "../../../common/gui/base/Dropdown.js"
import { CalendarOperation } from "../gui/eventeditor-model/CalendarEventModel.js"
const DRAG_THRESHOLD = 10

View file

@ -1,6 +1,6 @@
import m, { Children, Component, Vnode, VnodeDOM } from "mithril"
import { getStartOfDay, incrementDate, isToday, lastThrow, neverNull, ofClass, remove } from "@tutao/tutanota-utils"
import { formatShortTime, formatTime } from "../../misc/Formatter"
import { formatShortTime, formatTime } from "../../../common/misc/Formatter"
import {
combineDateWithTime,
eventEndsAfterDay,
@ -15,19 +15,19 @@ import {
getTimeZone,
} from "../date/CalendarUtils"
import { CalendarDayEventsView, calendarDayTimes } from "./CalendarDayEventsView"
import { theme } from "../../gui/theme"
import { px, size } from "../../gui/size"
import { EventTextTimeOption, WeekStart } from "../../api/common/TutanotaConstants"
import { lang } from "../../misc/LanguageViewModel"
import { PageView } from "../../gui/base/PageView"
import type { CalendarEvent } from "../../api/entities/tutanota/TypeRefs.js"
import { theme } from "../../../common/gui/theme"
import { px, size } from "../../../common/gui/size"
import { EventTextTimeOption, WeekStart } from "../../../common/api/common/TutanotaConstants"
import { lang } from "../../../common/misc/LanguageViewModel"
import { PageView } from "../../../common/gui/base/PageView"
import type { CalendarEvent } from "../../../common/api/entities/tutanota/TypeRefs.js"
import type { GroupColors } from "./CalendarView"
import type { EventDragHandlerCallbacks, MousePos } from "./EventDragHandler"
import { EventDragHandler } from "./EventDragHandler"
import { getIfLargeScroll, getPosAndBoundsFromMouseEvent } from "../../gui/base/GuiUtils"
import { UserError } from "../../api/main/UserError"
import { showUserError } from "../../misc/ErrorHandlerImpl"
import { styles } from "../../gui/styles"
import { getIfLargeScroll, getPosAndBoundsFromMouseEvent } from "../../../common/gui/base/GuiUtils"
import { UserError } from "../../../common/api/main/UserError"
import { showUserError } from "../../../common/misc/ErrorHandlerImpl"
import { styles } from "../../../common/gui/styles"
import {
CALENDAR_EVENT_HEIGHT,
CalendarViewType,
@ -39,8 +39,8 @@ import {
} from "../gui/CalendarGuiUtils.js"
import type { CalendarEventBubbleClickHandler, CalendarEventBubbleKeyDownHandler, EventsOnDays } from "./CalendarViewModel"
import { ContinuingCalendarEventBubble } from "./ContinuingCalendarEventBubble"
import { isAllDayEvent } from "../../api/common/utils/CommonCalendarUtils"
import { locator } from "../../api/main/MainLocator.js"
import { isAllDayEvent } from "../../../common/api/common/utils/CommonCalendarUtils"
import { locator } from "../../../common/api/main/MainLocator.js"
import { DateTime } from "luxon"
import { Time } from "../date/Time.js"
import { DaySelector } from "../gui/day-selector/DaySelector.js"

View file

@ -1,10 +1,10 @@
import { IconButtonAttrs } from "../../gui/base/IconButton.js"
import { IconButtonAttrs } from "../../../common/gui/base/IconButton.js"
import m, { Children, Component, Vnode } from "mithril"
import { Icons } from "../../gui/base/icons/Icons.js"
import { BaseButton } from "../../gui/base/buttons/BaseButton.js"
import { Icon } from "../../gui/base/Icon.js"
import { theme } from "../../gui/theme.js"
import { lang } from "../../misc/LanguageViewModel.js"
import { Icons } from "../../../common/gui/base/icons/Icons.js"
import { BaseButton } from "../../../common/gui/base/buttons/BaseButton.js"
import { Icon } from "../../../common/gui/base/Icon.js"
import { theme } from "../../../common/gui/theme.js"
import { lang } from "../../../common/misc/LanguageViewModel.js"
type TodayIconButtonAttrs = Pick<IconButtonAttrs, "click">

Some files were not shown because too many files have changed in this diff Show more