Skip to content
This repository has been archived by the owner on Mar 13, 2021. It is now read-only.

Commit

Permalink
Add download data button
Browse files Browse the repository at this point in the history
  • Loading branch information
ed-asriyan committed Jul 24, 2020
1 parent 6036790 commit f54c230
Show file tree
Hide file tree
Showing 4 changed files with 116 additions and 10 deletions.
77 changes: 77 additions & 0 deletions app/controllers/account/settings/devices.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
import Controller from '@ember/controller';
import {action} from '@ember/object';
import {inject as service} from '@ember/service';
import tsvBuilder from '../../../utils/tsv-builder';
import download from '../../../utils/download';

export default class extends Controller {
@service backend;

@action
async onControllerDeleteAction(controller) {
try {
Expand All @@ -15,4 +20,76 @@ export default class extends Controller {
alert(`Не могу удалить объект: ${e.toString()}`);
}
}

downloadData(sensor) {
return this.get('backend').request(`/sensor/${sensor.get('id')}/data`, 'GET');
}

@action
async downloadRawData(sensor) {
const data = await this.downloadData(sensor);
download(
tsvBuilder(
['data', 'sign', 'signer'],
data,
),
`${new Date().toLocaleString('ru-ru')}-raw.tsv`,
'text/tab-separated-values',
);
}

@action
async downloadPrettyData(sensor) {
let data = (await this.downloadData(sensor)).filter((row) => row.data && row.data.timestamp && row.data.value).
map((row) => row.data);

const normalized = [];

// normalize
for (const row of data) {
if (!row) continue;
if (typeof row.value !== 'object') {
row.value = {value: row};
}

const obj = {};
for (let [field, value] of Object.entries(row.value)) {
if (typeof value === 'string') {
const splited = value.split(' ');
if (splited.length === 2) {
const parsed = parseFloat(splited[0]);
if (!isNaN(parsed)) {
const unit = splited.splice(1).join(' ');
field += ` (${unit})`;
value = parsed;
}
}
}

obj[field] = value;
}

normalized.push({timestamp: row.timestamp, ...obj});
}

data = null;

const headers = [];
for (const row of normalized) {
for (const header of Object.keys(row)) {
if (!headers.includes(header)) {
headers.push(header);
}
}
}

download(
tsvBuilder(
headers,
normalized,
),
`${new Date().toLocaleString('ru-ru')}-pretty.tsv`,
'text/tab-separated-values',
);
}
}
20 changes: 10 additions & 10 deletions app/templates/account/settings/devices.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@
<span>Заблокировать</span>
</button>
<!--<button class="btn btnStyle btnStyle_сolorless inspector__btn">-->
<!--<span class="icon-move"></span>-->
<!--<span>Переместить</span>-->
<!--<span class="icon-move"></span>-->
<!--<span>Переместить</span>-->
<!--</button>-->
<button class="btn btnStyle btnStyle_сolorless inspector__btn"
onclick={{action "onControllerDeleteAction" controller}}>
Expand All @@ -56,14 +56,14 @@
class="height-3x margin-right-1x"}}
<span class="counterItem__name">{{sensor.name}}</span>
</td>
<td class="text-muted">{{sensor.serviceCompany.name}}</td>
<td class="text-muted">{{measurement sensor.value sensor.unitName}}</td>
<td align="right">
<span class="icon-disabled counterItem__control"> <span
class="controlText"> Заблокировать</span></span>
<span class="icon-cross counterItem__control"> <span
class="controlText"> Удалить</span></span>
</td>
{{#if isLiteMode}}
<td class="text-right">
<button class="btn btnStyle" onclick={{action "downloadPrettyData" sensor}}>Скачать данные</button>
</td>
<td class="text-right">
<button class="btn btnStyle" onclick={{action "downloadRawData" sensor}}>Скачать сырые данные</button>
</td>
{{/if}}
</tr>
{{/each}}
</tbody>
Expand Down
17 changes: 17 additions & 0 deletions app/utils/download.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
export default function(data, filename, type) {
const file = new Blob([data], {type: type});
if (window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(file, filename);
} else { // Others
const a = document.createElement('a');
const url = URL.createObjectURL(file);
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
setTimeout(function() {
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}, 0);
}
}
12 changes: 12 additions & 0 deletions app/utils/tsv-builder.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
export default function(headers, rows) {
const result = [headers.slice()];
for (const row of rows) {
const resultRow = [];
for (const header of headers) {
const cell = row[header];
resultRow.push(typeof cell === 'object' ? JSON.stringify(row[header]) : cell);
}
result.push(resultRow);
}
return result.map((row) => row.join('\t')).join('\n');
}

0 comments on commit f54c230

Please sign in to comment.