From 6da5c7fc66e83aa2b704ea42de141c0f1888d2c3 Mon Sep 17 00:00:00 2001
From: Moises Sacal <moisbo@gmail.com>
Date: Thu, 3 Oct 2019 14:42:20 +1000
Subject: [PATCH] started configurble components

---
 package-lock.json                        |  5 +++
 package.json                             |  3 +-
 src/components/isIterable.js             |  9 +++++
 src/components/views/SubDoc.js           | 26 +++++++++++++
 src/components/views/SubDocDate.js       | 19 ++++++++++
 src/components/views/SubDocHorizontal.js | 29 +++++++++++++++
 src/components/views/ViewDoc.js          | 25 +++++++++++--
 src/components/views/ViewTable.js        | 47 ++++++++++++++++++------
 src/index.js                             |  8 +++-
 9 files changed, 155 insertions(+), 16 deletions(-)
 create mode 100644 src/components/isIterable.js
 create mode 100644 src/components/views/SubDoc.js
 create mode 100644 src/components/views/SubDocDate.js
 create mode 100644 src/components/views/SubDocHorizontal.js

diff --git a/package-lock.json b/package-lock.json
index e19c810..b19c5da 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5255,6 +5255,11 @@
         }
       }
     },
+    "moment": {
+      "version": "2.24.0",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
+      "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
+    },
     "move-concurrently": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
diff --git a/package.json b/package.json
index 9342b58..f707eca 100644
--- a/package.json
+++ b/package.json
@@ -31,6 +31,7 @@
   "dependencies": {
     "axios": "^0.19.0",
     "bootstrap": "^4.3.1",
-    "jquery": "^3.4.1"
+    "jquery": "^3.4.1",
+    "moment": "^2.24.0"
   }
 }
diff --git a/src/components/isIterable.js b/src/components/isIterable.js
new file mode 100644
index 0000000..3525012
--- /dev/null
+++ b/src/components/isIterable.js
@@ -0,0 +1,9 @@
+const isIterable = function(obj){
+    // checks for null and undefined
+    if (obj == null) {
+      return false;
+    }
+    return typeof obj[Symbol.iterator] === 'function';
+};
+
+module.exports = isIterable;
\ No newline at end of file
diff --git a/src/components/views/SubDoc.js b/src/components/views/SubDoc.js
new file mode 100644
index 0000000..97a1d05
--- /dev/null
+++ b/src/components/views/SubDoc.js
@@ -0,0 +1,26 @@
+const $ = require("jquery");
+const isIterable = require('../isIterable');
+
+const SubDoc = function (data) {
+  const div = $('<div class="row">');
+  const headerDiv = $('<div class="col-sm-2">').html(data.fieldName);
+  div.append(headerDiv);
+  if (isIterable(data.value)) {
+    for (let key of data.value) {
+      try {
+        const subDiv = $('<div class="col-sm">');
+        const item = JSON.parse(data.value);
+        // TODO: talk to Michael Lynch
+        const display = eval("`"  + data.template + "`");
+        const dis = $('<span>').html(display);
+        subDiv.append(dis);
+        div.append(subDiv);
+      } catch (e) {
+        div.append('')
+      }
+    }
+  }
+  return div;
+}
+
+module.exports = SubDoc;
\ No newline at end of file
diff --git a/src/components/views/SubDocDate.js b/src/components/views/SubDocDate.js
new file mode 100644
index 0000000..ddf9b87
--- /dev/null
+++ b/src/components/views/SubDocDate.js
@@ -0,0 +1,19 @@
+const $ = require('jquery');
+const moment = require('moment');
+const isIterable = require('../isIterable');
+
+const SubDocDate = function (data) {
+  const div = $('<div class="row">');
+  const headerDiv = $('<div class="col-sm-2">').html(data.fieldName);
+  div.append(headerDiv);
+  if (isIterable(data['value'])) {
+    for (let key of data['value']) {
+      const value = moment(key).format('LL');
+      const eleDiv = $('<div class="col-sm-6">').html(value);
+      div.append(eleDiv);
+    }
+  }
+
+  return div;
+};
+module.exports = SubDocDate;
\ No newline at end of file
diff --git a/src/components/views/SubDocHorizontal.js b/src/components/views/SubDocHorizontal.js
new file mode 100644
index 0000000..45c9298
--- /dev/null
+++ b/src/components/views/SubDocHorizontal.js
@@ -0,0 +1,29 @@
+const $ = require("jquery");
+const isIterable = require('../isIterable');
+
+const SubDocHorizontal = function (data) {
+  const div = $('<div class="row">');
+  const headerDiv = $('<div class="col-sm-2">').html(data.fieldName);
+  div.append(headerDiv);
+  if (isIterable(data.value)) {
+    for (let key of data.value) {
+      try {
+        const a = $('<a>');
+        const subDiv = $('<div class="col-sm">');
+        const sub = JSON.parse(key);
+        const href = `/#view/${sub['@id']}`;
+        a.attr('href', href);
+        a.attr('title', sub['name']);
+        a.text(sub['name']);
+        a.addClass("link");
+        subDiv.append(a);
+        div.append(subDiv);
+      } catch (e) {
+        div.append('')
+      }
+    }
+  }
+  return div;
+}
+
+module.exports = SubDocHorizontal;
\ No newline at end of file
diff --git a/src/components/views/ViewDoc.js b/src/components/views/ViewDoc.js
index fc9b3cb..6917ad0 100644
--- a/src/components/views/ViewDoc.js
+++ b/src/components/views/ViewDoc.js
@@ -2,6 +2,7 @@ const $ = require("jquery");
 const ViewTable = require('./ViewTable');
 const ViewErrorElement = require('./ViewErrorElement');
 const ViewRelated = require('./ViewRelated');
