UNPKG

contacts-pane

Version:

Contacts Pane: Contacts manager for Address Book, Groups, and Individuals.

93 lines (76 loc) 3.16 kB
// 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