diff --git a/public/manifest.webapp b/public/manifest.webapp index 260ce77..a2d4063 100644 --- a/public/manifest.webapp +++ b/public/manifest.webapp @@ -8,7 +8,7 @@ }, "appType": "APP", "name": "Data Import Wizard", - "version": "1.0.6", + "version": "1.0.7", "description": "Data Importer Wizard", "icons": { "48": "favicon.ico" diff --git a/src/components/schedule.js b/src/components/schedule.js index ee1be57..422ba40 100644 --- a/src/components/schedule.js +++ b/src/components/schedule.js @@ -146,6 +146,7 @@ class Schedule extends React.Component { > } label="Every Five Seconds" /> } label="Every Minute" /> + } label="Every Five Minutes" /> } label="Hourly" /> } label="Daily" /> } label="Weekly" /> diff --git a/src/index.js b/src/index.js index 31b29cd..739c9ef 100644 --- a/src/index.js +++ b/src/index.js @@ -10,13 +10,13 @@ import { Provider } from "mobx-react"; const config = {}; if (process.env.NODE_ENV === 'development') { - // config.baseUrl = `http://localhost:8080/api`; + config.baseUrl = `http://localhost:8080/api`; // config.baseUrl = 'https://play.dhis2.org/2.30/api' // config.baseUrl = 'https://ds.dev.hispuganda.org/api' // config.baseUrl = 'https://ds.dev.hispuganda.org/api'; - config.baseUrl = 'https://programs.psiug.org/psi/api' - // config.headers = { Authorization: 'Basic YWRtaW46ZGlzdHJpY3Q=' }; // admin - config.headers = { Authorization: 'Basic SGlzcDpBcGlAMjAxOSE=' };// dev pace + // config.baseUrl = 'https://programs.psiug.org/psi/api' + config.headers = { Authorization: 'Basic YWRtaW46ZGlzdHJpY3Q=' }; // admin + // config.headers = { Authorization: 'Basic SGlzcDpBcGlAMjAxOSE=' };// dev pace // config.baseUrl = `http://dhis2-staging.kuunika.org:8087/api`; // config.headers = { Authorization: 'Basic bWJvbmdlbmljaGl6b25kYTpBYmlreWwyMkA=' }; // config.headers = { Authorization: 'Basic c3RlcGhlbjpIaXNwQDIwMTk=' }; diff --git a/src/stores/Program.js b/src/stores/Program.js index af83bd9..219b83d 100644 --- a/src/stores/Program.js +++ b/src/stores/Program.js @@ -566,16 +566,9 @@ class Program { @action updateDHISEvents = (eventsUpdate) => { const api = this.d2.Api.getApi(); - const events = eventsUpdate.map(event => { - return event.dataValues.map(dataValue => { - const { eventDate, ...others } = event; - return { event: { ...others, dataValues: [dataValue] }, dataElement: dataValue.dataElement }; - }); + return eventsUpdate.map(event => { + return api.update('events/' + event.event, event, {}) }); - - return _.flatten(events).map(ev => { - return api.update('events/' + ev.event.event + '/' + ev.dataElement, ev.event, {}) - }) }; @action setResponses = val => { @@ -673,17 +666,18 @@ class Program { } if (eventsUpdate && eventsUpdate.length > 0) { - const total = newEvents.length; + const total = eventsUpdate.length; let current = 0; this.setMessage(`Updating events ${current}/${total}`); const chunkedEvents = _.chunk(eventsUpdate, 250); - for (const events of chunkedEvents) { - current = current + events.length; - this.setMessage(`Updating events ${current}/${total}`); - const eventsResults = await Promise.all(this.updateDHISEvents(events)); - this.setResponses(eventsResults); - } - this.setMessage('Finished updating events'); + console.log(JSON.stringify(chunkedEvents, null, 2)); + // for (const events of chunkedEvents) { + // current = current + events.length; + // this.setMessage(`Updating events ${current}/${total}`); + // const eventsResults = await Promise.all(this.updateDHISEvents(events)); + // this.setResponses(eventsResults); + // } + // this.setMessage('Finished updating events'); } this.setPulledData(null); diff --git a/src/utils/utils.js b/src/utils/utils.js index cd3bb2a..7f002ee 100644 --- a/src/utils/utils.js +++ b/src/utils/utils.js @@ -375,13 +375,11 @@ export const programUniqueAttribute = (program) => { return null; }; - - export const validText = (dataType, value) => { switch (dataType) { case 'TEXT': case 'LONG_TEXT': - return value !== null && value !== undefined && value.toString() !== ''; + return value !== null && value !== undefined; case 'NUMBER': return !isNaN(value); case 'EMAIL': @@ -1133,14 +1131,17 @@ export const searchSavedEvent = (programStages, event, eventsData) => { if (ev2 && !many1) { const differingElements = _.differenceWith(event['dataValues'], ev2['dataValues'], (a, b) => { return a.dataElement === b.dataElement && a.value + '' === b.value + ''; + }).filter(v => { + return v.value !== 'null'; }); if (differingElements.length > 0 && updateEvents) { return { ...ev2, update: true, + eventDate: moment(ev2['eventDate']).format('YYYY-MM-DD'), duplicates: false, - dataValues: differingElements + dataValues: _.unionBy(ev2['dataValues'].filter(e => e.value !== ''), event['dataValues'], 'dataElement') }; } return null; @@ -1161,14 +1162,17 @@ export const searchSavedEvent = (programStages, event, eventsData) => { if (ev1 && !many1) { const differingElements = _.differenceWith(event['dataValues'], ev1['dataValues'], (a, b) => { return a.dataElement === b.dataElement && a.value + '' === b.value + ''; + }).filter(v => { + return v.value !== 'null'; }); if (differingElements.length > 0) { return { ...ev1, update: true, + eventDate: moment(ev1['eventDate']).format('YYYY-MM-DD'), duplicates: false, - dataValues: differingElements + dataValues: _.unionBy(ev1['dataValues'].filter(e => e.value !== ''), event['dataValues'], 'dataElement') }; } return null; @@ -1188,15 +1192,20 @@ export const searchSavedEvent = (programStages, event, eventsData) => { const { event: ev2, many: many1 } = currentEvent; if (ev2 && !many1) { const differingElements = _.differenceWith(event['dataValues'], ev2['dataValues'], (a, b) => { - return a.dataElement === b.dataElement && a.value + '' === b.value + ''; + return a.dataElement === b.dataElement && a.value && b.value && a.value + '' === b.value + ''; + }).filter(v => { + return v.value !== 'null'; }); if (differingElements.length > 0) { return { ...ev2, + eventDate: moment(ev2['eventDate']).format('YYYY-MM-DD'), update: true, duplicates: false, - dataValues: differingElements + dataValues: _.unionWith(ev2['dataValues'].filter(e => e.value !== ''), event['dataValues'], (a, b) => { + return a.dataElement === b.dataElement; + }) }; } return null; @@ -1264,17 +1273,19 @@ export const processEvents = (program, data, eventsData) => { if (eventDate && mapped.length > 0) { const dataValues = mapped.map(e => { - const value = d[e.column.value]; + let value = d[e.column.value]; const type = e.dataElement.valueType; + if (type === 'TEXT') { + value = String(value).trim(); + } const optionsSet = e.dataElement.optionSet; const validatedValue = validateValue(type, value, optionsSet); - if (value !== '' && validatedValue !== null) { return { dataElement: e.dataElement.id, value: validatedValue } - } else if (value !== undefined && value !== null) { + } else if (value !== undefined && value !== null && value !== '') { conflicts = [...conflicts, { error: optionsSet === null ? 'Invalid value ' + value + ' for value type ' + type : 'Invalid value: ' + value + ', expected: ' + _.map(optionsSet.options, o => { return o.code