mirror of
https://github.com/tutao/tutanota.git
synced 2025-10-19 16:03:43 +00:00
Move files to new folder structure
Co-authored-by: @rih-tutao
This commit is contained in:
parent
28bb9b2cc8
commit
8ab3b14edd
1115 changed files with 4265 additions and 4281 deletions
|
@ -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"],
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
||||
|
|
|
@ -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!")
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,6 @@
|
|||
"name": "DataFile",
|
||||
"type": "typeref",
|
||||
"location": {
|
||||
"typescript": "../src/api/common/DataFile.js"
|
||||
"typescript": "../src/common/api/common/DataFile.js"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,6 @@
|
|||
"name": "DesktopConfigKey",
|
||||
"type": "typeref",
|
||||
"location": {
|
||||
"typescript": "../src/desktop/config/ConfigKeys.js"
|
||||
"typescript": "../src/common/desktop/config/ConfigKeys.js"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
123
src/app.ts
123
src/app.ts
|
@ -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)
|
||||
|
|
|
@ -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 = {
|
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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 {
|
|
@ -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>
|
|
@ -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,
|
|
@ -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
|
|
@ -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, {
|
|
@ -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 = {
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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>
|
|
@ -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")
|
|
@ -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. */
|
|
@ -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
|
|
@ -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. */
|
|
@ -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
|
|
@ -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,
|
|
@ -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
|
|
@ -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"
|
||||
|
|
@ -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
|
|
@ -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"
|
||||
|
|
@ -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"
|
||||
|
|
@ -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
|
|
@ -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">
|
|
@ -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
|
|
@ -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()
|
|
@ -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
|
|
@ -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 = {
|
|
@ -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
|
|
@ -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
|
|
@ -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 = {
|
|
@ -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 = {
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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 = {
|
|
@ -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"
|
||||
|
|
@ -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"
|
|
@ -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 */
|
|
@ -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) {
|
|
@ -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>
|
|
@ -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"
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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"
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue