contacts-pane
Version:
Contacts Pane: Contacts manager for Address Book, Groups, and Individuals.
93 lines (76 loc) • 3.16 kB
text/typescript
// The Control with decorations
import { NamedNode } from 'rdflib'
import { store } from 'solid-logic'
import { ns, widgets, icons } from 'solid-ui'
import { renderAutoComplete } from './autocompletePicker' // dbpediaParameters
import { wikidataParameters } from './publicData'
const WEBID_NOUN = 'Solid ID'
const kb = store
const AUTOCOMPLETE_THRESHOLD = 4 // don't check until this many characters typed
const AUTOCOMPLETE_ROWS = 12 // 20?
const GREEN_PLUS = icons.iconBase + 'noun_34653_green.svg'
const SEARCH_ICON = icons.iconBase + 'noun_Search_875351.svg'
export async function renderAutocompleteControl (dom:HTMLDocument,
person:NamedNode, options, addOneIdAndRefresh): Promise<HTMLElement> {
async function autoCompleteDone (object, _name) {
const webid = object.uri
removeDecorated()
return addOneIdAndRefresh(person, webid)
}
async function greenButtonHandler (_event) {
const webid = await widgets.askName(dom, store, creationArea, ns.vcard('url'), null, WEBID_NOUN)
if (!webid) {
return // cancelled by user
}
return addOneIdAndRefresh(person, webid)
}
function removeDecorated () {
creationArea.removeChild(decoratedAutocomplete)
decoratedAutocomplete = null
}
async function searchButtonHandler (_event) {
if (decoratedAutocomplete) {
creationArea.removeChild(decoratedAutocomplete)
decoratedAutocomplete = null
} else {
decoratedAutocomplete = dom.createElement('div')
decoratedAutocomplete.setAttribute('style', 'display: flex; flex-flow: wrap;')
decoratedAutocomplete.appendChild(await renderAutoComplete(dom, acOptions, autoCompleteDone))
decoratedAutocomplete.appendChild(acceptButton)
decoratedAutocomplete.appendChild(cancelButton)
creationArea.appendChild(decoratedAutocomplete)
}
}
async function droppedURIHandler (uris) {
for (const webid of uris) { // normally one but can be more than one
await addOneIdAndRefresh(person, webid)
}
}
const queryParams = options.queryParameters || wikidataParameters
const acceptButton = widgets.continueButton(dom)
const cancelButton = widgets.cancelButton(dom, removeDecorated)
const klass = options.class
const acOptions = {
queryParams,
class:klass,
acceptButton,
cancelButton
}
var decoratedAutocomplete = null
// const { dom } = dataBrowserContext
options = options || {}
options.editable = kb.updater.editable(person.doc().uri, kb)
const creationArea = dom.createElement('div')
creationArea.setAttribute('style', 'display: flex; flex-flow: wrap;')
if (options.editable) {
// creationArea.appendChild(await renderAutoComplete(dom, options, autoCompleteDone)) wait for searchButton
creationArea.style.width = '100%'
const plus = creationArea.appendChild(widgets.button(dom, GREEN_PLUS, options.idNoun, greenButtonHandler))
widgets.makeDropTarget(plus, droppedURIHandler, null)
if (options.dbLookup) {
creationArea.appendChild(widgets.button(dom, SEARCH_ICON, options.idNoun, searchButtonHandler))
}
}
return creationArea
} // renderAutocompleteControl
// ends