contacts-pane 3.2.1-2 → 3.2.1-4

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.
Files changed (48) hide show
  1. package/README.md +5 -5
  2. package/dist/addressBookPresenter.esm.js +270 -0
  3. package/dist/addressBookPresenter.esm.js.map +1 -0
  4. package/dist/contactLogic.esm.js +138 -0
  5. package/dist/contactLogic.esm.js.map +1 -0
  6. package/dist/contactsPane.esm.js +360 -0
  7. package/dist/contactsPane.esm.js.map +1 -0
  8. package/dist/debug.esm.js +14 -0
  9. package/dist/debug.esm.js.map +1 -0
  10. package/dist/groupMembershipControl.esm.js +73 -0
  11. package/dist/groupMembershipControl.esm.js.map +1 -0
  12. package/dist/index.cjs.js +1155 -0
  13. package/dist/index.cjs.js.map +1 -0
  14. package/dist/index.d.ts +2 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.esm.js +2 -0
  17. package/dist/individual.esm.js +37 -0
  18. package/dist/individual.esm.js.map +1 -0
  19. package/dist/localUtils.esm.js +159 -0
  20. package/dist/localUtils.esm.js.map +1 -0
  21. package/dist/mintNewAddressBook.esm.js +81 -0
  22. package/dist/mintNewAddressBook.esm.js.map +1 -0
  23. package/dist/mugshotGallery.esm.js +167 -0
  24. package/dist/mugshotGallery.esm.js.map +1 -0
  25. package/dist/ontology/individualAndOrganizationForm.esm.js +6 -0
  26. package/dist/ontology/individualAndOrganizationForm.esm.js.map +1 -0
  27. package/dist/ontology/vcard.esm.js +6 -0
  28. package/dist/ontology/vcard.esm.js.map +1 -0
  29. package/dist/rdfFormsHelper.esm.js +18 -0
  30. package/dist/rdfFormsHelper.esm.js.map +1 -0
  31. package/dist/toolsPane.esm.js +300 -0
  32. package/dist/toolsPane.esm.js.map +1 -0
  33. package/dist/webidControl.esm.js +175 -0
  34. package/dist/webidControl.esm.js.map +1 -0
  35. package/package.json +38 -50
  36. package/dist/contactsPane.js +0 -6697
  37. package/dist/contactsPane.js.map +0 -1
  38. package/dist/contactsPane.min.js +0 -2
  39. package/dist/contactsPane.min.js.map +0 -1
  40. package/dist/styles/contactsPane.css +0 -620
  41. package/dist/styles/contactsRDFFormsEnforced.css +0 -515
  42. package/dist/styles/groupMembership.css +0 -115
  43. package/dist/styles/individual.css +0 -12
  44. package/dist/styles/localUtils.css +0 -49
  45. package/dist/styles/mugshotGallery.css +0 -17
  46. package/dist/styles/toolsPane.css +0 -43
  47. package/dist/styles/utilities.css +0 -10
  48. package/dist/styles/webidControl.css +0 -252
