Skip to content

Commit

Permalink
fix(ui): a few route issues with common docs
Browse files Browse the repository at this point in the history
  • Loading branch information
18alantom committed Jan 9, 2023
1 parent 694268f commit 4aa9245
Show file tree
Hide file tree
Showing 16 changed files with 253 additions and 73 deletions.
4 changes: 2 additions & 2 deletions fyo/model/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { DocValue, DocValueMap } from 'fyo/core/types';
import SystemSettings from 'fyo/models/SystemSettings';
import { FieldType, Schema, SelectOption } from 'schemas/types';
import { QueryFilter } from 'utils/db/types';
import { Router } from 'vue-router';
import { RouteLocationRaw, Router } from 'vue-router';
import { Doc } from './doc';

/**
Expand Down Expand Up @@ -87,7 +87,7 @@ export interface ColumnConfig {

export type ListViewColumn = string | ColumnConfig;
export interface ListViewSettings {
formRoute?: (name: string) => string;
formRoute?: (doc: Doc) => RouteLocationRaw;
columns?: ListViewColumn[];
}

Expand Down
1 change: 1 addition & 0 deletions models/baseModels/Item/Item.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { AccountRootTypeEnum, AccountTypeEnum } from '../Account/types';
export class Item extends Doc {
trackItem?: boolean;
itemType?: 'Product' | 'Service';
for?: 'Purchases' | 'Sales' | 'Both';

formulas: FormulaMap = {
incomeAccount: {
Expand Down
9 changes: 5 additions & 4 deletions models/baseModels/JournalEntry/JournalEntry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ import {
Action,
DefaultMap,
FiltersMap,
ListViewSettings
ListViewSettings,
} from 'fyo/model/types';
import { DateTime } from 'luxon';
import {
getDocStatus,
getLedgerLinkAction,
getNumberSeries, getStatusText,
statusColor
getNumberSeries,
getStatusText,
statusColor,
} from 'models/helpers';
import { Transactional } from 'models/Transactional/Transactional';
import { Money } from 'pesa';
Expand Down Expand Up @@ -53,7 +54,7 @@ export class JournalEntry extends Transactional {

static getListViewSettings(): ListViewSettings {
return {
formRoute: (name) => `/edit/JournalEntry/${name}`,
formRoute: ({ name }) => `/edit/JournalEntry/${name}`,
columns: [
'name',
{
Expand Down
2 changes: 1 addition & 1 deletion models/baseModels/PurchaseInvoice/PurchaseInvoice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export class PurchaseInvoice extends Invoice {

static getListViewSettings(): ListViewSettings {
return {
formRoute: (name) => `/edit/PurchaseInvoice/${name}`,
formRoute: ({ name }) => `/edit/PurchaseInvoice/${name}`,
columns: [
'name',
getTransactionStatusColumn(),
Expand Down
2 changes: 1 addition & 1 deletion models/baseModels/SalesInvoice/SalesInvoice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export class SalesInvoice extends Invoice {

static getListViewSettings(): ListViewSettings {
return {
formRoute: (name) => `/edit/SalesInvoice/${name}`,
formRoute: ({ name }) => `/edit/SalesInvoice/${name}`,
columns: [
'name',
getTransactionStatusColumn(),
Expand Down
2 changes: 1 addition & 1 deletion models/inventory/PurchaseReceipt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export class PurchaseReceipt extends StockTransfer {

static getListViewSettings(): ListViewSettings {
return {
formRoute: (name) => `/edit/PurchaseReceipt/${name}`,
formRoute: ({ name }) => `/edit/PurchaseReceipt/${name}`,
columns: [
'name',
getTransactionStatusColumn(),
Expand Down
2 changes: 1 addition & 1 deletion models/inventory/Shipment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export class Shipment extends StockTransfer {

static getListViewSettings(): ListViewSettings {
return {
formRoute: (name) => `/edit/Shipment/${name}`,
formRoute: ({ name }) => `/edit/Shipment/${name}`,
columns: [
'name',
getTransactionStatusColumn(),
Expand Down
4 changes: 2 additions & 2 deletions src/components/Widgets/LinkedEntryWidget.vue
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@

<script lang="ts">
import { Money } from 'pesa';
import { getEntryRoute } from 'src/router';
import { getCreateRoute } from 'src/router';
import { getStatus, routeTo } from 'src/utils/ui';
import { defineComponent, PropType } from 'vue';
import Button from '../Button.vue';
Expand All @@ -80,7 +80,7 @@ export default defineComponent({
methods: {
getStatus,
async openEntry(name: string) {
const route = getEntryRoute(this.linked.schemaName, name);
const route = getCreateRoute(this.linked.schemaName, name);
await routeTo(route);
},
},
Expand Down
15 changes: 2 additions & 13 deletions src/pages/ListView/List.vue
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
<Row
gap="1rem"
class="cursor-pointer text-gray-900 flex-1 border-none h-row-mid"
@click="openForm(doc)"
@click="$emit('openDoc', doc.name)"
:columnCount="columns.length"
>
<ListCell
Expand Down Expand Up @@ -103,7 +103,7 @@ import ListCell from './ListCell';
export default defineComponent({
name: 'List',
props: { listConfig: Object, filters: Object, schemaName: String },
emits: ['makeNewDoc', 'updatedData'],
emits: ['openDoc', 'makeNewDoc', 'updatedData'],
components: {
Row,
ListCell,
Expand Down Expand Up @@ -180,17 +180,6 @@ export default defineComponent({
fyo.db.observer.on(`delete:${this.schemaName}`, listener);
fyo.doc.observer.on(`rename:${this.schemaName}`, listener);
},
openForm(doc) {
if (this.listConfig.formRoute) {
routeTo(this.listConfig.formRoute(doc.name));
return;
}
openQuickEdit({
schemaName: this.schemaName,
name: doc.name,
});
},
async updateData(filters) {
if (!filters) {
filters = { ...this.filters };
Expand Down
41 changes: 33 additions & 8 deletions src/pages/ListView/ListView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
:listConfig="listConfig"
:filters="filters"
class="flex-1 flex h-full"
@openDoc="openDoc"
@updatedData="updatedData"
@makeNewDoc="makeNewDoc"
/>
Expand All @@ -44,8 +45,12 @@ import FilterDropdown from 'src/components/FilterDropdown.vue';
import Modal from 'src/components/Modal.vue';
import PageHeader from 'src/components/PageHeader.vue';
import { fyo } from 'src/initFyo';
import { docsPathMap, getCreateFiltersFromListViewFilters } from 'src/utils/misc';
import { docsPath, routeTo } from 'src/utils/ui';
import { getRouteData } from 'src/utils/filters';
import {
docsPathMap,
getCreateFiltersFromListViewFilters,
} from 'src/utils/misc';
import { docsPath, openQuickEdit, routeTo } from 'src/utils/ui';
import List from './List.vue';
export default {
Expand Down Expand Up @@ -89,32 +94,52 @@ export default {
updatedData(listFilters) {
this.listFilters = listFilters;
},
async openDoc(name) {
const doc = await this.fyo.doc.getDoc(this.schemaName, name);
if (this.listConfig.formRoute) {
return await routeTo(this.listConfig.formRoute(doc));
}
const { routeFilter } = getRouteData({ doc });
openQuickEdit({
doc,
listFilters: routeFilter,
});
},
async makeNewDoc() {
const filters = getCreateFiltersFromListViewFilters(this.filters ?? {});
const doc = fyo.doc.getNewDoc(this.schemaName, filters);
const path = this.getFormPath(doc.name);
const path = this.getFormPath(doc);
await routeTo(path);
doc.on('afterSync', () => {
const path = this.getFormPath(doc.name);
const path = this.getFormPath(doc);
this.$router.replace(path);
});
},
applyFilter(filters) {
this.$refs.list.updateData(filters);
},
getFormPath(name) {
getFormPath(doc) {
const { label, routeFilter } = getRouteData({ doc });
let path = {
path: `/list/${this.schemaName}`,
path: `/list/${this.schemaName}/${label}`,
query: {
edit: 1,
schemaName: this.schemaName,
name,
name: doc.name,
filters: JSON.stringify(routeFilter),
},
};
if (this.listConfig.formRoute) {
path = this.listConfig.formRoute(name);
path = this.listConfig.formRoute(doc);
}
if (typeof path === 'object') {
return path;
}
// Maintain filter if present
Expand Down
12 changes: 10 additions & 2 deletions src/router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,12 @@ import PrintView from 'src/pages/PrintView/PrintView.vue';
import QuickEditForm from 'src/pages/QuickEditForm.vue';
import Report from 'src/pages/Report.vue';
import Settings from 'src/pages/Settings/Settings.vue';
import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
import {
createRouter,
createWebHistory,
RouteLocationRaw,
RouteRecordRaw,
} from 'vue-router';

function getGeneralFormItems(): RouteRecordRaw[] {
return [ModelNameEnum.Shipment, ModelNameEnum.PurchaseReceipt].map(
Expand Down Expand Up @@ -151,7 +156,10 @@ const routes: RouteRecordRaw[] = [
},
];

export function getEntryRoute(schemaName: string, name: string) {
export function getCreateRoute(
schemaName: string,
name: string
): RouteLocationRaw {
if (
[
ModelNameEnum.SalesInvoice,
Expand Down
124 changes: 124 additions & 0 deletions src/utils/filters.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
import { t } from 'fyo';
import type { Doc } from 'fyo/model/doc';
import { ValueError } from 'fyo/utils/errors';
import type { Item } from 'models/baseModels/Item/Item';
import type { Party } from 'models/baseModels/Party/Party';
import type { Payment } from 'models/baseModels/Payment/Payment';
import { ModelNameEnum } from 'models/types';
import { fyo } from 'src/initFyo';

export const routeFilters = {
SalesItems: { for: ['in', ['Sales', 'Both']] },
PurchaseItems: { for: ['in', ['Purchases', 'Both']] },
Items: { for: 'Both' },
PurchasePayments: { paymentType: 'Pay' },
SalesPayments: { paymentType: 'Receive' },
Suppliers: { role: ['in', ['Supplier', 'Both']] },
Customers: { role: ['in', ['Customer', 'Both']] },
Party: { role: 'Both' },
};

export const createFilters = {
SalesItems: { for: 'Sales' },
PurchaseItems: { for: 'Purchases' },
Items: { for: 'Both' },
PurchasePayments: { paymentType: 'Pay' },
SalesPayments: { paymentType: 'Receive' },
Suppliers: { role: 'Supplier' },
Customers: { role: 'Customer' },
Party: { role: 'Both' },
};

export function getRouteData({ doc, uiname }: { doc?: Doc; uiname?: string }) {
if (doc) {
uiname = getUiName(doc);
}
console.log(uiname);

if (!uiname) {
throw new ValueError(`Doc and uiname not passed to getFilters`);
}

const routeFilter = routeFilters[uiname as keyof typeof routeFilters] ?? {};
const createFilter =
createFilters[uiname as keyof typeof createFilters] ?? {};
const label = getLabelName(uiname);

return { routeFilter, createFilter, label };
}

function getLabelName(uiname: string) {
const labels = {
SalesItems: t`Sales Items`,
PurchaseItems: t`Purchase Items`,
Items: t`Items`,
Suppliers: t`Suppliers`,
Customers: t`Customers`,
Party: t`Party`,
PurchasePayments: t`Purchase Payments`,
SalesPayments: t`Sales Payments`,
};

return labels[uiname as keyof typeof labels] ?? fyo.schemaMap[uiname]?.label;
}

function getUiName(doc: Doc) {
const isDual = [
ModelNameEnum.Party,
ModelNameEnum.Payment,
ModelNameEnum.Item,
].includes(doc.schemaName as ModelNameEnum);

if (!isDual) {
return doc.schemaName;
}

if (doc.schemaName === ModelNameEnum.Party) {
return getPartyUiName(doc as Party);
}

if (doc.schemaName === ModelNameEnum.Payment) {
return getPaymentUiName(doc as Payment);
}

if (doc.schemaName === ModelNameEnum.Item) {
return getItemUiName(doc as Item);
}

return doc.schemaName;
}

function getPartyUiName(doc: Party) {
switch (doc.role) {
case 'Customer':
return 'Customers';
case 'Supplier':
return 'Suppliers';
default:
return doc.schemaName;
}
}

function getPaymentUiName(doc: Payment) {
switch (doc.paymentType) {
case 'Pay':
return 'PurchasePayments';
case 'Receive':
return 'SalesPayments';
default:
return doc.schemaName;
}
}

function getItemUiName(doc: Item) {
switch (doc.for) {
case 'Purchases':
return 'PurchaseItems';
case 'Sales':
return 'SalesItems';
case 'Both':
return 'Items';
default:
return doc.schemaName;
}
}
Loading

0 comments on commit 4aa9245

Please sign in to comment.