2
0
mirror of https://github.com/frappe/books.git synced 2024-12-23 19:39:07 +00:00

refactor: move fjs init boilerplate out, shift db init

This commit is contained in:
18alantom 2021-11-29 15:02:05 +05:30
parent 5251138542
commit 512e16d910
6 changed files with 112 additions and 120 deletions

View File

@ -30,8 +30,9 @@ import DatabaseSelector from './pages/DatabaseSelector';
import WindowsTitleBar from '@/components/WindowsTitleBar';
import { ipcRenderer } from 'electron';
import config from '@/config';
import { connectToLocalDatabase, routeTo, purgeCache } from '@/utils';
import { routeTo } from '@/utils';
import { IPC_MESSAGES, IPC_ACTIONS } from '@/messages';
import { connectToLocalDatabase, purgeCache } from '@/initialization';
export default {
name: 'App',

103
src/initialization.js Normal file
View File

@ -0,0 +1,103 @@
import config from '@/config';
import { ipcRenderer } from 'electron';
import { _ } from 'frappejs';
import SQLite from 'frappejs/backends/sqlite';
import fs from 'fs';
import postStart from '../server/postStart';
import migrate from './migrate';
import { IPC_ACTIONS } from './messages';
export async function createNewDatabase() {
const options = {
title: _('Select folder'),
defaultPath: 'frappe-books.db',
};
let { canceled, filePath } = await ipcRenderer.invoke(
IPC_ACTIONS.GET_SAVE_FILEPATH,
options
);
if (canceled || filePath.length === 0) {
return '';
}
if (!filePath.endsWith('.db')) {
showMessageDialog({
message: "Please select a filename ending with '.db'.",
});
return '';
}
if (fs.existsSync(filePath)) {
fs.unlinkSync(filePath);
}
return filePath;
}
export async function loadExistingDatabase() {
const options = {
title: _('Select file'),
properties: ['openFile'],
filters: [{ name: 'SQLite DB File', extensions: ['db'] }],
};
const { filePaths } = await ipcRenderer.invoke(
IPC_ACTIONS.GET_OPEN_FILEPATH,
options
);
if (filePaths && filePaths[0]) {
return filePaths[0];
}
}
export async function connectToLocalDatabase(filePath) {
if (!filePath) {
return false;
}
frappe.login('Administrator');
try {
frappe.db = new SQLite({
dbPath: filePath,
});
await frappe.db.connect();
} catch (error) {
return false;
}
await migrate();
await postStart();
// set file info in config
let files = config.get('files') || [];
if (!files.find((file) => file.filePath === filePath)) {
files = [
{
companyName: frappe.AccountingSettings.companyName,
filePath: filePath,
},
...files,
];
config.set('files', files);
}
// set last selected file
config.set('lastSelectedFilePath', filePath);
return true;
}
export function purgeCache(purgeAll = false) {
const filterFunction = purgeAll
? (d) => true
: (d) => frappe.docs[d][d] instanceof frappe.BaseMeta;
Object.keys(frappe.docs)
.filter(filterFunction)
.forEach((d) => {
frappe.removeFromCache(d, d);
delete frappe[d];
});
}

View File

@ -1,28 +1,18 @@
// frappejs imports
import { ipcRenderer } from 'electron';
import frappe from 'frappejs';
import common from 'frappejs/common';
import coreModels from 'frappejs/models';
import FeatherIcon from 'frappejs/ui/components/FeatherIcon';
import outsideClickDirective from 'frappejs/ui/plugins/outsideClickDirective';
import models from '../models';
// vue imports
import Vue from 'vue';
import PortalVue from 'portal-vue';
import Vue from 'vue';
import models from '../models';
import App from './App';
import router from './router';
// other imports
import { ipcRenderer } from 'electron';
import { IPC_MESSAGES } from './messages';
import router from './router';
(async () => {
frappe.isServer = true;
frappe.isElectron = true;
frappe.init();
frappe.registerLibs(common);
frappe.registerModels(coreModels);
frappe.registerModels(models);
frappe.initializeAndRegister(models);
frappe.fetch = window.fetch.bind();
frappe.events.on('reload-main-window', () => {

View File

@ -157,7 +157,7 @@ import {
createNewDatabase,
loadExistingDatabase,
connectToLocalDatabase,
} from '@/utils';
} from '@/initialization';
export default {
name: 'DatabaseSelector',

View File

@ -68,13 +68,11 @@ import Popover from '@/components/Popover';
import config from '@/config';
import path from 'path';
import fs from 'fs';
import { connectToLocalDatabase } from '@/utils';
import { purgeCache, connectToLocalDatabase } from '@/initialization';
import {
getErrorMessage,
handleErrorWithDialog,
showMessageDialog,
purgeCache,
} from '@/utils';
export default {

View File

@ -1,96 +1,9 @@
import Avatar from '@/components/Avatar';
import config from '@/config';
import router from '@/router';
import { ipcRenderer } from 'electron';
import frappe from 'frappejs';
import SQLite from 'frappejs/backends/sqlite';
import { _ } from 'frappejs/utils';
import fs from 'fs';
import postStart from '../server/postStart';
import { IPC_ACTIONS, IPC_MESSAGES } from './messages';
import migrate from './migrate';
export async function createNewDatabase() {
const options = {
title: _('Select folder'),
defaultPath: 'frappe-books.db',
};
let { canceled, filePath } = await ipcRenderer.invoke(
IPC_ACTIONS.GET_SAVE_FILEPATH,
options
);
if (canceled || filePath.length === 0) {
return '';
}
if (!filePath.endsWith('.db')) {
showMessageDialog({
message: "Please select a filename ending with '.db'.",
});
return '';
}
if (fs.existsSync(filePath)) {
fs.unlinkSync(filePath);
}
return filePath;
}
export async function loadExistingDatabase() {
const options = {
title: _('Select file'),
properties: ['openFile'],
filters: [{ name: 'SQLite DB File', extensions: ['db'] }],
};
const { filePaths } = await ipcRenderer.invoke(
IPC_ACTIONS.GET_OPEN_FILEPATH,
options
);
if (filePaths && filePaths[0]) {
return filePaths[0];
}
}
export async function connectToLocalDatabase(filePath) {
if (!filePath) {
return false;
}
frappe.login('Administrator');
try {
frappe.db = new SQLite({
dbPath: filePath,
});
await frappe.db.connect();
} catch (error) {
return false;
}
await migrate();
await postStart();
// set file info in config
let files = config.get('files') || [];
if (!files.find((file) => file.filePath === filePath)) {
files = [
{
companyName: frappe.AccountingSettings.companyName,
filePath: filePath,
},
...files,
];
config.set('files', files);
}
// set last selected file
config.set('lastSelectedFilePath', filePath);
return true;
}
export async function showMessageDialog({
message,
@ -339,19 +252,6 @@ export function routeTo(route) {
}
}
export function purgeCache(purgeAll = false) {
const filterFunction = purgeAll
? (d) => true
: (d) => frappe.docs[d][d] instanceof frappe.BaseMeta;
Object.keys(frappe.docs)
.filter(filterFunction)
.forEach((d) => {
frappe.removeFromCache(d, d);
delete frappe[d];
});
}
export function fuzzyMatch(keyword, candidate) {
const keywordLetters = [...keyword];
const candidateLetters = [...candidate];