From f48a15d97d9ea614a01b01e24e44b05c9ea6ad5c Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 3 Dec 2019 15:53:54 +0530 Subject: [PATCH] fix: Report - Use inline-grid to make Row expand its parent - Custom component for columns - Avatar component - partyWithAvatar component in GeneralLedger - WithScroll renderless component to detect scroll - Fixed header with horizontal and vertical scroll in Report --- reports/GeneralLedger/viewConfig.js | 9 ++- reports/view.js | 2 +- src/components/Avatar.vue | 33 +++++++++++ src/components/Row.vue | 2 +- src/components/WithScroll.vue | 19 ++++++ src/pages/ListView/List.vue | 18 ++---- src/pages/Report.vue | 90 ++++++++++++++++++++--------- src/styles/index.css | 4 ++ src/utils.js | 25 ++++++++ 9 files changed, 156 insertions(+), 46 deletions(-) create mode 100644 src/components/Avatar.vue create mode 100644 src/components/WithScroll.vue diff --git a/reports/GeneralLedger/viewConfig.js b/reports/GeneralLedger/viewConfig.js index 8263f10d..7587a686 100644 --- a/reports/GeneralLedger/viewConfig.js +++ b/reports/GeneralLedger/viewConfig.js @@ -1,3 +1,5 @@ +import { partyWithAvatar } from '@/utils'; + let title = 'General Ledger'; const viewConfig = { @@ -137,7 +139,10 @@ const viewConfig = { { label: 'Party', fieldtype: 'Link', - fieldname: 'party' + fieldname: 'party', + component(cellValue) { + return partyWithAvatar(cellValue); + } }, { label: 'Description', @@ -148,4 +153,4 @@ const viewConfig = { } }; -module.exports = viewConfig; +export default viewConfig; diff --git a/reports/view.js b/reports/view.js index 83a4f5c8..4521777d 100644 --- a/reports/view.js +++ b/reports/view.js @@ -1,5 +1,5 @@ module.exports = { - 'general-ledger': require('./GeneralLedger/viewConfig'), + 'general-ledger': require('./GeneralLedger/viewConfig').default, 'sales-register': require('./SalesRegister/viewConfig'), 'purchase-register': require('./PurchaseRegister/viewConfig'), 'balance-sheet': require('./BalanceSheet/viewConfig'), diff --git a/src/components/Avatar.vue b/src/components/Avatar.vue new file mode 100644 index 00000000..021135b4 --- /dev/null +++ b/src/components/Avatar.vue @@ -0,0 +1,33 @@ + + + diff --git a/src/components/Row.vue b/src/components/Row.vue index 2ae0c6ae..eaea421e 100644 --- a/src/components/Row.vue +++ b/src/components/Row.vue @@ -1,5 +1,5 @@ diff --git a/src/components/WithScroll.vue b/src/components/WithScroll.vue new file mode 100644 index 00000000..31b9505d --- /dev/null +++ b/src/components/WithScroll.vue @@ -0,0 +1,19 @@ + diff --git a/src/pages/ListView/List.vue b/src/pages/ListView/List.vue index 6098fc15..c18a15b6 100644 --- a/src/pages/ListView/List.vue +++ b/src/pages/ListView/List.vue @@ -26,19 +26,7 @@ :key="doc.name" >
-
- -
- {{ doc.name[0] }} -
-
+
-
- -
- {{ column.label }} -
-
-
+
+
- - + {{ column.label }}
+ +
+ +
+ +
+
+
+
@@ -65,6 +73,7 @@ import PageHeader from '@/components/PageHeader'; import Button from '@/components/Button'; import SearchBar from '@/components/SearchBar'; import Row from '@/components/Row'; +import WithScroll from '@/components/WithScroll'; import FormControl from '@/components/Controls/FormControl'; import reportViewConfig from '@/../reports/view'; import throttle from 'lodash/throttle'; @@ -77,7 +86,8 @@ export default { Button, SearchBar, Row, - FormControl + FormControl, + WithScroll }, provide() { return { @@ -102,6 +112,9 @@ export default { await this.fetchReportData(); }, methods: { + onBodyScroll({ scrollLeft }) { + this.$refs.header.scrollLeft = scrollLeft; + }, async fetchReportData() { let data = await frappe.call({ method: this.report.method, @@ -147,11 +160,32 @@ export default { if (this.defaultFilters) { Object.assign(this.filters, this.defaultFilters); } + }, + + cellComponent(cellValue, column) { + if (typeof cellValue === 'object') { + // cellValue has a component definition + return cellValue; + } + if (column.component) { + // column has a component definition + return column.component(cellValue, column); + } + // default cell component + let formattedValue = frappe.format(cellValue, column); + return { + render(h) { + return h('span', formattedValue); + } + }; } }, computed: { report() { return reportViewConfig[this.reportName]; + }, + columnWidth() { + return 'minmax(7rem, 1fr)'; } } }; diff --git a/src/styles/index.css b/src/styles/index.css index 33371408..d3c2ba6d 100644 --- a/src/styles/index.css +++ b/src/styles/index.css @@ -31,6 +31,10 @@ html { display: grid; } +.inline-grid { + display: inline-grid; +} + .frappe-chart .chart-legend { display: none; } diff --git a/src/utils.js b/src/utils.js index 6874688c..a713ce43 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,4 +1,5 @@ import frappe from 'frappejs'; +import Avatar from '@/components/Avatar'; import { _ } from 'frappejs'; import { remote } from 'electron'; @@ -99,3 +100,27 @@ export function deleteDocWithPrompt(doc) { }); }); } + +export function partyWithAvatar(party) { + return { + data() { + return { + imageURL: null, + label: null + }; + }, + components: { + Avatar + }, + async mounted() { + this.imageURL = await frappe.db.getValue('Party', party, 'image'); + this.label = party; + }, + template: ` +
+ + {{ label }} +
+ ` + }; +}