184 lines
4.5 KiB
JavaScript
184 lines
4.5 KiB
JavaScript
import Ember from 'ember';
|
|
|
|
const {
|
|
get,
|
|
set,
|
|
inject: { service },
|
|
Service,
|
|
observer,
|
|
isPresent,
|
|
getProperties,
|
|
setProperties,
|
|
} = Ember;
|
|
|
|
export default Service.extend({
|
|
store: service(),
|
|
session: service(),
|
|
|
|
payload: {},
|
|
storageKey: 'chartsVisibilityV4', // increase version on schema change
|
|
hiddenCharts: [],
|
|
patternIncludes: [],
|
|
fetchOnlyQuery: {},
|
|
payloadVersion: 1,
|
|
visibilityFilter: {},
|
|
visibleChartsCount: 0,
|
|
|
|
observeVisibilityChanges: observer(
|
|
'payload.tags.@each.visible',
|
|
'payload.foods.@each.visible',
|
|
'payload.symptoms.@each.visible',
|
|
'payload.conditions.@each.visible',
|
|
'payload.treatments.@each.visible',
|
|
'payload.weathersMeasures.@each.visible',
|
|
'payload.harveyBradshawIndices.@each.visible',
|
|
function() {
|
|
const payload = get(this, 'payload');
|
|
|
|
let hiddenCharts = [];
|
|
let patternIncludes = [];
|
|
let fetchOnlyQuery = {};
|
|
let visibilityFilter = {};
|
|
let visibleChartsCount = 0;
|
|
|
|
Object
|
|
.keys(payload)
|
|
.forEach(category => {
|
|
let categoryCharts = payload[category];
|
|
|
|
visibilityFilter[category] = {};
|
|
|
|
Object
|
|
.keys(categoryCharts)
|
|
.forEach(chart => {
|
|
let chart_id = categoryCharts[chart].id;
|
|
|
|
if(category === 'weathersMeasures') {
|
|
chart_id = chart_id == 1 ? 'humidity' : 'pressure';
|
|
}
|
|
|
|
patternIncludes.pushObject({
|
|
id: chart_id,
|
|
category,
|
|
label: categoryCharts[chart].label,
|
|
});
|
|
|
|
if (categoryCharts[chart].visible) {
|
|
visibleChartsCount += 1;
|
|
|
|
visibilityFilter[category][categoryCharts[chart].label] = true;
|
|
|
|
if (!fetchOnlyQuery[category]) {
|
|
fetchOnlyQuery[category] = [];
|
|
}
|
|
|
|
fetchOnlyQuery[category].pushObject(categoryCharts[chart].id);
|
|
} else if(isPresent(categoryCharts[chart].label)) {
|
|
|
|
hiddenCharts.pushObject({
|
|
id: categoryCharts[chart].id,
|
|
category,
|
|
label: categoryCharts[chart].label,
|
|
});
|
|
}
|
|
});
|
|
});
|
|
|
|
setProperties(this, {
|
|
fetchOnlyQuery,
|
|
visibilityFilter,
|
|
visibleChartsCount,
|
|
hiddenCharts: hiddenCharts.sortBy('label'),
|
|
patternIncludes: patternIncludes.sortBy('label'),
|
|
});
|
|
|
|
this.updateStorage();
|
|
}
|
|
),
|
|
|
|
init() {
|
|
this._super(...arguments);
|
|
|
|
let payload = this.getFromStorage();
|
|
|
|
if (payload) {
|
|
set(this, 'payload', payload);
|
|
|
|
this.observeVisibilityChanges();
|
|
} else {
|
|
if(get(this, 'session.isAuthenticated')) {
|
|
this.refresh();
|
|
}
|
|
}
|
|
},
|
|
|
|
setVisibility(value, categoryName, label) {
|
|
let payloadCategoryName = `payload.${categoryName}`;
|
|
let category = get(this, payloadCategoryName) || [];
|
|
|
|
category.forEach(chart => {
|
|
if (chart.label === label) {
|
|
set(chart, 'visible', value);
|
|
}
|
|
});
|
|
|
|
let payloadVersion = get(this, 'payloadVersion') + 1;
|
|
|
|
setProperties(this, {
|
|
payloadVersion,
|
|
payloadDirection: value,
|
|
[payloadCategoryName]: category,
|
|
});
|
|
},
|
|
|
|
getFromStorage() {
|
|
const storageKey = get(this, 'storageKey');
|
|
|
|
return localStorage[storageKey] && JSON.parse(localStorage[storageKey]);
|
|
},
|
|
|
|
updateStorage() {
|
|
const { storageKey, payload } = getProperties(this, 'storageKey', 'payload');
|
|
|
|
localStorage[storageKey] = JSON.stringify(payload);
|
|
},
|
|
|
|
refresh() {
|
|
get(this, 'store')
|
|
.queryRecord('chart-list', {})
|
|
.then(responce => {
|
|
let payload = this.mergeChartsVisibility(get(responce, 'payload'), this.getFromStorage() || {});
|
|
let payloadVersion = get(this, 'payloadVersion') + 1;
|
|
|
|
setProperties(this, { payload, payloadVersion });
|
|
|
|
this.updateStorage();
|
|
});
|
|
},
|
|
|
|
mergeChartsVisibility(allowedCharts, savedChartsVisibility) {
|
|
let result = {};
|
|
|
|
Object
|
|
.keys(allowedCharts)
|
|
.forEach(category => {
|
|
result[category] = [];
|
|
|
|
allowedCharts[category].forEach(chart => {
|
|
const [id, label, visibility] = chart;
|
|
|
|
let savedCategory = savedChartsVisibility[category];
|
|
let chartWasPresent = savedCategory && savedCategory.findBy('id', id);
|
|
|
|
result[category].pushObject({
|
|
id,
|
|
label,
|
|
visible: chartWasPresent ? chartWasPresent.visible : visibility,
|
|
});
|
|
});
|
|
});
|
|
|
|
return result;
|
|
},
|
|
});
|