diff --git a/src/components/card_categorie.vue b/src/components/card_categorie.vue
index 264e5d0..4feb936 100644
--- a/src/components/card_categorie.vue
+++ b/src/components/card_categorie.vue
@@ -33,7 +33,7 @@ export default {
'categories'
]),
...mapGetters('datas', [
- 'tag_filter_rows'
+ 'categorie_filter_rows'
]),
categorie () {
return this.categories[this.categoriename.toLowerCase()]
@@ -41,7 +41,7 @@ export default {
},
methods: {
filter_rows () {
- return this.tag_filter_rows([this.categorie.name])
+ return this.categorie_filter_rows([this.categorie.name])
},
total () {
return total(this.filter_rows())
diff --git a/src/libs/data_processing.js b/src/libs/data_processing.js
index 9c4217e..176aab4 100644
--- a/src/libs/data_processing.js
+++ b/src/libs/data_processing.js
@@ -1,17 +1,17 @@
import moment from 'moment'
-export function appendTag (row, keywords, field = 'Libellé') {
- // Append row.tag
+export function appendKeywordField (row, toField, keywords, fromField = 'Libellé') {
+ // Append row[toField] base on keywords
// if row.libellé contains one of words and not invert it gets tagged
// if row.libellé contains no words and invert it gets tagged
// according to keywords [{name: string, words: [], invert: bool}]
- row.tags = keywords.filter(k => {
- return strContains(row[field], k.words, k.invert)
+ row[toField] = keywords.filter(k => {
+ return strContains(row[fromField], k.words, k.invert)
})
}
function strContains (string, words, invert) {
// Does a string contain one of words or the opposite
- if (!words) {
+ if (words.length === 0) {
return true
}
if (invert) {
@@ -35,19 +35,19 @@ export function total (rows, field = 'Montant') {
return Math.round(sum)
}
-export function tagFilter (rows, tags, invert = false) {
- // filter rows by tags
+export function keywordFilter (rows, field, keywords, invert = false) {
+ // filter rows by keywords in rows[field]
// invert inverts the selection
return rows.filter(row => {
if (invert) {
- return tags.some(t => {
- return row.tags.map(t => t.name.toLowerCase())
- .indexOf(t.toLowerCase()) < 0
+ return keywords.some(kwd => {
+ return row[field].map(k => k.name.toLowerCase())
+ .indexOf(kwd.toLowerCase()) < 0
})
} else {
- return tags.every(t => {
- return row.tags.map(t => t.name.toLowerCase())
- .indexOf(t.toLowerCase()) > -1
+ return keywords.every(kwd => {
+ return row[field].map(k => k.name.toLowerCase())
+ .indexOf(kwd.toLowerCase()) > -1
})
}
})
diff --git a/src/store/modules/datas.js b/src/store/modules/datas.js
index 22fcb37..b53ad64 100644
--- a/src/store/modules/datas.js
+++ b/src/store/modules/datas.js
@@ -3,7 +3,7 @@ import Vue from 'vue'
import path from 'path'
import Papa from 'papaparse'
import moment from 'moment'
-import { appendTag, formatDate, tagFilter } from '../../libs/data_processing'
+import { appendKeywordField, formatDate, keywordFilter } from '../../libs/data_processing'
export default {
namespaced: true,
@@ -69,11 +69,33 @@ export default {
rows = getters.spending_rows
}
if (tags.length > 0) {
- return tagFilter(rows, tags, invert)
+ return keywordFilter(rows, 'tags', tags, invert)
} else {
if (invert) {
return rows.filter(r => {
- return r.tags.map(t => t.name.toLowerCase()).toString() === ['cb'].toString()
+ return r.tags.length === 0
+ })
+ } else {
+ return rows
+ }
+ }
+ },
+ categorie_filter_rows: (state, getters) => (categories, invert, dateFilter = true) => {
+ // return rows filtered by categories
+ // by default it filters rows by date
+ // to disable date filtering set date_filter to false
+ var rows
+ if (dateFilter) {
+ rows = getters.date_filter_rows
+ } else {
+ rows = getters.spending_rows
+ }
+ if (categories.length > 0) {
+ return keywordFilter(rows, 'categorie', categories, invert)
+ } else {
+ if (invert) {
+ return rows.filter(r => {
+ return r.categories.length === 0
})
} else {
return rows
@@ -103,7 +125,6 @@ export default {
// Set of month
return [...new Set(getters.rows.map(x => moment(x.Date).format('MMMM YYYY')))]
}
-
},
mutations: {
CLEAR_DATA: (state) => {
@@ -158,9 +179,11 @@ export default {
},
clean_store_data (context, { filename, parsed }) {
var tags = Object.values(context.rootGetters['config/tags'])
+ var categories = Object.values(context.rootGetters['config/categories'])
parsed.data = parsed.data.filter(x => x.Libellé !== undefined)
parsed.data.forEach(row => {
- appendTag(row, tags, 'Libellé')
+ appendKeywordField(row, 'tags', tags, 'Libellé')
+ appendKeywordField(row, 'categorie', categories, 'Libellé')
formatDate(row, 'Date')
})
diff --git a/src/views/home.vue b/src/views/home.vue
index 683ac1b..09d7a04 100644
--- a/src/views/home.vue
+++ b/src/views/home.vue
@@ -21,7 +21,7 @@
-
+
@@ -92,13 +92,13 @@ export default {
variant: 'info',
icon: 'file-invoice-dollar'
},
- tags_filter: []
+ categories_filter: []
}
},
computed: {
...mapGetters({
'csvs': 'datas/csvs',
- 'tag_filter_rows': 'datas/tag_filter_rows',
+ 'categorie_filter_rows': 'datas/categorie_filter_rows',
'datas_present': 'datas/present',
'month': 'datas/month',
'months': 'datas/months',
@@ -106,17 +106,17 @@ export default {
'categories': 'config/categories'
}),
filtered_rows () {
- return this.tag_filter_rows(this.tags_filter)
- },
+ return this.categorie_filter_rows(this.categories_filter)
+ }
},
methods: {
...mapActions('datas', [
'next_month',
- 'prev_month',
+ 'prev_month'
]),
- set_tags_filter (tagnames) {
- this.tags_filter = tagnames
- },
+ set_categories_filter (categorienames) {
+ this.categories_filter = categorienames
+ }
}
}