Moves taxonomies list and term usage charts to separate components. #483

This commit is contained in:
mateuswetah 2021-03-25 18:12:13 -03:00
parent fd1610ebcd
commit ed7376eca3
11 changed files with 436 additions and 323 deletions

View File

@ -16,5 +16,34 @@
padding: 0; } padding: 0; }
#tainacan-reports-app .columns .column .postbox { #tainacan-reports-app .columns .column .postbox {
margin: 0.75rem; } margin: 0.75rem; }
#tainacan-reports-app .postbox {
padding: 1.125rem 1.25rem;
margin-bottom: 0;
height: 100%;
min-height: 380px;
background-color: var(--tainacan-block-gray0, #f6f6f6); }
#tainacan-reports-app .postbox label {
font-weight: bold;
font-size: 0.875rem; }
#tainacan-reports-app .postbox.metadata-distribution-box {
margin: 0px 0px 0.75rem 1.5rem !important;
overflow-y: auto; }
#tainacan-reports-app .postbox .box-header {
display: flex;
align-items: baseline;
justify-content: space-between;
flex-wrap: wrap; }
#tainacan-reports-app .postbox .box-header .box-header__item {
margin-bottom: 10px; }
#tainacan-reports-app .graph-mode-switch {
display: inline-block; }
#tainacan-reports-app .graph-mode-switch button {
border: none !important;
background: none !important;
box-shadow: none !important;
padding: 0;
cursor: pointer; }
#tainacan-reports-app .graph-mode-switch button.current {
color: var(--wp-admin-theme-color, #007cba); }
/*# sourceMappingURL=tainacan-reports.css.map */ /*# sourceMappingURL=tainacan-reports.css.map */

View File

@ -1,6 +1,6 @@
{ {
"version": 3, "version": 3,
"mappings": "AAAA,qBAAsB;EAClB,OAAO,EAAE,iBAAiB;EAC1B,MAAM,EAAE,CAAC;EAGT,4CAAuB;IACnB,OAAO,EAAE,GAAG;EAGhB,6BAAQ;IACJ,MAAM,EAAE,OAAO;EAGnB,wCAAmB;IACf,aAAa,EAAE,IAAI;EAGvB,8BAAS;IACL,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,UAAU;IACvB,eAAe,EAAE,MAAM;IAEvB,sCAAQ;MACJ,SAAS,EAAE,IAAI;MACf,OAAO,EAAE,CAAC;MAEV,+CAAS;QACL,MAAM,EAAE,OAAO", "mappings": "AAAA,qBAAsB;EAClB,OAAO,EAAE,iBAAiB;EAC1B,MAAM,EAAE,CAAC;EAGT,4CAAuB;IACnB,OAAO,EAAE,GAAG;EAGhB,6BAAQ;IACJ,MAAM,EAAE,OAAO;EAGnB,wCAAmB;IACf,aAAa,EAAE,IAAI;EAGvB,8BAAS;IACL,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,UAAU;IACvB,eAAe,EAAE,MAAM;IAEvB,sCAAQ;MACJ,SAAS,EAAE,IAAI;MACf,OAAO,EAAE,CAAC;MAEV,+CAAS;QACL,MAAM,EAAE,OAAO;EAK3B,8BAAS;IACL,OAAO,EAAE,gBAAgB;IACzB,aAAa,EAAE,CAAC;IAChB,MAAM,EAAE,IAAI;IACZ,UAAU,EAAE,KAAK;IACjB,gBAAgB,EAAE,oCAAoC;IAEtD,oCAAM;MACF,WAAW,EAAE,IAAI;MACjB,SAAS,EAAE,QAAQ;IAEvB,wDAA4B;MACxB,MAAM,EAAE,iCAAiC;MACzC,UAAU,EAAE,IAAI;IAGpB,0CAAY;MACR,OAAO,EAAE,IAAI;MACb,WAAW,EAAE,QAAQ;MACrB,eAAe,EAAE,aAAa;MAC9B,SAAS,EAAE,IAAI;MAEf,4DAAkB;QACd,aAAa,EAAE,IAAI;EAI/B,wCAAmB;IACf,OAAO,EAAE,YAAY;IACrB,+CAAO;MACH,MAAM,EAAE,eAAe;MACvB,UAAU,EAAE,eAAe;MAC3B,UAAU,EAAE,eAAe;MAC3B,OAAO,EAAE,CAAC;MACV,MAAM,EAAE,OAAO;MAEf,uDAAU;QACN,KAAK,EAAE,oCAAoC",
"sources": ["../../views/reports/tainacan-reports.scss"], "sources": ["../../views/reports/tainacan-reports.scss"],
"names": [], "names": [],
"file": "tainacan-reports.css" "file": "tainacan-reports.css"

View File

@ -18,6 +18,10 @@ export const getTaxonomiesList = state => {
return state.taxonomiesList; return state.taxonomiesList;
}; };
export const getIsFetchingTaxonomiesList = state => {
return state.isFetchingTaxomiesList;
};
export const getTaxonomyTerms = state => { export const getTaxonomyTerms = state => {
return state.taxonomyTerms; return state.taxonomyTerms;
}; };

View File

@ -5,6 +5,7 @@ import * as mutations from './mutations';
const state = { const state = {
summary: {}, summary: {},
taxonomiesList: {}, taxonomiesList: {},
isFetchingTaxonomiesList: false,
colletionsList: {}, colletionsList: {},
taxonomyTerms: {}, taxonomyTerms: {},
metadata: {}, metadata: {},

View File

@ -18,6 +18,10 @@ export const setTaxonomiesList = (state, taxonomiesList) => {
state.taxonomiesList = taxonomiesList; state.taxonomiesList = taxonomiesList;
}; };
export const setIsFetchingTaxonomiesList = (state, isFetchingTaxomiesList) => {
return state.isFetchingTaxomiesList = isFetchingTaxomiesList;
};
export const setTaxonomyTerms = (state, taxonomyTerms) => { export const setTaxonomyTerms = (state, taxonomyTerms) => {
state.taxonomyTerms = taxonomyTerms; state.taxonomyTerms = taxonomyTerms;
}; };

View File

@ -0,0 +1,228 @@
<template>
<div
v-if="taxonomiesList != undefined"
class="column is-full">
<div class="postbox">
<div class="box-header">
<div class="box-header__item">
<label
v-if="!isFetchingTaxonomiesList"
for="select_taxonomies">
{{ $i18n.get('label_items_per_term_from_taxonomy') }}&nbsp;
</label>
<select
v-if="!isFetchingTaxonomiesList"
name="select_taxonomies"
id="select_taxonomies"
:placeholder="$i18n.get('label_select_a_taxonomy')"
v-model="selectedTaxonomy">
<option
v-for="(taxonomy, index) of taxonomiesListArray"
:key="index"
:value="taxonomy">
{{ taxonomy.name + ' (' + taxonomy.total_terms + ' ' + ( taxonomy.total_terms == 1 ? $i18n.get('term') : $i18n.get('terms') ) + ')' }}
</option>
</select>
</div>
<div
v-if="selectedTaxonomy && selectedTaxonomy.id"
class="box-header__item">
<label for="max_terms">Termos por página:</label>
<input
type="number"
step="1"
min="1"
max="999"
class="screen-per-page"
name="max_terms"
id="max_terms"
maxlength="3"
:disabled="isBuildingTaxonomyTermsChart"
v-model.number="maxTermsToDisplay">
</div>
<div
v-if="selectedTaxonomy && selectedTaxonomy.id"
class="box-header__item tablenav-pages">
<span class="displaying-num">{{ selectedTaxonomy.total_terms + ' ' + $i18n.get('terms') }}</span>
<span class="pagination-links">
<span
@click="!isBuildingTaxonomyTermsChart ? termsDisplayedPage = 1 : null"
:class="{'tablenav-pages-navspan disabled' : termsDisplayedPage <= 1 || isBuildingTaxonomyTermsChart}"
class="first-page button"
aria-hidden="true">
«
</span>
<span
@click="(termsDisplayedPage > 1 && !isBuildingTaxonomyTermsChart) ? termsDisplayedPage-- : null"
:class="{'tablenav-pages-navspan disabled' : termsDisplayedPage <= 1 || isBuildingTaxonomyTermsChart}"
class="prev-page button"
aria-hidden="true">
</span>
<span class="paging-input">
<label
for="current-page-selector"
class="screen-reader-text">
{{ $i18n.get('label_current_page') }}
</label>
<input
class="current-page"
id="current-page-selector"
type="number"
step="1"
min="1"
:disabled="isBuildingTaxonomyTermsChart || maxTermsToDisplay >= selectedTaxonomy.total_terms"
:max="Math.ceil(selectedTaxonomy.total_terms/maxTermsToDisplay)"
name="paged"
v-model.number="termsDisplayedPage"
size="1"
aria-describedby="table-paging">
<span class="tablenav-paging-text"> de <span class="total-pages">{{ Math.ceil(selectedTaxonomy.total_terms/maxTermsToDisplay) }}</span></span>
</span>
<span
@click="(!isBuildingTaxonomyTermsChart && termsDisplayedPage < Math.ceil(selectedTaxonomy.total_terms/maxTermsToDisplay)) ? termsDisplayedPage++ : null"
:class="{'tablenav-pages-navspan disabled' : isBuildingTaxonomyTermsChart || termsDisplayedPage >= Math.ceil(selectedTaxonomy.total_terms/maxTermsToDisplay) }"
aria-hidden="true"
class="next-page button">
</span>
<span
@click="!isBuildingTaxonomyTermsChart ? termsDisplayedPage = Math.ceil(selectedTaxonomy.total_terms/maxTermsToDisplay) : null"
:class="{'tablenav-pages-navspan disabled': isBuildingTaxonomyTermsChart || termsDisplayedPage >= Math.ceil(selectedTaxonomy.total_terms/maxTermsToDisplay) }"
class="last-page button"
aria-hidden="true">
»
</span>
</span>
</div>
</div>
<apexchart
v-if="!isFetchingTaxonomiesList && !isFetchingTaxonomyTerms && selectedTaxonomy && selectedTaxonomy.id"
height="380px"
:series="taxonomyTermsChartSeries"
:options="taxonomyTermsChartOptions" />
<div
v-else
style="min-height=380px"
class="skeleton postbox" />
</div>
</div>
</template>
<script>
import { mapActions, mapGetters } from 'vuex';
export default {
data() {
return {
isFetchingTaxonomyTerms: false,
isBuildingTaxonomyTermsChart: false,
selectedTaxonomy: {},
maxTermsToDisplay: 64,
termsDisplayedPage: 1,
taxonomyTermsChartSeries: [],
taxonomyTermsChartOptions: {},
}
},
computed: {
...mapGetters('report', {
isFetchingTaxonomiesList: 'getIsFetchingTaxonomiesList',
taxonomyTerms: 'getTaxonomyTerms',
taxonomiesList: 'getTaxonomiesList',
stackedBarChartOptions: 'getStackedBarChartOptions',
}),
taxonomiesListArray() {
return this.taxonomiesList && this.taxonomiesList != undefined ? Object.values(this.taxonomiesList) : [];
},
},
watch: {
taxonomiesListArray: {
handler() {
if (this.taxonomiesListArray && this.taxonomiesListArray.length)
this.selectedTaxonomy = this.taxonomiesListArray[0];
},
immediate: true
},
selectedTaxonomy() {
this.termsDisplayedPage = 1;
if (this.selectedTaxonomy && this.selectedTaxonomy.id)
this.loadTaxonomyTerms();
},
termsDisplayedPage() {
this.buildTaxonomyTermsChart();
},
maxTermsToDisplay() {
this.termsDisplayedPage = 1;
this.buildTaxonomyTermsChart();
}
},
methods: {
...mapActions('report', [
'fetchTaxonomyTerms'
]),
buildTaxonomyTermsChart() {
this.isBuildingTaxonomyTermsChart = true;
// Building Taxonomy term usage chart
let orderedTerms = Object.values(this.taxonomyTerms).sort((a, b) => b.count - a.count);
orderedTerms = orderedTerms.slice((this.termsDisplayedPage - 1) * this.maxTermsToDisplay, ((this.termsDisplayedPage - 1) * this.maxTermsToDisplay) + this.maxTermsToDisplay);
let termsValues = [];
let termsLabels = [];
orderedTerms.forEach(term => {
termsValues.push(term.count);
termsLabels.push(term.name);
});
this.taxonomyTermsChartSeries = [
{
name: this.$i18n.get('label_terms_used'),
data: termsValues
}
];
this.taxonomyTermsChartOptions = {
...this.stackedBarChartOptions,
...{
title: {},
xaxis: {
type: 'category',
tickPlacement: 'on',
categories: termsLabels,
labels: {
show: true,
trim: true,
hideOverlappingLabels: false
},
tooltip: true
},
yaxis: {
title: {
text: this.$i18n.get('label_number_of_items')
}
},
animations: {
enabled: orderedTerms.length <= 40
}
}
}
setTimeout(() => {
this.isBuildingTaxonomyTermsChart = false;
}, 500);
},
loadTaxonomyTerms() {
this.isFetchingTaxonomyTerms = true;
this.fetchTaxonomyTerms(this.selectedTaxonomy.id)
.then(() => {
this.buildTaxonomyTermsChart();
this.isFetchingTaxonomyTerms = false;
})
.catch(() => this.isFetchingTaxonomyTerms = false);
}
}
}
</script>

View File

@ -74,7 +74,7 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.number-block { .number-block {
min-height: 210px; min-height: 210px !important;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;

View File

@ -0,0 +1,110 @@
<template>
<div
v-if="taxonomiesList != undefined"
class="column is-full">
<apexchart
v-if="!isFetchingTaxonomiesList"
height="380px"
class="postbox"
:series="taxonomiesListChartSeries"
:options="taxonomiesListChartOptions" />
<div
v-else
style="min-height=380px"
class="skeleton postbox" />
</div>
</template>
<script>
import { mapActions, mapMutations, mapGetters } from 'vuex';
export default {
data() {
return {
isFetchingTaxonomiesList: false,
taxonomiesListChartSeries: [],
taxonomiesListChartOptions: {},
}
},
computed: {
...mapGetters('report', {
taxonomiesList: 'getTaxonomiesList',
stackedBarChartOptions: 'getStackedBarChartOptions',
isFetchingTaxonomiesList: 'getIsFetchingTaxonomiesList',
}),
taxonomiesListArray() {
return this.taxonomiesList && this.taxonomiesList != undefined ? Object.values(this.taxonomiesList) : [];
},
},
watch: {
},
mounted() {
this.loadTaxonomiesList();
},
methods: {
...mapActions('report', [
'fetchTaxonomiesList'
]),
...mapMutations('report', [
'setIsFetchingTaxonomiesList'
]),
loadTaxonomiesList() {
this.setIsFetchingTaxonomiesList(true);
this.fetchTaxonomiesList()
.then(() => {
// Building Taxonomy term usage chart
const orderedTaxonomies = this.taxonomiesListArray.sort((a, b) => b.total_terms - a.total_terms);
let termsUsed = [];
let termsNotUsed = [];
let taxonomiesLabels = [];
orderedTaxonomies.forEach(taxonomy => {
termsUsed.push(taxonomy.total_terms_used);
termsNotUsed.push(taxonomy.total_terms_not_used);
taxonomiesLabels.push(taxonomy.name);
});
this.taxonomiesListChartSeries = [
{
name: this.$i18n.get('label_terms_used'),
data: termsUsed
},
{
name: this.$i18n.get('label_terms_not_used'),
data: termsNotUsed
}
];
this.taxonomiesListChartOptions = {
...this.stackedBarChartOptions,
...{
title: {
text: this.$i18n.get('label_usage_of_terms_per_taxonomy')
},
xaxis: {
type: 'category',
tickPlacement: 'on',
categories: taxonomiesLabels,
labels: {
show: true,
trim: true,
hideOverlappingLabels: false
},
tooltip: true
},
yaxis: {
title: {
text: this.$i18n.get('label_number_of_terms')
}
}
}
}
this.setIsFetchingTaxonomiesList(true);
})
.catch(() => this.setIsFetchingTaxonomiesList(false));
},
}
}
</script>

View File

@ -16,6 +16,8 @@ Vue.config.devtools = process && process.env && process.env.NODE_ENV === 'develo
import ReportsPage from '../reports.vue'; import ReportsPage from '../reports.vue';
import NumberBlock from '../components/number-block.vue'; import NumberBlock from '../components/number-block.vue';
import ItemsPerTermBlock from '../components/items-per-term-block.vue';
import TermsPerTaxonomyBlock from '../components/terms-per-taxonomy-block.vue';
Vue.use(VueApexCharts) Vue.use(VueApexCharts)
@ -37,6 +39,8 @@ Vue.use(Snackbar);
Vue.use(Modal); Vue.use(Modal);
Vue.component('number-block', NumberBlock); Vue.component('number-block', NumberBlock);
Vue.component('items-per-term-block', ItemsPerTermBlock);
Vue.component('terms-per-taxonomy-block', TermsPerTaxonomyBlock);
Vue.component('apexchart', VueApexCharts); Vue.component('apexchart', VueApexCharts);
// Changing title of pages // Changing title of pages

View File

@ -70,124 +70,13 @@
style="min-height=380px" style="min-height=380px"
class="skeleton postbox" /> class="skeleton postbox" />
</div> </div>
<div
v-if="!selectedCollection || selectedCollection == 'default'" <terms-per-taxonomy-block
class="column is-full"> v-if="!selectedCollection || selectedCollection == 'default'"/>
<apexchart
v-if="!isFetchingTaxonomiesList" <items-per-term-block
height="380px" v-if="!selectedCollection || selectedCollection == 'default'" />
class="postbox"
:series="taxonomiesListChartSeries"
:options="taxonomiesListChartOptions" />
<div
v-else
style="min-height=380px"
class="skeleton postbox" />
</div>
<div
v-if="taxonomiesList != undefined && (!selectedCollection || selectedCollection == 'default')"
class="column is-full">
<div class="postbox">
<div class="box-header">
<div class="box-header__item">
<label for="select_taxonomies">{{ $i18n.get('label_items_per_term_from_taxonomy') }}&nbsp;</label>
<select
v-if="!isFetchingTaxonomiesList"
name="select_taxonomies"
id="select_taxonomies"
:placeholder="$i18n.get('label_select_a_taxonomy')"
v-model="selectedTaxonomy">
<option
v-for="(taxonomy, index) of taxonomiesListArray"
:key="index"
:value="taxonomy">
{{ taxonomy.name + ' (' + taxonomy.total_terms + ' ' + ( taxonomy.total_terms == 1 ? $i18n.get('term') : $i18n.get('terms') ) + ')' }}
</option>
</select>
</div>
<div
v-if="selectedTaxonomy && selectedTaxonomy.id"
class="box-header__item">
<label for="max_terms">Termos por página:</label>
<input
type="number"
step="1"
min="1"
max="999"
class="screen-per-page"
name="max_terms"
id="max_terms"
maxlength="3"
:disabled="isBuildingTaxonomyTermsChart"
v-model.number="maxTermsToDisplay">
</div>
<div
v-if="selectedTaxonomy && selectedTaxonomy.id"
class="box-header__item tablenav-pages">
<span class="displaying-num">{{ selectedTaxonomy.total_terms + ' ' + $i18n.get('terms') }}</span>
<span class="pagination-links">
<span
@click="!isBuildingTaxonomyTermsChart ? termsDisplayedPage = 1 : null"
:class="{'tablenav-pages-navspan disabled' : termsDisplayedPage <= 1 || isBuildingTaxonomyTermsChart}"
class="first-page button"
aria-hidden="true">
«
</span>
<span
@click="(termsDisplayedPage > 1 && !isBuildingTaxonomyTermsChart) ? termsDisplayedPage-- : null"
:class="{'tablenav-pages-navspan disabled' : termsDisplayedPage <= 1 || isBuildingTaxonomyTermsChart}"
class="prev-page button"
aria-hidden="true">
</span>
<span class="paging-input">
<label
for="current-page-selector"
class="screen-reader-text">
{{ $i18n.get('label_current_page') }}
</label>
<input
class="current-page"
id="current-page-selector"
type="number"
step="1"
min="1"
:disabled="isBuildingTaxonomyTermsChart"
:max="Math.ceil(selectedTaxonomy.total_terms/maxTermsToDisplay)"
name="paged"
v-model.number="termsDisplayedPage"
size="1"
aria-describedby="table-paging">
<span class="tablenav-paging-text"> de <span class="total-pages">{{ Math.ceil(selectedTaxonomy.total_terms/maxTermsToDisplay) }}</span></span>
</span>
<span
@click="(!isBuildingTaxonomyTermsChart && termsDisplayedPage < Math.ceil(selectedTaxonomy.total_terms/maxTermsToDisplay)) ? termsDisplayedPage++ : null"
:class="{'tablenav-pages-navspan disabled' : isBuildingTaxonomyTermsChart || termsDisplayedPage >= Math.ceil(selectedTaxonomy.total_terms/maxTermsToDisplay) }"
aria-hidden="true"
class="next-page button">
</span>
<span
@click="!isBuildingTaxonomyTermsChart ? termsDisplayedPage = Math.ceil(selectedTaxonomy.total_terms/maxTermsToDisplay) : null"
:class="{'tablenav-pages-navspan disabled': isBuildingTaxonomyTermsChart || termsDisplayedPage >= Math.ceil(selectedTaxonomy.total_terms/maxTermsToDisplay) }"
class="last-page button"
aria-hidden="true">
»
</span>
</span>
</div>
</div>
<apexchart
v-if="!isFetchingTaxonomiesList && !isFetchingTaxonomyTerms && selectedTaxonomy && selectedTaxonomy.id"
height="380px"
:series="taxonomyTermsChartSeries"
:options="taxonomyTermsChartOptions" />
<div
v-else
style="min-height=380px"
class="skeleton postbox" />
</div>
</div>
<template v-if="selectedCollection && selectedCollection != 'default'"> <template v-if="selectedCollection && selectedCollection != 'default'">
<div class="column is-full"> <div class="column is-full">
<div <div
@ -292,36 +181,26 @@ export default {
data() { data() {
return { return {
selectedCollection: 'default', selectedCollection: 'default',
selectedTaxonomy: {},
selectedMetadatum: '', selectedMetadatum: '',
isFetchingCollections: false, isFetchingCollections: false,
isFetchingSummary: false, isFetchingSummary: false,
isFetchingCollectionsList: false, isFetchingCollectionsList: false,
isFetchingTaxonomiesList: false,
isFetchingTaxonomyTerms: false,
isFetchingMetadata: false, isFetchingMetadata: false,
isBuildingMetadataTypeChart: false, isBuildingMetadataTypeChart: false,
isBuildingTaxonomyTermsChart: false,
isFetchingMetadataList: false, isFetchingMetadataList: false,
isFetchingActivities: false, isFetchingActivities: false,
collectionsListChartSeries: [], collectionsListChartSeries: [],
collectionsListChartOptions: {}, collectionsListChartOptions: {},
taxonomiesListChartSeries: [],
taxonomiesListChartOptions: {},
metadataListChartSeries: [], metadataListChartSeries: [],
metadataListChartOptions: {}, metadataListChartOptions: {},
metadataTypeChartMode: 'bar', metadataTypeChartMode: 'bar',
taxonomyTermsChartSeries: [],
taxonomyTermsChartOptions: {},
metadataTypeChartSeries: [], metadataTypeChartSeries: [],
metadataTypeChartOptions: {}, metadataTypeChartOptions: {},
metadataDistributionChartSeries: [], metadataDistributionChartSeries: [],
metadataDistributionChartOptions: {}, metadataDistributionChartOptions: {},
metadataDistributionChartHeight: 730, metadataDistributionChartHeight: 730,
activitiesChartSeries: [], activitiesChartSeries: [],
activitiesChartOptions: {}, activitiesChartOptions: {}
maxTermsToDisplay: 64,
termsDisplayedPage: 1
} }
}, },
computed: { computed: {
@ -332,8 +211,6 @@ export default {
summary: 'getSummary', summary: 'getSummary',
metadata: 'getMetadata', metadata: 'getMetadata',
metadataList: 'getMetadataList', metadataList: 'getMetadataList',
taxonomyTerms: 'getTaxonomyTerms',
taxonomiesList: 'getTaxonomiesList',
collectionsList: 'getCollectionsList', collectionsList: 'getCollectionsList',
activities: 'getActivities', activities: 'getActivities',
stackedBarChartOptions: 'getStackedBarChartOptions', stackedBarChartOptions: 'getStackedBarChartOptions',
@ -341,12 +218,9 @@ export default {
horizontalBarChartOptions: 'getHorizontalBarChartOptions', horizontalBarChartOptions: 'getHorizontalBarChartOptions',
//heatMapChartOptions: 'getHeatMapChartOptions' //heatMapChartOptions: 'getHeatMapChartOptions'
}), }),
taxonomiesListArray() {
return this.taxonomiesList && this.taxonomiesList != undefined ? Object.values(this.taxonomiesList) : [];
},
metadataListArray() { metadataListArray() {
return this.metadata && this.metadata != undefined && this.metadata.distribution ? Object.values(this.metadata.distribution) : []; return this.metadata && this.metadata != undefined && this.metadata.distribution ? Object.values(this.metadata.distribution) : [];
} },
}, },
watch: { watch: {
'$route.query': { '$route.query': {
@ -356,32 +230,18 @@ export default {
this.loadMetadata(); this.loadMetadata();
this.loadActivities(); this.loadActivities();
if (!this.selectedCollection || this.selectedCollection == 'default') { if (!this.selectedCollection || this.selectedCollection == 'default')
this.loadCollectionsList(); this.loadCollectionsList();
this.loadTaxonomiesList();
}
}, },
immediate: true immediate: true
}, },
selectedTaxonomy() {
this.termsDisplayedPage = 1;
if (this.selectedTaxonomy && this.selectedTaxonomy.id)
this.loadTaxonomyTerms();
},
selectedMetadatum() { selectedMetadatum() {
if (this.selectedMetadatum && this.selectedMetadatum != '') if (this.selectedMetadatum && this.selectedMetadatum != '')
this.loadMetadataList(); this.loadMetadataList();
}, },
metadataTypeChartMode() { metadataTypeChartMode() {
this.buildMetadataTypeChart(); this.buildMetadataTypeChart();
},
termsDisplayedPage() {
this.buildTaxonomyTermsChart();
},
maxTermsToDisplay() {
this.termsDisplayedPage = 1;
this.buildTaxonomyTermsChart();
} }
}, },
created() { created() {
@ -398,8 +258,6 @@ export default {
...mapActions('report', [ ...mapActions('report', [
'fetchSummary', 'fetchSummary',
'fetchCollectionsList', 'fetchCollectionsList',
'fetchTaxonomiesList',
'fetchTaxonomyTerms',
'fetchMetadata', 'fetchMetadata',
'fetchMetadataList', 'fetchMetadataList',
'fetchActivities' 'fetchActivities'
@ -599,135 +457,12 @@ export default {
}) })
.catch(() => this.isFetchingCollectionsList = false); .catch(() => this.isFetchingCollectionsList = false);
}, },
loadTaxonomiesList() {
this.isFetchingTaxonomiesList = true;
this.fetchTaxonomiesList()
.then(() => {
// Building Taxonomy term usage chart
const orderedTaxonomies = this.taxonomiesListArray.sort((a, b) => b.total_terms - a.total_terms);
let termsUsed = [];
let termsNotUsed = [];
let taxonomiesLabels = [];
orderedTaxonomies.forEach(taxonomy => {
termsUsed.push(taxonomy.total_terms_used);
termsNotUsed.push(taxonomy.total_terms_not_used);
taxonomiesLabels.push(taxonomy.name);
});
// Sets taxonomy terms now that we have the
if (orderedTaxonomies.length)
this.selectedTaxonomy = orderedTaxonomies[0];
this.taxonomiesListChartSeries = [
{
name: this.$i18n.get('label_terms_used'),
data: termsUsed
},
{
name: this.$i18n.get('label_terms_not_used'),
data: termsNotUsed
}
];
this.taxonomiesListChartOptions = {
...this.stackedBarChartOptions,
...{
title: {
text: this.$i18n.get('label_usage_of_terms_per_taxonomy')
},
xaxis: {
type: 'category',
tickPlacement: 'on',
categories: taxonomiesLabels,
labels: {
show: true,
trim: true,
hideOverlappingLabels: false
},
tooltip: true
},
yaxis: {
title: {
text: this.$i18n.get('label_number_of_terms')
}
}
}
}
this.isFetchingTaxonomiesList = false;
})
.catch(() => this.isFetchingTaxonomiesList = false);
},
buildTaxonomyTermsChart() {
this.isBuildingTaxonomyTermsChart = true;
// Building Taxonomy term usage chart
let orderedTerms = Object.values(this.taxonomyTerms).sort((a, b) => b.count - a.count);
orderedTerms = orderedTerms.slice((this.termsDisplayedPage - 1) * this.maxTermsToDisplay, ((this.termsDisplayedPage - 1) * this.maxTermsToDisplay) + this.maxTermsToDisplay);
let termsValues = [];
let termsLabels = [];
orderedTerms.forEach(term => {
termsValues.push(term.count);
termsLabels.push(term.name);
});
this.taxonomyTermsChartSeries = [
{
name: this.$i18n.get('label_terms_used'),
data: termsValues
}
];
this.taxonomyTermsChartOptions = {
...this.stackedBarChartOptions,
...{
title: {},
xaxis: {
type: 'category',
tickPlacement: 'on',
categories: termsLabels,
labels: {
show: true,
trim: true,
hideOverlappingLabels: false
},
tooltip: true
},
yaxis: {
title: {
text: this.$i18n.get('label_number_of_items')
}
},
animations: {
enabled: orderedTerms.length <= 40
}
}
}
setTimeout(() => { this.isBuildingTaxonomyTermsChart = false; }, 500);
},
loadTaxonomyTerms() {
this.isFetchingTaxonomyTerms = true;
this.fetchTaxonomyTerms(this.selectedTaxonomy.id)
.then(() => {
this.buildTaxonomyTermsChart();
this.isFetchingTaxonomyTerms = false;
})
.catch(() => this.isFetchingTaxonomyTerms = false);
},
loadMetadataList() { loadMetadataList() {
this.isFetchingMetadataList = true; this.isFetchingMetadataList = true;
this.fetchMetadataList({ collectionId: this.collectionId, metadatumId: this.selectedMetadatum }) this.fetchMetadataList({ collectionId: this.collectionId, metadatumId: this.selectedMetadatum })
.then(() => { .then(() => {
// Building Taxonomy term usage chart // Building Metadata term usage chart
const orderedMetadata = Object.values(this.metadataList).sort((a, b) => b.total_items - a.total_items); const orderedMetadata = Object.values(this.metadataList).sort((a, b) => b.total_items - a.total_items);
let metadataItemValues = []; let metadataItemValues = [];
let metadataItemLabels = []; let metadataItemLabels = [];
@ -856,48 +591,4 @@ export default {
} }
} }
} }
</script> </script>
<style lang="scss" scoped>
.postbox {
padding: 1.125rem 1.25rem;
margin-bottom: 0;
height: 100%;
min-height: 380px;
background-color: var(--tainacan-gray0, #f6f6f6);
label {
font-weight: bold;
font-size: 0.875rem;
}
&.metadata-distribution-box {
margin: 0px 0px 0.75rem 1.5rem !important;
overflow-y: auto;
}
.box-header {
display: flex;
align-items: baseline;
justify-content: space-between;
flex-wrap: wrap;
.box-header__item {
margin-bottom: 10px;
}
}
}
.graph-mode-switch {
display: inline-block;
button {
border: none !important;
background: none !important;
box-shadow: none !important;
padding: 0;
cursor: pointer;
&.current {
color: var(--wp-admin-theme-color, #007cba);
}
}
}
</style>

View File

@ -29,4 +29,46 @@
} }
} }
} }
.postbox {
padding: 1.125rem 1.25rem;
margin-bottom: 0;
height: 100%;
min-height: 380px;
background-color: var(--tainacan-block-gray0, #f6f6f6);
label {
font-weight: bold;
font-size: 0.875rem;
}
&.metadata-distribution-box {
margin: 0px 0px 0.75rem 1.5rem !important;
overflow-y: auto;
}
.box-header {
display: flex;
align-items: baseline;
justify-content: space-between;
flex-wrap: wrap;
.box-header__item {
margin-bottom: 10px;
}
}
}
.graph-mode-switch {
display: inline-block;
button {
border: none !important;
background: none !important;
box-shadow: none !important;
padding: 0;
cursor: pointer;
&.current {
color: var(--wp-admin-theme-color, #007cba);
}
}
}
} }