[Calendar] Make Calendar Search separation clearer

Co-authored-by: @rih-tutao

other style fixes
This commit is contained in:
mup 2024-07-11 09:02:57 +02:00 committed by wrd
parent 1e96588527
commit 168d048448
143 changed files with 1186 additions and 630 deletions

View file

@ -24,11 +24,12 @@ import { TopLevelAttrs, TopLevelView } from "../TopLevelView.js"
import { AppHeaderAttrs } from "../common/gui/Header.js"
import { CalendarViewModel } from "./calendar/view/CalendarViewModel.js"
import { LoginController } from "../common/api/main/LoginController.js"
import { SearchViewModel } from "../mail-app/search/view/SearchViewModel.js"
import { initCommonLocator } from "../common/api/main/CommonLocator.js"
import { SettingsViewAttrs } from "../common/settings/Interfaces.js"
import { SettingsView } from "./calendar/view/SettingsView.js"
import { SearchView, SearchViewAttrs } from "../mail-app/search/view/SearchView.js"
import { CalendarSearchView, CalendarSearchViewAttrs } from "./calendar/search/view/CalendarSearchView.js"
import { initCommonLocator } from "../common/api/main/CommonLocator.js"
import { CalendarSettingsView } from "./calendar/view/CalendarSettingsView.js"
import { CalendarSearchViewModel } from "./calendar/search/view/CalendarSearchViewModel.js"
import { CalendarBottomNav } from "./gui/CalendarBottomNav.js"
assertMainOrNodeBoot()
bootFinished()
@ -166,13 +167,13 @@ import("../mail-app/translations/en.js")
},
calendarLocator.logins,
),
settings: makeViewResolver<SettingsViewAttrs, SettingsView, { drawerAttrsFactory: () => DrawerMenuAttrs; header: AppHeaderAttrs }>(
settings: makeViewResolver<SettingsViewAttrs, CalendarSettingsView, { drawerAttrsFactory: () => DrawerMenuAttrs; header: AppHeaderAttrs }>(
{
prepareRoute: async () => {
const { SettingsView } = await import("../calendar-app/calendar/view/SettingsView.js")
const { CalendarSettingsView } = await import("./calendar/view/CalendarSettingsView.js")
const drawerAttrsFactory = await calendarLocator.drawerAttrsFactory()
return {
component: SettingsView,
component: CalendarSettingsView,
cache: { drawerAttrsFactory, header: await calendarLocator.appHeaderAttrs() },
}
},
@ -181,20 +182,20 @@ import("../mail-app/translations/en.js")
calendarLocator.logins,
),
search: makeViewResolver<
SearchViewAttrs,
SearchView,
CalendarSearchViewAttrs,
CalendarSearchView,
{
drawerAttrsFactory: () => DrawerMenuAttrs
header: AppHeaderAttrs
searchViewModelFactory: () => SearchViewModel
searchViewModelFactory: () => CalendarSearchViewModel
}
>(
{
prepareRoute: async () => {
const { SearchView } = await import("../mail-app/search/view/SearchView.js")
const { CalendarSearchView } = await import("./calendar/search/view/CalendarSearchView.js")
const drawerAttrsFactory = await calendarLocator.drawerAttrsFactory()
return {
component: SearchView,
component: CalendarSearchView,
cache: {
drawerAttrsFactory,
header: await calendarLocator.appHeaderAttrs(),
@ -209,7 +210,7 @@ import("../mail-app/translations/en.js")
calendar: makeViewResolver<
CalendarViewAttrs,
CalendarView,
{ drawerAttrsFactory: () => DrawerMenuAttrs; header: AppHeaderAttrs; calendarViewModel: CalendarViewModel }
{ drawerAttrsFactory: () => DrawerMenuAttrs; header: AppHeaderAttrs; calendarViewModel: CalendarViewModel; bottomNav: Children }
>(
{
prepareRoute: async (cache) => {
@ -221,13 +222,15 @@ import("../mail-app/translations/en.js")
drawerAttrsFactory,
header: await calendarLocator.appHeaderAttrs(),
calendarViewModel: await calendarLocator.calendarViewModel(),
bottomNav: m(CalendarBottomNav),
},
}
},
prepareAttrs: ({ header, calendarViewModel, drawerAttrsFactory }) => ({
prepareAttrs: ({ header, calendarViewModel, drawerAttrsFactory, bottomNav }) => ({
drawerAttrs: drawerAttrsFactory(),
header,
calendarViewModel,
bottomNav,
}),
},
calendarLocator.logins,

View file

@ -101,7 +101,7 @@ import { ProgrammingError } from "../../../../common/api/common/error/Programmin
import { SimpleTextViewModel } from "../../../../common/misc/SimpleTextViewModel.js"
import { AlarmInfoTemplate } from "../../../../common/api/worker/facades/lazy/CalendarFacade.js"
import { getEventType } from "../CalendarGuiUtils.js"
import { getDefaultSender } from "../../../../common/mailFunctionality/CommonMailUtils.js"
import { getDefaultSender } from "../../../../mail-app/mail/model/MailUtils.js"
/** the type of the event determines which edit operations are available to us. */
export const enum EventType {

View file

@ -20,13 +20,13 @@ import type { HtmlEditor } from "../../../../common/gui/editor/HtmlEditor.js"
import { locator } from "../../../../common/api/main/CommonLocator.js"
import { CalendarEventEditView } from "./CalendarEventEditView.js"
import { askIfShouldSendCalendarUpdatesToAttendees } from "../CalendarGuiUtils.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 "../../../../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"
import { UserError } from "../../../../common/api/main/UserError.js"
import { showUserError } from "../../../../common/misc/ErrorHandlerImpl.js"
const enum ConfirmationResult {
Cancel,

View file

@ -9,7 +9,6 @@ import { MailTypeRef } from "../../../common/api/entities/tutanota/TypeRefs.js"
import type { Shortcut } from "../../../common/misc/KeyManager"
import { isKeyPressed, keyManager } from "../../../common/misc/KeyManager"
import { encodeCalendarSearchKey, getRestriction } from "./model/SearchUtils"
import { locator } from "../../../common/api/main/MainLocator"
import type { WhitelabelChild } from "../../../common/api/entities/sys/TypeRefs.js"
import { FULL_INDEXED_TIMESTAMP, Keys } from "../../../common/api/common/TutanotaConstants"
import { assertMainOrNode } from "../../../common/api/common/Env"
@ -27,6 +26,8 @@ import { generateCalendarInstancesInRange } from "../../../common/calendar/date/
import { loadMultipleFromLists } from "../../../common/api/common/EntityClient.js"
import { SearchRouter } from "../../../common/search/view/SearchRouter.js"
import { SearchBarOverlay } from "../../../mail-app/search/SearchBarOverlay.js"
import { calendarLocator } from "../../calendarLocator.js"
import { CalendarSearchBarOverlay } from "./CalendarSearchBarOverlay.js"
assertMainOrNode()
export type ShowMoreAction = {
@ -35,7 +36,7 @@ export type ShowMoreAction = {
indexTimestamp: number
allowShowMore: boolean
}
export type SearchBarAttrs = {
export type CalendarSearchBarAttrs = {
placeholder?: string | null
returnListener?: (() => unknown) | null
disabled?: boolean
@ -44,10 +45,9 @@ export type SearchBarAttrs = {
const MAX_SEARCH_PREVIEW_RESULTS = 10
export type Entry = Mail | Contact | CalendarEvent | WhitelabelChild | ShowMoreAction
type Entries = Array<Entry>
export type SearchBarState = {
export type CalendarSearchBarState = {
query: string
searchResult: SearchResult | null
indexState: SearchIndexStateInfo
entities: Entries
selected: Entry | null
}
@ -55,11 +55,11 @@ export type SearchBarState = {
// create our own copy which is not perfect because we don't benefit from the shared cache but currently there's no way to get async dependencies into
// singletons like this (without top-level await at least)
// once SearchBar is rewritten this should be removed
const searchRouter = new SearchRouter(locator.throttledRouter())
const searchRouter = new SearchRouter(calendarLocator.throttledRouter())
export class SearchBar implements Component<SearchBarAttrs> {
export class CalendarSearchBar implements Component<CalendarSearchBarAttrs> {
focused: boolean = false
private readonly state: Stream<SearchBarState>
private readonly state: Stream<CalendarSearchBarState>
busy: boolean = false
private closeOverlayFunction: (() => void) | null = null
private readonly overlayContentComponent: Component
@ -70,16 +70,15 @@ export class SearchBar implements Component<SearchBarAttrs> {
private lastQueryStream: Stream<unknown> | null = null
constructor() {
this.state = stream<SearchBarState>({
this.state = stream<CalendarSearchBarState>({
query: "",
searchResult: null,
indexState: locator.search.indexState(),
entities: [] as Entries,
selected: null,
})
this.overlayContentComponent = {
view: () => {
return m(SearchBarOverlay, {
return m(CalendarSearchBarOverlay, {
state: this.state(),
isQuickSearch: this.isQuickSearch(),
isFocused: this.focused,
@ -98,7 +97,7 @@ export class SearchBar implements Component<SearchBarAttrs> {
* that shouldn't clear our current state, but if the URL changed in a way that makes the previous state outdated, we clear it.
*/
private readonly onPathChange = memoized((newPath: string) => {
if (locator.search.isNewSearch(this.state().query, getRestriction(newPath))) {
if (calendarLocator.search.isNewSearch(this.state().query, getRestriction(newPath))) {
this.updateState({
searchResult: null,
selected: null,
@ -107,7 +106,7 @@ export class SearchBar implements Component<SearchBarAttrs> {
}
})
view(vnode: Vnode<SearchBarAttrs>) {
view(vnode: Vnode<CalendarSearchBarAttrs>) {
this.onPathChange(m.route.get())
return m(BaseSearchBar, {
@ -195,7 +194,7 @@ export class SearchBar implements Component<SearchBarAttrs> {
oncreate() {
keyManager.registerShortcuts(this.shortcuts)
this.stateStream = this.state.map((state) => m.redraw())
this.lastQueryStream = locator.search.lastQueryString.map((value) => {
this.lastQueryStream = calendarLocator.search.lastQueryString.map((value) => {
// Set value from the model when it's set from the URL e.g. reloading the page on the search screen
if (value) {
this.updateState({
@ -339,8 +338,8 @@ export class SearchBar implements Component<SearchBarAttrs> {
let restriction = this.getRestriction()
if (!locator.search.isNewSearch(query, restriction) && oldQuery === query) {
const result = locator.search.result()
if (!calendarLocator.search.isNewSearch(query, restriction) && oldQuery === query) {
const result = calendarLocator.search.result()
if (this.isQuickSearch() && result) {
this.showResultsInOverlay(result)
@ -371,7 +370,7 @@ export class SearchBar implements Component<SearchBarAttrs> {
// We don't limit contacts because we need to download all of them to sort them. They should be cached anyway.
const limit = isSameTypeRef(MailTypeRef, restriction.type) ? (this.isQuickSearch() ? MAX_SEARCH_PREVIEW_RESULTS : PageSize) : null
locator.search
calendarLocator.search
.search(
{
query: query ?? "",
@ -379,7 +378,7 @@ export class SearchBar implements Component<SearchBarAttrs> {
minSuggestionCount: useSuggestions ? 10 : 0,
maxResults: limit,
},
locator.progressTracker,
calendarLocator.progressTracker,
)
.then((result) => this.loadAndDisplayResult(query, result ? result : null, limit))
.finally(() => cb())
@ -394,14 +393,14 @@ export class SearchBar implements Component<SearchBarAttrs> {
searchResult: safeResult,
})
if (!safeResult || locator.search.isNewSearch(query, safeResult.restriction)) {
if (!safeResult || calendarLocator.search.isNewSearch(query, safeResult.restriction)) {
return
}
if (this.isQuickSearch()) {
if (safeLimit && hasMoreResults(safeResult) && safeResult.results.length < safeLimit) {
locator.searchFacade.getMoreSearchResults(safeResult, safeLimit - safeResult.results.length).then((moreResults) => {
if (locator.search.isNewSearch(query, moreResults.restriction)) {
calendarLocator.searchFacade.getMoreSearchResults(safeResult, safeLimit - safeResult.results.length).then((moreResults) => {
if (calendarLocator.search.isNewSearch(query, moreResults.restriction)) {
return
} else {
this.loadAndDisplayResult(query, moreResults, limit)
@ -421,7 +420,7 @@ export class SearchBar implements Component<SearchBarAttrs> {
// this needs to happen in this order, otherwise the list's result subscription will override our
// routing.
this.updateSearchUrl("")
locator.search.result(null)
calendarLocator.search.result(null)
}
this.updateState({
@ -433,9 +432,9 @@ export class SearchBar implements Component<SearchBarAttrs> {
}
private async showResultsInOverlay(result: SearchResult): Promise<void> {
const entries = await loadMultipleFromLists(result.restriction.type, locator.entityClient, result.results)
const entries = await loadMultipleFromLists(result.restriction.type, calendarLocator.entityClient, result.results)
// If there was no new search while we've been downloading the result
if (!locator.search.isNewSearch(result.query, result.restriction)) {
if (!calendarLocator.search.isNewSearch(result.query, result.restriction)) {
const { filteredEntries, couldShowMore } = this.filterResults(entries, result.restriction)
if (
@ -504,7 +503,7 @@ export class SearchBar implements Component<SearchBarAttrs> {
m.redraw()
}
private updateState(update: Partial<SearchBarState>): SearchBarState {
private updateState(update: Partial<CalendarSearchBarState>): CalendarSearchBarState {
const newState = Object.assign({}, this.state(), update)
this.state(newState)
@ -515,4 +514,4 @@ export class SearchBar implements Component<SearchBarAttrs> {
// Should be changed to not be a singleton and be proper component (instantiated by mithril).
// We need to extract some state of it into some kind of viewModel, pluggable depending on the current view but this requires complete rewrite of SearchBar.
export const searchBar = new SearchBar()
export const searchBar = new CalendarSearchBar()

View file

@ -0,0 +1,94 @@
import { CalendarSearchBarAttrs, CalendarSearchBarState, Entry, ShowMoreAction } from "./CalendarSearchBar.js"
import m, { Children, Component, Vnode } from "mithril"
import { downcast, isEmpty, isSameTypeRef, TypeRef } from "@tutao/tutanota-utils"
import { px, size } from "../../../common/gui/size.js"
import { CalendarEvent, CalendarEventTypeRef } from "../../../common/api/entities/tutanota/TypeRefs.js"
import { lang } from "../../../common/misc/LanguageViewModel.js"
import { locator } from "../../../common/api/main/CommonLocator.js"
import { FULL_INDEXED_TIMESTAMP } from "../../../common/api/common/TutanotaConstants.js"
import { formatDate } from "../../../common/misc/Formatter.js"
import { formatEventDuration } from "../gui/CalendarGuiUtils.js"
import { getTimeZone } from "../../../common/calendar/date/CalendarUtils.js"
type CalendarSearchBarOverlayAttrs = {
state: CalendarSearchBarState
isQuickSearch: boolean
isFocused: boolean
selectResult: (result: Entry | null) => void
}
export class CalendarSearchBarOverlay implements Component<CalendarSearchBarOverlayAttrs> {
view({ attrs }: Vnode<CalendarSearchBarOverlayAttrs>): Children {
const { state } = attrs
return [state.entities && !isEmpty(state.entities) && attrs.isQuickSearch && attrs.isFocused ? this.renderResults(state, attrs) : null]
}
renderResults(state: CalendarSearchBarState, attrs: CalendarSearchBarOverlayAttrs): Children {
return m("ul.list.click.mail-list", [
state.entities.map((result) => {
return m(
"li.plr-l.flex-v-center.",
{
style: {
height: px(52),
"border-left": px(size.border_selection) + " solid transparent",
},
// avoid closing overlay before the click event can be received
onmousedown: (e: MouseEvent) => e.preventDefault(),
onclick: () => attrs.selectResult(result),
class: state.selected === result ? "row-selected" : "",
},
this.renderResult(state, result),
)
}),
])
}
renderResult(state: CalendarSearchBarState, result: Entry): Children {
let type: TypeRef<any> | null = "_type" in result ? result._type : null
if (!type) {
return this.renderShowMoreAction(downcast(result))
} else if (isSameTypeRef(CalendarEventTypeRef, type)) {
return this.renderCalendarEventResult(downcast(result))
} else {
return []
}
}
private renderShowMoreAction(result: ShowMoreAction): Children {
// show more action
let showMoreAction = result as any as ShowMoreAction
let infoText
let indexInfo
if (showMoreAction.resultCount === 0) {
infoText = lang.get("searchNoResults_msg")
if (locator.logins.getUserController().isFreeAccount()) {
indexInfo = lang.get("changeTimeFrame_msg")
}
} else if (showMoreAction.allowShowMore) {
infoText = lang.get("showMore_action")
} else {
infoText = lang.get("moreResultsFound_msg", {
"{1}": showMoreAction.resultCount - showMoreAction.shownCount,
})
}
if (showMoreAction.indexTimestamp > FULL_INDEXED_TIMESTAMP && !indexInfo) {
indexInfo = lang.get("searchedUntil_msg") + " " + formatDate(new Date(showMoreAction.indexTimestamp))
}
return indexInfo
? [m(".top.flex-center", infoText), m(".bottom.flex-center.small", indexInfo)]
: m("li.plr-l.pt-s.pb-s.items-center.flex-center", m(".flex-center", infoText))
}
private renderCalendarEventResult(event: CalendarEvent): Children {
return [
m(".top.flex-space-between", m(".name.text-ellipsis", { title: event.summary }, event.summary)),
m(".bottom.flex-space-between", m("small.mail-address", formatEventDuration(event, getTimeZone(), false))),
]
}
}

View file

@ -1,7 +1,6 @@
import stream from "mithril/stream"
import Stream from "mithril/stream"
import { NOTHING_INDEXED_TIMESTAMP } from "../../../../common/api/common/TutanotaConstants"
import type { SearchIndexStateInfo, SearchRestriction, SearchResult } from "../../../../common/api/worker/search/SearchTypes"
import type { SearchRestriction, SearchResult } from "../../../../common/api/worker/search/SearchTypes"
import { arrayEquals, assertNonNull, assertNotNull, incrementMonth, isSameTypeRef, lazyAsync, tokenize } from "@tutao/tutanota-utils"
import type { SearchFacade } from "../../../../common/api/worker/search/SearchFacade"
import { assertMainOrNode } from "../../../../common/api/common/Env"

View file

@ -1,33 +1,33 @@
import {TopLevelAttrs, TopLevelView} from "../../../../TopLevelView.js";
import {DrawerMenuAttrs} from "../../../../common/gui/nav/DrawerMenu.js";
import {AppHeaderAttrs, Header} from "../../../../common/gui/Header.js";
import {CalendarSearchViewModel} from "./CalendarSearchViewModel.js";
import {BaseTopLevelView} from "../../../../common/gui/BaseTopLevelView.js";
import {ColumnType, ViewColumn} from "../../../../common/gui/base/ViewColumn.js";
import {ViewSlider} from "../../../../common/gui/nav/ViewSlider.js";
import {CalendarEvent} from "../../../../common/api/entities/tutanota/TypeRefs.js";
import {assertNotNull, incrementMonth, LazyLoaded, lazyMemoized, memoized, TypeRef} from "@tutao/tutanota-utils";
import {CalendarEventPreviewViewModel} from "../../gui/eventpopup/CalendarEventPreviewViewModel.js";
import m, {Children, Vnode} from "mithril";
import {FolderColumnView} from "../../../../common/gui/FolderColumnView.js";
import {SidebarSection} from "../../../../common/gui/SidebarSection.js";
import {NavButton, NavButtonColor} from "../../../../common/gui/base/NavButton.js";
import {BootIcons} from "../../../../common/gui/base/icons/BootIcons.js";
import {px, size} from "../../../../common/gui/size.js";
import {lang, TranslationKey} from "../../../../common/misc/LanguageViewModel.js";
import {BackgroundColumnLayout} from "../../../../common/gui/BackgroundColumnLayout.js";
import {theme} from "../../../../common/gui/theme.js";
import {DesktopListToolbar, DesktopViewerToolbar} from "../../../../common/gui/DesktopToolbars.js";
import {SearchListView, SearchListViewAttrs} from "./SearchListView.js";
import {isSameId} from "../../../../common/api/common/utils/EntityUtils.js";
import {keyManager, Shortcut} from "../../../../common/misc/KeyManager.js";
import {EnterMultiselectIconButton} from "../../../../common/gui/EnterMultiselectIconButton.js";
import {styles} from "../../../../common/gui/styles.js";
import {BaseMobileHeader} from "../../../../common/gui/BaseMobileHeader.js";
import {MobileHeader, MobileHeaderMenuButton} from "../../../../common/gui/MobileHeader.js";
import {searchBar} from "../SearchBar.js";
import {ProgressBar} from "../../../../common/gui/base/ProgressBar.js";
import ColumnEmptyMessageBox from "../../../../common/gui/base/ColumnEmptyMessageBox.js";
import { TopLevelAttrs, TopLevelView } from "../../../../TopLevelView.js"
import { DrawerMenuAttrs } from "../../../../common/gui/nav/DrawerMenu.js"
import { AppHeaderAttrs, Header } from "../../../../common/gui/Header.js"
import { CalendarSearchViewModel } from "./CalendarSearchViewModel.js"
import { BaseTopLevelView } from "../../../../common/gui/BaseTopLevelView.js"
import { ColumnType, ViewColumn } from "../../../../common/gui/base/ViewColumn.js"
import { ViewSlider } from "../../../../common/gui/nav/ViewSlider.js"
import { CalendarEvent } from "../../../../common/api/entities/tutanota/TypeRefs.js"
import { assertNotNull, incrementMonth, LazyLoaded, lazyMemoized, memoized, TypeRef } from "@tutao/tutanota-utils"
import { CalendarEventPreviewViewModel } from "../../gui/eventpopup/CalendarEventPreviewViewModel.js"
import m, { Children, Vnode } from "mithril"
import { FolderColumnView } from "../../../../common/gui/FolderColumnView.js"
import { SidebarSection } from "../../../../common/gui/SidebarSection.js"
import { NavButton, NavButtonColor } from "../../../../common/gui/base/NavButton.js"
import { BootIcons } from "../../../../common/gui/base/icons/BootIcons.js"
import { px, size } from "../../../../common/gui/size.js"
import { lang, TranslationKey } from "../../../../common/misc/LanguageViewModel.js"
import { BackgroundColumnLayout } from "../../../../common/gui/BackgroundColumnLayout.js"
import { theme } from "../../../../common/gui/theme.js"
import { DesktopListToolbar, DesktopViewerToolbar } from "../../../../common/gui/DesktopToolbars.js"
import { SearchListView, CalendarSearchListViewAttrs } from "./SearchListView.js"
import { isSameId } from "../../../../common/api/common/utils/EntityUtils.js"
import { keyManager, Shortcut } from "../../../../common/misc/KeyManager.js"
import { EnterMultiselectIconButton } from "../../../../common/gui/EnterMultiselectIconButton.js"
import { styles } from "../../../../common/gui/styles.js"
import { BaseMobileHeader } from "../../../../common/gui/BaseMobileHeader.js"
import { MobileHeader, MobileHeaderMenuButton } from "../../../../common/gui/MobileHeader.js"
import { searchBar } from "../CalendarSearchBar.js"
import { ProgressBar } from "../../../../common/gui/base/ProgressBar.js"
import ColumnEmptyMessageBox from "../../../../common/gui/base/ColumnEmptyMessageBox.js"
import {
EventDetailsView,
EventDetailsViewAttrs,
@ -57,18 +57,18 @@ import { CalendarInfo } from "../../model/CalendarModel.js"
import { Checkbox, CheckboxAttrs } from "../../../../common/gui/base/Checkbox.js"
import { MobileActionAttrs, MobileActionBar } from "../../../../common/gui/MobileActionBar.js"
import { assertMainOrNode } from "../../../../common/api/common/Env.js"
import { locator } from "../../../../common/api/main/CommonLocator.js"
import { BottomNav } from "../../../../mail-app/gui/BottomNav.js"
import { CalendarBottomNav } from "../../../gui/CalendarBottomNav.js"
import { calendarLocator } from "../../../calendarLocator.js"
assertMainOrNode()
export interface SearchViewAttrs extends TopLevelAttrs {
export interface CalendarSearchViewAttrs extends TopLevelAttrs {
drawerAttrs: DrawerMenuAttrs
header: AppHeaderAttrs
makeViewModel: () => CalendarSearchViewModel
}
export class SearchView extends BaseTopLevelView implements TopLevelView<SearchViewAttrs> {
export class CalendarSearchView extends BaseTopLevelView implements TopLevelView<CalendarSearchViewAttrs> {
private readonly resultListColumn: ViewColumn
private readonly resultDetailsColumn: ViewColumn
private readonly folderColumn: ViewColumn
@ -78,13 +78,13 @@ export class SearchView extends BaseTopLevelView implements TopLevelView<SearchV
private getSanitizedPreviewData: (event: CalendarEvent) => LazyLoaded<CalendarEventPreviewViewModel> = memoized((event: CalendarEvent) =>
new LazyLoaded(async () => {
const calendars = await this.searchViewModel.getLazyCalendarInfos().getAsync()
const eventPreviewModel = await locator.calendarEventPreviewModel(event, calendars)
const eventPreviewModel = await calendarLocator.calendarEventPreviewModel(event, calendars)
eventPreviewModel.sanitizeDescription().then(() => m.redraw())
return eventPreviewModel
}).load(),
)
constructor(vnode: Vnode<SearchViewAttrs>) {
constructor(vnode: Vnode<CalendarSearchViewAttrs>) {
super()
this.searchViewModel = vnode.attrs.makeViewModel()
@ -169,8 +169,8 @@ export class SearchView extends BaseTopLevelView implements TopLevelView<SearchV
cancelCallback: () => {
this.searchViewModel.sendStopLoadingSignal()
},
isFreeAccount: locator.logins.getUserController().isFreeAccount(),
} satisfies SearchListViewAttrs)
isFreeAccount: calendarLocator.logins.getUserController().isFreeAccount(),
} satisfies CalendarSearchListViewAttrs)
}
private renderFilterSection(): Children {
@ -282,7 +282,7 @@ export class SearchView extends BaseTopLevelView implements TopLevelView<SearchV
}
private renderBottomNav() {
if (!styles.isSingleColumnLayout()) return m(BottomNav)
if (!styles.isSingleColumnLayout()) return m(CalendarBottomNav)
const isInMultiselect = this.searchViewModel.listModel?.state.inMultiselect ?? false
@ -322,7 +322,7 @@ export class SearchView extends BaseTopLevelView implements TopLevelView<SearchV
return m(MobileActionBar, { actions })
}
return m(BottomNav)
return m(CalendarBottomNav)
}
private searchBarPlaceholder() {
@ -402,7 +402,7 @@ export class SearchView extends BaseTopLevelView implements TopLevelView<SearchV
exec: () => {
this.createNewEventDialog()
},
enabled: () => locator.logins.isInternalUserLoggedIn() && !locator.logins.isEnabled(FeatureType.ReplyOnly),
enabled: () => calendarLocator.logins.isInternalUserLoggedIn() && !calendarLocator.logins.isEnabled(FeatureType.ReplyOnly),
help: "newMail_action",
},
])
@ -444,9 +444,15 @@ export class SearchView extends BaseTopLevelView implements TopLevelView<SearchV
await showProgressDialog("pleaseWait_msg", calendarInfos)
}
const mailboxDetails = await locator.mailModel.getUserMailboxDetails()
const mailboxProperties = await locator.mailModel.getMailboxProperties(mailboxDetails.mailboxGroupRoot)
const model = await locator.calendarEventModel(CalendarOperation.Create, getEventWithDefaultTimes(dateToUse), mailboxDetails, mailboxProperties, null)
const mailboxDetails = await calendarLocator.mailModel.getUserMailboxDetails()
const mailboxProperties = await calendarLocator.mailModel.getMailboxProperties(mailboxDetails.mailboxGroupRoot)
const model = await calendarLocator.calendarEventModel(
CalendarOperation.Create,
getEventWithDefaultTimes(dateToUse),
mailboxDetails,
mailboxProperties,
null,
)
if (model) {
await showNewCalendarEventEditDialog(model)
@ -459,7 +465,7 @@ export class SearchView extends BaseTopLevelView implements TopLevelView<SearchV
// Load user's calendar list
const items = Array.from(calendarInfos.values()).map((ci) => ({
name: getSharedGroupName(ci.groupInfo, locator.logins.getUserController(), true),
name: getSharedGroupName(ci.groupInfo, calendarLocator.logins.getUserController(), true),
value: ci,
}))
@ -502,7 +508,7 @@ export class SearchView extends BaseTopLevelView implements TopLevelView<SearchV
)
}
view({ attrs }: Vnode<SearchViewAttrs>): Children {
view({ attrs }: Vnode<CalendarSearchViewAttrs>): Children {
return m(
"#search.main-view",
m(this.viewSlider, {

View file

@ -222,7 +222,6 @@ export class CalendarSearchViewModel {
this.lazyCalendarInfos.load()
this.latestCalendarRestriction = restriction
//FIXME: Why isn't selecting?
if (args.id != null) {
const { start, id } = decodeCalendarSearchKey(args.id)
this.loadAndSelectIfNeeded(id, ({ entry }: SearchResultListEntry) => {

View file

@ -23,21 +23,21 @@ export class SearchResultListEntry {
}
}
export interface SearchListViewAttrs {
export interface CalendarSearchListViewAttrs {
listModel: ListModel<SearchResultListEntry>
onSingleSelection: (item: SearchResultListEntry) => unknown
isFreeAccount: boolean
cancelCallback: () => unknown | null
}
export class SearchListView implements Component<SearchListViewAttrs> {
export class SearchListView implements Component<CalendarSearchListViewAttrs> {
private listModel: ListModel<SearchResultListEntry>
constructor({ attrs }: Vnode<SearchListViewAttrs>) {
constructor({ attrs }: Vnode<CalendarSearchListViewAttrs>) {
this.listModel = attrs.listModel
}
view({ attrs }: Vnode<SearchListViewAttrs>): Children {
view({ attrs }: Vnode<CalendarSearchListViewAttrs>): Children {
this.listModel = attrs.listModel
const icon = BootIcons.Calendar
const renderConfig = this.calendarRenderConfig

View file

@ -12,7 +12,7 @@ import {
} from "../../../common/api/entities/sys/TypeRefs.js"
import { OperationType } from "../../../common/api/common/TutanotaConstants.js"
import stream from "mithril/stream"
import { locator } from "../../../common/api/main/MainLocator.js"
import { calendarLocator } from "../../calendarLocator.js"
assertMainOrNode()
@ -21,9 +21,9 @@ export class GlobalSettingsViewer implements UpdatableSettingsViewer {
private accountMaintenanceUpdateNotifier: AccountMaintenanceUpdateNotifier | null = null
private readonly customerProperties = new LazyLoaded(() =>
locator.entityClient
.load(CustomerTypeRef, neverNull(locator.logins.getUserController().user.customer))
.then((customer) => locator.entityClient.load(CustomerPropertiesTypeRef, neverNull(customer.properties))),
calendarLocator.entityClient
.load(CustomerTypeRef, neverNull(calendarLocator.logins.getUserController().user.customer))
.then((customer) => calendarLocator.entityClient.load(CustomerPropertiesTypeRef, neverNull(customer.properties))),
)
constructor() {
@ -44,7 +44,7 @@ export class GlobalSettingsViewer implements UpdatableSettingsViewer {
}
private updateCustomerServerProperties(): Promise<void> {
return locator.customerFacade.loadCustomerServerProperties().then((props) => {
return calendarLocator.customerFacade.loadCustomerServerProperties().then((props) => {
this.props(props)
m.redraw()
})

View file

@ -3,7 +3,6 @@ import Stream from "mithril/stream"
import stream from "mithril/stream"
import { UpdatableSettingsViewer } from "../../../common/settings/Interfaces.js"
import { PushIdentifier, PushIdentifierTypeRef, User } from "../../../common/api/entities/sys/TypeRefs.js"
import { locator } from "../../../common/api/main/MainLocator.js"
import { isApp, isDesktop } from "../../../common/api/common/Env.js"
import { lang } from "../../../common/misc/LanguageViewModel.js"
import { IdentifierRow } from "../../../mail-app/settings/IdentifierRow.js"
@ -12,6 +11,7 @@ import { NotFoundError } from "../../../common/api/common/error/RestError.js"
import { PushServiceType } from "../../../common/api/common/TutanotaConstants.js"
import { SettingsNotificationTargets, SettingsNotificationTargetsAttrs } from "../../../common/settings/SettingsNotificationTargets.js"
import { EntityUpdateData, isUpdateForTypeRef } from "../../../common/api/common/utils/EntityUpdateUtils.js"
import { calendarLocator } from "../../calendarLocator.js"
export class NotificationSettingsViewer implements UpdatableSettingsViewer {
private currentIdentifier: string | null = null
@ -22,13 +22,13 @@ export class NotificationSettingsViewer implements UpdatableSettingsViewer {
constructor() {
this.expanded = stream<boolean>(false)
this.identifiers = []
this.user = locator.logins.getUserController().user
this.user = calendarLocator.logins.getUserController().user
this.loadPushIdentifiers()
}
private disableIdentifier(identifier: PushIdentifier) {
identifier.disabled = !identifier.disabled
locator.entityClient.update(identifier).then(m.redraw)
calendarLocator.entityClient.update(identifier).then(m.redraw)
}
view(): Children {
@ -42,7 +42,7 @@ export class NotificationSettingsViewer implements UpdatableSettingsViewer {
identifier: identifier.identifier,
current: isCurrentDevice,
removeClicked: () => {
locator.entityClient.erase(identifier).catch(ofClass(NotFoundError, noOp))
calendarLocator.entityClient.erase(identifier).catch(ofClass(NotFoundError, noOp))
},
formatIdentifier: identifier.pushServiceType !== PushServiceType.EMAIL,
disableClicked: () => this.disableIdentifier(identifier),
@ -73,14 +73,14 @@ export class NotificationSettingsViewer implements UpdatableSettingsViewer {
const list = this.user.pushIdentifierList
if (list) {
this.identifiers = await locator.entityClient.loadAll(PushIdentifierTypeRef, list.list)
this.identifiers = await calendarLocator.entityClient.loadAll(PushIdentifierTypeRef, list.list)
m.redraw()
}
}
private getCurrentIdentifier(): string | null {
return isApp() || isDesktop() ? locator.pushService.getLoadedPushIdentifier() : null
return isApp() || isDesktop() ? calendarLocator.pushService.getLoadedPushIdentifier() : null
}
async entityEventsReceived(updates: readonly EntityUpdateData[]): Promise<void> {

View file

@ -13,7 +13,6 @@ import { LazyLoaded } from "@tutao/tutanota-utils"
import { FeatureType, GroupType, LegacyPlans } from "../../../common/api/common/TutanotaConstants.js"
import { BootIcons } from "../../../common/gui/base/icons/BootIcons.js"
import { LoginSettingsViewer } from "../../../common/settings/login/LoginSettingsViewer.js"
import { locator } from "../../../common/api/main/MainLocator.js"
import { Icons } from "../../../common/gui/base/icons/Icons.js"
import { AppearanceSettingsViewer } from "../../../common/settings/AppearanceSettingsViewer.js"
import { FolderColumnView } from "../../../common/gui/FolderColumnView.js"
@ -29,7 +28,6 @@ import { getAvailableDomains } from "../../../common/settings/mailaddress/MailAd
import { UserListView } from "../../../mail-app/settings/UserListView.js"
import { showUserImportDialog, UserViewer } from "../../../mail-app/settings/UserViewer.js"
import { exportUserCsv } from "../../../mail-app/settings/UserDataExporter.js"
import { GroupListView } from "../../../mail-app/settings/groups/GroupListView.js"
import { WhitelabelSettingsViewer } from "../../../common/settings/whitelabel/WhitelabelSettingsViewer.js"
import { SubscriptionViewer } from "../../../common/subscription/SubscriptionViewer.js"
import { PaymentViewer } from "../../../common/subscription/PaymentViewer.js"
@ -37,7 +35,6 @@ import { ReferralSettingsViewer } from "../../../common/settings/ReferralSetting
import { GroupDetailsView } from "../../../mail-app/settings/groups/GroupDetailsView.js"
import { TemplateDetailsViewer } from "../../../mail-app/settings/TemplateDetailsViewer.js"
import { KnowledgeBaseSettingsDetailsViewer } from "../../../mail-app/settings/KnowledgeBaseListView.js"
import { BottomNav } from "../../../common/gui/nav/BottomNav.js"
import { NavButtonAttrs, NavButtonColor } from "../../../common/gui/base/NavButton.js"
import { CustomerInfoTypeRef, CustomerTypeRef, User } from "../../../common/api/entities/sys/TypeRefs.js"
import { Dialog } from "../../../common/gui/base/Dialog.js"
@ -45,10 +42,12 @@ import { AboutDialog } from "../../../mail-app/settings/AboutDialog.js"
import { SettingsViewAttrs, UpdatableSettingsDetailsViewer, UpdatableSettingsViewer } from "../../../common/settings/Interfaces.js"
import { NotificationSettingsViewer } from "../settings/NotificationSettingsViewer.js"
import { GlobalSettingsViewer } from "../settings/GlobalSettingsViewer.js"
import { CalendarBottomNav } from "../../gui/CalendarBottomNav.js"
import { calendarLocator } from "../../calendarLocator.js"
assertMainOrNode()
export class SettingsView extends BaseTopLevelView implements TopLevelView<SettingsViewAttrs> {
export class CalendarSettingsView extends BaseTopLevelView implements TopLevelView<SettingsViewAttrs> {
viewSlider: ViewSlider
private readonly _settingsFoldersColumn: ViewColumn
private readonly _settingsColumn: ViewColumn
@ -73,7 +72,7 @@ export class SettingsView extends BaseTopLevelView implements TopLevelView<Setti
"login_label",
() => BootIcons.Contacts,
"login",
() => new LoginSettingsViewer(locator.credentialsProvider, isApp() ? locator.systemFacade : null),
() => new LoginSettingsViewer(calendarLocator.credentialsProvider, isApp() ? calendarLocator.systemFacade : null),
undefined,
),
new SettingsFolder(
@ -119,7 +118,7 @@ export class SettingsView extends BaseTopLevelView implements TopLevelView<Setti
this._renderSidebarSectionChildren(this._adminFolders),
)
: null,
locator.domainConfigProvider().getCurrentDomainConfig().firstPartyDomain ? this._aboutThisSoftwareLink() : null,
calendarLocator.domainConfigProvider().getCurrentDomainConfig().firstPartyDomain ? this._aboutThisSoftwareLink() : null,
]),
ariaLabel: "settings_label",
})
@ -220,26 +219,11 @@ export class SettingsView extends BaseTopLevelView implements TopLevelView<Setti
() => this.focusSettingsDetailsColumn(),
() => !isApp() && this._customDomains.isLoaded() && this._customDomains.getLoaded().length > 0,
() => showUserImportDialog(this._customDomains.getLoaded()),
() => exportUserCsv(locator.entityClient, this.logins, locator.fileController, locator.counterFacade),
() => exportUserCsv(calendarLocator.entityClient, this.logins, calendarLocator.fileController, calendarLocator.counterFacade),
),
undefined,
),
)
if (!this.logins.isEnabled(FeatureType.WhitelabelChild)) {
this._adminFolders.push(
new SettingsFolder(
"sharedMailboxes_label",
() => Icons.People,
"groups",
() =>
new GroupListView(
(viewer) => this.replaceDetailsViewer(viewer),
() => this.focusSettingsDetailsColumn(),
),
undefined,
),
)
}
}
if (this.logins.getUserController().isGlobalAdmin()) {
@ -259,7 +243,7 @@ export class SettingsView extends BaseTopLevelView implements TopLevelView<Setti
"whitelabel_label",
() => Icons.Wand,
"whitelabel",
() => new WhitelabelSettingsViewer(locator.entityClient, this.logins),
() => new WhitelabelSettingsViewer(calendarLocator.entityClient, this.logins),
undefined,
),
)
@ -307,7 +291,7 @@ export class SettingsView extends BaseTopLevelView implements TopLevelView<Setti
}
oncreate(vnode: Vnode<SettingsViewAttrs>) {
locator.eventController.addEntityListener(this.entityListener)
calendarLocator.eventController.addEntityListener(this.entityListener)
this.populateAdminFolders().then(() => {
// We have to wait for the folders to be initialized before setting the URL,
// otherwise we won't find the requested folder and will just pick the default folder
@ -319,7 +303,7 @@ export class SettingsView extends BaseTopLevelView implements TopLevelView<Setti
}
onremove(vnode: VnodeDOM<SettingsViewAttrs>) {
locator.eventController.removeEntityListener(this.entityListener)
calendarLocator.eventController.removeEntityListener(this.entityListener)
}
private entityListener = (updates: EntityUpdateData[], eventOwnerGroupId: Id) => {
@ -333,7 +317,7 @@ export class SettingsView extends BaseTopLevelView implements TopLevelView<Setti
header: m(Header, {
...attrs.header,
}),
bottomNav: m(BottomNav),
bottomNav: m(CalendarBottomNav),
}),
)
}
@ -482,7 +466,7 @@ export class SettingsView extends BaseTopLevelView implements TopLevelView<Setti
m(AboutDialog, {
onShowSetupWizard: () => {
dialog.close()
locator.showSetupWizard()
calendarLocator.showSetupWizard()
},
}),
allowOkWithReturn: true,

View file

@ -52,7 +52,7 @@ import type Stream from "mithril/stream"
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 { CalendarBottomNav } from "../../gui/CalendarBottomNav.js"
import { CalendarBottomNav } from "../../../common/gui/CalendarBottomNav.js"
import { DrawerMenuAttrs } from "../../../common/gui/nav/DrawerMenu.js"
import { BaseTopLevelView } from "../../../common/gui/BaseTopLevelView.js"
import { TopLevelAttrs, TopLevelView } from "../../../TopLevelView.js"
@ -74,6 +74,7 @@ export interface CalendarViewAttrs extends TopLevelAttrs {
drawerAttrs: DrawerMenuAttrs
header: AppHeaderAttrs
calendarViewModel: CalendarViewModel
bottomNav: Children
}
const CalendarViewTypeByValue = reverse(CalendarViewType)
@ -823,7 +824,7 @@ export class CalendarView extends BaseTopLevelView implements TopLevelView<Calen
}),
...attrs.header,
}),
bottomNav: m(CalendarBottomNav),
bottomNav: attrs.bottomNav,
}),
)
}

View file

@ -111,7 +111,7 @@ assertMainOrNode()
class CalendarLocator {
eventController!: EventController
calendarSearch!: CalendarSearchModel
search!: CalendarSearchModel
mailModel!: MailModel
contactModel!: ContactModel
entityClient!: EntityClient
@ -210,7 +210,7 @@ class CalendarLocator {
return () => {
return new CalendarSearchViewModel(
searchRouter,
this.calendarSearch,
this.search,
this.searchFacade,
this.logins,
this.entityClient,
@ -229,7 +229,7 @@ class CalendarLocator {
return () => {
return new CalendarSearchViewModel(
searchRouter,
this.calendarSearch,
this.search,
this.searchFacade,
this.logins,
this.entityClient,
@ -556,7 +556,7 @@ class CalendarLocator {
this.logins.init()
this.eventController = new EventController(calendarLocator.logins)
this.progressTracker = new ProgressTracker()
this.calendarSearch = new CalendarSearchModel(this.searchFacade, () => this.calendarEventsRepository())
this.search = new CalendarSearchModel(this.searchFacade, () => this.calendarEventsRepository())
this.entityClient = new EntityClient(restInterface)
this.cryptoFacade = cryptoFacade
this.cacheStorage = cacheStorage

View file

@ -69,6 +69,7 @@ import { CalendarEventModel, CalendarOperation } from "../../../calendar-app/cal
import { CalendarEventPreviewViewModel } from "../../../calendar-app/calendar/gui/eventpopup/CalendarEventPreviewViewModel.js"
import { RecipientsModel } from "./RecipientsModel.js"
import { ThemeController } from "../../gui/ThemeController.js"
import { CalendarSearchModel } from "../../../calendar-app/calendar/search/model/CalendarSearchModel.js"
export interface CommonLocator {
worker: WorkerClient
@ -81,7 +82,7 @@ export interface CommonLocator {
secondFactorHandler: SecondFactorHandler
loginListener: PageContextLoginListener
newsModel: NewsModel
search: SearchModel
search: SearchModel | CalendarSearchModel
infoMessageHandler: InfoMessageHandler
desktopSettingsFacade: SettingsFacade
desktopSystemFacade: DesktopSystemFacade

View file

@ -59,10 +59,10 @@ import {
addDaysForRecurringEvent,
CalendarTimeRange,
generateCalendarInstancesInRange,
} from "../../../../calendar/date/CalendarUtils.js"
} from "../../../../../calendar-app/calendar/date/CalendarUtils.js"
import { CalendarInfo } from "../../../../../calendar-app/calendar/model/CalendarModel.js"
import { geEventElementMaxId, getEventElementMinId } from "../../../common/utils/CommonCalendarUtils.js"
import { DaysToEvents } from "../../../../calendar/date/CalendarEventsRepository.js"
import { DaysToEvents } from "../../../../../calendar-app/calendar/date/CalendarEventsRepository.js"
import { isOfflineError } from "../../../common/utils/ErrorUtils.js"
assertWorkerOrNode()

View file

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

View file

@ -1,18 +1,23 @@
import Stream from "mithril/stream"
import stream from "mithril/stream"
<<<<<<<< HEAD:src/common/calendar/date/CalendarEventsRepository.ts
import { CalendarInfo, CalendarModel } from "../../../calendar-app/calendar/model/CalendarModel.js"
import { IProgressMonitor } from "../../api/common/utils/ProgressMonitor.js"
========
import { CalendarInfo, CalendarModel } from "../model/CalendarModel.js"
import { IProgressMonitor } from "../../../common/api/common/utils/ProgressMonitor.js"
>>>>>>>> 3349a964d (Move files to new folder structure):src/calendar-app/calendar/date/CalendarEventsRepository.ts
import { addDaysForRecurringEvent, CalendarTimeRange, getEventEnd, getEventStart, getMonthRange } from "./CalendarUtils.js"
import { CalendarEvent, CalendarEventTypeRef } from "../../api/entities/tutanota/TypeRefs.js"
import { getListId, isSameId } from "../../api/common/utils/EntityUtils.js"
import { CalendarEvent, CalendarEventTypeRef } from "../../../common/api/entities/tutanota/TypeRefs.js"
import { getListId, isSameId } from "../../../common/api/common/utils/EntityUtils.js"
import { DateTime } from "luxon"
import { CalendarFacade } from "../../api/worker/facades/lazy/CalendarFacade.js"
import { EntityClient } from "../../api/common/EntityClient.js"
import { CalendarFacade } from "../../../common/api/worker/facades/lazy/CalendarFacade.js"
import { EntityClient } from "../../../common/api/common/EntityClient.js"
import { findAllAndRemove } from "@tutao/tutanota-utils"
import { OperationType } from "../../api/common/TutanotaConstants.js"
import { NotAuthorizedError, NotFoundError } from "../../api/common/error/RestError.js"
import { EventController } from "../../api/main/EventController.js"
import { EntityUpdateData, isUpdateForTypeRef } from "../../api/common/utils/EntityUpdateUtils.js"
import { OperationType } from "../../../common/api/common/TutanotaConstants.js"
import { NotAuthorizedError, NotFoundError } from "../../../common/api/common/error/RestError.js"
import { EventController } from "../../../common/api/main/EventController.js"
import { EntityUpdateData, isUpdateForTypeRef } from "../../../common/api/common/utils/EntityUpdateUtils.js"
const LIMIT_PAST_EVENTS_YEARS = 100

View file

@ -16,7 +16,7 @@ import {
neverNull,
TIMESTAMP_ZERO_YEAR,
} from "@tutao/tutanota-utils"
import { EndType, EventTextTimeOption, getWeekStart, RepeatPeriod, TimeFormat, WeekStart } from "../../api/common/TutanotaConstants"
import { EndType, EventTextTimeOption, getWeekStart, RepeatPeriod, TimeFormat, WeekStart } from "../../../common/api/common/TutanotaConstants"
import { DateTime, DurationLikeObject, FixedOffsetZone, IANAZone } from "luxon"
import {
CalendarEvent,
@ -25,17 +25,31 @@ 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"
<<<<<<<< HEAD:src/common/calendar/date/CalendarUtils.ts
import type { CalendarInfo } from "../../../calendar-app/calendar/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 type { CalendarInfo } from "../model/CalendarModel"
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"
>>>>>>>> 3349a964d (Move files to new folder structure):src/calendar-app/calendar/date/CalendarUtils.ts
export type CalendarTimeRange = {
start: number

View file

@ -172,7 +172,6 @@ export class ContactModel {
const group = await this.entityClient.load(GroupTypeRef, groupInfo.group)
const groupRoot = await this.entityClient.load(ContactListGroupRootTypeRef, groupInfo.group)
const userController = this.loginController.getUserController()
const { getSharedGroupName } = await import("../sharing/GroupUtils.js")
const { hasCapabilityOnGroup, isSharedGroupOwner } = await import("../sharing/GroupUtils.js")

View file

@ -27,6 +27,7 @@ import { StructuredRelationship } from "../native/common/generatedipc/Structured
import { StructuredMessengerHandle } from "../native/common/generatedipc/StructuredMessengerHandle.js"
import { StructuredContact } from "../native/common/generatedipc/StructuredContact.js"
assertMainOrNode()
export type ContactNames = Pick<Contact, "nickname" | "firstName" | "lastName">

View file

@ -1,11 +1,11 @@
import { WebAuthnFacade } from "../../native/common/generatedipc/WebAuthnFacade.js"
import { WebAuthnFacade } from "../../common/native/common/generatedipc/WebAuthnFacade.js"
import type { WebDialogController } from "../WebDialog.js"
import { WebDialog } from "../WebDialog.js"
import { ApplicationWindow } from "../ApplicationWindow.js"
import { WebAuthnRegistrationChallenge } from "../../native/common/generatedipc/WebAuthnRegistrationChallenge.js"
import { WebAuthnRegistrationResult } from "../../native/common/generatedipc/WebAuthnRegistrationResult.js"
import { WebAuthnSignChallenge } from "../../native/common/generatedipc/WebAuthnSignChallenge.js"
import { WebAuthnSignResult } from "../../native/common/generatedipc/WebAuthnSignResult.js"
import { WebAuthnRegistrationChallenge } from "../../common/native/common/generatedipc/WebAuthnRegistrationChallenge.js"
import { WebAuthnRegistrationResult } from "../../common/native/common/generatedipc/WebAuthnRegistrationResult.js"
import { WebAuthnSignChallenge } from "../../common/native/common/generatedipc/WebAuthnSignChallenge.js"
import { WebAuthnSignResult } from "../../common/native/common/generatedipc/WebAuthnSignResult.js"
export class DesktopWebauthnFacade implements WebAuthnFacade {
private currentDialog: Promise<WebDialog<{ WebAuthnFacade: WebAuthnFacade }>> | null = null

View file

@ -3,20 +3,20 @@ import type { WindowBounds, WindowManager } from "./DesktopWindowManager"
import url from "node:url"
import type { lazy } from "@tutao/tutanota-utils"
import { capitalizeFirstLetter, noOp, typedEntries, typedKeys } from "@tutao/tutanota-utils"
import { Keys } from "../api/common/TutanotaConstants"
import type { Key } from "../misc/KeyManager"
import { Keys } from "../common/api/common/TutanotaConstants"
import type { Key } from "../common/misc/KeyManager"
import path from "node:path"
import type { TranslationKey } from "../misc/LanguageViewModel"
import { lang } from "../misc/LanguageViewModel"
import type { TranslationKey } from "../common/misc/LanguageViewModel"
import { lang } from "../common/misc/LanguageViewModel"
import { log } from "./DesktopLog"
import { parseUrlOrNull } from "./PathUtils"
import type { LocalShortcutManager } from "./electron-localshortcut/LocalShortcut"
import { DesktopThemeFacade } from "./DesktopThemeFacade"
import { CancelledError } from "../api/common/error/CancelledError"
import { DesktopFacade } from "../native/common/generatedipc/DesktopFacade.js"
import { CommonNativeFacade } from "../native/common/generatedipc/CommonNativeFacade.js"
import { CancelledError } from "../common/api/common/error/CancelledError"
import { DesktopFacade } from "../common/native/common/generatedipc/DesktopFacade.js"
import { CommonNativeFacade } from "../common/native/common/generatedipc/CommonNativeFacade.js"
import { RemoteBridge } from "./ipc/RemoteBridge.js"
import { InterWindowEventFacadeSendDispatcher } from "../native/common/generatedipc/InterWindowEventFacadeSendDispatcher.js"
import { InterWindowEventFacadeSendDispatcher } from "../common/native/common/generatedipc/InterWindowEventFacadeSendDispatcher.js"
import { handleProtocols } from "./net/ProtocolProxy.js"
import { PerWindowSqlCipherFacade } from "./db/PerWindowSqlCipherFacade.js"
import HandlerDetails = Electron.HandlerDetails

View file

@ -2,8 +2,8 @@
* This is a wrapper for commonly used crypto functions, easier to inject/swap implementations and test.
*/
import crypto from "node:crypto"
import { InstanceMapper } from "../api/worker/crypto/InstanceMapper"
import type { TypeModel } from "../api/common/EntityTypes"
import { InstanceMapper } from "../common/api/worker/crypto/InstanceMapper"
import type { TypeModel } from "../common/api/common/EntityTypes"
import type { Base64 } from "@tutao/tutanota-utils"
import {
Aes256Key,

View file

@ -1,7 +1,7 @@
import { CommonSystemFacade } from "../native/common/generatedipc/CommonSystemFacade.js"
import { CommonSystemFacade } from "../common/native/common/generatedipc/CommonSystemFacade.js"
import { ApplicationWindow } from "./ApplicationWindow.js"
import { defer, DeferredObject } from "@tutao/tutanota-utils"
import { Logger } from "../api/common/Logger.js"
import { Logger } from "../common/api/common/Logger.js"
export class DesktopCommonSystemFacade implements CommonSystemFacade {
private initDefer: DeferredObject<void> = defer()

View file

@ -1,5 +1,5 @@
import type { ContextMenuParams, Menu, WebContents } from "electron"
import { lang } from "../misc/LanguageViewModel"
import { lang } from "../common/misc/LanguageViewModel"
import { WindowManager } from "./DesktopWindowManager.js"
type Electron = typeof Electron.CrossProcessExports

View file

@ -1,4 +1,4 @@
import { DesktopSystemFacade } from "../native/common/generatedipc/DesktopSystemFacade.js"
import { DesktopSystemFacade } from "../common/native/common/generatedipc/DesktopSystemFacade.js"
import { WindowManager } from "./DesktopWindowManager.js"
import { ApplicationWindow } from "./ApplicationWindow.js"
import { Socketeer } from "./Socketeer.js"

View file

@ -1,5 +1,5 @@
import { app, dialog } from "electron"
import { lang } from "../misc/LanguageViewModel"
import { lang } from "../common/misc/LanguageViewModel"
import fs from "node:fs"
import path from "node:path"
import os from "node:os"

View file

@ -9,7 +9,7 @@ import { DesktopConfig } from "./config/DesktopConfig.js"
import { NativeImage } from "electron"
import { ApplicationWindow } from "./ApplicationWindow.js"
import { Attachment, Email, MessageEditorFormat } from "@tutao/oxmsg"
import { sanitizeFilename } from "../api/common/utils/FileUtils.js"
import { sanitizeFilename } from "../common/api/common/utils/FileUtils.js"
import { promises as fs } from "node:fs"
import { TempFs } from "./files/TempFs.js"

View file

@ -3,8 +3,8 @@ import { DesktopNativeCryptoFacade } from "./DesktopNativeCryptoFacade"
import { log } from "./DesktopLog"
import { getFromMap } from "@tutao/tutanota-utils"
import { base64ToKey, keyToBase64 } from "@tutao/tutanota-crypto"
import { DeviceStorageUnavailableError } from "../api/common/error/DeviceStorageUnavailableError.js"
import { CancelledError } from "../api/common/error/CancelledError"
import { DeviceStorageUnavailableError } from "../common/api/common/error/DeviceStorageUnavailableError.js"
import { CancelledError } from "../common/api/common/error/CancelledError"
interface NativeKeySpec {
/**

View file

@ -1,5 +1,5 @@
import { noOp } from "@tutao/tutanota-utils"
import { Mode } from "../api/common/Env"
import { Mode } from "../common/api/common/Env"
type LogFn = (...args: any) => void
export const log: {

View file

@ -10,7 +10,7 @@ import { ElectronUpdater } from "./ElectronUpdater.js"
import { Socketeer } from "./Socketeer"
import { DesktopAlarmStorage } from "./sse/DesktopAlarmStorage"
import { DesktopAlarmScheduler } from "./sse/DesktopAlarmScheduler"
import { lang } from "../misc/LanguageViewModel"
import { lang } from "../common/misc/LanguageViewModel"
import { DesktopNetworkClient } from "./net/DesktopNetworkClient.js"
import { DesktopNativeCryptoFacade } from "./DesktopNativeCryptoFacade"
import { DesktopTray } from "./tray/DesktopTray"
@ -34,12 +34,12 @@ import { WebDialogController } from "./WebDialog.js"
import path from "node:path"
import { DesktopContextMenu } from "./DesktopContextMenu.js"
import { DesktopNativePushFacade } from "./sse/DesktopNativePushFacade.js"
import { NativeCredentialsFacade } from "../native/common/generatedipc/NativeCredentialsFacade.js"
import { NativeCredentialsFacade } from "../common/native/common/generatedipc/NativeCredentialsFacade.js"
import { FacadeHandler, RemoteBridge } from "./ipc/RemoteBridge.js"
import { DesktopSettingsFacade } from "./config/DesktopSettingsFacade.js"
import { ApplicationWindow } from "./ApplicationWindow.js"
import { DesktopCommonSystemFacade } from "./DesktopCommonSystemFacade.js"
import { DesktopGlobalDispatcher } from "../native/common/generatedipc/DesktopGlobalDispatcher.js"
import { DesktopGlobalDispatcher } from "../common/native/common/generatedipc/DesktopGlobalDispatcher.js"
import { DesktopDesktopSystemFacade } from "./DesktopDesktopSystemFacade.js"
import { DesktopExportFacade } from "./DesktopExportFacade.js"
import { DesktopFileFacade } from "./files/DesktopFileFacade.js"

View file

@ -3,7 +3,7 @@ import path from "node:path"
import { app } from "electron"
import { execSync } from "node:child_process"
import { last, neverNull } from "@tutao/tutanota-utils"
import { Logger, replaceNativeLogger } from "../api/common/Logger"
import { Logger, replaceNativeLogger } from "../common/api/common/Logger"
import { log, rebindDesktopLog } from "./DesktopLog"
const logger = new Logger()

View file

@ -1,20 +1,20 @@
import { base64ToBase64Url, base64ToUint8Array, stringToUtf8Uint8Array, uint8ArrayToBase64, utf8Uint8ArrayToString } from "@tutao/tutanota-utils"
import type { CryptoFunctions } from "./CryptoFns.js"
import type { TypeModel } from "../api/common/EntityTypes.js"
import type { TypeModel } from "../common/api/common/EntityTypes.js"
import type * as FsModule from "node:fs"
import { Aes256Key, Argon2IDExports, bitArrayToUint8Array, generateKeyFromPassphraseArgon2id, uint8ArrayToKey } from "@tutao/tutanota-crypto"
import { FileUri } from "../native/common/FileApp.js"
import { FileUri } from "../common/native/common/FileApp.js"
import path from "node:path"
import { NativeCryptoFacade } from "../native/common/generatedipc/NativeCryptoFacade.js"
import { EncryptedFileInfo } from "../native/common/generatedipc/EncryptedFileInfo.js"
import { RsaPrivateKey } from "../native/common/generatedipc/RsaPrivateKey.js"
import { RsaPublicKey } from "../native/common/generatedipc/RsaPublicKey.js"
import { NativeCryptoFacade } from "../common/native/common/generatedipc/NativeCryptoFacade.js"
import { EncryptedFileInfo } from "../common/native/common/generatedipc/EncryptedFileInfo.js"
import { RsaPrivateKey } from "../common/native/common/generatedipc/RsaPrivateKey.js"
import { RsaPublicKey } from "../common/native/common/generatedipc/RsaPublicKey.js"
import { nonClobberingFilename } from "./PathUtils.js"
import { TempFs } from "./files/TempFs.js"
import { KyberKeyPair } from "../native/common/generatedipc/KyberKeyPair.js"
import { KyberPublicKey } from "../native/common/generatedipc/KyberPublicKey.js"
import { KyberEncapsulation } from "../native/common/generatedipc/KyberEncapsulation.js"
import { KyberPrivateKey } from "../native/common/generatedipc/KyberPrivateKey.js"
import { KyberKeyPair } from "../common/native/common/generatedipc/KyberKeyPair.js"
import { KyberPublicKey } from "../common/native/common/generatedipc/KyberPublicKey.js"
import { KyberEncapsulation } from "../common/native/common/generatedipc/KyberEncapsulation.js"
import { KyberPrivateKey } from "../common/native/common/generatedipc/KyberPrivateKey.js"
type FsExports = typeof FsModule

View file

@ -1,4 +1,4 @@
import { PostLoginAction, LoggedInEvent } from "../api/main/LoginController"
import { PostLoginAction, LoggedInEvent } from "../common/api/main/LoginController"
import { WindowManager } from "./DesktopWindowManager"
import { DesktopErrorHandler } from "./DesktopErrorHandler.js"
import { DesktopNotifier } from "./DesktopNotifier.js"

View file

@ -1,6 +1,6 @@
import { SearchTextInAppFacade } from "../native/common/generatedipc/SearchTextInAppFacade.js"
import { SearchTextInAppFacade } from "../common/native/common/generatedipc/SearchTextInAppFacade.js"
import { ApplicationWindow } from "./ApplicationWindow.js"
import { Result } from "../native/common/generatedipc/Result.js"
import { Result } from "../common/native/common/generatedipc/Result.js"
export class DesktopSearchTextInAppFacade implements SearchTextInAppFacade {
constructor(private readonly window: ApplicationWindow) {}

View file

@ -1,7 +1,7 @@
import type { Theme, ThemeId, ThemePreference } from "../gui/theme"
import type { Theme, ThemeId, ThemePreference } from "../common/gui/theme"
import { DesktopConfig } from "./config/DesktopConfig"
import { DesktopConfigKey } from "./config/ConfigKeys"
import { ThemeFacade } from "../native/common/generatedipc/ThemeFacade"
import { ThemeFacade } from "../common/native/common/generatedipc/ThemeFacade"
import { WindowManager } from "./DesktopWindowManager"
import electron from "electron"

View file

@ -6,7 +6,7 @@ import { defer, delay } from "@tutao/tutanota-utils"
import { log } from "./DesktopLog"
import { swapFilename } from "./PathUtils"
import { makeRegisterKeysScript, makeUnregisterKeysScript, RegistryRoot } from "./reg-templater"
import { ProgrammingError } from "../api/common/error/ProgrammingError"
import { ProgrammingError } from "../common/api/common/error/ProgrammingError"
import { getResourcePath } from "./resources.js"
import { TempFs } from "./files/TempFs.js"
import { ElectronExports } from "./ElectronExportTypes.js"

View file

@ -1,6 +1,6 @@
import type { DesktopNotifier } from "./DesktopNotifier"
import { NotificationResult } from "./DesktopNotifier"
import { lang } from "../misc/LanguageViewModel"
import { lang } from "../common/misc/LanguageViewModel"
import type { DesktopConfig } from "./config/DesktopConfig"
import { assertNotNull, delay, downcast, neverNull } from "@tutao/tutanota-utils"
import { DesktopNativeCryptoFacade } from "./DesktopNativeCryptoFacade"

View file

@ -1,5 +1,5 @@
import path from "node:path"
import { sanitizeFilename } from "../api/common/utils/FileUtils"
import { sanitizeFilename } from "../common/api/common/utils/FileUtils"
import { neverNull } from "@tutao/tutanota-utils"
import { promises as fs } from "node:fs"
import { PathExports } from "./ElectronExportTypes"

View file

@ -1,6 +1,6 @@
import type { App } from "electron"
import type { WindowManager } from "./DesktopWindowManager"
import { isMailAddress } from "../misc/FormatValidator"
import { isMailAddress } from "../common/misc/FormatValidator"
import { log } from "./DesktopLog"
import type { TimeoutSetter } from "@tutao/tutanota-utils"
import { NetExports } from "./ElectronExportTypes"

View file

@ -2,12 +2,12 @@ import { app, BrowserWindow, WebContents } from "electron"
import path from "node:path"
import { defer } from "@tutao/tutanota-utils"
import { ElectronWebContentsTransport } from "./ipc/ElectronWebContentsTransport.js"
import { NativeToWebRequest, WebToNativeRequest } from "../native/main/WebauthnNativeBridge.js"
import { MessageDispatcher } from "../api/common/threading/MessageDispatcher.js"
import { exposeRemote } from "../api/common/WorkerProxy.js"
import { CancelledError } from "../api/common/error/CancelledError.js"
import { NativeToWebRequest, WebToNativeRequest } from "../common/native/main/WebauthnNativeBridge.js"
import { MessageDispatcher } from "../common/api/common/threading/MessageDispatcher.js"
import { exposeRemote } from "../common/api/common/WorkerProxy.js"
import { CancelledError } from "../common/api/common/error/CancelledError.js"
import { register } from "./electron-localshortcut/LocalShortcut.js"
import { ProgrammingError } from "../api/common/error/ProgrammingError.js"
import { ProgrammingError } from "../common/api/common/error/ProgrammingError.js"
export const webauthnIpcConfig = Object.freeze({
renderToMainEvent: "to-main-webdialog",

View file

@ -7,7 +7,7 @@ import { BuildConfigKey, DesktopConfigEncKey, DesktopConfigKey } from "./ConfigK
import type { DesktopKeyStoreFacade } from "../DesktopKeyStoreFacade.js"
import { DesktopNativeCryptoFacade } from "../DesktopNativeCryptoFacade"
import { log } from "../DesktopLog"
import { ProgrammingError } from "../../api/common/error/ProgrammingError"
import { ProgrammingError } from "../../common/api/common/error/ProgrammingError"
import type { ConfigFileType } from "./ConfigFile"
import { ConfigFile } from "./ConfigFile"
import { CryptoError } from "@tutao/tutanota-crypto/error.js"

View file

@ -1,13 +1,13 @@
import { SettingsFacade } from "../../native/common/generatedipc/SettingsFacade.js"
import { SettingsFacade } from "../../common/native/common/generatedipc/SettingsFacade.js"
import { DesktopConfig } from "./DesktopConfig.js"
import { IntegrationInfo } from "../../native/common/generatedipc/IntegrationInfo.js"
import { IntegrationInfo } from "../../common/native/common/generatedipc/IntegrationInfo.js"
import { DesktopConfigKey } from "./ConfigKeys.js"
import { DesktopUtils } from "../DesktopUtils.js"
import { DesktopIntegrator } from "../integration/DesktopIntegrator.js"
import { ElectronUpdater } from "../ElectronUpdater.js"
import * as electron from "electron"
import { UpdateInfo } from "electron-updater"
import { LanguageViewModel } from "../../misc/LanguageViewModel.js"
import { LanguageViewModel } from "../../common/misc/LanguageViewModel.js"
export class DesktopSettingsFacade implements SettingsFacade {
constructor(

View file

@ -1,14 +1,14 @@
import { CredentialEncryptionMode } from "../../misc/credentials/CredentialEncryptionMode.js"
import { CredentialEncryptionMode } from "../../common/misc/credentials/CredentialEncryptionMode.js"
import { DesktopConfigKey } from "../config/ConfigKeys.js"
import { Aes256Key, Argon2IDExports, generateKeyFromPassphraseArgon2id, KEY_LENGTH_BYTES_AES_256 } from "@tutao/tutanota-crypto"
import { base64ToUint8Array, Thunk, uint8ArrayToBase64 } from "@tutao/tutanota-utils"
import { KeyPermanentlyInvalidatedError } from "../../api/common/error/KeyPermanentlyInvalidatedError.js"
import { KeyPermanentlyInvalidatedError } from "../../common/api/common/error/KeyPermanentlyInvalidatedError.js"
import { CryptoError } from "@tutao/tutanota-crypto/error.js"
import { CancelledError } from "../../api/common/error/CancelledError.js"
import { CancelledError } from "../../common/api/common/error/CancelledError.js"
import { DesktopNativeCryptoFacade } from "../DesktopNativeCryptoFacade.js"
import { DesktopConfig } from "../config/DesktopConfig.js"
import { CommonNativeFacade } from "../../native/common/generatedipc/CommonNativeFacade.js"
import { LanguageViewModel } from "../../misc/LanguageViewModel.js"
import { CommonNativeFacade } from "../../common/native/common/generatedipc/CommonNativeFacade.js"
import { LanguageViewModel } from "../../common/misc/LanguageViewModel.js"
import { DesktopCredentialsMode } from "./CredentialCommons.js"
export class AppPassHandler {

View file

@ -1,5 +1,5 @@
import { assert } from "@tutao/tutanota-utils"
import { CredentialEncryptionMode } from "../../misc/credentials/CredentialEncryptionMode.js"
import { CredentialEncryptionMode } from "../../common/misc/credentials/CredentialEncryptionMode.js"
/** the single source of truth for this configuration */
export const SUPPORTED_MODES = Object.freeze([CredentialEncryptionMode.DEVICE_LOCK, CredentialEncryptionMode.APP_PASSWORD] as const)

View file

@ -1,12 +1,12 @@
import { CredentialEncryptionMode } from "../../misc/credentials/CredentialEncryptionMode.js"
import { CredentialEncryptionMode } from "../../common/misc/credentials/CredentialEncryptionMode.js"
import { DesktopNativeCryptoFacade } from "../DesktopNativeCryptoFacade"
import { stringToUtf8Uint8Array, utf8Uint8ArrayToString } from "@tutao/tutanota-utils"
import { NativeCredentialsFacade } from "../../native/common/generatedipc/NativeCredentialsFacade.js"
import { NativeCredentialsFacade } from "../../common/native/common/generatedipc/NativeCredentialsFacade.js"
import { bitArrayToUint8Array, uint8ArrayToBitArray } from "@tutao/tutanota-crypto"
import { KeyPermanentlyInvalidatedError } from "../../api/common/error/KeyPermanentlyInvalidatedError.js"
import { PersistedCredentials } from "../../native/common/generatedipc/PersistedCredentials.js"
import { KeyPermanentlyInvalidatedError } from "../../common/api/common/error/KeyPermanentlyInvalidatedError.js"
import { PersistedCredentials } from "../../common/native/common/generatedipc/PersistedCredentials.js"
import { DesktopCredentialsStorage } from "../db/DesktopCredentialsStorage.js"
import { UnencryptedCredentials } from "../../native/common/generatedipc/UnencryptedCredentials.js"
import { UnencryptedCredentials } from "../../common/native/common/generatedipc/UnencryptedCredentials.js"
import { assertDesktopEncryptionMode, assertSupportedEncryptionMode, DesktopCredentialsMode, SUPPORTED_MODES } from "./CredentialCommons.js"
import { KeychainEncryption } from "./KeychainEncryption.js"

View file

@ -1,4 +1,4 @@
import { KeyPermanentlyInvalidatedError } from "../../api/common/error/KeyPermanentlyInvalidatedError.js"
import { KeyPermanentlyInvalidatedError } from "../../common/api/common/error/KeyPermanentlyInvalidatedError.js"
import { assertSupportedEncryptionMode, DesktopCredentialsMode } from "./CredentialCommons.js"
import { DesktopKeyStoreFacade } from "../DesktopKeyStoreFacade.js"
import { AppPassHandler } from "./AppPassHandler.js"

View file

@ -1,13 +1,13 @@
import { log } from "../DesktopLog.js"
import { Database, default as Sqlite } from "better-sqlite3"
import fs from "node:fs"
import { OfflineDbClosedError } from "../../api/common/error/OfflineDbClosedError.js"
import { OfflineDbClosedError } from "../../common/api/common/error/OfflineDbClosedError.js"
import { CryptoError } from "@tutao/tutanota-crypto/error.js"
import { SqlValue } from "../../api/worker/offline/SqlValue.js"
import { PersistedCredentials } from "../../native/common/generatedipc/PersistedCredentials.js"
import { UntaggedQuery, usql } from "../../api/worker/offline/Sql.js"
import { CredentialType } from "../../misc/credentials/CredentialType.js"
import { CredentialEncryptionMode } from "../../misc/credentials/CredentialEncryptionMode.js"
import { SqlValue } from "../../common/api/worker/offline/SqlValue.js"
import { PersistedCredentials } from "../../common/native/common/generatedipc/PersistedCredentials.js"
import { UntaggedQuery, usql } from "../../common/api/worker/offline/Sql.js"
import { CredentialType } from "../../common/misc/credentials/CredentialType.js"
import { CredentialEncryptionMode } from "../../common/misc/credentials/CredentialEncryptionMode.js"
const TableDefinitions = Object.freeze({
credentials:

View file

@ -1,10 +1,10 @@
import { Database, default as Sqlite } from "better-sqlite3"
import { mapNullable, uint8ArrayToHex } from "@tutao/tutanota-utils"
import { CryptoError } from "@tutao/tutanota-crypto/error.js"
import { SqlCipherFacade } from "../../native/common/generatedipc/SqlCipherFacade.js"
import { OfflineDbClosedError } from "../../api/common/error/OfflineDbClosedError.js"
import { ProgrammingError } from "../../api/common/error/ProgrammingError.js"
import { TaggedSqlValue, tagSqlObject, untagSqlValue } from "../../api/worker/offline/SqlValue.js"
import { SqlCipherFacade } from "../../common/native/common/generatedipc/SqlCipherFacade.js"
import { OfflineDbClosedError } from "../../common/api/common/error/OfflineDbClosedError.js"
import { ProgrammingError } from "../../common/api/common/error/ProgrammingError.js"
import { TaggedSqlValue, tagSqlObject, untagSqlValue } from "../../common/api/worker/offline/SqlValue.js"
export class DesktopSqlCipher implements SqlCipherFacade {
private _db: Database | null = null

View file

@ -1,8 +1,8 @@
import { defer, DeferredObject, delay } from "@tutao/tutanota-utils"
import { SqlCipherFacade } from "../../native/common/generatedipc/SqlCipherFacade.js"
import { SqlCipherFacade } from "../../common/native/common/generatedipc/SqlCipherFacade.js"
import { log } from "../DesktopLog.js"
import { OfflineDbFactory } from "./PerWindowSqlCipherFacade.js"
import { ProgrammingError } from "../../api/common/error/ProgrammingError.js"
import { ProgrammingError } from "../../common/api/common/error/ProgrammingError.js"
const TAG = "[OfflineDbRefCounter]"
const MAX_WAIT_FOR_DB_CLOSE_MS = 1000

View file

@ -1,8 +1,8 @@
import { SqlCipherFacade } from "../../native/common/generatedipc/SqlCipherFacade.js"
import { TaggedSqlValue } from "../../api/worker/offline/SqlValue.js"
import { ProgrammingError } from "../../api/common/error/ProgrammingError.js"
import { SqlCipherFacade } from "../../common/native/common/generatedipc/SqlCipherFacade.js"
import { TaggedSqlValue } from "../../common/api/worker/offline/SqlValue.js"
import { ProgrammingError } from "../../common/api/common/error/ProgrammingError.js"
import { log } from "../DesktopLog.js"
import { OfflineDbClosedError } from "../../api/common/error/OfflineDbClosedError.js"
import { OfflineDbClosedError } from "../../common/api/common/error/OfflineDbClosedError.js"
import { OfflineDbRefCounter } from "./OfflineDbRefCounter.js"
const TAG = "[PerWindowSqlCipherFacade]"

View file

@ -1,10 +1,10 @@
import { SqlCipherFacade } from "../../native/common/generatedipc/SqlCipherFacade.js"
import { TaggedSqlValue } from "../../api/worker/offline/SqlValue.js"
import { SqlCipherFacade } from "../../common/native/common/generatedipc/SqlCipherFacade.js"
import { TaggedSqlValue } from "../../common/api/worker/offline/SqlValue.js"
import { Worker } from "node:worker_threads"
import path from "node:path"
import { MessageDispatcher, Request } from "../../api/common/threading/MessageDispatcher.js"
import { MessageDispatcher, Request } from "../../common/api/common/threading/MessageDispatcher.js"
import { SqlCipherCommandNames, WorkerLogCommandNames } from "../sqlworker.js"
import { NodeWorkerTransport } from "../../api/common/threading/NodeWorkerTransport.js"
import { NodeWorkerTransport } from "../../common/api/common/threading/NodeWorkerTransport.js"
const TAG = "[WorkerSqlCipher]"

View file

@ -1,10 +1,10 @@
import { FileFacade } from "../../native/common/generatedipc/FileFacade.js"
import { DownloadTaskResponse } from "../../native/common/generatedipc/DownloadTaskResponse.js"
import { IpcClientRect } from "../../native/common/generatedipc/IpcClientRect.js"
import { FileFacade } from "../../common/native/common/generatedipc/FileFacade.js"
import { DownloadTaskResponse } from "../../common/native/common/generatedipc/DownloadTaskResponse.js"
import { IpcClientRect } from "../../common/native/common/generatedipc/IpcClientRect.js"
import { ElectronExports, FsExports } from "../ElectronExportTypes.js"
import { UploadTaskResponse } from "../../native/common/generatedipc/UploadTaskResponse.js"
import { DataFile } from "../../api/common/DataFile.js"
import { FileUri } from "../../native/common/FileApp.js"
import { UploadTaskResponse } from "../../common/native/common/generatedipc/UploadTaskResponse.js"
import { DataFile } from "../../common/api/common/DataFile.js"
import { FileUri } from "../../common/native/common/FileApp.js"
import path from "node:path"
import { ApplicationWindow } from "../ApplicationWindow.js"
import { sha256Hash } from "@tutao/tutanota-crypto"
@ -14,16 +14,16 @@ import url from "node:url"
import FsModule from "node:fs"
import { Buffer } from "node:buffer"
import type * as stream from "node:stream"
import { FileOpenError } from "../../api/common/error/FileOpenError.js"
import { lang } from "../../misc/LanguageViewModel.js"
import { FileOpenError } from "../../common/api/common/error/FileOpenError.js"
import { lang } from "../../common/misc/LanguageViewModel.js"
import http from "node:http"
import { log } from "../DesktopLog.js"
import type { DesktopNetworkClient } from "../net/DesktopNetworkClient.js"
import { WriteStream } from "fs-extra"
import { BuildConfigKey, DesktopConfigKey } from "../config/ConfigKeys.js"
import { CancelledError } from "../../api/common/error/CancelledError.js"
import { CancelledError } from "../../common/api/common/error/CancelledError.js"
import { DesktopConfig } from "../config/DesktopConfig.js"
import { DateProvider } from "../../api/common/DateProvider.js"
import { DateProvider } from "../../common/api/common/DateProvider.js"
import { TempFs } from "./TempFs.js"
import OpenDialogOptions = Electron.OpenDialogOptions

View file

@ -1,6 +1,6 @@
import type { MenuItemConstructorOptions } from "electron"
import type { WindowManager } from "../DesktopWindowManager"
import { lang } from "../../misc/LanguageViewModel"
import { lang } from "../../common/misc/LanguageViewModel"
import type { DesktopIntegrator } from "./DesktopIntegrator"
import { ElectronExports } from "../ElectronExportTypes"

View file

@ -1,5 +1,5 @@
import path from "node:path"
import { lang } from "../../misc/LanguageViewModel"
import { lang } from "../../common/misc/LanguageViewModel"
import type { WindowManager } from "../DesktopWindowManager"
import { log } from "../DesktopLog"
import type { DesktopIntegrator } from "./DesktopIntegrator"

View file

@ -1,4 +1,4 @@
import { InterWindowEventFacade } from "../../native/common/generatedipc/InterWindowEventFacade.js"
import { InterWindowEventFacade } from "../../common/native/common/generatedipc/InterWindowEventFacade.js"
import { ApplicationWindow } from "../ApplicationWindow.js"
import { WindowManager } from "../DesktopWindowManager.js"

View file

@ -1,5 +1,5 @@
import type { Message } from "../../api/common/threading/MessageDispatcher.js"
import type { Transport } from "../../api/common/threading/Transport.js"
import type { Message } from "../../common/api/common/threading/MessageDispatcher.js"
import type { Transport } from "../../common/api/common/threading/Transport.js"
import type { WebContents } from "electron"
export interface IpcConfig<RenderToMainEvent extends string, MainToRenderEvent extends string> {

View file

@ -1,13 +1,13 @@
import { DesktopFacade } from "../../native/common/generatedipc/DesktopFacade.js"
import { CommonNativeFacade } from "../../native/common/generatedipc/CommonNativeFacade.js"
import { DesktopFacade } from "../../common/native/common/generatedipc/DesktopFacade.js"
import { CommonNativeFacade } from "../../common/native/common/generatedipc/CommonNativeFacade.js"
import { ApplicationWindow } from "../ApplicationWindow.js"
import { ElectronWebContentsTransport, IpcConfig } from "./ElectronWebContentsTransport.js"
import { DesktopGlobalDispatcher } from "../../native/common/generatedipc/DesktopGlobalDispatcher.js"
import { MessageDispatcher, Request } from "../../api/common/threading/MessageDispatcher.js"
import { DesktopFacadeSendDispatcher } from "../../native/common/generatedipc/DesktopFacadeSendDispatcher.js"
import { CommonNativeFacadeSendDispatcher } from "../../native/common/generatedipc/CommonNativeFacadeSendDispatcher.js"
import { DesktopGlobalDispatcher } from "../../common/native/common/generatedipc/DesktopGlobalDispatcher.js"
import { MessageDispatcher, Request } from "../../common/api/common/threading/MessageDispatcher.js"
import { DesktopFacadeSendDispatcher } from "../../common/native/common/generatedipc/DesktopFacadeSendDispatcher.js"
import { CommonNativeFacadeSendDispatcher } from "../../common/native/common/generatedipc/CommonNativeFacadeSendDispatcher.js"
import { DesktopCommonSystemFacade } from "../DesktopCommonSystemFacade.js"
import { InterWindowEventFacadeSendDispatcher } from "../../native/common/generatedipc/InterWindowEventFacadeSendDispatcher.js"
import { InterWindowEventFacadeSendDispatcher } from "../../common/native/common/generatedipc/InterWindowEventFacadeSendDispatcher.js"
import { PerWindowSqlCipherFacade } from "../db/PerWindowSqlCipherFacade.js"
export interface SendingFacades {

View file

@ -1,6 +1,6 @@
import http from "node:http"
import https from "node:https"
import { ConnectionError } from "../../api/common/error/RestError.js"
import { ConnectionError } from "../../common/api/common/error/RestError.js"
import { log } from "../DesktopLog.js"
import type { ReadStream } from "node:fs"

View file

@ -2,7 +2,7 @@ import path from "node:path"
import fs from "node:fs"
import { log } from "../DesktopLog.js"
import { Session } from "electron"
import { errorToObj } from "../../api/common/threading/MessageDispatcher.js"
import { errorToObj } from "../../common/api/common/threading/MessageDispatcher.js"
import { lazyMemoized } from "@tutao/tutanota-utils"
import { getMimeTypeForFile } from "../files/DesktopFileFacade.js"
import { Agent, fetch, RequestInfo as UndiciRequestInfo, RequestInit as UndiciRequestInit } from "undici"

View file

@ -13,9 +13,9 @@
* */
import { parentPort, workerData } from "node:worker_threads"
import { DesktopSqlCipher } from "./db/DesktopSqlCipher.js"
import { Command, MessageDispatcher, Request } from "../api/common/threading/MessageDispatcher.js"
import { SqlCipherFacade } from "../native/common/generatedipc/SqlCipherFacade.js"
import { NodeWorkerTransport } from "../api/common/threading/NodeWorkerTransport.js"
import { Command, MessageDispatcher, Request } from "../common/api/common/threading/MessageDispatcher.js"
import { SqlCipherFacade } from "../common/native/common/generatedipc/SqlCipherFacade.js"
import { NodeWorkerTransport } from "../common/api/common/threading/NodeWorkerTransport.js"
/** make this generic over all possible facades? The generic parameter needs some constraint to not expand this to any */
export type SqlCipherCommandNames = keyof SqlCipherFacade

View file

@ -1,16 +1,16 @@
import { OperationType } from "../../api/common/TutanotaConstants"
import type { AlarmNotification } from "../../api/entities/sys/TypeRefs.js"
import { AlarmNotificationTypeRef } from "../../api/entities/sys/TypeRefs.js"
import { OperationType } from "../../common/api/common/TutanotaConstants"
import type { AlarmNotification } from "../../common/api/entities/sys/TypeRefs.js"
import { AlarmNotificationTypeRef } from "../../common/api/entities/sys/TypeRefs.js"
import type { DesktopNotifier } from "../DesktopNotifier"
import { NotificationResult } from "../DesktopNotifier"
import type { WindowManager } from "../DesktopWindowManager"
import type { DesktopAlarmStorage } from "./DesktopAlarmStorage"
import type { DesktopNativeCryptoFacade } from "../DesktopNativeCryptoFacade"
import { log } from "../DesktopLog"
import type { AlarmScheduler } from "../../calendar/date/AlarmScheduler.js"
import { elementIdPart } from "../../api/common/utils/EntityUtils"
import { resolveTypeReference } from "../../api/common/EntityFunctions"
import { EncryptedAlarmNotification } from "../../native/common/EncryptedAlarmNotification.js"
import type { AlarmScheduler } from "../../calendar-app/calendar/date/AlarmScheduler.js"
import { elementIdPart } from "../../common/api/common/utils/EntityUtils"
import { resolveTypeReference } from "../../common/api/common/EntityFunctions"
import { EncryptedAlarmNotification } from "../../common/native/common/EncryptedAlarmNotification.js"
import { base64ToUint8Array } from "@tutao/tutanota-utils"
import { CryptoError } from "@tutao/tutanota-crypto/error.js"
import { formatNotificationForDisplay } from "../../../calendar-app/calendar/model/CalendarModel.js"

View file

@ -1,12 +1,12 @@
import type { DesktopConfig } from "../config/DesktopConfig"
import { DesktopNativeCryptoFacade } from "../DesktopNativeCryptoFacade"
import { elementIdPart } from "../../api/common/utils/EntityUtils"
import { elementIdPart } from "../../common/api/common/utils/EntityUtils"
import { DesktopConfigKey } from "../config/ConfigKeys"
import type { DesktopKeyStoreFacade } from "../DesktopKeyStoreFacade.js"
import type { Base64 } from "@tutao/tutanota-utils"
import { base64ToUint8Array, findAllAndRemove, uint8ArrayToBase64 } from "@tutao/tutanota-utils"
import { log } from "../DesktopLog"
import { EncryptedAlarmNotification, NotificationSessionKey } from "../../native/common/EncryptedAlarmNotification.js"
import { EncryptedAlarmNotification, NotificationSessionKey } from "../../common/native/common/EncryptedAlarmNotification.js"
/**
* manages session keys used for decrypting alarm notifications, encrypting & persisting them to disk

View file

@ -1,8 +1,8 @@
import { NativePushFacade } from "../../native/common/generatedipc/NativePushFacade.js"
import { EncryptedAlarmNotification } from "../../native/common/EncryptedAlarmNotification.js"
import { NativePushFacade } from "../../common/native/common/generatedipc/NativePushFacade.js"
import { EncryptedAlarmNotification } from "../../common/native/common/EncryptedAlarmNotification.js"
import { NativeAlarmScheduler } from "./DesktopAlarmScheduler.js"
import { DesktopAlarmStorage } from "./DesktopAlarmStorage.js"
import { ExtendedNotificationMode } from "../../native/common/generatedipc/ExtendedNotificationMode.js"
import { ExtendedNotificationMode } from "../../common/native/common/generatedipc/ExtendedNotificationMode.js"
import { SseStorage } from "./SseStorage.js"
import { TutaSseFacade } from "./TutaSseFacade.js"

View file

@ -1,6 +1,6 @@
import * as PathModule from "node:path"
import * as FsModule from "node:fs"
import { DeviceStorageUnavailableError } from "../../api/common/error/DeviceStorageUnavailableError.js"
import { DeviceStorageUnavailableError } from "../../common/api/common/error/DeviceStorageUnavailableError.js"
export function preselectGnomeLibsecret(electron: typeof Electron.CrossProcessExports) {
// this is how chromium selects a backend:

View file

@ -1,9 +1,9 @@
import http from "node:http"
import type { DesktopNetworkClient } from "../net/DesktopNetworkClient"
import { makeTaggedLogger } from "../DesktopLog"
import { Scheduler } from "../../api/common/utils/Scheduler.js"
import { ProgrammingError } from "../../api/common/error/ProgrammingError.js"
import { reverse } from "../../api/common/TutanotaConstants.js"
import { Scheduler } from "../../common/api/common/utils/Scheduler.js"
import { ProgrammingError } from "../../common/api/common/error/ProgrammingError.js"
import { reverse } from "../../common/api/common/TutanotaConstants.js"
const log = makeTaggedLogger("[SSE]")

View file

@ -2,7 +2,7 @@ import { DesktopConfig } from "../config/DesktopConfig.js"
import { DesktopConfigEncKey, DesktopConfigKey } from "../config/ConfigKeys.js"
import { remove } from "@tutao/tutanota-utils"
import { SseInfo } from "./SseInfo.js"
import { ExtendedNotificationMode } from "../../native/common/generatedipc/ExtendedNotificationMode.js"
import { ExtendedNotificationMode } from "../../common/native/common/generatedipc/ExtendedNotificationMode.js"
const DEFAULT_EXTENDED_NOTIFICATION_MODE = ExtendedNotificationMode.NoSenderOrSubject

View file

@ -1,5 +1,5 @@
import { fetch, RequestInfo, RequestInit, Response } from "undici"
import { ServiceUnavailableError, TooManyRequestsError } from "../../api/common/error/RestError.js"
import { ServiceUnavailableError, TooManyRequestsError } from "../../common/api/common/error/RestError.js"
import { filterInt } from "@tutao/tutanota-utils"
import { log } from "../DesktopLog.js"

View file

@ -1,17 +1,17 @@
import type { WindowManager } from "../DesktopWindowManager"
import { NativeCredentialsFacade } from "../../native/common/generatedipc/NativeCredentialsFacade"
import { NativeCredentialsFacade } from "../../common/native/common/generatedipc/NativeCredentialsFacade"
import { DesktopNotifier, NotificationResult } from "../DesktopNotifier"
import { LanguageViewModel } from "../../misc/LanguageViewModel"
import { LanguageViewModel } from "../../common/misc/LanguageViewModel"
import { Agent, fetch as undiciFetch } from "undici"
import { IdTupleWrapper, NotificationInfo } from "../../api/entities/sys/TypeRefs"
import { CredentialEncryptionMode } from "../../misc/credentials/CredentialEncryptionMode.js"
import { ExtendedNotificationMode } from "../../native/common/generatedipc/ExtendedNotificationMode"
import { IdTupleWrapper, NotificationInfo } from "../../common/api/entities/sys/TypeRefs"
import { CredentialEncryptionMode } from "../../common/misc/credentials/CredentialEncryptionMode.js"
import { ExtendedNotificationMode } from "../../common/native/common/generatedipc/ExtendedNotificationMode"
import { assertNotNull, base64ToBase64Url, neverNull } from "@tutao/tutanota-utils"
import { log } from "../DesktopLog"
import tutanotaModelInfo from "../../api/entities/tutanota/ModelInfo"
import { handleRestError } from "../../api/common/error/RestError"
import { EncryptedAlarmNotification } from "../../native/common/EncryptedAlarmNotification"
import { Mail } from "../../api/entities/tutanota/TypeRefs.js"
import tutanotaModelInfo from "../../common/api/entities/tutanota/ModelInfo"
import { handleRestError } from "../../common/api/common/error/RestError"
import { EncryptedAlarmNotification } from "../../common/native/common/EncryptedAlarmNotification"
import { Mail } from "../../common/api/entities/tutanota/TypeRefs.js"
import { NativeAlarmScheduler } from "./DesktopAlarmScheduler.js"
import { DesktopAlarmStorage } from "./DesktopAlarmStorage.js"
import { SseInfo } from "./SseInfo.js"

View file

@ -3,13 +3,13 @@ import { TutaNotificationHandler } from "./TutaNotificationHandler.js"
import { DesktopNativeCryptoFacade } from "../DesktopNativeCryptoFacade.js"
import { Agent, fetch as undiciFetch } from "undici"
import { makeTaggedLogger } from "../DesktopLog.js"
import { typeModels } from "../../api/entities/sys/TypeModels.js"
import { typeModels } from "../../common/api/entities/sys/TypeModels.js"
import { assertNotNull, base64ToBase64Url, filterInt, neverNull, stringToUtf8Uint8Array, uint8ArrayToBase64 } from "@tutao/tutanota-utils"
import { handleRestError } from "../../api/common/error/RestError.js"
import { MissedNotification } from "../../api/entities/sys/TypeRefs.js"
import { EncryptedAlarmNotification } from "../../native/common/EncryptedAlarmNotification.js"
import { handleRestError } from "../../common/api/common/error/RestError.js"
import { MissedNotification } from "../../common/api/entities/sys/TypeRefs.js"
import { EncryptedAlarmNotification } from "../../common/native/common/EncryptedAlarmNotification.js"
import { SseStorage } from "./SseStorage.js"
import { DateProvider } from "../../api/common/DateProvider.js"
import { DateProvider } from "../../common/api/common/DateProvider.js"
import { SseInfo } from "./SseInfo.js"
const log = makeTaggedLogger("[SSEFacade]")

View file

@ -3,7 +3,7 @@ import { app, Menu, MenuItem, nativeImage, Tray } from "electron"
import type { DesktopConfig } from "../config/DesktopConfig"
import type { WindowManager } from "../DesktopWindowManager"
import type { DesktopNotifier } from "../DesktopNotifier"
import { lang } from "../../misc/LanguageViewModel"
import { lang } from "../../common/misc/LanguageViewModel"
import { MacTray } from "./MacTray"
import { NonMacTray } from "./NonMacTray"
import { BuildConfigKey, DesktopConfigKey } from "../config/ConfigKeys"

View file

@ -1,7 +1,7 @@
import type { NativeImage } from "electron"
import { app, Menu, MenuItem, Tray } from "electron"
import type { WindowManager } from "../DesktopWindowManager"
import { lang } from "../../misc/LanguageViewModel"
import { lang } from "../../common/misc/LanguageViewModel"
import type { PlatformTray } from "./DesktopTray"
import { getResourcePath } from "../resources"

View file

@ -1,6 +1,11 @@
import m, { Children, Component, Vnode } from "mithril"
<<<<<<<< HEAD:src/common/gui/MobileActionBar.ts
import { IconButton, IconButtonAttrs } from "./base/IconButton.js"
import { ClickHandler } from "./base/GuiUtils.js"
========
import { IconButton, IconButtonAttrs } from "../../../common/gui/base/IconButton.js"
import { ClickHandler } from "../../../common/gui/base/GuiUtils.js"
>>>>>>>> 3349a964d (Move files to new folder structure):src/mail-app/contacts/view/MobileActionBar.ts
export interface MobileActionAttrs {
icon: IconButtonAttrs["icon"]

View file

View file

@ -246,7 +246,7 @@ export class PostLoginActions implements PostLoginAction {
private async enforcePasswordChange(): Promise<void> {
if (this.logins.getUserController().user.requirePasswordUpdate) {
const { showChangeOwnPasswordDialog } = await import("../settings/login/ChangePasswordDialogs.js")
const { showChangeOwnPasswordDialog } = await import("../../mail-app/settings/login/ChangePasswordDialogs.js")
await showChangeOwnPasswordDialog(false)
}

View file

@ -6,7 +6,7 @@ import { showProgressDialog } from "../../gui/dialogs/ProgressDialog"
import { isMailAddress } from "../../misc/FormatValidator.js"
import { Autocomplete, TextField, TextFieldType } from "../../gui/base/TextField.js"
import { lang } from "../../misc/LanguageViewModel.js"
import { PasswordForm, PasswordModel } from "../../settings/PasswordForm.js"
import { PasswordForm, PasswordModel } from "../../../mail-app/settings/PasswordForm.js"
import { Icons } from "../../gui/base/icons/Icons"
import { Dialog, DialogType } from "../../gui/base/Dialog"
import { HtmlEditor, HtmlEditorMode } from "../../gui/editor/HtmlEditor"

View file

@ -1,42 +1,43 @@
import { assertMainOrNode, isDesktop } from "../api/common/Env.js"
import { CustomerPropertiesTypeRef, GroupInfo, User } from "../api/entities/sys/TypeRefs.js"
import {
Contact,
createContact,
createContactMailAddress,
createEncryptedMailAddress,
EncryptedMailAddress, Header, InboxRule,
Mail,
MailFolder, TutanotaProperties, MailDetails
} from "../api/entities/tutanota/TypeRefs"
EncryptedMailAddress, InboxRule,
Mail, MailDetails,
MailFolder, TutanotaProperties,
Header
} from "../api/entities/tutanota/TypeRefs.js"
import { fullNameToFirstAndLastName, mailAddressToFirstAndLastName } from "../misc/parsing/MailAddressParser.js"
import { assertNotNull, contains, first, neverNull } from "@tutao/tutanota-utils"
import {
ContactAddressType,
ConversationType,
EncryptionAuthStatus,
ConversationType, EncryptionAuthStatus,
getMailFolderType,
GroupType,
MailFolderType,
MailState, MAX_ATTACHMENT_SIZE,
ReplyType, TUTANOTA_MAIL_ADDRESS_DOMAINS
MailState,
MAX_ATTACHMENT_SIZE, ReplyType, TUTANOTA_MAIL_ADDRESS_DOMAINS
} from "../api/common/TutanotaConstants.js"
import { fullNameToFirstAndLastName, mailAddressToFirstAndLastName } from "../misc/parsing/MailAddressParser.js"
import { CustomerPropertiesTypeRef, GroupInfo, User } from "../api/entities/sys/TypeRefs.js"
import { assertNotNull, contains, first, neverNull } from "@tutao/tutanota-utils"
import { assertMainOrNode, isDesktop } from "../api/common/Env.js"
import { getEnabledMailAddressesForGroupInfo, getGroupInfoDisplayName } from "../api/common/utils/GroupUtils.js"
import { isDraft, isSystemNotification } from "../../mail-app/mail/MailUtils.js"
import { UserController } from "../api/main/UserController.js"
import { getEnabledMailAddressesForGroupInfo, getGroupInfoDisplayName } from "../api/common/utils/GroupUtils.js"
import { lang, Language, TranslationKey } from "../misc/LanguageViewModel.js"
import { AllIcons } from "../gui/base/Icon.js"
import { Icons } from "../gui/base/icons/Icons.js"
import { MailboxDetail, MailModel } from "./MailModel.js"
import { LoginController } from "../api/main/LoginController.js"
import { EntityClient } from "../api/common/EntityClient.js"
import { Attachment } from "./SendMailModel.js"
import { FolderSystem } from "../api/common/mail/FolderSystem.js"
import { getListId } from "../api/common/utils/EntityUtils.js"
import { FolderSystem } from "../api/common/mail/FolderSystem.js"
import { MailFacade } from "../api/worker/facades/lazy/MailFacade.js"
import { ListFilter } from "../misc/ListModel.js"
import { FontIcons } from "../gui/base/icons/FontIcons.js"
import { ProgrammingError } from "../api/common/error/ProgrammingError.js"
import { ListFilter } from "../misc/ListModel.js"
import { isDraft, isSystemNotification } from "../../mail-app/mail/MailUtils.js"
import { Attachment } from "./SendMailModel.js"
assertMainOrNode()
export const LINE_BREAK = "<br>"

View file

@ -1,27 +1,3 @@
import m from "mithril"
import stream from "mithril/stream"
import Stream from "mithril/stream"
import { assertNotNull, groupBy, lazyMemoized, neverNull, noOp, ofClass, promiseMap, splitInChunks } from "@tutao/tutanota-utils"
import type { Group, GroupInfo, GroupMembership, WebsocketCounterData } from "../api/entities/sys/TypeRefs.js"
import { GroupInfoTypeRef, GroupTypeRef } from "../api/entities/sys/TypeRefs.js"
import type { MailReportType } from "../api/common/TutanotaConstants.js"
import { FeatureType, MailFolderType, MAX_NBR_MOVE_DELETE_MAIL_SERVICE, OperationType, ReportMovedMailsType } from "../api/common/TutanotaConstants.js"
import { EventController } from "../api/main/EventController.js"
import { lang } from "../misc/LanguageViewModel.js"
import { Notifications, NotificationType } from "../gui/Notifications.js"
import { EntityClient } from "../api/common/EntityClient.js"
import { elementIdPart, GENERATED_MAX_ID, getElementId, getListId, isSameId, listIdPart } from "../api/common/utils/EntityUtils.js"
import { LockedError, NotFoundError, PreconditionFailedError } from "../api/common/error/RestError.js"
import type { MailFacade } from "../api/worker/facades/lazy/MailFacade.js"
import { LoginController } from "../api/main/LoginController.js"
import { ProgrammingError } from "../api/common/error/ProgrammingError.js"
import { FolderSystem } from "../api/common/mail/FolderSystem.js"
import { UserError } from "../api/main/UserError.js"
import { containsEventOfType, EntityUpdateData, isUpdateForTypeRef } from "../api/common/utils/EntityUpdateUtils.js"
import { assertSystemFolderOfType, getEnabledMailAddressesWithUser, isSpamOrTrashFolder } from "./CommonMailUtils.js"
import { WebsocketConnectivityModel } from "../misc/WebsocketConnectivityModel.js"
import { InboxRuleHandler } from "../../mail-app/mail/model/InboxRuleHandler.js"
import {
createMailAddressProperties,
createMailboxProperties,
@ -34,6 +10,35 @@ import {
MailFolder,
MailFolderTypeRef, MailTypeRef
} from "../api/entities/tutanota/TypeRefs.js"
import { FolderSystem } from "../api/common/mail/FolderSystem.js"
import { Group, GroupInfo, GroupInfoTypeRef, GroupMembership, GroupTypeRef, WebsocketCounterData } from "../api/entities/sys/TypeRefs.js"
import Stream from "mithril/stream"
import stream from "mithril/stream"
import { Notifications, NotificationType } from "../gui/Notifications.js"
import { EventController } from "../api/main/EventController.js"
import { MailFacade } from "../api/worker/facades/lazy/MailFacade.js"
import { EntityClient } from "../api/common/EntityClient.js"
import { LoginController } from "../api/main/LoginController.js"
import { WebsocketConnectivityModel } from "../misc/WebsocketConnectivityModel.js"
import { InboxRuleHandler } from "../../mail-app/mail/model/InboxRuleHandler.js"
import { assertNotNull, groupBy, lazyMemoized, neverNull, noOp, ofClass, promiseMap, splitInChunks } from "@tutao/tutanota-utils"
import {
FeatureType,
MailFolderType,
MailReportType,
MAX_NBR_MOVE_DELETE_MAIL_SERVICE,
OperationType,
ReportMovedMailsType
} from "../api/common/TutanotaConstants.js"
import { assertSystemFolderOfType, getEnabledMailAddressesWithUser, isSpamOrTrashFolder } from "./CommonMailUtils.js"
import { LockedError, NotFoundError, PreconditionFailedError } from "../api/common/error/RestError.js"
import { elementIdPart, GENERATED_MAX_ID, getElementId, getListId, isSameId, listIdPart } from "../api/common/utils/EntityUtils.js"
import { containsEventOfType, EntityUpdateData, isUpdateForTypeRef } from "../api/common/utils/EntityUpdateUtils.js"
import m from "mithril"
import { lang } from "../misc/LanguageViewModel.js"
import { ProgrammingError } from "../api/common/error/ProgrammingError.js"
import { UserError } from "../api/main/UserError.js"
export type MailboxDetail = {
mailbox: MailBox

View file

View file

View file

@ -33,6 +33,7 @@ import { OfflineDbClosedError } from "../api/common/error/OfflineDbClosedError.j
import { UserTypeRef } from "../api/entities/sys/TypeRefs.js"
import { isOfflineError } from "../api/common/utils/ErrorUtils.js"
import { showRequestPasswordDialog } from "./passwords/PasswordRequestDialog.js"
import { SearchModel } from "../../mail-app/search/model/SearchModel.js"
assertMainOrNode()
@ -123,7 +124,9 @@ export async function handleUncaughtErrorImpl(e: Error) {
}
} else if (e instanceof IndexingNotSupportedError) {
console.log("Indexing not supported", e)
if (search instanceof SearchModel) {
search.indexingSupported = false
}
} else if (e instanceof QuotaExceededError) {
if (!shownQuotaError) {
shownQuotaError = true

View file

@ -21,7 +21,7 @@ import { RecoverCodeFacade } from "../../../api/worker/facades/lazy/RecoverCodeF
export class RecoveryCodeNews implements NewsListItem {
private recoveryCode: string | null = null
private readonly recoverCodeField = new LazyLoaded(async () => {
const { RecoverCodeField } = await import("../../../settings/login/RecoverCodeDialog.js")
const { RecoverCodeField } = await import("../../../../mail-app/settings/login/RecoverCodeDialog.js")
m.redraw()
return RecoverCodeField
})

View file

@ -1,7 +1,12 @@
<<<<<<<< HEAD:src/common/search/view/SearchRouter.ts
import { SearchRestriction } from "../../api/worker/search/SearchTypes.js"
import { getRestriction, getSearchUrl } from "../../../mail-app/search/model/SearchUtils.js"
========
import { SearchRestriction } from "../../../common/api/worker/search/SearchTypes.js"
import { getRestriction, getSearchUrl } from "../model/SearchUtils.js"
>>>>>>>> 3349a964d (Move files to new folder structure):src/mail-app/search/view/SearchRouter.ts
import m from "mithril"
import { Router } from "../../gui/ScopedRouter.js"
import { Router } from "../../../common/gui/ScopedRouter.js"
import { memoizedWithHiddenArgument } from "@tutao/tutanota-utils"
export type SearchSelection = {

View file

@ -1,4 +1,5 @@
import m, { Children } from "mithril"
<<<<<<<< HEAD:src/common/settings/AppearanceSettingsViewer.ts
import type { LanguageCode } from "../misc/LanguageViewModel.js"
import { getLanguage, lang, languageCodeToTag, languages } from "../misc/LanguageViewModel.js"
import { styles } from "../gui/styles.js"
@ -13,6 +14,22 @@ import { ThemeId, themeOptions, ThemePreference } from "../../common/gui/theme"
import type { UpdatableSettingsViewer } from "./Interfaces.js"
import { isDesktop } from "../../common/api/common/Env"
import { locator } from "../../common/api/main/CommonLocator"
========
import type { LanguageCode } from "../../common/misc/LanguageViewModel"
import { getLanguage, lang, languageCodeToTag, languages } from "../../common/misc/LanguageViewModel"
import { styles } from "../../common/gui/styles"
import type { DropDownSelectorAttrs } from "../../common/gui/base/DropDownSelector.js"
import { DropDownSelector, SelectorItemList } from "../../common/gui/base/DropDownSelector.js"
import { deviceConfig } from "../../common/misc/DeviceConfig"
import { TimeFormat, WeekStart } from "../../common/api/common/TutanotaConstants"
import { downcast, incrementDate, noOp, promiseMap } from "@tutao/tutanota-utils"
import { UserSettingsGroupRootTypeRef } from "../../common/api/entities/tutanota/TypeRefs.js"
import { getHourCycle } from "../../common/misc/Formatter"
import { themeController, ThemeId, themeOptions, ThemePreference } from "../../common/gui/theme"
import type { UpdatableSettingsViewer } from "./SettingsView"
import { isDesktop } from "../../common/api/common/Env"
import { locator } from "../../common/api/main/MainLocator"
>>>>>>>> 3349a964d (Move files to new folder structure):src/mail-app/settings/AppearanceSettingsViewer.ts
import { EntityUpdateData, isUpdateForTypeRef } from "../../common/api/common/utils/EntityUpdateUtils.js"
export class AppearanceSettingsViewer implements UpdatableSettingsViewer {

View file

@ -1,3 +1,4 @@
<<<<<<<< HEAD:src/common/settings/EditNotificationEmailDialog.ts
import type { Booking, CustomerInfo, CustomerProperties, NotificationMailTemplate } from "../api/entities/sys/TypeRefs.js"
import { BookingTypeRef, createNotificationMailTemplate, CustomerInfoTypeRef, CustomerPropertiesTypeRef } from "../api/entities/sys/TypeRefs.js"
import { HtmlEditor } from "../gui/editor/HtmlEditor.js"
@ -10,17 +11,39 @@ import type { SelectorItemList } from "../gui/base/DropDownSelector.js"
import { DropDownSelector } from "../gui/base/DropDownSelector.js"
import { TextField } from "../gui/base/TextField.js"
import { showProgressDialog } from "../gui/dialogs/ProgressDialog.js"
========
import type { Booking, CustomerInfo, CustomerProperties, NotificationMailTemplate } from "../../common/api/entities/sys/TypeRefs.js"
import { BookingTypeRef, createNotificationMailTemplate, CustomerInfoTypeRef, CustomerPropertiesTypeRef } from "../../common/api/entities/sys/TypeRefs.js"
import { HtmlEditor } from "../../common/gui/editor/HtmlEditor"
import { InfoLink, lang, languages } from "../../common/misc/LanguageViewModel"
import stream from "mithril/stream"
import Stream from "mithril/stream"
import { Dialog, DialogType } from "../../common/gui/base/Dialog"
import m from "mithril"
import type { SelectorItemList } from "../../common/gui/base/DropDownSelector.js"
import { DropDownSelector } from "../../common/gui/base/DropDownSelector.js"
import { TextField } from "../../common/gui/base/TextField.js"
import { showProgressDialog } from "../../common/gui/dialogs/ProgressDialog"
>>>>>>>> 3349a964d (Move files to new folder structure):src/mail-app/settings/EditNotificationEmailDialog.ts
import { assertNotNull, LazyLoaded, memoized, neverNull, ofClass } from "@tutao/tutanota-utils"
import { htmlSanitizer } from "../../common/misc/HtmlSanitizer"
import { PayloadTooLargeError } from "../../common/api/common/error/RestError"
import { SegmentControl } from "../../common/gui/base/SegmentControl"
<<<<<<<< HEAD:src/common/settings/EditNotificationEmailDialog.ts
import { insertInlineImageB64ClickHandler } from "../../mail-app/mail/view/MailViewerUtils"
========
import { insertInlineImageB64ClickHandler } from "../mail/view/MailViewerUtils"
>>>>>>>> 3349a964d (Move files to new folder structure):src/mail-app/settings/EditNotificationEmailDialog.ts
import { UserError } from "../../common/api/main/UserError"
import { showNotAvailableForFreeDialog, showPlanUpgradeRequiredDialog } from "../../common/misc/SubscriptionDialogs"
import { getAvailablePlansWithWhitelabel, isWhitelabelActive } from "../../common/subscription/SubscriptionUtils"
import type { UserController } from "../../common/api/main/UserController"
import { GENERATED_MAX_ID } from "../../common/api/common/utils/EntityUtils"
<<<<<<<< HEAD:src/common/settings/EditNotificationEmailDialog.ts
import { locator } from "../../common/api/main/CommonLocator"
========
import { locator } from "../../common/api/main/MainLocator"
>>>>>>>> 3349a964d (Move files to new folder structure):src/mail-app/settings/EditNotificationEmailDialog.ts
import { PlanType } from "../../common/api/common/TutanotaConstants.js"
import { getWhitelabelDomainInfo } from "../../common/api/common/utils/CustomerUtils.js"

View file

@ -1,9 +1,16 @@
import m, { Children, Component, Vnode } from "mithril"
import stream from "mithril/stream"
<<<<<<<< HEAD:src/common/settings/ExpandableTable.ts
import type { InfoLink, TranslationKey } from "../misc/LanguageViewModel.js"
import type { TableAttrs } from "../gui/base/Table.js"
import { Table } from "../gui/base/Table.js"
import { SettingsExpander } from "./SettingsExpander.js"
========
import type { InfoLink, TranslationKey } from "../../common/misc/LanguageViewModel"
import type { TableAttrs } from "../../common/gui/base/Table.js"
import { Table } from "../../common/gui/base/Table.js"
import { SettingsExpander } from "./SettingsExpander"
>>>>>>>> 3349a964d (Move files to new folder structure):src/mail-app/settings/ExpandableTable.ts
import type { lazy } from "@tutao/tutanota-utils"
import Stream from "mithril/stream"

View file

@ -22,3 +22,8 @@ export interface SettingsViewAttrs extends TopLevelAttrs {
header: AppHeaderAttrs
logins: LoginController
}
export enum AppType {
Mail,
Calendar,
}

View file

@ -1,4 +1,5 @@
import m, { Children, Component, Vnode } from "mithril"
<<<<<<<< HEAD:src/common/settings/PasswordForm.ts
import { Autocomplete } from "../gui/base/TextField.js"
import { getPasswordStrength, isSecurePassword } from "../misc/passwords/PasswordUtils.js"
import type { TranslationKey } from "../misc/LanguageViewModel.js"
@ -10,9 +11,22 @@ import { getEnabledMailAddressesForGroupInfo } from "../api/common/utils/GroupUt
import { showPasswordGeneratorDialog } from "../misc/passwords/PasswordGeneratorDialog.js"
import { theme } from "../gui/theme.js"
import { px, size } from "../gui/size.js"
========
import { Autocomplete } from "../../common/gui/base/TextField.js"
import { getPasswordStrength, isSecurePassword } from "../../common/misc/passwords/PasswordUtils"
import type { TranslationKey } from "../../common/misc/LanguageViewModel"
import { lang } from "../../common/misc/LanguageViewModel"
import type { Status } from "../../common/gui/base/StatusField"
import { LoginController } from "../../common/api/main/LoginController"
import { assertMainOrNode } from "../../common/api/common/Env"
import { getEnabledMailAddressesForGroupInfo } from "../../common/api/common/utils/GroupUtils.js"
import { showPasswordGeneratorDialog } from "../../common/misc/passwords/PasswordGeneratorDialog"
import { theme } from "../../common/gui/theme"
import { px, size } from "../../common/gui/size.js"
>>>>>>>> 3349a964d (Move files to new folder structure):src/mail-app/settings/PasswordForm.ts
import { UsageTest, UsageTestController } from "@tutao/tutanota-usagetests"
import Stream from "mithril/stream"
import { PasswordField, PasswordFieldAttrs } from "../misc/passwords/PasswordField.js"
import { PasswordField, PasswordFieldAttrs } from "../../common/misc/passwords/PasswordField.js"
assertMainOrNode()

View file

@ -1,7 +1,13 @@
import m, { Children } from "mithril"
<<<<<<<< HEAD:src/common/settings/ReferralSettingsViewer.ts
import type { UpdatableSettingsViewer } from "./Interfaces.js"
import { getReferralLink, ReferralLinkViewer } from "../../common/misc/news/items/ReferralLinkViewer.js"
import { locator } from "../../common/api/main/CommonLocator.js"
========
import type { UpdatableSettingsViewer } from "./SettingsView"
import { getReferralLink, ReferralLinkViewer } from "../../common/misc/news/items/ReferralLinkViewer.js"
import { locator } from "../../common/api/main/MainLocator.js"
>>>>>>>> 3349a964d (Move files to new folder structure):src/mail-app/settings/ReferralSettingsViewer.ts
import { EntityUpdateData } from "../../common/api/common/utils/EntityUpdateUtils.js"
/**

View file

@ -5,7 +5,11 @@ import { isMailAddress } from "../../common/misc/FormatValidator"
import { AccessDeactivatedError } from "../../common/api/common/error/RestError"
import { formatMailAddressFromParts } from "../../common/misc/Formatter"
import { Icon } from "../../common/gui/base/Icon"
<<<<<<<< HEAD:src/common/settings/SelectMailAddressForm.ts
import { locator } from "../../common/api/main/CommonLocator"
========
import { locator } from "../../common/api/main/MainLocator"
>>>>>>>> 3349a964d (Move files to new folder structure):src/mail-app/settings/SelectMailAddressForm.ts
import { assertMainOrNode } from "../../common/api/common/Env"
import { px, size } from "../../common/gui/size.js"
import { Autocomplete, inputLineHeight, TextField } from "../../common/gui/base/TextField.js"
@ -13,8 +17,14 @@ import { attachDropdown, DropdownButtonAttrs } from "../../common/gui/base/Dropd
import { IconButton, IconButtonAttrs } from "../../common/gui/base/IconButton.js"
import { ButtonSize } from "../../common/gui/base/ButtonSize.js"
import { EmailDomainData } from "./mailaddress/MailAddressesUtils.js"
<<<<<<<< HEAD:src/common/settings/SelectMailAddressForm.ts
import { BootIcons } from "../gui/base/icons/BootIcons.js"
import { isTutanotaMailAddress } from "../mailFunctionality/CommonMailUtils.js"
========
import { BootIcons } from "../../common/gui/base/icons/BootIcons.js"
import { isTutanotaMailAddress } from "../../common/api/common/mail/CommonMailUtils.js"
>>>>>>>> 3349a964d (Move files to new folder structure):src/mail-app/settings/SelectMailAddressForm.ts
assertMainOrNode()
const VALID_MESSAGE_ID = "mailAddressAvailable_msg"

View file

@ -1,14 +1,26 @@
import m from "mithril"
<<<<<<<< HEAD:src/common/settings/SetDomainCertificateDialog.ts
import { lang } from "../misc/LanguageViewModel.js"
import { Dialog } from "../gui/base/Dialog.js"
import { InvalidDataError, LockedError, PreconditionFailedError } from "../api/common/error/RestError.js"
import { showProgressDialog } from "../gui/dialogs/ProgressDialog.js"
import { isDomainName } from "../misc/FormatValidator.js"
========
import { lang } from "../../common/misc/LanguageViewModel"
import { Dialog } from "../../common/gui/base/Dialog"
import { InvalidDataError, LockedError, PreconditionFailedError } from "../../common/api/common/error/RestError"
import { showProgressDialog } from "../../common/gui/dialogs/ProgressDialog"
import { isDomainName } from "../../common/misc/FormatValidator"
>>>>>>>> 3349a964d (Move files to new folder structure):src/mail-app/settings/SetDomainCertificateDialog.ts
import stream from "mithril/stream"
import type { CustomerInfo } from "../api/entities/sys/TypeRefs.js"
import { TextField } from "../gui/base/TextField.js"
import type { CustomerInfo } from "../../common/api/entities/sys/TypeRefs.js"
import { TextField } from "../../common/gui/base/TextField.js"
import { ofClass } from "@tutao/tutanota-utils"
<<<<<<<< HEAD:src/common/settings/SetDomainCertificateDialog.ts
import { locator } from "../../common/api/main/CommonLocator"
========
import { locator } from "../../common/api/main/MainLocator"
>>>>>>>> 3349a964d (Move files to new folder structure):src/mail-app/settings/SetDomainCertificateDialog.ts
import { assertMainOrNode } from "../../common/api/common/Env"
import { getWhitelabelDomainInfo } from "../../common/api/common/utils/CustomerUtils.js"

View file

@ -1,3 +1,4 @@
<<<<<<<< HEAD:src/common/settings/SettingsExpander.ts
import type { InfoLink, TranslationKey } from "../misc/LanguageViewModel.js"
import { lang } from "../misc/LanguageViewModel.js"
import m, { Children, Component, Vnode } from "mithril"
@ -6,6 +7,16 @@ import { ifAllowedTutaLinks } from "../gui/base/GuiUtils.js"
import type { lazy, Thunk } from "@tutao/tutanota-utils"
import Stream from "mithril/stream"
import { locator } from "../../common/api/main/CommonLocator.js"
========
import type { InfoLink, TranslationKey } from "../../common/misc/LanguageViewModel"
import { lang } from "../../common/misc/LanguageViewModel"
import m, { Children, Component, Vnode } from "mithril"
import { ExpanderButton, ExpanderPanel } from "../../common/gui/base/Expander"
import { ifAllowedTutaLinks } from "../../common/gui/base/GuiUtils"
import type { lazy, Thunk } from "@tutao/tutanota-utils"
import Stream from "mithril/stream"
import { locator } from "../../common/api/main/MainLocator.js"
>>>>>>>> 3349a964d (Move files to new folder structure):src/mail-app/settings/SettingsExpander.ts
export type SettingsExpanderAttrs = {
title: TranslationKey | lazy<string>

View file

@ -1,9 +1,18 @@
<<<<<<<< HEAD:src/common/settings/SettingsFolder.ts
import type { lazyIcon } from "../gui/base/Icon.js"
import type { TranslationKey } from "../misc/LanguageViewModel.js"
import { isSelectedPrefix } from "../gui/base/NavButton.js"
import type { lazy } from "@tutao/tutanota-utils"
import { assertMainOrNode } from "../api/common/Env.js"
import { UpdatableSettingsViewer } from "./Interfaces.js"
========
import type { lazyIcon } from "../../common/gui/base/Icon"
import type { TranslationKey } from "../../common/misc/LanguageViewModel"
import { isSelectedPrefix } from "../../common/gui/base/NavButton.js"
import type { UpdatableSettingsViewer } from "./SettingsView"
import type { lazy } from "@tutao/tutanota-utils"
import { assertMainOrNode } from "../../common/api/common/Env"
>>>>>>>> 3349a964d (Move files to new folder structure):src/mail-app/settings/SettingsFolder.ts
assertMainOrNode()

View file

@ -1,13 +1,17 @@
import { User } from "../../../common/api/entities/sys/TypeRefs.js"
import { Dialog } from "../../../common/gui/base/Dialog.js"
<<<<<<<< HEAD:src/common/settings/login/ChangePasswordDialogs.ts
import { locator } from "../../../common/api/main/CommonLocator.js"
========
import { locator } from "../../../common/api/main/MainLocator.js"
>>>>>>>> 3349a964d (Move files to new folder structure):src/mail-app/settings/login/ChangePasswordDialogs.ts
import { showProgressDialog } from "../../../common/gui/dialogs/ProgressDialog.js"
import { lang } from "../../../common/misc/LanguageViewModel.js"
import m from "mithril"
import { NotAuthenticatedError } from "../../api/common/error/RestError.js"
import { NotAuthenticatedError } from "../../../common/api/common/error/RestError.js"
import { PasswordForm, PasswordModel } from "../PasswordForm.js"
import { assertNotNull, ofClass } from "@tutao/tutanota-utils"
import { asKdfType, DEFAULT_KDF_TYPE } from "../../api/common/TutanotaConstants.js"
import { asKdfType, DEFAULT_KDF_TYPE } from "../../../common/api/common/TutanotaConstants.js"
/**
*The admin does not have to enter the old password in addition to the new password (twice). The password strength is not enforced.

View file

@ -1,25 +1,30 @@
import m, { Children } from "mithril"
import stream from "mithril/stream"
import type { TextFieldAttrs } from "../../gui/base/TextField.js"
import { TextField } from "../../gui/base/TextField.js"
import { InfoLink, lang } from "../../misc/LanguageViewModel.js"
import { Icons } from "../../gui/base/icons/Icons.js"
import { CustomerPropertiesTypeRef, Session, SessionTypeRef } from "../../api/entities/sys/TypeRefs.js"
import type { TextFieldAttrs } from "../../../common/gui/base/TextField.js"
import { TextField } from "../../../common/gui/base/TextField.js"
import { InfoLink, lang } from "../../../common/misc/LanguageViewModel.js"
import { Icons } from "../../../common/gui/base/icons/Icons.js"
import { CustomerPropertiesTypeRef, Session, SessionTypeRef } from "../../../common/api/entities/sys/TypeRefs.js"
import { assertNotNull, LazyLoaded, neverNull, ofClass } from "@tutao/tutanota-utils"
import { formatDateTimeFromYesterdayOn } from "../../misc/Formatter.js"
import { SessionState } from "../../api/common/TutanotaConstants.js"
import { formatDateTimeFromYesterdayOn } from "../../../common/misc/Formatter.js"
import { SessionState } from "../../../common/api/common/TutanotaConstants.js"
import { SecondFactorsEditForm } from "./secondfactor/SecondFactorsEditForm.js"
import { NotFoundError } from "../../api/common/error/RestError.js"
import { NotFoundError } from "../../../common/api/common/error/RestError.js"
import * as RecoverCodeDialog from "./RecoverCodeDialog.js"
import { attachDropdown } from "../../../common/gui/base/Dropdown.js"
import { ExpanderButton, ExpanderPanel } from "../../../common/gui/base/Expander.js"
import { ColumnWidth, Table } from "../../../common/gui/base/Table.js"
import { ifAllowedTutaLinks } from "../../../common/gui/base/GuiUtils.js"
<<<<<<<< HEAD:src/common/settings/login/LoginSettingsViewer.ts
========
import type { UpdatableSettingsViewer } from "../SettingsView.js"
>>>>>>>> 3349a964d (Move files to new folder structure):src/mail-app/settings/login/LoginSettingsViewer.ts
import { CredentialEncryptionMode } from "../../../common/misc/credentials/CredentialEncryptionMode.js"
import { CredentialsProvider } from "../../../common/misc/credentials/CredentialsProvider.js"
import { showCredentialsEncryptionModeDialog } from "../../../common/gui/dialogs/SelectCredentialsEncryptionModeDialog.js"
import { assertMainOrNode, isDesktop } from "../../../common/api/common/Env.js"
<<<<<<<< HEAD:src/common/settings/login/LoginSettingsViewer.ts
import { locator } from "../../../common/api/main/CommonLocator.js"
import { elementIdPart, getElementId } from "../../../common/api/common/utils/EntityUtils.js"
import { showChangeOwnPasswordDialog } from "./ChangePasswordDialogs.js"
@ -34,6 +39,21 @@ import { MoreInfoLink } from "../../misc/news/MoreInfoLink.js"
import { AppLockMethod } from "../../native/common/generatedipc/AppLockMethod.js"
import { MobileSystemFacade } from "../../native/common/generatedipc/MobileSystemFacade.js"
import { UpdatableSettingsViewer } from "../Interfaces.js"
========
import { locator } from "../../../common/api/main/MainLocator.js"
import { elementIdPart, getElementId } from "../../../common/api/common/utils/EntityUtils.js"
import { showChangeOwnPasswordDialog } from "./ChangePasswordDialogs.js"
import { IconButton, IconButtonAttrs } from "../../../common/gui/base/IconButton.js"
import { ButtonSize } from "../../../common/gui/base/ButtonSize.js"
import { DropDownSelector, DropDownSelectorAttrs } from "../../../common/gui/base/DropDownSelector.js"
import { UsageTestModel } from "../../../common/misc/UsageTestModel.js"
import { UserSettingsGroupRootTypeRef } from "../../../common/api/entities/tutanota/TypeRefs.js"
import { EntityUpdateData, isUpdateForTypeRef } from "../../../common/api/common/utils/EntityUpdateUtils.js"
import { Dialog } from "../../../common/gui/base/Dialog.js"
import { MoreInfoLink } from "../../../common/misc/news/MoreInfoLink.js"
import { AppLockMethod } from "../../../common/native/common/generatedipc/AppLockMethod.js"
import { MobileSystemFacade } from "../../../common/native/common/generatedipc/MobileSystemFacade.js"
>>>>>>>> 3349a964d (Move files to new folder structure):src/mail-app/settings/login/LoginSettingsViewer.ts
assertMainOrNode()
@ -194,7 +214,7 @@ export class LoginSettingsViewer implements UpdatableSettingsViewer {
// On mobile we display app lock dialog, on desktop credential encryption dialog. They are similar but different.
if (mobileSystemFacade) {
const onEdit = async () => {
const { showAppLockMethodDialog } = await import("../../native/main/SelectAppLockMethodDialog.js")
const { showAppLockMethodDialog } = await import("../../../common/native/main/SelectAppLockMethodDialog.js")
await showAppLockMethodDialog(mobileSystemFacade)
await this.updateAppLockData()
}

View file

@ -1,12 +1,16 @@
import { InfoLink, lang } from "../../misc/LanguageViewModel.js"
import { Dialog, DialogType } from "../../gui/base/Dialog.js"
import { InfoLink, lang } from "../../../common/misc/LanguageViewModel.js"
import { Dialog, DialogType } from "../../../common/gui/base/Dialog.js"
import type { Hex } from "@tutao/tutanota-utils"
import { neverNull, noOp, ofClass } from "@tutao/tutanota-utils"
import m, { Child, Children, Vnode } from "mithril"
import { assertMainOrNode, isApp } from "../../../common/api/common/Env.js"
import { copyToClipboard } from "../../../common/misc/ClipboardUtils.js"
import { AccessBlockedError, NotAuthenticatedError } from "../../../common/api/common/error/RestError.js"
<<<<<<<< HEAD:src/common/settings/login/RecoverCodeDialog.ts
import { locator } from "../../../common/api/main/CommonLocator.js"
========
import { locator } from "../../../common/api/main/MainLocator.js"
>>>>>>>> 3349a964d (Move files to new folder structure):src/mail-app/settings/login/RecoverCodeDialog.ts
import { Icons } from "../../../common/gui/base/icons/Icons.js"
import { User } from "../../../common/api/entities/sys/TypeRefs.js"
import { getEtId, isSameId } from "../../../common/api/common/utils/EntityUtils.js"

View file

@ -1,28 +1,32 @@
import { showProgressDialog } from "../../../gui/dialogs/ProgressDialog.js"
import { SecondFactorType } from "../../../api/common/TutanotaConstants.js"
import type { DropDownSelectorAttrs } from "../../../gui/base/DropDownSelector.js"
import { DropDownSelector } from "../../../gui/base/DropDownSelector.js"
import { lang } from "../../../misc/LanguageViewModel.js"
import type { TextFieldAttrs } from "../../../gui/base/TextField.js"
import { Autocomplete, TextField } from "../../../gui/base/TextField.js"
import { isApp } from "../../../api/common/Env.js"
import { showProgressDialog } from "../../../../common/gui/dialogs/ProgressDialog.js"
import { SecondFactorType } from "../../../../common/api/common/TutanotaConstants.js"
import type { DropDownSelectorAttrs } from "../../../../common/gui/base/DropDownSelector.js"
import { DropDownSelector } from "../../../../common/gui/base/DropDownSelector.js"
import { lang } from "../../../../common/misc/LanguageViewModel.js"
import type { TextFieldAttrs } from "../../../../common/gui/base/TextField.js"
import { Autocomplete, TextField } from "../../../../common/gui/base/TextField.js"
import { isApp } from "../../../../common/api/common/Env.js"
import m, { Children } from "mithril"
import { copyToClipboard } from "../../../misc/ClipboardUtils.js"
import { Icons } from "../../../gui/base/icons/Icons.js"
import { Dialog } from "../../../gui/base/Dialog.js"
import { Icon, progressIcon } from "../../../gui/base/Icon.js"
import { theme } from "../../../gui/theme.js"
import type { User } from "../../../api/entities/sys/TypeRefs.js"
import { copyToClipboard } from "../../../../common/misc/ClipboardUtils.js"
import { Icons } from "../../../../common/gui/base/icons/Icons.js"
import { Dialog } from "../../../../common/gui/base/Dialog.js"
import { Icon, progressIcon } from "../../../../common/gui/base/Icon.js"
import { theme } from "../../../../common/gui/theme.js"
import type { User } from "../../../../common/api/entities/sys/TypeRefs.js"
import { assertNotNull, LazyLoaded } from "@tutao/tutanota-utils"
<<<<<<<< HEAD:src/common/settings/login/secondfactor/SecondFactorEditDialog.ts
import { locator } from "../../../../common/api/main/CommonLocator.js"
========
import { locator } from "../../../../common/api/main/MainLocator.js"
>>>>>>>> 3349a964d (Move files to new folder structure):src/mail-app/settings/login/secondfactor/SecondFactorEditDialog.ts
import * as RecoverCodeDialog from "../RecoverCodeDialog.js"
import { EntityClient } from "../../../api/common/EntityClient.js"
import { ProgrammingError } from "../../../api/common/error/ProgrammingError.js"
import { IconButton, IconButtonAttrs } from "../../../gui/base/IconButton.js"
import { ButtonSize } from "../../../gui/base/ButtonSize.js"
import { EntityClient } from "../../../../common/api/common/EntityClient.js"
import { ProgrammingError } from "../../../../common/api/common/error/ProgrammingError.js"
import { IconButton, IconButtonAttrs } from "../../../../common/gui/base/IconButton.js"
import { ButtonSize } from "../../../../common/gui/base/ButtonSize.js"
import { NameValidationStatus, SecondFactorEditModel, SecondFactorTypeToNameTextId, VerificationStatus } from "./SecondFactorEditModel.js"
import { UserError } from "../../../api/main/UserError.js"
import { LoginButton } from "../../../gui/base/buttons/LoginButton.js"
import { UserError } from "../../../../common/api/main/UserError.js"
import { LoginButton } from "../../../../common/gui/base/buttons/LoginButton.js"
export class SecondFactorEditDialog {
private readonly dialog: Dialog

View file

@ -1,16 +1,16 @@
import { EntityClient } from "../../../api/common/EntityClient.js"
import { createSecondFactor, GroupInfoTypeRef, U2fRegisteredDevice, User } from "../../../api/entities/sys/TypeRefs.js"
import { validateWebauthnDisplayName, WebauthnClient } from "../../../misc/2fa/webauthn/WebauthnClient.js"
import { EntityClient } from "../../../../common/api/common/EntityClient.js"
import { createSecondFactor, GroupInfoTypeRef, U2fRegisteredDevice, User } from "../../../../common/api/entities/sys/TypeRefs.js"
import { validateWebauthnDisplayName, WebauthnClient } from "../../../../common/misc/2fa/webauthn/WebauthnClient.js"
import { TotpSecret } from "@tutao/tutanota-crypto"
import { assertNotNull, LazyLoaded, neverNull } from "@tutao/tutanota-utils"
import { isApp } from "../../../api/common/Env.js"
import { htmlSanitizer } from "../../../misc/HtmlSanitizer.js"
import { LanguageViewModel, TranslationKey } from "../../../misc/LanguageViewModel.js"
import { SecondFactorType } from "../../../api/common/TutanotaConstants.js"
import { ProgrammingError } from "../../../api/common/error/ProgrammingError.js"
import { isApp } from "../../../../common/api/common/Env.js"
import { htmlSanitizer } from "../../../../common/misc/HtmlSanitizer.js"
import { LanguageViewModel, TranslationKey } from "../../../../common/misc/LanguageViewModel.js"
import { SecondFactorType } from "../../../../common/api/common/TutanotaConstants.js"
import { ProgrammingError } from "../../../../common/api/common/error/ProgrammingError.js"
import QRCode from "qrcode-svg"
import { LoginFacade } from "../../../api/worker/facades/LoginFacade.js"
import { UserError } from "../../../api/main/UserError.js"
import { LoginFacade } from "../../../../common/api/worker/facades/LoginFacade.js"
import { UserError } from "../../../../common/api/main/UserError.js"
export const enum VerificationStatus {
Initial = "Initial",

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