mirror of
https://github.com/tutao/tutanota.git
synced 2025-10-19 16:03:43 +00:00
[Calendar] Make Calendar Search separation clearer
Co-authored-by: @rih-tutao other style fixes
This commit is contained in:
parent
1e96588527
commit
168d048448
143 changed files with 1186 additions and 630 deletions
|
@ -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,
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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()
|
94
src/calendar-app/calendar/search/CalendarSearchBarOverlay.ts
Normal file
94
src/calendar-app/calendar/search/CalendarSearchBarOverlay.ts
Normal 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))),
|
||||
]
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
|
|
|
@ -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, {
|
|
@ -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) => {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
})
|
||||
|
|
|
@ -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> {
|
||||
|
|
|
@ -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,
|
|
@ -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,
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
import type { Thunk } from "@tutao/tutanota-utils"
|
||||
import { downcast } from "@tutao/tutanota-utils"
|
||||
import { EndType } from "../../api/common/TutanotaConstants.js"
|
||||
import type { AlarmInfo, RepeatRule } from "../../api/entities/sys/TypeRefs.js"
|
||||
import type { ScheduledTimeoutId, Scheduler } from "../../api/common/utils/Scheduler.js"
|
||||
import { EndType } from "../../../common/api/common/TutanotaConstants.js"
|
||||
import type { AlarmInfo, RepeatRule } from "../../../common/api/entities/sys/TypeRefs.js"
|
||||
import type { ScheduledTimeoutId, Scheduler } from "../../../common/api/common/utils/Scheduler.js"
|
||||
import { calculateAlarmTime, findNextAlarmOccurrence, getEventStartByTimes, getValidTimeZone, parseAlarmInterval } from "./CalendarUtils.js"
|
||||
import { DateProvider } from "../../api/common/DateProvider.js"
|
||||
import { DateProvider } from "../../../common/api/common/DateProvider.js"
|
||||
|
||||
type NotificationSender = (eventTime: Date, summary: string) => void
|
||||
type EventInfo = {
|
||||
|
|
|
@ -1,18 +1,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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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 {
|
||||
/**
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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) {}
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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]"
|
||||
|
|
|
@ -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]"
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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> {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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]")
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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]")
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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"]
|
||||
|
|
0
src/common/gui/base/NewList.ts
Normal file
0
src/common/gui/base/NewList.ts
Normal 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)
|
||||
}
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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>"
|
||||
|
|
|
@ -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
|
||||
|
|
0
src/common/misc/2fa/webauthn/WebAuthn.ts
Normal file
0
src/common/misc/2fa/webauthn/WebAuthn.ts
Normal file
0
src/common/misc/ContactSuggestion.ts
Normal file
0
src/common/misc/ContactSuggestion.ts
Normal 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
|
||||
|
|
|
@ -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
|
||||
})
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -22,3 +22,8 @@ export interface SettingsViewAttrs extends TopLevelAttrs {
|
|||
header: AppHeaderAttrs
|
||||
logins: LoginController
|
||||
}
|
||||
|
||||
export enum AppType {
|
||||
Mail,
|
||||
Calendar,
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
||||
/**
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue