contacts-pane 3.2.1-2 → 3.2.1-3
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/README.md +5 -5
- package/dist/_virtual/_rolldown/runtime.cjs.js +1 -0
- package/dist/addressBookPresenter.cjs.js +2 -0
- package/dist/addressBookPresenter.cjs.js.map +1 -0
- package/dist/addressBookPresenter.esm.js +270 -0
- package/dist/addressBookPresenter.esm.js.map +1 -0
- package/dist/contactLogic.cjs.js +2 -0
- package/dist/contactLogic.cjs.js.map +1 -0
- package/dist/contactLogic.esm.js +138 -0
- package/dist/contactLogic.esm.js.map +1 -0
- package/dist/contactsPane.cjs.js +6 -0
- package/dist/contactsPane.cjs.js.map +1 -0
- package/dist/contactsPane.esm.js +360 -0
- package/dist/contactsPane.esm.js.map +1 -0
- package/dist/debug.cjs.js +2 -0
- package/dist/debug.cjs.js.map +1 -0
- package/dist/debug.esm.js +14 -0
- package/dist/debug.esm.js.map +1 -0
- package/dist/groupMembershipControl.cjs.js +2 -0
- package/dist/groupMembershipControl.cjs.js.map +1 -0
- package/dist/groupMembershipControl.esm.js +73 -0
- package/dist/groupMembershipControl.esm.js.map +1 -0
- package/dist/index.cjs.js +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.esm.js +2 -0
- package/dist/individual.cjs.js +3 -0
- package/dist/individual.cjs.js.map +1 -0
- package/dist/individual.esm.js +37 -0
- package/dist/individual.esm.js.map +1 -0
- package/dist/localUtils.cjs.js +8 -0
- package/dist/localUtils.cjs.js.map +1 -0
- package/dist/localUtils.esm.js +159 -0
- package/dist/localUtils.esm.js.map +1 -0
- package/dist/mintNewAddressBook.cjs.js +13 -0
- package/dist/mintNewAddressBook.cjs.js.map +1 -0
- package/dist/mintNewAddressBook.esm.js +81 -0
- package/dist/mintNewAddressBook.esm.js.map +1 -0
- package/dist/mugshotGallery.cjs.js +2 -0
- package/dist/mugshotGallery.cjs.js.map +1 -0
- package/dist/mugshotGallery.esm.js +167 -0
- package/dist/mugshotGallery.esm.js.map +1 -0
- package/dist/ontology/individualAndOrganizationForm.cjs.js +219 -0
- package/dist/ontology/individualAndOrganizationForm.cjs.js.map +1 -0
- package/dist/ontology/individualAndOrganizationForm.esm.js +6 -0
- package/dist/ontology/individualAndOrganizationForm.esm.js.map +1 -0
- package/dist/ontology/vcard.cjs.js +916 -0
- package/dist/ontology/vcard.cjs.js.map +1 -0
- package/dist/ontology/vcard.esm.js +6 -0
- package/dist/ontology/vcard.esm.js.map +1 -0
- package/dist/rdfFormsHelper.cjs.js +2 -0
- package/dist/rdfFormsHelper.cjs.js.map +1 -0
- package/dist/rdfFormsHelper.esm.js +18 -0
- package/dist/rdfFormsHelper.esm.js.map +1 -0
- package/dist/toolsPane.cjs.js +5 -0
- package/dist/toolsPane.cjs.js.map +1 -0
- package/dist/toolsPane.esm.js +300 -0
- package/dist/toolsPane.esm.js.map +1 -0
- package/dist/webidControl.cjs.js +2 -0
- package/dist/webidControl.cjs.js.map +1 -0
- package/dist/webidControl.esm.js +175 -0
- package/dist/webidControl.esm.js.map +1 -0
- package/package.json +35 -50
- package/dist/contactsPane.js +0 -6697
- package/dist/contactsPane.js.map +0 -1
- package/dist/contactsPane.min.js +0 -2
- package/dist/contactsPane.min.js.map +0 -1
- package/dist/styles/contactsPane.css +0 -620
- package/dist/styles/contactsRDFFormsEnforced.css +0 -515
- package/dist/styles/groupMembership.css +0 -115
- package/dist/styles/individual.css +0 -12
- package/dist/styles/localUtils.css +0 -49
- package/dist/styles/mugshotGallery.css +0 -17
- package/dist/styles/toolsPane.css +0 -43
- package/dist/styles/utilities.css +0 -10
- package/dist/styles/webidControl.css +0 -252
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { error as e, warn as t } from "./debug.esm.js";
|
|
2
|
+
import { getPersonas as n } from "./webidControl.esm.js";
|
|
3
|
+
import { alertDialog as r, confirmDialog as i, getSameAs as a } from "./localUtils.esm.js";
|
|
4
|
+
import { store as o } from "solid-logic";
|
|
5
|
+
import * as s from "solid-ui";
|
|
6
|
+
import * as c from "rdflib";
|
|
7
|
+
//#region src/contactLogic.js
|
|
8
|
+
var l = s.ns, u = s.utils, d = o, f = d.updater;
|
|
9
|
+
async function p(e, t = []) {
|
|
10
|
+
let n = e.concat(t).map((e) => e.why), r = [];
|
|
11
|
+
n.forEach((e) => {
|
|
12
|
+
r.find((t) => t.equals(e)) || r.push(e);
|
|
13
|
+
});
|
|
14
|
+
let i = r.map((n) => d.updater.update(e.filter((e) => e.why.sameTerm(n)), t.filter((e) => e.why.sameTerm(n))));
|
|
15
|
+
return Promise.all(i);
|
|
16
|
+
}
|
|
17
|
+
async function m(t, n, i, a) {
|
|
18
|
+
await d.fetcher.load(t.doc());
|
|
19
|
+
let o = d.any(t, l.vcard("nameEmailIndex")), s = u.genUuid(), p = d.sym(t.dir().uri + "Person/" + s + "/index.ttl#this"), m = p.doc(), h = [
|
|
20
|
+
c.st(p, l.vcard("inAddressBook"), t, o),
|
|
21
|
+
c.st(p, l.vcard("fn"), n, o),
|
|
22
|
+
c.st(p, l.vcard("fn"), n, m),
|
|
23
|
+
c.st(p, l.rdf("type"), a, m),
|
|
24
|
+
c.st(m, l.dct("created"), /* @__PURE__ */ new Date(), m)
|
|
25
|
+
], g = Array.isArray(i) ? i : Object.keys(i || {});
|
|
26
|
+
if (g.length > 0) for (let e of g) {
|
|
27
|
+
let t = d.sym(e), r = t.doc();
|
|
28
|
+
h.push(c.st(t, l.vcard("hasMember"), p, r), c.st(p, l.vcard("fn"), n, r));
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
r("Must be a member of at least one group. Please select or create a group.");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
await f.updateMany([], h);
|
|
36
|
+
} catch (t) {
|
|
37
|
+
throw e("Cannot add group membership for " + p + ". Stack:" + t), Error("Save new contact");
|
|
38
|
+
}
|
|
39
|
+
return p;
|
|
40
|
+
}
|
|
41
|
+
function h(e) {
|
|
42
|
+
return e.replace(/\W/gu, "_").replace(/_+/g, "_");
|
|
43
|
+
}
|
|
44
|
+
async function g(e, t) {
|
|
45
|
+
await d.fetcher.load(e.doc());
|
|
46
|
+
let n = d.any(e, l.vcard("groupIndex")), r = h(t), i = d.sym(e.dir().uri + "Group/" + r + ".ttl#this"), a = i.doc();
|
|
47
|
+
try {
|
|
48
|
+
await d.fetcher.load(n);
|
|
49
|
+
} catch (e) {
|
|
50
|
+
throw Error("Error loading group index!" + n.uri + ": " + e);
|
|
51
|
+
}
|
|
52
|
+
if (d.holds(e, l.vcard("includesGroup"), i, n)) return i;
|
|
53
|
+
let o = [
|
|
54
|
+
c.st(e, l.vcard("includesGroup"), i, n),
|
|
55
|
+
c.st(i, l.rdf("type"), l.vcard("Group"), n),
|
|
56
|
+
c.st(i, l.vcard("fn"), t, n)
|
|
57
|
+
];
|
|
58
|
+
try {
|
|
59
|
+
await f.update([], o);
|
|
60
|
+
} catch (e) {
|
|
61
|
+
throw Error("Could not update group index " + e);
|
|
62
|
+
}
|
|
63
|
+
let s = [
|
|
64
|
+
c.st(e, l.vcard("includesGroup"), i, a),
|
|
65
|
+
c.st(i, l.rdf("type"), l.vcard("Group"), a),
|
|
66
|
+
c.st(i, l.vcard("fn"), t, a)
|
|
67
|
+
];
|
|
68
|
+
try {
|
|
69
|
+
await f.update([], s);
|
|
70
|
+
} catch (e) {
|
|
71
|
+
throw Error("Could not update group file: " + e);
|
|
72
|
+
}
|
|
73
|
+
return i;
|
|
74
|
+
}
|
|
75
|
+
async function _(a, o) {
|
|
76
|
+
let s = [a.doc(), o.doc()];
|
|
77
|
+
try {
|
|
78
|
+
await d.fetcher.load(s);
|
|
79
|
+
} catch (t) {
|
|
80
|
+
throw e("Error adding " + a + " to group " + o + ". Stack: " + t), Error("Error adding to group.");
|
|
81
|
+
}
|
|
82
|
+
let u = d.findTypeURIs(a);
|
|
83
|
+
if (!(l.vcard("Individual").uri in u || l.vcard("Organization").uri in u)) {
|
|
84
|
+
t("Thing " + a + " is not an Individual or Organization, but has types: " + Object.keys(u)), r("You are trying to add something else than an individual or organization.");
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
let p = d.any(a, l.vcard("fn")), m = d.any(o, l.vcard("fn"));
|
|
88
|
+
if (!p) {
|
|
89
|
+
t("Thing " + a + " has no vcard:fn"), r("What you are trying to add seems to have no full name.");
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (d.holds(a, l.vcard("fn"), null, o.doc())) {
|
|
93
|
+
p === "" && (p = "Contact"), r(p + " already exists in group " + m + ".");
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (!await i("Add " + p + " to group " + m + "?")) return;
|
|
97
|
+
let h = [c.st(a, l.vcard("fn"), p, o.doc())], g = n(d, a).map((e) => e.value);
|
|
98
|
+
g.length ? g.forEach((e) => {
|
|
99
|
+
h.push(c.st(d.sym(e), l.owl("sameAs"), a, o.doc())), h.push(c.st(o, l.vcard("hasMember"), d.sym(e), o.doc()));
|
|
100
|
+
}) : h.push(c.st(o, l.vcard("hasMember"), a, o.doc()));
|
|
101
|
+
try {
|
|
102
|
+
await f.update([], h), d.fetcher.unload(o.doc()), await d.fetcher.load(o.doc());
|
|
103
|
+
} catch (t) {
|
|
104
|
+
throw e("Error adding " + a + " to group " + o + ". Stack: " + t), Error("Error adding to group.");
|
|
105
|
+
}
|
|
106
|
+
return a;
|
|
107
|
+
}
|
|
108
|
+
function v(e, t) {
|
|
109
|
+
let n = e.each(t, l.vcard("hasMember"), null, t.doc()), r = [];
|
|
110
|
+
return n.forEach((n) => {
|
|
111
|
+
r = e.any(n, l.vcard("fn"), null, t.doc()) ? r.concat(n) : r.concat(e.each(n, l.owl("sameAs"), null, t.doc()));
|
|
112
|
+
}), r = [...new Set(r.map((e) => e.uri))].map((t) => e.sym(t)), r;
|
|
113
|
+
}
|
|
114
|
+
function y(e, t) {
|
|
115
|
+
let n = e.dir().dir().dir();
|
|
116
|
+
return t.uri && t.uri.startsWith(n.uri);
|
|
117
|
+
}
|
|
118
|
+
async function b(e) {
|
|
119
|
+
let t = [], n = [];
|
|
120
|
+
return e.forEach((e) => {
|
|
121
|
+
d.each(e, l.vcard("hasMember"), null, e.doc()).forEach((r) => {
|
|
122
|
+
let i = a(d, r, e.doc());
|
|
123
|
+
if (i.length && y(e, r)) {
|
|
124
|
+
for (let a of i) if (!y(e, a)) {
|
|
125
|
+
t.push(c.st(e, l.vcard("hasMember"), r, e.doc())), n.push(c.st(e, l.vcard("hasMember"), a, e.doc()));
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}), {
|
|
131
|
+
del: t,
|
|
132
|
+
ins: n
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//#endregion
|
|
136
|
+
export { _ as addPersonToGroup, b as getDataModelIssues, v as groupMembers, y as isLocal, h as sanitizeToAlpha, m as saveNewContact, g as saveNewGroup, p as updateMany };
|
|
137
|
+
|
|
138
|
+
//# sourceMappingURL=contactLogic.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contactLogic.esm.js","names":[],"sources":["../src/contactLogic.js"],"sourcesContent":["import * as UI from 'solid-ui'\nimport * as $rdf from 'rdflib'\nimport { store } from 'solid-logic'\nimport { getPersonas } from './webidControl'\nimport * as debug from './debug'\nimport { getSameAs, confirmDialog, alertDialog } from './localUtils'\n\nconst ns = UI.ns\nconst utils = UI.utils\nconst kb = store\nconst updater = kb.updater\n\n/** Perform updates on more than one document @@ Move to rdflib!\n*/\nexport async function updateMany (deletions, insertions = []) {\n const docs = deletions.concat(insertions).map(st => st.why)\n const uniqueDocs = []\n docs.forEach(doc => {\n if (!uniqueDocs.find(uniqueDoc => uniqueDoc.equals(doc))) uniqueDocs.push(doc)\n })\n const updates = uniqueDocs.map(doc =>\n kb.updater.update(deletions.filter(st => st.why.sameTerm(doc)),\n insertions.filter(st => st.why.sameTerm(doc))))\n return Promise.all(updates)\n}\n\n/** Add a new person to the web data\n*\n* adds them to the given groups as well.\n* @returns {NamedNode} the person\n*/\nexport async function saveNewContact (book, name, selectedGroups, klass) {\n await kb.fetcher.load(book.doc())\n const nameEmailIndex = kb.any(book, ns.vcard('nameEmailIndex'))\n\n const uuid = utils.genUuid()\n const person = kb.sym(\n book.dir().uri + 'Person/' + uuid + '/index.ttl#this'\n )\n const doc = person.doc()\n\n // Set of statements to different files\n const agenda = [\n // Patch the main index to add the person\n $rdf.st(person, ns.vcard('inAddressBook'), book, nameEmailIndex), // The people index\n $rdf.st(person, ns.vcard('fn'), name, nameEmailIndex),\n // The new person file\n $rdf.st(person, ns.vcard('fn'), name, doc),\n $rdf.st(person, ns.rdf('type'), klass, doc),\n\n $rdf.st(doc, ns.dct('created'), new Date(), doc) // Note when created - useful for triaging later\n // Note this is propert of the file -- not when the person was created!\n ]\n\n // `selectedGroups` may be an array (older callers) or an object map\n // (contactsPane.js tracks it as `{ uri: true }`). Normalize and make sure\n // at least one group is selected before proceeding – otherwise we return\n // `undefined` and the caller must handle it.\n const groups = Array.isArray(selectedGroups)\n ? selectedGroups\n : Object.keys(selectedGroups || {})\n\n if (groups.length > 0) {\n for (const gu of groups) {\n const g = kb.sym(gu)\n const gd = g.doc()\n agenda.push(\n $rdf.st(g, ns.vcard('hasMember'), person, gd),\n $rdf.st(person, ns.vcard('fn'), name, gd)\n )\n }\n } else {\n alertDialog('Must be a member of at least one group. Please select or create a group.')\n return // caller should check for undefined result\n }\n\n try {\n await updater.updateMany([], agenda)\n } catch (e) {\n debug.error('Cannot add group membership for ' + person + '. Stack:' + e)\n throw new Error('Save new contact')\n }\n return person\n}\n\nexport function sanitizeToAlpha (name) { // https://mathiasbynens.be/notes/es6-unicode-regex\n const n2 = name.replace(/\\W/gu, '_') // Anything which is not a unicode word characeter\n return n2.replace(/_+/g, '_') // https://www.regular-expressions.info/shorthand.html\n}\n\n/** Write new group to web\n * Creates an empty new group file and adds it to the index\n * @returns group\n*/\nexport async function saveNewGroup (book, name) {\n await kb.fetcher.load(book.doc())\n const gix = kb.any(book, ns.vcard('groupIndex'))\n\n const gname = sanitizeToAlpha(name)\n const group = kb.sym(book.dir().uri + 'Group/' + gname + '.ttl#this')\n const doc = group.doc()\n // debug.log(' New group will be: ' + group + '\\n')\n try {\n await kb.fetcher.load(gix)\n } catch (err) {\n throw new Error('Error loading group index!' + gix.uri + ': ' + err)\n }\n if (kb.holds(book, ns.vcard('includesGroup'), group, gix)) {\n return group // Already exists\n }\n const insertTriples = [\n $rdf.st(book, ns.vcard('includesGroup'), group, gix),\n $rdf.st(group, ns.rdf('type'), ns.vcard('Group'), gix),\n $rdf.st(group, ns.vcard('fn'), name, gix)\n ]\n try {\n await updater.update([], insertTriples)\n } catch (e) {\n throw new Error('Could not update group index ' + e) // fail\n }\n\n const triples = [\n $rdf.st(book, ns.vcard('includesGroup'), group, doc), // Pointer back to book\n $rdf.st(group, ns.rdf('type'), ns.vcard('Group'), doc),\n $rdf.st(group, ns.vcard('fn'), name, doc)\n ]\n try {\n await updater.update([], triples)\n } catch (err) {\n throw new Error('Could not update group file: ' + err) // fail\n }\n return group\n}\n\nexport async function addPersonToGroup (thing, group) {\n const toBeFetched = [thing.doc(), group.doc()]\n try {\n await kb.fetcher.load(toBeFetched)\n } catch (e) {\n debug.error('Error adding ' + thing + ' to group ' + group + '. Stack: ' + e)\n throw new Error('Error adding to group.')\n }\n\n const types = kb.findTypeURIs(thing)\n\n if (!(ns.vcard('Individual').uri in types ||\n ns.vcard('Organization').uri in types)) {\n debug.warn('Thing ' + thing + ' is not an Individual or Organization, but has types: ' + Object.keys(types))\n alertDialog('You are trying to add something else than an individual or organization.')\n return\n }\n let pname = kb.any(thing, ns.vcard('fn'))\n const gname = kb.any(group, ns.vcard('fn'))\n if (!pname) {\n debug.warn('Thing ' + thing + ' has no vcard:fn')\n alertDialog('What you are trying to add seems to have no full name.')\n return\n }\n const already = kb.holds(thing, ns.vcard('fn'), null, group.doc())\n if (already) {\n if (pname === '') pname = 'Contact'\n alertDialog(pname + ' already exists in group ' + gname + '.')\n return\n }\n const message = 'Add ' + pname + ' to group ' + gname + '?'\n if (!await confirmDialog(message)) return\n const ins = [\n $rdf.st(thing, ns.vcard('fn'), pname, group.doc())\n ]\n // find person webIDs and insert in vcard:hasMember\n const webIDs = getPersonas(kb, thing).map(webid => webid.value)\n if (webIDs.length) {\n webIDs.forEach(webid => {\n ins.push($rdf.st(kb.sym(webid), ns.owl('sameAs'), thing, group.doc()))\n ins.push($rdf.st(group, ns.vcard('hasMember'), kb.sym(webid), group.doc()))\n })\n } else {\n ins.push($rdf.st(group, ns.vcard('hasMember'), thing, group.doc()))\n }\n try {\n await updater.update([], ins)\n // to allow refresh of card groupList\n kb.fetcher.unload(group.doc())\n await kb.fetcher.load(group.doc())\n } catch (e) {\n debug.error('Error adding ' + thing + ' to group ' + group + '. Stack: ' + e)\n throw new Error('Error adding to group.')\n }\n return thing\n}\n\n/**\n * Find persons member of a group\n */\n\nexport function groupMembers (kb, group) {\n const a = kb.each(group, ns.vcard('hasMember'), null, group.doc())\n let b = []\n a.forEach(item => {\n /* const contacts = kb.each(item, ns.owl('sameAs'), null, group.doc())\n if (contacts.length) {\n if (!kb.any(contacts[0], ns.vard('fn'))) b = b.concat(item) // this is the old data model\n else b = b.concat(contacts)\n } else { b = b.concat(item) }\n b = b.concat(item) */\n\n // to keep compatibility with old data model\n // check if item is a contact, else it is a WebID and parse 'sameAs' for contacts\n b = kb.any(item, ns.vcard('fn'), null, group.doc()) ? b.concat(item) : b.concat(kb.each(item, ns.owl('sameAs'), null, group.doc()))\n })\n const strings = new Set(b.map(contact => contact.uri)) // remove dups\n b = [...strings].map(uri => kb.sym(uri))\n return b\n}\n\nexport function isLocal (group, item) {\n const tree = group.dir().dir().dir()\n const local = item.uri && item.uri.startsWith(tree.uri)\n // debug.log(` isLocal ${local} for ${item.uri} in group ${group} tree ${tree.uri}`)\n return local\n}\n\nexport async function getDataModelIssues (groups) {\n const del = []\n const ins = []\n groups.forEach(group => {\n const members = kb.each(group, ns.vcard('hasMember'), null, group.doc())\n members.forEach((member) => {\n const others = getSameAs(kb, member, group.doc())\n if (others.length && isLocal(group, member)) { // Problem: local ID used instead of webID\n for (const other of others) {\n if (!isLocal(group, other)) { // Let's use this one as the immediate member for CSS ACLs'\n // console.warn(`getDataModelIssues: Need to swap ${member} to ${other}`)\n del.push($rdf.st(group, ns.vcard('hasMember'), member, group.doc()))\n ins.push($rdf.st(group, ns.vcard('hasMember'), other, group.doc()))\n break\n }\n // debug.log('getDataModelIssues: ??? expected id not to be local ' + other)\n } // other\n } // if\n }) // member\n }) // next group\n return { del, ins }\n} // getDataModelIssues\n\n// Ends\n"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
(function(){try{if(typeof document<`u`){var e=document.createElement(`style`);e.appendChild(document.createTextNode(`.individualPane .formFieldValue>div[style*="flex-direction: row"],.contactPane .formFieldValue>div[style*="flex-direction: row"]{align-items:center;display:flex}.individualPane .formFieldValue input[data-testid=autocomplete-input],.contactPane .formFieldValue input[data-testid=autocomplete-input]{vertical-align:middle}.individualPane .hoverControl,.contactPane .hoverControl{position:relative}.contactPane td.hoverControl:has(>a){justify-content:space-between!important;width:auto!important;min-width:4rem!important}.contactPane td.hoverControl:has(>a)>a{overflow-wrap:anywhere;word-break:break-word;white-space:normal;flex:auto;min-width:0}:is(.individualPane .hoverControl:has(>img:first-child),.contactPane .hoverControl:has(>img:first-child)){min-height:var(--min-touch-target);min-width:var(--min-touch-target);cursor:pointer;justify-content:center;align-items:center;display:inline-flex;padding:var(--spacing-btn)!important;background-color:#0000!important;border:none!important;border-radius:0!important;margin:0!important}:is(.individualPane .hoverControl:has(>img:first-child)>span,.contactPane .hoverControl:has(>img:first-child)>span){margin-left:var(--spacing-xxs);align-items:center;display:inline-flex}:is(.individualPane div[style*="padding: 0.5em"]:has(>img),.contactPane div[style*="padding: 0.5em"]:has(>img)){align-items:center;display:inline-flex}:is(.individualPane div[style*="padding: 0.5em"]:has(>img)>span,.contactPane div[style*="padding: 0.5em"]:has(>img)>span){margin-left:var(--spacing-xxs)}:is(.individualPane .hoverControl:has(>img:first-child):hover,.contactPane .hoverControl:has(>img:first-child):hover){background-color:var(--color-section-bg)!important}:is(.individualPane button:has(>img[src$=\\.svg]),.contactPane button:has(>img[src$=\\.svg])){transition:background-color .2s,box-shadow .2s;background-color:var(--color-section-bg)!important;box-shadow:none!important;border:none!important;border-radius:0!important;margin:0!important}.contactPane img[src$=red\\.svg],.contactPane img[src$=go-to-this\\.png],.individualPane img[src$=red\\.svg],.individualPane img[src$=go-to-this\\.png]{object-fit:contain;vertical-align:middle;display:inline-block;width:1.2rem!important;max-width:none!important;height:1.2rem!important;max-height:none!important}:is(.individualPane .statsLog button:has(>img[src$=\\.svg]),.contactPane .statsLog button:has(>img[src$=\\.svg])){background-color:var(--color-info-bg)!important;border:initial!important;margin:initial!important;border-radius:initial!important}:is(.individualPane button:has(>img[title=Continue]),.contactPane button:has(>img[title=Continue])){display:none!important}.contactPane .detailSection .detailsSectionContent img[title=Continue]{display:inline-flex!important}.contactPane .detailSection .detailsSectionContent button:has(>img[title=Continue]){display:inline-flex!important}.contactPane .detailSection .detailsSectionContent img[title=Continue]{width:var(--icon-base,2rem)!important;height:var(--icon-base,2rem)!important}:is(.individualPane .contactFormContainer button:has(>img[src$=noun_1180158\\.svg]),.contactPane .contactFormContainer button:has(>img[src$=noun_1180158\\.svg]),.individualPane .contactFormContainer button:has(>img[title=Continue]),.contactPane .contactFormContainer button:has(>img[title=Continue])),:is(.individualPane .statsLog button:has(>img[title=Continue]),.contactPane .statsLog button:has(>img[title=Continue]),.individualPane .webidControl button:has(>img[title=Continue]),.contactPane .webidControl button:has(>img[title=Continue])){display:inline-flex!important}.individualPane button,.contactPane button{min-height:var(--min-touch-target);min-width:var(--min-touch-target)}.individualPane input:not([type=color]),.contactPane input:not([type=color]){box-sizing:border-box;width:99%;min-width:0;max-width:99%;font:inherit;color:var(--color-text);border:var(--border-width-sm) solid var(--color-border-pale);background-color:var(--color-card-bg)!important;margin-left:0!important;margin-right:0!important}.individualPane textarea,.contactPane textarea,.individualPane .formFieldValue textarea,.contactPane .formFieldValue textarea{appearance:none;box-sizing:border-box;width:99%;max-width:99%;font:inherit;color:var(--color-text);margin-top:var(--spacing-xs);border-radius:var(--border-radius-sm)!important;border:var(--border-width-xthin) solid var(--color-border-accent)!important;background-color:var(--color-card-bg)!important;padding:var(--spacing-xs)!important;margin:0!important}.individualPane select,.contactPane select{box-sizing:border-box;min-width:0;max-width:99%;font:inherit;color:var(--color-text);border:var(--border-width-sm) solid var(--color-border-pale);background-color:var(--color-card-bg)!important}.individualPane input[type=date],.contactPane input[type=date],.individualPane input[type=month],.contactPane input[type=month],.individualPane input[type=week],.contactPane input[type=week],.individualPane input[type=time],.contactPane input[type=time],.individualPane input[type=datetime-local],.contactPane input[type=datetime-local]{min-height:var(--min-touch-target)}.individualPane button:focus-visible,.contactPane button:focus-visible,.individualPane input:not([type=color]):focus-visible,.contactPane input:not([type=color]):focus-visible,.individualPane textarea:focus-visible,.contactPane textarea:focus-visible,.individualPane select:focus-visible,.contactPane select:focus-visible{outline-offset:2px;box-shadow:0 0 0 1px var(--color-background);outline:var(--focus-ring-width) solid var(--color-primary)!important}.individualPane .hoverControl:has(>img:first-child):focus-visible{outline-offset:2px;box-shadow:0 0 0 1px var(--color-background);outline:var(--focus-ring-width) solid var(--color-primary)!important}.contactPane .hoverControl:has(>img:first-child):focus-visible{outline-offset:2px;box-shadow:0 0 0 1px var(--color-background);outline:var(--focus-ring-width) solid var(--color-primary)!important}.individualPane input[type=url],.contactPane input[type=url]{width:99%}.individualPane .formFieldValue,.contactPane .formFieldValue{min-width:0;margin-bottom:var(--spacing-sm)}.individualPane .formFieldValue table,.contactPane .formFieldValue table{margin:0!important;padding:0!important}.individualPane .formFieldValue td,.contactPane .formFieldValue td{vertical-align:middle;padding:0!important}.individualPane .formFieldValue table[data-testid=autocomplete-table],.contactPane .formFieldValue table[data-testid=autocomplete-table]{height:100%}.individualPane .formFieldValue input:not([type=color]),.contactPane .formFieldValue input:not([type=color]),.individualPane .formFieldValue textarea,.contactPane .formFieldValue textarea{max-width:99%;width:99%!important}:is(.individualPane .formFieldName:has(a[href="http://www.w3.org/2006/vcard/ns#value"])+.formFieldValue input:not([type=color]),.contactPane .formFieldName:has(a[href="http://www.w3.org/2006/vcard/ns#value"])+.formFieldValue input:not([type=color])){max-width:98%;width:98%!important}.individualPane .formFieldValue select,.contactPane .formFieldValue select{width:99%;display:inline-block;max-width:none!important}.individualPane select#formSelect,.contactPane select#formSelect{box-sizing:border-box;width:99%;max-width:98%;margin-left:0!important;margin-right:0!important}.individualPane span select,.contactPane span select{box-sizing:border-box;max-width:96%!important;margin:0!important}.individualPane .formFieldValue span select,.contactPane .formFieldValue span select{margin-left:0!important;margin-right:0!important}.individualPane>div:first-of-type,.contactPane>div:first-of-type,.individualPane>div:first-of-type>div:first-of-type,.contactPane>div:first-of-type>div:first-of-type,.individualPane>div,.contactPane>div{border:none!important;padding:0!important}:is(.individualPane :not(.choiceBox):has(>.formFieldName):has(>.formFieldValue),.contactPane :not(.choiceBox):has(>.formFieldName):has(>.formFieldValue)){margin-bottom:var(--spacing-sm);align-items:baseline;display:flex}.individualPane .choiceBox .classifierBox-label,.contactPane .choiceBox .classifierBox-label{padding-left:var(--spacing-xxs);margin-right:0}.individualPane .choiceBox .choiceBox-selectBox select,.contactPane .choiceBox .choiceBox-selectBox select{margin-left:2.1rem!important}.individualPane .classifierBox .classifierBox-label,.contactPane .classifierBox .classifierBox-label{padding-left:var(--spacing-xxs);width:8rem;padding:var(--spacing-xxs);vertical-align:middle;margin-right:0}.individualPane .classifierBox .classifierBox-selectBox,.contactPane .classifierBox .classifierBox-selectBox,.individualPane .classifierBox .classifierBox-selectBox select,.contactPane .classifierBox .classifierBox-selectBox select,.individualPane .formFieldValue>span>select,.contactPane .formFieldValue>span>select{margin-left:0!important}:is(.individualPane :not(.choiceBox):has(>.formFieldName):has(>.formFieldValue)>.formFieldValue,.contactPane :not(.choiceBox):has(>.formFieldName):has(>.formFieldValue)>.formFieldValue){margin-bottom:0}:is(.individualPane :not(.choiceBox)>.formFieldName:has(a[href*="http://schema.org/"]),.contactPane :not(.choiceBox)>.formFieldName:has(a[href*="http://schema.org/"]),.individualPane :not(.choiceBox)>.formFieldName:has(a[href*="http://www.w3.org/ns/solid/terms#"]),.contactPane :not(.choiceBox)>.formFieldName:has(a[href*="http://www.w3.org/ns/solid/terms#"]),.individualPane :not(.choiceBox)>.formFieldName:has(a[href*="http://xmlns.com/foaf/0.1/"]),.contactPane :not(.choiceBox)>.formFieldName:has(a[href*="http://xmlns.com/foaf/0.1/"]),.individualPane :not(.choiceBox)>.formFieldName:has(a[href*="http://www.w3.org/2006/vcard/ns"]),.contactPane :not(.choiceBox)>.formFieldName:has(a[href*="http://www.w3.org/2006/vcard/ns"]),.individualPane :not(.choiceBox)>.formFieldName:has(a[href*="http://www.w3.org/ns/org#"]),.contactPane :not(.choiceBox)>.formFieldName:has(a[href*="http://www.w3.org/ns/org#"])){vertical-align:middle;align-items:center;display:inline-flex}:is(.individualPane :not(.choiceBox)>.formFieldName:has(a[href*="http://schema.org/"])+.formFieldValue,.contactPane :not(.choiceBox)>.formFieldName:has(a[href*="http://schema.org/"])+.formFieldValue,.individualPane :not(.choiceBox)>.formFieldName:has(a[href*="http://www.w3.org/ns/solid/terms#"])+.formFieldValue,.contactPane :not(.choiceBox)>.formFieldName:has(a[href*="http://www.w3.org/ns/solid/terms#"])+.formFieldValue,.individualPane :not(.choiceBox)>.formFieldName:has(a[href*="http://xmlns.com/foaf/0.1/"])+.formFieldValue,.contactPane :not(.choiceBox)>.formFieldName:has(a[href*="http://xmlns.com/foaf/0.1/"])+.formFieldValue,.individualPane :not(.choiceBox)>.formFieldName:has(a[href*="http://www.w3.org/2006/vcard/ns"])+.formFieldValue,.contactPane :not(.choiceBox)>.formFieldName:has(a[href*="http://www.w3.org/2006/vcard/ns"])+.formFieldValue,.individualPane :not(.choiceBox)>.formFieldName:has(a[href*="http://www.w3.org/ns/org#"])+.formFieldValue,.contactPane :not(.choiceBox)>.formFieldName:has(a[href*="http://www.w3.org/ns/org#"])+.formFieldValue){vertical-align:middle;flex:1;align-items:center;min-width:0;display:inline-flex}:is(.individualPane div[style*="display: flex"][style*="flex-direction: row"]:has(textarea),.contactPane div[style*="display: flex"][style*="flex-direction: row"]:has(textarea)){align-items:flex-start}:is(.individualPane div[style*="display: flex"][style*="flex-direction: row"]:has(textarea)>div:has(>a),.contactPane div[style*="display: flex"][style*="flex-direction: row"]:has(textarea)>div:has(>a)){padding-left:var(--spacing-xs);padding-top:var(--spacing-sm)}:is(.individualPane :not(.choiceBox):has(>.formFieldValue input[data-testid=autocomplete-input]),.contactPane :not(.choiceBox):has(>.formFieldValue input[data-testid=autocomplete-input])){align-items:flex-start}:is(.individualPane :not(.choiceBox):has(>.formFieldValue input[data-testid=autocomplete-input])>.formFieldName,.contactPane :not(.choiceBox):has(>.formFieldValue input[data-testid=autocomplete-input])>.formFieldName){padding-top:var(--spacing-xs)!important}:is(.individualPane .formFieldValue:has(input[data-testid=autocomplete-input]),.contactPane .formFieldValue:has(input[data-testid=autocomplete-input])){align-self:flex-start}.individualPane .formFieldValue table[data-testid=autocomplete-table],.contactPane .formFieldValue table[data-testid=autocomplete-table],.individualPane .formFieldValue input[data-testid=autocomplete-input],.contactPane .formFieldValue input[data-testid=autocomplete-input]{margin:0!important}.individualPane .formFieldValue table[data-testid=autocomplete-table],.contactPane .formFieldValue table[data-testid=autocomplete-table]{vertical-align:baseline}.individualPane input:disabled,.contactPane input:disabled,.individualPane textarea:disabled,.contactPane textarea:disabled,.individualPane select:disabled,.contactPane select:disabled,.individualPane input[readonly],.contactPane input[readonly],.individualPane textarea[readonly],.contactPane textarea[readonly],.individualPane input:read-only,.contactPane input:read-only,.individualPane textarea:read-only,.contactPane textarea:read-only{cursor:not-allowed;opacity:var(--opacity-input-disabled);background-color:var(--color-background)!important;border:var(--border-width-xthin) solid var(--color-background)!important}.contactPane .webidControl table td div.contactPane.namedPane{border:none!important}.individualPane div[style*="position: relative"]:has(>div[style*="display: grid"]){position:static!important}.individualPane div[style*="position: relative"]>div[style*="display: grid"]{z-index:9999!important;pointer-events:auto!important;opacity:1!important;visibility:visible!important;padding:var(--spacing-btn)!important;background:var(--color-background)!important;border:var(--border-width-sm) solid var(--color-primary)!important;border-radius:var(--border-radius-base)!important;box-shadow:var(--box-shadow-popup)!important;gap:var(--spacing-xxs)!important;grid-template-columns:auto auto!important;display:grid!important;position:absolute!important;top:0!important;left:auto!important;right:0!important}.individualPane .hoverControl img.hoverControlHide,.individualPane .hoverControl [data-testid=deleteButtonWithCheck]{justify-content:center;align-items:center;right:var(--spacing-xxxs)!important;width:var(--icon-xs,1.5rem)!important;height:var(--icon-xs,1.5rem)!important;float:none!important;z-index:2!important;margin:0!important;display:none!important;position:absolute!important}.individualPane .hoverControl:hover img.hoverControlHide,.individualPane .hoverControl:hover [data-testid=deleteButtonWithCheck]{display:inline-flex!important}.individualPane .hoverControl:has(>div:first-child:nth-last-child(2)):hover>img.hoverControlHide{top:50%!important;right:var(--spacing-xxxs)!important;left:auto!important;transform:translateY(-50%)!important}.individualPane .hoverControl:has(>div:first-child:nth-last-child(2)):hover>[data-testid=deleteButtonWithCheck]{top:50%!important;right:var(--spacing-xxxs)!important;left:auto!important;transform:translateY(-50%)!important}
|
|
2
|
+
|
|
3
|
+
.contactPane table tr[tabindex="0"]:focus{outline:var(--focus-ring-width) solid var(--color-primary);outline-offset:2px;background:var(--color-info-bg)}.contactPane .peopleSection .selected{background-color:var(--color-info-bg)!important}.contactPane .detailSection,.contactPane .addressBookSection{box-sizing:border-box;background:var(--color-section-bg);flex-direction:column;flex:1 1 0;align-items:stretch;min-width:0;display:flex}.contactPane .detailsSectionContent{min-height:12.5rem;padding:var(--spacing-lg);box-sizing:border-box;flex:auto;width:100%;max-width:56.25rem}.contactPane .detailsSectionContent--wide{max-width:56.25rem}.contactPane .cardFooter{align-items:center;gap:var(--spacing-xs);padding-top:var(--spacing-md);margin-top:var(--spacing-md);flex-wrap:nowrap;display:flex}.contactPane .detailsSectionContent{margin:0}.contactPane .contactTypeChooser{gap:var(--spacing-sm);flex-direction:column;max-width:22.5rem;display:flex}.contactPane .contactTypeChooser h3{margin:0 0 var(--spacing-xs) 0;font-size:var(--font-size-lg)}.contactPane .contactTypeSelect{height:var(--min-touch-target);border:var(--border-width-sm,1px) solid var(--color-border-pale);border-radius:var(--border-radius-base);padding:0 var(--spacing-sm);font-size:var(--font-size-sm);background:var(--color-section-bg)}.contactPane .allGroupsButton{border-radius:var(--border-radius-full)!important}.contactPane .searchDiv{position:relative}.contactPane .searchInput{height:var(--min-touch-target);border:var(--border-width-sm,1px) solid var(--color-border-pale);background-color:var(--color-section-bg);border-radius:var(--border-radius-base);padding:0 var(--spacing-sm) 0 2.125rem;font-size:var(--font-size-base);box-sizing:border-box;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23999' viewBox='0 0 24 24' width='20' height='20'%3E%3Cpath d='M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99c.41.41 1.09.41 1.5 0s.41-1.09 0-1.5l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z'/%3E%3C/svg%3E");background-position:.5rem;background-repeat:no-repeat;background-size:1.25rem 1.25rem;width:100%}.contactPane .searchClearButton{right:var(--spacing-sm);font-size:var(--font-size-base);cursor:pointer;color:var(--color-text-muted);background:0 0;border:none;padding:0;line-height:1;display:block;position:absolute;top:50%;transform:translateY(-50%)}.contactPane .searchClearButton.hidden{display:none}.contactPane .searchClearButton:hover{color:var(--color-text)}.contactPane .contact-toolbar{align-items:center;gap:var(--spacing-sm);padding:var(--spacing-xs) 0;display:flex}.contactPane .contact-toolbar a{margin:.3rem}.contactPane .contact-toolbar a img{width:1.3rem;height:1rem;margin:0}.contact-toolbar .deleteButton{margin-left:auto;margin-right:var(--spacing-xxxs,.2rem);width:var(--icon-xxs,1rem);height:var(--icon-xxs,1rem);float:none}.contactPane .allGroupsButton{margin-left:var(--spacing-md);font-size:var(--font-size-base)}.contactPane .allGroupsButton--loading{background-color:var(--color-primary)}.contactPane .allGroupsButton--active{background-color:var(--color-primary);color:var(--color-background)}.contactPane .allGroupsButton--loaded{background-color:var(--color-primary)}.contactPane .claimSuccess{font-size:var(--font-size-xl)}.contactPane{flex-direction:column;min-height:0;display:flex}.contactPane .addressBook-grid{box-sizing:border-box;flex-wrap:nowrap;flex:1;align-items:stretch;width:100%;min-width:0;display:flex;overflow-x:hidden}@media (width>=500px) and (width<=900px){.contactPane .addressBookSection{max-width:900px}.contactPane .addressBookSection section{max-width:485px}}.contactPane.contactPane--narrow .addressBook-grid{flex-flow:column!important;min-width:0!important;overflow-x:hidden!important}.contactPane.contactPane--narrow .addressBookSection,.contactPane.contactPane--narrow .detailSection{flex:100%!important;width:100%!important;min-width:0!important;max-width:100%!important}@media (width<=1000px){.contactPane{min-height:auto!important}.contactPane .addressBook-grid{flex-flow:column!important;height:auto!important;min-height:auto!important}.contactPane .addressBookSection,.contactPane .detailSection{order:initial!important;flex:none!important;width:100%!important;min-width:0!important;max-width:100%!important}.contactPane .addressBookSection{min-height:auto!important;max-height:none!important;padding-bottom:var(--spacing-lg)!important;flex-direction:column!important;height:auto!important;display:flex!important;overflow-y:visible!important}.contactPane .peopleSection ul{max-height:50vh;overflow-y:auto}.contactPane .detailSection{min-height:auto!important;max-height:none!important;overflow-y:visible!important}.contactPane .detailsSectionContent{flex-direction:column!important;justify-content:flex-start!important;align-items:stretch!important;height:auto!important;min-height:auto!important;display:flex!important;overflow-y:visible!important}.contactPane .detailSection>.detailsSectionContent{padding-top:var(--spacing-sm)!important;box-sizing:border-box!important}.contactPane .actionButton,.contactPane .searchInput,.contactPane .flatButton,.contactPane .buttonSection button,.contactPane .groupButtonsList button{min-height:calc(var(--min-touch-target) + .5em)!important;padding:.875em 1em!important;font-size:1.5rem!important}.contactPane .group-membership-item .group-membership-toolbar>img.hoverControlHide,.contactPane .group-membership-item .group-membership-toolbar>[data-testid=deleteButtonWithCheck],.individualPane .hoverControl img.hoverControlHide,.individualPane .hoverControl [data-testid=deleteButtonWithCheck]{visibility:visible!important;opacity:1!important;display:inline-flex!important}}.contactPane .addressBookSection.section-bg{background:var(--color-section-bg);padding:var(--spacing-md);box-sizing:border-box;border:none!important;border-radius:0!important}.contactPane .detailSection,.contactPane .detailsSectionContent{flex-direction:column;justify-content:flex-start;align-items:stretch;display:flex}.contactPane .buttonSection{padding:var(--spacing-sm);-webkit-overflow-scrolling:touch;scrollbar-width:thin;flex-wrap:nowrap;align-items:center;margin-bottom:0;padding-bottom:0;display:flex;overflow:auto hidden}@media (width<=1000px){.contactPane .buttonSection{z-index:2;background:var(--color-section-bg);position:sticky;top:0;box-shadow:0 2px 4px -2px #0000000a}}.contactPane .buttonSection::-webkit-scrollbar{height:6px}.contactPane .buttonSection::-webkit-scrollbar-thumb{background:var(--color-border-pale);border-radius:var(--border-radius-base)}.contactPane .buttonSection::-webkit-scrollbar-track{background:0 0}.contactPane .buttonSection .selected{background:0 0!important}.contactPane .groupButtonsList{align-items:center;gap:var(--spacing-xs);flex-wrap:nowrap;list-style:none;display:flex}.contactPane .buttonSection .groupButtonsList{margin-left:var(--spacing-xs);margin-right:var(--spacing-xs);padding-left:0}.contactPane .groupButtonsList li{flex-shrink:0}.contactPane .groupButtonsList button{white-space:nowrap;flex-shrink:0;min-width:max-content;margin-left:0}.contactPane .detailsSectionContent .groupButtonsList{gap:var(--spacing-sm);box-sizing:border-box;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));width:100%;padding:0;list-style:none;display:grid}.contactPane .detailsSectionContent .groupButtonsList li{aspect-ratio:auto;align-items:stretch;gap:var(--spacing-xs);flex-direction:column;width:100%;display:flex}.contactPane .detailsSectionContent .groupButtonsList button{text-align:center;border-radius:var(--border-radius-base);word-wrap:break-word;overflow-wrap:break-word;width:100%;height:auto}.contactPane .detailsSectionContent .groupButtonsList li>img.hoverControlHide,.contactPane .detailsSectionContent .groupButtonsList li>img[data-testid=deleteButtonWithCheck]{align-self:flex-end;display:block;float:none!important;margin:0!important}@media (width<=599px){.contactPane .detailsSectionContent .groupButtonsList{gap:var(--spacing-xs);grid-template-columns:repeat(2,1fr)}.contactPane .detailsSectionContent .groupButtonsList button{font-size:var(--font-size-sm);border-radius:var(--border-radius-base)}}@media (width>=900px){.contactPane .detailsSectionContent .groupButtonsList{grid-template-columns:repeat(3,1fr)}}.contactPane .detailsSectionContent .newGroupBtn{box-sizing:border-box;width:100%;margin-top:var(--spacing-sm)}.contactPane .detailsSectionContent h3{font-size:var(--font-size-xl);margin-bottom:var(--spacing-sm);padding-left:0}.contactPane .detailSection{position:relative}.contactPane .webidControl div[style*="position: relative"]:has(>div[style*="display: grid"]){position:static!important}.contactPane .webidControl .personaRow--webid td>div[style*="position: relative"]>div,.contactPane .detailsSectionContent .groupButtonsList li>div[style*="position: relative"]>div,.contactPane .detailsSectionContent .contact-toolbar>div[style*="position: relative"]>div{z-index:9999!important;pointer-events:auto!important;opacity:1!important;visibility:visible!important;padding:var(--spacing-btn)!important;background:var(--color-background)!important;border:var(--border-width-sm) solid var(--color-primary)!important;border-radius:var(--border-radius-base)!important;min-width:12em!important;box-shadow:var(--box-shadow-popup)!important;gap:var(--spacing-xxs)!important;grid-template-columns:auto auto!important;display:grid!important;position:absolute!important;left:auto!important}.contactPane .detailsSectionContent .contact-toolbar>div[style*="position: relative"]>div>button:has(>img[src$=\\.svg]){background-color:#0000!important}.contactPane .detailsSectionContent .group-membership-item .group-membership-toolbar>div[style*="position: relative"]>div>button:has(>img[src$=\\.svg]){background-color:#0000!important}.contactPane .webidControl .personaRow--webid td>div[style*="position: relative"]>div>button:has(>img[src$=\\.svg]){background-color:#0000!important}.contactPane .allGroupsButton--selected{background-color:var(--color-primary);color:var(--color-background)}.contactPane .headerSection{background:var(--color-background);padding:var(--spacing-sm);border-top-left-radius:var(--border-radius-full);border-top-right-radius:var(--border-radius-full);margin-bottom:0}.contactPane .headerSection header{justify-content:space-between;align-items:center;margin-bottom:0;display:flex}.contactPane .headerSection h2{margin-bottom:0}.contactPane .dottedHr{border:none;border-top:var(--border-width-sm,.1rem) dotted var(--color-text-muted);margin:0}.contactPane .searchSection{padding:var(--spacing-sm);margin-bottom:0;padding-bottom:0}.contactPane .peopleSection{background:var(--color-background);border-top:1px dotted var(--color-text-muted);margin-bottom:0;display:flex}.contactPane .peopleSection ul{width:100%;max-height:70vh;margin:0;padding:0;list-style:none;overflow-y:auto}.contactPane .peopleSection li{border-top:var(--border-width-sm,.1rem) solid var(--color-border-pale);padding:var(--spacing-xs)}.contactPane .personLi-row{justify-content:space-between;align-items:center;display:flex}.contactPane .personLi-avatar{flex-shrink:0;justify-content:center;align-items:center;width:2.813rem;height:2.813rem;display:flex}.contactPane .personLi-avatar .avatar-placeholder{justify-content:center;align-items:center;width:2.25rem;height:2.25rem;display:flex}.contactPane .personLi-avatar img{object-fit:cover;border-radius:50%;width:2.5rem;height:2.5rem}.contactPane .personLi-info{margin-left:var(--spacing-sm);flex:1;overflow:hidden}.contactPane .personLi-name{font-weight:700;font-size:var(--font-size-base);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.contactPane .personLi-arrow{align-items:center;margin-left:auto;display:flex}.contactPane .personLi--error{opacity:.5}`)),document.head.appendChild(e)}}catch(e){console.error(`vite-plugin-css-injected-by-js`,e)}})();const e=require("./_virtual/_rolldown/runtime.cjs.js"),t=require("./debug.cjs.js");;const n=r=require("./contactLogic.cjs.js"),i=require("./mintNewAddressBook.cjs.js"),a=require("./addressBookPresenter.cjs.js");;const o=s=;;let c=require("solid-logic"),l=require("solid-ui");l=e.__toESM(l);var u=l.ns,d=l.utils,f={icon:l.icons.iconBase+`noun_99101.svg`,name:`contact`,global:!1,label:function(e,t){let n=t.session.store.findTypeURIs(e);return n[u.vcard(`Organization`).uri]?`Contact`:n[u.vcard(`AddressBook`).uri]?`Address book`:null},mintClass:l.ns.vcard(`AddressBook`),mintNew:i.mintNewAddressBook,render:function(e,r,i={}){let s=r.dom,f=r.session.store,p=s.createElement(`div`);return n.setDom(s),l.aclControl.preventBrowserDropEvents(s),p.setAttribute(`class`,`contactPane`),n.setupResponsiveStacking(p,1e3),m().then(()=>t.log(`Contacts pane rendered for `+e),e=>n.complain(p,s,e.message||``+e)).catch(e=>{n.complain(p,s,e.message||``+e)}),p;async function m(){l.aclControl.preventBrowserDropEvents(s);let n=f.findTypeURIs(e);if(n[u.vcard(`Individual`).uri]||n[u.foaf(`Person`).uri]||n[u.schema(`Person`).uri]||n[u.vcard(`Organization`).uri]||n[u.schema(`Organization`).uri])try{await o.renderIndividual(s,p,e,r)}catch(e){throw t.error(`Error rendering contact. Stack: `+e),Error(`Failed to render contact: `+(e.message||e))}else if(n[u.vcard(`AddressBook`).uri])b([e],{});else throw t.error(`No evidence that `+e+` is anything to do with contacts.`),Error(`This does not seem to be a contact or address book.`);let m=c.authn.currentUser();function b(e,n){f.fetcher.load(e).then(function(t){x(e,n)}).catch(function(e){throw t.error(`Error loading address book. Stack: `+e),Error(`Failed to load address book.`)})}function x(e,n){let o=d.label(u.vcard(`AddressBook`)),c=n.foreignGroup,l=``;e&&e.length>0?(c=e[0],l=d.label(c.dir())):(f.any(c,u.dc(`title`))||f.any(c,u.vcard(`fn`)),i.solo&&l&&typeof document<`u`&&(document.title=l.value),l=l?l.value:o);let b=f.any(c,u.vcard(`groupIndex`)),x={},S={},C=null,w=null,T=[];function E(e){T.forEach(e=>{e.classList.remove(`btn-primary`),e.classList.add(`btn-secondary`)}),e&&(e.classList.remove(`btn-secondary`),e.classList.add(`btn-primary`))}let D={dom:s,kb:f,ns:u,book:c,options:n,title:l,groupIndex:b,selectedGroups:x,get selectedPeople(){return S},set selectedPeople(e){S=e},get allGroupsLi(){return C},set allGroupsLi(e){C=e},get newGroupLi(){return w},set newGroupLi(e){w=e},actionButtons:T,setActiveActionButton:E,dataBrowserContext:r,div:p,me:m,setMe(e){m=e},paneOptions:i},{main:O,addressBookSection:k,detailsSection:A}=h(D);p.appendChild(O);function j(){A.classList.remove(`hidden`)}D.showDetailsSection=j,D.detailsSection=A;let M=s.createElement(`ul`);M.setAttribute(`role`,`list`),M.setAttribute(`aria-label`,`People list`),D.ulPeople=M,D.dataBrowserContext&&(D.dataBrowserContext.ulPeople=M);let N=s.createElement(`div`);N.classList.add(`detailsSectionContent`),N.setAttribute(`role`,`region`),N.setAttribute(`aria-labelledby`,`detailsSectionContent`),N.setAttribute(`aria-live`,`polite`),D.detailsSectionContent=N;let P=g(D);k.appendChild(P);let F=s.createElement(`hr`);F.classList.add(`dottedHr`),k.appendChild(F);let{searchSection:I,searchInput:L}=_(D);D.searchInput=L,k.appendChild(I);let{buttonSection:R,ulGroups:z}=v(D);D.ulGroups=z,k.appendChild(R);let B=s.createElement(`section`);B.classList.add(`peopleSection`),k.appendChild(B),B.appendChild(M),A.appendChild(N);let V=y(D);k.appendChild(V),a.checkDataModel(c,N).then(()=>{t.log(`Async checkDataModel done.`)})}if(typeof document<`u`&&document.location&&(``+document.location).slice(0,16)===`http://localhost`){let t=f.any(e,l.ns.acl(`owner`));t&&(m=t)}return p}}};async function p(e){let{dom:n,kb:i,ns:o,book:s,options:c,selectedGroups:u,dataBrowserContext:d}=e;e.showDetailsSection(),e.detailsSectionContent.innerHTML=``;let f=i.any(s,o.vcard(`groupIndex`));try{await i.fetcher.load(f)}catch(e){t.log(`Error: Group index NOT loaded:`+e+`
|
|
4
|
+
`)}t.log(` Group index has been loaded
|
|
5
|
+
`);let p=await l.widgets.askName(n,i,e.detailsSectionContent,l.ns.foaf(`name`),o.vcard(`Group`),`group`);if(!p)return;let m;try{m=await r.saveNewGroup(s,p)}catch(n){t.log(`Error: can't save new group:`+n),e.detailsSectionContent.innerHTML=`Failed to save group`+n;return}for(let e in u)delete u[e];u[m.uri]=!0;let h=e.allGroupsLi,g=e.newGroupLi;h.parentNode&&h.parentNode.removeChild(h),g.parentNode&&g.parentNode.removeChild(g),a.syncGroupUl(s,c,e.ulGroups,n,u,e.ulPeople,e.searchInput),e.ulGroups.insertBefore(h,e.ulGroups.firstChild),e.ulGroups.appendChild(g),a.refreshThingsSelected(e.ulGroups,u);let _=Array.from(e.ulGroups.children).find(e=>e.subject&&e.subject.uri===m.uri);a.setActiveGroupButton(e.ulGroups,_?_.querySelector(`button`):null),a.refreshNames(e.ulPeople,null,!1),e.detailsSectionContent.innerHTML=``,e.detailsSectionContent.appendChild(l.aclControl.ACLControlBox5(m.doc(),d,`group`,i,function(t,n){t||(e.detailsSectionContent.innerHTML=`Group sharing setup failed: `+n)}))}function m(e,t,i){let{dom:o,kb:s,book:c,selectedGroups:u,dataBrowserContext:d}=e;t.innerHTML=``,l.widgets.askName(o,s,t,l.ns.foaf(`name`),i).then(async t=>{if(!t)return;e.detailsSectionContent.innerHTML=`Indexing...`;let o;try{o=await r.saveNewContact(c,t,u,i)}catch{n.alertDialog(`Error saving contact. If it persists, contact your admin.`);return}if(!o){e.detailsSectionContent.innerHTML=``;return}e.selectedPeople={},e.selectedPeople[o.uri]=!0,a.refreshNames(e.ulPeople,null),e.detailsSectionContent.innerHTML=``,e.detailsSectionContent.classList.add(`detailsSectionContent--wide`);let s=d.session.paneRegistry.byName(`contact`).render(o,d);s.classList.add(`renderPane`),e.detailsSectionContent.appendChild(s)})}function h(e){let{dom:t}=e,n=t.createElement(`main`);n.id=`main-content`,n.classList.add(`addressBook-grid`),n.setAttribute(`role`,`main`),n.setAttribute(`aria-label`,`Address Book`),n.setAttribute(`tabindex`,`-1`);let r=t.createElement(`section`);r.setAttribute(`aria-labelledby`,`addressBook-section`),r.classList.add(`addressBookSection`,`section-bg`),r.setAttribute(`role`,`region`),r.setAttribute(`tabindex`,`-1`),n.appendChild(r);let i=t.createElement(`section`);return i.classList.add(`detailSection`),i.setAttribute(`role`,`region`),i.setAttribute(`aria-label`,`Details section`),i.classList.add(`hidden`),n.appendChild(i),{main:n,addressBookSection:r,detailsSection:i}}function g(e){let{dom:t,ns:n,title:r,me:i,setMe:o,setActiveActionButton:s}=e,l=t.createElement(`section`);l.classList.add(`headerSection`);let u=t.createElement(`header`);u.classList.add(`mb-md`);let d=t.createElement(`h2`);d.id=`addressBook-heading`,d.setAttribute(`tabindex`,`-1`),d.textContent=r;let f=t.createElement(`button`),p=t.createElement(`div`);f.setAttribute(`type`,`button`),i||f.setAttribute(`disabled`,`true`),c.authn.checkUser().then(e=>{e&&(o(e),f.removeAttribute(`disabled`))}),p.appendChild(f),f.innerHTML=`+ New contact`,f.classList.add(`actionButton`,`btn-primary`,`action-button-focus`);let h=0;return f.addEventListener(`click`,async function(r){s(null),a.deselectAllPeople(e.ulPeople);let i=++h;if(e.showDetailsSection(),e.detailsSectionContent.innerHTML=``,e.detailsSectionContent.classList.remove(`detailsSectionContent--wide`),await a.ensureBookLoaded(),i!==h)return;e.detailsSectionContent.innerHTML=``;let o=t.createElement(`div`);o.classList.add(`contactTypeChooser`);let c=t.createElement(`label`);c.textContent=`Contact type: `,c.setAttribute(`for`,`contactTypeSelect`),o.appendChild(c);let l=t.createElement(`select`);l.id=`contactTypeSelect`,l.classList.add(`contactTypeSelect`);let u=t.createElement(`option`);u.value=`Individual`,u.textContent=`New person`,l.appendChild(u);let d=t.createElement(`option`);d.value=`Organization`,d.textContent=`New organization`,l.appendChild(d),o.appendChild(l),e.detailsSectionContent.appendChild(o);let f=t.createElement(`p`);f.classList.add(`contactCreationRemark`),f.textContent=`The new contact is added to the already selected group.`,e.detailsSectionContent.appendChild(f);let p=t.createElement(`div`);p.classList.add(`contactFormContainer`),e.detailsSectionContent.appendChild(p);function g(){return l.value===`Organization`?n.vcard(`Organization`):n.vcard(`Individual`)}m(e,p,g()),l.addEventListener(`change`,function(){m(e,p,g())})},!1),u.appendChild(d),u.appendChild(p),l.appendChild(u),l}function _(e){let{dom:t}=e,n=t.createElement(`section`);n.classList.add(`searchSection`);let r=t.createElement(`div`);r.classList.add(`searchDiv`),n.appendChild(r);let i=t.createElement(`input`);i.setAttribute(`type`,`text`),i.setAttribute(`aria-label`,`Search contacts`),i.classList.add(`searchInput`),i.setAttribute(`placeholder`,`Search by name in selected group`),r.appendChild(i);let o=t.createElement(`button`);return o.setAttribute(`type`,`button`),o.setAttribute(`aria-label`,`Clear search`),o.classList.add(`searchClearButton`,`hidden`),o.textContent=`✕`,r.appendChild(o),i.addEventListener(`input`,function(t){let n=i.value.length>0;o.classList.toggle(`hidden`,!n),a.refreshFilteredPeople(e.ulPeople,!0,e.detailsSectionContent)}),o.addEventListener(`click`,function(){i.value=``,o.classList.add(`hidden`),i.focus(),a.refreshFilteredPeople(e.ulPeople,!0,e.detailsSectionContent)}),{searchSection:n,searchInput:i}}function v(e){let{dom:r,kb:i,book:o,options:s,groupIndex:c,selectedGroups:l,actionButtons:u,setActiveActionButton:d}=e,f=r.createElement(`section`);f.classList.add(`buttonSection`);let m=r.createElement(`ul`);if(m.classList.add(`groupButtonsList`),m.setAttribute(`role`,`list`),m.setAttribute(`aria-label`,`Groups list`),s.foreignGroup&&(l[s.foreignGroup.uri]=!0),o){e.allGroupsLi=r.createElement(`li`);let h=r.createElement(`button`);h.textContent=`All groups`,h.classList.add(`allGroupsButton`,`actionButton`,`btn-primary`,`action-button-focus`,`allGroupsButton--selected`),h.addEventListener(`click`,function(t){if(a.setActiveGroupButton(m,h),d(null),!Array.from(m.children).every(function(e){return e.subject?!!l[e.subject.uri]:!0}))h.classList.add(`allGroupsButton--loading`),h.setAttribute(`aria-busy`,`true`),a.selectAllGroups(l,m,function(t,r){if(!t)return n.alertDialog(`Failed to select all groups. If it persists, contact admin.`);h.classList.remove(`allGroupsButton--loading`),h.setAttribute(`aria-busy`,`false`),h.classList.add(`allGroupsButton--active`),a.refreshThingsSelected(m,l),a.refreshNames(e.ulPeople,null)});else{h.classList.remove(`allGroupsButton--loading`,`allGroupsButton--active`),h.setAttribute(`aria-busy`,`false`),h.classList.add(`allGroupsButton--loaded`);for(let e in l)delete l[e];a.refreshThingsSelected(m,l)}}),e.allGroupsLi.appendChild(h),m.appendChild(e.allGroupsLi),e.newGroupLi=r.createElement(`li`);let g=r.createElement(`button`);g.setAttribute(`type`,`button`),g.innerHTML=`+ New group`,g.classList.add(`allGroupsButton`,`actionButton`,`btn-secondary`,`action-button-focus`),u.push(g),g.addEventListener(`click`,function(t){a.setActiveGroupButton(m,g),d(null),a.deselectAllPeople(e.ulPeople),p(e)},!1),e.newGroupLi.appendChild(g),f.appendChild(m),c&&i.fetcher.nowOrWhenFetched(c.uri,o,function(i,c){if(!i){t.error(`Error loading group index. Stack: `+c),n.alertDialog(`Error loading group index. If it persists, contact admin.`);return}e.allGroupsLi.parentNode&&e.allGroupsLi.parentNode.removeChild(e.allGroupsLi),e.newGroupLi.parentNode&&e.newGroupLi.parentNode.removeChild(e.newGroupLi),a.syncGroupUl(o,s,m,r,l,e.ulPeople,e.searchInput),m.insertBefore(e.allGroupsLi,m.firstChild),m.appendChild(e.newGroupLi),h.classList.add(`allGroupsButton--loading`),h.setAttribute(`aria-busy`,`true`),a.selectAllGroups(l,m,function(t,r){if(!t)return n.alertDialog(`Failed to select all groups. If it persists, contact admin.`);h.classList.remove(`allGroupsButton--loading`),h.setAttribute(`aria-busy`,`false`),h.classList.add(`allGroupsButton--active`),a.refreshThingsSelected(m,l),a.refreshNames(e.ulPeople,null)})}),e.allGroupsLi.parentNode&&e.allGroupsLi.parentNode.removeChild(e.allGroupsLi),e.newGroupLi.parentNode&&e.newGroupLi.parentNode.removeChild(e.newGroupLi),a.renderGroupButtons(o,m,s,r,l,e.ulPeople,e.searchInput,e.detailsSectionContent,e.dataBrowserContext,function(){d(null),e.detailsSectionContent.querySelector(`.contactTypeChooser, .contactFormContainer, .renderPane`)||(e.detailsSectionContent.innerHTML=``,e.detailsSection.classList.add(`hidden`))}),m.insertBefore(e.allGroupsLi,m.firstChild),m.appendChild(e.newGroupLi)}else a.syncGroupUl(o,s,m,r,l,e.ulPeople,e.searchInput),a.refreshNames(e.ulPeople,null),t.log(`No book, only one group -> hide list of groups`);return{buttonSection:f,ulGroups:m}}function y(e){let{dom:r,kb:i,ns:o,book:c,options:u,selectedGroups:d,actionButtons:f,setActiveActionButton:m,dataBrowserContext:h,div:g,me:_}=e,v=r.createElement(`div`);if(v.classList.add(`cardFooter`),c){let y=v.appendChild(r.createElement(`button`));y.setAttribute(`type`,`button`),y.innerHTML=`Groups`,y.classList.add(`actionButton`,`btn-secondary`,`action-button-focus`),f.push(y),y.addEventListener(`click`,async function(s){m(y),a.deselectAllPeople(e.ulPeople),e.showDetailsSection(),e.detailsSectionContent.innerHTML=``,e.detailsSectionContent.classList.remove(`detailsSectionContent--wide`);let f=r.createElement(`h3`);f.textContent=`Your groups`,e.detailsSectionContent.appendChild(f);let h=r.createElement(`p`);h.textContent=`When you delete a group it can happen that some contacts end up groupless.`,e.detailsSectionContent.appendChild(h),h=r.createElement(`p`),h.textContent=`To move contacts around, simply drag and drop them onto a group.`,e.detailsSectionContent.appendChild(h);let g;try{g=await a.loadAllGroups(c)}catch(t){e.detailsSectionContent.appendChild(r.createTextNode(`Failed to load groups: `+t));return}let v=r.createElement(`ul`);v.setAttribute(`role`,`list`),v.setAttribute(`aria-label`,`All groups`),v.classList.add(`groupButtonsList`),g&&(g.sort((e,t)=>{let n=(i.any(e,o.vcard(`fn`))||``).toString().toLowerCase(),r=(i.any(t,o.vcard(`fn`))||``).toString().toLowerCase();return n<r?-1:+(n>r)}),g.forEach(function(o){let{groupLi:s,groupButton:f,name:p}=a.createGroupLi(o);f.addEventListener(`click`,function(r){if(r.preventDefault(),!r.metaKey)for(let e in d)delete d[e];d[o.uri]=!d[o.uri],a.refreshThingsSelected(e.ulGroups,d);let s=Array.from(e.ulGroups.children).find(e=>e.subject&&e.subject.uri===o.uri);a.setActiveGroupButton(e.ulGroups,s?s.querySelector(`button`):null),i.fetcher.nowOrWhenFetched(o.doc(),void 0,function(r,i){if(!r)return t.error(`Cannot load group: `+o+`. Stack: `+i),n.alertDialog(`Failed to load group details. If it persists, contact your admin.`);a.refreshNames(e.ulPeople,null,!1)})},!1),l.widgets.makeDropTarget(s,e=>a.handleURIsDroppedOnGroup(e,o)),_&&l.widgets.deleteButtonWithCheck(r,s,`group `+p,async function(){await n.deleteThingAndDoc(o),delete d[o.uri];let t=e.allGroupsLi,i=e.newGroupLi;t.parentNode&&t.parentNode.removeChild(t),i.parentNode&&i.parentNode.removeChild(i),a.syncGroupUl(c,u,e.ulGroups,r,d,e.ulPeople,e.searchInput),e.ulGroups.insertBefore(t,e.ulGroups.firstChild),e.ulGroups.appendChild(i),a.refreshThingsSelected(e.ulGroups,d),a.refreshNames(e.ulPeople,null,!1),y.click()}),v.appendChild(s)})),e.detailsSectionContent.appendChild(v);let b=r.createElement(`button`);b.setAttribute(`type`,`button`),b.innerHTML=`+ New group`,b.classList.add(`actionButton`,`btn-primary`,`action-button-focus`,`newGroupBtn`),b.addEventListener(`click`,function(){p(e)},!1),e.detailsSectionContent.appendChild(b)});let b=v.appendChild(r.createElement(`button`));b.setAttribute(`type`,`button`),b.innerHTML=`Sharing`,b.classList.add(`actionButton`,`btn-secondary`,`action-button-focus`),f.push(b),b.addEventListener(`click`,function(s){m(b),a.deselectAllPeople(e.ulPeople),e.showDetailsSection(),e.detailsSectionContent.innerHTML=``,e.detailsSectionContent.classList.remove(`detailsSectionContent--wide`);let u=r.createElement(`h3`);u.textContent=`Sharing`,e.detailsSectionContent.appendChild(u),e.detailsSectionContent.appendChild(l.aclControl.ACLControlBox5(c.dir(),h,`book`,i,function(i,a){i||(t.error(`ACL control box Failed. Stack: `+a),n.complain(e.detailsSectionContent,r,`Problem displaying sharing controls. If persists, contact admin.`))}));let d={target:c,me:_,noun:`address book`,div:e.detailsSectionContent,dom:r,statusRegion:g};l.login.registrationControl(d,c,o.vcard(`AddressBook`)).then(()=>t.log(`Registration control finished.`)).catch(i=>{t.error(`Error in registration control. Stack: `+i),n.complain(e.detailsSectionContent,r,`Problem displaying findable controls. If persists, contact admin.`)})});let x=v.appendChild(r.createElement(`button`));x.setAttribute(`type`,`button`),x.innerHTML=`Tools`,x.classList.add(`actionButton`,`btn-secondary`,`action-button-focus`),f.push(x),x.addEventListener(`click`,function(t){m(x),a.deselectAllPeople(e.ulPeople),e.showDetailsSection(),e.detailsSectionContent.innerHTML=``,e.detailsSectionContent.classList.add(`detailsSectionContent--wide`),e.detailsSectionContent.appendChild(s.toolsPane(a.selectAllGroups,d,e.ulGroups,c,h,_,function(){e.allGroupsLi.parentNode&&e.allGroupsLi.parentNode.removeChild(e.allGroupsLi),e.newGroupLi.parentNode&&e.newGroupLi.parentNode.removeChild(e.newGroupLi),a.syncGroupUl(c,u,e.ulGroups,r,d,e.ulPeople,e.searchInput),e.ulGroups.insertBefore(e.allGroupsLi,e.ulGroups.firstChild),e.ulGroups.appendChild(e.newGroupLi),a.refreshThingsSelected(e.ulGroups,d)}))})}return v}exports.default=f;
|
|
6
|
+
//# sourceMappingURL=contactsPane.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contactsPane.cjs.js","names":["UI","mintNewAddressBook","complain","renderIndividual","authn","saveNewGroup","saveNewContact","ensureBookLoaded","alertDialog","loadAllGroups","createGroupLi","handleURIsDroppedOnGroup","deleteThingAndDoc","toolsPane","selectAllGroups"],"sources":["../src/contactsPane.js"],"sourcesContent":["/* Contact AddressBook Pane\n**\n** This outline pane allows a user to interact with a contact,\nto change its state according to an ontology, comment on it, etc.\n**\n** See also things like\n** http://www.w3.org/TR/vcard-rdf/\n** http://tools.ietf.org/html/rfc6350\n** http://www.iana.org/assignments/vcard-elements/vcard-elements.xhtml\n**\n*/\n\nimport { authn } from 'solid-logic'\nimport { saveNewContact, saveNewGroup } from './contactLogic'\nimport * as UI from 'solid-ui'\nimport { mintNewAddressBook } from './mintNewAddressBook'\nimport { renderIndividual } from './individual'\nimport { toolsPane } from './toolsPane'\nimport './styles/utilities.css'\nimport './styles/contactsPane.css'\nimport {\n checkDataModel, ensureBookLoaded, renderGroupButtons,\n refreshThingsSelected, refreshNames, selectAllGroups, loadAllGroups,\n syncGroupUl, setActiveGroupButton, createGroupLi, refreshFilteredPeople,\n deselectAllPeople, handleURIsDroppedOnGroup\n} from './addressBookPresenter'\nimport { alertDialog, complain, deleteThingAndDoc, setDom, setupResponsiveStacking } from './localUtils'\nimport * as debug from './debug'\nimport './styles/contactsRDFFormsEnforced.css'\n\nconst ns = UI.ns\nconst utils = UI.utils\n\nexport default {\n icon: UI.icons.iconBase + 'noun_99101.svg', // changed from embedded icon 2016-05-01\n\n name: 'contact',\n\n global: false,\n\n // Does the subject deserve a contact pane?\n label: function (subject, context) {\n const t = context.session.store.findTypeURIs(subject)\n // with the new design we only display Address Books\n // individuals are rendered through the profile-pane but not Organizations\n if (t[ns.vcard('Organization').uri]) return 'Contact'\n /*\n if (t[ns.vcard('Individual').uri]) return 'Contact'\n if (t[ns.foaf('Person').uri]) return 'Person'\n if (t[ns.schema('Person').uri]) return 'Person'\n if (t[ns.vcard('Group').uri]) return 'Group'\n */\n if (t[ns.vcard('AddressBook').uri]) return 'Address book'\n return null // No, under other circumstances\n },\n\n mintClass: UI.ns.vcard('AddressBook'),\n\n mintNew: mintNewAddressBook, // Make a new address book\n\n // Render the pane\n render: function (subject, dataBrowserContext, paneOptions = {}) {\n /*\n function newAddressBookButton (thisAddressBook) {\n return UI.login.newAppInstance(\n dom,\n { noun: 'address book', appPathSegment: 'contactorator.timbl.com' },\n function (ws, newBase) {\n thisPane.mintNew(thisAddressBook, newBase, {\n me,\n div,\n dom\n })\n }\n )\n } */\n\n const dom = dataBrowserContext.dom\n const kb = dataBrowserContext.session.store\n const div = dom.createElement('div')\n setDom(dom) // set dom for ana error handling in other modules\n\n UI.aclControl.preventBrowserDropEvents(dom) // protect drag and drop\n\n div.setAttribute('class', 'contactPane')\n // Make the pane stack vertically (sidebar -> details) when narrow\n // Set breakpoint to 1000 so it triggers at 980 width too.\n setupResponsiveStacking(div, 1000)\n\n asyncRender().then(\n () => debug.log('Contacts pane rendered for ' + subject),\n err => complain(div, dom, err.message || '' + err)\n ).catch(err => {\n complain(div, dom, err.message || '' + err)\n })\n return div\n\n // Async part of render. Maybe API will later allow render to be async\n async function asyncRender () {\n UI.aclControl.preventBrowserDropEvents(dom)\n\n const t = kb.findTypeURIs(subject)\n\n // Render a single contact Individual\n if (\n t[ns.vcard('Individual').uri] ||\n t[ns.foaf('Person').uri] ||\n t[ns.schema('Person').uri] ||\n t[ns.vcard('Organization').uri] ||\n t[ns.schema('Organization').uri]\n ) {\n try {\n await renderIndividual(dom, div, subject, dataBrowserContext)\n } catch (err) {\n debug.error('Error rendering contact. Stack: ' + err)\n throw new Error('Failed to render contact: ' + (err.message || err))\n }\n /*\n // Render a Group instance\n }\n else if (t[ns.vcard('Group').uri]) {\n // If we have a main address book, then render this group as a guest group within it\n UI.login\n .findAppInstances(context, ns.vcard('AddressBook'))\n .then(function (context) {\n const addressBooks = context.instances\n const options = { foreignGroup: subject }\n if (addressBooks.length > 0) {\n // const book = addressBooks[0]\n renderAddressBook(addressBooks, options)\n } else {\n renderAddressBook([], options)\n // @@ button to Make a new addressBook\n }\n })\n .catch(function (e) {\n complain(div, dom, '' + e)\n })\n */\n // Render a AddressBook instance\n } else if (t[ns.vcard('AddressBook').uri]) {\n renderAddressBook([subject], {})\n } else {\n debug.error('No evidence that ' + subject + ' is anything to do with contacts.')\n throw new Error('This does not seem to be a contact or address book.')\n }\n\n let me = authn.currentUser()\n\n // Render AddressBook instance\n function renderAddressBook (books, options) {\n kb.fetcher\n .load(books)\n .then(function (_xhr) {\n renderAddressBookDetails(books, options)\n })\n .catch(function (err) {\n debug.error('Error loading address book. Stack: ' + err)\n throw new Error('Failed to load address book.')\n })\n }\n\n function renderAddressBookDetails (books, options) {\n const classLabel = utils.label(ns.vcard('AddressBook'))\n\n let book = options.foreignGroup // in case we have only a Grouo\n let title = ''\n if (books && books.length > 0) {\n book = books[0] // if we have an Address Book, we prefer this\n title = utils.label(book.dir())\n } else {\n kb.any(book, ns.dc('title')) || kb.any(book, ns.vcard('fn'))\n if (paneOptions.solo && title && typeof document !== 'undefined') {\n document.title = title.value // @@ only when the outermmost pane\n }\n title = title ? title.value : classLabel\n }\n\n const groupIndex = kb.any(book, ns.vcard('groupIndex'))\n const selectedGroups = {}\n let selectedPeople = {} // Actually prob max 1\n\n let allGroupsLi = null\n let newGroupLi = null\n\n // Centralized active-button tracking across all action buttons\n const actionButtons = []\n function setActiveActionButton (activeBtn) {\n actionButtons.forEach(btn => {\n btn.classList.remove('btn-primary')\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\n // Shared context passed to all builder functions\n const ctx = {\n dom,\n kb,\n ns,\n book,\n options,\n title,\n groupIndex,\n selectedGroups,\n get selectedPeople () { return selectedPeople },\n set selectedPeople (v) { selectedPeople = v },\n get allGroupsLi () { return allGroupsLi },\n set allGroupsLi (v) { allGroupsLi = v },\n get newGroupLi () { return newGroupLi },\n set newGroupLi (v) { newGroupLi = v },\n actionButtons,\n setActiveActionButton,\n dataBrowserContext,\n div,\n me,\n setMe (v) { me = v },\n paneOptions,\n }\n\n // ── Build layout ────────────────────────────────────────────\n const { main, addressBookSection, detailsSection } = buildMainLayout(ctx)\n div.appendChild(main)\n\n function showDetailsSection () {\n detailsSection.classList.remove('hidden')\n }\n ctx.showDetailsSection = showDetailsSection\n ctx.detailsSection = detailsSection\n\n // Create shared DOM elements needed by multiple builders\n const ulPeople = dom.createElement('ul')\n ulPeople.setAttribute('role', 'list')\n ulPeople.setAttribute('aria-label', 'People list')\n ctx.ulPeople = ulPeople\n // make the element available on the dataBrowserContext too; other\n // modules (individual/group membership) look for this property when\n // they need to refresh the master list after a mutation.\n if (ctx.dataBrowserContext) ctx.dataBrowserContext.ulPeople = ulPeople\n\n const detailsSectionContent = dom.createElement('div')\n detailsSectionContent.classList.add('detailsSectionContent')\n detailsSectionContent.setAttribute('role', 'region')\n detailsSectionContent.setAttribute('aria-labelledby', 'detailsSectionContent')\n detailsSectionContent.setAttribute('aria-live', 'polite')\n ctx.detailsSectionContent = detailsSectionContent\n\n // ── Header (title + New Contact button) ─────────────────────\n const headerSection = buildHeaderSection(ctx)\n addressBookSection.appendChild(headerSection)\n\n const dottedHr = dom.createElement('hr')\n dottedHr.classList.add('dottedHr')\n addressBookSection.appendChild(dottedHr)\n\n // ── Search ──────────────────────────────────────────────────\n const { searchSection, searchInput } = buildSearchSection(ctx)\n ctx.searchInput = searchInput\n addressBookSection.appendChild(searchSection)\n\n // ── Group bar ───────────────────────────────────────────────\n const { buttonSection, ulGroups } = buildGroupBar(ctx)\n ctx.ulGroups = ulGroups\n addressBookSection.appendChild(buttonSection)\n\n // ── People list ─────────────────────────────────────────────\n const peopleListSection = dom.createElement('section')\n peopleListSection.classList.add('peopleSection')\n addressBookSection.appendChild(peopleListSection)\n peopleListSection.appendChild(ulPeople)\n\n // ── Details content section ─────────────────────────────────\n detailsSection.appendChild(detailsSectionContent)\n\n // ── Footer buttons ──────────────────────────────────────────\n const cardFooter = buildFooterButtons(ctx)\n addressBookSection.appendChild(cardFooter)\n\n checkDataModel(book, detailsSectionContent).then(() => { debug.log('Async checkDataModel done.') })\n }\n\n // /////////////// Fix user when testing on a plane\n\n if (\n typeof document !== 'undefined' &&\n document.location &&\n ('' + document.location).slice(0, 16) === 'http://localhost'\n ) {\n const inferredOwner = kb.any(subject, UI.ns.acl('owner')) // when testing on plane with no webid\n if (inferredOwner) {\n me = inferredOwner\n }\n }\n\n return div\n } // asyncRender\n } // render function\n} // pane object\n\n// ── Helper: handle \"New group\" button click ──────────────────────────\nasync function handleNewGroupClick (ctx) {\n const { dom, kb, ns, book, options, selectedGroups, dataBrowserContext } = ctx\n ctx.showDetailsSection()\n ctx.detailsSectionContent.innerHTML = ''\n const groupIndex = kb.any(book, ns.vcard('groupIndex'))\n try {\n await kb.fetcher.load(groupIndex)\n } catch (e) {\n debug.log('Error: Group index NOT loaded:' + e + '\\n')\n }\n debug.log(' Group index has been loaded\\n')\n\n const name = await UI.widgets.askName(\n dom, kb, ctx.detailsSectionContent, UI.ns.foaf('name'), ns.vcard('Group'), 'group')\n if (!name) return // cancelled by user\n let group\n try {\n group = await saveNewGroup(book, name)\n } catch (err) {\n debug.log('Error: can\\'t save new group:' + err)\n ctx.detailsSectionContent.innerHTML = 'Failed to save group' + err\n return\n }\n for (const key in selectedGroups) delete selectedGroups[key]\n selectedGroups[group.uri] = true\n\n // Refresh the group buttons list\n const allGroupsLi = ctx.allGroupsLi\n const newGroupLi = ctx.newGroupLi\n if (allGroupsLi.parentNode) allGroupsLi.parentNode.removeChild(allGroupsLi)\n if (newGroupLi.parentNode) newGroupLi.parentNode.removeChild(newGroupLi)\n syncGroupUl(book, options, ctx.ulGroups, dom, selectedGroups, ctx.ulPeople, ctx.searchInput)\n ctx.ulGroups.insertBefore(allGroupsLi, ctx.ulGroups.firstChild)\n ctx.ulGroups.appendChild(newGroupLi)\n refreshThingsSelected(ctx.ulGroups, selectedGroups)\n // Highlight the new group button in ulGroups and show empty people list\n const matchingLi = Array.from(ctx.ulGroups.children).find(li => li.subject && li.subject.uri === group.uri)\n setActiveGroupButton(ctx.ulGroups, matchingLi ? matchingLi.querySelector('button') : null)\n refreshNames(ctx.ulPeople, null, false)\n\n ctx.detailsSectionContent.innerHTML = ''\n ctx.detailsSectionContent.appendChild(UI.aclControl.ACLControlBox5(\n group.doc(), dataBrowserContext, 'group', kb,\n function (ok, body) {\n if (!ok) {\n ctx.detailsSectionContent.innerHTML =\n 'Group sharing setup failed: ' + body\n }\n }))\n}\n\n// ── Helper: render askName form for person or organization ───────────\nfunction createNewPersonOrOrganization (ctx, formContainer, klass) {\n const { dom, kb, book, selectedGroups, dataBrowserContext } = ctx\n formContainer.innerHTML = ''\n UI.widgets\n .askName(dom, kb, formContainer, UI.ns.foaf('name'), klass)\n .then(async (name) => {\n if (!name) return // cancelled by user\n ctx.detailsSectionContent.innerHTML = 'Indexing...'\n let person\n try {\n person = await saveNewContact(book, name, selectedGroups, klass)\n } catch (err) {\n const msg = 'Error saving contact. If it persists, contact your admin.'\n alertDialog(msg)\n return\n }\n // It’s possible `saveNewContact` returned `undefined` when no group was\n // selected. In that case we already alerted the user and nothing more\n // should happen.\n if (!person) {\n ctx.detailsSectionContent.innerHTML = ''\n return\n }\n ctx.selectedPeople = {}\n ctx.selectedPeople[person.uri] = true\n refreshNames(ctx.ulPeople, null) // Add name to list of group\n ctx.detailsSectionContent.innerHTML = '' // Clear 'indexing'\n ctx.detailsSectionContent.classList.add('detailsSectionContent--wide')\n const contactPane = dataBrowserContext.session.paneRegistry.byName('contact')\n const paneDiv = contactPane.render(person, dataBrowserContext)\n paneDiv.classList.add('renderPane')\n ctx.detailsSectionContent.appendChild(paneDiv)\n })\n}\n\n// ── Builder: main layout skeleton ────────────────────────────────────\nfunction buildMainLayout (ctx) {\n const { dom } = ctx\n const main = dom.createElement('main')\n main.id = 'main-content'\n main.classList.add('addressBook-grid')\n main.setAttribute('role', 'main')\n main.setAttribute('aria-label', 'Address Book')\n main.setAttribute('tabindex', '-1')\n\n const addressBookSection = dom.createElement('section')\n addressBookSection.setAttribute('aria-labelledby', 'addressBook-section')\n addressBookSection.classList.add('addressBookSection', 'section-bg')\n addressBookSection.setAttribute('role', 'region')\n addressBookSection.setAttribute('tabindex', '-1')\n main.appendChild(addressBookSection)\n\n const detailsSection = dom.createElement('section')\n detailsSection.classList.add('detailSection')\n detailsSection.setAttribute('role', 'region')\n detailsSection.setAttribute('aria-label', 'Details section')\n detailsSection.classList.add('hidden')\n main.appendChild(detailsSection)\n\n return { main, addressBookSection, detailsSection }\n}\n\n// ── Builder: header with title and New Contact button ────────────────\nfunction buildHeaderSection (ctx) {\n const { dom, ns, title, me, setMe, setActiveActionButton } = ctx\n\n const headerSection = dom.createElement('section')\n headerSection.classList.add('headerSection')\n\n const header = dom.createElement('header')\n header.classList.add('mb-md')\n const h2 = dom.createElement('h2')\n h2.id = 'addressBook-heading'\n h2.setAttribute('tabindex', '-1')\n h2.textContent = title\n\n // New Contact button\n const newContactButton = dom.createElement('button')\n const container = dom.createElement('div')\n newContactButton.setAttribute('type', 'button')\n if (!me) newContactButton.setAttribute('disabled', 'true')\n authn.checkUser().then(webId => {\n if (webId) {\n setMe(webId)\n newContactButton.removeAttribute('disabled')\n }\n })\n container.appendChild(newContactButton)\n newContactButton.innerHTML = '+ New contact'\n newContactButton.classList.add('actionButton', 'btn-primary', 'action-button-focus')\n let newContactClickGeneration = 0\n newContactButton.addEventListener('click', async function (_event) {\n setActiveActionButton(null)\n deselectAllPeople(ctx.ulPeople)\n const thisGeneration = ++newContactClickGeneration\n ctx.showDetailsSection()\n ctx.detailsSectionContent.innerHTML = ''\n ctx.detailsSectionContent.classList.remove('detailsSectionContent--wide')\n await ensureBookLoaded()\n // Bail out if a newer click has taken over\n if (thisGeneration !== newContactClickGeneration) return\n ctx.detailsSectionContent.innerHTML = ''\n\n const chooserDiv = dom.createElement('div')\n chooserDiv.classList.add('contactTypeChooser')\n\n const selectLabel = dom.createElement('label')\n selectLabel.textContent = 'Contact type: '\n selectLabel.setAttribute('for', 'contactTypeSelect')\n chooserDiv.appendChild(selectLabel)\n\n const select = dom.createElement('select')\n select.id = 'contactTypeSelect'\n select.classList.add('contactTypeSelect')\n const optIndividual = dom.createElement('option')\n optIndividual.value = 'Individual'\n optIndividual.textContent = 'New person'\n select.appendChild(optIndividual)\n const optOrganization = dom.createElement('option')\n optOrganization.value = 'Organization'\n optOrganization.textContent = 'New organization'\n select.appendChild(optOrganization)\n chooserDiv.appendChild(select)\n\n ctx.detailsSectionContent.appendChild(chooserDiv)\n\n const remark = dom.createElement('p')\n remark.classList.add('contactCreationRemark')\n remark.textContent = 'The new contact is added to the already selected group.'\n ctx.detailsSectionContent.appendChild(remark)\n\n // Container for the askName form, placed below the select\n const formContainer = dom.createElement('div')\n formContainer.classList.add('contactFormContainer')\n ctx.detailsSectionContent.appendChild(formContainer)\n\n function currentKlass () {\n return select.value === 'Organization'\n ? ns.vcard('Organization')\n : ns.vcard('Individual')\n }\n\n // Render person form immediately as default\n createNewPersonOrOrganization(ctx, formContainer, currentKlass())\n\n // Switch form when dropdown changes\n select.addEventListener('change', function () {\n createNewPersonOrOrganization(ctx, formContainer, currentKlass())\n })\n }, false)\n\n // TODO we should also add if it is public or private\n header.appendChild(h2)\n header.appendChild(container)\n headerSection.appendChild(header)\n return headerSection\n}\n\n// ── Builder: search input section ────────────────────────────────────\nfunction buildSearchSection (ctx) {\n const { dom } = ctx\n const searchSection = dom.createElement('section')\n searchSection.classList.add('searchSection')\n const searchDiv = dom.createElement('div')\n searchDiv.classList.add('searchDiv')\n // container for input + clear button\n searchSection.appendChild(searchDiv)\n const searchInput = dom.createElement('input')\n searchInput.setAttribute('type', 'text')\n searchInput.setAttribute('aria-label', 'Search contacts')\n searchInput.classList.add('searchInput')\n searchInput.setAttribute('placeholder', 'Search by name in selected group')\n searchDiv.appendChild(searchInput)\n\n // clear button that appears when there is text\n const clearBtn = dom.createElement('button')\n clearBtn.setAttribute('type', 'button')\n clearBtn.setAttribute('aria-label', 'Clear search')\n clearBtn.classList.add('searchClearButton', 'hidden')\n clearBtn.textContent = '\\u2715' // multiplication sign ×\n searchDiv.appendChild(clearBtn)\n\n searchInput.addEventListener('input', function (_event) {\n const hasText = searchInput.value.length > 0\n // show/hide using the shared \"hidden\" utility class instead of direct\n // style manipulation\n clearBtn.classList.toggle('hidden', !hasText)\n refreshFilteredPeople(ctx.ulPeople, true, ctx.detailsSectionContent)\n })\n\n clearBtn.addEventListener('click', function () {\n searchInput.value = ''\n clearBtn.classList.add('hidden')\n searchInput.focus()\n refreshFilteredPeople(ctx.ulPeople, true, ctx.detailsSectionContent)\n })\n\n return { searchSection, searchInput }\n}\n\n// ── Builder: group buttons bar ───────────────────────────────────────\nfunction buildGroupBar (ctx) {\n const {\n dom, kb, book, options, groupIndex, selectedGroups,\n actionButtons, setActiveActionButton\n } = ctx\n\n const buttonSection = dom.createElement('section')\n buttonSection.classList.add('buttonSection')\n\n const ulGroups = dom.createElement('ul')\n ulGroups.classList.add('groupButtonsList')\n ulGroups.setAttribute('role', 'list')\n ulGroups.setAttribute('aria-label', 'Groups list')\n\n if (options.foreignGroup) {\n selectedGroups[options.foreignGroup.uri] = true\n }\n\n if (book) {\n // All groups button — leftmost, initially selected\n ctx.allGroupsLi = dom.createElement('li')\n const allGroupsButton = dom.createElement('button')\n allGroupsButton.textContent = 'All groups'\n allGroupsButton.classList.add('allGroupsButton', 'actionButton', 'btn-primary', 'action-button-focus', 'allGroupsButton--selected')\n allGroupsButton.addEventListener('click', function (_event) {\n setActiveGroupButton(ulGroups, allGroupsButton)\n setActiveActionButton(null)\n // Check if all groups are currently selected\n const allSelected = Array.from(ulGroups.children).every(function (li) {\n if (!li.subject) return true // skip non-group items (All groups, New group)\n return !!selectedGroups[li.subject.uri]\n })\n\n if (!allSelected) {\n allGroupsButton.classList.add('allGroupsButton--loading')\n allGroupsButton.setAttribute('aria-busy', 'true')\n selectAllGroups(selectedGroups, ulGroups, function (ok, message) {\n if (!ok) return alertDialog('Failed to select all groups. If it persists, contact admin.')\n allGroupsButton.classList.remove('allGroupsButton--loading')\n allGroupsButton.setAttribute('aria-busy', 'false')\n allGroupsButton.classList.add('allGroupsButton--active')\n refreshThingsSelected(ulGroups, selectedGroups)\n refreshNames(ctx.ulPeople, null)\n })\n } else {\n allGroupsButton.classList.remove('allGroupsButton--loading', 'allGroupsButton--active')\n allGroupsButton.setAttribute('aria-busy', 'false')\n allGroupsButton.classList.add('allGroupsButton--loaded') // pale green hint groups loaded\n for (const key in selectedGroups) delete selectedGroups[key]\n refreshThingsSelected(ulGroups, selectedGroups)\n }\n }) // on button click\n ctx.allGroupsLi.appendChild(allGroupsButton)\n ulGroups.appendChild(ctx.allGroupsLi) // First item in the list\n\n // New group button — rightmost (appended after group buttons are rendered)\n ctx.newGroupLi = dom.createElement('li')\n const newGroupButton = dom.createElement('button')\n newGroupButton.setAttribute('type', 'button')\n newGroupButton.innerHTML = '+ New group'\n newGroupButton.classList.add('allGroupsButton', 'actionButton', 'btn-secondary', 'action-button-focus')\n actionButtons.push(newGroupButton)\n newGroupButton.addEventListener(\n 'click', function (event) {\n setActiveGroupButton(ulGroups, newGroupButton)\n setActiveActionButton(null)\n deselectAllPeople(ctx.ulPeople)\n handleNewGroupClick(ctx)\n },\n false\n )\n ctx.newGroupLi.appendChild(newGroupButton)\n\n // Append ulGroups to buttonSection, then add New group at the end\n buttonSection.appendChild(ulGroups)\n\n if (groupIndex) {\n kb.fetcher.nowOrWhenFetched(groupIndex.uri, book, function (ok, body) {\n if (!ok) {\n debug.error('Error loading group index. Stack: ' + body)\n alertDialog('Error loading group index. If it persists, contact admin.')\n return\n }\n // Remove special items before sync (syncTableToArrayReOrdered expects .subject on all children)\n if (ctx.allGroupsLi.parentNode) ctx.allGroupsLi.parentNode.removeChild(ctx.allGroupsLi)\n if (ctx.newGroupLi.parentNode) ctx.newGroupLi.parentNode.removeChild(ctx.newGroupLi)\n syncGroupUl(book, options, ulGroups, dom, selectedGroups, ctx.ulPeople, ctx.searchInput) // Refresh list of groups\n ulGroups.insertBefore(ctx.allGroupsLi, ulGroups.firstChild) // Keep All contacts first\n ulGroups.appendChild(ctx.newGroupLi) // Keep New group last\n\n // Auto-select all groups and display all contacts on load\n allGroupsButton.classList.add('allGroupsButton--loading')\n allGroupsButton.setAttribute('aria-busy', 'true')\n selectAllGroups(selectedGroups, ulGroups, function (ok, message) {\n if (!ok) return alertDialog('Failed to select all groups. If it persists, contact admin.')\n allGroupsButton.classList.remove('allGroupsButton--loading')\n allGroupsButton.setAttribute('aria-busy', 'false')\n allGroupsButton.classList.add('allGroupsButton--active')\n refreshThingsSelected(ulGroups, selectedGroups)\n refreshNames(ctx.ulPeople, null)\n })\n })\n }\n\n // Remove special items before initial render too\n if (ctx.allGroupsLi.parentNode) ctx.allGroupsLi.parentNode.removeChild(ctx.allGroupsLi)\n if (ctx.newGroupLi.parentNode) ctx.newGroupLi.parentNode.removeChild(ctx.newGroupLi)\n renderGroupButtons(book, ulGroups, options, dom, selectedGroups, ctx.ulPeople, ctx.searchInput, ctx.detailsSectionContent, ctx.dataBrowserContext, function () {\n setActiveActionButton(null)\n // Keep the details section open when a contact or New contact form is showing\n if (!ctx.detailsSectionContent.querySelector('.contactTypeChooser, .contactFormContainer, .renderPane')) {\n ctx.detailsSectionContent.innerHTML = ''\n ctx.detailsSection.classList.add('hidden')\n }\n })\n ulGroups.insertBefore(ctx.allGroupsLi, ulGroups.firstChild) // Keep All contacts first\n ulGroups.appendChild(ctx.newGroupLi) // Ensure New group is last after initial render\n } else {\n syncGroupUl(book, options, ulGroups, dom, selectedGroups, ctx.ulPeople, ctx.searchInput) // Refresh list of groups (will be empty)\n refreshNames(ctx.ulPeople, null)\n debug.log('No book, only one group -> hide list of groups')\n } // if not book\n\n return { buttonSection, ulGroups }\n}\n\n// ── Builder: footer action buttons (Groups / Sharing / Tools) ────────\nfunction buildFooterButtons (ctx) {\n const {\n dom, kb, ns, book, options, selectedGroups,\n actionButtons, setActiveActionButton, dataBrowserContext, div, me\n } = ctx\n\n const cardFooter = dom.createElement('div')\n cardFooter.classList.add('cardFooter')\n\n if (book) {\n // Groups button\n const groupsButton = cardFooter.appendChild(dom.createElement('button'))\n groupsButton.setAttribute('type', 'button')\n groupsButton.innerHTML = 'Groups'\n groupsButton.classList.add('actionButton', 'btn-secondary', 'action-button-focus')\n actionButtons.push(groupsButton)\n groupsButton.addEventListener('click', async function (_event) {\n setActiveActionButton(groupsButton)\n deselectAllPeople(ctx.ulPeople)\n ctx.showDetailsSection()\n ctx.detailsSectionContent.innerHTML = ''\n ctx.detailsSectionContent.classList.remove('detailsSectionContent--wide')\n\n // Header\n const groupsHeader = dom.createElement('h3')\n groupsHeader.textContent = 'Your groups'\n ctx.detailsSectionContent.appendChild(groupsHeader)\n\n let groupRemark = dom.createElement('p')\n groupRemark.textContent = 'When you delete a group it can happen that some contacts end up groupless.'\n ctx.detailsSectionContent.appendChild(groupRemark)\n\n groupRemark = dom.createElement('p')\n groupRemark.textContent = 'To move contacts around, simply drag and drop them onto a group.'\n ctx.detailsSectionContent.appendChild(groupRemark)\n\n // Load all groups and display them in a list\n let groups\n try {\n groups = await loadAllGroups(book)\n } catch (err) {\n ctx.detailsSectionContent.appendChild(dom.createTextNode('Failed to load groups: ' + err))\n return\n }\n\n const groupsList = dom.createElement('ul')\n groupsList.setAttribute('role', 'list')\n groupsList.setAttribute('aria-label', 'All groups')\n groupsList.classList.add('groupButtonsList')\n\n // Sort groups by name\n if (groups) {\n groups.sort((a, b) => {\n const nameA = (kb.any(a, ns.vcard('fn')) || '').toString().toLowerCase()\n const nameB = (kb.any(b, ns.vcard('fn')) || '').toString().toLowerCase()\n return nameA < nameB ? -1 : nameA > nameB ? 1 : 0\n })\n groups.forEach(function (group) {\n const { groupLi, groupButton: groupBtn, name } = createGroupLi(group)\n groupBtn.addEventListener('click', function (event) {\n event.preventDefault()\n if (!event.metaKey) {\n for (const key in selectedGroups) delete selectedGroups[key]\n }\n selectedGroups[group.uri] = !selectedGroups[group.uri]\n refreshThingsSelected(ctx.ulGroups, selectedGroups)\n // Highlight the matching group button in the sidebar ulGroups\n const matchingLi = Array.from(ctx.ulGroups.children).find(li => li.subject && li.subject.uri === group.uri)\n setActiveGroupButton(ctx.ulGroups, matchingLi ? matchingLi.querySelector('button') : null)\n kb.fetcher.nowOrWhenFetched(group.doc(), undefined, function (ok, message) {\n if (!ok) {\n debug.error('Cannot load group: ' + group + '. Stack: ' + message)\n return alertDialog('Failed to load group details. If it persists, contact your admin.')\n }\n refreshNames(ctx.ulPeople, null, false)\n })\n }, false)\n UI.widgets.makeDropTarget(groupLi, uris => handleURIsDroppedOnGroup(uris, group))\n\n if (me) {\n UI.widgets.deleteButtonWithCheck(\n dom,\n groupLi,\n 'group ' + name,\n async function () {\n await deleteThingAndDoc(group)\n delete selectedGroups[group.uri]\n // Refresh the group buttons list\n const allGroupsLi = ctx.allGroupsLi\n const newGroupLi = ctx.newGroupLi\n if (allGroupsLi.parentNode) allGroupsLi.parentNode.removeChild(allGroupsLi)\n if (newGroupLi.parentNode) newGroupLi.parentNode.removeChild(newGroupLi)\n syncGroupUl(book, options, ctx.ulGroups, dom, selectedGroups, ctx.ulPeople, ctx.searchInput)\n ctx.ulGroups.insertBefore(allGroupsLi, ctx.ulGroups.firstChild)\n ctx.ulGroups.appendChild(newGroupLi)\n refreshThingsSelected(ctx.ulGroups, selectedGroups)\n // Refresh the people list to reflect the deleted group\n refreshNames(ctx.ulPeople, null, false)\n // Refresh the groups detail view\n groupsButton.click()\n }\n )\n }\n\n groupsList.appendChild(groupLi)\n })\n }\n\n ctx.detailsSectionContent.appendChild(groupsList)\n\n // New group button at the bottom\n const newGroupBtn = dom.createElement('button')\n newGroupBtn.setAttribute('type', 'button')\n newGroupBtn.innerHTML = '+ New group'\n newGroupBtn.classList.add('actionButton', 'btn-primary', 'action-button-focus', 'newGroupBtn')\n newGroupBtn.addEventListener('click', function () { handleNewGroupClick(ctx) }, false)\n ctx.detailsSectionContent.appendChild(newGroupBtn)\n })\n\n // Sharing button\n const sharingButton = cardFooter.appendChild(dom.createElement('button'))\n sharingButton.setAttribute('type', 'button')\n sharingButton.innerHTML = 'Sharing'\n sharingButton.classList.add('actionButton', 'btn-secondary', 'action-button-focus')\n actionButtons.push(sharingButton)\n sharingButton.addEventListener('click', function (_event) {\n setActiveActionButton(sharingButton)\n deselectAllPeople(ctx.ulPeople)\n ctx.showDetailsSection()\n ctx.detailsSectionContent.innerHTML = ''\n ctx.detailsSectionContent.classList.remove('detailsSectionContent--wide')\n\n const sharingHeader = dom.createElement('h3')\n sharingHeader.textContent = 'Sharing'\n ctx.detailsSectionContent.appendChild(sharingHeader)\n\n ctx.detailsSectionContent.appendChild(\n UI.aclControl.ACLControlBox5(\n book.dir(),\n dataBrowserContext,\n 'book',\n kb,\n function (ok, body) {\n if (!ok) {\n debug.error('ACL control box Failed. Stack: ' + body)\n complain(ctx.detailsSectionContent, dom, 'Problem displaying sharing controls. If persists, contact admin.')\n }\n }\n )\n )\n\n const sharingContext = {\n target: book,\n me,\n noun: 'address book',\n div: ctx.detailsSectionContent,\n dom,\n statusRegion: div\n }\n UI.login.registrationControl(sharingContext, book, ns.vcard('AddressBook'))\n .then(() => debug.log('Registration control finished.'))\n .catch(e => {\n debug.error('Error in registration control. Stack: ' + e)\n complain(ctx.detailsSectionContent, dom, 'Problem displaying findable controls. If persists, contact admin.')\n })\n })\n\n // Settings button\n const toolsButton = cardFooter.appendChild(dom.createElement('button'))\n toolsButton.setAttribute('type', 'button')\n toolsButton.innerHTML = 'Tools'\n toolsButton.classList.add('actionButton', 'btn-secondary', 'action-button-focus')\n actionButtons.push(toolsButton)\n toolsButton.addEventListener('click', function (_event) {\n setActiveActionButton(toolsButton)\n deselectAllPeople(ctx.ulPeople)\n ctx.showDetailsSection()\n ctx.detailsSectionContent.innerHTML = ''\n ctx.detailsSectionContent.classList.add('detailsSectionContent--wide')\n ctx.detailsSectionContent.appendChild(\n toolsPane(\n selectAllGroups,\n selectedGroups,\n ctx.ulGroups,\n book,\n dataBrowserContext,\n me,\n function refreshGroups () {\n if (ctx.allGroupsLi.parentNode) ctx.allGroupsLi.parentNode.removeChild(ctx.allGroupsLi)\n if (ctx.newGroupLi.parentNode) ctx.newGroupLi.parentNode.removeChild(ctx.newGroupLi)\n syncGroupUl(book, options, ctx.ulGroups, dom, selectedGroups, ctx.ulPeople, ctx.searchInput)\n ctx.ulGroups.insertBefore(ctx.allGroupsLi, ctx.ulGroups.firstChild)\n ctx.ulGroups.appendChild(ctx.newGroupLi)\n refreshThingsSelected(ctx.ulGroups, selectedGroups)\n }\n )\n )\n })\n } // if book\n\n return cardFooter\n}\n\nexport { saveNewGroup, addPersonToGroup, groupMembers, saveNewContact } from './contactLogic'\nexport { addWebIDToContacts, removeWebIDFromContacts, getPersonas } from './webidControl'\n"],"mappings":"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"}
|