@@ -0,0 +1,360 @@
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)}})();import { error as e, log as t } from "./debug.esm.js";
4
+
5
+ import { alertDialog as n, complain as r, deleteThingAndDoc as i, setDom as a, setupResponsiveStacking as o } from "./localUtils.esm.js";
6
+ import { saveNewContact as s, saveNewGroup as c } from "./contactLogic.esm.js";
7
+ import { mintNewAddressBook as l } from "./mintNewAddressBook.esm.js";
8
+ import { checkDataModel as u, createGroupLi as d, deselectAllPeople as f, ensureBookLoaded as p, handleURIsDroppedOnGroup as m, loadAllGroups as h, refreshFilteredPeople as g, refreshNames as _, refreshThingsSelected as v, renderGroupButtons as y, selectAllGroups as b, setActiveGroupButton as x, syncGroupUl as S } from "./addressBookPresenter.esm.js";
9
+
10
+ import { renderIndividual as C } from "./individual.esm.js";
11
+ import { toolsPane as w } from "./toolsPane.esm.js";
12
+
13
+
14
+ import { authn as T } from "solid-logic";
15
+ import * as E from "solid-ui";
16
+ //#region src/contactsPane.js
17
+ var D = E.ns, O = E.utils, k = {
18
+ icon: E.icons.iconBase + "noun_99101.svg",
19
+ name: "contact",
20
+ global: !1,
21
+ label: function(e, t) {
22
+ let n = t.session.store.findTypeURIs(e);
23
+ return n[D.vcard("Organization").uri] ? "Contact" : n[D.vcard("AddressBook").uri] ? "Address book" : null;
24
+ },
25
+ mintClass: E.ns.vcard("AddressBook"),
26
+ mintNew: l,
27
+ render: function(n, i, s = {}) {
28
+ let c = i.dom, l = i.session.store, d = c.createElement("div");
29
+ return a(c), E.aclControl.preventBrowserDropEvents(c), d.setAttribute("class", "contactPane"), o(d, 1e3), f().then(() => t("Contacts pane rendered for " + n), (e) => r(d, c, e.message || "" + e)).catch((e) => {
30
+ r(d, c, e.message || "" + e);
31
+ }), d;
32
+ async function f() {
33
+ E.aclControl.preventBrowserDropEvents(c);
34
+ let r = l.findTypeURIs(n);
35
+ if (r[D.vcard("Individual").uri] || r[D.foaf("Person").uri] || r[D.schema("Person").uri] || r[D.vcard("Organization").uri] || r[D.schema("Organization").uri]) try {
36
+ await C(c, d, n, i);
37
+ } catch (t) {
38
+ throw e("Error rendering contact. Stack: " + t), Error("Failed to render contact: " + (t.message || t));
39
+ }
40
+ else if (r[D.vcard("AddressBook").uri]) o([n], {});
41
+ else throw e("No evidence that " + n + " is anything to do with contacts."), Error("This does not seem to be a contact or address book.");
42
+ let a = T.currentUser();
43
+ function o(t, n) {
44
+ l.fetcher.load(t).then(function(e) {
45
+ f(t, n);
46
+ }).catch(function(t) {
47
+ throw e("Error loading address book. Stack: " + t), Error("Failed to load address book.");
48
+ });
49
+ }
50
+ function f(e, n) {
51
+ let r = O.label(D.vcard("AddressBook")), o = n.foreignGroup, f = "";
52
+ e && e.length > 0 ? (o = e[0], f = O.label(o.dir())) : (l.any(o, D.dc("title")) || l.any(o, D.vcard("fn")), s.solo && f && typeof document < "u" && (document.title = f.value), f = f ? f.value : r);
53
+ let p = l.any(o, D.vcard("groupIndex")), m = {}, h = {}, g = null, _ = null, v = [];
54
+ function y(e) {
55
+ v.forEach((e) => {
56
+ e.classList.remove("btn-primary"), e.classList.add("btn-secondary");
57
+ }), e && (e.classList.remove("btn-secondary"), e.classList.add("btn-primary"));
58
+ }
59
+ let b = {
60
+ dom: c,
61
+ kb: l,
62
+ ns: D,
63
+ book: o,
64
+ options: n,
65
+ title: f,
66
+ groupIndex: p,
67
+ selectedGroups: m,
68
+ get selectedPeople() {
69
+ return h;
70
+ },
71
+ set selectedPeople(e) {
72
+ h = e;
73
+ },
74
+ get allGroupsLi() {
75
+ return g;
76
+ },
77
+ set allGroupsLi(e) {
78
+ g = e;
79
+ },
80
+ get newGroupLi() {
81
+ return _;
82
+ },
83
+ set newGroupLi(e) {
84
+ _ = e;
85
+ },
86
+ actionButtons: v,
87
+ setActiveActionButton: y,
88
+ dataBrowserContext: i,
89
+ div: d,
90
+ me: a,
91
+ setMe(e) {
92
+ a = e;
93
+ },
94
+ paneOptions: s
95
+ }, { main: x, addressBookSection: S, detailsSection: C } = M(b);
96
+ d.appendChild(x);
97
+ function w() {
98
+ C.classList.remove("hidden");
99
+ }
100
+ b.showDetailsSection = w, b.detailsSection = C;
101
+ let T = c.createElement("ul");
102
+ T.setAttribute("role", "list"), T.setAttribute("aria-label", "People list"), b.ulPeople = T, b.dataBrowserContext && (b.dataBrowserContext.ulPeople = T);
103
+ let E = c.createElement("div");
104
+ E.classList.add("detailsSectionContent"), E.setAttribute("role", "region"), E.setAttribute("aria-labelledby", "detailsSectionContent"), E.setAttribute("aria-live", "polite"), b.detailsSectionContent = E;
105
+ let k = N(b);
106
+ S.appendChild(k);
107
+ let A = c.createElement("hr");
108
+ A.classList.add("dottedHr"), S.appendChild(A);
109
+ let { searchSection: j, searchInput: L } = P(b);
110
+ b.searchInput = L, S.appendChild(j);
111
+ let { buttonSection: R, ulGroups: z } = F(b);
112
+ b.ulGroups = z, S.appendChild(R);
113
+ let B = c.createElement("section");
114
+ B.classList.add("peopleSection"), S.appendChild(B), B.appendChild(T), C.appendChild(E);
115
+ let V = I(b);
116
+ S.appendChild(V), u(o, E).then(() => {
117
+ t("Async checkDataModel done.");
118
+ });
119
+ }
120
+ if (typeof document < "u" && document.location && ("" + document.location).slice(0, 16) === "http://localhost") {
121
+ let e = l.any(n, E.ns.acl("owner"));
122
+ e && (a = e);
123
+ }
124
+ return d;
125
+ }
126
+ }
127
+ };
128
+ async function A(e) {
129
+ let { dom: n, kb: r, ns: i, book: a, options: o, selectedGroups: s, dataBrowserContext: l } = e;
130
+ e.showDetailsSection(), e.detailsSectionContent.innerHTML = "";
131
+ let u = r.any(a, i.vcard("groupIndex"));
132
+ try {
133
+ await r.fetcher.load(u);
134
+ } catch (e) {
135
+ t("Error: Group index NOT loaded:" + e + "\n");
136
+ }
137
+ t(" Group index has been loaded\n");
138
+ let d = await E.widgets.askName(n, r, e.detailsSectionContent, E.ns.foaf("name"), i.vcard("Group"), "group");
139
+ if (!d) return;
140
+ let f;
141
+ try {
142
+ f = await c(a, d);
143
+ } catch (n) {
144
+ t("Error: can't save new group:" + n), e.detailsSectionContent.innerHTML = "Failed to save group" + n;
145
+ return;
146
+ }
147
+ for (let e in s) delete s[e];
148
+ s[f.uri] = !0;
149
+ let p = e.allGroupsLi, m = e.newGroupLi;
150
+ p.parentNode && p.parentNode.removeChild(p), m.parentNode && m.parentNode.removeChild(m), S(a, o, e.ulGroups, n, s, e.ulPeople, e.searchInput), e.ulGroups.insertBefore(p, e.ulGroups.firstChild), e.ulGroups.appendChild(m), v(e.ulGroups, s);
151
+ let h = Array.from(e.ulGroups.children).find((e) => e.subject && e.subject.uri === f.uri);
152
+ x(e.ulGroups, h ? h.querySelector("button") : null), _(e.ulPeople, null, !1), e.detailsSectionContent.innerHTML = "", e.detailsSectionContent.appendChild(E.aclControl.ACLControlBox5(f.doc(), l, "group", r, function(t, n) {
153
+ t || (e.detailsSectionContent.innerHTML = "Group sharing setup failed: " + n);
154
+ }));
155
+ }
156
+ function j(e, t, r) {
157
+ let { dom: i, kb: a, book: o, selectedGroups: c, dataBrowserContext: l } = e;
158
+ t.innerHTML = "", E.widgets.askName(i, a, t, E.ns.foaf("name"), r).then(async (t) => {
159
+ if (!t) return;
160
+ e.detailsSectionContent.innerHTML = "Indexing...";
161
+ let i;
162
+ try {
163
+ i = await s(o, t, c, r);
164
+ } catch {
165
+ n("Error saving contact. If it persists, contact your admin.");
166
+ return;
167
+ }
168
+ if (!i) {
169
+ e.detailsSectionContent.innerHTML = "";
170
+ return;
171
+ }
172
+ e.selectedPeople = {}, e.selectedPeople[i.uri] = !0, _(e.ulPeople, null), e.detailsSectionContent.innerHTML = "", e.detailsSectionContent.classList.add("detailsSectionContent--wide");
173
+ let a = l.session.paneRegistry.byName("contact").render(i, l);
174
+ a.classList.add("renderPane"), e.detailsSectionContent.appendChild(a);
175
+ });
176
+ }
177
+ function M(e) {
178
+ let { dom: t } = e, n = t.createElement("main");
179
+ n.id = "main-content", n.classList.add("addressBook-grid"), n.setAttribute("role", "main"), n.setAttribute("aria-label", "Address Book"), n.setAttribute("tabindex", "-1");
180
+ let r = t.createElement("section");
181
+ r.setAttribute("aria-labelledby", "addressBook-section"), r.classList.add("addressBookSection", "section-bg"), r.setAttribute("role", "region"), r.setAttribute("tabindex", "-1"), n.appendChild(r);
182
+ let i = t.createElement("section");
183
+ return i.classList.add("detailSection"), i.setAttribute("role", "region"), i.setAttribute("aria-label", "Details section"), i.classList.add("hidden"), n.appendChild(i), {
184
+ main: n,
185
+ addressBookSection: r,
186
+ detailsSection: i
187
+ };
188
+ }
189
+ function N(e) {
190
+ let { dom: t, ns: n, title: r, me: i, setMe: a, setActiveActionButton: o } = e, s = t.createElement("section");
191
+ s.classList.add("headerSection");
192
+ let c = t.createElement("header");
193
+ c.classList.add("mb-md");
194
+ let l = t.createElement("h2");
195
+ l.id = "addressBook-heading", l.setAttribute("tabindex", "-1"), l.textContent = r;
196
+ let u = t.createElement("button"), d = t.createElement("div");
197
+ u.setAttribute("type", "button"), i || u.setAttribute("disabled", "true"), T.checkUser().then((e) => {
198
+ e && (a(e), u.removeAttribute("disabled"));
199
+ }), d.appendChild(u), u.innerHTML = "+ New contact", u.classList.add("actionButton", "btn-primary", "action-button-focus");
200
+ let m = 0;
201
+ return u.addEventListener("click", async function(r) {
202
+ o(null), f(e.ulPeople);
203
+ let i = ++m;
204
+ if (e.showDetailsSection(), e.detailsSectionContent.innerHTML = "", e.detailsSectionContent.classList.remove("detailsSectionContent--wide"), await p(), i !== m) return;
205
+ e.detailsSectionContent.innerHTML = "";
206
+ let a = t.createElement("div");
207
+ a.classList.add("contactTypeChooser");
208
+ let s = t.createElement("label");
209
+ s.textContent = "Contact type: ", s.setAttribute("for", "contactTypeSelect"), a.appendChild(s);
210
+ let c = t.createElement("select");
211
+ c.id = "contactTypeSelect", c.classList.add("contactTypeSelect");
212
+ let l = t.createElement("option");
213
+ l.value = "Individual", l.textContent = "New person", c.appendChild(l);
214
+ let u = t.createElement("option");
215
+ u.value = "Organization", u.textContent = "New organization", c.appendChild(u), a.appendChild(c), e.detailsSectionContent.appendChild(a);
216
+ let d = t.createElement("p");
217
+ d.classList.add("contactCreationRemark"), d.textContent = "The new contact is added to the already selected group.", e.detailsSectionContent.appendChild(d);
218
+ let h = t.createElement("div");
219
+ h.classList.add("contactFormContainer"), e.detailsSectionContent.appendChild(h);
220
+ function g() {
221
+ return c.value === "Organization" ? n.vcard("Organization") : n.vcard("Individual");
222
+ }
223
+ j(e, h, g()), c.addEventListener("change", function() {
224
+ j(e, h, g());
225
+ });
226
+ }, !1), c.appendChild(l), c.appendChild(d), s.appendChild(c), s;
227
+ }
228
+ function P(e) {
229
+ let { dom: t } = e, n = t.createElement("section");
230
+ n.classList.add("searchSection");
231
+ let r = t.createElement("div");
232
+ r.classList.add("searchDiv"), n.appendChild(r);
233
+ let i = t.createElement("input");
234
+ 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);
235
+ let a = t.createElement("button");
236
+ return a.setAttribute("type", "button"), a.setAttribute("aria-label", "Clear search"), a.classList.add("searchClearButton", "hidden"), a.textContent = "✕", r.appendChild(a), i.addEventListener("input", function(t) {
237
+ let n = i.value.length > 0;
238
+ a.classList.toggle("hidden", !n), g(e.ulPeople, !0, e.detailsSectionContent);
239
+ }), a.addEventListener("click", function() {
240
+ i.value = "", a.classList.add("hidden"), i.focus(), g(e.ulPeople, !0, e.detailsSectionContent);
241
+ }), {
242
+ searchSection: n,
243
+ searchInput: i
244
+ };
245
+ }
246
+ function F(r) {
247
+ let { dom: i, kb: a, book: o, options: s, groupIndex: c, selectedGroups: l, actionButtons: u, setActiveActionButton: d } = r, p = i.createElement("section");
248
+ p.classList.add("buttonSection");
249
+ let m = i.createElement("ul");
250
+ if (m.classList.add("groupButtonsList"), m.setAttribute("role", "list"), m.setAttribute("aria-label", "Groups list"), s.foreignGroup && (l[s.foreignGroup.uri] = !0), o) {
251
+ r.allGroupsLi = i.createElement("li");
252
+ let t = i.createElement("button");
253
+ t.textContent = "All groups", t.classList.add("allGroupsButton", "actionButton", "btn-primary", "action-button-focus", "allGroupsButton--selected"), t.addEventListener("click", function(e) {
254
+ if (x(m, t), d(null), !Array.from(m.children).every(function(e) {
255
+ return e.subject ? !!l[e.subject.uri] : !0;
256
+ })) t.classList.add("allGroupsButton--loading"), t.setAttribute("aria-busy", "true"), b(l, m, function(e, i) {
257
+ if (!e) return n("Failed to select all groups. If it persists, contact admin.");
258
+ t.classList.remove("allGroupsButton--loading"), t.setAttribute("aria-busy", "false"), t.classList.add("allGroupsButton--active"), v(m, l), _(r.ulPeople, null);
259
+ });
260
+ else {
261
+ t.classList.remove("allGroupsButton--loading", "allGroupsButton--active"), t.setAttribute("aria-busy", "false"), t.classList.add("allGroupsButton--loaded");
262
+ for (let e in l) delete l[e];
263
+ v(m, l);
264
+ }
265
+ }), r.allGroupsLi.appendChild(t), m.appendChild(r.allGroupsLi), r.newGroupLi = i.createElement("li");
266
+ let h = i.createElement("button");
267
+ h.setAttribute("type", "button"), h.innerHTML = "+ New group", h.classList.add("allGroupsButton", "actionButton", "btn-secondary", "action-button-focus"), u.push(h), h.addEventListener("click", function(e) {
268
+ x(m, h), d(null), f(r.ulPeople), A(r);
269
+ }, !1), r.newGroupLi.appendChild(h), p.appendChild(m), c && a.fetcher.nowOrWhenFetched(c.uri, o, function(a, c) {
270
+ if (!a) {
271
+ e("Error loading group index. Stack: " + c), n("Error loading group index. If it persists, contact admin.");
272
+ return;
273
+ }
274
+ r.allGroupsLi.parentNode && r.allGroupsLi.parentNode.removeChild(r.allGroupsLi), r.newGroupLi.parentNode && r.newGroupLi.parentNode.removeChild(r.newGroupLi), S(o, s, m, i, l, r.ulPeople, r.searchInput), m.insertBefore(r.allGroupsLi, m.firstChild), m.appendChild(r.newGroupLi), t.classList.add("allGroupsButton--loading"), t.setAttribute("aria-busy", "true"), b(l, m, function(e, i) {
275
+ if (!e) return n("Failed to select all groups. If it persists, contact admin.");
276
+ t.classList.remove("allGroupsButton--loading"), t.setAttribute("aria-busy", "false"), t.classList.add("allGroupsButton--active"), v(m, l), _(r.ulPeople, null);
277
+ });
278
+ }), r.allGroupsLi.parentNode && r.allGroupsLi.parentNode.removeChild(r.allGroupsLi), r.newGroupLi.parentNode && r.newGroupLi.parentNode.removeChild(r.newGroupLi), y(o, m, s, i, l, r.ulPeople, r.searchInput, r.detailsSectionContent, r.dataBrowserContext, function() {
279
+ d(null), r.detailsSectionContent.querySelector(".contactTypeChooser, .contactFormContainer, .renderPane") || (r.detailsSectionContent.innerHTML = "", r.detailsSection.classList.add("hidden"));
280
+ }), m.insertBefore(r.allGroupsLi, m.firstChild), m.appendChild(r.newGroupLi);
281
+ } else S(o, s, m, i, l, r.ulPeople, r.searchInput), _(r.ulPeople, null), t("No book, only one group -> hide list of groups");
282
+ return {
283
+ buttonSection: p,
284
+ ulGroups: m
285
+ };
286
+ }
287
+ function I(a) {
288
+ let { dom: o, kb: s, ns: c, book: l, options: u, selectedGroups: p, actionButtons: g, setActiveActionButton: y, dataBrowserContext: C, div: T, me: D } = a, O = o.createElement("div");
289
+ if (O.classList.add("cardFooter"), l) {
290
+ let k = O.appendChild(o.createElement("button"));
291
+ k.setAttribute("type", "button"), k.innerHTML = "Groups", k.classList.add("actionButton", "btn-secondary", "action-button-focus"), g.push(k), k.addEventListener("click", async function(t) {
292
+ y(k), f(a.ulPeople), a.showDetailsSection(), a.detailsSectionContent.innerHTML = "", a.detailsSectionContent.classList.remove("detailsSectionContent--wide");
293
+ let r = o.createElement("h3");
294
+ r.textContent = "Your groups", a.detailsSectionContent.appendChild(r);
295
+ let g = o.createElement("p");
296
+ g.textContent = "When you delete a group it can happen that some contacts end up groupless.", a.detailsSectionContent.appendChild(g), g = o.createElement("p"), g.textContent = "To move contacts around, simply drag and drop them onto a group.", a.detailsSectionContent.appendChild(g);
297
+ let b;
298
+ try {
299
+ b = await h(l);
300
+ } catch (e) {
301
+ a.detailsSectionContent.appendChild(o.createTextNode("Failed to load groups: " + e));
302
+ return;
303
+ }
304
+ let C = o.createElement("ul");
305
+ C.setAttribute("role", "list"), C.setAttribute("aria-label", "All groups"), C.classList.add("groupButtonsList"), b && (b.sort((e, t) => {
306
+ let n = (s.any(e, c.vcard("fn")) || "").toString().toLowerCase(), r = (s.any(t, c.vcard("fn")) || "").toString().toLowerCase();
307
+ return n < r ? -1 : +(n > r);
308
+ }), b.forEach(function(t) {
309
+ let { groupLi: r, groupButton: c, name: f } = d(t);
310
+ c.addEventListener("click", function(r) {
311
+ if (r.preventDefault(), !r.metaKey) for (let e in p) delete p[e];
312
+ p[t.uri] = !p[t.uri], v(a.ulGroups, p);
313
+ let i = Array.from(a.ulGroups.children).find((e) => e.subject && e.subject.uri === t.uri);
314
+ x(a.ulGroups, i ? i.querySelector("button") : null), s.fetcher.nowOrWhenFetched(t.doc(), void 0, function(r, i) {
315
+ if (!r) return e("Cannot load group: " + t + ". Stack: " + i), n("Failed to load group details. If it persists, contact your admin.");
316
+ _(a.ulPeople, null, !1);
317
+ });
318
+ }, !1), E.widgets.makeDropTarget(r, (e) => m(e, t)), D && E.widgets.deleteButtonWithCheck(o, r, "group " + f, async function() {
319
+ await i(t), delete p[t.uri];
320
+ let e = a.allGroupsLi, n = a.newGroupLi;
321
+ e.parentNode && e.parentNode.removeChild(e), n.parentNode && n.parentNode.removeChild(n), S(l, u, a.ulGroups, o, p, a.ulPeople, a.searchInput), a.ulGroups.insertBefore(e, a.ulGroups.firstChild), a.ulGroups.appendChild(n), v(a.ulGroups, p), _(a.ulPeople, null, !1), k.click();
322
+ }), C.appendChild(r);
323
+ })), a.detailsSectionContent.appendChild(C);
324
+ let w = o.createElement("button");
325
+ w.setAttribute("type", "button"), w.innerHTML = "+ New group", w.classList.add("actionButton", "btn-primary", "action-button-focus", "newGroupBtn"), w.addEventListener("click", function() {
326
+ A(a);
327
+ }, !1), a.detailsSectionContent.appendChild(w);
328
+ });
329
+ let j = O.appendChild(o.createElement("button"));
330
+ j.setAttribute("type", "button"), j.innerHTML = "Sharing", j.classList.add("actionButton", "btn-secondary", "action-button-focus"), g.push(j), j.addEventListener("click", function(n) {
331
+ y(j), f(a.ulPeople), a.showDetailsSection(), a.detailsSectionContent.innerHTML = "", a.detailsSectionContent.classList.remove("detailsSectionContent--wide");
332
+ let i = o.createElement("h3");
333
+ i.textContent = "Sharing", a.detailsSectionContent.appendChild(i), a.detailsSectionContent.appendChild(E.aclControl.ACLControlBox5(l.dir(), C, "book", s, function(t, n) {
334
+ t || (e("ACL control box Failed. Stack: " + n), r(a.detailsSectionContent, o, "Problem displaying sharing controls. If persists, contact admin."));
335
+ }));
336
+ let u = {
337
+ target: l,
338
+ me: D,
339
+ noun: "address book",
340
+ div: a.detailsSectionContent,
341
+ dom: o,
342
+ statusRegion: T
343
+ };
344
+ E.login.registrationControl(u, l, c.vcard("AddressBook")).then(() => t("Registration control finished.")).catch((t) => {
345
+ e("Error in registration control. Stack: " + t), r(a.detailsSectionContent, o, "Problem displaying findable controls. If persists, contact admin.");
346
+ });
347
+ });
348
+ let M = O.appendChild(o.createElement("button"));
349
+ M.setAttribute("type", "button"), M.innerHTML = "Tools", M.classList.add("actionButton", "btn-secondary", "action-button-focus"), g.push(M), M.addEventListener("click", function(e) {
350
+ y(M), f(a.ulPeople), a.showDetailsSection(), a.detailsSectionContent.innerHTML = "", a.detailsSectionContent.classList.add("detailsSectionContent--wide"), a.detailsSectionContent.appendChild(w(b, p, a.ulGroups, l, C, D, function() {
351
+ a.allGroupsLi.parentNode && a.allGroupsLi.parentNode.removeChild(a.allGroupsLi), a.newGroupLi.parentNode && a.newGroupLi.parentNode.removeChild(a.newGroupLi), S(l, u, a.ulGroups, o, p, a.ulPeople, a.searchInput), a.ulGroups.insertBefore(a.allGroupsLi, a.ulGroups.firstChild), a.ulGroups.appendChild(a.newGroupLi), v(a.ulGroups, p);
352
+ }));
353
+ });
354
+ }
355
+ return O;
356
+ }
357
+ //#endregion
358
+ export { k as default };
359
+
360
+ //# sourceMappingURL=contactsPane.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contactsPane.esm.js","names":["debug.log"],"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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"}
@@ -0,0 +1,14 @@
1
+ //#region src/debug.js
2
+ function e(...e) {
3
+ console.log(...e);
4
+ }
5
+ function t(...e) {
6
+ console.warn(...e);
7
+ }
8
+ function n(...e) {
9
+ console.error(...e);
10
+ }
11
+ //#endregion
12
+ export { n as error, e as log, t as warn };
13
+
14
+ //# sourceMappingURL=debug.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.esm.js","names":[],"sources":["../src/debug.js"],"sourcesContent":["/* eslint-disable no-console */\n\nexport function log (...args) {\n console.log(...args)\n}\n\nexport function warn (...args) {\n console.warn(...args)\n}\n\nexport function error (...args) {\n console.error(...args)\n}\n\nexport function trace (...args) {\n console.trace(...args)\n}\n"],"mappings":";AAEA,SAAgB,EAAK,GAAG,GAAM;CAC5B,QAAQ,IAAI,GAAG,CAAI;AACrB;AAEA,SAAgB,EAAM,GAAG,GAAM;CAC7B,QAAQ,KAAK,GAAG,CAAI;AACtB;AAEA,SAAgB,EAAO,GAAG,GAAM;CAC9B,QAAQ,MAAM,GAAG,CAAI;AACvB"}