+const isIterable = require('../isIterable');
 
 const ViewDoc = function (data) {
 
@@ -11,7 +12,6 @@ const ViewDoc = function (data) {
   if (doc) {
     const heading = $('<h1>').html(doc.name);
     const desc = $('<p>').html(doc.description);
-    const date = $('<p>').html(doc.datePublished);
     const related = $('<div>');
     if (data.main.related.length > 0) {
       const relatedInfo = $('<h3>').html('Related Objects');
@@ -24,9 +24,28 @@ const ViewDoc = function (data) {
       }
       related.append(relatedUl);
     }
-    const fields = ["author"];
+    const linkTo = $('<div>');
+    if (isIterable(doc['uri_id'])) {
+      for (let resolve of doc['uri_id']) {
+        const goTo = $('<a>');
+        goTo.attr('href', `${data.config.repo}${resolve}`);
+        goTo.attr('title', 'Open Record');
+        goTo.attr('target', 'blank');
+        goTo.text('Open Record');
+        goTo.addClass("link");
+        linkTo.append(goTo);
+      }
+    }
+    let tableFields = data.main.viewFields || [];
+    // if (doc['record_type_s'] === data.main.tabledDoc) {
+    //   tableFields = data.main.viewFields;
+    // }
 
-    summary.append(heading).append(desc).append(date).append(ViewTable(doc, fields)).append(related);
+    summary.append(heading)
+        .append(desc)
+        .append(ViewTable(doc, tableFields))
+        .append(related)
+        .append(linkTo);
     dummy.append(summary);
     return dummy.html();
   } else {
diff --git a/src/components/views/ViewTable.js b/src/components/views/ViewTable.js
index 34fd38f..1c11ad8 100644
--- a/src/components/views/ViewTable.js
+++ b/src/components/views/ViewTable.js
@@ -1,23 +1,48 @@
 const $ = require("jquery");
 const ViewSubDoc = require('./ViewSubDoc');
+const SubDocHorizontal = require('./SubDocHorizontal');
+const SubDocDate = require('./SubDocDate');
+const SubDoc = require('./SubDoc');
+
 const ViewTable = function (doc, fields) {
 
-  //"fields" =  ["name", "author", "description", "publisher", "date"]
   const dummy = $('<div>');
-  const table = $('<table class="table">');
+  const div = $('<div class="table table-responsive">');
 
   for (let key of fields) {
-    const tr = $('<tr>');
-    if (key === 'author') {
-      const subDoc = ViewSubDoc(doc[key]);
-      tr.append(subDoc);
-    } else {
-      tr.append($('<th>').html(key));
-      tr.append($('<td>').html(doc[key]));
+    const list = $('<div class="table">');
+    let subDoc;
+    switch (key.display) {
+      case 'SubDocHorizontal':
+        if(doc[key.field]) {
+          subDoc = SubDocHorizontal({key: key.field, value: doc[key.field], fieldName: key.fieldName});
+          list.append(subDoc);
+        }
+        break;
+      case 'SubDocDate':
+        if(doc[key.field]) {
+          subDoc = SubDocDate({key: key.field, value: doc[key.field], fieldName: key.fieldName});
+          list.append(subDoc);
+        }
+        break;
+      case 'SubDoc':
+        if(doc[key.field]) {
+          subDoc = SubDoc({key: key.field, value: doc[key.field], fieldName: key.fieldName, template: key.template});
+          list.append(subDoc);
+        }
+        break;
+      default:
+        if(doc[key.field]) {
+          const row = $('<div class="row">');
+          const defaultKey = $('<div class="col-sm-2">').html(`${key.fieldName}`);
+          const defaultValue = $('<div class="col-sm-6">').html(doc[key.field]);
+          row.append(defaultKey).append(defaultValue);
+          list.append(row);
+        }
     }
-    table.append(tr);
+    div.append(list);
   }
-  dummy.append(table);
+  dummy.append(div);
   return dummy;
 };
 
diff --git a/src/index.js b/src/index.js
index ddba3be..b950518 100644
--- a/src/index.js
+++ b/src/index.js
@@ -37,7 +37,13 @@ let state = {
     numFound: 0,
     pageSize: 10,
     searchText: '',
-    related: []
+    related: [],
+    viewFields: [
+      {display: "SubDocHorizontal", field: "author", fieldName: 'Author/s'},
+      {display: "", field: "license", fieldName: 'Licence'},
+      {display: "SubDocDate", field: "datePublished", fieldName: 'Date Published'},
+      {display: "SubDoc", field: "contactPoint", fieldName: 'Contact Point', template: '${item.name} ${item.email}'},
+    ]
   },
   config: config
 };
-- 
GitLab