diff --git a/fyo/model/types.ts b/fyo/model/types.ts index 6f2d9f88..47563666 100644 --- a/fyo/model/types.ts +++ b/fyo/model/types.ts @@ -63,7 +63,7 @@ export type ListsMap = Record; export interface Action { label: string; - action: (doc: Doc, router: Router) => Promise | void; + action: (doc: Doc, router: Router) => Promise | void | unknown; condition?: (doc: Doc) => boolean; group?: string; type?: 'primary' | 'secondary'; diff --git a/main/helpers.ts b/main/helpers.ts index 8dfe9351..24022450 100644 --- a/main/helpers.ts +++ b/main/helpers.ts @@ -5,10 +5,7 @@ import { Main } from 'main'; import config from 'utils/config'; import { BackendResponse } from 'utils/ipc/types'; import { IPC_CHANNELS } from 'utils/messages'; - -interface ConfigFilesWithModified extends ConfigFile { - modified: string; -} +import type { ConfigFilesWithModified } from 'utils/types'; export async function setAndGetCleanedConfigFiles() { const files = config.get(ConfigKeys.Files, []) as ConfigFile[]; diff --git a/src/App.vue b/src/App.vue index be0aeeb7..fc1471ff 100644 --- a/src/App.vue +++ b/src/App.vue @@ -17,6 +17,7 @@ @change-db-file="showDbSelector" /> @@ -49,6 +50,7 @@ import SetupWizard from './pages/SetupWizard/SetupWizard.vue'; import setupInstance from './setup/setupInstance'; import { SetupWizardOptions } from './setup/types'; import './styles/index.css'; +import { connectToDatabase, dbErrorActionSymbols } from './utils/db'; import { initializeInstance } from './utils/initialization'; import * as injectionKeys from './utils/injectionKeys'; import { checkForUpdates } from './utils/ipcCalls'; @@ -80,7 +82,17 @@ export default defineComponent({ provide(injectionKeys.shortcutsKey, shortcuts); provide(injectionKeys.languageDirectionKey, languageDirection); - return { keys, searcher, shortcuts, languageDirection }; + const databaseSelector = ref | null>( + null + ); + + return { + keys, + searcher, + shortcuts, + languageDirection, + databaseSelector, + }; }, data() { return { @@ -170,7 +182,15 @@ export default defineComponent({ await this.setDesk(filePath); }, async showSetupWizardOrDesk(filePath: string): Promise { - const countryCode = await fyo.db.connectToDatabase(filePath); + const { countryCode, error, actionSymbol } = await connectToDatabase( + this.fyo, + filePath + ); + + if (!countryCode && error && actionSymbol) { + return await this.handleConnectionFailed(error, actionSymbol); + } + const setupComplete = await fyo.getValue( ModelNameEnum.AccountingSettings, 'setupComplete' @@ -185,6 +205,19 @@ export default defineComponent({ await updatePrintTemplates(fyo); await this.setDesk(filePath); }, + async handleConnectionFailed(error: Error, actionSymbol: symbol) { + await this.showDbSelector(); + + if (actionSymbol === dbErrorActionSymbols.CancelSelection) { + return; + } + + if (actionSymbol === dbErrorActionSymbols.SelectFile) { + return await this.databaseSelector?.existingDatabase(); + } + + throw error; + }, async setDeskRoute(): Promise { const { onboardingComplete } = await fyo.doc.getDoc('GetStarted'); const { hideGetStarted } = await fyo.doc.getDoc('SystemSettings'); diff --git a/src/components/Dialog.vue b/src/components/Dialog.vue index 49abd169..88bd8158 100644 --- a/src/components/Dialog.vue +++ b/src/components/Dialog.vue @@ -32,7 +32,7 @@ v-for="(b, index) of buttons" :ref="b.isPrimary ? 'primary' : 'secondary'" :key="b.label" - class="w-20" + style="min-width: 5rem" :type="b.isPrimary ? 'primary' : 'secondary'" @click="() => handleClick(index)" > diff --git a/src/components/DropdownWithActions.vue b/src/components/DropdownWithActions.vue index 670481b6..fe1787f8 100644 --- a/src/components/DropdownWithActions.vue +++ b/src/components/DropdownWithActions.vue @@ -32,7 +32,10 @@ export default defineComponent({ icon: { type: Boolean, default: true }, }, inject: { - injectedDoc: { from: 'doc' }, + injectedDoc: { + from: 'doc', + default: undefined, + }, }, components: { Dropdown, diff --git a/src/pages/DatabaseSelector.vue b/src/pages/DatabaseSelector.vue index 5effec7d..973cc15c 100644 --- a/src/pages/DatabaseSelector.vue +++ b/src/pages/DatabaseSelector.vue @@ -212,7 +212,7 @@ - diff --git a/src/pages/ImportWizard.vue b/src/pages/ImportWizard.vue index 1bf03430..e407f420 100644 --- a/src/pages/ImportWizard.vue +++ b/src/pages/ImportWizard.vue @@ -123,7 +123,7 @@ :border="true" :key="index" :df="gridColumnTitleDf" - :value="importer.assignedTemplateFields[index]" + :value="importer.assignedTemplateFields[index]!" @change="(value: string | null) => importer.setTemplateField(index, value)" /> @@ -160,6 +160,7 @@ v-if="!importer.assignedTemplateFields[cidx]" :title="getFieldTitle(val)" :df="{ + fieldtype: 'Data', fieldname: 'tempField', label: t`Temporary`, placeholder: t`Select column`, @@ -244,6 +245,7 @@ >