contacts-pane
Version:
Contacts Pane: Contacts manager for Address Book, Groups, and Individuals.
172 lines (152 loc) • 5.76 kB
JavaScript
import * as UI from 'solid-ui'
import { solidLogicSingleton } from 'solid-logic'
const { setACLUserPublic } = solidLogicSingleton.acl
// const mime = require('mime-types')
// const toolsPane0 = require('./toolsPane')
// const toolsPane = toolsPane0.toolsPane
const $rdf = UI.rdf
// const ns = UI.ns
// const utils = UI.utils
// Mint a new address book
export function mintNewAddressBook (dataBrowserContext, context) {
return new Promise(function (resolve, reject) {
UI.login.ensureLoadedProfile(context).then(
context => {
// 20180713
console.log('Logged in as ' + context.me)
const me = context.me
const dom = context.dom
const div = context.div
const kb = dataBrowserContext.session.store
const ns = UI.ns
const newBase = context.newBase || context.newInstance.dir().uri
const instanceClass = context.instanceClass || ns.vcard('AddressBook')
if (instanceClass.sameTerm(ns.vcard('Group'))) {
// Make a group not an address book
const g =
context.newInstance || kb.sym(context.newBase + 'index.ttl#this')
const doc = g.doc()
kb.add(g, ns.rdf('type'), ns.vcard('Group'), doc)
kb.add(
g,
ns.vcard('fn'),
context.instanceName || 'untitled group',
doc
) // @@ write doc back
kb.fetcher
.putBack(doc, { contentType: 'text/turtle' })
.then(function (_xhr) {
resolve(context)
})
.catch(function (err) {
reject(
new Error('Error creating document for new group ' + err)
)
})
return
}
const appInstanceNoun = 'address book'
function complain (message) {
div.appendChild(UI.widgets.errorMessageBlock(dom, message, 'pink'))
}
let bookContents = `@prefix vcard: <http://www.w3.org/2006/vcard/ns#>.
@prefix ab: <http://www.w3.org/ns/pim/ab#>.
@prefix dc: <http://purl.org/dc/elements/1.1/>.
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
<#this> a vcard:AddressBook;
dc:title "New address Book";
vcard:nameEmailIndex <people.ttl>;
vcard:groupIndex <groups.ttl>.
`
bookContents +=
'<#this> <http://www.w3.org/ns/auth/acl#owner> <' +
me.uri +
'>.\n\n'
const newAppInstance = kb.sym(newBase + 'index.ttl#this')
const toBeWritten = [
{
to: 'index.ttl',
content: bookContents,
contentType: 'text/turtle'
},
{ to: 'groups.ttl', content: '', contentType: 'text/turtle' },
{ to: 'people.ttl', content: '', contentType: 'text/turtle' },
{ to: '', existing: true, aclOptions: { defaultForNew: true } }
]
// @@ Ask user abut ACLs?
//
// @@ Add header to PUT If-None-Match: * to prevent overwrite
//
function claimSuccess (newAppInstance, appInstanceNoun) {
// @@ delete or grey other stuff
console.log(`New ${appInstanceNoun} created at ${newAppInstance}`)
const p = div.appendChild(dom.createElement('p'))
p.setAttribute('style', 'font-size: 140%;')
p.innerHTML =
"Your <a href='" +
newAppInstance.uri +
"'><b>new " +
appInstanceNoun +
'</b></a> is ready. ' +
"<br/><br/><a href='" +
newAppInstance.uri +
"'>Go to new " +
appInstanceNoun +
'</a>'
const newContext = Object.assign(
{ newInstance: newAppInstance },
context
)
resolve(newContext)
}
function doNextTask () {
function checkOKSetACL (uri, ok) {
if (!ok) {
complain('Error writing new file ' + task.to)
return reject(new Error('Error writing new file ' + task.to))
}
setACLUserPublic(dest, me, aclOptions)
.then(() => doNextTask())
.catch(err => {
const message =
'Error setting access permissions for ' +
task.to +
' : ' +
err.message
complain(message)
return reject(new Error(message))
})
}
if (toBeWritten.length === 0) {
claimSuccess(newAppInstance, appInstanceNoun)
} else {
var task = toBeWritten.shift() /* eslint-disable-line no-var */
console.log('Creating new file ' + task.to + ' in new instance ')
var dest = $rdf.uri.join(task.to, newBase) /* eslint-disable-line no-var */
var aclOptions = task.aclOptions || {} /* eslint-disable-line no-var */
if ('content' in task) {
kb.fetcher
.webOperation('PUT', dest, {
data: task.content,
saveMetadata: true,
contentType: task.contentType
})
.then(() => checkOKSetACL(dest, true))
} else if ('existing' in task) {
checkOKSetACL(dest, true)
} else {
reject(new Error('copy not expected buiding new app!!'))
// const from = task.from || task.to // default source to be same as dest
// UI.widgets.webCopy(base + from, dest, task.contentType, checkOKSetACL)
}
}
}
doNextTask()
},
err => {
// log in then
context.div.appendChild(UI.widgets.errorMessageBlock(err))
}
)
})
}