@sneat/contactus-shared 0.2.0

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 (320) hide show
  1. package/esm2022/index.js +4 -0
  2. package/esm2022/index.js.map +1 -0
  3. package/esm2022/lib/components/address-form/address-form.component.js +182 -0
  4. package/esm2022/lib/components/address-form/address-form.component.js.map +1 -0
  5. package/esm2022/lib/components/address-form/index.js +2 -0
  6. package/esm2022/lib/components/address-form/index.js.map +1 -0
  7. package/esm2022/lib/components/basic-contact-form/basic-contact-form.component.js +71 -0
  8. package/esm2022/lib/components/basic-contact-form/basic-contact-form.component.js.map +1 -0
  9. package/esm2022/lib/components/basic-contact-form/index.js +2 -0
  10. package/esm2022/lib/components/basic-contact-form/index.js.map +1 -0
  11. package/esm2022/lib/components/contact-comm-channels/comm-channel-form.component.js +90 -0
  12. package/esm2022/lib/components/contact-comm-channels/comm-channel-form.component.js.map +1 -0
  13. package/esm2022/lib/components/contact-comm-channels/comm-channel-item.component.js +128 -0
  14. package/esm2022/lib/components/contact-comm-channels/comm-channel-item.component.js.map +1 -0
  15. package/esm2022/lib/components/contact-comm-channels/comm-channels-list.component.js +30 -0
  16. package/esm2022/lib/components/contact-comm-channels/comm-channels-list.component.js.map +1 -0
  17. package/esm2022/lib/components/contact-comm-channels/contact-comm-channels.component.js +16 -0
  18. package/esm2022/lib/components/contact-comm-channels/contact-comm-channels.component.js.map +1 -0
  19. package/esm2022/lib/components/contact-comm-channels/contact-emails.component.js +30 -0
  20. package/esm2022/lib/components/contact-comm-channels/contact-emails.component.js.map +1 -0
  21. package/esm2022/lib/components/contact-comm-channels/contact-phones.component.js +30 -0
  22. package/esm2022/lib/components/contact-comm-channels/contact-phones.component.js.map +1 -0
  23. package/esm2022/lib/components/contact-comm-channels/index.js +2 -0
  24. package/esm2022/lib/components/contact-comm-channels/index.js.map +1 -0
  25. package/esm2022/lib/components/contact-details/contact-details.component.js +235 -0
  26. package/esm2022/lib/components/contact-details/contact-details.component.js.map +1 -0
  27. package/esm2022/lib/components/contact-details/index.js +2 -0
  28. package/esm2022/lib/components/contact-details/index.js.map +1 -0
  29. package/esm2022/lib/components/contact-details/related-contacts.component.js +116 -0
  30. package/esm2022/lib/components/contact-details/related-contacts.component.js.map +1 -0
  31. package/esm2022/lib/components/contact-dob/contact-dob.component.js +57 -0
  32. package/esm2022/lib/components/contact-dob/contact-dob.component.js.map +1 -0
  33. package/esm2022/lib/components/contact-dob/index.js +2 -0
  34. package/esm2022/lib/components/contact-dob/index.js.map +1 -0
  35. package/esm2022/lib/components/contact-events.js +2 -0
  36. package/esm2022/lib/components/contact-events.js.map +1 -0
  37. package/esm2022/lib/components/contact-forms/contact-form-base.component.js +30 -0
  38. package/esm2022/lib/components/contact-forms/contact-form-base.component.js.map +1 -0
  39. package/esm2022/lib/components/contact-forms/emails-form/emails-form.component.js +76 -0
  40. package/esm2022/lib/components/contact-forms/emails-form/emails-form.component.js.map +1 -0
  41. package/esm2022/lib/components/contact-forms/emails-form/index.js +2 -0
  42. package/esm2022/lib/components/contact-forms/emails-form/index.js.map +1 -0
  43. package/esm2022/lib/components/contact-forms/index.js +11 -0
  44. package/esm2022/lib/components/contact-forms/index.js.map +1 -0
  45. package/esm2022/lib/components/contact-forms/location-form/index.js +2 -0
  46. package/esm2022/lib/components/contact-forms/location-form/index.js.map +1 -0
  47. package/esm2022/lib/components/contact-forms/location-form/location-form.component.js +194 -0
  48. package/esm2022/lib/components/contact-forms/location-form/location-form.component.js.map +1 -0
  49. package/esm2022/lib/components/contact-forms/new-contact/index.js +5 -0
  50. package/esm2022/lib/components/contact-forms/new-contact/index.js.map +1 -0
  51. package/esm2022/lib/components/contact-forms/new-contact/new-company-form.component.js +115 -0
  52. package/esm2022/lib/components/contact-forms/new-contact/new-company-form.component.js.map +1 -0
  53. package/esm2022/lib/components/contact-forms/new-contact/new-contact-form-base.component.js +34 -0
  54. package/esm2022/lib/components/contact-forms/new-contact/new-contact-form-base.component.js.map +1 -0
  55. package/esm2022/lib/components/contact-forms/new-contact/new-contact-form.component.js +82 -0
  56. package/esm2022/lib/components/contact-forms/new-contact/new-contact-form.component.js.map +1 -0
  57. package/esm2022/lib/components/contact-forms/new-contact/new-person-form.component.js +282 -0
  58. package/esm2022/lib/components/contact-forms/new-contact/new-person-form.component.js.map +1 -0
  59. package/esm2022/lib/components/contact-forms/new-contact/new-pet-form.component.js +25 -0
  60. package/esm2022/lib/components/contact-forms/new-contact/new-pet-form.component.js.map +1 -0
  61. package/esm2022/lib/components/contact-forms/person-forms/age-group/age-group-form.component.js +64 -0
  62. package/esm2022/lib/components/contact-forms/person-forms/age-group/age-group-form.component.js.map +1 -0
  63. package/esm2022/lib/components/contact-forms/person-forms/age-group/index.js +2 -0
  64. package/esm2022/lib/components/contact-forms/person-forms/age-group/index.js.map +1 -0
  65. package/esm2022/lib/components/contact-forms/person-forms/gender-form/gender-form.component.js +118 -0
  66. package/esm2022/lib/components/contact-forms/person-forms/gender-form/gender-form.component.js.map +1 -0
  67. package/esm2022/lib/components/contact-forms/person-forms/gender-form/index.js +2 -0
  68. package/esm2022/lib/components/contact-forms/person-forms/gender-form/index.js.map +1 -0
  69. package/esm2022/lib/components/contact-forms/person-forms/names-form/index.js +2 -0
  70. package/esm2022/lib/components/contact-forms/person-forms/names-form/index.js.map +1 -0
  71. package/esm2022/lib/components/contact-forms/person-forms/names-form/names-form.component.js +296 -0
  72. package/esm2022/lib/components/contact-forms/person-forms/names-form/names-form.component.js.map +1 -0
  73. package/esm2022/lib/components/contact-forms/pesson-wizard/index.js +2 -0
  74. package/esm2022/lib/components/contact-forms/pesson-wizard/index.js.map +1 -0
  75. package/esm2022/lib/components/contact-forms/pesson-wizard/person-wizard.component.js +369 -0
  76. package/esm2022/lib/components/contact-forms/pesson-wizard/person-wizard.component.js.map +1 -0
  77. package/esm2022/lib/components/contact-forms/pet-kind-and-breed-form/index.js +2 -0
  78. package/esm2022/lib/components/contact-forms/pet-kind-and-breed-form/index.js.map +1 -0
  79. package/esm2022/lib/components/contact-forms/pet-kind-and-breed-form/pet-kind-and-breed-form.component.js +66 -0
  80. package/esm2022/lib/components/contact-forms/pet-kind-and-breed-form/pet-kind-and-breed-form.component.js.map +1 -0
  81. package/esm2022/lib/components/contact-forms/phones-form/index.js +2 -0
  82. package/esm2022/lib/components/contact-forms/phones-form/index.js.map +1 -0
  83. package/esm2022/lib/components/contact-forms/phones-form/phones-form.component.js +79 -0
  84. package/esm2022/lib/components/contact-forms/phones-form/phones-form.component.js.map +1 -0
  85. package/esm2022/lib/components/contact-forms/relationship-form/contact-relationship-form.component.js +125 -0
  86. package/esm2022/lib/components/contact-forms/relationship-form/contact-relationship-form.component.js.map +1 -0
  87. package/esm2022/lib/components/contact-forms/relationship-form/index.js +2 -0
  88. package/esm2022/lib/components/contact-forms/relationship-form/index.js.map +1 -0
  89. package/esm2022/lib/components/contact-forms/relationship-form/relationship-form.component.js +136 -0
  90. package/esm2022/lib/components/contact-forms/relationship-form/relationship-form.component.js.map +1 -0
  91. package/esm2022/lib/components/contact-forms/role-form/contact-role-form.component.js +98 -0
  92. package/esm2022/lib/components/contact-forms/role-form/contact-role-form.component.js.map +1 -0
  93. package/esm2022/lib/components/contact-forms/role-form/index.js +2 -0
  94. package/esm2022/lib/components/contact-forms/role-form/index.js.map +1 -0
  95. package/esm2022/lib/components/contact-forms/roles-form/index.js +2 -0
  96. package/esm2022/lib/components/contact-forms/roles-form/index.js.map +1 -0
  97. package/esm2022/lib/components/contact-forms/roles-form/roles-form.component.js +59 -0
  98. package/esm2022/lib/components/contact-forms/roles-form/roles-form.component.js.map +1 -0
  99. package/esm2022/lib/components/contact-forms/space-related-form.component.js +32 -0
  100. package/esm2022/lib/components/contact-forms/space-related-form.component.js.map +1 -0
  101. package/esm2022/lib/components/contact-input/contact-input.component.js +151 -0
  102. package/esm2022/lib/components/contact-input/contact-input.component.js.map +1 -0
  103. package/esm2022/lib/components/contact-input/index.js +2 -0
  104. package/esm2022/lib/components/contact-input/index.js.map +1 -0
  105. package/esm2022/lib/components/contact-locations/contact-locations.component.js +52 -0
  106. package/esm2022/lib/components/contact-locations/contact-locations.component.js.map +1 -0
  107. package/esm2022/lib/components/contact-locations/index.js +2 -0
  108. package/esm2022/lib/components/contact-locations/index.js.map +1 -0
  109. package/esm2022/lib/components/contact-modules-menu/contact-modules-menu.component.js +29 -0
  110. package/esm2022/lib/components/contact-modules-menu/contact-modules-menu.component.js.map +1 -0
  111. package/esm2022/lib/components/contact-modules-menu/index.js +2 -0
  112. package/esm2022/lib/components/contact-modules-menu/index.js.map +1 -0
  113. package/esm2022/lib/components/contact-role-badges/contact-role-badges.component.js +44 -0
  114. package/esm2022/lib/components/contact-role-badges/contact-role-badges.component.js.map +1 -0
  115. package/esm2022/lib/components/contact-roles-input/contact-roles-input.component.js +37 -0
  116. package/esm2022/lib/components/contact-roles-input/contact-roles-input.component.js.map +1 -0
  117. package/esm2022/lib/components/contact-roles-input/index.js +2 -0
  118. package/esm2022/lib/components/contact-roles-input/index.js.map +1 -0
  119. package/esm2022/lib/components/contacts-by-type/contacts-by-type.component.js +200 -0
  120. package/esm2022/lib/components/contacts-by-type/contacts-by-type.component.js.map +1 -0
  121. package/esm2022/lib/components/contacts-by-type/index.js +2 -0
  122. package/esm2022/lib/components/contacts-by-type/index.js.map +1 -0
  123. package/esm2022/lib/components/contacts-checklist/contacts-checklist-item.component.js +32 -0
  124. package/esm2022/lib/components/contacts-checklist/contacts-checklist-item.component.js.map +1 -0
  125. package/esm2022/lib/components/contacts-checklist/contacts-checklist.component.js +140 -0
  126. package/esm2022/lib/components/contacts-checklist/contacts-checklist.component.js.map +1 -0
  127. package/esm2022/lib/components/contacts-checklist/index.js +2 -0
  128. package/esm2022/lib/components/contacts-checklist/index.js.map +1 -0
  129. package/esm2022/lib/components/contacts-component/contacts.component.js +200 -0
  130. package/esm2022/lib/components/contacts-component/contacts.component.js.map +1 -0
  131. package/esm2022/lib/components/contacts-component.commands.js +2 -0
  132. package/esm2022/lib/components/contacts-component.commands.js.map +1 -0
  133. package/esm2022/lib/components/contacts-list/contacts-list.component.js +32 -0
  134. package/esm2022/lib/components/contacts-list/contacts-list.component.js.map +1 -0
  135. package/esm2022/lib/components/contacts-list/index.js +3 -0
  136. package/esm2022/lib/components/contacts-list/index.js.map +1 -0
  137. package/esm2022/lib/components/contacts-list-item/contacts-list-item.component.js +138 -0
  138. package/esm2022/lib/components/contacts-list-item/contacts-list-item.component.js.map +1 -0
  139. package/esm2022/lib/components/contacts-list-item/related-as.component.js +34 -0
  140. package/esm2022/lib/components/contacts-list-item/related-as.component.js.map +1 -0
  141. package/esm2022/lib/components/contacts-selector/contacts-selector-input.component.js +91 -0
  142. package/esm2022/lib/components/contacts-selector/contacts-selector-input.component.js.map +1 -0
  143. package/esm2022/lib/components/contacts-selector/contacts-selector.component.js +415 -0
  144. package/esm2022/lib/components/contacts-selector/contacts-selector.component.js.map +1 -0
  145. package/esm2022/lib/components/contacts-selector/contacts-selector.interfaces.js +2 -0
  146. package/esm2022/lib/components/contacts-selector/contacts-selector.interfaces.js.map +1 -0
  147. package/esm2022/lib/components/contacts-selector/contacts-selector.module.js +28 -0
  148. package/esm2022/lib/components/contacts-selector/contacts-selector.module.js.map +1 -0
  149. package/esm2022/lib/components/contacts-selector/contacts-selector.service.js +18 -0
  150. package/esm2022/lib/components/contacts-selector/contacts-selector.service.js.map +1 -0
  151. package/esm2022/lib/components/contacts-selector/lib-exports.js +6 -0
  152. package/esm2022/lib/components/contacts-selector/lib-exports.js.map +1 -0
  153. package/esm2022/lib/components/contactus-module.base.component.js +4 -0
  154. package/esm2022/lib/components/contactus-module.base.component.js.map +1 -0
  155. package/esm2022/lib/components/inlist-options/inlist-age-group.component.js +53 -0
  156. package/esm2022/lib/components/inlist-options/inlist-age-group.component.js.map +1 -0
  157. package/esm2022/lib/components/inlist-options/inlist-options.component.js +27 -0
  158. package/esm2022/lib/components/inlist-options/inlist-options.component.js.map +1 -0
  159. package/esm2022/lib/components/invite-links/invite-links.component.js +87 -0
  160. package/esm2022/lib/components/invite-links/invite-links.component.js.map +1 -0
  161. package/esm2022/lib/components/lib-exports.js +29 -0
  162. package/esm2022/lib/components/lib-exports.js.map +1 -0
  163. package/esm2022/lib/components/members-as-badges/contacts-as-badges.component.js +39 -0
  164. package/esm2022/lib/components/members-as-badges/contacts-as-badges.component.js.map +1 -0
  165. package/esm2022/lib/components/members-as-badges/index.js +2 -0
  166. package/esm2022/lib/components/members-as-badges/index.js.map +1 -0
  167. package/esm2022/lib/components/members-by-role/family-members.component.js +180 -0
  168. package/esm2022/lib/components/members-by-role/family-members.component.js.map +1 -0
  169. package/esm2022/lib/components/members-by-role/index.js +4 -0
  170. package/esm2022/lib/components/members-by-role/index.js.map +1 -0
  171. package/esm2022/lib/components/members-by-role/member-group.js +2 -0
  172. package/esm2022/lib/components/members-by-role/member-group.js.map +1 -0
  173. package/esm2022/lib/components/members-by-role/members-by-role.component.js +34 -0
  174. package/esm2022/lib/components/members-by-role/members-by-role.component.js.map +1 -0
  175. package/esm2022/lib/components/members-card-header/members-card-header.component.js +33 -0
  176. package/esm2022/lib/components/members-card-header/members-card-header.component.js.map +1 -0
  177. package/esm2022/lib/components/members-list/index.js +2 -0
  178. package/esm2022/lib/components/members-list/index.js.map +1 -0
  179. package/esm2022/lib/components/members-list/members-list.component.js +164 -0
  180. package/esm2022/lib/components/members-list/members-list.component.js.map +1 -0
  181. package/esm2022/lib/components/members-short-list-card/members-short-list-card.component.js +60 -0
  182. package/esm2022/lib/components/members-short-list-card/members-short-list-card.component.js.map +1 -0
  183. package/esm2022/lib/components/shared-with/index.js +2 -0
  184. package/esm2022/lib/components/shared-with/index.js.map +1 -0
  185. package/esm2022/lib/components/shared-with/shared-with.component.js +25 -0
  186. package/esm2022/lib/components/shared-with/shared-with.component.js.map +1 -0
  187. package/esm2022/lib/components/with-new-contact-input.js +18 -0
  188. package/esm2022/lib/components/with-new-contact-input.js.map +1 -0
  189. package/esm2022/lib/constants.js +2 -0
  190. package/esm2022/lib/constants.js.map +1 -0
  191. package/esm2022/lib/index.js +3 -0
  192. package/esm2022/lib/index.js.map +1 -0
  193. package/esm2022/lib/modals/contact-names-modal/contact-names-modal.component.js +88 -0
  194. package/esm2022/lib/modals/contact-names-modal/contact-names-modal.component.js.map +1 -0
  195. package/esm2022/lib/modals/invite-modal/index.js +2 -0
  196. package/esm2022/lib/modals/invite-modal/index.js.map +1 -0
  197. package/esm2022/lib/modals/invite-modal/invite-modal.component.js +255 -0
  198. package/esm2022/lib/modals/invite-modal/invite-modal.component.js.map +1 -0
  199. package/esm2022/lib/pipes/contact-title.pipe.js +25 -0
  200. package/esm2022/lib/pipes/contact-title.pipe.js.map +1 -0
  201. package/esm2022/lib/pipes/index.js +4 -0
  202. package/esm2022/lib/pipes/index.js.map +1 -0
  203. package/esm2022/lib/pipes/person-title.pipe.js +21 -0
  204. package/esm2022/lib/pipes/person-title.pipe.js.map +1 -0
  205. package/esm2022/lib/pipes/selected-contacts.pipe.js +22 -0
  206. package/esm2022/lib/pipes/selected-contacts.pipe.js.map +1 -0
  207. package/esm2022/lib/providers/user-space-brief.provider.js +30 -0
  208. package/esm2022/lib/providers/user-space-brief.provider.js.map +1 -0
  209. package/esm2022/lib/ui-types.js +2 -0
  210. package/esm2022/lib/ui-types.js.map +1 -0
  211. package/esm2022/sneat-contactus-shared.js +5 -0
  212. package/esm2022/sneat-contactus-shared.js.map +1 -0
  213. package/index.d.ts +3 -0
  214. package/lib/components/address-form/address-form.component.d.ts +51 -0
  215. package/lib/components/address-form/index.d.ts +1 -0
  216. package/lib/components/basic-contact-form/basic-contact-form.component.d.ts +20 -0
  217. package/lib/components/basic-contact-form/index.d.ts +1 -0
  218. package/lib/components/contact-comm-channels/comm-channel-form.component.d.ts +20 -0
  219. package/lib/components/contact-comm-channels/comm-channel-item.component.d.ts +24 -0
  220. package/lib/components/contact-comm-channels/comm-channels-list.component.d.ts +15 -0
  221. package/lib/components/contact-comm-channels/contact-comm-channels.component.d.ts +7 -0
  222. package/lib/components/contact-comm-channels/contact-emails.component.d.ts +9 -0
  223. package/lib/components/contact-comm-channels/contact-phones.component.d.ts +9 -0
  224. package/lib/components/contact-comm-channels/index.d.ts +1 -0
  225. package/lib/components/contact-details/contact-details.component.d.ts +32 -0
  226. package/lib/components/contact-details/index.d.ts +1 -0
  227. package/lib/components/contact-details/related-contacts.component.d.ts +24 -0
  228. package/lib/components/contact-dob/contact-dob.component.d.ts +13 -0
  229. package/lib/components/contact-dob/index.d.ts +1 -0
  230. package/lib/components/contact-events.d.ts +6 -0
  231. package/lib/components/contact-forms/contact-form-base.component.d.ts +15 -0
  232. package/lib/components/contact-forms/emails-form/emails-form.component.d.ts +27 -0
  233. package/lib/components/contact-forms/emails-form/index.d.ts +1 -0
  234. package/lib/components/contact-forms/index.d.ts +10 -0
  235. package/lib/components/contact-forms/location-form/index.d.ts +1 -0
  236. package/lib/components/contact-forms/location-form/location-form.component.d.ts +39 -0
  237. package/lib/components/contact-forms/new-contact/index.d.ts +4 -0
  238. package/lib/components/contact-forms/new-contact/new-company-form.component.d.ts +26 -0
  239. package/lib/components/contact-forms/new-contact/new-contact-form-base.component.d.ts +15 -0
  240. package/lib/components/contact-forms/new-contact/new-contact-form.component.d.ts +20 -0
  241. package/lib/components/contact-forms/new-contact/new-person-form.component.d.ts +51 -0
  242. package/lib/components/contact-forms/new-contact/new-pet-form.component.d.ts +8 -0
  243. package/lib/components/contact-forms/person-forms/age-group/age-group-form.component.d.ts +17 -0
  244. package/lib/components/contact-forms/person-forms/age-group/index.d.ts +1 -0
  245. package/lib/components/contact-forms/person-forms/gender-form/gender-form.component.d.ts +22 -0
  246. package/lib/components/contact-forms/person-forms/gender-form/index.d.ts +1 -0
  247. package/lib/components/contact-forms/person-forms/names-form/index.d.ts +1 -0
  248. package/lib/components/contact-forms/person-forms/names-form/names-form.component.d.ts +63 -0
  249. package/lib/components/contact-forms/pesson-wizard/index.d.ts +1 -0
  250. package/lib/components/contact-forms/pesson-wizard/person-wizard.component.d.ts +63 -0
  251. package/lib/components/contact-forms/pet-kind-and-breed-form/index.d.ts +1 -0
  252. package/lib/components/contact-forms/pet-kind-and-breed-form/pet-kind-and-breed-form.component.d.ts +14 -0
  253. package/lib/components/contact-forms/phones-form/index.d.ts +1 -0
  254. package/lib/components/contact-forms/phones-form/phones-form.component.d.ts +21 -0
  255. package/lib/components/contact-forms/relationship-form/contact-relationship-form.component.d.ts +24 -0
  256. package/lib/components/contact-forms/relationship-form/index.d.ts +1 -0
  257. package/lib/components/contact-forms/relationship-form/relationship-form.component.d.ts +34 -0
  258. package/lib/components/contact-forms/role-form/contact-role-form.component.d.ts +33 -0
  259. package/lib/components/contact-forms/role-form/index.d.ts +1 -0
  260. package/lib/components/contact-forms/roles-form/index.d.ts +1 -0
  261. package/lib/components/contact-forms/roles-form/roles-form.component.d.ts +21 -0
  262. package/lib/components/contact-forms/space-related-form.component.d.ts +11 -0
  263. package/lib/components/contact-input/contact-input.component.d.ts +36 -0
  264. package/lib/components/contact-input/index.d.ts +1 -0
  265. package/lib/components/contact-locations/contact-locations.component.d.ts +14 -0
  266. package/lib/components/contact-locations/index.d.ts +1 -0
  267. package/lib/components/contact-modules-menu/contact-modules-menu.component.d.ts +12 -0
  268. package/lib/components/contact-modules-menu/index.d.ts +1 -0
  269. package/lib/components/contact-role-badges/contact-role-badges.component.d.ts +12 -0
  270. package/lib/components/contact-roles-input/contact-roles-input.component.d.ts +18 -0
  271. package/lib/components/contact-roles-input/index.d.ts +1 -0
  272. package/lib/components/contacts-by-type/contacts-by-type.component.d.ts +38 -0
  273. package/lib/components/contacts-by-type/index.d.ts +1 -0
  274. package/lib/components/contacts-checklist/contacts-checklist-item.component.d.ts +21 -0
  275. package/lib/components/contacts-checklist/contacts-checklist.component.d.ts +40 -0
  276. package/lib/components/contacts-checklist/index.d.ts +1 -0
  277. package/lib/components/contacts-component/contacts.component.d.ts +45 -0
  278. package/lib/components/contacts-component.commands.d.ts +5 -0
  279. package/lib/components/contacts-list/contacts-list.component.d.ts +11 -0
  280. package/lib/components/contacts-list/index.d.ts +2 -0
  281. package/lib/components/contacts-list-item/contacts-list-item.component.d.ts +29 -0
  282. package/lib/components/contacts-list-item/related-as.component.d.ts +16 -0
  283. package/lib/components/contacts-selector/contacts-selector-input.component.d.ts +24 -0
  284. package/lib/components/contacts-selector/contacts-selector.component.d.ts +80 -0
  285. package/lib/components/contacts-selector/contacts-selector.interfaces.d.ts +22 -0
  286. package/lib/components/contacts-selector/contacts-selector.module.d.ts +6 -0
  287. package/lib/components/contacts-selector/contacts-selector.service.d.ts +10 -0
  288. package/lib/components/contacts-selector/lib-exports.d.ts +5 -0
  289. package/lib/components/contactus-module.base.component.d.ts +4 -0
  290. package/lib/components/inlist-options/inlist-age-group.component.d.ts +12 -0
  291. package/lib/components/inlist-options/inlist-options.component.d.ts +18 -0
  292. package/lib/components/invite-links/invite-links.component.d.ts +28 -0
  293. package/lib/components/lib-exports.d.ts +27 -0
  294. package/lib/components/members-as-badges/contacts-as-badges.component.d.ts +18 -0
  295. package/lib/components/members-as-badges/index.d.ts +1 -0
  296. package/lib/components/members-by-role/family-members.component.d.ts +21 -0
  297. package/lib/components/members-by-role/index.d.ts +3 -0
  298. package/lib/components/members-by-role/member-group.d.ts +9 -0
  299. package/lib/components/members-by-role/members-by-role.component.d.ts +12 -0
  300. package/lib/components/members-card-header/members-card-header.component.d.ts +13 -0
  301. package/lib/components/members-list/index.d.ts +1 -0
  302. package/lib/components/members-list/members-list.component.d.ts +32 -0
  303. package/lib/components/members-short-list-card/members-short-list-card.component.d.ts +12 -0
  304. package/lib/components/shared-with/index.d.ts +1 -0
  305. package/lib/components/shared-with/shared-with.component.d.ts +6 -0
  306. package/lib/components/with-new-contact-input.d.ts +10 -0
  307. package/lib/constants.d.ts +13 -0
  308. package/lib/index.d.ts +2 -0
  309. package/lib/modals/contact-names-modal/contact-names-modal.component.d.ts +15 -0
  310. package/lib/modals/invite-modal/index.d.ts +1 -0
  311. package/lib/modals/invite-modal/invite-modal.component.d.ts +49 -0
  312. package/lib/pipes/contact-title.pipe.d.ts +10 -0
  313. package/lib/pipes/index.d.ts +3 -0
  314. package/lib/pipes/person-title.pipe.d.ts +9 -0
  315. package/lib/pipes/selected-contacts.pipe.d.ts +8 -0
  316. package/lib/providers/user-space-brief.provider.d.ts +12 -0
  317. package/lib/ui-types.d.ts +9 -0
  318. package/package.json +27 -0
  319. package/sneat-contactus-shared.d.ts +5 -0
  320. package/tsconfig.lib.prod.tsbuildinfo +1 -0
