outline/userInput.js
function addNewPredicateObject (e) {
      if (UI.utils.getTarget(e).className !== 'bottom-border-active') return
      var This = outline.UserInput
      var target = UI.utils.getTarget(e)

        // UI.log.warn(ancestor(target,'TABLE').textContent);
      var insertTr = myDocument.createElement('tr')
      UI.utils.ancestor(target, 'DIV').insertBefore(insertTr, UI.utils.ancestor(target, 'TR'))
      var tempTr = myDocument.createElement('tr')
      var reqTerm1 = This.generateRequest('(TBD)', tempTr, true)
      insertTr.appendChild(tempTr.firstChild)
      var reqTerm2 = This.generateRequest('(Enter text or drag an object onto this field)', tempTr, false)
      insertTr.appendChild(tempTr.firstChild)
        // there should be an elegant way of doing this

        // Take the why of the last TR and write to it.
      if (UI.utils.ancestor(target, 'TR').previousSibling &&  // there is a previous predicate/object line
                UI.utils.ancestor(target, 'TR').previousSibling.AJAR_statement) {
        let preStat = UI.utils.ancestor(target, 'TR').previousSibling.AJAR_statement
            // This should always(?) input a non-inverse statement
        This.formUndetStat(insertTr, preStat.subject, reqTerm1, reqTerm2, preStat.why, false)
      } else { // no previous row: write to the document defining the subject
        var subject = UI.utils.getAbout(kb, UI.utils.ancestor(target.parentNode.parentNode, 'TD'))
        var doc = kb.sym(UI.rdf.Util.uri.docpart(subject.uri))
        This.formUndetStat(insertTr, subject, reqTerm1, reqTerm2, doc, false)
      }

      outline.walk('moveTo', insertTr.firstChild)
      UI.log.info('addNewPredicateObject: selection = ' + outline.getSelection().map(function (item) { return item.textContent }).join(', '))
      this.startFillInText(outline.getSelection()[0])
    }
function addNewPredicateObject (e) {
      if (UI.utils.getTarget(e).className !== 'bottom-border-active') return
      var This = outline.UserInput
      var target = UI.utils.getTarget(e)

        // UI.log.warn(ancestor(target,'TABLE').textContent);
      var insertTr = myDocument.createElement('tr')
      UI.utils.ancestor(target, 'DIV').insertBefore(insertTr, UI.utils.ancestor(target, 'TR'))
      var tempTr = myDocument.createElement('tr')
      var reqTerm1 = This.generateRequest('(TBD)', tempTr, true)
      insertTr.appendChild(tempTr.firstChild)
      var reqTerm2 = This.generateRequest('(Enter text or drag an object onto this field)', tempTr, false)
      insertTr.appendChild(tempTr.firstChild)
        // there should be an elegant way of doing this

        // Take the why of the last TR and write to it.
      if (UI.utils.ancestor(target, 'TR').previousSibling &&  // there is a previous predicate/object line
                UI.utils.ancestor(target, 'TR').previousSibling.AJAR_statement) {
        let preStat = UI.utils.ancestor(target, 'TR').previousSibling.AJAR_statement
            // This should always(?) input a non-inverse statement
        This.formUndetStat(insertTr, preStat.subject, reqTerm1, reqTerm2, preStat.why, false)
      } else { // no previous row: write to the document defining the subject
        var subject = UI.utils.getAbout(kb, UI.utils.ancestor(target.parentNode.parentNode, 'TD'))
        var doc = kb.sym(UI.rdf.Util.uri.docpart(subject.uri))
        This.formUndetStat(insertTr, subject, reqTerm1, reqTerm2, doc, false)
      }

      outline.walk('moveTo', insertTr.firstChild)
      UI.log.info('addNewPredicateObject: selection = ' + outline.getSelection().map(function (item) { return item.textContent }).join(', '))
      this.startFillInText(outline.getSelection()[0])
    }
Called when the blue cross under the default pane is clicked. Add a new row to a property list ( P and O)