Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorJacob Schatz <jschatz1@gmail.com>2017-04-09 14:49:57 +0300
committerJacob Schatz <jschatz1@gmail.com>2017-04-09 14:49:57 +0300
commita927f5e1b4d60aa597e64a2860efd85746d66f51 (patch)
treee5bc036352fcee4d9d25ed15e8d7036d4882fd12 /app
parent3d1cade13f61115b63bf6dbda5a1f194ba54b24b (diff)
Get xlsx back as JSON
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/blob/xlsx/index.js68
-rw-r--r--app/assets/javascripts/blob/xlsx_viewer.js5
-rw-r--r--app/assets/stylesheets/framework/xlsx.scss0
-rw-r--r--app/models/blob.rb6
-rw-r--r--app/views/projects/blob/_xlsx.html.haml4
5 files changed, 83 insertions, 0 deletions
diff --git a/app/assets/javascripts/blob/xlsx/index.js b/app/assets/javascripts/blob/xlsx/index.js
new file mode 100644
index 00000000000..fb823e639de
--- /dev/null
+++ b/app/assets/javascripts/blob/xlsx/index.js
@@ -0,0 +1,68 @@
+import xlsx from 'xlsx'
+
+export default class XlsxViewer {
+ constructor(el) {
+ this.el = el;
+ this.loadXlsxFile();
+ }
+
+ loadXlsxFile() {
+ var self = this;
+ var url = this.el.dataset.endpoint;
+ var oReq = new XMLHttpRequest();
+ oReq.open("GET", url, true);
+ oReq.responseType = "arraybuffer";
+
+ oReq.onload = function(e) {
+ var arraybuffer = oReq.response;
+
+ /* convert data to binary string */
+ var data = new Uint8Array(arraybuffer);
+ var arr = new Array();
+ for(var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
+ var bstr = arr.join("");
+
+ /* Call XLSX */
+ var workbook = xlsx.read(bstr, {type:"binary"});
+ self.processWorkbook(workbook);
+ }
+
+ oReq.send();
+ }
+
+
+ getColumns(sheet, type) {
+ var val, rowObject, range, columnHeaders, emptyRow, C;
+ if(!sheet['!ref']) return [];
+ range = xlsx.utils.decode_range(sheet["!ref"]);
+ columnHeaders = [];
+ for (C = range.s.c; C <= range.e.c; ++C) {
+ val = sheet[xlsx.utils.encode_cell({c: C, r: range.s.r})];
+ if(!val) continue;
+ columnHeaders[C] = val.v;
+ }
+ return columnHeaders;
+ }
+
+ toJson(wb) {
+ var result = {};
+ wb.SheetNames.forEach(function(sheetName) {
+ var roa = xlsx.utils.sheet_to_row_object_array(wb.Sheets[sheetName], {raw:true});
+ if(roa.length > 0) result[sheetName] = roa;
+ });
+ return result;
+ }
+
+ chooseSheet(sheetidx) {
+ this.processWorkbook(last_wb, sheetidx);
+ }
+
+ processWorkbook(wb, sheetidx) {
+ // opts.on.wb(wb, sheetidx);
+ var sheet = wb.SheetNames[sheetidx || 1];
+ var json = this.toJson(wb)[sheet], cols = this.getColumns(wb.Sheets[sheet]);
+ // opts.on.sheet(json, cols, wb.SheetNames, chooseSheet);
+ console.log(sheet)
+ console.log(json)
+ }
+} \ No newline at end of file
diff --git a/app/assets/javascripts/blob/xlsx_viewer.js b/app/assets/javascripts/blob/xlsx_viewer.js
new file mode 100644
index 00000000000..69a72a9be7a
--- /dev/null
+++ b/app/assets/javascripts/blob/xlsx_viewer.js
@@ -0,0 +1,5 @@
+import XlsxViewer from './xlsx';
+
+document.addEventListener('DOMContentLoaded', () => {
+ new XlsxViewer(document.getElementById('js-xlsx-viewer'));
+}); \ No newline at end of file
diff --git a/app/assets/stylesheets/framework/xlsx.scss b/app/assets/stylesheets/framework/xlsx.scss
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/app/assets/stylesheets/framework/xlsx.scss
diff --git a/app/models/blob.rb b/app/models/blob.rb
index 801d3442803..49a87370c61 100644
--- a/app/models/blob.rb
+++ b/app/models/blob.rb
@@ -50,6 +50,10 @@ class Blob < SimpleDelegator
name && File.extname(name) == '.pdf'
end
+ def xlsx?
+ binary? && name && File.extname(name) == '.xlsx'
+ end
+
def ipython_notebook?
text? && language&.name == 'Jupyter Notebook'
end
@@ -89,6 +93,8 @@ class Blob < SimpleDelegator
'stl'
elsif text?
'text'
+ elsif xlsx?
+ 'xlsx'
else
'download'
end
diff --git a/app/views/projects/blob/_xlsx.html.haml b/app/views/projects/blob/_xlsx.html.haml
new file mode 100644
index 00000000000..b06a9abf6b4
--- /dev/null
+++ b/app/views/projects/blob/_xlsx.html.haml
@@ -0,0 +1,4 @@
+- content_for :page_specific_javascripts do
+ = page_specific_javascript_bundle_tag('xlsx_viewer')
+
+.file-content#js-xlsx-viewer{ data: { endpoint: namespace_project_raw_path(@project.namespace, @project, @id) } } \ No newline at end of file