@@ -0,0 +1,180 @@
1
+ import { Component, EventEmitter, Input, Output, } from '@angular/core';
2
+ import { SpaceMemberTypeEnum } from '@sneat/auth-models';
3
+ import { addSpace, MemberGroupTypeAdults, MemberGroupTypeKids, MemberGroupTypeOther, MemberGroupTypePets, } from '@sneat/contactus-core';
4
+ import { WithSpaceInput } from '@sneat/space-services';
5
+ import { ClassName } from '@sneat/ui';
6
+ import { MembersByRoleComponent } from '../members-by-role/members-by-role.component';
7
+ import { zipMapBriefsWithIDs } from '@sneat/space-models';
8
+ import * as i0 from "@angular/core";
9
+ export class FamilyMembersComponent extends WithSpaceInput {
10
+ constructor() {
11
+ super(...arguments);
12
+ this.addMember = new EventEmitter();
13
+ this.adults = {
14
+ id: MemberGroupTypeAdults,
15
+ emoji: '🧓',
16
+ role: 'adult',
17
+ plural: 'Adults',
18
+ addLabel: 'Add adult',
19
+ };
20
+ this.children = {
21
+ id: MemberGroupTypeKids,
22
+ emoji: '🚸',
23
+ role: 'child',
24
+ plural: 'Children',
25
+ addLabel: 'Add child',
26
+ };
27
+ this.pets = {
28
+ id: MemberGroupTypePets,
29
+ emoji: '🐕',
30
+ plural: 'Pets',
31
+ addLabel: 'Add pet',
32
+ role: 'animal',
33
+ };
34
+ this.other = {
35
+ id: MemberGroupTypeOther,
36
+ emoji: '👻',
37
+ plural: 'Other',
38
+ addLabel: '',
39
+ role: 'other',
40
+ };
41
+ this.predefinedMemberGroups = [
42
+ this.adults,
43
+ this.children,
44
+ this.pets,
45
+ this.other,
46
+ ];
47
+ this.processContactusSpaceDbo = (contactusSpaceDbo) => {
48
+ // 'MembersPageComponent.processContactusSpaceDbo()',
49
+ // contactusSpaceDbo,
50
+ const space = this.$space();
51
+ this.members = zipMapBriefsWithIDs(contactusSpaceDbo?.contacts).map((m) => Object.assign(m, { space }));
52
+ this.processMembers();
53
+ };
54
+ }
55
+ ngOnChanges(changes) {
56
+ if (changes['contactusSpaceDbo']) {
57
+ this.processContactusSpaceDbo(this.contactusSpaceDbo);
58
+ }
59
+ }
60
+ processMembers() {
61
+ const space = this.$space();
62
+ if (!space) {
63
+ throw new Error('!this.$space()');
64
+ }
65
+ const adults = [];
66
+ const children = [];
67
+ const pets = [];
68
+ const other = [];
69
+ // this.adults = {...this.adults, members: []};
70
+ // this.children = {...this.children, members = []};
71
+ // this.other = {...this.other, members = []};
72
+ let addedToGroup = false;
73
+ this.members
74
+ ?.filter((c) => c.brief?.roles?.includes('member'))
75
+ .forEach((c) => {
76
+ if (c.brief?.type === 'animal') {
77
+ pets.push(c);
78
+ addedToGroup = true;
79
+ }
80
+ switch (c.brief?.ageGroup) {
81
+ case 'adult':
82
+ adults?.push(c);
83
+ addedToGroup = true;
84
+ break;
85
+ case 'child':
86
+ children?.push(c);
87
+ addedToGroup = true;
88
+ break;
89
+ }
90
+ if (c.dbo?.type === SpaceMemberTypeEnum.pet) {
91
+ addedToGroup = true;
92
+ pets.push(c);
93
+ }
94
+ if (c.brief?.groupIDs?.length) {
95
+ c.brief.groupIDs.forEach((groupID) => {
96
+ const groupIndex = this.predefinedMemberGroups.findIndex((g) => g.id === groupID);
97
+ let group;
98
+ if (groupIndex < 0) {
99
+ group = {
100
+ id: groupID,
101
+ role: groupID,
102
+ plural: groupID + 's',
103
+ contacts: [],
104
+ emoji: '',
105
+ addLabel: 'Add member',
106
+ };
107
+ }
108
+ else {
109
+ group = this.predefinedMemberGroups[groupIndex];
110
+ }
111
+ if (!group.contacts) {
112
+ group = { ...group, contacts: [{ ...c, space }] };
113
+ }
114
+ else if (!group.contacts.find((m2) => m2.id === c.id)) {
115
+ group = {
116
+ ...group,
117
+ contacts: [...group.contacts, { ...c, space }],
118
+ };
119
+ }
120
+ this.predefinedMemberGroups = this.predefinedMemberGroups.map((g, i) => (i === groupIndex ? group : g));
121
+ addedToGroup = true;
122
+ // if (this.membersByGroupId[groupID]) {
123
+ // this.membersByGroupId[groupID].push(m);
124
+ // } else {
125
+ // this.membersByGroupId[groupID] = [m];
126
+ // }
127
+ });
128
+ // } else if (this.team.brief && isTeamSupportsMemberGroups(this.team.brief.type)) {
129
+ // if (this.noGroupMembers) {
130
+ // this.noGroupMembers.push(m);
131
+ // }
132
+ }
133
+ if (!addedToGroup) {
134
+ other.push(c);
135
+ }
136
+ });
137
+ this.adults = { ...this.adults, contacts: adults.map(addSpace(space)) };
138
+ this.children = {
139
+ ...this.children,
140
+ contacts: children.map(addSpace(space)),
141
+ };
142
+ this.pets = { ...this.pets, contacts: pets.map(addSpace(space)) };
143
+ this.other = { ...this.other, contacts: other.map(addSpace(space)) };
144
+ this.predefinedMemberGroups = [
145
+ this.adults,
146
+ this.children,
147
+ this.pets,
148
+ this.other,
149
+ ].map((g) => Object.assign(g, { contacts: g.contacts || [] }));
150
+ }
151
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FamilyMembersComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
152
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.0", type: FamilyMembersComponent, isStandalone: true, selector: "sneat-family-members", inputs: { contactusSpaceDbo: "contactusSpaceDbo" }, outputs: { addMember: "addMember" }, providers: [{ provide: ClassName, useValue: 'FamilyMembersComponent' }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: `
153
+ <sneat-members-by-role
154
+ [$space]="$space()"
155
+ [memberGroups]="predefinedMemberGroups"
156
+ (addMember)="addMember.emit($event)"
157
+ />
158
+ `, isInline: true, dependencies: [{ kind: "component", type: MembersByRoleComponent, selector: "sneat-members-by-role", inputs: ["memberGroups"], outputs: ["addMember"] }] }); }
159
+ }
160
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FamilyMembersComponent, decorators: [{
161
+ type: Component,
162
+ args: [{
163
+ selector: 'sneat-family-members',
164
+ template: `
165
+ <sneat-members-by-role
166
+ [$space]="$space()"
167
+ [memberGroups]="predefinedMemberGroups"
168
+ (addMember)="addMember.emit($event)"
169
+ />
170
+ `,
171
+ imports: [MembersByRoleComponent],
172
+ providers: [{ provide: ClassName, useValue: 'FamilyMembersComponent' }],
173
+ }]
174
+ }], propDecorators: { contactusSpaceDbo: [{
175
+ type: Input,
176
+ args: [{ required: true }]
177
+ }], addMember: [{
178
+ type: Output
179
+ }] } });
180
+ //# sourceMappingURL=family-members.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"family-members.component.js","sourceRoot":"","sources":["../../../../../../../../libs/contactus/shared/src/lib/components/members-by-role/family-members.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { SpaceMemberTypeEnum } from '@sneat/auth-models';\nimport {\n addSpace,\n IContactBrief,\n IContactDbo,\n IContactusSpaceDbo,\n IContactWithBrief,\n MemberGroupType,\n MemberGroupTypeAdults,\n MemberGroupTypeKids,\n MemberGroupTypeOther,\n MemberGroupTypePets,\n} from '@sneat/contactus-core';\nimport { WithSpaceInput } from '@sneat/space-services';\nimport { ClassName } from '@sneat/ui';\nimport { MembersByRoleComponent } from '../members-by-role/members-by-role.component';\nimport { MemberGroup } from '../members-by-role/member-group';\nimport { IIdAndBriefAndOptionalDbo } from '@sneat/core';\nimport { zipMapBriefsWithIDs } from '@sneat/space-models';\n\n@Component({\n selector: 'sneat-family-members',\n template: `\n <sneat-members-by-role\n [$space]=\"$space()\"\n [memberGroups]=\"predefinedMemberGroups\"\n (addMember)=\"addMember.emit($event)\"\n />\n `,\n imports: [MembersByRoleComponent],\n providers: [{ provide: ClassName, useValue: 'FamilyMembersComponent' }],\n})\nexport class FamilyMembersComponent\n extends WithSpaceInput\n implements OnChanges\n{\n @Input({ required: true })\n public contactusSpaceDbo?: IContactusSpaceDbo | null;\n\n @Output() public readonly addMember = new EventEmitter<MemberGroup>();\n\n public members?: readonly IIdAndBriefAndOptionalDbo<\n IContactBrief,\n IContactDbo\n >[];\n\n protected adults: MemberGroup = {\n id: MemberGroupTypeAdults,\n emoji: '🧓',\n role: 'adult',\n plural: 'Adults',\n addLabel: 'Add adult',\n };\n protected children: MemberGroup = {\n id: MemberGroupTypeKids,\n emoji: '🚸',\n role: 'child',\n plural: 'Children',\n addLabel: 'Add child',\n };\n protected pets: MemberGroup = {\n id: MemberGroupTypePets,\n emoji: '🐕',\n plural: 'Pets',\n addLabel: 'Add pet',\n role: 'animal',\n };\n protected other: MemberGroup = {\n id: MemberGroupTypeOther,\n emoji: '👻',\n plural: 'Other',\n addLabel: '',\n role: 'other',\n };\n\n protected predefinedMemberGroups: readonly MemberGroup[] = [\n this.adults,\n this.children,\n this.pets,\n this.other,\n ];\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (changes['contactusSpaceDbo']) {\n this.processContactusSpaceDbo(this.contactusSpaceDbo);\n }\n }\n\n private readonly processContactusSpaceDbo = (\n contactusSpaceDbo?: IContactusSpaceDbo | null,\n ): void => {\n // 'MembersPageComponent.processContactusSpaceDbo()',\n // contactusSpaceDbo,\n const space = this.$space();\n this.members = zipMapBriefsWithIDs(contactusSpaceDbo?.contacts).map((m) =>\n Object.assign(m, { space }),\n );\n this.processMembers();\n };\n\n private processMembers(): void {\n const space = this.$space();\n if (!space) {\n throw new Error('!this.$space()');\n }\n const adults: IContactWithBrief[] = [];\n const children: IContactWithBrief[] = [];\n const pets: IContactWithBrief[] = [];\n const other: IContactWithBrief[] = [];\n // this.adults = {...this.adults, members: []};\n // this.children = {...this.children, members = []};\n // this.other = {...this.other, members = []};\n let addedToGroup = false;\n this.members\n ?.filter((c) => c.brief?.roles?.includes('member'))\n .forEach((c) => {\n if (c.brief?.type === 'animal') {\n pets.push(c);\n addedToGroup = true;\n }\n switch (c.brief?.ageGroup) {\n case 'adult':\n adults?.push(c);\n addedToGroup = true;\n break;\n case 'child':\n children?.push(c);\n addedToGroup = true;\n break;\n }\n if (c.dbo?.type === SpaceMemberTypeEnum.pet) {\n addedToGroup = true;\n pets.push(c);\n }\n if (c.brief?.groupIDs?.length) {\n c.brief.groupIDs.forEach((groupID) => {\n const groupIndex = this.predefinedMemberGroups.findIndex(\n (g) => g.id === groupID,\n );\n let group: MemberGroup;\n if (groupIndex < 0) {\n group = {\n id: groupID as MemberGroupType,\n role: groupID,\n plural: groupID + 's',\n contacts: [],\n emoji: '',\n addLabel: 'Add member',\n };\n } else {\n group = this.predefinedMemberGroups[groupIndex];\n }\n if (!group.contacts) {\n group = { ...group, contacts: [{ ...c, space }] };\n } else if (!group.contacts.find((m2) => m2.id === c.id)) {\n group = {\n ...group,\n contacts: [...group.contacts, { ...c, space }],\n };\n }\n this.predefinedMemberGroups = this.predefinedMemberGroups.map(\n (g, i) => (i === groupIndex ? group : g),\n );\n addedToGroup = true;\n // if (this.membersByGroupId[groupID]) {\n // \tthis.membersByGroupId[groupID].push(m);\n // } else {\n // \tthis.membersByGroupId[groupID] = [m];\n // }\n });\n // } else if (this.team.brief && isTeamSupportsMemberGroups(this.team.brief.type)) {\n // \tif (this.noGroupMembers) {\n // \t\tthis.noGroupMembers.push(m);\n // \t}\n }\n if (!addedToGroup) {\n other.push(c);\n }\n });\n this.adults = { ...this.adults, contacts: adults.map(addSpace(space)) };\n this.children = {\n ...this.children,\n contacts: children.map(addSpace(space)),\n };\n this.pets = { ...this.pets, contacts: pets.map(addSpace(space)) };\n this.other = { ...this.other, contacts: other.map(addSpace(space)) };\n this.predefinedMemberGroups = [\n this.adults,\n this.children,\n this.pets,\n this.other,\n ].map((g) => Object.assign(g, { contacts: g.contacts || [] }));\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export * from './members-by-role.component';
2
+ export * from './member-group';
3
+ export * from './family-members.component';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../libs/contactus/shared/src/lib/components/members-by-role/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC","sourcesContent":["export * from './members-by-role.component';\nexport * from './member-group';\nexport * from './family-members.component';\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=member-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"member-group.js","sourceRoot":"","sources":["../../../../../../../../libs/contactus/shared/src/lib/components/members-by-role/member-group.ts"],"names":[],"mappings":"","sourcesContent":["import {\n IContactWithBriefAndSpace,\n MemberGroupType,\n} from '@sneat/contactus-core';\n\nexport interface MemberGroup {\n readonly id: MemberGroupType;\n readonly role: string;\n readonly emoji: string;\n readonly plural: string;\n readonly addLabel: string;\n readonly contacts?: readonly IContactWithBriefAndSpace[];\n}\n"]}
@@ -0,0 +1,34 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core';
2
+ import { IonButton, IonButtons, IonIcon, IonItem, IonItemGroup, IonLabel, IonSpinner, } from '@ionic/angular/standalone';
3
+ import { WithSpaceInput } from '@sneat/space-services';
4
+ import { ClassName } from '@sneat/ui';
5
+ import { MembersListComponent } from '../members-list';
6
+ import * as i0 from "@angular/core";
7
+ export class MembersByRoleComponent extends WithSpaceInput {
8
+ constructor() {
9
+ super(...arguments);
10
+ this.addMember = new EventEmitter();
11
+ this.contactsByMember = {};
12
+ }
13
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MembersByRoleComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
14
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: MembersByRoleComponent, isStandalone: true, selector: "sneat-members-by-role", inputs: { memberGroups: "memberGroups" }, outputs: { addMember: "addMember" }, providers: [{ provide: ClassName, useValue: 'MembersByRoleComponent' }], usesInheritance: true, ngImport: i0, template: "@for (group of memberGroups; track group.id) {\n <ion-item-group>\n @if (group.addLabel || group.contacts?.length) {\n <ion-item color=\"light\" class=\"sneat-tiny-end-padding\" lines=\"full\">\n <ion-label>{{ group.emoji }}&nbsp;&nbsp;{{ group.plural }}</ion-label>\n @if (group.addLabel) {\n <ion-buttons slot=\"end\">\n <ion-button\n [title]=\"group.addLabel\"\n (click)=\"addMember.emit(group)\"\n >\n <ion-icon name=\"add\" slot=\"start\" />\n <ion-label>Add</ion-label>\n </ion-button>\n </ion-buttons>\n }\n </ion-item>\n\n @if (group.contacts === undefined) {\n <ion-item>\n <ion-spinner name=\"lines-small\" color=\"medium\" />\n <ion-label color=\"medium\">Loading...</ion-label>\n </ion-item>\n }\n\n <!--\t\t\t<ion-item>group.members: {{ group.members|json }}</ion-item>-->\n <sneat-members-list\n [$space]=\"$space()\"\n [$members]=\"group.contacts || []\"\n [contactsByMember]=\"contactsByMember\"\n [hideRoles]=\"[group.role, 'member']\"\n />\n }\n </ion-item-group>\n}\n", dependencies: [{ kind: "component", type: MembersListComponent, selector: "sneat-members-list", inputs: ["$members", "$role", "contactsByMember", "hideRoles"], outputs: ["selfRemoved"] }, { kind: "component", type: IonItemGroup, selector: "ion-item-group" }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
15
+ }
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MembersByRoleComponent, decorators: [{
17
+ type: Component,
18
+ args: [{ selector: 'sneat-members-by-role', imports: [
19
+ MembersListComponent,
20
+ IonItemGroup,
21
+ IonLabel,
22
+ IonButtons,
23
+ IonButton,
24
+ IonIcon,
25
+ IonItem,
26
+ IonSpinner,
27
+ ], providers: [{ provide: ClassName, useValue: 'MembersByRoleComponent' }], changeDetection: ChangeDetectionStrategy.OnPush, template: "@for (group of memberGroups; track group.id) {\n <ion-item-group>\n @if (group.addLabel || group.contacts?.length) {\n <ion-item color=\"light\" class=\"sneat-tiny-end-padding\" lines=\"full\">\n <ion-label>{{ group.emoji }}&nbsp;&nbsp;{{ group.plural }}</ion-label>\n @if (group.addLabel) {\n <ion-buttons slot=\"end\">\n <ion-button\n [title]=\"group.addLabel\"\n (click)=\"addMember.emit(group)\"\n >\n <ion-icon name=\"add\" slot=\"start\" />\n <ion-label>Add</ion-label>\n </ion-button>\n </ion-buttons>\n }\n </ion-item>\n\n @if (group.contacts === undefined) {\n <ion-item>\n <ion-spinner name=\"lines-small\" color=\"medium\" />\n <ion-label color=\"medium\">Loading...</ion-label>\n </ion-item>\n }\n\n <!--\t\t\t<ion-item>group.members: {{ group.members|json }}</ion-item>-->\n <sneat-members-list\n [$space]=\"$space()\"\n [$members]=\"group.contacts || []\"\n [contactsByMember]=\"contactsByMember\"\n [hideRoles]=\"[group.role, 'member']\"\n />\n }\n </ion-item-group>\n}\n" }]
28
+ }], propDecorators: { memberGroups: [{
29
+ type: Input,
30
+ args: [{ required: true }]
31
+ }], addMember: [{
32
+ type: Output
33
+ }] } });
34
+ //# sourceMappingURL=members-by-role.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"members-by-role.component.js","sourceRoot":"","sources":["../../../../../../../../libs/contactus/shared/src/lib/components/members-by-role/members-by-role.component.ts","../../../../../../../../libs/contactus/shared/src/lib/components/members-by-role/members-by-role.component.html"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,SAAS,EACT,YAAY,EACZ,KAAK,EACL,MAAM,GACP,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,SAAS,EACT,UAAU,EACV,OAAO,EACP,OAAO,EACP,YAAY,EACZ,QAAQ,EACR,UAAU,GACX,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;;AAmBvD,MAAM,OAAO,sBAAuB,SAAQ,cAAc;IAhB1D;;QAkB4B,cAAS,GAAG,IAAI,YAAY,EAAe,CAAC;QAE/D,qBAAgB,GAGnB,EAAE,CAAC;KACR;8GARY,sBAAsB;kGAAtB,sBAAsB,mJAHtB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,wBAAwB,EAAE,CAAC,iDCnCzE,+rCAmCA,4CDTI,oBAAoB,yJACpB,YAAY,2DACZ,QAAQ,6FACR,UAAU,8EACV,SAAS,oPACT,OAAO,2JACP,OAAO,0NACP,UAAU;;2FAKD,sBAAsB;kBAhBlC,SAAS;+BACE,uBAAuB,WAExB;wBACP,oBAAoB;wBACpB,YAAY;wBACZ,QAAQ;wBACR,UAAU;wBACV,SAAS;wBACT,OAAO;wBACP,OAAO;wBACP,UAAU;qBACX,aACU,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,wBAAwB,EAAE,CAAC,mBACtD,uBAAuB,CAAC,MAAM;;sBAG9C,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB,MAAM","sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n} from '@angular/core';\nimport {\n IonButton,\n IonButtons,\n IonIcon,\n IonItem,\n IonItemGroup,\n IonLabel,\n IonSpinner,\n} from '@ionic/angular/standalone';\nimport { IContactWithBriefAndSpace } from '@sneat/contactus-core';\nimport { WithSpaceInput } from '@sneat/space-services';\nimport { ClassName } from '@sneat/ui';\nimport { MembersListComponent } from '../members-list';\nimport { MemberGroup } from './member-group';\n\n@Component({\n selector: 'sneat-members-by-role',\n templateUrl: './members-by-role.component.html',\n imports: [\n MembersListComponent,\n IonItemGroup,\n IonLabel,\n IonButtons,\n IonButton,\n IonIcon,\n IonItem,\n IonSpinner,\n ],\n providers: [{ provide: ClassName, useValue: 'MembersByRoleComponent' }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MembersByRoleComponent extends WithSpaceInput {\n @Input({ required: true }) public memberGroups?: readonly MemberGroup[];\n @Output() public readonly addMember = new EventEmitter<MemberGroup>();\n\n public contactsByMember: Record<\n string,\n readonly IContactWithBriefAndSpace[]\n > = {};\n}\n","@for (group of memberGroups; track group.id) {\n <ion-item-group>\n @if (group.addLabel || group.contacts?.length) {\n <ion-item color=\"light\" class=\"sneat-tiny-end-padding\" lines=\"full\">\n <ion-label>{{ group.emoji }}&nbsp;&nbsp;{{ group.plural }}</ion-label>\n @if (group.addLabel) {\n <ion-buttons slot=\"end\">\n <ion-button\n [title]=\"group.addLabel\"\n (click)=\"addMember.emit(group)\"\n >\n <ion-icon name=\"add\" slot=\"start\" />\n <ion-label>Add</ion-label>\n </ion-button>\n </ion-buttons>\n }\n </ion-item>\n\n @if (group.contacts === undefined) {\n <ion-item>\n <ion-spinner name=\"lines-small\" color=\"medium\" />\n <ion-label color=\"medium\">Loading...</ion-label>\n </ion-item>\n }\n\n <!--\t\t\t<ion-item>group.members: {{ group.members|json }}</ion-item>-->\n <sneat-members-list\n [$space]=\"$space()\"\n [$members]=\"group.contacts || []\"\n [contactsByMember]=\"contactsByMember\"\n [hideRoles]=\"[group.role, 'member']\"\n />\n }\n </ion-item-group>\n}\n"]}
@@ -0,0 +1,33 @@
1
+ import { Component, ChangeDetectionStrategy, input, inject, } from '@angular/core';
2
+ import { RouterLink } from '@angular/router';
3
+ import { IonButton, IonButtons, IonIcon, IonItem, IonLabel, } from '@ionic/angular/standalone';
4
+ import { SpaceNavService } from '@sneat/space-services';
5
+ import * as i0 from "@angular/core";
6
+ export class MembersCardHeaderComponent {
7
+ constructor() {
8
+ this.spaceNavService = inject(SpaceNavService);
9
+ this.$space = input.required(...(ngDevMode ? [{ debugName: "$space" }] : []));
10
+ this.$contactusSpace = input.required(...(ngDevMode ? [{ debugName: "$contactusSpace" }] : []));
11
+ }
12
+ goMembers(event) {
13
+ event.stopPropagation();
14
+ event.preventDefault();
15
+ const space = this.$space();
16
+ if (space) {
17
+ this.spaceNavService
18
+ .navigateForwardToSpacePage(space, 'members', {
19
+ state: {
20
+ contactusSpace: this.$contactusSpace(),
21
+ },
22
+ })
23
+ .catch(console.error);
24
+ }
25
+ }
26
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MembersCardHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: MembersCardHeaderComponent, isStandalone: true, selector: "sneat-members-card-header", inputs: { $space: { classPropertyName: "$space", publicName: "$space", isSignal: true, isRequired: true, transformFunction: null }, $contactusSpace: { classPropertyName: "$contactusSpace", publicName: "$contactusSpace", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<ion-item\n tappable=\"true\"\n lines=\"full\"\n routerLink=\"./members\"\n (click)=\"goMembers($event)\"\n color=\"divider\"\n class=\"sneat-tiny-end-padding\"\n>\n <ion-icon\n color=\"primary\"\n name=\"people-circle-outline\"\n slot=\"start\"\n class=\"sneat-hide-if-width-less-240\"\n />\n <ion-label color=\"primary\" style=\"font-weight: bold\">Members</ion-label>\n <ion-buttons slot=\"end\">\n <ion-button routerLink=\"new-member\" (click)=\"$event.stopPropagation()\">\n <ion-icon name=\"add-outline\" slot=\"start\" />\n <ion-label>Add</ion-label>\n </ion-button>\n </ion-buttons>\n</ion-item>\n", dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28
+ }
29
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MembersCardHeaderComponent, decorators: [{
30
+ type: Component,
31
+ args: [{ imports: [RouterLink, IonIcon, IonLabel, IonButtons, IonButton, IonItem], changeDetection: ChangeDetectionStrategy.OnPush, selector: 'sneat-members-card-header', template: "<ion-item\n tappable=\"true\"\n lines=\"full\"\n routerLink=\"./members\"\n (click)=\"goMembers($event)\"\n color=\"divider\"\n class=\"sneat-tiny-end-padding\"\n>\n <ion-icon\n color=\"primary\"\n name=\"people-circle-outline\"\n slot=\"start\"\n class=\"sneat-hide-if-width-less-240\"\n />\n <ion-label color=\"primary\" style=\"font-weight: bold\">Members</ion-label>\n <ion-buttons slot=\"end\">\n <ion-button routerLink=\"new-member\" (click)=\"$event.stopPropagation()\">\n <ion-icon name=\"add-outline\" slot=\"start\" />\n <ion-label>Add</ion-label>\n </ion-button>\n </ion-buttons>\n</ion-item>\n" }]
32
+ }], propDecorators: { $space: [{ type: i0.Input, args: [{ isSignal: true, alias: "$space", required: true }] }], $contactusSpace: [{ type: i0.Input, args: [{ isSignal: true, alias: "$contactusSpace", required: true }] }] } });
33
+ //# sourceMappingURL=members-card-header.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"members-card-header.component.js","sourceRoot":"","sources":["../../../../../../../../libs/contactus/shared/src/lib/components/members-card-header/members-card-header.component.ts","../../../../../../../../libs/contactus/shared/src/lib/components/members-card-header/members-card-header.component.html"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,uBAAuB,EACvB,KAAK,EACL,MAAM,GACP,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACL,SAAS,EACT,UAAU,EACV,OAAO,EACP,OAAO,EACP,QAAQ,GACT,MAAM,2BAA2B,CAAC;AAInC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;;AAQxD,MAAM,OAAO,0BAA0B;IANvC;QAOqB,oBAAe,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;QAE7C,WAAM,GAAG,KAAK,CAAC,QAAQ,iDAAiB,CAAC;QAEzC,oBAAe,GAC7B,KAAK,CAAC,QAAQ,0DAAyC,CAAC;KAgB3D;IAdW,SAAS,CAAC,KAAY;QAC9B,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,eAAe;iBACjB,0BAA0B,CAAC,KAAK,EAAE,SAAS,EAAE;gBAC5C,KAAK,EAAE;oBACL,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE;iBACvC;aACF,CAAC;iBACD,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;8GArBU,0BAA0B;kGAA1B,0BAA0B,gXCzBvC,soBAsBA,4CDFY,UAAU,oOAAE,OAAO,2JAAE,QAAQ,6FAAE,UAAU,8EAAE,SAAS,oPAAE,OAAO;;2FAK5D,0BAA0B;kBANtC,SAAS;8BACC,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,mBACvD,uBAAuB,CAAC,MAAM,YACrC,2BAA2B","sourcesContent":["import {\n Component,\n ChangeDetectionStrategy,\n input,\n inject,\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport {\n IonButton,\n IonButtons,\n IonIcon,\n IonItem,\n IonLabel,\n} from '@ionic/angular/standalone';\nimport { IContactusSpaceDbo } from '@sneat/contactus-core';\nimport { IIdAndOptionalDbo } from '@sneat/core';\nimport { ISpaceContext } from '@sneat/space-models';\nimport { SpaceNavService } from '@sneat/space-services';\n\n@Component({\n imports: [RouterLink, IonIcon, IonLabel, IonButtons, IonButton, IonItem],\n changeDetection: ChangeDetectionStrategy.OnPush,\n selector: 'sneat-members-card-header',\n templateUrl: './members-card-header.component.html',\n})\nexport class MembersCardHeaderComponent {\n protected readonly spaceNavService = inject(SpaceNavService);\n\n public readonly $space = input.required<ISpaceContext>();\n\n public readonly $contactusSpace =\n input.required<IIdAndOptionalDbo<IContactusSpaceDbo>>();\n\n protected goMembers(event: Event): void {\n event.stopPropagation();\n event.preventDefault();\n const space = this.$space();\n if (space) {\n this.spaceNavService\n .navigateForwardToSpacePage(space, 'members', {\n state: {\n contactusSpace: this.$contactusSpace(),\n },\n })\n .catch(console.error);\n }\n }\n}\n","<ion-item\n tappable=\"true\"\n lines=\"full\"\n routerLink=\"./members\"\n (click)=\"goMembers($event)\"\n color=\"divider\"\n class=\"sneat-tiny-end-padding\"\n>\n <ion-icon\n color=\"primary\"\n name=\"people-circle-outline\"\n slot=\"start\"\n class=\"sneat-hide-if-width-less-240\"\n />\n <ion-label color=\"primary\" style=\"font-weight: bold\">Members</ion-label>\n <ion-buttons slot=\"end\">\n <ion-button routerLink=\"new-member\" (click)=\"$event.stopPropagation()\">\n <ion-icon name=\"add-outline\" slot=\"start\" />\n <ion-label>Add</ion-label>\n </ion-button>\n </ion-buttons>\n</ion-item>\n"]}
@@ -0,0 +1,2 @@
1
+ export * from './members-list.component';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../libs/contactus/shared/src/lib/components/members-list/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC","sourcesContent":["export * from './members-list.component';\n"]}
@@ -0,0 +1,164 @@
1
+ import { Component, computed, EventEmitter, inject, input, Input, Output, signal, } from '@angular/core';
2
+ import { RouterModule } from '@angular/router';
3
+ import { IonAvatar, IonButton, IonButtons, IonIcon, IonImg, IonItem, IonItemOption, IonItemOptions, IonItemSliding, IonLabel, IonSkeletonText, IonRouterOutlet, ModalController, NavController, } from '@ionic/angular/standalone';
4
+ import { listAddRemoveAnimation, SpaceTypeFamily } from '@sneat/core';
5
+ import { ScheduleNavService, ScheduleNavServiceModule, } from '@sneat/mod-schedulus-core';
6
+ import { WithSpaceInput } from '@sneat/space-services';
7
+ import { ContactService, ContactusNavService } from '@sneat/contactus-services';
8
+ import { SpaceNavService } from '@sneat/space-services';
9
+ import { SneatUserService } from '@sneat/auth-core';
10
+ import { ClassName } from '@sneat/ui';
11
+ import { InviteModalComponent } from '../../modals/invite-modal';
12
+ import { ContactTitlePipe } from '../../pipes';
13
+ import { ContactRoleBadgesComponent } from '../contact-role-badges/contact-role-badges.component';
14
+ import { InlistAgeGroupComponent } from '../inlist-options/inlist-age-group.component';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "@angular/router";
17
+ // TODO: Is it deprecated and should we migrated to Contacts list? Document reason if not.
18
+ export class MembersListComponent extends WithSpaceInput {
19
+ constructor() {
20
+ super(...arguments);
21
+ this.navService = inject(SpaceNavService);
22
+ this.navController = inject(NavController);
23
+ this.userService = inject(SneatUserService);
24
+ this.contactService = inject(ContactService);
25
+ this.scheduleNavService = inject(ScheduleNavService);
26
+ this.modalController = inject(ModalController);
27
+ this.routerOutlet = inject(IonRouterOutlet);
28
+ this.$selfRemove = signal(false, ...(ngDevMode ? [{ debugName: "$selfRemove" }] : []));
29
+ this.$members = input.required(...(ngDevMode ? [{ debugName: "$members" }] : []));
30
+ this.$role = input(...(ngDevMode ? [undefined, { debugName: "$role" }] : []));
31
+ this.selfRemoved = new EventEmitter();
32
+ // TODO: document what is contactsByMember.
33
+ this.contactsByMember = {};
34
+ this.hideRoles = ['member'];
35
+ // Holds filtered entries, use `allMembers` to pass input
36
+ this.$membersToDisplay = computed(() => {
37
+ const role = this.$role();
38
+ const members = this.$members();
39
+ return role
40
+ ? members?.filter((m) => m.brief?.roles?.some((r) => r === role))
41
+ : members;
42
+ }, ...(ngDevMode ? [{ debugName: "$membersToDisplay" }] : []));
43
+ this.contactusNavService = inject(ContactusNavService);
44
+ this.$isFamilySpace = computed(() => this.$spaceType() === SpaceTypeFamily, ...(ngDevMode ? [{ debugName: "$isFamilySpace" }] : []));
45
+ }
46
+ isAgeOptionsVisible(contact) {
47
+ // console.log('MembersListComponent.isAgeOptionsVisible()', member, teamDto);
48
+ return (this.$isFamilySpace() &&
49
+ contact.brief?.type === 'person' &&
50
+ (!contact.brief?.ageGroup || contact.brief?.ageGroup === 'unknown'));
51
+ }
52
+ isInviteButtonVisible(contact) {
53
+ return contact.brief?.type === 'person' && !contact.brief?.userID;
54
+ }
55
+ genderIcon(m) {
56
+ switch (m.brief?.gender) {
57
+ case 'male':
58
+ return 'man-outline';
59
+ case 'female':
60
+ return 'woman-outline';
61
+ }
62
+ return 'person-outline';
63
+ }
64
+ goMember(member) {
65
+ if (!this.$space()) {
66
+ this.errorLogger.logError('Can not navigate to space member without space context');
67
+ return false;
68
+ }
69
+ if (!member?.id) {
70
+ throw new Error('!member?.id');
71
+ }
72
+ this.contactusNavService.navigateToMember({
73
+ ...member,
74
+ space: this.$space(),
75
+ });
76
+ return false;
77
+ }
78
+ goSchedule(event, contact) {
79
+ event.stopPropagation();
80
+ event.preventDefault();
81
+ const space = this.$space();
82
+ if (space) {
83
+ this.scheduleNavService
84
+ .goCalendar(space, { member: contact.id })
85
+ .catch(this.errorLogger.logErrorHandler("failed to navigate to member's schedule page"));
86
+ }
87
+ }
88
+ removeMember(event, member) {
89
+ // event.preventDefault();
90
+ event.stopPropagation();
91
+ const space = this.$space();
92
+ if (!space) {
93
+ return;
94
+ }
95
+ this.$selfRemove.set(member.brief?.userID === this.userService.currentUserID);
96
+ const spaceID = space.id;
97
+ this.contactService
98
+ .removeSpaceMember({ spaceID: spaceID, contactID: member.id })
99
+ .subscribe({
100
+ next: (space) => {
101
+ if (spaceID !== space?.id) {
102
+ return;
103
+ }
104
+ if (this.$selfRemove()) {
105
+ this.selfRemoved.emit();
106
+ }
107
+ if (!space ||
108
+ (this.userService.currentUserID &&
109
+ space?.dbo?.userIDs?.indexOf(this.userService.currentUserID)) ||
110
+ -1 < 0) {
111
+ this.navService.navigateToSpaces('back');
112
+ }
113
+ },
114
+ error: (err) => {
115
+ this.$selfRemove.set(false);
116
+ this.errorLogger.logError(err, 'Failed to remove member from team');
117
+ },
118
+ });
119
+ }
120
+ async showInviteModal(event, member) {
121
+ event.stopPropagation();
122
+ event.preventDefault();
123
+ const modal = await this.modalController.create({
124
+ component: InviteModalComponent,
125
+ // swipeToClose: true,
126
+ presentingElement: this.routerOutlet.nativeEl,
127
+ componentProps: {
128
+ space: this.$space(),
129
+ member,
130
+ },
131
+ });
132
+ await modal.present();
133
+ }
134
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MembersListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
135
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: MembersListComponent, isStandalone: true, selector: "sneat-members-list", inputs: { $members: { classPropertyName: "$members", publicName: "$members", isSignal: true, isRequired: true, transformFunction: null }, $role: { classPropertyName: "$role", publicName: "$role", isSignal: true, isRequired: false, transformFunction: null }, contactsByMember: { classPropertyName: "contactsByMember", publicName: "contactsByMember", isSignal: false, isRequired: false, transformFunction: null }, hideRoles: { classPropertyName: "hideRoles", publicName: "hideRoles", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { selfRemoved: "selfRemoved" }, providers: [{ provide: ClassName, useValue: 'MembersListComponent' }], usesInheritance: true, ngImport: i0, template: "@let membersToDisplay = $membersToDisplay();\n\n@if (!membersToDisplay) {\n <ion-item>\n <ion-avatar slot=\"start\" style=\"opacity: 0.3\">\n <ion-img title=\"avatar\" src=\"//www.gravatar.com/avatar/gravatar\" />\n </ion-avatar>\n <ion-skeleton-text style=\"width: 50%\" animated=\"animated\" />\n </ion-item>\n}\n\n@for (member of membersToDisplay; track member.id; let isLast = $last) {\n <ion-item-sliding [@addRemove]=\"'added'\">\n <ion-item\n tappable=\"true\"\n [lines]=\"isLast ? 'none' : undefined\"\n routerLink=\"/space/{{ $spaceType() || 'UNKNOWN_TYPE' }}/{{\n $spaceID()\n }}/member/{{ member.id }}\"\n (click)=\"goMember(member)\"\n class=\"sneat-tiny-end-padding\"\n >\n @if (member?.brief?.avatar; as avatar) {\n <ion-avatar>\n @if (member.brief.avatar?.external?.url) {\n <ion-img\n title=\"avatar\"\n [src]=\"member.brief.avatar?.external?.url\"\n />\n }\n @if (\n member.brief.avatar?.gravatar && !member.brief.avatar?.external?.url\n ) {\n <ion-img\n title=\"avatar\"\n src=\"//www.gravatar.com/avatar/{{\n member.brief.avatar?.gravatar\n }}\"\n />\n }\n </ion-avatar>\n } @else {\n <ion-icon\n slot=\"start\"\n [name]=\"genderIcon(member)\"\n class=\"sneat-hide-if-width-less-240\"\n />\n }\n\n <ion-label>\n {{ member | contactTitle }}\n @if (!$role()) {\n <sneat-contact-role-badges\n [roles]=\"member.brief.roles\"\n [hideRoles]=\"hideRoles\"\n />\n }\n </ion-label>\n @if (isAgeOptionsVisible(member)) {\n <sneat-inlist-age-group [contactID]=\"member.id\" [$space]=\"$space()\" />\n }\n <ion-buttons slot=\"end\">\n @if (isInviteButtonVisible(member)) {\n <ion-button\n title=\"Invite\"\n color=\"danger\"\n (click)=\"showInviteModal($event, member)\"\n >\n <ion-icon\n name=\"ticket-outline\"\n class=\"sneat-hide-if-width-greater-320\"\n />\n <span\n class=\"sneat-hide-if-width-less-320\"\n style=\"margin-left: 0.5em\"\n >Invite</span\n >\n </ion-button>\n }\n <ion-button (click)=\"goSchedule($event, member)\">\n <ion-icon name=\"calendar-outline\" />\n </ion-button>\n @if (!member.brief.userID && member.brief.invitesCount) {\n <ion-button color=\"danger\"> Resend invite</ion-button>\n }\n </ion-buttons>\n </ion-item>\n <ion-item-options side=\"start\">\n <ion-item-option color=\"danger\" (click)=\"removeMember($event, member)\">\n Remove\n </ion-item-option>\n </ion-item-options>\n <ion-item-options side=\"end\">\n <ion-item-option color=\"danger\" (click)=\"removeMember($event, member)\">\n Remove\n </ion-item-option>\n </ion-item-options>\n </ion-item-sliding>\n} @empty {\n <ion-item lines=\"none\">\n <ion-label color=\"medium\">No members</ion-label>\n </ion-item>\n}\n", dependencies: [{ kind: "ngmodule", type: ScheduleNavServiceModule }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: ContactRoleBadgesComponent, selector: "sneat-contact-role-badges", inputs: ["roles", "hideRoles"] }, { kind: "component", type: InlistAgeGroupComponent, selector: "sneat-inlist-age-group", inputs: ["contactID"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonAvatar, selector: "ion-avatar" }, { kind: "component", type: IonImg, selector: "ion-img", inputs: ["alt", "src"] }, { kind: "component", type: IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: IonItemSliding, selector: "ion-item-sliding", inputs: ["disabled"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonItemOptions, selector: "ion-item-options", inputs: ["side"] }, { kind: "component", type: IonItemOption, selector: "ion-item-option", inputs: ["color", "disabled", "download", "expandable", "href", "mode", "rel", "target", "type"] }, { kind: "pipe", type: ContactTitlePipe, name: "contactTitle" }], animations: listAddRemoveAnimation }); }
136
+ }
137
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: MembersListComponent, decorators: [{
138
+ type: Component,
139
+ args: [{ selector: 'sneat-members-list', animations: listAddRemoveAnimation, imports: [
140
+ ScheduleNavServiceModule,
141
+ RouterModule,
142
+ ContactRoleBadgesComponent,
143
+ InlistAgeGroupComponent,
144
+ IonItem,
145
+ IonAvatar,
146
+ IonImg,
147
+ IonSkeletonText,
148
+ IonItemSliding,
149
+ IonLabel,
150
+ IonIcon,
151
+ IonButtons,
152
+ IonButton,
153
+ IonItemOptions,
154
+ IonItemOption,
155
+ ContactTitlePipe,
156
+ ], providers: [{ provide: ClassName, useValue: 'MembersListComponent' }], template: "@let membersToDisplay = $membersToDisplay();\n\n@if (!membersToDisplay) {\n <ion-item>\n <ion-avatar slot=\"start\" style=\"opacity: 0.3\">\n <ion-img title=\"avatar\" src=\"//www.gravatar.com/avatar/gravatar\" />\n </ion-avatar>\n <ion-skeleton-text style=\"width: 50%\" animated=\"animated\" />\n </ion-item>\n}\n\n@for (member of membersToDisplay; track member.id; let isLast = $last) {\n <ion-item-sliding [@addRemove]=\"'added'\">\n <ion-item\n tappable=\"true\"\n [lines]=\"isLast ? 'none' : undefined\"\n routerLink=\"/space/{{ $spaceType() || 'UNKNOWN_TYPE' }}/{{\n $spaceID()\n }}/member/{{ member.id }}\"\n (click)=\"goMember(member)\"\n class=\"sneat-tiny-end-padding\"\n >\n @if (member?.brief?.avatar; as avatar) {\n <ion-avatar>\n @if (member.brief.avatar?.external?.url) {\n <ion-img\n title=\"avatar\"\n [src]=\"member.brief.avatar?.external?.url\"\n />\n }\n @if (\n member.brief.avatar?.gravatar && !member.brief.avatar?.external?.url\n ) {\n <ion-img\n title=\"avatar\"\n src=\"//www.gravatar.com/avatar/{{\n member.brief.avatar?.gravatar\n }}\"\n />\n }\n </ion-avatar>\n } @else {\n <ion-icon\n slot=\"start\"\n [name]=\"genderIcon(member)\"\n class=\"sneat-hide-if-width-less-240\"\n />\n }\n\n <ion-label>\n {{ member | contactTitle }}\n @if (!$role()) {\n <sneat-contact-role-badges\n [roles]=\"member.brief.roles\"\n [hideRoles]=\"hideRoles\"\n />\n }\n </ion-label>\n @if (isAgeOptionsVisible(member)) {\n <sneat-inlist-age-group [contactID]=\"member.id\" [$space]=\"$space()\" />\n }\n <ion-buttons slot=\"end\">\n @if (isInviteButtonVisible(member)) {\n <ion-button\n title=\"Invite\"\n color=\"danger\"\n (click)=\"showInviteModal($event, member)\"\n >\n <ion-icon\n name=\"ticket-outline\"\n class=\"sneat-hide-if-width-greater-320\"\n />\n <span\n class=\"sneat-hide-if-width-less-320\"\n style=\"margin-left: 0.5em\"\n >Invite</span\n >\n </ion-button>\n }\n <ion-button (click)=\"goSchedule($event, member)\">\n <ion-icon name=\"calendar-outline\" />\n </ion-button>\n @if (!member.brief.userID && member.brief.invitesCount) {\n <ion-button color=\"danger\"> Resend invite</ion-button>\n }\n </ion-buttons>\n </ion-item>\n <ion-item-options side=\"start\">\n <ion-item-option color=\"danger\" (click)=\"removeMember($event, member)\">\n Remove\n </ion-item-option>\n </ion-item-options>\n <ion-item-options side=\"end\">\n <ion-item-option color=\"danger\" (click)=\"removeMember($event, member)\">\n Remove\n </ion-item-option>\n </ion-item-options>\n </ion-item-sliding>\n} @empty {\n <ion-item lines=\"none\">\n <ion-label color=\"medium\">No members</ion-label>\n </ion-item>\n}\n" }]
157
+ }], propDecorators: { $members: [{ type: i0.Input, args: [{ isSignal: true, alias: "$members", required: true }] }], $role: [{ type: i0.Input, args: [{ isSignal: true, alias: "$role", required: false }] }], selfRemoved: [{
158
+ type: Output
159
+ }], contactsByMember: [{
160
+ type: Input
161
+ }], hideRoles: [{
162
+ type: Input
163
+ }] } });
164
+ //# sourceMappingURL=members-list.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"members-list.component.js","sourceRoot":"","sources":["../../../../../../../../libs/contactus/shared/src/lib/components/members-list/members-list.component.ts","../../../../../../../../libs/contactus/shared/src/lib/components/members-list/members-list.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n computed,\n EventEmitter,\n inject,\n input,\n Input,\n Output,\n signal,\n} from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport {\n IonAvatar,\n IonButton,\n IonButtons,\n IonIcon,\n IonImg,\n IonItem,\n IonItemOption,\n IonItemOptions,\n IonItemSliding,\n IonLabel,\n IonSkeletonText,\n IonRouterOutlet,\n ModalController,\n NavController,\n} from '@ionic/angular/standalone';\nimport { listAddRemoveAnimation, SpaceTypeFamily } from '@sneat/core';\nimport {\n ScheduleNavService,\n ScheduleNavServiceModule,\n} from '@sneat/mod-schedulus-core';\nimport { WithSpaceInput } from '@sneat/space-services';\nimport { ContactService, ContactusNavService } from '@sneat/contactus-services';\nimport {\n IContactWithBrief,\n IContactWithBriefAndSpace,\n} from '@sneat/contactus-core';\nimport { SpaceNavService } from '@sneat/space-services';\nimport { SneatUserService } from '@sneat/auth-core';\nimport { ClassName } from '@sneat/ui';\nimport { InviteModalComponent } from '../../modals/invite-modal';\nimport { ContactTitlePipe } from '../../pipes';\nimport { ContactRoleBadgesComponent } from '../contact-role-badges/contact-role-badges.component';\nimport { InlistAgeGroupComponent } from '../inlist-options/inlist-age-group.component';\n\n@Component({\n selector: 'sneat-members-list',\n templateUrl: './members-list.component.html',\n animations: listAddRemoveAnimation,\n imports: [\n ScheduleNavServiceModule,\n RouterModule,\n ContactRoleBadgesComponent,\n InlistAgeGroupComponent,\n IonItem,\n IonAvatar,\n IonImg,\n IonSkeletonText,\n IonItemSliding,\n IonLabel,\n IonIcon,\n IonButtons,\n IonButton,\n IonItemOptions,\n IonItemOption,\n ContactTitlePipe,\n ],\n providers: [{ provide: ClassName, useValue: 'MembersListComponent' }],\n})\n// TODO: Is it deprecated and should we migrated to Contacts list? Document reason if not.\nexport class MembersListComponent extends WithSpaceInput {\n private readonly navService = inject(SpaceNavService);\n private readonly navController = inject(NavController);\n private readonly userService = inject(SneatUserService);\n private readonly contactService = inject(ContactService);\n private readonly scheduleNavService = inject(ScheduleNavService);\n private readonly modalController = inject(ModalController);\n readonly routerOutlet = inject(IonRouterOutlet);\n\n private $selfRemove = signal(false);\n\n public readonly $members = input.required<readonly IContactWithBrief[]>();\n\n public $role = input<string>();\n\n @Output() readonly selfRemoved = new EventEmitter<void>();\n\n // TODO: document what is contactsByMember.\n @Input() public contactsByMember: Record<\n string,\n readonly IContactWithBriefAndSpace[]\n > = {};\n\n @Input() public hideRoles: readonly string[] = ['member'];\n\n // Holds filtered entries, use `allMembers` to pass input\n public readonly $membersToDisplay = computed<readonly IContactWithBrief[]>(\n () => {\n const role = this.$role();\n const members = this.$members();\n return role\n ? members?.filter((m) => m.brief?.roles?.some((r) => r === role))\n : members;\n },\n );\n\n private readonly contactusNavService = inject(ContactusNavService);\n\n private readonly $isFamilySpace = computed(\n () => this.$spaceType() === SpaceTypeFamily,\n );\n\n protected isAgeOptionsVisible(contact: IContactWithBrief): boolean {\n // console.log('MembersListComponent.isAgeOptionsVisible()', member, teamDto);\n return (\n this.$isFamilySpace() &&\n contact.brief?.type === 'person' &&\n (!contact.brief?.ageGroup || contact.brief?.ageGroup === 'unknown')\n );\n }\n\n protected isInviteButtonVisible(contact: IContactWithBrief): boolean {\n return contact.brief?.type === 'person' && !contact.brief?.userID;\n }\n\n public genderIcon(m: IContactWithBrief) {\n switch (m.brief?.gender) {\n case 'male':\n return 'man-outline';\n case 'female':\n return 'woman-outline';\n }\n return 'person-outline';\n }\n\n public goMember(member?: IContactWithBrief): boolean {\n if (!this.$space()) {\n this.errorLogger.logError(\n 'Can not navigate to space member without space context',\n );\n return false;\n }\n if (!member?.id) {\n throw new Error('!member?.id');\n }\n this.contactusNavService.navigateToMember({\n ...member,\n space: this.$space(),\n });\n return false;\n }\n\n public goSchedule(event: Event, contact: IContactWithBrief) {\n event.stopPropagation();\n event.preventDefault();\n const space = this.$space();\n if (space) {\n this.scheduleNavService\n .goCalendar(space, { member: contact.id })\n .catch(\n this.errorLogger.logErrorHandler(\n \"failed to navigate to member's schedule page\",\n ),\n );\n }\n }\n\n public removeMember(event: Event, member: IContactWithBrief) {\n // event.preventDefault();\n event.stopPropagation();\n const space = this.$space();\n if (!space) {\n return;\n }\n this.$selfRemove.set(\n member.brief?.userID === this.userService.currentUserID,\n );\n const spaceID = space.id;\n this.contactService\n .removeSpaceMember({ spaceID: spaceID, contactID: member.id })\n .subscribe({\n next: (space) => {\n if (spaceID !== space?.id) {\n return;\n }\n if (this.$selfRemove()) {\n this.selfRemoved.emit();\n }\n if (\n !space ||\n (this.userService.currentUserID &&\n space?.dbo?.userIDs?.indexOf(this.userService.currentUserID)) ||\n -1 < 0\n ) {\n this.navService.navigateToSpaces('back');\n }\n },\n error: (err: unknown) => {\n this.$selfRemove.set(false);\n this.errorLogger.logError(err, 'Failed to remove member from team');\n },\n });\n }\n\n protected async showInviteModal(\n event: Event,\n member: IContactWithBrief,\n ): Promise<void> {\n event.stopPropagation();\n event.preventDefault();\n const modal = await this.modalController.create({\n component: InviteModalComponent,\n // swipeToClose: true,\n presentingElement: this.routerOutlet.nativeEl,\n componentProps: {\n space: this.$space(),\n member,\n },\n });\n await modal.present();\n }\n}\n","@let membersToDisplay = $membersToDisplay();\n\n@if (!membersToDisplay) {\n <ion-item>\n <ion-avatar slot=\"start\" style=\"opacity: 0.3\">\n <ion-img title=\"avatar\" src=\"//www.gravatar.com/avatar/gravatar\" />\n </ion-avatar>\n <ion-skeleton-text style=\"width: 50%\" animated=\"animated\" />\n </ion-item>\n}\n\n@for (member of membersToDisplay; track member.id; let isLast = $last) {\n <ion-item-sliding [@addRemove]=\"'added'\">\n <ion-item\n tappable=\"true\"\n [lines]=\"isLast ? 'none' : undefined\"\n routerLink=\"/space/{{ $spaceType() || 'UNKNOWN_TYPE' }}/{{\n $spaceID()\n }}/member/{{ member.id }}\"\n (click)=\"goMember(member)\"\n class=\"sneat-tiny-end-padding\"\n >\n @if (member?.brief?.avatar; as avatar) {\n <ion-avatar>\n @if (member.brief.avatar?.external?.url) {\n <ion-img\n title=\"avatar\"\n [src]=\"member.brief.avatar?.external?.url\"\n />\n }\n @if (\n member.brief.avatar?.gravatar && !member.brief.avatar?.external?.url\n ) {\n <ion-img\n title=\"avatar\"\n src=\"//www.gravatar.com/avatar/{{\n member.brief.avatar?.gravatar\n }}\"\n />\n }\n </ion-avatar>\n } @else {\n <ion-icon\n slot=\"start\"\n [name]=\"genderIcon(member)\"\n class=\"sneat-hide-if-width-less-240\"\n />\n }\n\n <ion-label>\n {{ member | contactTitle }}\n @if (!$role()) {\n <sneat-contact-role-badges\n [roles]=\"member.brief.roles\"\n [hideRoles]=\"hideRoles\"\n />\n }\n </ion-label>\n @if (isAgeOptionsVisible(member)) {\n <sneat-inlist-age-group [contactID]=\"member.id\" [$space]=\"$space()\" />\n }\n <ion-buttons slot=\"end\">\n @if (isInviteButtonVisible(member)) {\n <ion-button\n title=\"Invite\"\n color=\"danger\"\n (click)=\"showInviteModal($event, member)\"\n >\n <ion-icon\n name=\"ticket-outline\"\n class=\"sneat-hide-if-width-greater-320\"\n />\n <span\n class=\"sneat-hide-if-width-less-320\"\n style=\"margin-left: 0.5em\"\n >Invite</span\n >\n </ion-button>\n }\n <ion-button (click)=\"goSchedule($event, member)\">\n <ion-icon name=\"calendar-outline\" />\n </ion-button>\n @if (!member.brief.userID && member.brief.invitesCount) {\n <ion-button color=\"danger\"> Resend invite</ion-button>\n }\n </ion-buttons>\n </ion-item>\n <ion-item-options side=\"start\">\n <ion-item-option color=\"danger\" (click)=\"removeMember($event, member)\">\n Remove\n </ion-item-option>\n </ion-item-options>\n <ion-item-options side=\"end\">\n <ion-item-option color=\"danger\" (click)=\"removeMember($event, member)\">\n Remove\n </ion-item-option>\n </ion-item-options>\n </ion-item-sliding>\n} @empty {\n <ion-item lines=\"none\">\n <ion-label color=\"medium\">No members</ion-label>\n </ion-item>\n}\n"]}