|
@@ -2,45 +2,45 @@
|
2
|
2
|
<layout type="vertical">
|
3
|
3
|
<layout type="horizontal">
|
4
|
4
|
<button type="push" id="target" name="Load profile as target" />
|
5
|
|
- <button type="push" id="viewprofile" name="View profile" />
|
6
|
|
- <button type="push" id="compare" name="Compare profile" />
|
7
|
|
- <button type="push" id="edit" name="Edit" />
|
|
5
|
+ <button type="push" id="viewprofile" name="View profile" />
|
|
6
|
+ <button type="push" id="compare" name="Compare profile" />
|
|
7
|
+ <button type="push" id="edit" name="Edit" />
|
8
|
8
|
</layout>
|
9
|
9
|
<webview id="view" />
|
10
|
10
|
</layout>
|
11
|
11
|
<menu name="File">
|
12
|
|
- <item id="save" shortcut="Ctrl+S">Save…</item>
|
|
12
|
+ <item id="save" shortcut="Ctrl+S">Save…</item>
|
13
|
13
|
</menu>
|
14
|
14
|
<program>
|
15
|
15
|
<![CDATA[
|
16
|
|
- var window = this;
|
17
|
|
- dataView = findChildObject(this, 'view');
|
18
|
|
- var fileID;
|
19
|
|
- var target = findChildObject(this, 'target');
|
20
|
|
- var compare = findChildObject(this, 'compare');
|
21
|
|
- var edit = findChildObject(this, 'edit');
|
22
|
|
- edit.enabled = false;
|
23
|
|
- if(typeof(Windows.loggingWindow) == "undefined") {
|
24
|
|
- compare.enabled = false;
|
25
|
|
- target.enabled = false;
|
26
|
|
- }
|
27
|
|
- var tableReference;
|
28
|
|
- var rowReference;
|
29
|
|
- var batchTime;
|
30
|
|
- var machine;
|
31
|
|
- var approval;
|
32
|
|
- var annotation;
|
33
|
|
- edit.clicked.connect(function() {
|
34
|
|
- var editWindow = createWindow("editBatchDetails");
|
35
|
|
- editWindow.loadData(window, tableReference, rowReference, batchTime, machine, approval, annotation);
|
36
|
|
- });
|
37
|
|
- compare.clicked.connect(function() {
|
38
|
|
- var query = new QSqlQuery;
|
39
|
|
- query.prepare("SELECT file, name FROM files WHERE id = :id");
|
40
|
|
- query.bind(":id", Number(fileID));
|
41
|
|
- query.exec();
|
42
|
|
- query.next();
|
43
|
|
- var buffer = new QBuffer(query.value(0));
|
|
16
|
+ var window = this;
|
|
17
|
+ dataView = findChildObject(this, 'view');
|
|
18
|
+ var fileID;
|
|
19
|
+ var target = findChildObject(this, 'target');
|
|
20
|
+ var compare = findChildObject(this, 'compare');
|
|
21
|
+ var edit = findChildObject(this, 'edit');
|
|
22
|
+ edit.enabled = false;
|
|
23
|
+ if(typeof(Windows.loggingWindow) == "undefined") {
|
|
24
|
+ compare.enabled = false;
|
|
25
|
+ target.enabled = false;
|
|
26
|
+ }
|
|
27
|
+ var tableReference;
|
|
28
|
+ var rowReference;
|
|
29
|
+ var batchTime;
|
|
30
|
+ var machine;
|
|
31
|
+ var approval;
|
|
32
|
+ var annotation;
|
|
33
|
+ edit.clicked.connect(function() {
|
|
34
|
+ var editWindow = createWindow("editBatchDetails");
|
|
35
|
+ editWindow.loadData(window, tableReference, rowReference, batchTime, machine, approval, annotation);
|
|
36
|
+ });
|
|
37
|
+ compare.clicked.connect(function() {
|
|
38
|
+ var query = new QSqlQuery;
|
|
39
|
+ query.prepare("SELECT file, name FROM files WHERE id = :id");
|
|
40
|
+ query.bind(":id", Number(fileID));
|
|
41
|
+ query.exec();
|
|
42
|
+ query.next();
|
|
43
|
+ var buffer = new QBuffer(query.value(0));
|
44
|
44
|
var pname = query.value(1);
|
45
|
45
|
query = query.invalidate();
|
46
|
46
|
var startSeries = Number(QSettings.value('cseries', 3));
|
|
@@ -50,300 +50,297 @@
|
50
|
50
|
var graph = findChildObject(Windows.loggingWindow, 'graph');
|
51
|
51
|
input.measure.connect(graph.newMeasurement);
|
52
|
52
|
input.input();
|
53
|
|
- query = query.invalidate();
|
54
|
|
- });
|
55
|
|
- target.clicked.connect(function() {
|
56
|
|
- var query = new QSqlQuery;
|
57
|
|
- query.prepare("SELECT file, name FROM files WHERE id = :id");
|
58
|
|
- query.bind(":id", Number(fileID));
|
59
|
|
- query.exec();
|
60
|
|
- query.next();
|
61
|
|
- var buffer = new QBuffer(query.value(0));
|
62
|
|
- var pname = query.value(1);
|
63
|
53
|
query = query.invalidate();
|
64
|
|
- var input = new XMLInput(buffer, 1);
|
65
|
|
- var graph = findChildObject(Windows.loggingWindow, 'graph');
|
66
|
|
- var log = findChildObject(Windows.loggingWindow, 'log');
|
67
|
|
- log.clear();
|
68
|
|
- graph.clear();
|
69
|
|
- input.newTemperatureColumn.connect(log.setHeaderData);
|
70
|
|
- input.newTemperatureColumn.connect(function(col, text) {
|
71
|
|
- if(text == Windows.loggingWindow.targetcolumnname)
|
72
|
|
- {
|
73
|
|
- targetseries = col;
|
74
|
|
- }
|
75
|
|
- });
|
76
|
|
- input.newAnnotationColumn.connect(log.setHeaderData);
|
77
|
|
- input.measure.connect(graph.newMeasurement);
|
78
|
|
- input.measure.connect(log.newMeasurement);
|
79
|
|
- input.measure.connect(function(data, series) {
|
80
|
|
- if(series == targetseries)
|
81
|
|
- {
|
82
|
|
- targetDetector.newMeasurement(data);
|
83
|
|
- }
|
84
|
|
- });
|
85
|
|
- var lc;
|
86
|
|
- input.lastColumn.connect(function(c) {
|
87
|
|
- lc = c;
|
88
|
|
- QSettings.setValue("liveColumn", c + 1);
|
89
|
|
- Windows.loggingWindow.postLoadColumnSetup(c);
|
90
|
|
- });
|
91
|
|
- input.annotation.connect(log.newAnnotation);
|
92
|
|
- input.annotation.connect(function(note, tcol, ncol) {
|
93
|
|
- for(var i = tcol; i < ncol; i++) {
|
94
|
|
- log.newAnnotation(note, i, ncol);
|
95
|
|
- }
|
96
|
|
- });
|
97
|
|
- Windows.loggingWindow.windowTitle = "Typica - " + pname;
|
98
|
|
- Windows.loggingWindow.raise();
|
99
|
|
- Windows.loggingWindow.activateWindow();
|
100
|
|
- input.input();
|
101
|
|
- log.newAnnotation("End", 1, lc);
|
102
|
|
- query = query.invalidate();
|
103
|
|
- });
|
104
|
|
- var viewbutton = findChildObject(this, 'viewprofile');
|
105
|
|
- viewbutton.clicked.connect(function() {
|
106
|
|
- var query = new QSqlQuery;
|
107
|
|
- query.prepare("SELECT file, name FROM files WHERE id = :id");
|
108
|
|
- query.bind(":id", Number(fileID));
|
109
|
|
- query.exec();
|
110
|
|
- if(query.next()) {
|
111
|
|
- var viewer = createWindow('offline');
|
112
|
|
- var buffer = new QBuffer(query.value(0));
|
113
|
|
- var pname = query.value(1);
|
114
|
|
- query = query.invalidate();
|
115
|
|
- var input = new XMLInput(buffer, 1);
|
116
|
|
- var graph = findChildObject(viewer, 'graph');
|
117
|
|
- var log = findChildObject(viewer, 'log');
|
118
|
|
- input.newTemperatureColumn.connect(log.setHeaderData);
|
119
|
|
- input.newTemperatureColumn.connect(function(column) {
|
120
|
|
- viewer.saveTemperatureColumns.push(column);
|
121
|
|
- });
|
122
|
|
- input.newAnnotationColumn.connect(log.setHeaderData);
|
123
|
|
- input.newAnnotationColumn.connect(function(column) {
|
124
|
|
- viewer.saveAnnotationColumns.push(column);
|
125
|
|
- });
|
126
|
|
- input.measure.connect(graph.newMeasurement);
|
127
|
|
- input.measure.connect(log.newMeasurement);
|
128
|
|
- input.annotation.connect(log.newAnnotation);
|
129
|
|
- var lc;
|
130
|
|
- input.lastColumn.connect(function(c) {
|
131
|
|
- lc = c;
|
132
|
|
- if(c < 3)
|
133
|
|
- {
|
134
|
|
- log.setHeaderData(3, "");
|
135
|
|
- }
|
136
|
|
- });
|
137
|
|
- input.annotation.connect(function(note, tcol, ncol) {
|
138
|
|
- for(var i = tcol; i < ncol; i++) {
|
139
|
|
- log.newAnnotation(note, i, ncol);
|
140
|
|
- }
|
141
|
|
- });
|
142
|
|
- viewer.windowTitle = "Typica - " + pname;
|
143
|
|
- viewer.raise();
|
144
|
|
- viewer.activateWindow();
|
145
|
|
- graph.updatesEnabled = false;
|
146
|
|
- log.updatesEnabled = false;
|
147
|
|
- input.input();
|
148
|
|
- log.updatesEnabled = true;
|
149
|
|
- graph.updatesEnabled = true;
|
150
|
|
- log.newAnnotation("End", 1, lc);
|
151
|
|
- }
|
152
|
|
- else {
|
153
|
|
- print("Query returned no results");
|
154
|
|
- }
|
155
|
|
- query = query.invalidate();
|
156
|
|
- });
|
157
|
|
- window.loadData = function(table, row) {
|
158
|
|
- tableReference = table;
|
159
|
|
- rowReference = row;
|
160
|
|
- var buffer = new QBuffer;
|
161
|
|
- buffer.open(3);
|
162
|
|
- var output = new XmlWriter(buffer);
|
163
|
|
- output.writeStartDocument("1.0");
|
164
|
|
- output.writeDTD('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg.dtd">');
|
165
|
|
- output.writeStartElement("html");
|
166
|
|
- output.writeAttribute("xmlns", "http://www.w3.org/1999/xhtml");
|
167
|
|
- output.writeStartElement("head");
|
168
|
|
- output.writeTextElement("title", "Batch Details");
|
169
|
|
- output.writeEndElement();
|
170
|
|
- output.writeStartElement("body");
|
171
|
|
- output.writeStartElement("div");
|
172
|
|
- output.writeAttribute("style", "float: left; padding-right: 10px");
|
173
|
|
- output.writeStartElement("p");
|
174
|
|
- output.writeTextElement("strong", "Roasted Coffee: ");
|
175
|
|
- output.writeTextElement("span", table.data(row, 2));
|
176
|
|
- output.writeEndElement();
|
177
|
|
- output.writeEndElement();
|
178
|
|
- output.writeStartElement("div");
|
179
|
|
- output.writeAttribute("style", "float: left");
|
180
|
|
- output.writeStartElement("p");
|
181
|
|
- output.writeTextElement("strong", "Roasted On: ");
|
182
|
|
- batchTime = table.data(row, 0);
|
183
|
|
- output.writeTextElement("span", batchTime);
|
184
|
|
- output.writeEndElement();
|
185
|
|
- output.writeStartElement("p");
|
186
|
|
- output.writeTextElement("strong", "Batch Duration: ");
|
187
|
|
- output.writeTextElement("span", table.data(row, 6));
|
188
|
|
- output.writeEndElement();
|
189
|
|
- output.writeEndElement();
|
190
|
|
- output.writeStartElement("div");
|
191
|
|
- output.writeAttribute("style", "clear: both");
|
192
|
|
- output.writeEndElement();
|
193
|
|
- output.writeStartElement("table");
|
194
|
|
- output.writeStartElement("thead");
|
195
|
|
- output.writeStartElement("tr");
|
196
|
|
- output.writeTextElement("th", "Green Coffee");
|
197
|
|
- output.writeTextElement("th", "Weight (lb)");
|
198
|
|
- output.writeEndElement();
|
199
|
|
- output.writeEndElement();
|
200
|
|
- output.writeStartElement("tbody");
|
201
|
|
- var query = new QSqlQuery();
|
202
|
|
- query.prepare("SELECT unroasted_id, unroasted_quantity, approval, files, annotation FROM roasting_log WHERE time = :time AND machine = :machine");
|
203
|
|
- query.bind(":time", batchTime);
|
204
|
|
- machine = table.data(row, 1);
|
205
|
|
- query.bind(":machine", machine);
|
206
|
|
- query.exec();
|
207
|
|
- query.next();
|
208
|
|
- approval = query.value(2);
|
209
|
|
- annotation = query.value(4);
|
210
|
|
- var items = sqlToArray(query.value(0));
|
211
|
|
- var quantities = sqlToArray(query.value(1));
|
212
|
|
- var nameQuery = new QSqlQuery();
|
213
|
|
- nameQuery.prepare("SELECT name FROM items WHERE id = :id");
|
214
|
|
- for(var i = 0; i < items.length; i++) {
|
215
|
|
- output.writeStartElement("tr");
|
216
|
|
- nameQuery.bind(":id", items[i]);
|
217
|
|
- nameQuery.exec();
|
218
|
|
- nameQuery.next();
|
219
|
|
- output.writeTextElement("td", nameQuery.value(0) + " (" + items[i] + ")");
|
220
|
|
- output.writeStartElement("td");
|
221
|
|
- output.writeAttribute("align", "center");
|
222
|
|
- output.writeCharacters(quantities[i]);
|
223
|
|
- output.writeEndElement();
|
224
|
|
- output.writeEndElement();
|
225
|
|
- }
|
226
|
|
- nameQuery = nameQuery.invalidate();
|
227
|
|
- output.writeEndElement();
|
228
|
|
- output.writeStartElement("tfoot");
|
229
|
|
- output.writeStartElement("tr");
|
230
|
|
- output.writeStartElement("td");
|
231
|
|
- output.writeAttribute("align", "right");
|
232
|
|
- output.writeTextElement("strong", "Green Total:");
|
233
|
|
- output.writeEndElement();
|
234
|
|
- output.writeStartElement("td");
|
235
|
|
- output.writeAttribute("align", "center");
|
236
|
|
- output.writeCharacters(table.data(row, 3));
|
237
|
|
- output.writeEndElement();
|
238
|
|
- output.writeEndElement();
|
239
|
|
- output.writeStartElement("tr");
|
240
|
|
- output.writeStartElement("td");
|
241
|
|
- output.writeAttribute("align", "right");
|
242
|
|
- output.writeTextElement("strong", "Roasted Weight:");
|
243
|
|
- output.writeEndElement();
|
244
|
|
- output.writeStartElement("td");
|
245
|
|
- output.writeAttribute("align", "center");
|
246
|
|
- output.writeCharacters(table.data(row, 4));
|
247
|
|
- output.writeEndElement();
|
248
|
|
- output.writeEndElement();
|
249
|
|
- output.writeStartElement("tr");
|
250
|
|
- output.writeStartElement("td");
|
251
|
|
- output.writeAttribute("align", "right");
|
252
|
|
- output.writeTextElement("strong", "Weight Loss:");
|
253
|
|
- output.writeEndElement();
|
254
|
|
- output.writeStartElement("td");
|
255
|
|
- output.writeAttribute("align", "center");
|
256
|
|
- output.writeCharacters(table.data(row, 5));
|
257
|
|
- output.writeCharacters("%");
|
258
|
|
- output.writeEndElement();
|
259
|
|
- output.writeEndElement();
|
260
|
|
- output.writeEndElement();
|
261
|
|
- output.writeEndElement();
|
262
|
|
- output.writeStartElement("p");
|
263
|
|
- output.writeTextElement("strong", "Approved: ");
|
264
|
|
- output.writeCharacters(approval);
|
265
|
|
- output.writeEndElement();
|
266
|
|
- output.writeStartElement("p");
|
267
|
|
- output.writeTextElement("strong", "Files: ");
|
268
|
|
- output.writeCharacters(query.value(3));
|
269
|
|
- output.writeEndElement();
|
270
|
|
- output.writeStartElement("p");
|
271
|
|
- output.writeTextElement("strong", "Annotations:");
|
272
|
|
- var files = sqlToArray(query.value(3));
|
273
|
|
- var annotations = annotationFromRecord(files[0]);
|
274
|
|
- fileID = files[0];
|
275
|
|
- var buffer2 = new QBuffer("<points>"+annotations+"</points>");
|
276
|
|
- buffer2.open(1);
|
277
|
|
- var colQuery = new XQuery;
|
278
|
|
- colQuery.bind("profile", buffer2);
|
279
|
|
- colQuery.setQuery('for $i in doc($profile)//tuple[1]/temperature/@series return (string($i), ";")');
|
280
|
|
- var result = colQuery.exec();
|
281
|
|
- buffer2.close();
|
282
|
|
- var seriesHeaders = new Array();
|
283
|
|
- seriesHeaders.push("Time");
|
284
|
|
- var records = result.split(";");
|
285
|
|
- for(var i = 0; i < records.length - 1; i++) {
|
286
|
|
- seriesHeaders.push(records[i].replace(/^\s+|\s+$/g,""));
|
287
|
|
- }
|
288
|
|
- seriesHeaders.push("Note");
|
289
|
|
- output.writeStartElement("table");
|
290
|
|
- output.writeStartElement("thead");
|
291
|
|
- output.writeStartElement("tr");
|
292
|
|
- for(var i = 0; i < seriesHeaders.length; i++) {
|
293
|
|
- output.writeTextElement("th", seriesHeaders[i]);
|
294
|
|
- }
|
295
|
|
- output.writeEndElement();
|
296
|
|
- output.writeEndElement();
|
297
|
|
- buffer2.open(1);
|
298
|
|
- var rq = 'for $t in doc($profile) //tuple return (string($t/time), ";", ';
|
299
|
|
- for(var i = 0; i < seriesHeaders.length - 2; i++) {
|
300
|
|
- rq = rq + 'string($t/temperature[' + Number(i+1) + ']), ";", ';
|
301
|
|
- }
|
302
|
|
- rq = rq + 'string($t/annotation), "~")';
|
303
|
|
- colQuery.setQuery(rq);
|
304
|
|
- var annotationData = colQuery.exec();
|
305
|
|
- colQuery = colQuery.invalidate();
|
306
|
|
- buffer2.close();
|
307
|
|
- output.writeStartElement("tbody");
|
308
|
|
- var annotationRecords = annotationData.split("~");
|
309
|
|
- for(var i = 0; i < annotationRecords.length - 1; i++) {
|
310
|
|
- output.writeStartElement("tr");
|
311
|
|
- var annotationRow = annotationRecords[i].split(";");
|
312
|
|
- for(var j = 0; j < annotationRow.length; j++) {
|
313
|
|
- output.writeStartElement("td");
|
314
|
|
- output.writeAttribute("style", "border-left: 1px solid #000000");
|
315
|
|
- if(j > 0) {
|
316
|
|
- output.writeAttribute("align", "center");
|
317
|
|
- }
|
318
|
|
- if(j > 0 && j < annotationRow.length - 1) {
|
319
|
|
- output.writeCharacters(Number(annotationRow[j].replace(/^\s+|\s+$/g,"")).toFixed(2));
|
320
|
|
- }
|
321
|
|
- else {
|
322
|
|
- output.writeCharacters(annotationRow[j].replace(/^\s+|\s+$/g,""));
|
323
|
|
- }
|
324
|
|
- output.writeEndElement();
|
325
|
|
- }
|
326
|
|
- output.writeEndElement();
|
327
|
|
- }
|
328
|
|
- output.writeEndElement();
|
329
|
|
- output.writeEndElement();
|
330
|
|
- output.writeCharacters(annotation);
|
331
|
|
- output.writeEndElement();
|
332
|
|
- output.writeEndElement();
|
333
|
|
- output.writeEndElement();
|
334
|
|
- output.writeEndDocument();
|
335
|
|
- dataView.setContent(buffer);
|
336
|
|
- buffer.close();
|
337
|
|
- query = query.invalidate();
|
338
|
|
- edit.enabled = true;
|
339
|
|
- };
|
340
|
|
- var saveMenu = findChildObject(this, 'save');
|
341
|
|
- saveMenu.triggered.connect(function() {
|
342
|
|
- var filename = QFileDialog.getSaveFileName(window, "Save Log As…", QSettings.value("script/lastDir", "") + "/");
|
343
|
|
- if(filename != "") {
|
344
|
|
- saveFileFromDatabase(fileID, filename);
|
345
|
|
- }
|
346
|
|
- });
|
|
54
|
+ });
|
|
55
|
+ target.clicked.connect(function() {
|
|
56
|
+ var query = new QSqlQuery;
|
|
57
|
+ query.prepare("SELECT file, name FROM files WHERE id = :id");
|
|
58
|
+ query.bind(":id", Number(fileID));
|
|
59
|
+ query.exec();
|
|
60
|
+ query.next();
|
|
61
|
+ var buffer = new QBuffer(query.value(0));
|
|
62
|
+ var pname = query.value(1);
|
|
63
|
+ query = query.invalidate();
|
|
64
|
+ var input = new XMLInput(buffer, 1);
|
|
65
|
+ var graph = findChildObject(Windows.loggingWindow, 'graph');
|
|
66
|
+ var log = findChildObject(Windows.loggingWindow, 'log');
|
|
67
|
+ log.clear();
|
|
68
|
+ graph.clear();
|
|
69
|
+ input.newTemperatureColumn.connect(log.setHeaderData);
|
|
70
|
+ input.newTemperatureColumn.connect(function(col, text) {
|
|
71
|
+ if(text == Windows.loggingWindow.targetcolumnname) {
|
|
72
|
+ targetseries = col;
|
|
73
|
+ }
|
|
74
|
+ });
|
|
75
|
+ input.newAnnotationColumn.connect(log.setHeaderData);
|
|
76
|
+ input.measure.connect(graph.newMeasurement);
|
|
77
|
+ input.measure.connect(log.newMeasurement);
|
|
78
|
+ input.measure.connect(function(data, series) {
|
|
79
|
+ if(series == targetseries) {
|
|
80
|
+ targetDetector.newMeasurement(data);
|
|
81
|
+ }
|
|
82
|
+ });
|
|
83
|
+ var lc;
|
|
84
|
+ input.lastColumn.connect(function(c) {
|
|
85
|
+ lc = c;
|
|
86
|
+ QSettings.setValue("liveColumn", c + 1);
|
|
87
|
+ Windows.loggingWindow.postLoadColumnSetup(c);
|
|
88
|
+ });
|
|
89
|
+ input.annotation.connect(log.newAnnotation);
|
|
90
|
+ input.annotation.connect(function(note, tcol, ncol) {
|
|
91
|
+ for(var i = tcol; i < ncol; i++) {
|
|
92
|
+ log.newAnnotation(note, i, ncol);
|
|
93
|
+ }
|
|
94
|
+ });
|
|
95
|
+ Windows.loggingWindow.windowTitle = "Typica - " + pname;
|
|
96
|
+ Windows.loggingWindow.raise();
|
|
97
|
+ Windows.loggingWindow.activateWindow();
|
|
98
|
+ input.input();
|
|
99
|
+ log.newAnnotation("End", 1, lc);
|
|
100
|
+ query = query.invalidate();
|
|
101
|
+ });
|
|
102
|
+ var viewbutton = findChildObject(this, 'viewprofile');
|
|
103
|
+ viewbutton.clicked.connect(function() {
|
|
104
|
+ var query = new QSqlQuery;
|
|
105
|
+ query.prepare("SELECT file, name FROM files WHERE id = :id");
|
|
106
|
+ query.bind(":id", Number(fileID));
|
|
107
|
+ query.exec();
|
|
108
|
+ if(query.next()) {
|
|
109
|
+ var viewer = createWindow('offline');
|
|
110
|
+ var buffer = new QBuffer(query.value(0));
|
|
111
|
+ var pname = query.value(1);
|
|
112
|
+ query = query.invalidate();
|
|
113
|
+ var input = new XMLInput(buffer, 1);
|
|
114
|
+ var graph = findChildObject(viewer, 'graph');
|
|
115
|
+ var log = findChildObject(viewer, 'log');
|
|
116
|
+ input.newTemperatureColumn.connect(log.setHeaderData);
|
|
117
|
+ input.newTemperatureColumn.connect(function(column) {
|
|
118
|
+ viewer.saveTemperatureColumns.push(column);
|
|
119
|
+ });
|
|
120
|
+ input.newAnnotationColumn.connect(log.setHeaderData);
|
|
121
|
+ input.newAnnotationColumn.connect(function(column) {
|
|
122
|
+ viewer.saveAnnotationColumns.push(column);
|
|
123
|
+ });
|
|
124
|
+ input.measure.connect(graph.newMeasurement);
|
|
125
|
+ input.measure.connect(log.newMeasurement);
|
|
126
|
+ input.annotation.connect(log.newAnnotation);
|
|
127
|
+ var lc;
|
|
128
|
+ input.lastColumn.connect(function(c) {
|
|
129
|
+ lc = c;
|
|
130
|
+ if(c < 3) {
|
|
131
|
+ log.setHeaderData(3, "");
|
|
132
|
+ }
|
|
133
|
+ });
|
|
134
|
+ input.annotation.connect(function(note, tcol, ncol) {
|
|
135
|
+ for(var i = tcol; i < ncol; i++) {
|
|
136
|
+ log.newAnnotation(note, i, ncol);
|
|
137
|
+ }
|
|
138
|
+ });
|
|
139
|
+ viewer.windowTitle = "Typica - " + pname;
|
|
140
|
+ viewer.raise();
|
|
141
|
+ viewer.activateWindow();
|
|
142
|
+ graph.updatesEnabled = false;
|
|
143
|
+ log.updatesEnabled = false;
|
|
144
|
+ input.input();
|
|
145
|
+ log.updatesEnabled = true;
|
|
146
|
+ graph.updatesEnabled = true;
|
|
147
|
+ log.newAnnotation("End", 1, lc);
|
|
148
|
+ }
|
|
149
|
+ else {
|
|
150
|
+ print("Query returned no results");
|
|
151
|
+ }
|
|
152
|
+ query = query.invalidate();
|
|
153
|
+ });
|
|
154
|
+ window.loadData = function(table, row) {
|
|
155
|
+ tableReference = table;
|
|
156
|
+ rowReference = row;
|
|
157
|
+ var buffer = new QBuffer;
|
|
158
|
+ buffer.open(3);
|
|
159
|
+ var output = new XmlWriter(buffer);
|
|
160
|
+ output.writeStartDocument("1.0");
|
|
161
|
+ output.writeDTD('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg.dtd">');
|
|
162
|
+ output.writeStartElement("html");
|
|
163
|
+ output.writeAttribute("xmlns", "http://www.w3.org/1999/xhtml");
|
|
164
|
+ output.writeStartElement("head");
|
|
165
|
+ output.writeTextElement("title", "Batch Details");
|
|
166
|
+ output.writeEndElement();
|
|
167
|
+ output.writeStartElement("body");
|
|
168
|
+ output.writeStartElement("div");
|
|
169
|
+ output.writeAttribute("style", "float: left; padding-right: 10px");
|
|
170
|
+ output.writeStartElement("p");
|
|
171
|
+ output.writeTextElement("strong", "Roasted Coffee: ");
|
|
172
|
+ output.writeTextElement("span", table.data(row, 2));
|
|
173
|
+ output.writeEndElement();
|
|
174
|
+ output.writeEndElement();
|
|
175
|
+ output.writeStartElement("div");
|
|
176
|
+ output.writeAttribute("style", "float: left");
|
|
177
|
+ output.writeStartElement("p");
|
|
178
|
+ output.writeTextElement("strong", "Roasted On: ");
|
|
179
|
+ batchTime = table.data(row, 0);
|
|
180
|
+ output.writeTextElement("span", batchTime);
|
|
181
|
+ output.writeEndElement();
|
|
182
|
+ output.writeStartElement("p");
|
|
183
|
+ output.writeTextElement("strong", "Batch Duration: ");
|
|
184
|
+ output.writeTextElement("span", table.data(row, 6));
|
|
185
|
+ output.writeEndElement();
|
|
186
|
+ output.writeEndElement();
|
|
187
|
+ output.writeStartElement("div");
|
|
188
|
+ output.writeAttribute("style", "clear: both");
|
|
189
|
+ output.writeEndElement();
|
|
190
|
+ output.writeStartElement("table");
|
|
191
|
+ output.writeStartElement("thead");
|
|
192
|
+ output.writeStartElement("tr");
|
|
193
|
+ output.writeTextElement("th", "Green Coffee");
|
|
194
|
+ output.writeTextElement("th", "Weight (lb)");
|
|
195
|
+ output.writeEndElement();
|
|
196
|
+ output.writeEndElement();
|
|
197
|
+ output.writeStartElement("tbody");
|
|
198
|
+ var query = new QSqlQuery();
|
|
199
|
+ query.prepare("SELECT unroasted_id, unroasted_quantity, approval, files, annotation, unroasted_total_quantity, roasted_quantity FROM roasting_log WHERE time = :time AND machine = :machine");
|
|
200
|
+ query.bind(":time", batchTime);
|
|
201
|
+ machine = table.data(row, 1);
|
|
202
|
+ query.bind(":machine", machine);
|
|
203
|
+ query.exec();
|
|
204
|
+ query.next();
|
|
205
|
+ approval = query.value(2);
|
|
206
|
+ annotation = query.value(4);
|
|
207
|
+ var items = sqlToArray(query.value(0));
|
|
208
|
+ var quantities = sqlToArray(query.value(1));
|
|
209
|
+ var nameQuery = new QSqlQuery();
|
|
210
|
+ nameQuery.prepare("SELECT name FROM items WHERE id = :id");
|
|
211
|
+ for(var i = 0; i < items.length; i++) {
|
|
212
|
+ output.writeStartElement("tr");
|
|
213
|
+ nameQuery.bind(":id", items[i]);
|
|
214
|
+ nameQuery.exec();
|
|
215
|
+ nameQuery.next();
|
|
216
|
+ output.writeTextElement("td", nameQuery.value(0) + " (" + items[i] + ")");
|
|
217
|
+ output.writeStartElement("td");
|
|
218
|
+ output.writeAttribute("align", "center");
|
|
219
|
+ output.writeCharacters(quantities[i]);
|
|
220
|
+ output.writeEndElement();
|
|
221
|
+ output.writeEndElement();
|
|
222
|
+ }
|
|
223
|
+ nameQuery = nameQuery.invalidate();
|
|
224
|
+ output.writeEndElement();
|
|
225
|
+ output.writeStartElement("tfoot");
|
|
226
|
+ output.writeStartElement("tr");
|
|
227
|
+ output.writeStartElement("td");
|
|
228
|
+ output.writeAttribute("align", "right");
|
|
229
|
+ output.writeTextElement("strong", "Green Total:");
|
|
230
|
+ output.writeEndElement();
|
|
231
|
+ output.writeStartElement("td");
|
|
232
|
+ output.writeAttribute("align", "center");
|
|
233
|
+ output.writeCharacters(query.value(5));
|
|
234
|
+ output.writeEndElement();
|
|
235
|
+ output.writeEndElement();
|
|
236
|
+ output.writeStartElement("tr");
|
|
237
|
+ output.writeStartElement("td");
|
|
238
|
+ output.writeAttribute("align", "right");
|
|
239
|
+ output.writeTextElement("strong", "Roasted Weight:");
|
|
240
|
+ output.writeEndElement();
|
|
241
|
+ output.writeStartElement("td");
|
|
242
|
+ output.writeAttribute("align", "center");
|
|
243
|
+ output.writeCharacters(query.value(6));
|
|
244
|
+ output.writeEndElement();
|
|
245
|
+ output.writeEndElement();
|
|
246
|
+ output.writeStartElement("tr");
|
|
247
|
+ output.writeStartElement("td");
|
|
248
|
+ output.writeAttribute("align", "right");
|
|
249
|
+ output.writeTextElement("strong", "Weight Loss:");
|
|
250
|
+ output.writeEndElement();
|
|
251
|
+ output.writeStartElement("td");
|
|
252
|
+ output.writeAttribute("align", "center");
|
|
253
|
+ output.writeCharacters(table.data(row, 5));
|
|
254
|
+ output.writeCharacters("%");
|
|
255
|
+ output.writeEndElement();
|
|
256
|
+ output.writeEndElement();
|
|
257
|
+ output.writeEndElement();
|
|
258
|
+ output.writeEndElement();
|
|
259
|
+ output.writeStartElement("p");
|
|
260
|
+ output.writeTextElement("strong", "Approved: ");
|
|
261
|
+ output.writeCharacters(approval);
|
|
262
|
+ output.writeEndElement();
|
|
263
|
+ output.writeStartElement("p");
|
|
264
|
+ output.writeTextElement("strong", "Files: ");
|
|
265
|
+ output.writeCharacters(query.value(3));
|
|
266
|
+ output.writeEndElement();
|
|
267
|
+ output.writeStartElement("p");
|
|
268
|
+ output.writeTextElement("strong", "Annotations:");
|
|
269
|
+ var files = sqlToArray(query.value(3));
|
|
270
|
+ var annotations = annotationFromRecord(files[0]);
|
|
271
|
+ fileID = files[0];
|
|
272
|
+ var buffer2 = new QBuffer("<points>"+annotations+"</points>");
|
|
273
|
+ buffer2.open(1);
|
|
274
|
+ var colQuery = new XQuery;
|
|
275
|
+ colQuery.bind("profile", buffer2);
|
|
276
|
+ colQuery.setQuery('for $i in doc($profile)//tuple[1]/temperature/@series return (string($i), ";")');
|
|
277
|
+ var result = colQuery.exec();
|
|
278
|
+ buffer2.close();
|
|
279
|
+ var seriesHeaders = new Array();
|
|
280
|
+ seriesHeaders.push("Time");
|
|
281
|
+ var records = result.split(";");
|
|
282
|
+ for(var i = 0; i < records.length - 1; i++) {
|
|
283
|
+ seriesHeaders.push(records[i].replace(/^\s+|\s+$/g,""));
|
|
284
|
+ }
|
|
285
|
+ seriesHeaders.push("Note");
|
|
286
|
+ output.writeStartElement("table");
|
|
287
|
+ output.writeStartElement("thead");
|
|
288
|
+ output.writeStartElement("tr");
|
|
289
|
+ for(var i = 0; i < seriesHeaders.length; i++) {
|
|
290
|
+ output.writeTextElement("th", seriesHeaders[i]);
|
|
291
|
+ }
|
|
292
|
+ output.writeEndElement();
|
|
293
|
+ output.writeEndElement();
|
|
294
|
+ buffer2.open(1);
|
|
295
|
+ var rq = 'for $t in doc($profile) //tuple return (string($t/time), ";", ';
|
|
296
|
+ for(var i = 0; i < seriesHeaders.length - 2; i++) {
|
|
297
|
+ rq = rq + 'string($t/temperature[' + Number(i+1) + ']), ";", ';
|
|
298
|
+ }
|
|
299
|
+ rq = rq + 'string($t/annotation), "~")';
|
|
300
|
+ colQuery.setQuery(rq);
|
|
301
|
+ var annotationData = colQuery.exec();
|
|
302
|
+ colQuery = colQuery.invalidate();
|
|
303
|
+ buffer2.close();
|
|
304
|
+ output.writeStartElement("tbody");
|
|
305
|
+ var annotationRecords = annotationData.split("~");
|
|
306
|
+ for(var i = 0; i < annotationRecords.length - 1; i++) {
|
|
307
|
+ output.writeStartElement("tr");
|
|
308
|
+ var annotationRow = annotationRecords[i].split(";");
|
|
309
|
+ for(var j = 0; j < annotationRow.length; j++) {
|
|
310
|
+ output.writeStartElement("td");
|
|
311
|
+ output.writeAttribute("style", "border-left: 1px solid #000000");
|
|
312
|
+ if(j > 0) {
|
|
313
|
+ output.writeAttribute("align", "center");
|
|
314
|
+ }
|
|
315
|
+ if(j > 0 && j < annotationRow.length - 1) {
|
|
316
|
+ output.writeCharacters(Number(annotationRow[j].replace(/^\s+|\s+$/g,"")).toFixed(2));
|
|
317
|
+ }
|
|
318
|
+ else {
|
|
319
|
+ output.writeCharacters(annotationRow[j].replace(/^\s+|\s+$/g,""));
|
|
320
|
+ }
|
|
321
|
+ output.writeEndElement();
|
|
322
|
+ }
|
|
323
|
+ output.writeEndElement();
|
|
324
|
+ }
|
|
325
|
+ output.writeEndElement();
|
|
326
|
+ output.writeEndElement();
|
|
327
|
+ output.writeCharacters(annotation);
|
|
328
|
+ output.writeEndElement();
|
|
329
|
+ output.writeEndElement();
|
|
330
|
+ output.writeEndElement();
|
|
331
|
+ output.writeEndDocument();
|
|
332
|
+ dataView.setContent(buffer);
|
|
333
|
+ buffer.close();
|
|
334
|
+ query = query.invalidate();
|
|
335
|
+ edit.enabled = true;
|
|
336
|
+ };
|
|
337
|
+ var saveMenu = findChildObject(this, 'save');
|
|
338
|
+ saveMenu.triggered.connect(function() {
|
|
339
|
+ var filename = QFileDialog.getSaveFileName(window, "Save Log As…", QSettings.value("script/lastDir", "") + "/");
|
|
340
|
+ if(filename != "") {
|
|
341
|
+ saveFileFromDatabase(fileID, filename);
|
|
342
|
+ }
|
|
343
|
+ });
|
347
|
344
|
]]>
|
348
|
345
|
</program>
|
349
|
346
|
</window>
|