contacts-pane 3.2.1-3 → 3.2.1-5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/addressBookPresenter.esm.js +20 -41
- package/dist/addressBookPresenter.esm.js.map +1 -1
- package/dist/components/add-contact-modal/AddContactModal.d.ts +18 -0
- package/dist/components/add-contact-modal/AddContactModal.d.ts.map +1 -0
- package/dist/components/add-contact-modal/AddContactModal.esm.js +338 -0
- package/dist/components/add-contact-modal/AddContactModal.esm.js.map +1 -0
- package/dist/components/add-contact-modal/AddContactModal.styles.esm.js +7 -0
- package/dist/components/add-contact-modal/AddContactModal.styles.esm.js.map +1 -0
- package/dist/components/add-contact-modal/index.d.ts +4 -0
- package/dist/components/add-contact-modal/index.d.ts.map +1 -0
- package/dist/components/add-contact-modal/index.esm.js +1 -0
- package/dist/contactLogic.esm.js.map +1 -1
- package/dist/contactsPane.esm.js +124 -158
- package/dist/contactsPane.esm.js.map +1 -1
- package/dist/groupMembershipControl.esm.js.map +1 -1
- package/dist/index.cjs.js +1187 -1
- package/dist/index.cjs.js.map +1 -0
- package/dist/individual.esm.js.map +1 -1
- package/dist/localUtils.esm.js.map +1 -1
- package/dist/mugshotGallery.esm.js.map +1 -1
- package/dist/toolsPane.esm.js.map +1 -1
- package/dist/webidControl.esm.js.map +1 -1
- package/package.json +9 -6
- package/dist/_virtual/_rolldown/runtime.cjs.js +0 -1
- package/dist/addressBookPresenter.cjs.js +0 -2
- package/dist/addressBookPresenter.cjs.js.map +0 -1
- package/dist/contactLogic.cjs.js +0 -2
- package/dist/contactLogic.cjs.js.map +0 -1
- package/dist/contactsPane.cjs.js +0 -6
- package/dist/contactsPane.cjs.js.map +0 -1
- package/dist/debug.cjs.js +0 -2
- package/dist/debug.cjs.js.map +0 -1
- package/dist/groupMembershipControl.cjs.js +0 -2
- package/dist/groupMembershipControl.cjs.js.map +0 -1
- package/dist/individual.cjs.js +0 -3
- package/dist/individual.cjs.js.map +0 -1
- package/dist/localUtils.cjs.js +0 -8
- package/dist/localUtils.cjs.js.map +0 -1
- package/dist/mintNewAddressBook.cjs.js +0 -13
- package/dist/mintNewAddressBook.cjs.js.map +0 -1
- package/dist/mugshotGallery.cjs.js +0 -2
- package/dist/mugshotGallery.cjs.js.map +0 -1
- package/dist/ontology/individualAndOrganizationForm.cjs.js +0 -219
- package/dist/ontology/individualAndOrganizationForm.cjs.js.map +0 -1
- package/dist/ontology/vcard.cjs.js +0 -916
- package/dist/ontology/vcard.cjs.js.map +0 -1
- package/dist/rdfFormsHelper.cjs.js +0 -2
- package/dist/rdfFormsHelper.cjs.js.map +0 -1
- package/dist/toolsPane.cjs.js +0 -5
- package/dist/toolsPane.cjs.js.map +0 -1
- package/dist/webidControl.cjs.js +0 -2
- package/dist/webidControl.cjs.js.map +0 -1
|
@@ -34,14 +34,14 @@ async function N(e, t) {
|
|
|
34
34
|
} catch {
|
|
35
35
|
r("Error adding to group. Make sure you are adding a contact URI.");
|
|
36
36
|
}
|
|
37
|
-
e &&
|
|
37
|
+
e && B(C);
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
function P(t) {
|
|
41
41
|
function n(n) {
|
|
42
42
|
if (n.preventDefault(), A(w, i), k && k(), !n.metaKey) for (let e in x) delete x[e];
|
|
43
43
|
x[t.uri] = !x[t.uri], I(w, x), y.fetcher.nowOrWhenFetched(t.doc(), void 0, function(n, r) {
|
|
44
|
-
n || e("Cannot load one group: " + t + ". Stack: " + r),
|
|
44
|
+
n || e("Cannot load one group: " + t + ". Stack: " + r), B(C, null, !1);
|
|
45
45
|
});
|
|
46
46
|
}
|
|
47
47
|
let { groupLi: r, groupButton: i } = M(t);
|
|
@@ -56,7 +56,7 @@ function F(t, n, r) {
|
|
|
56
56
|
e(t), r && r(!1, t), s(t);
|
|
57
57
|
return;
|
|
58
58
|
}
|
|
59
|
-
a.classList.remove("group-loading"), a.setAttribute("aria-busy", "false"), a.classList.add("selected"), t[i.uri] = !0, I(n, t),
|
|
59
|
+
a.classList.remove("group-loading"), a.setAttribute("aria-busy", "false"), a.classList.add("selected"), t[i.uri] = !0, I(n, t), B(C, null), r && r(!0), o(!0);
|
|
60
60
|
});
|
|
61
61
|
});
|
|
62
62
|
}
|
|
@@ -104,17 +104,7 @@ async function z(e) {
|
|
|
104
104
|
return await y.fetcher.load(n), n;
|
|
105
105
|
} else return [];
|
|
106
106
|
}
|
|
107
|
-
function B(
|
|
108
|
-
if (e) return e;
|
|
109
|
-
let t;
|
|
110
|
-
for (let e in x) {
|
|
111
|
-
t = y.sym(e);
|
|
112
|
-
let n = y.any(void 0, _.vcard("includesGroup"), t);
|
|
113
|
-
if (n) return n;
|
|
114
|
-
}
|
|
115
|
-
throw Error("findBookFromGroups: Cant find address book which this group is part of");
|
|
116
|
-
}
|
|
117
|
-
function V(t, r, a = !0) {
|
|
107
|
+
function B(t, r, a = !0) {
|
|
118
108
|
let o = t || C;
|
|
119
109
|
if (!o || !o.children || typeof o.children.length != "number") {
|
|
120
110
|
n("refreshNames called with invalid ulPeople:", o);
|
|
@@ -122,7 +112,7 @@ function V(t, r, a = !0) {
|
|
|
122
112
|
}
|
|
123
113
|
function s(e, t) {
|
|
124
114
|
function n(e) {
|
|
125
|
-
e.preventDefault(),
|
|
115
|
+
e.preventDefault(), V(o, t, E);
|
|
126
116
|
}
|
|
127
117
|
e.addEventListener("click", n), e.addEventListener("keydown", function(e) {
|
|
128
118
|
(e.key === "Enter" || e.key === " ") && (e.preventDefault(), n(e));
|
|
@@ -164,14 +154,14 @@ function V(t, r, a = !0) {
|
|
|
164
154
|
let p = b.createElement("div");
|
|
165
155
|
return p.classList.add("personLi-arrow"), p.innerHTML = "<svg aria-hidden=\"true\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 4.5L11.25 9L6 13.5\" stroke=\"#595959\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>", i.appendChild(a), i.appendChild(d), i.appendChild(p), r.appendChild(i), s(r, t), r;
|
|
166
156
|
}
|
|
167
|
-
v.syncTableToArrayReOrdered(o, c, (e) => u(e, o)),
|
|
157
|
+
v.syncTableToArrayReOrdered(o, c, (e) => u(e, o)), U(o, a, r || E);
|
|
168
158
|
}
|
|
169
|
-
function
|
|
159
|
+
function V(n, r, i) {
|
|
170
160
|
if (!i) return;
|
|
171
|
-
i.parentNode && i.parentNode.classList.remove("hidden"), i.innerHTML = "Loading...", i.setAttribute("aria-busy", "true"), i.classList.add("detailsSectionContent--wide"), S = {}, S[r.uri] = !0,
|
|
161
|
+
i.parentNode && i.parentNode.classList.remove("hidden"), i.innerHTML = "Loading...", i.setAttribute("aria-busy", "true"), i.classList.add("detailsSectionContent--wide"), S = {}, S[r.uri] = !0, U(n, !1, i);
|
|
172
162
|
let l;
|
|
173
163
|
try {
|
|
174
|
-
l = D ?
|
|
164
|
+
l = D ? K(r) : r;
|
|
175
165
|
} catch (e) {
|
|
176
166
|
i.innerHTML = "", i.setAttribute("aria-busy", "false"), a(i, b, "Cannot load contact: " + e.message);
|
|
177
167
|
return;
|
|
@@ -207,25 +197,25 @@ function H(n, r, i) {
|
|
|
207
197
|
a(i, b, "Failed to delete contact. If it persists, contact your admin.");
|
|
208
198
|
return;
|
|
209
199
|
}
|
|
210
|
-
|
|
211
|
-
}).classList.add("deleteButton"), i.appendChild(f), i.classList.add("detailsSectionContent--wide"), i.appendChild(
|
|
200
|
+
B(n, i), i.innerHTML = "Contact data deleted.";
|
|
201
|
+
}).classList.add("deleteButton"), i.appendChild(f), i.classList.add("detailsSectionContent--wide"), i.appendChild(G(l, "contact"));
|
|
212
202
|
});
|
|
213
203
|
}
|
|
214
|
-
function
|
|
204
|
+
function H(e) {
|
|
215
205
|
if (S = {}, e) for (let t = 0; t < e.children.length; t++) e.children[t].classList.remove("selected");
|
|
216
206
|
}
|
|
217
|
-
function
|
|
207
|
+
function U(e, t, n) {
|
|
218
208
|
let r = 0, i = null;
|
|
219
209
|
for (let t = 0; t < e.children.length; t++) {
|
|
220
|
-
let n = e.children[t], a =
|
|
210
|
+
let n = e.children[t], a = W(l(n.subject));
|
|
221
211
|
a && (r++, i = n), n.classList.toggle("selected", a && !!S[n.subject.uri]), n.classList.toggle("hidden", !a);
|
|
222
212
|
}
|
|
223
213
|
if (r === 1 && t) {
|
|
224
214
|
let t = i.subject;
|
|
225
|
-
|
|
215
|
+
V(e, t, n);
|
|
226
216
|
}
|
|
227
217
|
}
|
|
228
|
-
function
|
|
218
|
+
function W(e) {
|
|
229
219
|
let t = T.value.trim().toLowerCase();
|
|
230
220
|
if (t.length === 0) return !0;
|
|
231
221
|
let n = t.split(" ");
|
|
@@ -235,16 +225,16 @@ function G(e) {
|
|
|
235
225
|
}
|
|
236
226
|
return !0;
|
|
237
227
|
}
|
|
238
|
-
function
|
|
228
|
+
function G(e, t) {
|
|
239
229
|
let n = O.session.paneRegistry.byName(t).render(e, O);
|
|
240
230
|
return n.classList.add("renderPane"), n;
|
|
241
231
|
}
|
|
242
|
-
function
|
|
232
|
+
function K(e) {
|
|
243
233
|
let t = y.allAliases(e), n = D.dir().uri;
|
|
244
234
|
for (let e = 0; e < t.length; e++) if (t[e].uri.slice(0, n.length) === n) return t[e];
|
|
245
235
|
throw Error("No local URI for " + e);
|
|
246
236
|
}
|
|
247
|
-
async function
|
|
237
|
+
async function q(e, n) {
|
|
248
238
|
let r = await z(e);
|
|
249
239
|
if (r && r.length > 0) {
|
|
250
240
|
let { del: e, ins: i } = await d(r);
|
|
@@ -253,18 +243,7 @@ async function J(e, n) {
|
|
|
253
243
|
});
|
|
254
244
|
}
|
|
255
245
|
}
|
|
256
|
-
async function Y() {
|
|
257
|
-
let e = B(D);
|
|
258
|
-
try {
|
|
259
|
-
await y.fetcher.load(e);
|
|
260
|
-
} catch {
|
|
261
|
-
throw Error("Book won't load:" + e);
|
|
262
|
-
}
|
|
263
|
-
let t = y.any(e, _.vcard("nameEmailIndex"));
|
|
264
|
-
if (!t) throw Error("No nameEmailIndex");
|
|
265
|
-
await y.fetcher.load(t);
|
|
266
|
-
}
|
|
267
246
|
//#endregion
|
|
268
|
-
export {
|
|
247
|
+
export { q as checkDataModel, M as createGroupLi, H as deselectAllPeople, N as handleURIsDroppedOnGroup, z as loadAllGroups, U as refreshFilteredPeople, B as refreshNames, I as refreshThingsSelected, j as renderGroupButtons, F as selectAllGroups, V as selectPerson, A as setActiveGroupButton, L as syncGroupUl };
|
|
269
248
|
|
|
270
249
|
//# sourceMappingURL=addressBookPresenter.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addressBookPresenter.esm.js","names":[],"sources":["../src/addressBookPresenter.js"],"sourcesContent":["import { addPersonToGroup, groupMembers, getDataModelIssues } from './contactLogic'\nimport * as UI from 'solid-ui'\nimport { authn, store } from 'solid-logic'\nimport * as debug from './debug'\nimport { complain, alertDialog, getSameAs, deleteRecursive, deleteThingAndDoc, compareForSort, nameFor } from './localUtils'\nimport { groupMembership } from './groupMembershipControl'\n\nconst ns = UI.ns\nconst utils = UI.utils\nconst kb = store\nlet dom\nlet selectedGroups = {}\nlet selectedPeople = {}\nlet ulPeople = null\nlet ulGroups = null\nlet searchInput = null\nlet cardMain = null\nlet book = null\nlet dataBrowserContext = null\nlet onGroupButtonClick = null\n\n// ######## Group presenter\n\nexport function setActiveGroupButton (groupsUl, activeBtn) {\n groupsUl.querySelectorAll('button').forEach(btn => {\n btn.classList.remove('btn-primary', 'allGroupsButton--selected', 'allGroupsButton--active', 'allGroupsButton--loaded')\n btn.classList.add('btn-secondary')\n })\n if (activeBtn) {\n activeBtn.classList.remove('btn-secondary')\n activeBtn.classList.add('btn-primary')\n }\n}\n\nexport function renderGroupButtons (currentBook, groupsUl, options, domElement, groupsSelected, peopleUl, searchEl, cardMainEl, context, groupClickCallback) {\n dom = domElement\n selectedGroups = groupsSelected || {}\n if (peopleUl) ulPeople = peopleUl\n if (searchEl) searchInput = searchEl\n if (cardMainEl) cardMain = cardMainEl\n if (context) dataBrowserContext = context\n if (groupClickCallback) onGroupButtonClick = groupClickCallback\n book = currentBook\n ulGroups = groupsUl\n const groups = groupsInOrder(book, options)\n utils.syncTableToArrayReOrdered(ulGroups, groups, renderGroupLi)\n}\n\n/** Create the common DOM structure for a group list item (li + button).\n * Returns { groupLi, groupButton, name } so callers can attach their own handlers.\n */\nexport function createGroupLi (group) {\n const name = kb.any(group, ns.vcard('fn'))\n const groupLi = dom.createElement('li')\n groupLi.setAttribute('role', 'listitem')\n groupLi.setAttribute('aria-label', name ? name.value : 'Some group')\n groupLi.subject = group\n UI.widgets.makeDraggable(groupLi, group)\n\n const groupButton = groupLi.appendChild(dom.createElement('button'))\n groupButton.setAttribute('type', 'button')\n groupButton.innerHTML = name ? name.value : 'Some group'\n groupButton.classList.add('allGroupsButton', 'actionButton', 'btn-secondary', 'action-button-focus')\n\n return { groupLi, groupButton, name }\n}\n\nexport async function handleURIsDroppedOnGroup (uris, group) {\n for (const u of uris) {\n let thing = kb.sym(u)\n try {\n thing = await addPersonToGroup(thing, group)\n } catch (_e) {\n const msg = 'Error adding to group. Make sure you are adding a contact URI.'\n alertDialog(msg)\n }\n if (thing) refreshNames(ulPeople)\n }\n}\n\nfunction renderGroupLi (group) {\n function groupLiClickListener (event) {\n event.preventDefault()\n setActiveGroupButton(ulGroups, groupButton)\n if (onGroupButtonClick) onGroupButtonClick()\n if (!event.metaKey) {\n for (const key in selectedGroups) delete selectedGroups[key] // If Command key pressed, accumulate multiple\n }\n selectedGroups[group.uri] = !selectedGroups[group.uri]\n refreshThingsSelected(ulGroups, selectedGroups)\n // Load group members and refresh people list\n kb.fetcher.nowOrWhenFetched(group.doc(), undefined, function (ok, message) {\n if (!ok) {\n debug.error('Cannot load one group: ' + group + '. Stack: ' + message)\n }\n refreshNames(ulPeople, null, false)\n })\n }\n\n const { groupLi, groupButton } = createGroupLi(group)\n\n groupButton.addEventListener('click', groupLiClickListener, false)\n UI.widgets.makeDropTarget(groupLi, uris => handleURIsDroppedOnGroup(uris, group))\n groupLi.addEventListener('click', groupLiClickListener, true)\n return groupLi\n} // renderGroupLi\n\nexport function selectAllGroups (\n selectedGroups,\n ulGroups,\n callbackFunction\n) {\n function fetchGroupAndSelect (group, groupLi) {\n return new Promise((resolve, reject) => {\n groupLi.classList.add('group-loading')\n groupLi.setAttribute('aria-busy', 'true')\n kb.fetcher.nowOrWhenFetched(group.doc(), undefined, function (\n ok,\n message\n ) {\n if (!ok) {\n const msg = 'Cannot load group ' + group + '. Stack: ' + message\n debug.error(msg)\n if (callbackFunction) callbackFunction(false, msg)\n reject(msg)\n return\n }\n groupLi.classList.remove('group-loading')\n groupLi.setAttribute('aria-busy', 'false')\n groupLi.classList.add('selected')\n selectedGroups[group.uri] = true\n refreshThingsSelected(ulGroups, selectedGroups)\n refreshNames(ulPeople, null) // @@ every time??\n if (callbackFunction) callbackFunction(true)\n resolve(true)\n })\n })\n }\n\n for (let k = 0; k < ulGroups.children.length; k++) {\n const groupLi = ulGroups.children[k]\n const group = groupLi.subject\n if (!group) continue // Skip non-group items (e.g. All contacts, New group)\n fetchGroupAndSelect(group, groupLi)\n .catch(err => {\n if (callbackFunction) callbackFunction(false, err)\n })\n } // for each row\n}\n\nexport function refreshThingsSelected (ul, selectionArray) {\n for (let i = 0; i < ul.children.length; i++) {\n const li = ul.children[i]\n if (li.subject) {\n li.classList.toggle('selected', !!selectionArray[li.subject.uri])\n }\n }\n}\n\nexport function syncGroupUl (book, options, groupsUl, domElement, groupsSelected, peopleUl, searchEl) {\n dom = domElement\n if (groupsSelected) selectedGroups = groupsSelected\n if (peopleUl) ulPeople = peopleUl\n if (searchEl) searchInput = searchEl\n ulGroups = groupsUl\n const groups = groupsInOrder(book, options)\n if (groups.length > 0) {\n renderGroupLi(groups[0]) // pre-render one to get the style right, then throw it away\n }\n utils.syncTableToArrayReOrdered(groupsUl, groups, renderGroupLi)\n // refreshThingsSelected(groupsUl, selectedGroups)\n}\n\nfunction groupsInOrder (book, options) {\n let sortMe = []\n if (options.foreignGroup) {\n sortMe.push([\n '',\n kb.any(options.foreignGroup, ns.vcard('fn')),\n options.foreignGroup\n ])\n }\n if (book) {\n const groupIndex = kb.any(book, ns.vcard('groupIndex'))\n const gs = book ? kb.each(book, ns.vcard('includesGroup'), null, groupIndex) : []\n const gs2 = gs.map(function (g) {\n return [book, kb.any(g, ns.vcard('fn')), g]\n })\n sortMe = sortMe.concat(gs2)\n sortMe.sort()\n }\n return sortMe.map(tuple => tuple[2])\n}\n\nexport async function loadAllGroups (book) {\n const groupIndex = kb.any(book, ns.vcard('groupIndex'))\n if (groupIndex) {\n await kb.fetcher.load(groupIndex)\n const gs = book ? kb.each(book, ns.vcard('includesGroup'), null, groupIndex) : []\n await kb.fetcher.load(gs)\n return gs\n } else {\n return [] // no groups\n }\n}\n\n// The book could be the main subject, or linked from a group we are dealing with\nexport function findBookFromGroups (book) {\n if (book) {\n return book\n }\n let g\n for (const gu in selectedGroups) {\n g = kb.sym(gu)\n const b = kb.any(undefined, ns.vcard('includesGroup'), g)\n if (b) return b\n }\n throw new Error(\n 'findBookFromGroups: Cant find address book which this group is part of'\n )\n}\n// ######## Group presenter - END\n\n// ######## Person presenter\n/** Refresh the list of names */\nexport function refreshNames (ulPeopleArg, detailsView, autoSelect = true) {\n // If the caller did not explicitly pass a list element, fall back to the\n // global variable that other helpers (renderGroupButtons, syncGroupUl, etc.)\n // keep up to date. This allows callers that don't have easy access to the\n // element to simply invoke `refreshNames()` and get the behaviour they\n // expect when the address-book UI is present.\n const ul = ulPeopleArg || ulPeople\n\n // Guard: ul must be a DOM element with children. Callers sometimes pass the\n // wrong thing (e.g. a person object) which leads to the\n // \"Cannot read properties of undefined (reading 'length')\" error in\n // syncTableToArrayReOrdered. Bail out early if the value is not valid.\n if (!ul || !ul.children || typeof ul.children.length !== 'number') {\n debug.warn('refreshNames called with invalid ulPeople:', ul)\n return\n }\n\n function setPersonListener (personLi, person) {\n function handleSelect (event) {\n event.preventDefault()\n selectPerson(ul, person, cardMain)\n }\n personLi.addEventListener('click', handleSelect)\n personLi.addEventListener('keydown', function (event) {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n handleSelect(event)\n }\n })\n }\n\n let cards = []\n const groups = Object.keys(selectedGroups).map(groupURI => kb.sym(groupURI))\n groups.forEach(group => {\n if (selectedGroups[group.value]) {\n cards = cards.concat(groupMembers(kb, group))\n }\n })\n cards.sort(compareForSort) // @@ sort by name not UID later\n for (let k = 0; k < cards.length - 1;) {\n if (cards[k].uri === cards[k + 1].uri) {\n cards.splice(k, 1) // Eliminate duplicates from more than one group\n } else {\n k++\n }\n }\n\n function renderNameInGroupList (person, ul) {\n const personLi = dom.createElement('li')\n personLi.setAttribute('role', 'listitem')\n personLi.setAttribute('tabindex', '0')\n personLi.classList.add('personLi')\n personLi.subject = person\n UI.widgets.makeDraggable(personLi, person)\n\n // Container for the row\n const rowDiv = dom.createElement('div')\n rowDiv.classList.add('personLi-row')\n\n // Left: Avatar\n const avatarDiv = dom.createElement('div')\n avatarDiv.classList.add('personLi-avatar')\n // Placeholder avatar (shown initially while person doc loads)\n const placeholderEl = dom.createElement('div')\n placeholderEl.classList.add('avatar-placeholder')\n placeholderEl.innerHTML = '<svg aria-hidden=\"true\" width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"18\" cy=\"18\" r=\"18\" fill=\"#e0e0e0\"/><text x=\"50%\" y=\"58%\" text-anchor=\"middle\" fill=\"#595959\" font-size=\"16\" font-family=\"Arial\" dy=\".3em\">?</text></svg>'\n avatarDiv.appendChild(placeholderEl)\n\n // Get name early so it can be used in trySetAvatar\n const name = nameFor(person) || 'Unknown Name'\n\n // Try to set avatar from already-loaded data, or fetch the person's doc\n function trySetAvatar () {\n const avatarUrl = kb.any(person, ns.vcard('hasPhoto'))\n if (avatarUrl && avatarUrl.value) {\n const img = dom.createElement('img')\n img.src = avatarUrl.value\n img.alt = name + ' avatar'\n avatarDiv.replaceChild(img, avatarDiv.firstChild)\n }\n }\n trySetAvatar() // check if already in store\n\n // Load person's own document in background to get hasPhoto\n kb.fetcher.nowOrWhenFetched(person.doc(), undefined, function (ok, message) {\n if (!ok) {\n debug.error('Cannot load contact: ' + person + '. Stack: ' + message)\n personLi.classList.add('personLi--error')\n return // skip avatar – doc is unavailable\n }\n trySetAvatar()\n })\n\n // Center: Name\n const infoDiv = dom.createElement('div')\n infoDiv.classList.add('personLi-info')\n\n personLi.setAttribute('aria-label', name)\n const nameDiv = dom.createElement('div')\n nameDiv.classList.add('personLi-name')\n nameDiv.textContent = name\n\n infoDiv.appendChild(nameDiv)\n\n // Right: Arrow icon\n const arrowDiv = dom.createElement('div')\n arrowDiv.classList.add('personLi-arrow')\n arrowDiv.innerHTML = '<svg aria-hidden=\"true\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 4.5L11.25 9L6 13.5\" stroke=\"#595959\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>'\n\n // Assemble\n rowDiv.appendChild(avatarDiv)\n rowDiv.appendChild(infoDiv)\n rowDiv.appendChild(arrowDiv)\n personLi.appendChild(rowDiv)\n\n setPersonListener(personLi, person)\n return personLi\n }\n\n utils.syncTableToArrayReOrdered(ul, cards, person => renderNameInGroupList(person, ul))\n refreshFilteredPeople(ul, autoSelect, detailsView || cardMain)\n} // refreshNames\n\nexport function selectPerson (ulPeople, person, detailsView) {\n if (!detailsView) return\n if (detailsView.parentNode) detailsView.parentNode.classList.remove('hidden')\n detailsView.innerHTML = 'Loading...'\n detailsView.setAttribute('aria-busy', 'true')\n detailsView.classList.add('detailsSectionContent--wide')\n selectedPeople = {}\n selectedPeople[person.uri] = true\n refreshFilteredPeople(ulPeople, false, detailsView) // Color to remember which one you picked\n let local\n try {\n local = book ? localNode(person) : person\n } catch (err) {\n detailsView.innerHTML = ''\n detailsView.setAttribute('aria-busy', 'false')\n complain(detailsView, dom, 'Cannot load contact: ' + err.message)\n return\n }\n kb.fetcher.nowOrWhenFetched(local.doc(), undefined, function (\n ok,\n message\n ) {\n detailsView.innerHTML = ''\n detailsView.setAttribute('aria-busy', 'false')\n if (!ok) {\n debug.error('Failed to load contact card: ' + local + '. Stack: ' + message)\n complain(detailsView, dom, 'Failed to load contact. If it persists, contact your admin.')\n return\n }\n // debug.log(\"Loaded card \" + local + '\\n')\n\n // Top-right toolbar with link icon and delete button\n const toolbar = dom.createElement('div')\n toolbar.classList.add('contact-toolbar')\n const linkEl = UI.widgets.linkIcon(dom, local)\n linkEl.setAttribute('title', 'Uri of contact')\n toolbar.appendChild(linkEl)\n\n if (authn.currentUser()) {\n // Add in a delete button to delete from AB\n const deleteButton = UI.widgets.deleteButtonWithCheck(\n dom,\n toolbar, // appends it to toolbar.appendChild(deleteButton)\n 'contact',\n async function () {\n const container = person.dir() // ASSUMPTION THAT CARD IS IN ITS OWN DIRECTORY\n\n const pname = kb.any(person, ns.vcard('fn'))\n debug.log('We are about to delete the contact ' + pname)\n await loadAllGroups() // need to wait for all groups to be loaded in case they have a link to this person\n // load people.ttl\n const nameEmailIndex = kb.any(book, ns.vcard('nameEmailIndex'))\n await kb.fetcher.load(nameEmailIndex)\n\n // - delete person's WebID's in each Group\n // - delete the references to it in group files and save them back\n // - delete the reference in people.ttl and save it back\n\n // find all Groups\n const groups = groupMembership(person)\n let removeFromGroups = []\n // find person WebID's\n groups.forEach(group => {\n const webids = getSameAs(kb, person, group.doc())\n // for each check in each Group that it is not used by an other person then delete\n webids.forEach(webid => {\n if (getSameAs(kb, webid, group.doc()).length === 1) {\n removeFromGroups = removeFromGroups.concat(kb.statementsMatching(group, ns.vcard('hasMember'), webid, group.doc()))\n }\n })\n })\n\n // Only if folder deletion succeeds, proceed with person deletion\n await kb.updater.updateMany(removeFromGroups)\n\n try {\n await deleteThingAndDoc(person)\n } catch (err) {\n complain(detailsView, dom, 'Failed to delete contact. If it persists, contact your admin.')\n return\n }\n\n try {\n await deleteRecursive(kb, container, toolbar, dom)\n } catch (err) {\n const msg = 'Failed to delete contact. If it persists, contact your admin.'\n complain(detailsView, dom, msg)\n return\n }\n refreshNames(ulPeople, detailsView)\n detailsView.innerHTML = 'Contact data deleted.'\n }\n )\n deleteButton.classList.add('deleteButton')\n }\n detailsView.appendChild(toolbar)\n\n detailsView.classList.add('detailsSectionContent--wide')\n detailsView.appendChild(renderPane(local, 'contact'))\n })\n}\n\nexport function deselectAllPeople (ulPeople) {\n selectedPeople = {}\n if (ulPeople) {\n for (let i = 0; i < ulPeople.children.length; i++) {\n ulPeople.children[i].classList.remove('selected')\n }\n }\n}\n\nexport function refreshFilteredPeople (ulPeople, active, detailsView) {\n let count = 0\n let lastRow = null\n for (let i = 0; i < ulPeople.children.length; i++) {\n const liElement = ulPeople.children[i]\n const matches = filterName(nameFor(liElement.subject))\n if (matches) {\n count++\n lastRow = liElement\n }\n liElement.classList.toggle('selected', matches && !!selectedPeople[liElement.subject.uri])\n liElement.classList.toggle('hidden', !matches)\n }\n if (count === 1 && active) {\n const unique = lastRow.subject\n selectPerson(ulPeople, unique, detailsView)\n }\n}\n\nfunction filterName (name) {\n const filter = searchInput.value.trim().toLowerCase()\n if (filter.length === 0) return true\n const parts = filter.split(' ') // Each name part must be somewhere\n for (let j = 0; j < parts.length; j++) {\n const word = parts[j]\n if (name.toLowerCase().indexOf(word) < 0) return false\n }\n return true\n}\n\nfunction renderPane (subject, paneName) {\n const p = dataBrowserContext.session.paneRegistry.byName(paneName)\n const d = p.render(subject, dataBrowserContext)\n d.classList.add('renderPane')\n return d\n}\n\nfunction localNode (person) {\n const aliases = kb.allAliases(person)\n const prefix = book.dir().uri\n for (let i = 0; i < aliases.length; i++) {\n if (aliases[i].uri.slice(0, prefix.length) === prefix) {\n return aliases[i]\n }\n }\n throw new Error('No local URI for ' + person)\n}\n\n// Check every group is in the list and add it if not.\nexport async function checkDataModel (book, detailsSectionContent) {\n // await kb.fetcher.load(groups) // asssume loaded already\n const groups = await loadAllGroups(book)\n\n if (groups && groups.length > 0) {\n const { del, ins } = await getDataModelIssues(groups)\n\n if (authn.currentUser()) {\n if (del.length) {\n UI.widgets.deleteButtonWithCheck(\n dom,\n detailsSectionContent, // where it appends it to\n 'contact',\n async function () {\n await kb.updater.updateMany(del, ins)\n debug.log('Deleted ' + del.length + ' bad statements from groups')\n })\n }\n }\n }\n}\n\n// Prepare book data once so askName forms load instantly\nexport async function ensureBookLoaded () {\n const ourBook = findBookFromGroups(book)\n try {\n await kb.fetcher.load(ourBook)\n } catch (err) {\n throw new Error('Book won\\'t load:' + ourBook)\n }\n const nameEmailIndex = kb.any(ourBook, ns.vcard('nameEmailIndex'))\n if (!nameEmailIndex) throw new Error('No nameEmailIndex')\n await kb.fetcher.load(nameEmailIndex)\n}\n"],"mappings":";;;;;;;AAOA,IAAM,IAAK,EAAG,IACR,IAAQ,EAAG,OACX,IAAK,GACP,GACA,IAAiB,CAAC,GAClB,IAAiB,CAAC,GAClB,IAAW,MACX,IAAW,MACX,IAAc,MACd,IAAW,MACX,IAAO,MACP,IAAqB,MACrB,IAAqB;AAIzB,SAAgB,EAAsB,GAAU,GAAW;CAKzD,AAJA,EAAS,iBAAiB,QAAQ,CAAC,CAAC,SAAQ,MAAO;EAEjD,AADA,EAAI,UAAU,OAAO,eAAe,6BAA6B,2BAA2B,yBAAyB,GACrH,EAAI,UAAU,IAAI,eAAe;CACnC,CAAC,GACG,MACF,EAAU,UAAU,OAAO,eAAe,GAC1C,EAAU,UAAU,IAAI,aAAa;AAEzC;AAEA,SAAgB,EAAoB,GAAa,GAAU,GAAS,GAAY,GAAgB,GAAU,GAAU,GAAY,GAAS,GAAoB;CAS3J,AARA,IAAM,GACN,IAAiB,KAAkB,CAAC,GAChC,MAAU,IAAW,IACrB,MAAU,IAAc,IACxB,MAAY,IAAW,IACvB,MAAS,IAAqB,IAC9B,MAAoB,IAAqB,IAC7C,IAAO,GACP,IAAW;CACX,IAAM,IAAS,EAAc,GAAM,CAAO;CAC1C,EAAM,0BAA0B,GAAU,GAAQ,CAAa;AACjE;AAKA,SAAgB,EAAe,GAAO;CACpC,IAAM,IAAO,EAAG,IAAI,GAAO,EAAG,MAAM,IAAI,CAAC,GACnC,IAAU,EAAI,cAAc,IAAI;CAItC,AAHA,EAAQ,aAAa,QAAQ,UAAU,GACvC,EAAQ,aAAa,cAAc,IAAO,EAAK,QAAQ,YAAY,GACnE,EAAQ,UAAU,GAClB,EAAG,QAAQ,cAAc,GAAS,CAAK;CAEvC,IAAM,IAAc,EAAQ,YAAY,EAAI,cAAc,QAAQ,CAAC;CAKnE,OAJA,EAAY,aAAa,QAAQ,QAAQ,GACzC,EAAY,YAAY,IAAO,EAAK,QAAQ,cAC5C,EAAY,UAAU,IAAI,mBAAmB,gBAAgB,iBAAiB,qBAAqB,GAE5F;EAAE;EAAS;EAAa;CAAK;AACtC;AAEA,eAAsB,EAA0B,GAAM,GAAO;CAC3D,KAAK,IAAM,KAAK,GAAM;EACpB,IAAI,IAAQ,EAAG,IAAI,CAAC;EACpB,IAAI;GACF,IAAQ,MAAM,EAAiB,GAAO,CAAK;EAC7C,QAAa;GAEX,EAAY,gEAAG;EACjB;EACA,AAAI,KAAO,EAAa,CAAQ;CAClC;AACF;AAEA,SAAS,EAAe,GAAO;CAC7B,SAAS,EAAsB,GAAO;EAIpC,IAHA,EAAM,eAAe,GACrB,EAAqB,GAAU,CAAW,GACtC,KAAoB,EAAmB,GACvC,CAAC,EAAM,SACT,KAAK,IAAM,KAAO,GAAgB,OAAO,EAAe;EAK1D,AAHA,EAAe,EAAM,OAAO,CAAC,EAAe,EAAM,MAClD,EAAsB,GAAU,CAAc,GAE9C,EAAG,QAAQ,iBAAiB,EAAM,IAAI,GAAG,KAAA,GAAW,SAAU,GAAI,GAAS;GAIzE,AAHK,KACH,EAAY,4BAA4B,IAAQ,cAAc,CAAO,GAEvE,EAAa,GAAU,MAAM,EAAK;EACpC,CAAC;CACH;CAEA,IAAM,EAAE,YAAS,mBAAgB,EAAc,CAAK;CAKpD,OAHA,EAAY,iBAAiB,SAAS,GAAsB,EAAK,GACjE,EAAG,QAAQ,eAAe,IAAS,MAAQ,EAAyB,GAAM,CAAK,CAAC,GAChF,EAAQ,iBAAiB,SAAS,GAAsB,EAAI,GACrD;AACT;AAEA,SAAgB,EACd,GACA,GACA,GACA;CACA,SAAS,EAAqB,GAAO,GAAS;EAC5C,OAAO,IAAI,SAAS,GAAS,MAAW;GAGtC,AAFA,EAAQ,UAAU,IAAI,eAAe,GACrC,EAAQ,aAAa,aAAa,MAAM,GACxC,EAAG,QAAQ,iBAAiB,EAAM,IAAI,GAAG,KAAA,GAAW,SAClD,GACA,GACA;IACA,IAAI,CAAC,GAAI;KACP,IAAM,IAAM,uBAAuB,IAAQ,cAAc;KAGzD,AAFA,EAAY,CAAG,GACX,KAAkB,EAAiB,IAAO,CAAG,GACjD,EAAO,CAAG;KACV;IACF;IAQA,AAPA,EAAQ,UAAU,OAAO,eAAe,GACxC,EAAQ,aAAa,aAAa,OAAO,GACzC,EAAQ,UAAU,IAAI,UAAU,GAChC,EAAe,EAAM,OAAO,IAC5B,EAAsB,GAAU,CAAc,GAC9C,EAAa,GAAU,IAAI,GACvB,KAAkB,EAAiB,EAAI,GAC3C,EAAQ,EAAI;GACd,CAAC;EACH,CAAC;CACH;CAEA,KAAK,IAAI,IAAI,GAAG,IAAI,EAAS,SAAS,QAAQ,KAAK;EACjD,IAAM,IAAU,EAAS,SAAS,IAC5B,IAAQ,EAAQ;EACjB,KACL,EAAoB,GAAO,CAAO,CAAC,CAChC,OAAM,MAAO;GACZ,AAAI,KAAkB,EAAiB,IAAO,CAAG;EACnD,CAAC;CACL;AACF;AAEA,SAAgB,EAAuB,GAAI,GAAgB;CACzD,KAAK,IAAI,IAAI,GAAG,IAAI,EAAG,SAAS,QAAQ,KAAK;EAC3C,IAAM,IAAK,EAAG,SAAS;EACvB,AAAI,EAAG,WACL,EAAG,UAAU,OAAO,YAAY,CAAC,CAAC,EAAe,EAAG,QAAQ,IAAI;CAEpE;AACF;AAEA,SAAgB,EAAa,GAAM,GAAS,GAAU,GAAY,GAAgB,GAAU,GAAU;CAKpG,AAJA,IAAM,GACF,MAAgB,IAAiB,IACjC,MAAU,IAAW,IACrB,MAAU,IAAc,IAC5B,IAAW;CACX,IAAM,IAAS,EAAc,GAAM,CAAO;CAI1C,AAHI,EAAO,SAAS,KAClB,EAAc,EAAO,EAAE,GAEzB,EAAM,0BAA0B,GAAU,GAAQ,CAAa;AAEjE;AAEA,SAAS,EAAe,GAAM,GAAS;CACrC,IAAI,IAAS,CAAC;CAQd,IAPI,EAAQ,gBACV,EAAO,KAAK;EACV;EACA,EAAG,IAAI,EAAQ,cAAc,EAAG,MAAM,IAAI,CAAC;EAC3C,EAAQ;CACV,CAAC,GAEC,GAAM;EACR,IAAM,IAAa,EAAG,IAAI,GAAM,EAAG,MAAM,YAAY,CAAC,GAEhD,KADK,IAAO,EAAG,KAAK,GAAM,EAAG,MAAM,eAAe,GAAG,MAAM,CAAU,IAAI,CAAC,EAAA,CACjE,IAAI,SAAU,GAAG;GAC9B,OAAO;IAAC;IAAM,EAAG,IAAI,GAAG,EAAG,MAAM,IAAI,CAAC;IAAG;GAAC;EAC5C,CAAC;EAED,AADA,IAAS,EAAO,OAAO,CAAG,GAC1B,EAAO,KAAK;CACd;CACA,OAAO,EAAO,KAAI,MAAS,EAAM,EAAE;AACrC;AAEA,eAAsB,EAAe,GAAM;CACzC,IAAM,IAAa,EAAG,IAAI,GAAM,EAAG,MAAM,YAAY,CAAC;CACtD,IAAI,GAAY;EACd,MAAM,EAAG,QAAQ,KAAK,CAAU;EAChC,IAAM,IAAK,IAAO,EAAG,KAAK,GAAM,EAAG,MAAM,eAAe,GAAG,MAAM,CAAU,IAAI,CAAC;EAEhF,OADA,MAAM,EAAG,QAAQ,KAAK,CAAE,GACjB;CACT,OACE,OAAO,CAAC;AAEZ;AAGA,SAAgB,EAAoB,GAAM;CACxC,IAAI,GACF,OAAO;CAET,IAAI;CACJ,KAAK,IAAM,KAAM,GAAgB;EAC/B,IAAI,EAAG,IAAI,CAAE;EACb,IAAM,IAAI,EAAG,IAAI,KAAA,GAAW,EAAG,MAAM,eAAe,GAAG,CAAC;EACxD,IAAI,GAAG,OAAO;CAChB;CACA,MAAU,MACR,wEACF;AACF;AAKA,SAAgB,EAAc,GAAa,GAAa,IAAa,IAAM;CAMzE,IAAM,IAAK,KAAe;CAM1B,IAAI,CAAC,KAAM,CAAC,EAAG,YAAY,OAAO,EAAG,SAAS,UAAW,UAAU;EACjE,EAAW,8CAA8C,CAAE;EAC3D;CACF;CAEA,SAAS,EAAmB,GAAU,GAAQ;EAC5C,SAAS,EAAc,GAAO;GAE5B,AADA,EAAM,eAAe,GACrB,EAAa,GAAI,GAAQ,CAAQ;EACnC;EAEA,AADA,EAAS,iBAAiB,SAAS,CAAY,GAC/C,EAAS,iBAAiB,WAAW,SAAU,GAAO;GACpD,CAAI,EAAM,QAAQ,WAAW,EAAM,QAAQ,SACzC,EAAM,eAAe,GACrB,EAAa,CAAK;EAEtB,CAAC;CACH;CAEA,IAAI,IAAQ,CAAC;CAOb,AALA,OADsB,KAAK,CAAc,CAAC,CAAC,KAAI,MAAY,EAAG,IAAI,CAAQ,CACrE,CAAC,CAAC,SAAQ,MAAS;EACtB,AAAI,EAAe,EAAM,WACvB,IAAQ,EAAM,OAAO,EAAa,GAAI,CAAK,CAAC;CAEhD,CAAC,GACD,EAAM,KAAK,CAAc;CACzB,KAAK,IAAI,IAAI,GAAG,IAAI,EAAM,SAAS,IACjC,AAAI,EAAM,EAAE,CAAC,QAAQ,EAAM,IAAI,EAAE,CAAC,MAChC,EAAM,OAAO,GAAG,CAAC,IAEjB;CAIJ,SAAS,EAAuB,GAAQ,GAAI;EAC1C,IAAM,IAAW,EAAI,cAAc,IAAI;EAKvC,AAJA,EAAS,aAAa,QAAQ,UAAU,GACxC,EAAS,aAAa,YAAY,GAAG,GACrC,EAAS,UAAU,IAAI,UAAU,GACjC,EAAS,UAAU,GACnB,EAAG,QAAQ,cAAc,GAAU,CAAM;EAGzC,IAAM,IAAS,EAAI,cAAc,KAAK;EACtC,EAAO,UAAU,IAAI,cAAc;EAGnC,IAAM,IAAY,EAAI,cAAc,KAAK;EACzC,EAAU,UAAU,IAAI,iBAAiB;EAEzC,IAAM,IAAgB,EAAI,cAAc,KAAK;EAG7C,AAFA,EAAc,UAAU,IAAI,oBAAoB,GAChD,EAAc,YAAY,4TAC1B,EAAU,YAAY,CAAa;EAGnC,IAAM,IAAO,EAAQ,CAAM,KAAK;EAGhC,SAAS,IAAgB;GACvB,IAAM,IAAY,EAAG,IAAI,GAAQ,EAAG,MAAM,UAAU,CAAC;GACrD,IAAI,KAAa,EAAU,OAAO;IAChC,IAAM,IAAM,EAAI,cAAc,KAAK;IAGnC,AAFA,EAAI,MAAM,EAAU,OACpB,EAAI,MAAM,IAAO,WACjB,EAAU,aAAa,GAAK,EAAU,UAAU;GAClD;EACF;EAIA,AAHA,EAAa,GAGb,EAAG,QAAQ,iBAAiB,EAAO,IAAI,GAAG,KAAA,GAAW,SAAU,GAAI,GAAS;GAC1E,IAAI,CAAC,GAAI;IAEP,AADA,EAAY,0BAA0B,IAAS,cAAc,CAAO,GACpE,EAAS,UAAU,IAAI,iBAAiB;IACxC;GACF;GACA,EAAa;EACf,CAAC;EAGD,IAAM,IAAU,EAAI,cAAc,KAAK;EAGvC,AAFA,EAAQ,UAAU,IAAI,eAAe,GAErC,EAAS,aAAa,cAAc,CAAI;EACxC,IAAM,IAAU,EAAI,cAAc,KAAK;EAIvC,AAHA,EAAQ,UAAU,IAAI,eAAe,GACrC,EAAQ,cAAc,GAEtB,EAAQ,YAAY,CAAO;EAG3B,IAAM,IAAW,EAAI,cAAc,KAAK;EAWxC,OAVA,EAAS,UAAU,IAAI,gBAAgB,GACvC,EAAS,YAAY,oQAGrB,EAAO,YAAY,CAAS,GAC5B,EAAO,YAAY,CAAO,GAC1B,EAAO,YAAY,CAAQ,GAC3B,EAAS,YAAY,CAAM,GAE3B,EAAkB,GAAU,CAAM,GAC3B;CACT;CAGA,AADA,EAAM,0BAA0B,GAAI,IAAO,MAAU,EAAsB,GAAQ,CAAE,CAAC,GACtF,EAAsB,GAAI,GAAY,KAAe,CAAQ;AAC/D;AAEA,SAAgB,EAAc,GAAU,GAAQ,GAAa;CAC3D,IAAI,CAAC,GAAa;CAOlB,AANI,EAAY,cAAY,EAAY,WAAW,UAAU,OAAO,QAAQ,GAC5E,EAAY,YAAY,cACxB,EAAY,aAAa,aAAa,MAAM,GAC5C,EAAY,UAAU,IAAI,6BAA6B,GACvD,IAAiB,CAAC,GAClB,EAAe,EAAO,OAAO,IAC7B,EAAsB,GAAU,IAAO,CAAW;CAClD,IAAI;CACJ,IAAI;EACF,IAAQ,IAAO,EAAU,CAAM,IAAI;CACrC,SAAS,GAAK;EAGZ,AAFA,EAAY,YAAY,IACxB,EAAY,aAAa,aAAa,OAAO,GAC7C,EAAS,GAAa,GAAK,0BAA0B,EAAI,OAAO;EAChE;CACF;CACA,EAAG,QAAQ,iBAAiB,EAAM,IAAI,GAAG,KAAA,GAAW,SAClD,GACA,GACA;EAGA,IAFA,EAAY,YAAY,IACxB,EAAY,aAAa,aAAa,OAAO,GACzC,CAAC,GAAI;GAEP,AADA,EAAY,kCAAkC,IAAQ,cAAc,CAAO,GAC3E,EAAS,GAAa,GAAK,6DAA6D;GACxF;EACF;EAIA,IAAM,IAAU,EAAI,cAAc,KAAK;EACvC,EAAQ,UAAU,IAAI,iBAAiB;EACvC,IAAM,IAAS,EAAG,QAAQ,SAAS,GAAK,CAAK;EAgE7C,AA/DA,EAAO,aAAa,SAAS,gBAAgB,GAC7C,EAAQ,YAAY,CAAM,GAEtB,EAAM,YAAY,KAuDpB,EArDwB,QAAQ,sBAC9B,GACA,GACA,WACA,iBAAkB;GAChB,IAAM,IAAY,EAAO,IAAI;GAI7B,AADA,EAAU,wCADI,EAAG,IAAI,GAAQ,EAAG,MAAM,IAAI,CACQ,CAAK,GACvD,MAAM,EAAc;GAEpB,IAAM,IAAiB,EAAG,IAAI,GAAM,EAAG,MAAM,gBAAgB,CAAC;GAC9D,MAAM,EAAG,QAAQ,KAAK,CAAc;GAOpC,IAAM,IAAS,EAAgB,CAAM,GACjC,IAAmB,CAAC;GAaxB,AAXA,EAAO,SAAQ,MAAS;IAGtB,EAFyB,GAAI,GAAQ,EAAM,IAAI,CAE1C,CAAC,CAAC,SAAQ,MAAS;KACtB,AAAI,EAAU,GAAI,GAAO,EAAM,IAAI,CAAC,CAAC,CAAC,WAAW,MAC/C,IAAmB,EAAiB,OAAO,EAAG,mBAAmB,GAAO,EAAG,MAAM,WAAW,GAAG,GAAO,EAAM,IAAI,CAAC,CAAC;IAEtH,CAAC;GACH,CAAC,GAGD,MAAM,EAAG,QAAQ,WAAW,CAAgB;GAE5C,IAAI;IACF,MAAM,EAAkB,CAAM;GAChC,QAAc;IACZ,EAAS,GAAa,GAAK,+DAA+D;IAC1F;GACF;GAEA,IAAI;IACF,MAAM,EAAgB,GAAI,GAAW,GAAS,CAAG;GACnD,QAAc;IAEZ,EAAS,GAAa,GAAK,+DAAG;IAC9B;GACF;GAEA,AADA,EAAa,GAAU,CAAW,GAClC,EAAY,YAAY;EAC1B,CAES,CAAC,CAAC,UAAU,IAAI,cAAc,GAE3C,EAAY,YAAY,CAAO,GAE/B,EAAY,UAAU,IAAI,6BAA6B,GACvD,EAAY,YAAY,EAAW,GAAO,SAAS,CAAC;CACtD,CAAC;AACH;AAEA,SAAgB,EAAmB,GAAU;CAE3C,IADA,IAAiB,CAAC,GACd,GACF,KAAK,IAAI,IAAI,GAAG,IAAI,EAAS,SAAS,QAAQ,KAC5C,EAAS,SAAS,EAAE,CAAC,UAAU,OAAO,UAAU;AAGtD;AAEA,SAAgB,EAAuB,GAAU,GAAQ,GAAa;CACpE,IAAI,IAAQ,GACR,IAAU;CACd,KAAK,IAAI,IAAI,GAAG,IAAI,EAAS,SAAS,QAAQ,KAAK;EACjD,IAAM,IAAY,EAAS,SAAS,IAC9B,IAAU,EAAW,EAAQ,EAAU,OAAO,CAAC;EAMrD,AALI,MACF,KACA,IAAU,IAEZ,EAAU,UAAU,OAAO,YAAY,KAAW,CAAC,CAAC,EAAe,EAAU,QAAQ,IAAI,GACzF,EAAU,UAAU,OAAO,UAAU,CAAC,CAAO;CAC/C;CACA,IAAI,MAAU,KAAK,GAAQ;EACzB,IAAM,IAAS,EAAQ;EACvB,EAAa,GAAU,GAAQ,CAAW;CAC5C;AACF;AAEA,SAAS,EAAY,GAAM;CACzB,IAAM,IAAS,EAAY,MAAM,KAAK,CAAC,CAAC,YAAY;CACpD,IAAI,EAAO,WAAW,GAAG,OAAO;CAChC,IAAM,IAAQ,EAAO,MAAM,GAAG;CAC9B,KAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK;EACrC,IAAM,IAAO,EAAM;EACnB,IAAI,EAAK,YAAY,CAAC,CAAC,QAAQ,CAAI,IAAI,GAAG,OAAO;CACnD;CACA,OAAO;AACT;AAEA,SAAS,EAAY,GAAS,GAAU;CAEtC,IAAM,IADI,EAAmB,QAAQ,aAAa,OAAO,CAC/C,CAAC,CAAC,OAAO,GAAS,CAAkB;CAE9C,OADA,EAAE,UAAU,IAAI,YAAY,GACrB;AACT;AAEA,SAAS,EAAW,GAAQ;CAC1B,IAAM,IAAU,EAAG,WAAW,CAAM,GAC9B,IAAS,EAAK,IAAI,CAAC,CAAC;CAC1B,KAAK,IAAI,IAAI,GAAG,IAAI,EAAQ,QAAQ,KAClC,IAAI,EAAQ,EAAE,CAAC,IAAI,MAAM,GAAG,EAAO,MAAM,MAAM,GAC7C,OAAO,EAAQ;CAGnB,MAAU,MAAM,sBAAsB,CAAM;AAC9C;AAGA,eAAsB,EAAgB,GAAM,GAAuB;CAEjE,IAAM,IAAS,MAAM,EAAc,CAAI;CAEvC,IAAI,KAAU,EAAO,SAAS,GAAG;EAC/B,IAAM,EAAE,QAAK,WAAQ,MAAM,EAAmB,CAAM;EAEpD,AAAI,EAAM,YAAY,KAChB,EAAI,UACN,EAAG,QAAQ,sBACT,GACA,GACA,WACA,iBAAkB;GAEhB,AADA,MAAM,EAAG,QAAQ,WAAW,GAAK,CAAG,GACpC,EAAU,aAAa,EAAI,SAAS,6BAA6B;EACnE,CAAC;CAGT;AACF;AAGA,eAAsB,IAAoB;CACxC,IAAM,IAAU,EAAmB,CAAI;CACvC,IAAI;EACF,MAAM,EAAG,QAAQ,KAAK,CAAO;CAC/B,QAAc;EACZ,MAAU,MAAM,qBAAsB,CAAO;CAC/C;CACA,IAAM,IAAiB,EAAG,IAAI,GAAS,EAAG,MAAM,gBAAgB,CAAC;CACjE,IAAI,CAAC,GAAgB,MAAU,MAAM,mBAAmB;CACxD,MAAM,EAAG,QAAQ,KAAK,CAAc;AACtC"}
|
|
1
|
+
{"version":3,"file":"addressBookPresenter.esm.js","names":["ns"],"sources":["../src/addressBookPresenter.js"],"sourcesContent":["import { addPersonToGroup, groupMembers, getDataModelIssues } from './contactLogic'\nimport * as UI from 'solid-ui'\nimport { authn, store } from 'solid-logic'\nimport * as debug from './debug'\nimport { complain, alertDialog, getSameAs, deleteRecursive, deleteThingAndDoc, compareForSort, nameFor } from './localUtils'\nimport { groupMembership } from './groupMembershipControl'\n\nconst ns = UI.ns\nconst utils = UI.utils\nconst kb = store\nlet dom\nlet selectedGroups = {}\nlet selectedPeople = {}\nlet ulPeople = null\nlet ulGroups = null\nlet searchInput = null\nlet cardMain = null\nlet book = null\nlet dataBrowserContext = null\nlet onGroupButtonClick = null\n\n// ######## Group presenter\n\nexport function setActiveGroupButton (groupsUl, activeBtn) {\n groupsUl.querySelectorAll('button').forEach(btn => {\n btn.classList.remove('btn-primary', 'allGroupsButton--selected', 'allGroupsButton--active', 'allGroupsButton--loaded')\n btn.classList.add('btn-secondary')\n })\n if (activeBtn) {\n activeBtn.classList.remove('btn-secondary')\n activeBtn.classList.add('btn-primary')\n }\n}\n\nexport function renderGroupButtons (currentBook, groupsUl, options, domElement, groupsSelected, peopleUl, searchEl, cardMainEl, context, groupClickCallback) {\n dom = domElement\n selectedGroups = groupsSelected || {}\n if (peopleUl) ulPeople = peopleUl\n if (searchEl) searchInput = searchEl\n if (cardMainEl) cardMain = cardMainEl\n if (context) dataBrowserContext = context\n if (groupClickCallback) onGroupButtonClick = groupClickCallback\n book = currentBook\n ulGroups = groupsUl\n const groups = groupsInOrder(book, options)\n utils.syncTableToArrayReOrdered(ulGroups, groups, renderGroupLi)\n}\n\n/** Create the common DOM structure for a group list item (li + button).\n * Returns { groupLi, groupButton, name } so callers can attach their own handlers.\n */\nexport function createGroupLi (group) {\n const name = kb.any(group, ns.vcard('fn'))\n const groupLi = dom.createElement('li')\n groupLi.setAttribute('role', 'listitem')\n groupLi.setAttribute('aria-label', name ? name.value : 'Some group')\n groupLi.subject = group\n UI.widgets.makeDraggable(groupLi, group)\n\n const groupButton = groupLi.appendChild(dom.createElement('button'))\n groupButton.setAttribute('type', 'button')\n groupButton.innerHTML = name ? name.value : 'Some group'\n groupButton.classList.add('allGroupsButton', 'actionButton', 'btn-secondary', 'action-button-focus')\n\n return { groupLi, groupButton, name }\n}\n\nexport async function handleURIsDroppedOnGroup (uris, group) {\n for (const u of uris) {\n let thing = kb.sym(u)\n try {\n thing = await addPersonToGroup(thing, group)\n } catch (_e) {\n const msg = 'Error adding to group. Make sure you are adding a contact URI.'\n alertDialog(msg)\n }\n if (thing) refreshNames(ulPeople)\n }\n}\n\nfunction renderGroupLi (group) {\n function groupLiClickListener (event) {\n event.preventDefault()\n setActiveGroupButton(ulGroups, groupButton)\n if (onGroupButtonClick) onGroupButtonClick()\n if (!event.metaKey) {\n for (const key in selectedGroups) delete selectedGroups[key] // If Command key pressed, accumulate multiple\n }\n selectedGroups[group.uri] = !selectedGroups[group.uri]\n refreshThingsSelected(ulGroups, selectedGroups)\n // Load group members and refresh people list\n kb.fetcher.nowOrWhenFetched(group.doc(), undefined, function (ok, message) {\n if (!ok) {\n debug.error('Cannot load one group: ' + group + '. Stack: ' + message)\n }\n refreshNames(ulPeople, null, false)\n })\n }\n\n const { groupLi, groupButton } = createGroupLi(group)\n\n groupButton.addEventListener('click', groupLiClickListener, false)\n UI.widgets.makeDropTarget(groupLi, uris => handleURIsDroppedOnGroup(uris, group))\n groupLi.addEventListener('click', groupLiClickListener, true)\n return groupLi\n} // renderGroupLi\n\nexport function selectAllGroups (\n selectedGroups,\n ulGroups,\n callbackFunction\n) {\n function fetchGroupAndSelect (group, groupLi) {\n return new Promise((resolve, reject) => {\n groupLi.classList.add('group-loading')\n groupLi.setAttribute('aria-busy', 'true')\n kb.fetcher.nowOrWhenFetched(group.doc(), undefined, function (\n ok,\n message\n ) {\n if (!ok) {\n const msg = 'Cannot load group ' + group + '. Stack: ' + message\n debug.error(msg)\n if (callbackFunction) callbackFunction(false, msg)\n reject(msg)\n return\n }\n groupLi.classList.remove('group-loading')\n groupLi.setAttribute('aria-busy', 'false')\n groupLi.classList.add('selected')\n selectedGroups[group.uri] = true\n refreshThingsSelected(ulGroups, selectedGroups)\n refreshNames(ulPeople, null) // @@ every time??\n if (callbackFunction) callbackFunction(true)\n resolve(true)\n })\n })\n }\n\n for (let k = 0; k < ulGroups.children.length; k++) {\n const groupLi = ulGroups.children[k]\n const group = groupLi.subject\n if (!group) continue // Skip non-group items (e.g. All contacts, New group)\n fetchGroupAndSelect(group, groupLi)\n .catch(err => {\n if (callbackFunction) callbackFunction(false, err)\n })\n } // for each row\n}\n\nexport function refreshThingsSelected (ul, selectionArray) {\n for (let i = 0; i < ul.children.length; i++) {\n const li = ul.children[i]\n if (li.subject) {\n li.classList.toggle('selected', !!selectionArray[li.subject.uri])\n }\n }\n}\n\nexport function syncGroupUl (book, options, groupsUl, domElement, groupsSelected, peopleUl, searchEl) {\n dom = domElement\n if (groupsSelected) selectedGroups = groupsSelected\n if (peopleUl) ulPeople = peopleUl\n if (searchEl) searchInput = searchEl\n ulGroups = groupsUl\n const groups = groupsInOrder(book, options)\n if (groups.length > 0) {\n renderGroupLi(groups[0]) // pre-render one to get the style right, then throw it away\n }\n utils.syncTableToArrayReOrdered(groupsUl, groups, renderGroupLi)\n // refreshThingsSelected(groupsUl, selectedGroups)\n}\n\nfunction groupsInOrder (book, options) {\n let sortMe = []\n if (options.foreignGroup) {\n sortMe.push([\n '',\n kb.any(options.foreignGroup, ns.vcard('fn')),\n options.foreignGroup\n ])\n }\n if (book) {\n const groupIndex = kb.any(book, ns.vcard('groupIndex'))\n const gs = book ? kb.each(book, ns.vcard('includesGroup'), null, groupIndex) : []\n const gs2 = gs.map(function (g) {\n return [book, kb.any(g, ns.vcard('fn')), g]\n })\n sortMe = sortMe.concat(gs2)\n sortMe.sort()\n }\n return sortMe.map(tuple => tuple[2])\n}\n\nexport async function loadAllGroups (book) {\n const groupIndex = kb.any(book, ns.vcard('groupIndex'))\n if (groupIndex) {\n await kb.fetcher.load(groupIndex)\n const gs = book ? kb.each(book, ns.vcard('includesGroup'), null, groupIndex) : []\n await kb.fetcher.load(gs)\n return gs\n } else {\n return [] // no groups\n }\n}\n\n// The book could be the main subject, or linked from a group we are dealing with\nexport function findBookFromGroups (book) {\n if (book) {\n return book\n }\n let g\n for (const gu in selectedGroups) {\n g = kb.sym(gu)\n const b = kb.any(undefined, ns.vcard('includesGroup'), g)\n if (b) return b\n }\n throw new Error(\n 'findBookFromGroups: Cant find address book which this group is part of'\n )\n}\n// ######## Group presenter - END\n\n// ######## Person presenter\n/** Refresh the list of names */\nexport function refreshNames (ulPeopleArg, detailsView, autoSelect = true) {\n // If the caller did not explicitly pass a list element, fall back to the\n // global variable that other helpers (renderGroupButtons, syncGroupUl, etc.)\n // keep up to date. This allows callers that don't have easy access to the\n // element to simply invoke `refreshNames()` and get the behaviour they\n // expect when the address-book UI is present.\n const ul = ulPeopleArg || ulPeople\n\n // Guard: ul must be a DOM element with children. Callers sometimes pass the\n // wrong thing (e.g. a person object) which leads to the\n // \"Cannot read properties of undefined (reading 'length')\" error in\n // syncTableToArrayReOrdered. Bail out early if the value is not valid.\n if (!ul || !ul.children || typeof ul.children.length !== 'number') {\n debug.warn('refreshNames called with invalid ulPeople:', ul)\n return\n }\n\n function setPersonListener (personLi, person) {\n function handleSelect (event) {\n event.preventDefault()\n selectPerson(ul, person, cardMain)\n }\n personLi.addEventListener('click', handleSelect)\n personLi.addEventListener('keydown', function (event) {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n handleSelect(event)\n }\n })\n }\n\n let cards = []\n const groups = Object.keys(selectedGroups).map(groupURI => kb.sym(groupURI))\n groups.forEach(group => {\n if (selectedGroups[group.value]) {\n cards = cards.concat(groupMembers(kb, group))\n }\n })\n cards.sort(compareForSort) // @@ sort by name not UID later\n for (let k = 0; k < cards.length - 1;) {\n if (cards[k].uri === cards[k + 1].uri) {\n cards.splice(k, 1) // Eliminate duplicates from more than one group\n } else {\n k++\n }\n }\n\n function renderNameInGroupList (person, ul) {\n const personLi = dom.createElement('li')\n personLi.setAttribute('role', 'listitem')\n personLi.setAttribute('tabindex', '0')\n personLi.classList.add('personLi')\n personLi.subject = person\n UI.widgets.makeDraggable(personLi, person)\n\n // Container for the row\n const rowDiv = dom.createElement('div')\n rowDiv.classList.add('personLi-row')\n\n // Left: Avatar\n const avatarDiv = dom.createElement('div')\n avatarDiv.classList.add('personLi-avatar')\n // Placeholder avatar (shown initially while person doc loads)\n const placeholderEl = dom.createElement('div')\n placeholderEl.classList.add('avatar-placeholder')\n placeholderEl.innerHTML = '<svg aria-hidden=\"true\" width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"18\" cy=\"18\" r=\"18\" fill=\"#e0e0e0\"/><text x=\"50%\" y=\"58%\" text-anchor=\"middle\" fill=\"#595959\" font-size=\"16\" font-family=\"Arial\" dy=\".3em\">?</text></svg>'\n avatarDiv.appendChild(placeholderEl)\n\n // Get name early so it can be used in trySetAvatar\n const name = nameFor(person) || 'Unknown Name'\n\n // Try to set avatar from already-loaded data, or fetch the person's doc\n function trySetAvatar () {\n const avatarUrl = kb.any(person, ns.vcard('hasPhoto'))\n if (avatarUrl && avatarUrl.value) {\n const img = dom.createElement('img')\n img.src = avatarUrl.value\n img.alt = name + ' avatar'\n avatarDiv.replaceChild(img, avatarDiv.firstChild)\n }\n }\n trySetAvatar() // check if already in store\n\n // Load person's own document in background to get hasPhoto\n kb.fetcher.nowOrWhenFetched(person.doc(), undefined, function (ok, message) {\n if (!ok) {\n debug.error('Cannot load contact: ' + person + '. Stack: ' + message)\n personLi.classList.add('personLi--error')\n return // skip avatar – doc is unavailable\n }\n trySetAvatar()\n })\n\n // Center: Name\n const infoDiv = dom.createElement('div')\n infoDiv.classList.add('personLi-info')\n\n personLi.setAttribute('aria-label', name)\n const nameDiv = dom.createElement('div')\n nameDiv.classList.add('personLi-name')\n nameDiv.textContent = name\n\n infoDiv.appendChild(nameDiv)\n\n // Right: Arrow icon\n const arrowDiv = dom.createElement('div')\n arrowDiv.classList.add('personLi-arrow')\n arrowDiv.innerHTML = '<svg aria-hidden=\"true\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 4.5L11.25 9L6 13.5\" stroke=\"#595959\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>'\n\n // Assemble\n rowDiv.appendChild(avatarDiv)\n rowDiv.appendChild(infoDiv)\n rowDiv.appendChild(arrowDiv)\n personLi.appendChild(rowDiv)\n\n setPersonListener(personLi, person)\n return personLi\n }\n\n utils.syncTableToArrayReOrdered(ul, cards, person => renderNameInGroupList(person, ul))\n refreshFilteredPeople(ul, autoSelect, detailsView || cardMain)\n} // refreshNames\n\nexport function selectPerson (ulPeople, person, detailsView) {\n if (!detailsView) return\n if (detailsView.parentNode) detailsView.parentNode.classList.remove('hidden')\n detailsView.innerHTML = 'Loading...'\n detailsView.setAttribute('aria-busy', 'true')\n detailsView.classList.add('detailsSectionContent--wide')\n selectedPeople = {}\n selectedPeople[person.uri] = true\n refreshFilteredPeople(ulPeople, false, detailsView) // Color to remember which one you picked\n let local\n try {\n local = book ? localNode(person) : person\n } catch (err) {\n detailsView.innerHTML = ''\n detailsView.setAttribute('aria-busy', 'false')\n complain(detailsView, dom, 'Cannot load contact: ' + err.message)\n return\n }\n kb.fetcher.nowOrWhenFetched(local.doc(), undefined, function (\n ok,\n message\n ) {\n detailsView.innerHTML = ''\n detailsView.setAttribute('aria-busy', 'false')\n if (!ok) {\n debug.error('Failed to load contact card: ' + local + '. Stack: ' + message)\n complain(detailsView, dom, 'Failed to load contact. If it persists, contact your admin.')\n return\n }\n // debug.log(\"Loaded card \" + local + '\\n')\n\n // Top-right toolbar with link icon and delete button\n const toolbar = dom.createElement('div')\n toolbar.classList.add('contact-toolbar')\n const linkEl = UI.widgets.linkIcon(dom, local)\n linkEl.setAttribute('title', 'Uri of contact')\n toolbar.appendChild(linkEl)\n\n if (authn.currentUser()) {\n // Add in a delete button to delete from AB\n const deleteButton = UI.widgets.deleteButtonWithCheck(\n dom,\n toolbar, // appends it to toolbar.appendChild(deleteButton)\n 'contact',\n async function () {\n const container = person.dir() // ASSUMPTION THAT CARD IS IN ITS OWN DIRECTORY\n\n const pname = kb.any(person, ns.vcard('fn'))\n debug.log('We are about to delete the contact ' + pname)\n await loadAllGroups() // need to wait for all groups to be loaded in case they have a link to this person\n // load people.ttl\n const nameEmailIndex = kb.any(book, ns.vcard('nameEmailIndex'))\n await kb.fetcher.load(nameEmailIndex)\n\n // - delete person's WebID's in each Group\n // - delete the references to it in group files and save them back\n // - delete the reference in people.ttl and save it back\n\n // find all Groups\n const groups = groupMembership(person)\n let removeFromGroups = []\n // find person WebID's\n groups.forEach(group => {\n const webids = getSameAs(kb, person, group.doc())\n // for each check in each Group that it is not used by an other person then delete\n webids.forEach(webid => {\n if (getSameAs(kb, webid, group.doc()).length === 1) {\n removeFromGroups = removeFromGroups.concat(kb.statementsMatching(group, ns.vcard('hasMember'), webid, group.doc()))\n }\n })\n })\n\n // Only if folder deletion succeeds, proceed with person deletion\n await kb.updater.updateMany(removeFromGroups)\n\n try {\n await deleteThingAndDoc(person)\n } catch (err) {\n complain(detailsView, dom, 'Failed to delete contact. If it persists, contact your admin.')\n return\n }\n\n try {\n await deleteRecursive(kb, container, toolbar, dom)\n } catch (err) {\n const msg = 'Failed to delete contact. If it persists, contact your admin.'\n complain(detailsView, dom, msg)\n return\n }\n refreshNames(ulPeople, detailsView)\n detailsView.innerHTML = 'Contact data deleted.'\n }\n )\n deleteButton.classList.add('deleteButton')\n }\n detailsView.appendChild(toolbar)\n\n detailsView.classList.add('detailsSectionContent--wide')\n detailsView.appendChild(renderPane(local, 'contact'))\n })\n}\n\nexport function deselectAllPeople (ulPeople) {\n selectedPeople = {}\n if (ulPeople) {\n for (let i = 0; i < ulPeople.children.length; i++) {\n ulPeople.children[i].classList.remove('selected')\n }\n }\n}\n\nexport function refreshFilteredPeople (ulPeople, active, detailsView) {\n let count = 0\n let lastRow = null\n for (let i = 0; i < ulPeople.children.length; i++) {\n const liElement = ulPeople.children[i]\n const matches = filterName(nameFor(liElement.subject))\n if (matches) {\n count++\n lastRow = liElement\n }\n liElement.classList.toggle('selected', matches && !!selectedPeople[liElement.subject.uri])\n liElement.classList.toggle('hidden', !matches)\n }\n if (count === 1 && active) {\n const unique = lastRow.subject\n selectPerson(ulPeople, unique, detailsView)\n }\n}\n\nfunction filterName (name) {\n const filter = searchInput.value.trim().toLowerCase()\n if (filter.length === 0) return true\n const parts = filter.split(' ') // Each name part must be somewhere\n for (let j = 0; j < parts.length; j++) {\n const word = parts[j]\n if (name.toLowerCase().indexOf(word) < 0) return false\n }\n return true\n}\n\nfunction renderPane (subject, paneName) {\n const p = dataBrowserContext.session.paneRegistry.byName(paneName)\n const d = p.render(subject, dataBrowserContext)\n d.classList.add('renderPane')\n return d\n}\n\nfunction localNode (person) {\n const aliases = kb.allAliases(person)\n const prefix = book.dir().uri\n for (let i = 0; i < aliases.length; i++) {\n if (aliases[i].uri.slice(0, prefix.length) === prefix) {\n return aliases[i]\n }\n }\n throw new Error('No local URI for ' + person)\n}\n\n// Check every group is in the list and add it if not.\nexport async function checkDataModel (book, detailsSectionContent) {\n // await kb.fetcher.load(groups) // asssume loaded already\n const groups = await loadAllGroups(book)\n\n if (groups && groups.length > 0) {\n const { del, ins } = await getDataModelIssues(groups)\n\n if (authn.currentUser()) {\n if (del.length) {\n UI.widgets.deleteButtonWithCheck(\n dom,\n detailsSectionContent, // where it appends it to\n 'contact',\n async function () {\n await kb.updater.updateMany(del, ins)\n debug.log('Deleted ' + del.length + ' bad statements from groups')\n })\n }\n }\n }\n}\n\n// Prepare book data once so askName forms load instantly\nexport async function ensureBookLoaded () {\n const ourBook = findBookFromGroups(book)\n try {\n await kb.fetcher.load(ourBook)\n } catch (err) {\n throw new Error('Book won\\'t load:' + ourBook)\n }\n const nameEmailIndex = kb.any(ourBook, ns.vcard('nameEmailIndex'))\n if (!nameEmailIndex) throw new Error('No nameEmailIndex')\n await kb.fetcher.load(nameEmailIndex)\n}\n"],"mappings":";;;;;;;AAOA,IAAMA,IAAK,EAAG,IACR,IAAQ,EAAG,OACX,IAAK,GACP,GACA,IAAiB,CAAC,GAClB,IAAiB,CAAC,GAClB,IAAW,MACX,IAAW,MACX,IAAc,MACd,IAAW,MACX,IAAO,MACP,IAAqB,MACrB,IAAqB;AAIzB,SAAgB,EAAsB,GAAU,GAAW;CAKzD,AAJA,EAAS,iBAAiB,QAAQ,CAAC,CAAC,SAAQ,MAAO;EAEjD,AADA,EAAI,UAAU,OAAO,eAAe,6BAA6B,2BAA2B,yBAAyB,GACrH,EAAI,UAAU,IAAI,eAAe;CACnC,CAAC,GACG,MACF,EAAU,UAAU,OAAO,eAAe,GAC1C,EAAU,UAAU,IAAI,aAAa;AAEzC;AAEA,SAAgB,EAAoB,GAAa,GAAU,GAAS,GAAY,GAAgB,GAAU,GAAU,GAAY,GAAS,GAAoB;CAS3J,AARA,IAAM,GACN,IAAiB,KAAkB,CAAC,GAChC,MAAU,IAAW,IACrB,MAAU,IAAc,IACxB,MAAY,IAAW,IACvB,MAAS,IAAqB,IAC9B,MAAoB,IAAqB,IAC7C,IAAO,GACP,IAAW;CACX,IAAM,IAAS,EAAc,GAAM,CAAO;CAC1C,EAAM,0BAA0B,GAAU,GAAQ,CAAa;AACjE;AAKA,SAAgB,EAAe,GAAO;CACpC,IAAM,IAAO,EAAG,IAAI,GAAOA,EAAG,MAAM,IAAI,CAAC,GACnC,IAAU,EAAI,cAAc,IAAI;CAItC,AAHA,EAAQ,aAAa,QAAQ,UAAU,GACvC,EAAQ,aAAa,cAAc,IAAO,EAAK,QAAQ,YAAY,GACnE,EAAQ,UAAU,GAClB,EAAG,QAAQ,cAAc,GAAS,CAAK;CAEvC,IAAM,IAAc,EAAQ,YAAY,EAAI,cAAc,QAAQ,CAAC;CAKnE,OAJA,EAAY,aAAa,QAAQ,QAAQ,GACzC,EAAY,YAAY,IAAO,EAAK,QAAQ,cAC5C,EAAY,UAAU,IAAI,mBAAmB,gBAAgB,iBAAiB,qBAAqB,GAE5F;EAAE;EAAS;EAAa;CAAK;AACtC;AAEA,eAAsB,EAA0B,GAAM,GAAO;CAC3D,KAAK,IAAM,KAAK,GAAM;EACpB,IAAI,IAAQ,EAAG,IAAI,CAAC;EACpB,IAAI;GACF,IAAQ,MAAM,EAAiB,GAAO,CAAK;EAC7C,QAAa;GAEX,EAAY,gEAAG;EACjB;EACA,AAAI,KAAO,EAAa,CAAQ;CAClC;AACF;AAEA,SAAS,EAAe,GAAO;CAC7B,SAAS,EAAsB,GAAO;EAIpC,IAHA,EAAM,eAAe,GACrB,EAAqB,GAAU,CAAW,GACtC,KAAoB,EAAmB,GACvC,CAAC,EAAM,SACT,KAAK,IAAM,KAAO,GAAgB,OAAO,EAAe;EAK1D,AAHA,EAAe,EAAM,OAAO,CAAC,EAAe,EAAM,MAClD,EAAsB,GAAU,CAAc,GAE9C,EAAG,QAAQ,iBAAiB,EAAM,IAAI,GAAG,KAAA,GAAW,SAAU,GAAI,GAAS;GAIzE,AAHK,KACH,EAAY,4BAA4B,IAAQ,cAAc,CAAO,GAEvE,EAAa,GAAU,MAAM,EAAK;EACpC,CAAC;CACH;CAEA,IAAM,EAAE,YAAS,mBAAgB,EAAc,CAAK;CAKpD,OAHA,EAAY,iBAAiB,SAAS,GAAsB,EAAK,GACjE,EAAG,QAAQ,eAAe,IAAS,MAAQ,EAAyB,GAAM,CAAK,CAAC,GAChF,EAAQ,iBAAiB,SAAS,GAAsB,EAAI,GACrD;AACT;AAEA,SAAgB,EACd,GACA,GACA,GACA;CACA,SAAS,EAAqB,GAAO,GAAS;EAC5C,OAAO,IAAI,SAAS,GAAS,MAAW;GAGtC,AAFA,EAAQ,UAAU,IAAI,eAAe,GACrC,EAAQ,aAAa,aAAa,MAAM,GACxC,EAAG,QAAQ,iBAAiB,EAAM,IAAI,GAAG,KAAA,GAAW,SAClD,GACA,GACA;IACA,IAAI,CAAC,GAAI;KACP,IAAM,IAAM,uBAAuB,IAAQ,cAAc;KAGzD,AAFA,EAAY,CAAG,GACX,KAAkB,EAAiB,IAAO,CAAG,GACjD,EAAO,CAAG;KACV;IACF;IAQA,AAPA,EAAQ,UAAU,OAAO,eAAe,GACxC,EAAQ,aAAa,aAAa,OAAO,GACzC,EAAQ,UAAU,IAAI,UAAU,GAChC,EAAe,EAAM,OAAO,IAC5B,EAAsB,GAAU,CAAc,GAC9C,EAAa,GAAU,IAAI,GACvB,KAAkB,EAAiB,EAAI,GAC3C,EAAQ,EAAI;GACd,CAAC;EACH,CAAC;CACH;CAEA,KAAK,IAAI,IAAI,GAAG,IAAI,EAAS,SAAS,QAAQ,KAAK;EACjD,IAAM,IAAU,EAAS,SAAS,IAC5B,IAAQ,EAAQ;EACjB,KACL,EAAoB,GAAO,CAAO,CAAC,CAChC,OAAM,MAAO;GACZ,AAAI,KAAkB,EAAiB,IAAO,CAAG;EACnD,CAAC;CACL;AACF;AAEA,SAAgB,EAAuB,GAAI,GAAgB;CACzD,KAAK,IAAI,IAAI,GAAG,IAAI,EAAG,SAAS,QAAQ,KAAK;EAC3C,IAAM,IAAK,EAAG,SAAS;EACvB,AAAI,EAAG,WACL,EAAG,UAAU,OAAO,YAAY,CAAC,CAAC,EAAe,EAAG,QAAQ,IAAI;CAEpE;AACF;AAEA,SAAgB,EAAa,GAAM,GAAS,GAAU,GAAY,GAAgB,GAAU,GAAU;CAKpG,AAJA,IAAM,GACF,MAAgB,IAAiB,IACjC,MAAU,IAAW,IACrB,MAAU,IAAc,IAC5B,IAAW;CACX,IAAM,IAAS,EAAc,GAAM,CAAO;CAI1C,AAHI,EAAO,SAAS,KAClB,EAAc,EAAO,EAAE,GAEzB,EAAM,0BAA0B,GAAU,GAAQ,CAAa;AAEjE;AAEA,SAAS,EAAe,GAAM,GAAS;CACrC,IAAI,IAAS,CAAC;CAQd,IAPI,EAAQ,gBACV,EAAO,KAAK;EACV;EACA,EAAG,IAAI,EAAQ,cAAcA,EAAG,MAAM,IAAI,CAAC;EAC3C,EAAQ;CACV,CAAC,GAEC,GAAM;EACR,IAAM,IAAa,EAAG,IAAI,GAAMA,EAAG,MAAM,YAAY,CAAC,GAEhD,KADK,IAAO,EAAG,KAAK,GAAMA,EAAG,MAAM,eAAe,GAAG,MAAM,CAAU,IAAI,CAAC,EAAA,CACjE,IAAI,SAAU,GAAG;GAC9B,OAAO;IAAC;IAAM,EAAG,IAAI,GAAGA,EAAG,MAAM,IAAI,CAAC;IAAG;GAAC;EAC5C,CAAC;EAED,AADA,IAAS,EAAO,OAAO,CAAG,GAC1B,EAAO,KAAK;CACd;CACA,OAAO,EAAO,KAAI,MAAS,EAAM,EAAE;AACrC;AAEA,eAAsB,EAAe,GAAM;CACzC,IAAM,IAAa,EAAG,IAAI,GAAMA,EAAG,MAAM,YAAY,CAAC;CACtD,IAAI,GAAY;EACd,MAAM,EAAG,QAAQ,KAAK,CAAU;EAChC,IAAM,IAAK,IAAO,EAAG,KAAK,GAAMA,EAAG,MAAM,eAAe,GAAG,MAAM,CAAU,IAAI,CAAC;EAEhF,OADA,MAAM,EAAG,QAAQ,KAAK,CAAE,GACjB;CACT,OACE,OAAO,CAAC;AAEZ;AAqBA,SAAgB,EAAc,GAAa,GAAa,IAAa,IAAM;CAMzE,IAAM,IAAK,KAAe;CAM1B,IAAI,CAAC,KAAM,CAAC,EAAG,YAAY,OAAO,EAAG,SAAS,UAAW,UAAU;EACjE,EAAW,8CAA8C,CAAE;EAC3D;CACF;CAEA,SAAS,EAAmB,GAAU,GAAQ;EAC5C,SAAS,EAAc,GAAO;GAE5B,AADA,EAAM,eAAe,GACrB,EAAa,GAAI,GAAQ,CAAQ;EACnC;EAEA,AADA,EAAS,iBAAiB,SAAS,CAAY,GAC/C,EAAS,iBAAiB,WAAW,SAAU,GAAO;GACpD,CAAI,EAAM,QAAQ,WAAW,EAAM,QAAQ,SACzC,EAAM,eAAe,GACrB,EAAa,CAAK;EAEtB,CAAC;CACH;CAEA,IAAI,IAAQ,CAAC;CAOb,AALA,OADsB,KAAK,CAAc,CAAC,CAAC,KAAI,MAAY,EAAG,IAAI,CAAQ,CACrE,CAAC,CAAC,SAAQ,MAAS;EACtB,AAAI,EAAe,EAAM,WACvB,IAAQ,EAAM,OAAO,EAAa,GAAI,CAAK,CAAC;CAEhD,CAAC,GACD,EAAM,KAAK,CAAc;CACzB,KAAK,IAAI,IAAI,GAAG,IAAI,EAAM,SAAS,IACjC,AAAI,EAAM,EAAE,CAAC,QAAQ,EAAM,IAAI,EAAE,CAAC,MAChC,EAAM,OAAO,GAAG,CAAC,IAEjB;CAIJ,SAAS,EAAuB,GAAQ,GAAI;EAC1C,IAAM,IAAW,EAAI,cAAc,IAAI;EAKvC,AAJA,EAAS,aAAa,QAAQ,UAAU,GACxC,EAAS,aAAa,YAAY,GAAG,GACrC,EAAS,UAAU,IAAI,UAAU,GACjC,EAAS,UAAU,GACnB,EAAG,QAAQ,cAAc,GAAU,CAAM;EAGzC,IAAM,IAAS,EAAI,cAAc,KAAK;EACtC,EAAO,UAAU,IAAI,cAAc;EAGnC,IAAM,IAAY,EAAI,cAAc,KAAK;EACzC,EAAU,UAAU,IAAI,iBAAiB;EAEzC,IAAM,IAAgB,EAAI,cAAc,KAAK;EAG7C,AAFA,EAAc,UAAU,IAAI,oBAAoB,GAChD,EAAc,YAAY,4TAC1B,EAAU,YAAY,CAAa;EAGnC,IAAM,IAAO,EAAQ,CAAM,KAAK;EAGhC,SAAS,IAAgB;GACvB,IAAM,IAAY,EAAG,IAAI,GAAQA,EAAG,MAAM,UAAU,CAAC;GACrD,IAAI,KAAa,EAAU,OAAO;IAChC,IAAM,IAAM,EAAI,cAAc,KAAK;IAGnC,AAFA,EAAI,MAAM,EAAU,OACpB,EAAI,MAAM,IAAO,WACjB,EAAU,aAAa,GAAK,EAAU,UAAU;GAClD;EACF;EAIA,AAHA,EAAa,GAGb,EAAG,QAAQ,iBAAiB,EAAO,IAAI,GAAG,KAAA,GAAW,SAAU,GAAI,GAAS;GAC1E,IAAI,CAAC,GAAI;IAEP,AADA,EAAY,0BAA0B,IAAS,cAAc,CAAO,GACpE,EAAS,UAAU,IAAI,iBAAiB;IACxC;GACF;GACA,EAAa;EACf,CAAC;EAGD,IAAM,IAAU,EAAI,cAAc,KAAK;EAGvC,AAFA,EAAQ,UAAU,IAAI,eAAe,GAErC,EAAS,aAAa,cAAc,CAAI;EACxC,IAAM,IAAU,EAAI,cAAc,KAAK;EAIvC,AAHA,EAAQ,UAAU,IAAI,eAAe,GACrC,EAAQ,cAAc,GAEtB,EAAQ,YAAY,CAAO;EAG3B,IAAM,IAAW,EAAI,cAAc,KAAK;EAWxC,OAVA,EAAS,UAAU,IAAI,gBAAgB,GACvC,EAAS,YAAY,oQAGrB,EAAO,YAAY,CAAS,GAC5B,EAAO,YAAY,CAAO,GAC1B,EAAO,YAAY,CAAQ,GAC3B,EAAS,YAAY,CAAM,GAE3B,EAAkB,GAAU,CAAM,GAC3B;CACT;CAGA,AADA,EAAM,0BAA0B,GAAI,IAAO,MAAU,EAAsB,GAAQ,CAAE,CAAC,GACtF,EAAsB,GAAI,GAAY,KAAe,CAAQ;AAC/D;AAEA,SAAgB,EAAc,GAAU,GAAQ,GAAa;CAC3D,IAAI,CAAC,GAAa;CAOlB,AANI,EAAY,cAAY,EAAY,WAAW,UAAU,OAAO,QAAQ,GAC5E,EAAY,YAAY,cACxB,EAAY,aAAa,aAAa,MAAM,GAC5C,EAAY,UAAU,IAAI,6BAA6B,GACvD,IAAiB,CAAC,GAClB,EAAe,EAAO,OAAO,IAC7B,EAAsB,GAAU,IAAO,CAAW;CAClD,IAAI;CACJ,IAAI;EACF,IAAQ,IAAO,EAAU,CAAM,IAAI;CACrC,SAAS,GAAK;EAGZ,AAFA,EAAY,YAAY,IACxB,EAAY,aAAa,aAAa,OAAO,GAC7C,EAAS,GAAa,GAAK,0BAA0B,EAAI,OAAO;EAChE;CACF;CACA,EAAG,QAAQ,iBAAiB,EAAM,IAAI,GAAG,KAAA,GAAW,SAClD,GACA,GACA;EAGA,IAFA,EAAY,YAAY,IACxB,EAAY,aAAa,aAAa,OAAO,GACzC,CAAC,GAAI;GAEP,AADA,EAAY,kCAAkC,IAAQ,cAAc,CAAO,GAC3E,EAAS,GAAa,GAAK,6DAA6D;GACxF;EACF;EAIA,IAAM,IAAU,EAAI,cAAc,KAAK;EACvC,EAAQ,UAAU,IAAI,iBAAiB;EACvC,IAAM,IAAS,EAAG,QAAQ,SAAS,GAAK,CAAK;EAgE7C,AA/DA,EAAO,aAAa,SAAS,gBAAgB,GAC7C,EAAQ,YAAY,CAAM,GAEtB,EAAM,YAAY,KAuDpB,EArDwB,QAAQ,sBAC9B,GACA,GACA,WACA,iBAAkB;GAChB,IAAM,IAAY,EAAO,IAAI;GAI7B,AADA,EAAU,wCADI,EAAG,IAAI,GAAQA,EAAG,MAAM,IAAI,CACQ,CAAK,GACvD,MAAM,EAAc;GAEpB,IAAM,IAAiB,EAAG,IAAI,GAAMA,EAAG,MAAM,gBAAgB,CAAC;GAC9D,MAAM,EAAG,QAAQ,KAAK,CAAc;GAOpC,IAAM,IAAS,EAAgB,CAAM,GACjC,IAAmB,CAAC;GAaxB,AAXA,EAAO,SAAQ,MAAS;IAGtB,EAFyB,GAAI,GAAQ,EAAM,IAAI,CAE1C,CAAC,CAAC,SAAQ,MAAS;KACtB,AAAI,EAAU,GAAI,GAAO,EAAM,IAAI,CAAC,CAAC,CAAC,WAAW,MAC/C,IAAmB,EAAiB,OAAO,EAAG,mBAAmB,GAAOA,EAAG,MAAM,WAAW,GAAG,GAAO,EAAM,IAAI,CAAC,CAAC;IAEtH,CAAC;GACH,CAAC,GAGD,MAAM,EAAG,QAAQ,WAAW,CAAgB;GAE5C,IAAI;IACF,MAAM,EAAkB,CAAM;GAChC,QAAc;IACZ,EAAS,GAAa,GAAK,+DAA+D;IAC1F;GACF;GAEA,IAAI;IACF,MAAM,EAAgB,GAAI,GAAW,GAAS,CAAG;GACnD,QAAc;IAEZ,EAAS,GAAa,GAAK,+DAAG;IAC9B;GACF;GAEA,AADA,EAAa,GAAU,CAAW,GAClC,EAAY,YAAY;EAC1B,CAES,CAAC,CAAC,UAAU,IAAI,cAAc,GAE3C,EAAY,YAAY,CAAO,GAE/B,EAAY,UAAU,IAAI,6BAA6B,GACvD,EAAY,YAAY,EAAW,GAAO,SAAS,CAAC;CACtD,CAAC;AACH;AAEA,SAAgB,EAAmB,GAAU;CAE3C,IADA,IAAiB,CAAC,GACd,GACF,KAAK,IAAI,IAAI,GAAG,IAAI,EAAS,SAAS,QAAQ,KAC5C,EAAS,SAAS,EAAE,CAAC,UAAU,OAAO,UAAU;AAGtD;AAEA,SAAgB,EAAuB,GAAU,GAAQ,GAAa;CACpE,IAAI,IAAQ,GACR,IAAU;CACd,KAAK,IAAI,IAAI,GAAG,IAAI,EAAS,SAAS,QAAQ,KAAK;EACjD,IAAM,IAAY,EAAS,SAAS,IAC9B,IAAU,EAAW,EAAQ,EAAU,OAAO,CAAC;EAMrD,AALI,MACF,KACA,IAAU,IAEZ,EAAU,UAAU,OAAO,YAAY,KAAW,CAAC,CAAC,EAAe,EAAU,QAAQ,IAAI,GACzF,EAAU,UAAU,OAAO,UAAU,CAAC,CAAO;CAC/C;CACA,IAAI,MAAU,KAAK,GAAQ;EACzB,IAAM,IAAS,EAAQ;EACvB,EAAa,GAAU,GAAQ,CAAW;CAC5C;AACF;AAEA,SAAS,EAAY,GAAM;CACzB,IAAM,IAAS,EAAY,MAAM,KAAK,CAAC,CAAC,YAAY;CACpD,IAAI,EAAO,WAAW,GAAG,OAAO;CAChC,IAAM,IAAQ,EAAO,MAAM,GAAG;CAC9B,KAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK;EACrC,IAAM,IAAO,EAAM;EACnB,IAAI,EAAK,YAAY,CAAC,CAAC,QAAQ,CAAI,IAAI,GAAG,OAAO;CACnD;CACA,OAAO;AACT;AAEA,SAAS,EAAY,GAAS,GAAU;CAEtC,IAAM,IADI,EAAmB,QAAQ,aAAa,OAAO,CAC/C,CAAC,CAAC,OAAO,GAAS,CAAkB;CAE9C,OADA,EAAE,UAAU,IAAI,YAAY,GACrB;AACT;AAEA,SAAS,EAAW,GAAQ;CAC1B,IAAM,IAAU,EAAG,WAAW,CAAM,GAC9B,IAAS,EAAK,IAAI,CAAC,CAAC;CAC1B,KAAK,IAAI,IAAI,GAAG,IAAI,EAAQ,QAAQ,KAClC,IAAI,EAAQ,EAAE,CAAC,IAAI,MAAM,GAAG,EAAO,MAAM,MAAM,GAC7C,OAAO,EAAQ;CAGnB,MAAU,MAAM,sBAAsB,CAAM;AAC9C;AAGA,eAAsB,EAAgB,GAAM,GAAuB;CAEjE,IAAM,IAAS,MAAM,EAAc,CAAI;CAEvC,IAAI,KAAU,EAAO,SAAS,GAAG;EAC/B,IAAM,EAAE,QAAK,WAAQ,MAAM,EAAmB,CAAM;EAEpD,AAAI,EAAM,YAAY,KAChB,EAAI,UACN,EAAG,QAAQ,sBACT,GACA,GACA,WACA,iBAAkB;GAEhB,AADA,MAAM,EAAG,QAAQ,WAAW,GAAK,CAAG,GACpC,EAAU,aAAa,EAAI,SAAS,6BAA6B;EACnE,CAAC;CAGT;AACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { WebComponent } from 'solid-ui';
|
|
2
|
+
export default class AddContactModal extends WebComponent {
|
|
3
|
+
static styles: import('lit').CSSResult;
|
|
4
|
+
accessor book: unknown | null;
|
|
5
|
+
accessor selectedGroups: unknown | null;
|
|
6
|
+
private accessor contactType;
|
|
7
|
+
private accessor name;
|
|
8
|
+
private accessor loading;
|
|
9
|
+
private accessor error;
|
|
10
|
+
private accessor context;
|
|
11
|
+
private dialogTrait;
|
|
12
|
+
constructor();
|
|
13
|
+
protected render(): import('lit-html').TemplateResult<1>;
|
|
14
|
+
private onContactTypeChanged;
|
|
15
|
+
private onNameChanged;
|
|
16
|
+
private onSubmit;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=AddContactModal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AddContactModal.d.ts","sourceRoot":"","sources":["../../../src/components/add-contact-modal/AddContactModal.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,YAAY,EAA0D,MAAM,UAAU,CAAA;AAO9G,OAAO,oCAAoC,CAAA;AAC3C,OAAO,mCAAmC,CAAA;AAC1C,OAAO,4BAA4B,CAAA;AACnC,OAAO,2BAA2B,CAAA;AAClC,OAAO,mCAAmC,CAAA;AAC1C,OAAO,4BAA4B,CAAA;AAcnC,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,YAAY;IACvD,MAAM,CAAC,MAAM,0BAAS;IAGtB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAQ;IAGrC,QAAQ,CAAC,cAAc,EAAE,OAAO,GAAG,IAAI,CAAQ;IAG/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA+B;IAG3D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAM;IAG3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAGjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAG7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IAEjE,OAAO,CAAC,WAAW,CAAqB;;IAUxC,SAAS,CAAC,MAAM;IA0ChB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,aAAa;YAIP,QAAQ;CAyBvB"}
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
import { saveNewContact as e } from "../../contactLogic.esm.js";
|
|
2
|
+
import t from "./AddContactModal.styles.esm.js";
|
|
3
|
+
import { html as n, nothing as r } from "lit";
|
|
4
|
+
import { DEFAULT_DIALOG_CONTEXT as i, DialogTrait as a, WebComponent as o, customElement as s, dialogContext as c, ns as l } from "solid-ui";
|
|
5
|
+
import { property as u, state as d } from "lit/decorators.js";
|
|
6
|
+
import { consume as f } from "@lit/context";
|
|
7
|
+
import "solid-ui/components/dialog-content";
|
|
8
|
+
import "solid-ui/components/dialog-footer";
|
|
9
|
+
import "solid-ui/components/dialog";
|
|
10
|
+
import "solid-ui/components/input";
|
|
11
|
+
import "solid-ui/components/select-option";
|
|
12
|
+
import "solid-ui/components/select";
|
|
13
|
+
//#region src/components/add-contact-modal/AddContactModal.ts
|
|
14
|
+
var p, m, h, g, _, v, y, b, x, S, C, w, T, E, D, O, k, A, j, M, N, P, F, I, L, R, z, B;
|
|
15
|
+
function V(e, t, n) {
|
|
16
|
+
H(e, t), t.set(e, n);
|
|
17
|
+
}
|
|
18
|
+
function H(e, t) {
|
|
19
|
+
if (t.has(e)) throw TypeError("Cannot initialize the same private elements twice on an object");
|
|
20
|
+
}
|
|
21
|
+
function U(e, t, n) {
|
|
22
|
+
return e.set(G(e, t), n), n;
|
|
23
|
+
}
|
|
24
|
+
function W(e, t) {
|
|
25
|
+
return e.get(G(e, t));
|
|
26
|
+
}
|
|
27
|
+
function G(e, t, n) {
|
|
28
|
+
if (typeof e == "function" ? e === t : e.has(t)) return arguments.length < 3 ? t : n;
|
|
29
|
+
throw TypeError("Private element is not present on this object");
|
|
30
|
+
}
|
|
31
|
+
function K(e, t, n) {
|
|
32
|
+
return (t = J(t)) in e ? Object.defineProperty(e, t, {
|
|
33
|
+
value: n,
|
|
34
|
+
enumerable: !0,
|
|
35
|
+
configurable: !0,
|
|
36
|
+
writable: !0
|
|
37
|
+
}) : e[t] = n, e;
|
|
38
|
+
}
|
|
39
|
+
function q(e, t, n, r, i, a) {
|
|
40
|
+
function o(e, t, n) {
|
|
41
|
+
return function(r, i) {
|
|
42
|
+
return n && n(r), e[t].call(r, i);
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function s(e, t) {
|
|
46
|
+
for (var n = 0; n < e.length; n++) e[n].call(t);
|
|
47
|
+
return t;
|
|
48
|
+
}
|
|
49
|
+
function c(e, t, n, r) {
|
|
50
|
+
if (typeof e != "function" && (r || e !== void 0)) throw TypeError(t + " must " + (n || "be") + " a function" + (r ? "" : " or undefined"));
|
|
51
|
+
return e;
|
|
52
|
+
}
|
|
53
|
+
function l(e, t, n, r, i, a, s, l, u, d, f, p, m) {
|
|
54
|
+
function h(e) {
|
|
55
|
+
if (!m(e)) throw TypeError("Attempted to access private element on non-instance");
|
|
56
|
+
}
|
|
57
|
+
var g, _ = t[0], v = t[3], y = !l;
|
|
58
|
+
if (!y) {
|
|
59
|
+
n || Array.isArray(_) || (_ = [_]);
|
|
60
|
+
var b = {}, x = [], S = i === 3 ? "get" : i === 4 || p ? "set" : "value";
|
|
61
|
+
d ? (f || p ? b = {
|
|
62
|
+
get: X(function() {
|
|
63
|
+
return v(this);
|
|
64
|
+
}, r, "get"),
|
|
65
|
+
set: function(e) {
|
|
66
|
+
t[4](this, e);
|
|
67
|
+
}
|
|
68
|
+
} : b[S] = v, f || X(b[S], r, i === 2 ? "" : S)) : f || (b = Object.getOwnPropertyDescriptor(e, r));
|
|
69
|
+
}
|
|
70
|
+
for (var C = e, w = _.length - 1; w >= 0; w -= n ? 2 : 1) {
|
|
71
|
+
var T = _[w], E = n ? _[w - 1] : void 0, D = {}, O = {
|
|
72
|
+
kind: [
|
|
73
|
+
"field",
|
|
74
|
+
"accessor",
|
|
75
|
+
"method",
|
|
76
|
+
"getter",
|
|
77
|
+
"setter",
|
|
78
|
+
"class"
|
|
79
|
+
][i],
|
|
80
|
+
name: r,
|
|
81
|
+
metadata: a,
|
|
82
|
+
addInitializer: function(e, t) {
|
|
83
|
+
if (e.v) throw Error("attempted to call addInitializer after decoration was finished");
|
|
84
|
+
c(t, "An initializer", "be", !0), s.push(t);
|
|
85
|
+
}.bind(null, D)
|
|
86
|
+
};
|
|
87
|
+
try {
|
|
88
|
+
if (y) (g = c(T.call(E, C, O), "class decorators", "return")) && (C = g);
|
|
89
|
+
else {
|
|
90
|
+
var k, A;
|
|
91
|
+
O.static = u, O.private = d, d ? i === 2 ? k = function(e) {
|
|
92
|
+
return h(e), b.value;
|
|
93
|
+
} : (i < 4 && (k = o(b, "get", h)), i !== 3 && (A = o(b, "set", h))) : (k = function(e) {
|
|
94
|
+
return e[r];
|
|
95
|
+
}, (i < 2 || i === 4) && (A = function(e, t) {
|
|
96
|
+
e[r] = t;
|
|
97
|
+
}));
|
|
98
|
+
var j = O.access = { has: d ? m.bind() : function(e) {
|
|
99
|
+
return r in e;
|
|
100
|
+
} };
|
|
101
|
+
if (k && (j.get = k), A && (j.set = A), C = T.call(E, p ? {
|
|
102
|
+
get: b.get,
|
|
103
|
+
set: b.set
|
|
104
|
+
} : b[S], O), p) {
|
|
105
|
+
if (typeof C == "object" && C) (g = c(C.get, "accessor.get")) && (b.get = g), (g = c(C.set, "accessor.set")) && (b.set = g), (g = c(C.init, "accessor.init")) && x.push(g);
|
|
106
|
+
else if (C !== void 0) throw TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
|
|
107
|
+
} else c(C, (f ? "field" : "method") + " decorators", "return") && (f ? x.push(C) : b[S] = C);
|
|
108
|
+
}
|
|
109
|
+
} finally {
|
|
110
|
+
D.v = !0;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return (f || p) && l.push(function(e, t) {
|
|
114
|
+
for (var n = x.length - 1; n >= 0; n--) t = x[n].call(e, t);
|
|
115
|
+
return t;
|
|
116
|
+
}), f || y || (d ? p ? l.push(o(b, "get"), o(b, "set")) : l.push(i === 2 ? b[S] : o.call.bind(b[S])) : Object.defineProperty(e, r, b)), C;
|
|
117
|
+
}
|
|
118
|
+
function u(e, t) {
|
|
119
|
+
return Object.defineProperty(e, Symbol.metadata || Symbol.for("Symbol.metadata"), {
|
|
120
|
+
configurable: !0,
|
|
121
|
+
enumerable: !0,
|
|
122
|
+
value: t
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
if (arguments.length >= 6) var d = a[Symbol.metadata || Symbol.for("Symbol.metadata")];
|
|
126
|
+
var f = Object.create(d ?? null), p = function(e, t, n, r) {
|
|
127
|
+
var i, a, o = [], c = function(t) {
|
|
128
|
+
return Z(t) === e;
|
|
129
|
+
}, u = /* @__PURE__ */ new Map();
|
|
130
|
+
function d(e) {
|
|
131
|
+
e && o.push(s.bind(null, e));
|
|
132
|
+
}
|
|
133
|
+
for (var f = 0; f < t.length; f++) {
|
|
134
|
+
var p = t[f];
|
|
135
|
+
if (Array.isArray(p)) {
|
|
136
|
+
var m = p[1], h = p[2], g = p.length > 3, _ = 16 & m, v = !!(8 & m), y = (m &= 7) == 0, b = h + "/" + v;
|
|
137
|
+
if (!y && !g) {
|
|
138
|
+
var x = u.get(b);
|
|
139
|
+
if (!0 === x || x === 3 && m !== 4 || x === 4 && m !== 3) throw Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + h);
|
|
140
|
+
u.set(b, !(m > 2) || m);
|
|
141
|
+
}
|
|
142
|
+
l(v ? e : e.prototype, p, _, g ? "#" + h : J(h), m, r, v ? a ||= [] : i ||= [], o, v, g, y, m === 1, v && g ? c : n);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return d(i), d(a), o;
|
|
146
|
+
}(e, t, i, f);
|
|
147
|
+
return n.length || u(e, f), {
|
|
148
|
+
e: p,
|
|
149
|
+
get c() {
|
|
150
|
+
var t = [];
|
|
151
|
+
return n.length && [u(l(e, [n], r, e.name, 5, f, t), f), s.bind(null, t, e)];
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
function J(e) {
|
|
156
|
+
var t = Y(e, "string");
|
|
157
|
+
return typeof t == "symbol" ? t : t + "";
|
|
158
|
+
}
|
|
159
|
+
function Y(e, t) {
|
|
160
|
+
if (typeof e != "object" || !e) return e;
|
|
161
|
+
var n = e[Symbol.toPrimitive];
|
|
162
|
+
if (n !== void 0) {
|
|
163
|
+
var r = n.call(e, t || "default");
|
|
164
|
+
if (typeof r != "object") return r;
|
|
165
|
+
throw TypeError("@@toPrimitive must return a primitive value.");
|
|
166
|
+
}
|
|
167
|
+
return (t === "string" ? String : Number)(e);
|
|
168
|
+
}
|
|
169
|
+
function X(e, t, n) {
|
|
170
|
+
typeof t == "symbol" && (t = (t = t.description) ? "[" + t + "]" : "");
|
|
171
|
+
try {
|
|
172
|
+
Object.defineProperty(e, "name", {
|
|
173
|
+
configurable: !0,
|
|
174
|
+
value: n ? n + " " + t : t
|
|
175
|
+
});
|
|
176
|
+
} catch {}
|
|
177
|
+
return e;
|
|
178
|
+
}
|
|
179
|
+
function Z(e) {
|
|
180
|
+
if (Object(e) !== e) throw TypeError("right-hand side of 'in' should be an object, got " + (e === null ? "null" : typeof e));
|
|
181
|
+
return e;
|
|
182
|
+
}
|
|
183
|
+
function Q(e) {
|
|
184
|
+
return e;
|
|
185
|
+
}
|
|
186
|
+
var ee = [{
|
|
187
|
+
value: "person",
|
|
188
|
+
label: "Person"
|
|
189
|
+
}, {
|
|
190
|
+
value: "organization",
|
|
191
|
+
label: "Organization"
|
|
192
|
+
}];
|
|
193
|
+
w = [s("solid-contacts-pane-add-contact-modal")];
|
|
194
|
+
var $;
|
|
195
|
+
new (z = (h = /*#__PURE__*/ new WeakMap(), g = /*#__PURE__*/ new WeakMap(), _ = /*#__PURE__*/ new WeakMap(), v = /*#__PURE__*/ new WeakMap(), y = /*#__PURE__*/ new WeakMap(), b = /*#__PURE__*/ new WeakMap(), x = /*#__PURE__*/ new WeakMap(), B = (T = u(), D = u(), k = d(), j = d(), N = d(), F = d(), L = f({
|
|
196
|
+
context: c,
|
|
197
|
+
subscribe: !0
|
|
198
|
+
}), "book"), m = class extends o {
|
|
199
|
+
get [B]() {
|
|
200
|
+
return W(h, this);
|
|
201
|
+
}
|
|
202
|
+
set book(e) {
|
|
203
|
+
U(h, this, e);
|
|
204
|
+
}
|
|
205
|
+
get selectedGroups() {
|
|
206
|
+
return W(g, this);
|
|
207
|
+
}
|
|
208
|
+
set selectedGroups(e) {
|
|
209
|
+
U(g, this, e);
|
|
210
|
+
}
|
|
211
|
+
get contactType() {
|
|
212
|
+
return W(_, this);
|
|
213
|
+
}
|
|
214
|
+
set contactType(e) {
|
|
215
|
+
U(_, this, e);
|
|
216
|
+
}
|
|
217
|
+
get name() {
|
|
218
|
+
return W(v, this);
|
|
219
|
+
}
|
|
220
|
+
set name(e) {
|
|
221
|
+
U(v, this, e);
|
|
222
|
+
}
|
|
223
|
+
get loading() {
|
|
224
|
+
return W(y, this);
|
|
225
|
+
}
|
|
226
|
+
set loading(e) {
|
|
227
|
+
U(y, this, e);
|
|
228
|
+
}
|
|
229
|
+
get error() {
|
|
230
|
+
return W(b, this);
|
|
231
|
+
}
|
|
232
|
+
set error(e) {
|
|
233
|
+
U(b, this, e);
|
|
234
|
+
}
|
|
235
|
+
get context() {
|
|
236
|
+
return W(x, this);
|
|
237
|
+
}
|
|
238
|
+
set context(e) {
|
|
239
|
+
U(x, this, e);
|
|
240
|
+
}
|
|
241
|
+
constructor() {
|
|
242
|
+
super(), V(this, h, (S(this), E(this, null))), V(this, g, O(this, null)), V(this, _, A(this, "organization")), V(this, v, M(this, "")), V(this, y, P(this, !1)), V(this, b, I(this, null)), V(this, x, R(this, i)), K(this, "dialogTrait", void 0), this.dialogTrait = this.addTrait(new a(this, { getContext: () => this.context }));
|
|
243
|
+
}
|
|
244
|
+
render() {
|
|
245
|
+
if (!this.book || !this.selectedGroups) throw Error("Book and selectedGroups are required for <solid-contacts-pane-add-contact-modal>");
|
|
246
|
+
return n`
|
|
247
|
+
<solid-ui-dialog title="Add Contact">
|
|
248
|
+
<form @submit=${this.onSubmit}>
|
|
249
|
+
<solid-ui-dialog-content>
|
|
250
|
+
<p>The new contact is added to the already selected group.</p>
|
|
251
|
+
<solid-ui-select
|
|
252
|
+
name="type"
|
|
253
|
+
label="Contact type"
|
|
254
|
+
.value=${this.contactType}
|
|
255
|
+
@input=${this.onContactTypeChanged}
|
|
256
|
+
>
|
|
257
|
+
${ee.map((e) => n`<solid-ui-select-option .value=${e.value}
|
|
258
|
+
>${e.label}</solid-ui-select-option
|
|
259
|
+
>`)}
|
|
260
|
+
</solid-ui-select>
|
|
261
|
+
<solid-ui-input
|
|
262
|
+
required
|
|
263
|
+
name="name"
|
|
264
|
+
label=${this.contactType === "person" ? "Individual name" : "Organization name"}
|
|
265
|
+
.value=${this.name}
|
|
266
|
+
@input=${this.onNameChanged}
|
|
267
|
+
></solid-ui-input>
|
|
268
|
+
${this.error ? n`<p class="error">${this.error}</p>` : r}
|
|
269
|
+
</solid-ui-dialog-content>
|
|
270
|
+
<solid-ui-dialog-footer>
|
|
271
|
+
<solid-ui-button type="submit" ?loading=${this.loading}>Add Contact</solid-ui-button>
|
|
272
|
+
</solid-ui-dialog-footer>
|
|
273
|
+
</form>
|
|
274
|
+
</solid-ui-dialog>
|
|
275
|
+
`;
|
|
276
|
+
}
|
|
277
|
+
onContactTypeChanged(e) {
|
|
278
|
+
this.contactType = e.target.value;
|
|
279
|
+
}
|
|
280
|
+
onNameChanged(e) {
|
|
281
|
+
this.name = e.target.value;
|
|
282
|
+
}
|
|
283
|
+
async onSubmit(t) {
|
|
284
|
+
t.preventDefault(), this.error = null, this.loading = !0;
|
|
285
|
+
try {
|
|
286
|
+
let t = await e(this.book, this.name, this.selectedGroups, this.contactType === "organization" ? l.vcard("Organization") : l.vcard("Individual"));
|
|
287
|
+
this.dialogTrait.close(t);
|
|
288
|
+
} catch (e) {
|
|
289
|
+
console.error(e), this.error = "Error saving contact. If it persists, contact your admin.";
|
|
290
|
+
} finally {
|
|
291
|
+
this.loading = !1;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}, {e: [E, O, A, M, P, I, R, S], c: [$, C]} = q(m, [
|
|
295
|
+
[
|
|
296
|
+
T,
|
|
297
|
+
1,
|
|
298
|
+
"book"
|
|
299
|
+
],
|
|
300
|
+
[
|
|
301
|
+
D,
|
|
302
|
+
1,
|
|
303
|
+
"selectedGroups"
|
|
304
|
+
],
|
|
305
|
+
[
|
|
306
|
+
k,
|
|
307
|
+
1,
|
|
308
|
+
"contactType"
|
|
309
|
+
],
|
|
310
|
+
[
|
|
311
|
+
j,
|
|
312
|
+
1,
|
|
313
|
+
"name"
|
|
314
|
+
],
|
|
315
|
+
[
|
|
316
|
+
N,
|
|
317
|
+
1,
|
|
318
|
+
"loading"
|
|
319
|
+
],
|
|
320
|
+
[
|
|
321
|
+
F,
|
|
322
|
+
1,
|
|
323
|
+
"error"
|
|
324
|
+
],
|
|
325
|
+
[
|
|
326
|
+
L,
|
|
327
|
+
1,
|
|
328
|
+
"context"
|
|
329
|
+
]
|
|
330
|
+
], w, 0, void 0, o), m), p = class extends Q {
|
|
331
|
+
constructor() {
|
|
332
|
+
super($), K(this, "styles", t), C();
|
|
333
|
+
}
|
|
334
|
+
}, K(p, z, void 0), p)();
|
|
335
|
+
//#endregion
|
|
336
|
+
export { $ as default };
|
|
337
|
+
|
|
338
|
+
//# sourceMappingURL=AddContactModal.esm.js.map
|