From c56850d08f3d13c6646f61bbbaa23b83757c6248 Mon Sep 17 00:00:00 2001 From: 18alantom <2.alan.tom@gmail.com> Date: Wed, 20 Apr 2022 12:08:47 +0530 Subject: [PATCH] incr: refactor and type src/utils --- accounting/gst.js | 8 +- fyo/model/types.ts | 7 +- fyo/tests/testFyo.spec.ts | 13 +- fyo/utils/index.ts | 12 + fyo/utils/translation.ts | 4 +- models/baseModels/Invoice/Invoice.ts | 4 + models/helpers.ts | 2 +- reports/GeneralLedger/viewConfig.js | 30 +- src/App.vue | 12 +- src/components/Controls/AutoComplete.vue | 4 +- src/components/Controls/Color.vue | 4 +- src/components/Controls/LanguageSelector.vue | 6 +- src/components/Controls/Link.vue | 8 +- src/components/Controls/Table.vue | 2 +- src/components/Controls/TableRow.vue | 4 +- src/components/DropdownWithActions.vue | 4 +- .../SalesInvoice/SalesInvoicePrint.vue | 8 +- src/components/SearchBar.vue | 4 +- src/components/Sidebar.vue | 6 +- src/components/StatusBadge.vue | 2 +- src/components/TwoColumnForm.vue | 8 +- src/components/Widgets/PartyWidget.vue | 2 +- src/components/WindowControls.vue | 2 +- src/components/WindowsTitleBar.vue | 2 +- src/components/once/TelemetryModal.vue | 8 +- src/dataImport.ts | 20 +- src/errorHandling.ts | 22 +- src/languageCodeMap.js | 9 - src/main.js | 19 +- src/pages/ChartOfAccounts.vue | 12 +- src/pages/Dashboard/Cashflow.vue | 8 +- src/pages/Dashboard/Dashboard.vue | 8 +- src/pages/Dashboard/Expenses.vue | 2 +- src/pages/Dashboard/PeriodSelector.vue | 2 +- src/pages/Dashboard/ProfitAndLoss.vue | 10 +- src/pages/Dashboard/UnpaidInvoices.vue | 4 +- src/pages/DataImport.vue | 26 +- src/pages/DatabaseSelector.vue | 8 +- src/pages/GetStarted.vue | 8 +- src/pages/InvoiceForm.vue | 18 +- src/pages/JournalEntryForm.vue | 14 +- src/pages/ListView/List.vue | 8 +- src/pages/ListView/ListView.vue | 10 +- src/pages/PrintView/PrintView.vue | 16 +- src/pages/QuickEditForm.vue | 12 +- src/pages/Report.vue | 16 +- src/pages/Settings/Settings.vue | 12 +- src/pages/Settings/TabGeneral.vue | 2 +- src/pages/Settings/TabInvoice.vue | 4 +- src/pages/Settings/TabSystem.vue | 16 +- src/pages/SetupWizard/SetupWizard.vue | 14 +- src/pages/SetupWizard/Slide.vue | 2 +- src/pages/SetupWizard/setupCompany.js | 4 +- src/postStart.ts | 4 +- src/regional/in.ts | 2 +- src/renderer/helpers.ts | 2 +- src/renderer/registerIpcRendererListeners.ts | 6 +- src/{router.js => router.ts} | 30 +- src/utils.js | 603 ------------------ src/utils.ts | 99 --- src/{colors.js => utils/colors.ts} | 10 +- src/utils/index.ts | 97 +++ src/utils/ipcCalls.ts | 72 +++ src/utils/language.ts | 71 +++ src/utils/types.ts | 29 + src/utils/ui.ts | 329 ++++++++++ tsconfig.json | 8 +- utils/index.ts | 11 + vue.config.js | 3 +- 69 files changed, 902 insertions(+), 946 deletions(-) delete mode 100644 src/languageCodeMap.js rename src/{router.js => router.ts} (74%) delete mode 100644 src/utils.js delete mode 100644 src/utils.ts rename src/{colors.js => utils/colors.ts} (71%) create mode 100644 src/utils/index.ts create mode 100644 src/utils/ipcCalls.ts create mode 100644 src/utils/language.ts create mode 100644 src/utils/types.ts create mode 100644 src/utils/ui.ts diff --git a/accounting/gst.js b/accounting/gst.js index d4c3ed60..e068f44b 100644 --- a/accounting/gst.js +++ b/accounting/gst.js @@ -1,6 +1,6 @@ -import { showMessageDialog } from '@/utils'; import frappe, { t } from 'fyo'; import { DateTime } from 'luxon'; +import { showMessageDialog } from 'src/utils'; import { stateCodeMap } from '../regional/in'; import { exportCsv, saveExportData } from '../reports/commonExporter'; import { getSavePath } from '../src/utils'; @@ -50,7 +50,7 @@ export async function generateGstr1Json(getReportData) { if (!gstin) { showMessageDialog({ message: t`Export Failed`, - description: t`Please set GSTIN in General Settings.`, + detail: t`Please set GSTIN in General Settings.`, }); return; } @@ -232,7 +232,7 @@ export async function generateGstr2Csv(getReportData) { if (!gstin) { showMessageDialog({ message: t`Export Failed`, - description: t`Please set GSTIN in General Settings.`, + detail: t`Please set GSTIN in General Settings.`, }); return; } @@ -313,7 +313,7 @@ export async function generateGstr1Csv(getReportData) { if (!gstin) { showMessageDialog({ message: t`Export Failed`, - description: t`Please set GSTIN in General Settings.`, + detail: t`Please set GSTIN in General Settings.`, }); return; } diff --git a/fyo/model/types.ts b/fyo/model/types.ts index 55c8a5d6..7e462f8e 100644 --- a/fyo/model/types.ts +++ b/fyo/model/types.ts @@ -59,8 +59,11 @@ export type ListsMap = Record; export interface Action { label: string; - condition: (doc: Doc) => boolean; - action: (doc: Doc, router: Router) => Promise; + action: (doc: Doc, router: Router) => Promise | void; + condition?: (doc: Doc) => boolean; + component?: { + template?: string; + }; } export interface ColumnConfig { diff --git a/fyo/tests/testFyo.spec.ts b/fyo/tests/testFyo.spec.ts index bee00aaf..34e6ce27 100644 --- a/fyo/tests/testFyo.spec.ts +++ b/fyo/tests/testFyo.spec.ts @@ -41,7 +41,7 @@ describe('Fyo Init', function () { describe('Fyo Docs', function () { const countryCode = 'in'; let fyo: Fyo; - const schemas = getSchemas(countryCode); + const schemaMap = getSchemas(countryCode); this.beforeEach(async function () { fyo = new Fyo({ DatabaseDemux: DatabaseManager, @@ -58,7 +58,14 @@ describe('Fyo Docs', function () { await fyo.close(); }); - specify('temp', async function () { - fyo.db.schemaMap; + specify('getEmptyDoc', async function () { + for (const schemaName in schemaMap) { + const schema = schemaMap[schemaName]; + if (schema?.isSingle) { + continue; + } + + const doc = fyo.doc.getEmptyDoc(schemaName); + } }); }); diff --git a/fyo/utils/index.ts b/fyo/utils/index.ts index 0af1b050..b77ffb25 100644 --- a/fyo/utils/index.ts +++ b/fyo/utils/index.ts @@ -1,3 +1,6 @@ +import { Fyo } from 'fyo'; +import Doc from 'fyo/model/doc'; +import { Action } from 'fyo/model/types'; import { pesa } from 'pesa'; export function slug(str: string) { @@ -50,3 +53,12 @@ export function getDuplicates(array: unknown[]) { export function isPesa(value: unknown): boolean { return value instanceof pesa().constructor; } + +export function getActions(doc: Doc, fyo: Fyo): Action[] { + const Model = fyo.models[doc.schemaName]; + if (Model === undefined) { + return []; + } + + return Model.getActions(fyo); +} diff --git a/fyo/utils/translation.ts b/fyo/utils/translation.ts index f9073504..316cebbe 100644 --- a/fyo/utils/translation.ts +++ b/fyo/utils/translation.ts @@ -90,6 +90,8 @@ export function t(...args: TranslationLiteral[]): string { return new TranslationString(...args).s; } -export function setLanguageMapOnTranslationString(languageMap: LanguageMap) { +export function setLanguageMapOnTranslationString( + languageMap: LanguageMap | undefined +) { TranslationString.prototype.languageMap = languageMap; } diff --git a/models/baseModels/Invoice/Invoice.ts b/models/baseModels/Invoice/Invoice.ts index 83c5b522..4d0311aa 100644 --- a/models/baseModels/Invoice/Invoice.ts +++ b/models/baseModels/Invoice/Invoice.ts @@ -18,8 +18,12 @@ export abstract class Invoice extends Doc { currency?: string; netTotal?: Money; baseGrandTotal?: Money; + outstandingAmount?: Money; exchangeRate?: number; + submitted?: boolean; + cancelled?: boolean; + abstract getPosting(): Promise; get isSales() { diff --git a/models/helpers.ts b/models/helpers.ts index 7d7a7154..72fa8a79 100644 --- a/models/helpers.ts +++ b/models/helpers.ts @@ -43,7 +43,7 @@ export function getTransactionActions(schemaName: string, fyo: Fyo): Action[] { const paymentType = isSales ? 'Receive' : 'Pay'; const hideAccountField = isSales ? 'account' : 'paymentAccount'; - const { openQuickEdit } = await import('../src/utils'); + const { openQuickEdit } = await import('src/utils/ui'); await openQuickEdit({ schemaName: 'Payment', name: payment.name as string, diff --git a/reports/GeneralLedger/viewConfig.js b/reports/GeneralLedger/viewConfig.js index db67cff1..09adff14 100644 --- a/reports/GeneralLedger/viewConfig.js +++ b/reports/GeneralLedger/viewConfig.js @@ -1,7 +1,33 @@ -import { partyWithAvatar } from '@/utils'; import { t } from 'fyo'; +import Avatar from 'src/components/Avatar.vue'; +import { fyo } from 'src/initFyo'; import getCommonExportActions from '../commonExporter'; +export function getPartyWithAvatar(partyName) { + return { + data() { + return { + imageURL: null, + label: null, + }; + }, + components: { + Avatar, + }, + async mounted() { + const p = await fyo.db.get('Party', partyName); + this.imageURL = p.image; + this.label = partyName; + }, + template: ` +
+ + {{ label }} +
+ `, + }; +} + let title = t`General Ledger`; const viewConfig = { @@ -117,7 +143,7 @@ const viewConfig = { fieldtype: 'Link', fieldname: 'party', component(cellValue) { - return partyWithAvatar(cellValue); + return getPartyWithAvatar(cellValue); }, }, ]; diff --git a/src/App.vue b/src/App.vue index 84986313..b324f3b0 100644 --- a/src/App.vue +++ b/src/App.vue @@ -30,16 +30,16 @@