mirror of
https://github.com/frappe/books.git
synced 2024-12-24 11:55:46 +00:00
refactor: move fjs init boilerplate out, shift db init
This commit is contained in:
parent
5251138542
commit
512e16d910
@ -30,8 +30,9 @@ import DatabaseSelector from './pages/DatabaseSelector';
|
|||||||
import WindowsTitleBar from '@/components/WindowsTitleBar';
|
import WindowsTitleBar from '@/components/WindowsTitleBar';
|
||||||
import { ipcRenderer } from 'electron';
|
import { ipcRenderer } from 'electron';
|
||||||
import config from '@/config';
|
import config from '@/config';
|
||||||
import { connectToLocalDatabase, routeTo, purgeCache } from '@/utils';
|
import { routeTo } from '@/utils';
|
||||||
import { IPC_MESSAGES, IPC_ACTIONS } from '@/messages';
|
import { IPC_MESSAGES, IPC_ACTIONS } from '@/messages';
|
||||||
|
import { connectToLocalDatabase, purgeCache } from '@/initialization';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'App',
|
name: 'App',
|
||||||
|
103
src/initialization.js
Normal file
103
src/initialization.js
Normal 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];
|
||||||
|
});
|
||||||
|
}
|
20
src/main.js
20
src/main.js
@ -1,28 +1,18 @@
|
|||||||
// frappejs imports
|
import { ipcRenderer } from 'electron';
|
||||||
import frappe from 'frappejs';
|
import frappe from 'frappejs';
|
||||||
import common from 'frappejs/common';
|
|
||||||
import coreModels from 'frappejs/models';
|
|
||||||
import FeatherIcon from 'frappejs/ui/components/FeatherIcon';
|
import FeatherIcon from 'frappejs/ui/components/FeatherIcon';
|
||||||
import outsideClickDirective from 'frappejs/ui/plugins/outsideClickDirective';
|
import outsideClickDirective from 'frappejs/ui/plugins/outsideClickDirective';
|
||||||
import models from '../models';
|
|
||||||
|
|
||||||
// vue imports
|
|
||||||
import Vue from 'vue';
|
|
||||||
import PortalVue from 'portal-vue';
|
import PortalVue from 'portal-vue';
|
||||||
|
import Vue from 'vue';
|
||||||
|
import models from '../models';
|
||||||
import App from './App';
|
import App from './App';
|
||||||
import router from './router';
|
|
||||||
|
|
||||||
// other imports
|
|
||||||
import { ipcRenderer } from 'electron';
|
|
||||||
import { IPC_MESSAGES } from './messages';
|
import { IPC_MESSAGES } from './messages';
|
||||||
|
import router from './router';
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
frappe.isServer = true;
|
frappe.isServer = true;
|
||||||
frappe.isElectron = true;
|
frappe.isElectron = true;
|
||||||
frappe.init();
|
frappe.initializeAndRegister(models);
|
||||||
frappe.registerLibs(common);
|
|
||||||
frappe.registerModels(coreModels);
|
|
||||||
frappe.registerModels(models);
|
|
||||||
frappe.fetch = window.fetch.bind();
|
frappe.fetch = window.fetch.bind();
|
||||||
|
|
||||||
frappe.events.on('reload-main-window', () => {
|
frappe.events.on('reload-main-window', () => {
|
||||||
|
@ -157,7 +157,7 @@ import {
|
|||||||
createNewDatabase,
|
createNewDatabase,
|
||||||
loadExistingDatabase,
|
loadExistingDatabase,
|
||||||
connectToLocalDatabase,
|
connectToLocalDatabase,
|
||||||
} from '@/utils';
|
} from '@/initialization';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'DatabaseSelector',
|
name: 'DatabaseSelector',
|
||||||
|
@ -68,13 +68,11 @@ import Popover from '@/components/Popover';
|
|||||||
import config from '@/config';
|
import config from '@/config';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import { connectToLocalDatabase } from '@/utils';
|
import { purgeCache, connectToLocalDatabase } from '@/initialization';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
getErrorMessage,
|
getErrorMessage,
|
||||||
handleErrorWithDialog,
|
handleErrorWithDialog,
|
||||||
showMessageDialog,
|
showMessageDialog,
|
||||||
purgeCache,
|
|
||||||
} from '@/utils';
|
} from '@/utils';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
100
src/utils.js
100
src/utils.js
@ -1,96 +1,9 @@
|
|||||||
import Avatar from '@/components/Avatar';
|
import Avatar from '@/components/Avatar';
|
||||||
import config from '@/config';
|
|
||||||
import router from '@/router';
|
import router from '@/router';
|
||||||
import { ipcRenderer } from 'electron';
|
import { ipcRenderer } from 'electron';
|
||||||
import frappe from 'frappejs';
|
import frappe from 'frappejs';
|
||||||
import SQLite from 'frappejs/backends/sqlite';
|
|
||||||
import { _ } from 'frappejs/utils';
|
import { _ } from 'frappejs/utils';
|
||||||
import fs from 'fs';
|
|
||||||
import postStart from '../server/postStart';
|
|
||||||
import { IPC_ACTIONS, IPC_MESSAGES } from './messages';
|
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({
|
export async function showMessageDialog({
|
||||||
message,
|
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) {
|
export function fuzzyMatch(keyword, candidate) {
|
||||||
const keywordLetters = [...keyword];
|
const keywordLetters = [...keyword];
|
||||||
const candidateLetters = [...candidate];
|
const candidateLetters = [...candidate];
|
||||||
|
Loading…
Reference in New Issue
Block a user